[
  {
    "path": ".babelrc.build.js",
    "content": "module.exports = {\n  extends: \"./.babelrc.js\",\n  ignore: [/^.*(.test.)[j|t]sx?$/],\n};\n"
  },
  {
    "path": ".babelrc.js",
    "content": "module.exports = {\n  presets: [\n    [\n      \"@babel/preset-env\",\n      {\n        loose: true,\n        exclude: [\n          // only enabled in commonjs targets\n          // see the section on `env` below\n          \"@babel/plugin-transform-modules-commonjs\",\n\n          // do not use this plugin with webpack\n          // ref: https://babeljs.io/docs/babel-plugin-proposal-dynamic-import\n          \"@babel/plugin-proposal-dynamic-import\",\n        ],\n      },\n    ],\n    \"@babel/preset-react\",\n    \"@babel/preset-typescript\",\n  ],\n  ignore: [\"**/*.d.ts\"],\n  env: {\n    commonjs: {\n      plugins: [\n        [\n          \"@babel/transform-modules-commonjs\",\n          {\n            strict: false,\n            allowTopLevelThis: true,\n          },\n        ],\n      ],\n    },\n  },\n};\n"
  },
  {
    "path": ".babelrc.native.js",
    "content": "module.exports = {\n  presets: [\"module:metro-react-native-babel-preset\"],\n  plugins: [\n    \"@babel/plugin-transform-export-namespace-from\",\n    \"@babel/plugin-transform-flow-strip-types\",\n  ],\n};\n"
  },
  {
    "path": ".changeset/afraid-donuts-tease.md",
    "content": "---\n\"victory-errorbar\": patch\n---\n\nadd default borderwidth value\n"
  },
  {
    "path": ".changeset/config.json",
    "content": "{\n  \"$schema\": \"https://unpkg.com/@changesets/config@2.0.0/schema.json\",\n  \"changelog\": [\"../scripts/changelog.js\", { \"repo\": \"FormidableLabs/victory\" }],\n  \"access\": \"public\",\n  \"baseBranch\": \"main\",\n  \"fixed\": [[\"victory*\"]],\n  \"ignore\": [\"rn-demo\", \"victory-docs\"]\n}\n"
  },
  {
    "path": ".changeset/cute-foxes-shop.md",
    "content": "---\n\"victory-native\": patch\n---\n\nfix native container prop forwarding\n"
  },
  {
    "path": ".changeset/silver-crabs-deliver.md",
    "content": "---\n\"victory-candlestick\": minor\n---\n\nHandle undefined labelStyle properties in VictoryCandlestick. Fixes #3039\n"
  },
  {
    "path": ".editorconfig",
    "content": "# editorconfig.org\nroot = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\nmax_line_length = 80\n\n[*.md]\ntrim_trailing_whitespace = false"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "content": "name: Bug report\ndescription: Create a report to help us improve\nprojects: FormidableLabs/38\nlabels: [\"Type: Bug :bug:\"]\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Thanks for taking the time to report a bug! Please fill out the sections below.\n\n  - type: checkboxes\n    attributes:\n      label: Is there an existing issue for this?\n      description: Please search to see if an issue already exists for the bug you encountered.\n      options:\n        - label: I have searched the existing issues\n          required: true\n\n  - type: checkboxes\n    id: terms\n    attributes:\n      label: Code of Conduct\n      description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/FormidableLabs/victory/blob/main/CONTRIBUTING.md#contributor-covenant-code-of-conduct)\n      options:\n        - label: I agree to follow this project's Code of Conduct\n          required: true\n\n  - type: input\n    attributes:\n      label: Victory version\n    validations:\n      required: true\n\n  - type: input\n    attributes:\n      label: Code Sandbox link\n      description: |\n        Please include a code sandbox link or a similar reproduction if possible.\n        Issues with sandbox links are typically resolved faster.\n        You can use our preset [here](https://codesandbox.io/s/dj4f7t).\n\n  - type: textarea\n    attributes:\n      render: markdown\n      label: Bug report\n      description: |\n        A clear and concise description of what the bug is. Please include any\n        screenshots or code snippets that may help us understand the issue.\n    validations:\n      required: true\n\n  - type: textarea\n    attributes:\n      render: markdown\n      label: Steps to reproduce\n      placeholder: |\n        Steps to reproduce the behavior:\n        1. Go to '...'\n        2. Click on '....'\n        3. Scroll down to '....'\n        4. See error\n\n  - type: textarea\n    attributes:\n      render: markdown\n      label: Expected behavior\n      description: A clear and concise description of what you expected to happen.\n\n  - type: textarea\n    attributes:\n      render: markdown\n      label: Actual behavior\n      description: A clear and concise description of what actually happened.\n\n  - type: textarea\n    attributes:\n      render: markdown\n      label: Environment\n      description: |\n        examples:\n          - **Device**: Desktop\n          - **OS**: Ubuntu 20.04\n          - **Browser**: Chrome\n          - **Version**: 22\n      value: |\n        - Device:\n        - OS:\n        - Node:\n        - npm:\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\ncontact_links:\n  - name: Victory Issues Board\n    url: https://github.com/FormidableLabs/victory/issues\n    about: Please ask and answer questions here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "content": "name: Feature request\ndescription: Suggest a feature for this project\nprojects: FormidableLabs/38\nlabels: [\"Type: Enhancement :pencil2:\"]\nbody:\n  - type: checkboxes\n    attributes:\n      label: Is there an existing issue for this?\n      description: Please search to see if an issue already exists for the feature you are requesting.\n      options:\n        - label: I have searched the existing issues\n          required: true\n\n  - type: checkboxes\n    id: terms\n    attributes:\n      label: Code of Conduct\n      description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/FormidableLabs/victory/blob/main/CONTRIBUTING.md#contributor-covenant-code-of-conduct)\n      options:\n        - label: I agree to follow this project's Code of Conduct\n          required: true\n\n  - type: textarea\n    attributes:\n      render: markdown\n      label: Feature Request\n      description: |\n        **Is your feature request related to a problem? Please describe.**\n        A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n        **Describe the solution you'd like**\n        A clear and concise description of what you want to happen.\n\n        **Describe alternatives you've considered**\n        A clear and concise description of any alternative solutions or features you've considered.\n\n        **Additional context**\n        Add any other context or screenshots about the feature request here.\n    validations:\n      required: true\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/question.yml",
    "content": "name: Question\ndescription: Ask a question about using Victory.\nprojects: FormidableLabs/38\nlabels: [\"Type: Question :grey_question:\"]\nbody:\n  - type: checkboxes\n    attributes:\n      label: Is there an existing issue for this?\n      description: Please search to see if an issue already exists for the question you have.\n      options:\n        - label: I have searched the existing issues\n          required: true\n\n  - type: checkboxes\n    id: terms\n    attributes:\n      label: Code of Conduct\n      description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/FormidableLabs/victory/blob/main/CONTRIBUTING.md#contributor-covenant-code-of-conduct)\n      options:\n        - label: I agree to follow this project's Code of Conduct\n          required: true\n\n  - type: textarea\n    attributes:\n      render: markdown\n      label: Question\n      description: |\n        Any background information that might help us answer your questions.\n        Please include any screenshots or code snippets that may help us understand the issue.\n    validations:\n      required: true\n"
  },
  {
    "path": ".github/actions/bundle-size/action.yml",
    "content": "name: \"Bundle size reporter\"\ndescription: \"Post bundle size difference compared to another branch\"\ninputs:\n  branch:\n    description: 'Branch to compare to'\n    required: true\n    default: 'main'\n  paths:\n    description: \"Paths to json file bundle size report or folder containing bundles\"\n    required: true\n    default: \"/\"\n  onlyDiff:\n    description: \"Report only different sizes\"\n    required: false\n    default: \"false\"\n  filter:\n    description: \"Regex filter based on file path\"\n    required: false\n  unit:\n    description: \"Size unit\"\n    required: false\n    default: \"KB\"\n\n  # Comment inputs\n  comment:\n    description: \"Post comment\"\n    required: false\n    default: \"true\"\n  header:\n    description: \"Comment header\"\n    required: false\n    default: \"Bundle size report\"\n  append:\n    description: \"Append comment\"\n    required: false\n    default: \"false\"\n  ghToken:\n    description: \"Github token\"\n    required: false\n\nruns:\n  using: \"composite\"\n  steps:\n    # Checkout branch to compare to [required]\n    - name: Checkout base branch\n      uses: actions/checkout@v4\n      with:\n        ref: ${{ inputs.branch }}\n        path: br-base\n\n    # build main under it's checkout location, in ./br-base\n    - name: Build main\n      shell: bash\n      run: cd br-base && pnpm install && pnpm build\n\n    # Generate the bundle size difference report [required]\n    - name: Generate report\n      id: bundleSize\n      uses: nejcm/bundle-size-reporter-action@v1.4.1\n      with:\n        paths: ${{ inputs.paths }}\n        onlyDiff: ${{ inputs.onlyDiff }}\n\n    # Post github action summary\n    - name: Post summary\n      if: ${{ steps.bundleSize.outputs.hasDifferences == 'true' }} # post only in case of changes\n      run: |\n        echo '${{ steps.bundleSize.outputs.summary }}' >> $GITHUB_STEP_SUMMARY\n      shell: bash\n\n    # Post github action comment\n    - name: Post comment\n      uses: marocchino/sticky-pull-request-comment@v2\n      if: ${{ steps.bundleSize.outputs.hasDifferences == 'true' }} # post only in case of changes\n      with:\n        number: ${{ github.event.pull_request.number }}\n        header: ${{ inputs.header }}\n        append: ${{ inputs.append }}\n        message: \"${{ steps.bundleSize.outputs.summary }}\"\n"
  },
  {
    "path": ".github/actions/setup/action.yml",
    "content": "name: Setup\ndescription: Setup Build Step\ninputs:\n  node-version:\n    default: \"18.x\"\n    description: \"The version of nodejs to use.\"\n    required: true\n\nruns:\n  using: \"composite\"\n  steps:\n    - uses: pnpm/action-setup@v4\n\n    - name: Use Node.js\n      uses: actions/setup-node@v4\n      with:\n        node-version: ${{ inputs.node-version }}\n        cache: 'pnpm'\n\n    # Wireit cache\n    - uses: google/wireit@setup-github-actions-caching/v1\n\n    - name: Install dependencies\n      shell: bash\n      run: pnpm install\n"
  },
  {
    "path": ".github/workflows/chromatic.yml",
    "content": "name: Chromatic\n\n# Runs chromatic on:\n# - every push to main (to create a chromatic baseline)\n# - every pull request where there are changes in stories/ or packages/ and the PR is not in draft mode\non:\n  push:\n    branches:\n      - main\n  pull_request:\n    branches:\n      - main\n    paths:\n      - \"stories/**\"\n      - \"packages/**\"\n\njobs:\n  chromatic:\n    name: Storybook Publish\n    if: github.event.pull_request.draft == false && github.repository == 'FormidableLabs/victory'\n    runs-on: ubuntu-latest\n    steps:\n      # requires all branches and tags to be fetched for chromatic\n      - uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n\n      - uses: ./.github/actions/setup\n        with:\n          node-version: 18.x\n\n      - name: Build Victory\n        run: pnpm run build:lib:esm\n\n      - name: Publish to Chromatic\n        uses: chromaui/action@v1\n        with:\n          token: ${{ secrets.GITHUB_TOKEN }}\n          projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "name: CI\n\n# Runs build and test on:\n#   every push to main\n#   every pull request with main branch as the base\non:\n  push:\n    branches:\n      - main\n  pull_request:\n    branches:\n      - main\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: ./.github/actions/setup\n\n      - name: Check all package.json's and tsconfig.json's are in sync.\n        run: |\n          pnpm sync\n          git diff --no-ext-diff --quiet --exit-code\n\n      - name: Build libraries and distributions\n        run: pnpm build\n\n      - name: Types\n        run: pnpm types:check\n\n      - name: 📄 Bundle size report\n        uses: ./.github/actions/bundle-size # path to composite action\n        with:\n          paths: \"packages/victory/dist/victory.min.js\"\n          onlyDiff: \"true\"\n          header: \"Bundle size report\" # PR comment header\n\n  lint:\n    needs: [build]\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: ./.github/actions/setup\n\n      - name: Lint\n        run: pnpm lint\n\n  test:\n    needs: [build]\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: ./.github/actions/setup\n\n      - name: Test\n        run: pnpm jest\n"
  },
  {
    "path": ".github/workflows/issue-stale.yml",
    "content": "name: Close inactive issues\non:\n  workflow_dispatch:\n  schedule:\n    - cron: \"0 0 * * *\"\n\njobs:\n  close-issues:\n    runs-on: ubuntu-22.04\n    permissions:\n      contents: write\n      issues: write\n      pull-requests: write\n\n    steps:\n      - uses: actions/stale@v9\n        with:\n          ascending: false\n          operations-per-run: 100\n          days-before-issue-stale: 90\n          days-before-issue-close: 7\n          stale-issue-label: 'Issue: Stale'\n          exempt-issue-labels: 'Issue: Accepted'\n          stale-issue-message: 'This issue is stale because it has been open for 90 days with no activity. If there is no activity in the next 7 days, the issue will be closed.'\n          close-issue-message: 'This issue was closed because it has been inactive for 7 days since being marked as stale. Please open a new issue if you believe you are encountering a related problem.'\n          days-before-pr-stale: -1\n          days-before-pr-close: -1\n          enable-statistics: true\n"
  },
  {
    "path": ".github/workflows/issue-triage.yml",
    "content": "name: Issue Triage\non:\n  issues:\n    types: [labeled]\n\njobs:\n  needs-repro:\n    runs-on: ubuntu-22.04\n    if: \"${{ contains(github.event.label.name, 'Status: Needs More Info :hand:') }}\"\n    steps:\n      - uses: actions/github-script@v7\n        with:\n          github-token: ${{ secrets.CHANGESETS_GITHUB_TOKEN }}\n          script: |\n            github.rest.issues.createComment({\n              issue_number: context.issue.number,\n              owner: context.repo.owner,\n              repo: context.repo.repo,\n              body: `Hi there! It looks like your issue requires a minimal reproducible example, but it is invalid or absent. Please prepare such an example and share it with us.\n\n              **The best way to get attention to your issue is to provide a clean and easy way for a developer to reproduce the issue on their own machine.** Please do not provide your entire project, or a project with more code than is necessary to reproduce the issue.\n\n              A side benefit of going through the process of narrowing down the minimal amount of code needed to reproduce the issue is that you may get lucky and discover that the bug is due to a mistake in your application code that you can quickly fix on your own.\n\n              ### Resources\n\n              - [\"How to create a Minimal, Reproducible Example\"](https://stackoverflow.com/help/minimal-reproducible-example)\n              - [\"Codesandbox Starterkit for Victory\"](https://codesandbox.io/p/sandbox/victory-starter-dj4f7t)\n\n              ### Common concerns\n\n              #### \"I didn't have time to create one\"\n\n              That's understandable, it can take some time to prepare. We ask that you hold off on filing an issue until you are able to fully complete the required fields in the issue template.\n\n              #### \"You can reproduce it by yourself by creating a project and following these steps\"\n\n              This is useful knowledge, but it's still valuable to have the resulting project that is produced from running the steps, where you have verified you can reproduce the issue.\n            `})\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: Release\n\non:\n  push:\n    branches:\n      - main\n\njobs:\n  release:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      id-token: write\n      issues: write\n      repository-projects: write\n      deployments: write\n      packages: write\n      pull-requests: write\n\n    steps:\n      - uses: actions/checkout@v4\n        with:\n          token: ${{ secrets.CHANGESETS_TOKEN }}\n\n      - uses: ./.github/actions/setup\n\n      - name: Build packages\n        run: pnpm run build\n\n      - name: PR or Publish\n        id: changesets\n        uses: changesets/action@v1\n        with:\n          version: pnpm run version\n          publish: pnpm run publish\n        env:\n          GITHUB_TOKEN: ${{ secrets.CHANGESETS_TOKEN }}\n          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}\n\n      # Note: We run a custom release notes script so we can generate a single aggregate\n      # release notes file for all packages. This can be removed when `changesets` supports\n      # this feature natively.\n      - name: Github Release notes\n        if: steps.changesets.outputs.published == 'true'\n        run: npm run release-notes\n        env:\n          GITHUB_TOKEN: ${{ secrets.CHANGESETS_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": "### SublimeText ###\n*.sublime-workspace\n\n### IntelliJ / WebStorm ###\n.idea/\n\n### OSX ###\n.AppleDouble\n.DS_Store\n.LSOverride\nIcon\n\n# Thumbnails\n._*\n\n# Files that might appear on external disk\n.Spotlight-V100\n.tmp\n.Trashes\n\n### Windows ###\n# Windows image file caches\nehthumbs.db\nThumbs.db\n\n# Folder config file\nDesktop.ini\n\n# Recycle Bin used on file shares\n$RECYCLE.BIN/\n\n# App specific\n.vscode\nbower_components\ncoverage\ndist\nlib\nes\nnode_modules\n.pnpm-debug.log*\nnpm-debug.log*\nlerna-debug.log*\nyarn-error.log*\n.cache\nstorybook-static\nbuild-storybook.log*\nartifacts\ntmp\n\n# Wireit + caches\n.wireit\n.eslintcache\n\n# Ignore all yarn2+\n.yarn/*\n.yarnrc*\n.pnp.*\n"
  },
  {
    "path": ".npmrc",
    "content": "auto-install-peers=true\nlink-workspace-packages=deep\nprefer-workspace-packages=true\n"
  },
  {
    "path": ".prettierignore",
    "content": ".cache\n.changeset\n.docusaurus\n.expo\n.storybook\n.wireit\n.vscode\ncoverage\ndist\nbuild\nlib\nlib-vendor\nes\npackages/victory-vendor/d3-*\nnode_modules\n.pnpm-debug.log*\nnpm-debug.log*\nlerna-debug.log*\nyarn-error.log*\nlerna.json\ntsconfig.json\ntsconfig.*.json\nstorybook-static\npublic\nartifacts\n"
  },
  {
    "path": ".prettierrc.json",
    "content": "{\n  \"arrowParens\": \"always\",\n  \"trailingComma\": \"all\",\n  \"printWidth\": 80,\n  \"overrides\": [\n    {\n      \"files\": \"*.mdx\",\n      \"options\": {\n        \"printWidth\": 40\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": ".storybook/main.ts",
    "content": "import type { StorybookConfig } from \"@storybook/react-webpack5\";\n\n/* globals __dirname:false */\nconst path = require(\"path\");\nconst ROOT = path.resolve(__dirname, \"..\");\nconst STORIES = path.resolve(ROOT, \"stories\");\n\nconst getAbsolutePath = (packageName: string): any =>\n  path.dirname(require.resolve(path.join(packageName, 'package.json')));\n\nconst config: StorybookConfig = {\n  addons: [\n    getAbsolutePath(\"@storybook/addon-essentials\"),\n    {\n      name: \"@storybook/addon-storysource\",\n      options: {\n        rule: {\n          test: [/\\.stories\\.(jsx?|tsx?)$/],\n          include: [STORIES],\n        },\n        loaderOptions: {\n          prettierConfig: { printWidth: 80, singleQuote: false },\n        },\n      },\n    },\n    getAbsolutePath(\"@storybook/addon-webpack5-compiler-swc\"),\n    getAbsolutePath(\"@chromatic-com/storybook\"),\n  ],\n\n  framework: {\n    name: getAbsolutePath(\"@storybook/react-webpack5\"),\n    options: {\n      builder: {},\n    },\n  },\n\n  stories: [\"../stories/**/*.stories.tsx\"],\n\n  typescript: {\n    check: false,\n    checkOptions: {\n      typescript: {\n        configFile: path.resolve(ROOT, \"tsconfig.storybook.json\"),\n      },\n    },\n  },\n\n  webpackFinal: async (config) => {\n    if (config.resolve) {\n      config.resolve.alias = {\n        ...config.resolve.alias,\n        \"@\": path.resolve(__dirname, \"../packages\"),\n      };\n    }\n    return config;\n  },\n};\n\nexport default config;\n"
  },
  {
    "path": ".storybook/preview.css",
    "content": ".VictoryContainer {\n  border: 1px solid #ccc;\n}\n\n/** Custom styles for the visual style tests */\n\n.fill-purple {\n  fill: rgb(87, 4, 143);\n}\n\n.fill-green {\n  fill: rgb(33, 212, 9);\n}\n\n.stroke-purple {\n  stroke: rgb(87, 4, 143);\n}\n\n.stroke-green {\n  stroke: rgb(33, 212, 9);\n}\n"
  },
  {
    "path": ".storybook/preview.ts",
    "content": "import { Preview } from \"@storybook/react\";\n\nimport \"./preview.css\";\n\nconst preview: Preview = {\n  args: {\n    height: 350,\n    themeKey: \"grayscale\",\n    width: 400,\n  },\n  parameters: {\n    controls: {\n      sort: 'alpha'\n    },\n  },\n};\n\nexport default preview;\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\n## How to Contribute\n\nVictory is open to pull requests, issue reports, and questions from the community. Here are some good ways to get help if you need it.\n\n- If you have a question, please [open a new Q&A discussion thread](https://github.com/FormidableLabs/victory/discussions/new)\n- If you think you have found a bug, [open a new issue](https://github.com/FormidableLabs/victory/issues/new)\n\nIf you are a new contributor looking to learn more about Victory, check out our [good first issues board](https://github.com/FormidableLabs/victory/projects/2).\n\n### Current goals and initiatives\n\nThere are some parts of Victory that are in need of a little extra attention right now, including state management, transitions and animations, and pan and zoom behavior. These larger goals are being tracked in [milestones](https://github.com/FormidableLabs/victory/milestones). The goal for these milestones is re-work parts of Victory to make them more performant, easier to fix, and more accessible for new contributors. If your issue is related to one of these milestones, we may not be able to push up a fix right away, but we will label it accordingly and address it as a part of this larger scope of work.\n\n## Monorepo!\n\nVictory is a monorepo built with [Wireit](https://github.com/google/wireit) and [pnpm](https://pnpm.io/) workspaces. All `victory-*` packages live in the `packages` directory, and each has its own `package.json`. Installing this repo with `pnpm install` will automatically link all interdependent `victory-*` packages. **You must use `pnpm` rather than `npm` or `yarn` when installing and running `package.json` scripts in this project.**\n\n### Requirements\n\n- [Node.js](https://nodejs.org/) 18 or higher.\n- [pnpm](https://pnpm.io/) version specified by [corepack](https://github.com/nodejs/corepack) in the `package.json`.\n\n### Setup\n\nClone this repo:\n\n```sh\n$ git clone https://github.com/FormidableLabs/victory.git\n$ cd victory\n```\n\nEnable corepack (if not already):\n\n```sh\n$ corepack enable\n```\n\nUse [pnpm](https://pnpm.io/) to install dependencies:\n\n```sh\n$ pnpm install\n```\n\n## Development\n\n### Dev demo app\n\nWe have some dev servers available for a sample development environment.\n\n> Note: The demo app is deprecated, all development should occur in storybook or the docs\n\n```sh\n# watch mode / HMR\n$ pnpm storybook:dev\n\n# storybook standalone\n$ pnpm storybook:start\n```\n\n### Running Docs locally\n\nYou can run the documentation website locally with the following command. It is linked to the Victory package via PNPM and will reflect changes in packages when they are rebuilt.\n\n```sh\n$ pnpm start:docs\n```\n\n### Build and checks\n\nOur task system mostly takes care of all task dependencies and things you need. When you first clone this repo or a new branch, run:\n\n```sh\n# Run all checks. Re-run this command for your normal workflow.\n$ pnpm run check\n# ... or add in a `--watch` to watch & re-run checks for only what you change!\n$ pnpm run check --watch\n\n# Build libraries and UMD distributions.\n# Really only needed to double-check the webpack build still works.\n$ pnpm run build\n# ... or add in a `--watch` to watch & re-run the parts of the build that changed!\n$ pnpm run build --watch\n```\n\nThis will do all the build, seeding the task cache so subsequent tasks are fast, and checks that everything is correctly working. Your Victory workflow could reasonably just be (1) making some changes to files + tests, and then (2) re-running `pnpm run check`!\n\nHere are some other useful tasks (with or without a `--watch` flag):\n\n```sh\n# Quality checks\n$ pnpm run format\n$ pnpm run format --watch\n$ pnpm run lint\n$ pnpm run lint --watch\n$ pnpm run types:check\n$ pnpm run types:check --watch\n\n# Tests\n$ pnpm run jest\n$ pnpm run jest --watch\n```\n\nWe also have some helper tasks to fix issues that are fixable.\n\n```sh\n$ pnpm run format:fix\n$ pnpm run lint:fix\n```\n\n### Victory Native\n\nTo develop against `victory-native`, please see the package [README](./packages/victory-native/README.md).\n\n### Tips and tricks\n\n#### Scripts can be run from the _root_ AND from inside any _package_ folder\n\nFor example, when working on a single package like `victory-core`, you can run `pnpm run check --watch` from the `packages/victory-core` directory, and it will only check the core.  Example:  \n\n```sh\n$ cd packages/victory-core\n$ pnpm run check --watch\n```\n\nThis is especially helpful when you're making changes to any package that is _depended upon_, like `victory-core` or `victory-vendor`, and don't want to run every single script during development.\n\n\n#### My IDE shows outdated TypeScript errors\n\nIt seems like VS Code and WebStorm both struggle to update their internal cache, whenever the **built types** change.  For example, when making changes to `victory-core`, the TypeScript changes won't be picked up by your IDE automatically.\n\nInstead of restarting your IDE completely, try restarting the TypeScript Service.\n\n#### My computer grinds to a halt!\n\nThe initial build/check, or one where something that is part of a lot of cache keys changes, can really slow down your computer, especially if you've got an older model. To allow you to do other work on your computer at the same time, consider using the `WIREIT_PARALLEL=<NUM_PROCESS>` environment variable like:\n\n```sh\n$ WIREIT_PARALLEL=4 pnpm run check\n```\n\nA good rubric is \"number of cores\" for max speed while still a mostly usable system or one less than that number for a much more usable system.\n\n#### Unit of work/caching\n\nWireit is a flexible tool that caches at the task level. So that means that out-of-the box any wireit task will run the entire task again if any of the input `files` change. This leads us to two tips:\n\n1. **Decompose tasks to package level**: Jest could be run over the whole monorepo in one command, but we instead break it out per-package, so that we only re-run Jest tests for packages that have actually changed (or have dependencies that have changed).\n2. **Use tool-specific caching**: Tools like eslint and tsc can cache within a subtask run, so we like to leverage this within single tasks to make subtask re-runs faster.\n\n#### What happens if a check/subtask fails?\n\nThe neat thing about wireit caching, is that for any high-level task, all of the sub-tasks that succeeded don't need to be re-run. So, if you're trying to run `pnpm run check` and get a single package lint error, just fix that package lint error and run `pnpm run check` again -- and then repeat until you get a pass! All of the work along the way that _succeeds_ will be cached and won't be run again!\n\n#### What should be a package script? What should be a wireit script?\n\nIf you look at our `package.json:scripts.start` command, you'll notice that we use both a wireit-based script (`pnpm run build:lib:esm`) as well as a normal shell command (`webpack serve ...`). This is a good example of the types of things that should and shouldn't be wireit script tasks.\n\n1. **Wireit tasks**: Tasks that should run on input file **changes** and then not run again should be wireit tasks. E.g. \"transpile files\", \"lint files\".\n2. **Normal script tasks**: Tasks that should _always_ run regardless of the state of cache task execution. E.g. \"start a webpack dev server\".\n\n#### Cache issues\n\nWe use tools caching within subtasks wherever we can. However, that can sometimes lead to weird errors. Here are some familiar ones with remedies.\n\n*Everything*\n\nIf you want to make sure globally you're not hitting a cache issue, this command cleans the wireit cache as well as all the tool caches:\n\n```sh\n$ pnpm run clean:cache\n```\n\nYour next `pnpm run build|check` will be a full (long) rebuild from scratch.\n\n*Eslint*\n\nIf you hit something like:\n\n```\n/PATH/TO/victory/test/jest-setup.ts\n  0:0  error  Parsing error: Debug Failure. False expression: /PATH/TO/victory/packages/victory-native/node_modules/victory-area/es/index.js linked to nonexistent file /PATH/TO/victory/packages/victory-area/es/index.js\n\n✖ 1 problem (1 error, 0 warnings)\n```\n\nThen you've hit an eslint issue that can be fixed with:\n\n```sh\n$ pnpm run clean:cache:lint\n```\n\n## Authoring tasks\n\nOur task system is optimized for fast, easy developer experience, at the acknowledged cost of **extra maintainer burden** when we change task structure, add tasks, etc. If you are editing the scripts in a `package.json` or `package-scripts.js` you'll need to read up on [Wireit](https://github.com/google/wireit) and probably want to talk to an existing Victory maintainer.\n\nWe use three tools and some custom scripts as follows:\n\n- `pnpm` to `run` or `exec` scripts\n- `wireit` to cache tasks and run dependent tasks.\n- `nps` to place one off script tasks in the root `/project-scripts.js` in a manner that can be called from within a workspace.\n- `scripts/sync-pkgs-wireit*.js`: Scripts run with `pnpm run sync` to automate dependency management. This is where most of your work for task management will take place.\n\nFor our packages, we primarily focus on four types of package.json files:\n\n- `package.json`: Define root tasks here and aggregate workspace tasks here. Note that instead of relying on `pnpm -r run` to concurrently run tasks in each workspace, we instead rely on `wireit` alone to have dependencies in aggregate tasks on all subtasks. This is more efficient to have `wireit` command concurrency and the task dependency graph.\n- `packages/victory*/package.json`: These package scripts are generated by `scripts/sync-pkgs-wireit-helpers.js`. If you want to change them, edit that script and run `pnpm run sync`.\n- `packages/victory-native/package.json`: A custom package.json that must have implementations or no-ops for all things in `victory-core`.\n- `packages/victory-vendor/package.json`: A custom package.json that must have implementations or no-ops for all things in `victory-core`.\n\n## Visual Tests\n\nVictory relies heavily on visual regression testing with [Storybook](https://storybook.js.org/) and [Chromatic](https://www.chromaticqa.com/).\n\nWrite visual tests for new features by adding them in the `stories` directory. Run storybooks and check out changes. Storybooks are served from http://localhost:6006/\n\n```sh\n$ pnpm run storybook:server\n```\n\nThis task also watches and rebuilds all Victory source files so you can more easily develop against storybook.\n\n[Chromatic](https://www.chromaticqa.com/) provides automated visual testing. All internal PRs will trigger a new Chromatic build, which will be displayed along with CI status. Chromatic builds for Victory may be viewed in more detail here: https://www.chromaticqa.com/builds?appId=5b4acf7c54c0490024d5980b. Chromatic requires a secret app code to run, so PRs from external contributors will not automatically trigger a Chromatic build. For this reason, changes from external contributors will be checked out and opened as separate PRs so Chromatic may be used to verify any changes. Developers with access to the secret app code may also trigger a chromatic build manually with:\n\n```sh\n$ pnpm run chromatic\n```\n\nNote that Chromatic internally runs `npm run build-storybook` around which we have a custom `package.json:scripts.build-storybook` task that is meant to work within Chromatic.\n\n## Release\n\nWe use [changesets](https://github.com/changesets/changesets) to create package versions and publish them.\n\n### Using changesets\n\nOur official release path is to use automation to perform the actual publishing of our packages. The steps are to:\n\n1. A human developer adds a changeset. Ideally this is as a part of a PR that will have a version impact on a package.\n2. On merge of a PR our automation system opens a \"Version Packages\" PR.\n3. On merging the \"Version Packages\" PR, the automation system publishes the packages.\n\nHere are more details:\n\n### Add a changeset\n\nWhen you would like to add a changeset (which creates a file indicating the type of change), in your branch/PR issue this command:\n\n```sh\n$ pnpm run changeset\n```\n\nto produce an interactive menu. Navigate the packages with arrow keys and hit `<space>` to select 1+ packages. Hit `<return>` when done. Select semver versions for packages and add appropriate messages. From there, you'll be prompted to enter a summary of the change. Some tips for this summary:\n\n1. Aim for a single line, 1+ sentences as appropriate.\n2. Include issue links in GH format (e.g. `#123`).\n3. You don't need to reference the current pull request or whatnot, as that will be added later automatically.\n\nAfter this, you'll see a new uncommitted file in `.changesets` like:\n\n```sh\n$ git status\n# ....\nUntracked files:\n  (use \"git add <file>...\" to include in what will be committed)\n\t.changeset/flimsy-pandas-marry.md\n```\n\nReview the file, make any necessary adjustments, and commit it to source. When we eventually do a package release, the changeset notes and version will be incorporated!\n\n### Creating versions\n\nOn a merge of a feature PR, the changesets GitHub action will open a new PR titled `\"Version Packages\"`. This PR is automatically kept up to date with additional PRs with changesets. So, if you're not ready to publish yet, just keep merging feature PRs and then merge the version packages PR later.\n\n### Publishing packages\n\nOn the merge of a version packages PR, the changesets GitHub action will publish the packages to npm.\n\n### The manual version\n\nFor exceptional circumstances, here is a quick guide to manually publishing from a local computer using changesets.\n\n1. Add a changeset with `pnpm run changeset`. Add changeset file, review file, tweak, and commit.\n2. Make a version. Due to our changelog plugin you will need to create a personal GitHub token and pass it to the environment.\n\n    ```sh\n    $ GITHUB_TOKEN=<INSERT TOKEN> pnpm run version\n    ```\n\n    Review git changes, tweak, and commit.\n\n3. Publish.\n\n    First, build necessary files:\n\n    ```sh\n    # Build everything\n    $ pnpm run build\n    ```\n\n    Then publish:\n\n    ```sh\n    # Test things out first\n    $ pnpm -r publish --dry-run\n\n    # The real publish\n    # This first does a single git tag (if not already present), then publishes\n    $ pnpm run publish --otp=<insert otp code>\n    ```\n\n    Note that publishing multiple packages via `changeset` to npm with an OTP code can often fail with `429 Too Many Requests` rate limiting error. Take a 5+ minute coffee break, then come back and try again.\n\n    Then issue the following to also push git tags:\n\n    ```sh\n    $ git push && git push --tags\n    ```\n"
  },
  {
    "path": "LICENSE.txt",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015-2020 Formidable Labs.\n\nCopyright (c) 2016-2020 Alexey Svetliakov <https://github.com/asvetliakov>,\nsnerks <https://github.com/snerks>, Krzysztof Cebula <https://github.com\nHavret>, Vitaliy Polyanskiy <https://github.com/alreadyExisted>, James Lismore\n<https://github.com/jlismore>, Stack Builders <https://github.com\nstackbuilders>, Esteban Ibarra <https://github.com/ibarrae>, Dominic Lee\n<https://github.com/dominictwlee>, Dave Vedder <https://github.com\nveddermatic>, Alec Flett <https://github.com/alecf> and potentially other\nDefinitelyTyped contributors.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software."
  },
  {
    "path": "README.md",
    "content": "<div align=\"center\">\n  <a href=\"https://commerce.nearform.com/open-source/\" target=\"_blank\">\n    <img alt=\"Victory — Formidable, We build the modern web\" src=\"https://oss.nearform.com/api/banner.svg?badge=victory&bg=9c2f1e\" />\n  </a>\n\n  <strong>\n    an ecosystem of composable React components for building interactive data visualizations.\n  </strong>\n\n  <br />\n  <br />\n\n  <a href=\"https://npmjs.com/package/victory\">\n    <img alt=\"weekly downloads\" src=\"https://img.shields.io/npm/dw/victory.svg\">\n  </a>\n  <a href=\"https://npmjs.com/package/victory\">\n    <img alt=\"current version\" src=\"https://img.shields.io/npm/v/victory.svg\">\n  </a>\n  <a href=\"https://github.com/FormidableLabs/victory/actions\">\n    <img alt=\"build status\" src=\"https://github.com/FormidableLabs/victory/actions/workflows/ci.yml/badge.svg\">\n  </a>\n\n  <a href=\"https://github.com/FormidableLabs/victory#maintenance-status\">\n    <img alt=\"Maintenance Status\" src=\"https://img.shields.io/badge/maintenance-active-green.svg\" />\n  </a>\n\n  <br />\n  <br />\n</div>\n\n# `Victory`\n\n## Contents\n\n- [Getting Started](#getting-started)\n- [Victory Native](#victory-native)\n- [API Documentation](http://commerce.nearform.com/open-source/victory/docs)\n- [Guides](http://commerce.nearform.com/open-source/victory/guides)\n- [Contributing](#contributing)\n\n* See the **docs and examples** on the website: https://commerce.nearform.com/open-source/victory\n* **Experiment** with all Victory components in this [code sandbox](https://codesandbox.io/s/dj4f7t)\n\n## Getting started\n\n1. Add Victory to your project:\n\n```sh\n# npm\n$ npm i --save victory\n# or yarn\n$ yarn add victory\n```\n\n2. Add your first Victory component:\n\n```js\nimport React from \"react\";\nimport { render } from \"react-dom\";\nimport { VictoryPie } from \"victory\";\n\nconst PieChart = () => {\n  return <VictoryPie />;\n};\n\nrender(<PieChart />, document.getElementById(\"app\"));\n```\n\n3. `VictoryPie` component will be rendered, and you should see:\n\n<p align=\"center\">\n  <img align=\"center\" width=\"471\" alt=\"pie\" src=\"https://cloud.githubusercontent.com/assets/3719995/20915779/b51e3652-bb3c-11e6-8243-6e7521a59115.png\">\n</p>\n\n<br />\n\n## Requirements\n\nProjects using Victory should also depend on [React][]. As of `victory@34.0.0` Victory requires React version `16.3.0` or above\n\n## Victory Native\n\nVictory Native shares most of its code with Victory, and has a nearly identical API! To learn more, check out the [Victory Native package README](./packages/victory-native/README.md).\n\n## Contributing\n\nPlease see the [Contributing guide](CONTRIBUTING.md).\n\n## Maintenance Status\n\n**Active:** Formidable is actively working on this project, and we expect to continue to work for the foreseeable future. Bug reports, feature requests and pull requests are welcome.\n\n[react]: https://facebook.github.io/react/\n"
  },
  {
    "path": "chromatic.config.json",
    "content": "{\n  \"onlyChanged\": true,\n  \"projectId\": \"Project:5b4acf7c54c0490024d5980b\",\n  \"zip\": true\n}\n"
  },
  {
    "path": "config/webpack/demo/webpack.config.dev.js",
    "content": "\"use strict\";\n\nconst path = require(\"path\");\nconst glob = require(\"glob\");\nconst LodashModuleReplacementPlugin = require(\"lodash-webpack-plugin\");\nconst ForkTsCheckerWebpackPlugin = require(\"fork-ts-checker-webpack-plugin\");\n\nconst ROOT = path.resolve(__dirname, \"../../..\");\nconst PKGS = path.join(ROOT, \"packages\");\nconst VICTORY_GLOB = path\n  .join(PKGS, \"victory*/package.json\")\n  .replace(/\\\\/g, \"/\");\n// Read all the victory packages and alias.\nconst VICTORY_ALIASES = glob.sync(VICTORY_GLOB).reduce((memo, pkgPath) => {\n  const key = path.dirname(path.relative(PKGS, pkgPath));\n  memo[key] = path.resolve(path.dirname(pkgPath));\n  return memo;\n}, {});\nconst DEMO = path.resolve(\"demo\");\nconst WDS_PORT = 3000;\n\nmodule.exports = {\n  mode: \"development\",\n  cache: true,\n  devServer: {\n    port: WDS_PORT,\n  },\n  output: {\n    path: DEMO,\n    pathinfo: true,\n    filename: \"main.js\",\n    publicPath: \"/assets/\",\n  },\n  devtool: \"source-map\",\n  stats: {\n    colors: true,\n    reasons: true,\n  },\n  resolve: {\n    alias: VICTORY_ALIASES,\n    extensions: [\".ts\", \".tsx\", \".js\", \".json\"],\n  },\n  module: {\n    rules: [\n      {\n        // Transform source\n        test: /(\\.js|\\.tsx?)$/,\n        // Use include specifically of our sources.\n        // Do _not_ use an `exclude` here.\n        include: [DEMO],\n        use: {\n          loader: \"babel-loader\",\n\n          options: require(\"../../../.babelrc.js\"),\n        },\n      },\n      {\n        test: /\\.css$/,\n        use: [\"style-loader\", \"css-loader\", \"postcss-loader\"],\n      },\n    ],\n  },\n  plugins: [\n    new ForkTsCheckerWebpackPlugin({\n      typescript: {\n        configFile: path.resolve(ROOT, \"demo\", \"ts\", \"tsconfig.json\"),\n      },\n    }),\n    new LodashModuleReplacementPlugin({\n      shorthands: true,\n      currying: true,\n      flattening: true,\n      paths: true,\n      placeholders: true,\n    }),\n  ],\n};\n"
  },
  {
    "path": "config/webpack/demo/webpack.config.hot.js",
    "content": "\"use strict\";\n\nconst _ = require(\"lodash\");\nconst base = require(\"./webpack.config.dev\");\n\n// Clone our own module object.\nconst mod = _.cloneDeep(base.module);\nconst firstLoader = mod.rules[0];\n\n// Update rules array. First loader needs react-hot-loader.\nfirstLoader.rules = [require.resolve(\"react-hot-loader\")]\n  .concat(firstLoader.loader ? [firstLoader.loader] : [])\n  .concat(firstLoader.rules || []);\n\n// Remove single loader if any.\nfirstLoader.loader = null;\n\nmodule.exports = _.merge({}, _.omit(base, \"entry\", \"module\"), {\n  entry: {\n    app: [require.resolve(\"webpack/hot/only-dev-server\"), \"./demo/js/app\"],\n  },\n\n  module: mod,\n});\n"
  },
  {
    "path": "config/webpack/webpack.config.dev.js",
    "content": "\"use strict\";\n\nconst config = require(\"./webpack.config\");\nconst LodashModuleReplacementPlugin = require(\"lodash-webpack-plugin\");\n\n// **WARNING**: Mutates base configuration.\n// We do this because lodash isn't available in `production` mode.\nconfig.output.filename = config.output.filename.replace(/\\.min\\.js$/, \".js\");\nconfig.mode = \"development\";\nconfig.devtool = false;\nconfig.plugins = [\n  new LodashModuleReplacementPlugin({\n    currying: true,\n    flattening: true,\n    paths: true,\n    placeholders: true,\n    shorthands: true,\n  }),\n];\n\n// Export mutated base.\nmodule.exports = config;\n"
  },
  {
    "path": "config/webpack/webpack.config.js",
    "content": "\"use strict\";\n\nconst path = require(\"path\");\nconst webpack = require(\"webpack\");\nconst LodashModuleReplacementPlugin = require(\"lodash-webpack-plugin\");\n\nconst SRC = path.resolve(\"src\");\n\n// **Little Hacky**: Infer the filename and library name from the package name.\n//\n// Assumptions:\n// - `package.json`'s `name` field is name of dist files.\n// - PascalCased version of that name is exported class name.\nconst PKG = require(path.resolve(\"package.json\"));\nconst libPath = (PKG.name || \"\").toLowerCase();\nif (!libPath) {\n  throw new Error(\"Need package.json:name field\");\n}\n// PascalCase (with first character capitalized).\nconst libName = libPath\n  .replace(/^\\s+|\\s+$/g, \"\")\n  .replace(/(^|[-_ ])+(.)/g, (match, first, second) => {\n    // Second match group is the character we want to change. Throw away first.\n    return second.toUpperCase();\n  });\n\nmodule.exports = {\n  cache: true,\n  context: SRC,\n  entry: \"./index\",\n  externals: {\n    react: {\n      root: \"React\",\n      commonjs2: \"react\",\n      commonjs: \"react\",\n      amd: \"react\",\n    },\n    \"react-native\": \"react-native\",\n  },\n  resolve: {\n    extensions: [\".ts\", \".tsx\", \".js\", \".jsx\"],\n  },\n  output: {\n    path: path.resolve(\"dist\"),\n    filename: `${libPath}.min.js`,\n    library: libName,\n    libraryTarget: \"umd\",\n  },\n  module: {\n    rules: [\n      {\n        // Transform source\n        test: /(\\.js|\\.tsx?)$/,\n        // Use include specifically of our sources.\n        // Do _not_ use an `exclude` here.\n        include: [SRC],\n        use: {\n          loader: \"babel-loader\",\n\n          options: require(\"../../.babelrc.js\"),\n        },\n      },\n    ],\n  },\n  mode: \"production\",\n  plugins: [\n    new LodashModuleReplacementPlugin({\n      currying: true,\n      flattening: true,\n      paths: true,\n      placeholders: true,\n      shorthands: true,\n    }),\n    new webpack.DefinePlugin({\n      // Signal production, so that webpack removes non-production code that\n      // is in condtionals like: `if (process.env.NODE_ENV === \"production\")`\n      \"process.env.NODE_ENV\": JSON.stringify(\"production\"),\n    }),\n    new webpack.SourceMapDevToolPlugin({\n      filename: \"[file].map\",\n    }),\n  ],\n};\n"
  },
  {
    "path": "demo/rn/.expo-shared/assets.json",
    "content": "{\n  \"12bb71342c6255bbf50437ec8f4441c083f47cdb74bd89160c15e4f43e52a1cb\": true,\n  \"40b842e832070c58deac6aa9e08fa459302ee3f9da492c7e77d93d2fbf4a56fd\": true\n}\n"
  },
  {
    "path": "demo/rn/.gitignore",
    "content": "node_modules/\n.expo/\ndist/\nnpm-debug.*\n*.jks\n*.p8\n*.p12\n*.key\n*.mobileprovision\n*.orig.*\nweb-build/\n\n# macOS\n.DS_Store\n"
  },
  {
    "path": "demo/rn/App.tsx",
    "content": "import React from \"react\";\nimport { LogBox } from \"react-native\";\nimport { NavigationContainer } from \"@react-navigation/native\";\nimport { RootNavigator } from \"./src/screens/root-navigator\";\nimport { registerRootComponent } from \"expo\";\n\nLogBox.ignoreLogs([\"Require cycle: ../../packages/victory\"]);\n\nconst App = () => {\n  return (\n    <NavigationContainer>\n      <RootNavigator />\n    </NavigationContainer>\n  );\n};\n\nregisterRootComponent(App);\n"
  },
  {
    "path": "demo/rn/app.json",
    "content": "{\n  \"expo\": {\n    \"name\": \"rn-demo\",\n    \"slug\": \"rn-demo\",\n    \"version\": \"1.0.0\",\n    \"orientation\": \"portrait\",\n    \"icon\": \"./assets/icon.png\",\n    \"userInterfaceStyle\": \"light\",\n    \"splash\": {\n      \"image\": \"./assets/splash.png\",\n      \"resizeMode\": \"contain\",\n      \"backgroundColor\": \"#ffffff\"\n    },\n    \"updates\": {\n      \"fallbackToCacheTimeout\": 0\n    },\n    \"assetBundlePatterns\": [\"**/*\"],\n    \"ios\": {\n      \"supportsTablet\": true\n    },\n    \"android\": {\n      \"adaptiveIcon\": {\n        \"foregroundImage\": \"./assets/adaptive-icon.png\",\n        \"backgroundColor\": \"#FFFFFF\"\n      }\n    },\n    \"web\": {\n      \"favicon\": \"./assets/favicon.png\"\n    }\n  }\n}\n"
  },
  {
    "path": "demo/rn/babel.config.js",
    "content": "module.exports = function (api) {\n  api.cache(true);\n  return {\n    presets: [\"babel-preset-expo\"],\n  };\n};\n"
  },
  {
    "path": "demo/rn/metro.config.js",
    "content": "// https://docs.expo.dev/guides/monorepos/#modify-the-metro-config\nconst { getDefaultConfig } = require(\"expo/metro-config\");\nconst path = require(\"path\");\n\n// Find the project and workspace directories\nconst projectRoot = __dirname;\n// Find the monorepo root\nconst monorepoRoot = path.resolve(projectRoot, \"../..\");\n\nconst config = getDefaultConfig(projectRoot);\n\n// 1. Watch all files within the monorepo\nconfig.watchFolders = [monorepoRoot];\n// 2. Let Metro know where to resolve packages and in what order\nconfig.resolver.nodeModulesPaths = [\n  path.resolve(projectRoot, \"node_modules\"),\n  path.resolve(monorepoRoot, \"node_modules\"),\n];\n\nmodule.exports = config;\n"
  },
  {
    "path": "demo/rn/package.json",
    "content": "{\n  \"name\": \"rn-demo\",\n  \"version\": \"1.0.0\",\n  \"sideEffects\": false,\n  \"main\": \"App.tsx\",\n  \"scripts\": {\n    \"start\": \"expo start --reset-cache\",\n    \"android\": \"expo start --android --reset-cache\",\n    \"ios\": \"expo start --ios --reset-cache\",\n    \"web\": \"expo start --web --reset-cache\",\n    \"eject\": \"expo eject\"\n  },\n  \"dependencies\": {\n    \"@expo/metro-runtime\": \"~3.1.3\",\n    \"@react-navigation/native\": \"^6.1.17\",\n    \"@react-navigation/native-stack\": \"^6.9.26\",\n    \"expo\": \"~50.0.17\",\n    \"expo-status-bar\": \"~1.11.1\",\n    \"lodash\": \"^4.17.21\",\n    \"react\": \"18.2.0\",\n    \"react-dom\": \"18.2.0\",\n    \"react-native\": \"0.73.5\",\n    \"react-native-gesture-handler\": \"~2.16.0\",\n    \"react-native-safe-area-context\": \"4.10.1\",\n    \"react-native-screens\": \"~3.31.1\",\n    \"react-native-svg\": \"14.1.0\",\n    \"react-native-web\": \"~0.19.6\",\n    \"victory\": \"workspace:*\",\n    \"victory-area\": \"workspace:*\",\n    \"victory-axis\": \"workspace:*\",\n    \"victory-bar\": \"workspace:*\",\n    \"victory-box-plot\": \"workspace:*\",\n    \"victory-brush-container\": \"workspace:*\",\n    \"victory-brush-line\": \"workspace:*\",\n    \"victory-candlestick\": \"workspace:*\",\n    \"victory-chart\": \"workspace:*\",\n    \"victory-core\": \"workspace:*\",\n    \"victory-create-container\": \"workspace:*\",\n    \"victory-cursor-container\": \"workspace:*\",\n    \"victory-errorbar\": \"workspace:*\",\n    \"victory-group\": \"workspace:*\",\n    \"victory-histogram\": \"workspace:*\",\n    \"victory-legend\": \"workspace:*\",\n    \"victory-line\": \"workspace:*\",\n    \"victory-native\": \"workspace:*\",\n    \"victory-pie\": \"workspace:*\",\n    \"victory-polar-axis\": \"workspace:*\",\n    \"victory-scatter\": \"workspace:*\",\n    \"victory-selection-container\": \"workspace:*\",\n    \"victory-shared-events\": \"workspace:*\",\n    \"victory-stack\": \"workspace:*\",\n    \"victory-tooltip\": \"workspace:*\",\n    \"victory-voronoi\": \"workspace:*\",\n    \"victory-voronoi-container\": \"workspace:*\",\n    \"victory-zoom-container\": \"workspace:*\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.20.0\",\n    \"@babel/runtime\": \"^7.22.15\",\n    \"@types/lodash\": \"^4.14.182\",\n    \"glob\": \"^8.0.3\",\n    \"typescript\": \"~5.3.3\"\n  },\n  \"private\": true\n}\n"
  },
  {
    "path": "demo/rn/src/data/index.ts",
    "content": "import { range, random } from \"lodash\";\n\nexport const getData = () =>\n  range(1, 10).map((i) => ({ x: i, y: random(1, 10) }));\n\nexport const getBoxPlotData = () =>\n  range(5).map((i) => ({ x: i, y: range(20).map(() => random(1, 100)) }));\n\nexport const generateRandomData = (points = 6) =>\n  range(1, points + 1).map((i) => ({ x: i, y: i + random(-1, 2) }));\n\nexport const getTransitionData = () => {\n  const n = random(4, 10);\n  return range(n).map((i) => {\n    return {\n      x: i,\n      y: random(2, 10),\n    };\n  });\n};\n\nexport const getYFunction = () => {\n  const n = random(2, 7);\n  return (data: { x: number }) =>\n    Math.exp(-n * data.x) * Math.sin(2 * n * Math.PI * data.x);\n};\n\nexport const getStyles = () => {\n  const colors = [\"red\", \"orange\", \"magenta\", \"gold\", \"blue\", \"purple\"];\n  return {\n    stroke: colors[random(0, 5)],\n    strokeWidth: random(1, 5),\n  };\n};\n"
  },
  {
    "path": "demo/rn/src/navigation-config.ts",
    "content": "export type RootStackNavigatorParams = {\n  Components: undefined;\n  Pie: undefined;\n  Chart: undefined;\n  Line: undefined;\n  Area: undefined;\n  Bar: undefined;\n  Histogram: undefined;\n  Scatter: undefined;\n  BoxPlot: undefined;\n  ErrorBar: undefined;\n  Voronoi: undefined;\n  BrushLine: undefined;\n\n  Legends: undefined;\n  Axis: undefined;\n  PolarAxis: undefined;\n};\n"
  },
  {
    "path": "demo/rn/src/screens/area-screen.tsx",
    "content": "import * as React from \"react\";\nimport { ScrollView } from \"react-native\";\nimport { VictoryArea, VictoryGroup, VictoryStack } from \"victory-native\";\nimport viewStyles from \"../styles/view-styles\";\nimport { getData } from \"../data\";\n\nexport const AreaScreen: React.FC = () => {\n  const [data, setData] = React.useState(getData());\n\n  React.useEffect(() => {\n    const updateDataHandle = setInterval(() => {\n      setData(getData());\n    }, 3000);\n    return () => {\n      clearInterval(updateDataHandle);\n    };\n  }, []);\n\n  return (\n    <ScrollView style={viewStyles.container}>\n      <VictoryArea\n        interpolation=\"basis\"\n        animate={{\n          onLoad: { duration: 3500 },\n          duration: 1500,\n        }}\n        data={data}\n      />\n\n      <VictoryArea />\n\n      <VictoryArea\n        data={[\n          { x: 1, y: 1 },\n          { x: 2, y: 2 },\n          { x: 3, y: 3 },\n          { x: 4, y: 1 },\n          { x: 5, y: 3 },\n          { x: 6, y: 4 },\n          { x: 7, y: 2 },\n        ]}\n      />\n\n      <VictoryArea\n        data={[\n          { amount: 1, yield: 1, error: 0.5 },\n          { amount: 2, yield: 2, error: 1.1 },\n          { amount: 3, yield: 3, error: 0 },\n          { amount: 4, yield: 2, error: 0.1 },\n          { amount: 5, yield: 1, error: 1.5 },\n        ]}\n        x={\"amount\"}\n        y={(d) => d.yield + d.error}\n      />\n\n      <VictoryGroup width={300} height={375} style={{ data: { opacity: 0.3 } }}>\n        <VictoryArea\n          data={[\n            { x: 1, y: 1 },\n            { x: 2, y: 2 },\n            { x: 3, y: 3 },\n          ]}\n        />\n        <VictoryArea\n          data={[\n            { x: 1, y: 2 },\n            { x: 2, y: 1 },\n            { x: 3, y: 1 },\n          ]}\n        />\n        <VictoryArea\n          data={[\n            { x: 1, y: 3 },\n            { x: 2, y: 4 },\n            { x: 3, y: 2 },\n          ]}\n        />\n      </VictoryGroup>\n\n      <VictoryStack width={300} height={375}>\n        <VictoryArea\n          data={[\n            { x: 1, y: 1 },\n            { x: 2, y: 2 },\n            { x: 3, y: 3 },\n          ]}\n        />\n        <VictoryArea\n          data={[\n            { x: 1, y: 2 },\n            { x: 2, y: 1 },\n            { x: 3, y: 1 },\n          ]}\n        />\n        <VictoryArea\n          data={[\n            { x: 1, y: 3 },\n            { x: 2, y: 4 },\n            { x: 3, y: 2 },\n          ]}\n        />\n      </VictoryStack>\n\n      <VictoryStack\n        width={300}\n        height={450}\n        style={{\n          data: {\n            strokeDasharray: \"5,5\",\n            strokeWidth: 2,\n            fillOpacity: 0.4,\n          },\n        }}\n      >\n        <VictoryArea\n          style={{\n            data: {\n              fill: \"tomato\",\n              stroke: \"tomato\",\n            },\n          }}\n          data={[\n            { x: 1, y: 1 },\n            { x: 2, y: 2 },\n            { x: 3, y: 3 },\n          ]}\n        />\n        <VictoryArea\n          style={{\n            data: {\n              fill: \"orange\",\n              stroke: \"orange\",\n            },\n          }}\n          data={[\n            { x: 1, y: 2 },\n            { x: 2, y: 1 },\n            { x: 3, y: 1 },\n          ]}\n        />\n        <VictoryArea\n          style={{\n            data: {\n              fill: \"gold\",\n              stroke: \"gold\",\n            },\n          }}\n          data={[\n            { x: 1, y: 3 },\n            { x: 2, y: 4 },\n            { x: 3, y: 2 },\n          ]}\n        />\n      </VictoryStack>\n    </ScrollView>\n  );\n};\n"
  },
  {
    "path": "demo/rn/src/screens/axis-screen.tsx",
    "content": "import * as React from \"react\";\nimport { ScrollView } from \"react-native\";\nimport { VictoryAxis } from \"victory-native\";\nimport Svg from \"react-native-svg\";\nimport viewStyles from \"../styles/view-styles\";\n\nexport const AxisScreen: React.FC = () => {\n  return (\n    <ScrollView style={viewStyles.container}>\n      <VictoryAxis height={100} />\n\n      <VictoryAxis\n        height={100}\n        scale=\"time\"\n        tickValues={[\n          new Date(1980, 1, 1),\n          new Date(1990, 1, 1),\n          new Date(2000, 1, 1),\n          new Date(2010, 1, 1),\n          new Date(2020, 1, 1),\n        ]}\n        tickFormat={(x) => x.getFullYear()}\n      />\n\n      <Svg width={320} height={320}>\n        <VictoryAxis\n          width={320}\n          height={320}\n          domain={[-10, 10]}\n          crossAxis\n          offsetY={160}\n          standalone={false}\n        />\n        <VictoryAxis\n          dependentAxis\n          width={320}\n          height={320}\n          domain={[-10, 10]}\n          crossAxis\n          offsetX={160}\n          standalone={false}\n        />\n      </Svg>\n\n      <VictoryAxis\n        dependentAxis\n        padding={{ left: 50, top: 20, bottom: 20 }}\n        scale=\"log\"\n        domain={[1, 5]}\n      />\n    </ScrollView>\n  );\n};\n"
  },
  {
    "path": "demo/rn/src/screens/bar-screen.tsx",
    "content": "import * as React from \"react\";\nimport { Text } from \"react-native\";\nimport { ScrollView } from \"react-native\";\nimport { VictoryBar, VictoryGroup, VictoryStack } from \"victory-native\";\nimport viewStyles from \"../styles/view-styles\";\n\nexport const BarScreen: React.FC = () => {\n  return (\n    <ScrollView style={viewStyles.container}>\n      <VictoryBar />\n\n      <VictoryBar\n        data={[\n          { x: 1, y: 1 },\n          { x: 2, y: 2 },\n          { x: 3, y: 3 },\n          { x: 4, y: 2 },\n          { x: 5, y: 1 },\n        ]}\n      />\n\n      <VictoryGroup\n        width={300}\n        height={375}\n        offset={20}\n        colorScale={\"qualitative\"}\n      >\n        <VictoryBar\n          data={[\n            { x: 1, y: 1 },\n            { x: 2, y: 2 },\n            { x: 3, y: 3 },\n          ]}\n        />\n        <VictoryBar\n          data={[\n            { x: 1, y: 2 },\n            { x: 2, y: 1 },\n            { x: 3, y: 1 },\n          ]}\n        />\n        <VictoryBar\n          data={[\n            { x: 1, y: 3 },\n            { x: 2, y: 4 },\n            { x: 3, y: 2 },\n          ]}\n        />\n      </VictoryGroup>\n\n      <VictoryStack width={300} height={375} colorScale={\"qualitative\"}>\n        <VictoryBar\n          data={[\n            { x: 1, y: 1 },\n            { x: 2, y: 2 },\n            { x: 3, y: 3 },\n          ]}\n        />\n        <VictoryBar\n          data={[\n            { x: 1, y: 2 },\n            { x: 2, y: 1 },\n            { x: 3, y: 1 },\n          ]}\n        />\n        <VictoryBar\n          data={[\n            { x: 1, y: 3 },\n            { x: 2, y: 4 },\n            { x: 3, y: 2 },\n          ]}\n        />\n      </VictoryStack>\n\n      <VictoryBar\n        height={375}\n        padding={75}\n        style={{\n          data: {\n            fill: ({ datum }: { datum: { y: number } }) =>\n              datum.y > 2 ? \"red\" : \"blue\",\n          },\n        }}\n        data={[\n          { x: 1, y: 1 },\n          { x: 2, y: 2 },\n          { x: 3, y: 3 },\n          { x: 4, y: 2 },\n          { x: 5, y: 1 },\n        ]}\n      />\n    </ScrollView>\n  );\n};\n"
  },
  {
    "path": "demo/rn/src/screens/box-plot-screen.tsx",
    "content": "import * as React from \"react\";\nimport { ScrollView } from \"react-native\";\nimport { VictoryChart, VictoryBoxPlot } from \"victory-native\";\nimport viewStyles from \"../styles/view-styles\";\nimport { getBoxPlotData } from \"../data\";\n\nexport const BoxPlotScreen: React.FC = () => {\n  const [data, setData] = React.useState(getBoxPlotData());\n\n  React.useEffect(() => {\n    const updateDataHandle = setInterval(() => {\n      setData(getBoxPlotData());\n    }, 3000);\n    return () => {\n      clearInterval(updateDataHandle);\n    };\n  }, []);\n\n  return (\n    <ScrollView style={viewStyles.container}>\n      <VictoryChart domainPadding={50}>\n        <VictoryBoxPlot\n          minLabels\n          maxLabels\n          boxWidth={10}\n          data={[\n            { x: \"red\", y: [5, 10, 9, 2] },\n            { x: \"blue\", y: [1, 15, 6, 8] },\n            { x: \"green\", y: [3, 5, 6, 9] },\n            { x: \"yellow\", y: [5, 20, 8, 12] },\n            { x: \"white\", y: [2, 11, 12, 13] },\n          ]}\n        />\n      </VictoryChart>\n      <VictoryChart domainPadding={50}>\n        <VictoryBoxPlot\n          labels\n          boxWidth={10}\n          horizontal\n          y=\"type\"\n          data={[\n            { type: 1, min: 1, max: 18, median: 8, q1: 5, q3: 15 },\n            { type: 2, min: 4, max: 20, median: 10, q1: 7, q3: 15 },\n            { type: 3, min: 3, max: 12, median: 6, q1: 5, q3: 10 },\n          ]}\n        />\n      </VictoryChart>\n      <VictoryBoxPlot animate boxWidth={10} data={data} />\n    </ScrollView>\n  );\n};\n"
  },
  {
    "path": "demo/rn/src/screens/brush-line-screen.tsx",
    "content": "import * as React from \"react\";\nimport { Dimensions, ScrollView } from \"react-native\";\nimport {\n  VictoryAxis,\n  VictoryBrushLine,\n  VictoryChart,\n  VictoryScatter,\n  VictoryLine,\n  VictoryLabel,\n  VictoryBar,\n  VictoryContainer,\n} from \"victory-native\";\nimport { DomainTuple } from \"victory-core\";\nimport _ from \"lodash\";\n\nimport viewStyles from \"../styles/view-styles\";\nimport { VictoryBrushLineProps } from \"victory-brush-line\";\n\ntype DataType = {\n  name: string;\n  strength: number;\n  intelligence: number;\n  speed: number;\n  luck: number;\n}[];\n\ninterface DataSet {\n  name: string;\n  data: { x: string; y: number }[];\n}\n\nconst data: DataType = [\n  { name: \"Adrien\", strength: 5, intelligence: 30, speed: 500, luck: 3 },\n  { name: \"Brice\", strength: 1, intelligence: 13, speed: 550, luck: 2 },\n  { name: \"Casey\", strength: 4, intelligence: 15, speed: 80, luck: 1 },\n  { name: \"Drew\", strength: 3, intelligence: 25, speed: 600, luck: 5 },\n  { name: \"Erin\", strength: 9, intelligence: 50, speed: 350, luck: 4 },\n  { name: \"Francis\", strength: 2, intelligence: 40, speed: 200, luck: 2 },\n];\n\ntype Attribute = \"strength\" | \"intelligence\" | \"speed\" | \"luck\";\nconst attributes: Attribute[] = [\"strength\", \"intelligence\", \"speed\", \"luck\"];\n\ntype Filter = Record<Attribute, number[] | undefined>;\n\nconst width = Dimensions.get(\"window\").width;\nconst padding: { [key: string]: number } = {\n  top: 100,\n  left: 50,\n  right: 50,\n  bottom: 50,\n};\n\nfunction normalizeData(maximumValues: number[]) {\n  // construct normalized datasets by dividing the value for each attribute by the maximum value\n  return data.map((datum) => ({\n    name: datum.name,\n    data: attributes.map((attribute, i) => ({\n      x: attribute,\n      y: datum[attribute] / maximumValues[i],\n    })),\n  }));\n}\n\nfunction getMaximumValues() {\n  return attributes.map((attribute) => {\n    return data.reduce((memo, datum) => {\n      return datum[attribute] > memo ? datum[attribute] : memo;\n    }, -Infinity);\n  });\n}\n\nfunction getAxisOffset(index: number) {\n  const step = (width - padding.left - padding.right) / (attributes.length - 1);\n  return step * index + padding.left;\n}\n\nexport const BrushLineScreen: React.FC = () => {\n  const [scrollEnabled, setScrollEnabled] = React.useState(true);\n  const [maximumValues] = React.useState(getMaximumValues());\n  const [datasets] = React.useState<DataSet[]>(normalizeData(maximumValues));\n  const [filters, setFilters] = React.useState<Filter>({\n    intelligence: undefined,\n    strength: undefined,\n    luck: undefined,\n    speed: undefined,\n  });\n  const [isFiltered, setIsFiltered] = React.useState(false);\n  const [activeDatasets, setActiveDatasets] = React.useState<string[]>([]);\n\n  const onDomainChange = (\n    domain: DomainTuple,\n    props: VictoryBrushLineProps | undefined,\n  ) => {\n    const filters = addNewFilters(domain, props);\n    const isFiltered = !_.isEmpty(_.values(filters).filter(Boolean));\n    const activeDatasets = isFiltered\n      ? getActiveDatasets(filters)\n      : datasets.map((x) => x.name);\n    setFilters(filters);\n    setIsFiltered(isFiltered);\n    setActiveDatasets(activeDatasets);\n  };\n\n  const addNewFilters = (\n    domain: DomainTuple,\n    props: VictoryBrushLineProps | undefined,\n  ): Filter => {\n    if (!domain) return filters;\n    if (typeof domain[0] != \"number\") return filters;\n    if (typeof domain[1] != \"number\") return filters;\n    if (!props) return filters;\n\n    const dm = domain as [number, number];\n    const currentFilters = filters;\n    const extent = dm && Math.abs(dm[1] - dm[0]);\n    const minVal = 1 / Number.MAX_VALUE;\n\n    currentFilters[props.name as Attribute] = extent <= minVal ? undefined : dm;\n\n    return currentFilters;\n  };\n\n  const getActiveDatasets = (filters: Filter): string[] => {\n    // Return the names from all datasets that have values within all filters\n    const isActive = (dataset: DataSet): (string | null | undefined)[] => {\n      return Object.keys(filters).reduce((memo: any, name) => {\n        let filter = name as keyof Filter;\n\n        if (!memo || !Array.isArray(filters[filter])) {\n          return memo;\n        }\n        const point = _.find(dataset.data, (d) => d.x === filter);\n        let tuple = filters[filter];\n        return (\n          point &&\n          tuple &&\n          Math.max(...tuple) >= point.y &&\n          Math.min(...tuple) <= point.y\n        );\n      }, true);\n    };\n\n    return datasets\n      .map((dataset) => (isActive(dataset) ? dataset.name : null))\n      .filter(Boolean) as string[];\n  };\n\n  const isActive = (dataset: DataSet): boolean => {\n    // Determine whether a given dataset is active\n    return !isFiltered ? true : _.includes(activeDatasets, dataset.name);\n  };\n\n  const max = maximumValues || [];\n\n  return (\n    <ScrollView scrollEnabled={scrollEnabled} style={viewStyles.container}>\n      <VictoryChart\n        containerComponent={\n          <VictoryContainer\n            onTouchStart={() => setScrollEnabled(false)}\n            onTouchEnd={() => setScrollEnabled(true)}\n          />\n        }\n        domain={{ y: [0, 1.1] }}\n        width={width}\n        padding={padding}\n      >\n        <VictoryAxis\n          style={{\n            tickLabels: { fontSize: 20 },\n            axis: { stroke: \"none\" },\n          }}\n          tickLabelComponent={<VictoryLabel y={padding.top - 40} />}\n        />\n        {datasets.map((dataset: DataSet) => (\n          <VictoryLine\n            key={dataset.name}\n            name={dataset.name}\n            data={dataset.data}\n            style={{\n              data: {\n                stroke: \"tomato\",\n                opacity: isActive(dataset) ? 1 : 0.2,\n              },\n            }}\n          />\n        ))}\n        {attributes.map((attribute, index) => (\n          <VictoryAxis\n            dependentAxis\n            name={attribute}\n            key={index}\n            axisComponent={\n              <VictoryBrushLine\n                name={attribute}\n                width={20}\n                onTouchStart={() => setScrollEnabled(false)}\n                onTouchEnd={() => setScrollEnabled(true)}\n                onBrushDomainChange={onDomainChange}\n              />\n            }\n            offsetX={getAxisOffset(index)}\n            style={{\n              tickLabels: {\n                fontSize: 15,\n                padding: 15,\n                pointerEvents: \"none\",\n              },\n            }}\n            tickValues={[0.2, 0.4, 0.6, 0.8, 1]}\n            tickFormat={(tick) => Math.round(tick * max[index])}\n          />\n        ))}\n      </VictoryChart>\n      <VictoryChart>\n        <VictoryScatter\n          data={[\n            { x: \"one\", y: 0 },\n            { x: \"two\", y: 2 },\n            { x: \"three\", y: 4 },\n          ]}\n        />\n        <VictoryAxis\n          gridComponent={\n            <VictoryBrushLine\n              onTouchStart={() => setScrollEnabled(false)}\n              onTouchEnd={() => setScrollEnabled(true)}\n              brushWidth={20}\n            />\n          }\n        />\n      </VictoryChart>\n      <VictoryChart domainPadding={{ x: 80 }}>\n        <VictoryBar\n          data={[\n            { x: \"one\", y: 4 },\n            { x: \"two\", y: 5 },\n            { x: \"three\", y: 6 },\n          ]}\n        />\n        <VictoryAxis\n          dependentAxis\n          axisComponent={\n            <VictoryBrushLine\n              onTouchStart={() => setScrollEnabled(false)}\n              onTouchEnd={() => setScrollEnabled(true)}\n              brushWidth={20}\n              brushDomain={[2, 3]}\n            />\n          }\n        />\n      </VictoryChart>\n      <VictoryChart domainPadding={50}>\n        <VictoryScatter\n          size={4}\n          style={{ data: { fill: \"tomato\" } }}\n          data={[\n            { x: 1, y: 1 },\n            { x: 2, y: 2 },\n            { x: 3, y: 4 },\n          ]}\n        />\n        <VictoryAxis\n          tickValues={[1, 2, 3]}\n          gridComponent={\n            <VictoryBrushLine\n              onTouchStart={() => setScrollEnabled(false)}\n              onTouchEnd={() => setScrollEnabled(true)}\n              width={30}\n            />\n          }\n        />\n      </VictoryChart>\n\n      <VictoryAxis\n        standalone\n        gridComponent={\n          <VictoryBrushLine\n            onTouchStart={() => setScrollEnabled(false)}\n            onTouchEnd={() => setScrollEnabled(true)}\n            brushWidth={10}\n            brushDomain={[0, 10]}\n          />\n        }\n      />\n    </ScrollView>\n  );\n};\n"
  },
  {
    "path": "demo/rn/src/screens/chart-screen.tsx",
    "content": "import * as React from \"react\";\nimport { ScrollView } from \"react-native\";\nimport {\n  Background,\n  VictoryChart,\n  VictoryBar,\n  VictoryGroup,\n  VictoryLine,\n  VictoryScatter,\n  VictoryArea,\n  VictoryStack,\n  VictoryTooltip,\n  VictoryZoomContainer,\n} from \"victory-native\";\nimport viewStyles from \"../styles/view-styles\";\nimport { getTransitionData, generateRandomData } from \"../data\";\n\nexport const ChartScreen: React.FC = () => {\n  const [transitionData, setTransitionData] =\n    React.useState(getTransitionData());\n\n  React.useEffect(() => {\n    const updateDataHandle = setInterval(() => {\n      setTransitionData(getTransitionData());\n    }, 3000);\n    return () => {\n      clearInterval(updateDataHandle);\n    };\n  }, []);\n\n  return (\n    <ScrollView style={viewStyles.container}>\n      <VictoryChart>\n        <VictoryBar />\n        <VictoryLine />\n      </VictoryChart>\n\n      <VictoryChart domain={{ x: [0, 4] }}>\n        <VictoryGroup\n          labels={[\"a\", \"b\", \"c\"]}\n          offset={10}\n          colorScale={\"qualitative\"}\n        >\n          <VictoryBar\n            data={[\n              { x: 1, y: 1 },\n              { x: 2, y: 2 },\n              { x: 3, y: 5 },\n            ]}\n          />\n          <VictoryBar\n            data={[\n              { x: 1, y: 2 },\n              { x: 2, y: 1 },\n              { x: 3, y: 7 },\n            ]}\n          />\n          <VictoryBar\n            data={[\n              { x: 1, y: 3 },\n              { x: 2, y: 4 },\n              { x: 3, y: 9 },\n            ]}\n          />\n        </VictoryGroup>\n      </VictoryChart>\n\n      <VictoryChart>\n        <VictoryScatter\n          labelComponent={<VictoryTooltip />}\n          style={{\n            data: { fill: ({ datum }) => datum.fill },\n          }}\n          data={[\n            {\n              x: 1,\n              y: 3,\n              fill: \"red\",\n              symbol: \"plus\",\n              size: 6,\n              label: \"Red\",\n            },\n            {\n              x: 2,\n              y: 5,\n              fill: \"magenta\",\n              size: 9,\n              opacity: 0.4,\n              label: \"Magenta\",\n            },\n            {\n              x: 3,\n              y: 4,\n              fill: \"orange\",\n              size: 5,\n              label: \"Orange\",\n            },\n            {\n              x: 4,\n              y: 2,\n              fill: \"brown\",\n              symbol: \"square\",\n              size: 6,\n              label: \"Brown\",\n            },\n            {\n              x: 5,\n              y: 5,\n              fill: \"black\",\n              symbol: \"triangleUp\",\n              size: 5,\n              label: \"Black\",\n            },\n          ]}\n        />\n      </VictoryChart>\n      <VictoryChart animate={{ duration: 2000 }}>\n        <VictoryArea data={transitionData} />\n      </VictoryChart>\n      <VictoryChart animate={{ duration: 2000 }}>\n        <VictoryBar\n          labels={() => \"Hi\"}\n          data={transitionData}\n          style={{\n            data: {\n              fill: \"tomato\",\n              width: 12,\n            },\n          }}\n          animate={{\n            onExit: {\n              duration: 500,\n              before: () => ({\n                y: 0,\n                fill: \"orange\",\n                label: \"BYE\",\n              }),\n            },\n          }}\n        />\n      </VictoryChart>\n\n      <VictoryChart>\n        <VictoryStack>\n          <VictoryArea\n            data={[\n              { x: \"a\", y: 2 },\n              { x: \"b\", y: 3 },\n              { x: \"c\", y: 5 },\n              { x: \"d\", y: 4 },\n              { x: \"e\", y: 7 },\n            ]}\n          />\n          <VictoryArea\n            data={[\n              { x: \"a\", y: 1 },\n              { x: \"b\", y: 4 },\n              { x: \"c\", y: 5 },\n              { x: \"d\", y: 7 },\n              { x: \"e\", y: 5 },\n            ]}\n          />\n          <VictoryArea\n            data={[\n              { x: \"a\", y: 3 },\n              { x: \"b\", y: 2 },\n              { x: \"c\", y: 6 },\n              { x: \"d\", y: 2 },\n              { x: \"e\", y: 6 },\n            ]}\n          />\n          <VictoryArea\n            data={[\n              { x: \"a\", y: 2 },\n              { x: \"b\", y: 3 },\n              { x: \"c\", y: 3 },\n              { x: \"d\", y: 4 },\n              { x: \"e\", y: 7 },\n            ]}\n          />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart\n        polar\n        backgroundComponent={<Background />}\n        style={{ background: { fill: \"pink\" } }}\n      >\n        <VictoryBar />\n      </VictoryChart>\n      <VictoryChart\n        containerComponent={\n          <VictoryZoomContainer\n            zoomDimension=\"x\"\n            zoomDomain={{\n              x: [0, 5],\n            }}\n          />\n        }\n      >\n        <VictoryBar barRatio={1.2} data={generateRandomData(10)} />\n      </VictoryChart>\n    </ScrollView>\n  );\n};\n"
  },
  {
    "path": "demo/rn/src/screens/components-screen.tsx",
    "content": "import * as React from \"react\";\nimport {\n  ListRenderItem,\n  Platform,\n  SectionList,\n  SectionListRenderItem,\n  Text,\n  TouchableOpacity,\n  View,\n} from \"react-native\";\nimport styles from \"../styles/container-view-styles\";\nimport { useNavigation } from \"@react-navigation/native\";\nimport { NativeStackNavigationProp } from \"@react-navigation/native-stack\";\nimport { RootStackNavigatorParams } from \"../navigation-config\";\n\nexport const ComponentsScreen: React.FC = () => {\n  const rootNavigation =\n    useNavigation<NativeStackNavigationProp<RootStackNavigatorParams>>();\n\n  const renderItem = React.useCallback<\n    SectionListRenderItem<DataItem, SectionItem>\n  >(({ item }) => {\n    return (\n      <TouchableOpacity\n        onPress={() => {\n          // @ts-ignore\n          rootNavigation.navigate(item.key);\n        }}\n      >\n        <View style={styles.item}>\n          <Text style={styles.itemText}>{item.title}</Text>\n          {/*{Platform.select({ ios: <ChevronIcon /> })}*/}\n        </View>\n      </TouchableOpacity>\n    );\n  }, []);\n\n  const renderSectionHeader = React.useCallback(\n    ({ section }: { section: SectionItem }) => {\n      return (\n        <View style={styles.sectionHeader}>\n          <Text style={styles.sectionHeaderText}>{section.title}</Text>\n        </View>\n      );\n    },\n    [],\n  );\n\n  return (\n    <SectionList\n      style={styles.container}\n      sections={sections}\n      renderSectionHeader={renderSectionHeader}\n      renderItem={renderItem}\n    />\n  );\n};\n\ntype DataItem = { key: string; title: string };\ntype SectionItem = {\n  title: string;\n  data: DataItem[];\n};\n\nconst sections: SectionItem[] = [\n  {\n    data: [\n      { key: \"Pie\", title: \"VictoryPie\" },\n      { key: \"Chart\", title: \"VictoryChart\" },\n      { key: \"Line\", title: \"VictoryLine\" },\n      { key: \"Area\", title: \"VictoryArea\" },\n      { key: \"Bar\", title: \"VictoryBar\" },\n      { key: \"Histogram\", title: \"VictoryHistogram\" },\n      { key: \"Scatter\", title: \"VictoryScatter\" },\n      { key: \"BoxPlot\", title: \"VictoryBoxPlot\" },\n      { key: \"ErrorBar\", title: \"VictoryErrorBar\" },\n      { key: \"Voronoi\", title: \"VictoryVoronoi\" },\n      { key: \"BrushLine\", title: \"VictoryBrushLine\" },\n    ],\n    title: \"Charts\",\n  },\n  // {\n  //   data: [\n  //     { key: \"ContainersView\", title: \"Built–in Containers\" },\n  //     { key: \"CreateContainerView\", title: \"Custom Containers\" }\n  //   ],\n  //   title: \"Containers\"\n  // },\n  {\n    data: [\n      { key: \"Legends\", title: \"Legends\" },\n      { key: \"Axis\", title: \"Axis\" },\n      { key: \"PolarAxis\", title: \"VictoryPolarAxis\" },\n      // { key: \"ErrorsTooltipsView\", title: \"Errors & Tooltips\" }\n    ],\n    title: \"Other\",\n  },\n];\n"
  },
  {
    "path": "demo/rn/src/screens/error-bar-screen.tsx",
    "content": "import * as React from \"react\";\nimport { ScrollView, Text } from \"react-native\";\nimport { VictoryChart, VictoryErrorBar, VictoryTheme } from \"victory-native\";\nimport viewStyles from \"../styles/view-styles\";\n\nexport const ErrorBarScreen: React.FC = () => {\n  return (\n    <ScrollView style={viewStyles.container}>\n      <VictoryChart domainPadding={15} theme={VictoryTheme.material}>\n        <VictoryErrorBar\n          data={data}\n          errorX={(datum) => datum.error * datum.x}\n          errorY={(datum) => datum.error * datum.y}\n        />\n      </VictoryChart>\n    </ScrollView>\n  );\n};\n\nconst data = [\n  { x: 15, y: 35000, error: 0.2 },\n  { x: 20, y: 42000, error: 0.05 },\n  { x: 25, y: 30000, error: 0.1 },\n  { x: 30, y: 35000, error: 0.2 },\n  { x: 35, y: 22000, error: 0.15 },\n];\n"
  },
  {
    "path": "demo/rn/src/screens/histogram-screen.tsx",
    "content": "import * as React from \"react\";\nimport { ScrollView } from \"react-native\";\nimport { VictoryStack, VictoryHistogram } from \"victory-native\";\nimport viewStyles from \"../styles/view-styles\";\n\nconst randomDate = (start: Date, end: Date) => {\n  return new Date(\n    start.getTime() + Math.random() * (end.getTime() - start.getTime()),\n  );\n};\nconst getRandomDateData = () =>\n  Array.from({ length: 100 }, () => ({\n    x: randomDate(new Date(2016, 0, 1), new Date(2020, 5, 1)),\n  }));\nconst getRandomData = () =>\n  Array.from({ length: 100 }, () => ({\n    x: Math.floor(Math.random() * 100),\n  }));\n\nconst numericData = getRandomData();\nconst numericData2 = getRandomData();\nconst dateData = getRandomDateData();\nconst dateData2 = getRandomDateData();\n\nexport const HistogramScreen: React.FC = () => {\n  return (\n    <ScrollView style={viewStyles.container}>\n      <VictoryHistogram\n        data={numericData}\n        style={{\n          data: { stroke: \"#833B61\", strokeWidth: 3, fill: \"#F67E7D\" },\n        }}\n        cornerRadius={10}\n      />\n\n      <VictoryHistogram\n        data={numericData}\n        style={{\n          data: { stroke: \"#833B61\", strokeWidth: 3, fill: \"#F67E7D\" },\n        }}\n        binSpacing={20}\n      />\n\n      <VictoryHistogram data={numericData2} bins={3} />\n\n      <VictoryHistogram\n        data={dateData}\n        bins={[\n          new Date(2016, 0, 1),\n          new Date(2017, 0, 1),\n          new Date(2018, 0, 1),\n          new Date(2019, 0, 1),\n          new Date(2020, 0, 1),\n        ]}\n      />\n\n      <VictoryHistogram\n        data={dateData2}\n        style={{ data: { stroke: \"#f67280\", strokeWidth: 4, fill: \"#355c7d\" } }}\n      />\n\n      <VictoryStack colorScale=\"qualitative\">\n        <VictoryHistogram data={numericData} />\n        <VictoryHistogram data={numericData2} />\n      </VictoryStack>\n    </ScrollView>\n  );\n};\n"
  },
  {
    "path": "demo/rn/src/screens/legends-screen.tsx",
    "content": "import * as React from \"react\";\nimport { ScrollView, Dimensions } from \"react-native\";\nimport { VictoryLegend } from \"victory-native\";\nimport Svg from \"react-native-svg\";\nimport viewStyles from \"../styles/view-styles\";\n\nconst legendData = [\n  {\n    name: \"Series 1\",\n    symbol: {\n      type: \"circle\",\n      fill: \"green\",\n    },\n  },\n  {\n    name: \"Long Series Name\",\n    symbol: {\n      type: \"triangleUp\",\n      fill: \"blue\",\n    },\n  },\n  {\n    name: \"Series 3\",\n    symbol: {\n      type: \"diamond\",\n      fill: \"pink\",\n    },\n  },\n  {\n    name: \"Series 4\",\n    symbol: {\n      type: \"plus\",\n    },\n  },\n  {\n    name: \"Series 5\",\n    symbol: {\n      type: \"star\",\n      fill: \"red\",\n    },\n    labels: {\n      fill: \"purple\",\n    },\n  },\n  {\n    name: \"Series 6\",\n    symbol: {\n      type: \"circle\",\n      fill: \"orange\",\n    },\n    labels: {\n      fill: \"blue\",\n    },\n  },\n];\n\nconst legendStyle = { border: { stroke: \"black\" } };\n\nexport const LegendsScreen: React.FC = () => {\n  return (\n    <ScrollView style={viewStyles.container}>\n      <Svg width={Dimensions.get(\"window\").width} height={300}>\n        <VictoryLegend\n          x={5}\n          y={10}\n          standalone={false}\n          data={legendData}\n          style={legendStyle}\n        />\n        <VictoryLegend\n          x={5}\n          y={200}\n          data={legendData}\n          standalone={false}\n          itemsPerRow={3}\n          style={legendStyle}\n        />\n      </Svg>\n    </ScrollView>\n  );\n};\n"
  },
  {
    "path": "demo/rn/src/screens/line-screen.tsx",
    "content": "import * as React from \"react\";\nimport { ScrollView } from \"react-native\";\nimport { VictoryLine } from \"victory-native\";\nimport { getStyles, getYFunction } from \"../data\";\nimport viewStyles from \"../styles/view-styles\";\n\nexport const LineScreen: React.FC = () => {\n  const [y, setY] = React.useState(getYFunction);\n  const [styles, setStyles] = React.useState(getStyles());\n\n  React.useEffect(() => {\n    const updateDataHandle = setInterval(() => {\n      setY(getYFunction);\n      setStyles(getStyles());\n    }, 3000);\n    return () => {\n      clearInterval(updateDataHandle);\n    };\n  }, []);\n\n  return (\n    <ScrollView style={viewStyles.container}>\n      <VictoryLine />\n\n      <VictoryLine\n        data={[\n          { x: 0, y: 1 },\n          { x: 1, y: 3 },\n          { x: 2, y: 2 },\n          { x: 3, y: 4 },\n          { x: 4, y: 3 },\n          { x: 5, y: 5 },\n        ]}\n      />\n\n      <VictoryLine\n        data={[\n          { amount: 1, yield: 1, error: 0.5 },\n          { amount: 2, yield: 2, error: 1.1 },\n          { amount: 3, yield: 3, error: 0 },\n          { amount: 4, yield: 2, error: 0.1 },\n          { amount: 5, yield: 1, error: 1.5 },\n        ]}\n        x={\"amount\"}\n        y={(data) => data.yield + data.error}\n      />\n\n      <VictoryLine y={(data) => Math.sin(2 * Math.PI * data.x)} />\n\n      <VictoryLine\n        height={300}\n        domain={[0, 5]}\n        padding={75}\n        data={[\n          { x: 0, y: 1 },\n          { x: 1, y: 3 },\n          { x: 2, y: 2 },\n          { x: 3, y: 4 },\n          { x: 4, y: 3 },\n          { x: 5, y: 5 },\n        ]}\n        interpolation=\"cardinal\"\n        labels={() => \"LINE\"}\n        style={{\n          data: {\n            stroke: \"#822722\",\n            strokeWidth: 3,\n          },\n          labels: { fontSize: 12 },\n        }}\n      />\n\n      <VictoryLine\n        width={300}\n        style={{\n          data: { stroke: \"blue\", strokeWidth: 4 },\n        }}\n        data={[\n          { x: 0, y: 1 },\n          { x: 1, y: 3 },\n          { x: 2, y: 2 },\n          { x: 3, y: 4 },\n          { x: 4, y: 3 },\n          { x: 5, y: 5 },\n        ]}\n      />\n\n      <VictoryLine\n        style={{\n          data: { stroke: \"red\", strokeWidth: 9 },\n        }}\n        interpolation={\"linear\"}\n        data={[\n          { x: 0, y: 1 },\n          { x: 1, y: 3 },\n          { x: 2, y: 2 },\n          { x: 3, y: 4 },\n          { x: 4, y: 3 },\n          { x: 5, y: 5 },\n        ]}\n      />\n\n      <VictoryLine\n        style={{ data: styles }}\n        interpolation=\"basis\"\n        animate={{ duration: 1500 }}\n        y={y}\n      />\n    </ScrollView>\n  );\n};\n"
  },
  {
    "path": "demo/rn/src/screens/pie-screen.tsx",
    "content": "import * as React from \"react\";\nimport { ScrollView } from \"react-native\";\nimport { VictoryPie } from \"victory-native\";\nimport viewStyles from \"../styles/view-styles\";\nimport { generateRandomData } from \"../data/\";\n\nexport const PieScreen: React.FC = () => {\n  const [data, setData] = React.useState(generateRandomData());\n\n  React.useEffect(() => {\n    const updateDataHandle = setInterval(() => {\n      setData(generateRandomData());\n    }, 3000);\n    return () => {\n      clearInterval(updateDataHandle);\n    };\n  }, []);\n\n  return (\n    <ScrollView style={viewStyles.container}>\n      <VictoryPie\n        innerRadius={75}\n        labelRadius={125}\n        style={{ labels: { fontSize: 20 } }}\n        data={data}\n        animate={{ duration: 1500 }}\n      />\n\n      <VictoryPie\n        style={{\n          data: {\n            stroke: \"none\",\n            opacity: 0.3,\n          },\n        }}\n      />\n      <VictoryPie innerRadius={90} />\n      <VictoryPie endAngle={90} startAngle={-90} />\n      <VictoryPie\n        endAngle={90}\n        innerRadius={90}\n        padAngle={5}\n        startAngle={-90}\n      />\n      <VictoryPie\n        style={{\n          labels: {\n            fill: \"white\",\n            stroke: \"none\",\n            fontSize: 15,\n            fontWeight: \"bold\",\n          },\n        }}\n        data={[\n          { x: \"<5\", y: 6279 },\n          { x: \"5-13\", y: 9182 },\n          { x: \"14-17\", y: 5511 },\n          { x: \"18-24\", y: 7164 },\n          { x: \"25-44\", y: 6716 },\n          { x: \"45-64\", y: 4263 },\n          { x: \"≥65\", y: 7502 },\n        ]}\n        innerRadius={70}\n        labelRadius={100}\n        colorScale={[\n          \"#D85F49\",\n          \"#F66D3B\",\n          \"#D92E1D\",\n          \"#D73C4C\",\n          \"#FFAF59\",\n          \"#E28300\",\n          \"#F6A57F\",\n        ]}\n      />\n      <VictoryPie\n        style={{\n          data: {\n            stroke: ({ datum }) => (datum.y > 75 ? \"black\" : \"none\"),\n            opacity: ({ datum }) => (datum.y > 75 ? 1 : 0.4),\n          },\n        }}\n        data={[\n          { x: \"Cat\", y: 62 },\n          { x: \"Dog\", y: 91 },\n          { x: \"Fish\", y: 55 },\n          { x: \"Bird\", y: 55 },\n        ]}\n      />\n    </ScrollView>\n  );\n};\n"
  },
  {
    "path": "demo/rn/src/screens/polar-axis-screen.tsx",
    "content": "import * as React from \"react\";\nimport { ScrollView } from \"react-native\";\nimport viewStyles from \"../styles/view-styles\";\nimport {\n  VictoryBar,\n  VictoryChart,\n  VictoryPolarAxis,\n  VictoryTheme,\n} from \"victory-native\";\n\nexport const PolarAxisScreen: React.FC = () => {\n  return (\n    <ScrollView style={viewStyles.container}>\n      <VictoryChart polar theme={VictoryTheme.material}>\n        {[\"cat\", \"dog\", \"bird\", \"dog\", \"frog\", \"fish\"].map((d, i) => {\n          return (\n            <VictoryPolarAxis\n              dependentAxis\n              key={i}\n              label={d}\n              labelPlacement=\"perpendicular\"\n              style={{ tickLabels: { fill: \"none\" } }}\n              axisValue={d}\n            />\n          );\n        })}\n        <VictoryBar\n          style={{ data: { fill: \"tomato\", width: 25 } }}\n          data={[\n            { x: \"cat\", y: 10 },\n            { x: \"dog\", y: 25 },\n            { x: \"bird\", y: 40 },\n            { x: \"frog\", y: 50 },\n            { x: \"fish\", y: 50 },\n          ]}\n        />\n      </VictoryChart>\n    </ScrollView>\n  );\n};\n"
  },
  {
    "path": "demo/rn/src/screens/root-navigator.tsx",
    "content": "import * as React from \"react\";\nimport { RootStackNavigatorParams } from \"../navigation-config\";\nimport { createNativeStackNavigator } from \"@react-navigation/native-stack\";\nimport { BarScreen } from \"./bar-screen\";\nimport { ComponentsScreen } from \"./components-screen\";\nimport { PieScreen } from \"./pie-screen\";\nimport { ChartScreen } from \"./chart-screen\";\nimport { LineScreen } from \"./line-screen\";\nimport { AreaScreen } from \"./area-screen\";\nimport { HistogramScreen } from \"./histogram-screen\";\nimport { LegendsScreen } from \"./legends-screen\";\nimport { AxisScreen } from \"./axis-screen\";\nimport { ScatterScreen } from \"./scatter-screen\";\nimport { BoxPlotScreen } from \"./box-plot-screen\";\nimport { ErrorBarScreen } from \"./error-bar-screen\";\nimport { PolarAxisScreen } from \"./polar-axis-screen\";\nimport { VoronoiScreen } from \"./voronoi-screen\";\nimport { BrushLineScreen } from \"./brush-line-screen\";\n\nexport const RootNavigator: React.FC = () => {\n  return (\n    <RootStack.Navigator>\n      <RootStack.Screen name=\"Components\" component={ComponentsScreen} />\n      <RootStack.Screen\n        name=\"Pie\"\n        component={PieScreen}\n        options={{ title: \"VictoryPie\" }}\n      />\n      <RootStack.Screen\n        name=\"Chart\"\n        component={ChartScreen}\n        options={{ title: \"VictoryChart\" }}\n      />\n      <RootStack.Screen\n        name=\"Line\"\n        component={LineScreen}\n        options={{ title: \"VictoryLine\" }}\n      />\n      <RootStack.Screen\n        name=\"Area\"\n        component={AreaScreen}\n        options={{ title: \"VictoryArea\" }}\n      />\n      <RootStack.Screen\n        name=\"Bar\"\n        component={BarScreen}\n        options={{ title: \"VictoryBar\" }}\n      />\n      <RootStack.Screen\n        name=\"Histogram\"\n        component={HistogramScreen}\n        options={{ title: \"VictoryHistogram\" }}\n      />\n      <RootStack.Screen\n        name=\"Scatter\"\n        component={ScatterScreen}\n        options={{ title: \"VictoryScatter\" }}\n      />\n      <RootStack.Screen\n        name=\"BoxPlot\"\n        component={BoxPlotScreen}\n        options={{ title: \"VictoryBoxPlot\" }}\n      />\n      <RootStack.Screen\n        name=\"ErrorBar\"\n        component={ErrorBarScreen}\n        options={{ title: \"VictoryErrorBar\" }}\n      />\n      <RootStack.Screen\n        name=\"Voronoi\"\n        component={VoronoiScreen}\n        options={{ title: \"VictoryVoronoi\" }}\n      />\n      <RootStack.Screen\n        name=\"BrushLine\"\n        component={BrushLineScreen}\n        options={{ title: \"VictoryBrushLine\" }}\n      />\n\n      {/* Other */}\n      <RootStack.Screen\n        name=\"Legends\"\n        component={LegendsScreen}\n        options={{ title: \"Legends\" }}\n      />\n      <RootStack.Screen\n        name=\"Axis\"\n        component={AxisScreen}\n        options={{ title: \"Axis\" }}\n      />\n      <RootStack.Screen\n        name=\"PolarAxis\"\n        component={PolarAxisScreen}\n        options={{ title: \"VictoryPolarAxis\" }}\n      />\n    </RootStack.Navigator>\n  );\n};\n\nconst RootStack = createNativeStackNavigator<RootStackNavigatorParams>();\n"
  },
  {
    "path": "demo/rn/src/screens/scatter-screen.tsx",
    "content": "import * as React from \"react\";\nimport { ScrollView, View } from \"react-native\";\nimport { VictoryScatter } from \"victory-native\";\nimport viewStyles from \"../styles/view-styles\";\nimport { generateRandomData } from \"../data\";\n\nexport const ScatterScreen: React.FC = () => {\n  const [data, setData] = React.useState(generateRandomData());\n\n  React.useEffect(() => {\n    const updateDataHandle = setInterval(() => {\n      setData(generateRandomData());\n    }, 3000);\n    return () => {\n      clearInterval(updateDataHandle);\n    };\n  }, []);\n\n  return (\n    <ScrollView style={viewStyles.container}>\n      <View pointerEvents=\"none\">\n        <VictoryScatter />\n\n        <VictoryScatter data={data} animate={{ duration: 1500 }} />\n\n        <VictoryScatter y={(d) => Math.sin(2 * Math.PI * d.x)} />\n\n        <VictoryScatter\n          data={[\n            { x: 1, y: 3 },\n            { x: 2, y: 5 },\n            { x: 3, y: 4 },\n            { x: 4, y: 2 },\n            { x: 5, y: 5 },\n          ]}\n          size={8}\n          symbol=\"star\"\n          style={{\n            data: {\n              fill: \"gold\",\n              stroke: \"orange\",\n              strokeWidth: 3,\n            },\n          }}\n        />\n\n        <VictoryScatter\n          style={{\n            data: {\n              fill: ({ datum }) => (datum.y > 0 ? \"red\" : \"blue\"),\n            },\n          }}\n          symbol={({ datum }) => (datum.y > 0 ? \"triangleUp\" : \"triangleDown\")}\n          y={(d) => Math.sin(2 * Math.PI * d.x)}\n          samples={25}\n        />\n      </View>\n    </ScrollView>\n  );\n};\n"
  },
  {
    "path": "demo/rn/src/screens/voronoi-screen.tsx",
    "content": "import * as React from \"react\";\nimport { ScrollView } from \"react-native\";\nimport viewStyles from \"../styles/view-styles\";\nimport { VictoryTheme, VictoryVoronoi, VictoryChart } from \"victory-native\";\n\nexport const VoronoiScreen: React.FC = () => {\n  return (\n    <ScrollView style={viewStyles.container}>\n      <VictoryChart\n        theme={VictoryTheme.material}\n        domain={{ x: [0, 5], y: [0, 7] }}\n      >\n        <VictoryVoronoi\n          style={{ data: { stroke: \"#c43a31\", strokeWidth: 2 } }}\n          data={[\n            { x: 1, y: 2 },\n            { x: 2, y: 3 },\n            { x: 3, y: 5 },\n            { x: 4, y: 4 },\n            { x: 5, y: 7 },\n          ]}\n        />\n      </VictoryChart>\n    </ScrollView>\n  );\n};\n"
  },
  {
    "path": "demo/rn/src/styles/container-view-styles.ts",
    "content": "import { Platform, StyleSheet } from \"react-native\";\n\nexport default StyleSheet.create({\n  container: {\n    flex: 1,\n    backgroundColor: \"#fff\",\n  },\n  sectionHeader: {\n    paddingHorizontal: 15,\n    paddingVertical: 10,\n    backgroundColor: \"#eee\",\n    borderBottomColor: \"#ccc\",\n    borderBottomWidth: StyleSheet.hairlineWidth,\n  },\n  sectionHeaderText: {\n    fontWeight: \"bold\",\n  },\n  item: {\n    backgroundColor: \"#fff\",\n    borderBottomColor: \"#ccc\",\n    borderBottomWidth: StyleSheet.hairlineWidth,\n    justifyContent: \"space-between\",\n    alignItems: \"center\",\n    flexDirection: \"row\",\n    ...Platform.select({\n      ios: { marginLeft: 15, paddingRight: 15, paddingVertical: 15 },\n      android: { padding: 15 },\n    }),\n  },\n  itemText: {\n    fontSize: 16,\n  },\n});\n"
  },
  {
    "path": "demo/rn/src/styles/view-styles.ts",
    "content": "import { Platform, StyleSheet } from \"react-native\";\n\nexport default StyleSheet.create({\n  container: {\n    flex: 1,\n  },\n  monospace: {\n    fontFamily: Platform.OS === \"ios\" ? \"Menlo\" : \"monospace\",\n  },\n  contentContainer: {\n    alignItems: \"center\",\n  },\n  header: {\n    fontWeight: \"600\",\n    padding: 15,\n    fontSize: 18,\n  },\n});\n"
  },
  {
    "path": "demo/rn/tsconfig.json",
    "content": "{\n  \"extends\": \"expo/tsconfig.base\",\n  \"compilerOptions\": {\n    \"strict\": true\n  }\n}\n"
  },
  {
    "path": "eslint.config.mjs",
    "content": "import eslint from \"@eslint/js\";\nimport prettier from \"eslint-plugin-prettier/recommended\";\nimport pluginJest from \"eslint-plugin-jest\";\nimport pluginPromise from \"eslint-plugin-promise\";\nimport react from \"eslint-plugin-react\";\nimport reactHooks from \"eslint-plugin-react-hooks\";\nimport tseslint from \"typescript-eslint\";\nimport globals from \"globals\";\n\nexport default tseslint.config(\n  // enforce formatting\n  prettier,\n\n  // global ignores\n  {\n    ignores: [\n      \"**/*.d.ts\",\n      \"**/.wireit/\",\n      \"**/.docusaurus/\",\n      \"**/artifacts/\",\n      \"**/coverage/\",\n      \"**/demo/rn/\",\n      \"**/dist/\",\n      \"**/build/\",\n      \"**/es/\",\n      \"**/lib/\",\n      \"**/lib-vendor/\",\n      \"**/public/\",\n      \"**/storybook-static/\",\n      \"**/tmp/\",\n      \"website/src/theme/\",\n      \"website/src/plugins/\",\n    ],\n  },\n\n  // Typescript and React Rules\n  {\n    files: [\"**/*.{js,jsx,mjs,cjs,ts,tsx}\"],\n    extends: [\n      eslint.configs.recommended,\n      ...tseslint.configs.recommended,\n      react.configs.flat.recommended,\n      pluginPromise.configs[\"flat/recommended\"],\n    ],\n    plugins: {\n      react,\n      \"react-hooks\": reactHooks,\n    },\n    settings: {\n      react: {\n        version: \"detect\",\n      },\n    },\n    languageOptions: {\n      parserOptions: {\n        ecmaFeatures: {\n          jsx: true,\n        },\n      },\n      globals: {\n        ...globals.browser,\n        ...globals.node,\n      },\n    },\n    rules: {\n      // eslint overrides\n      eqeqeq: \"error\",\n      \"max-depth\": [\"error\", 4],\n      \"max-nested-callbacks\": [\"error\", 3],\n      \"max-params\": [\"error\", 3],\n      \"no-console\": \"error\",\n      \"no-magic-numbers\": [\n        \"error\",\n        { ignore: [-1, 0, 0.5, 1, 2, 90, 180, 270, 360] },\n      ],\n      \"no-nested-ternary\": \"error\",\n      \"no-prototype-builtins\": \"off\",\n      \"no-param-reassign\": \"error\",\n      \"no-restricted-imports\": [\n        \"error\",\n        {\n          paths: [\n            {\n              name: \"lodash\",\n              message:\n                \"Be sure to import specific lodash functions, not the entire library!\",\n            },\n          ],\n          patterns: [\n            {\n              group: [\"victory*/src\", \"victory*/src/**\"],\n              message:\n                \"Be sure to import directly from Victory packages, not from /src folders!\",\n            },\n          ],\n        },\n      ],\n      \"no-shadow\": \"error\",\n      \"no-undef\": \"error\",\n      \"no-useless-escape\": \"off\",\n      \"prefer-arrow-callback\": \"error\",\n\n      // react overrides\n      \"react/display-name\": \"off\",\n      \"react/prop-types\": \"off\",\n      \"react/no-multi-comp\": \"error\",\n      ...reactHooks.configs.recommended.rules,\n\n      // @typescript-eslint overrides\n      \"@typescript-eslint/no-explicit-any\": \"off\",\n      \"@typescript-eslint/no-unsafe-declaration-merging\": \"off\",\n    },\n  },\n\n  // Overrides for JS files\n  {\n    files: [\"**/*.js\"],\n    rules: {\n      \"@typescript-eslint/no-require-imports\": \"off\",\n    },\n  },\n\n  // Overrides for Test files\n  {\n    files: [\"**/*.test.*\", \"**/test/**/*\", \"**/jest-native-setup.tsx\"],\n    plugins: { jest: pluginJest },\n    languageOptions: {\n      globals: pluginJest.environments.globals.globals,\n    },\n    rules: {\n      \"react/sort-comp\": \"off\",\n      \"no-magic-numbers\": \"off\",\n      \"max-statements\": \"off\",\n      \"import/no-unresolved\": \"off\",\n      \"no-undef\": \"off\",\n      \"max-nested-callbacks\": \"off\",\n    },\n  },\n\n  // Overrides for Storybook\n  {\n    files: [\"**/stories/**/*.ts\", \"**/stories/**/*.stories.tsx\"],\n    rules: {\n      \"no-magic-numbers\": \"off\",\n    },\n  },\n);\n"
  },
  {
    "path": "package-scripts.js",
    "content": "/**\n * We generally use `nps` for scripts that we:\n * 1. define at the root of the monorepo\n * 2. that are meant to execute _within_ a workspace\n *\n * ... or ...\n *\n * - That could use a little JS magic that we don't want to write a full\n *   node script for 😂\n *\n * For more cases, if you have an actual root task, define it in root\n * `package.json:scripts`.\n */\n\n// For publishing, use the core package's version.\nconst coreVersion = require(\"./packages/victory-core/package.json\").version;\nif (!coreVersion) {\n  throw new Error(\"Unable to read core version\");\n}\nconst coreTag = `v${coreVersion}`;\n\nmodule.exports = {\n  scripts: {\n    // Root tasks.\n    // Try to find an existing tag (from previous attempts, etc.), and if not, create one.\n    \"git:tag\": `git show-ref ${coreTag} || git tag -a ${coreTag} -m \\\"Version ${coreVersion}\\\"`,\n\n    // Build.\n    // - Libraries\n    \"build:lib:esm\":\n      \"cross-env BABEL_ENV=es babel src --out-dir es --config-file ../../.babelrc.build.js --extensions .tsx,.ts,.jsx,.js\",\n    \"build:lib:cjs\":\n      \"cross-env BABEL_ENV=commonjs babel src --out-dir lib --config-file ../../.babelrc.build.js --extensions .tsx,.ts,.jsx,.js\",\n    // - UMD distributions\n    // TODO(2375): Add / verify caching\n    // https://github.com/FormidableLabs/victory/issues/2375\n    \"build:dist:dev\":\n      \"webpack --bail --config ../../config/webpack/webpack.config.dev.js\",\n    \"build:dist:min\":\n      \"webpack --bail --config ../../config/webpack/webpack.config.js\",\n\n    // - TypeScript\n    // TODO(2375): Can we cache / incremental?\n    // https://github.com/FormidableLabs/victory/issues/2375\n    // Check for errors (includes test files):\n    \"types:pkg:check\": \"tsc --pretty --noEmit\",\n    // To create types, we must do the following:\n    // 1. Copy all *.d.ts files to the es folder\n    // 2. Compile all *.ts files to the es folder\n    // 3. Copy all output from the es folder to the lib folder\n    \"types:pkg:create\":\n      \"nps types:pkg:copy types:pkg:compile types:pkg:cjs-copy\",\n    \"types:pkg:copy\": 'cpx \"src/**/*.d.ts\" es',\n    \"types:pkg:compile\":\n      \"tsc --pretty -p ./tsconfig.build.json --emitDeclarationOnly --rootDir src --outDir es || nps types:warning\",\n    \"types:warning\":\n      'echo \"Warning: found TypeScript errors during build. Continuing anyway!\"',\n    \"types:pkg:cjs-copy\": 'cpx \"es/**/*{.d.ts,.d.ts.map}\" lib',\n  },\n};\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"victory-monorepo\",\n  \"version\": \"0.0.0\",\n  \"description\": \"Data viz for React\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/formidablelabs/victory.git\"\n  },\n  \"private\": true,\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/formidablelabs/victory/issues\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"packageManager\": \"pnpm@9.13.0\",\n  \"dependencies\": {\n    \"clsx\": \"^2.1.1\"\n  },\n  \"devDependencies\": {\n    \"@babel/cli\": \"7.23.9\",\n    \"@babel/core\": \"7.23.9\",\n    \"@babel/plugin-transform-export-namespace-from\": \"7.23.4\",\n    \"@babel/plugin-transform-modules-commonjs\": \"7.23.3\",\n    \"@babel/preset-env\": \"7.23.9\",\n    \"@babel/preset-react\": \"7.23.3\",\n    \"@babel/preset-typescript\": \"7.23.3\",\n    \"@changesets/cli\": \"^2.24.1\",\n    \"@chromatic-com/storybook\": \"^3.2.2\",\n    \"@eslint/js\": \"^9.14.0\",\n    \"@storybook/addon-essentials\": \"^8.4.1\",\n    \"@storybook/addon-storysource\": \"^8.4.1\",\n    \"@storybook/addon-webpack5-compiler-swc\": \"1.0.5\",\n    \"@storybook/react\": \"^8.4.1\",\n    \"@storybook/react-webpack5\": \"^8.4.1\",\n    \"@svitejs/changesets-changelog-github-compact\": \"^0.1.1\",\n    \"@testing-library/dom\": \"^10.4.0\",\n    \"@testing-library/jest-dom\": \"^6.6.3\",\n    \"@testing-library/react\": \"^16.0.1\",\n    \"@types/fs-extra\": \"^11.0.3\",\n    \"@types/jest\": \"^29.5.12\",\n    \"@types/lodash\": \"^4.14.149\",\n    \"@types/node\": \"^18.6.1\",\n    \"@types/prop-types\": \"^15.7.5\",\n    \"@types/react\": \"^18.0.15\",\n    \"@types/react-dom\": \"^18.0.6\",\n    \"babel-jest\": \"29.7.0\",\n    \"babel-loader\": \"9.1.3\",\n    \"babel-plugin-module-resolver\": \"5.0.0\",\n    \"babel-preset-react-native\": \"4.0.1\",\n    \"chromatic\": \"^11.16.3\",\n    \"concurrently\": \"^9.0.1\",\n    \"cpx2\": \"^4.2.0\",\n    \"cross-env\": \"^7.0.3\",\n    \"eslint\": \"^9.14.0\",\n    \"eslint-config-prettier\": \"^9.1.0\",\n    \"eslint-plugin-jest\": \"^28.9.0\",\n    \"eslint-plugin-prettier\": \"^5.2.1\",\n    \"eslint-plugin-promise\": \"^7.1.0\",\n    \"eslint-plugin-react\": \"^7.37.2\",\n    \"eslint-plugin-react-hooks\": \"^5.0.0\",\n    \"fork-ts-checker-webpack-plugin\": \"^8.0.0\",\n    \"fs-extra\": \"^10.0.0\",\n    \"glob\": \"8.0.3\",\n    \"globals\": \"^15.12.0\",\n    \"immutable\": \"^3.8.2\",\n    \"jest\": \"^29.7.0\",\n    \"jest-environment-jsdom\": \"^29.7.0\",\n    \"lodash\": \"^4.17.19\",\n    \"lodash-webpack-plugin\": \"^0.11.6\",\n    \"mdast-util-to-string\": \"^1.0.6\",\n    \"metro-react-native-babel-preset\": \"0.77.0\",\n    \"nps\": \"^5.9.0\",\n    \"octokit\": \"^3.1.1\",\n    \"prettier\": \"^3.3.3\",\n    \"prop-types\": \"^15.8.1\",\n    \"react\": \"^18.1.0\",\n    \"react-dom\": \"^18.1.0\",\n    \"react-hot-loader\": \"4.13.0\",\n    \"react-icons\": \"^5.3.0\",\n    \"react-test-renderer\": \"^18.1.0\",\n    \"remark-parse\": \"^7.0.1\",\n    \"remark-stringify\": \"^7.0.3\",\n    \"rimraf\": \"^3.0.2\",\n    \"seedrandom\": \"^3.0.5\",\n    \"storybook\": \"^8.4.1\",\n    \"ts-jest\": \"^29.2.5\",\n    \"ts-loader\": \"^9.3.0\",\n    \"ts-node\": \"^10.9.1\",\n    \"typescript\": \"^5.7.2\",\n    \"typescript-eslint\": \"^8.13.0\",\n    \"unified\": \"^8.3.2\",\n    \"victory-vendor\": \"*\",\n    \"victory-voronoi\": \"*\",\n    \"webpack\": \"^5.74.0\",\n    \"webpack-cli\": \"^4.9.2\",\n    \"webpack-dev-server\": \"^4.9.0\",\n    \"wireit\": \"^0.7.1\"\n  },\n  \"pnpm\": {\n    \"overrides\": {\n      \"@types/eslint\": \"8.4.3\"\n    },\n    \"patchedDependencies\": {\n      \"@changesets/cli@2.24.1\": \"patches/@changesets__cli@2.24.1.patch\"\n    }\n  },\n  \"browserslist\": [\n    \"> 0.5%\",\n    \"last 2 versions\",\n    \"Firefox ESR\",\n    \"not dead\"\n  ],\n  \"scripts\": {\n    \"version\": \"pnpm changeset version && pnpm install --no-frozen-lockfile\",\n    \"publish\": \"nps git:tag && pnpm changeset publish --no-git-tag\",\n    \"changeset\": \"changeset\",\n    \"start\": \"webpack serve --config ./config/webpack/demo/webpack.config.dev.js --static demo/ts --entry ./demo/ts/app\",\n    \"start:docs\": \"wireit\",\n    \"check\": \"wireit\",\n    \"check:debug\": \"cross-env WIREIT_PARALLEL=1 pnpm check\",\n    \"clean:build\": \"rimraf coverage \\\"packages/*/{dist,es,lib}\\\"\",\n    \"clean:cache\": \"wireit\",\n    \"clean:cache:lint\": \"rimraf .eslintcache \\\"{demo,packages}/*/.eslintcache\\\"\",\n    \"clean:cache:wireit\": \"rimraf .wireit \\\"{demo,packages}/*/.wireit\\\"\",\n    \"clean:cache:modules\": \"rimraf node_modules/.cache \\\"{demo,packages}/*/node_modules/.cache\\\"\",\n    \"build\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:typescript\": \"wireit\",\n    \"build:docs\": \"wireit\",\n    \"format\": \"wireit\",\n    \"format:fix\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"lint:root\": \"wireit\",\n    \"lint:root:fix\": \"wireit\",\n    \"lint:pkgs\": \"wireit\",\n    \"lint:pkgs:fix\": \"wireit\",\n    \"jest\": \"wireit\",\n    \"jest:root\": \"wireit\",\n    \"jest:pkgs\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"build-storybook\": \"storybook build\",\n    \"storybook:typecheck\": \"tsc -p tsconfig.storybook.json\",\n    \"storybook:build\": \"wireit\",\n    \"storybook:dev\": \"concurrently --raw \\\"pnpm:build:lib:esm --watch\\\" \\\"pnpx storybook dev -p 6006\\\"\",\n    \"storybook:start\": \"storybook dev -p 6006 --no-open\",\n    \"sync\": \"wireit\",\n    \"sync:pkgs\": \"node ./scripts/sync-pkgs-wireit.js\",\n    \"sync:tsconfig\": \"pnpm -r --filter !victory-core  --filter !victory-vendor --filter !victory-native exec -- cpx ../victory-core/tsconfig.* .\",\n    \"release-notes\": \"ts-node ./scripts/release.ts\"\n  },\n  \"wireit\": {\n    \"clean:cache\": {\n      \"dependencies\": [\n        \"clean:cache:wireit\",\n        \"clean:cache:lint\",\n        \"clean:cache:modules\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"format\",\n        \"lint\",\n        \"jest\",\n        \"types:check\"\n      ]\n    },\n    \"build\": {\n      \"dependencies\": [\n        \"./packages/victory-native:build\",\n        \"./packages/victory-vendor:build\",\n        \"./packages/victory:build\",\n        \"./packages/victory-area:build\",\n        \"./packages/victory-axis:build\",\n        \"./packages/victory-bar:build\",\n        \"./packages/victory-box-plot:build\",\n        \"./packages/victory-brush-container:build\",\n        \"./packages/victory-brush-line:build\",\n        \"./packages/victory-candlestick:build\",\n        \"./packages/victory-canvas:build\",\n        \"./packages/victory-chart:build\",\n        \"./packages/victory-core:build\",\n        \"./packages/victory-create-container:build\",\n        \"./packages/victory-cursor-container:build\",\n        \"./packages/victory-errorbar:build\",\n        \"./packages/victory-group:build\",\n        \"./packages/victory-histogram:build\",\n        \"./packages/victory-legend:build\",\n        \"./packages/victory-line:build\",\n        \"./packages/victory-pie:build\",\n        \"./packages/victory-polar-axis:build\",\n        \"./packages/victory-scatter:build\",\n        \"./packages/victory-selection-container:build\",\n        \"./packages/victory-shared-events:build\",\n        \"./packages/victory-stack:build\",\n        \"./packages/victory-tooltip:build\",\n        \"./packages/victory-voronoi:build\",\n        \"./packages/victory-voronoi-container:build\",\n        \"./packages/victory-zoom-container:build\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"dependencies\": [\n        \"./packages/victory-native:build:lib:esm\",\n        \"./packages/victory-vendor:build:lib:esm\",\n        \"./packages/victory:build:lib:esm\",\n        \"./packages/victory-area:build:lib:esm\",\n        \"./packages/victory-axis:build:lib:esm\",\n        \"./packages/victory-bar:build:lib:esm\",\n        \"./packages/victory-box-plot:build:lib:esm\",\n        \"./packages/victory-brush-container:build:lib:esm\",\n        \"./packages/victory-brush-line:build:lib:esm\",\n        \"./packages/victory-candlestick:build:lib:esm\",\n        \"./packages/victory-canvas:build:lib:esm\",\n        \"./packages/victory-chart:build:lib:esm\",\n        \"./packages/victory-core:build:lib:esm\",\n        \"./packages/victory-create-container:build:lib:esm\",\n        \"./packages/victory-cursor-container:build:lib:esm\",\n        \"./packages/victory-errorbar:build:lib:esm\",\n        \"./packages/victory-group:build:lib:esm\",\n        \"./packages/victory-histogram:build:lib:esm\",\n        \"./packages/victory-legend:build:lib:esm\",\n        \"./packages/victory-line:build:lib:esm\",\n        \"./packages/victory-pie:build:lib:esm\",\n        \"./packages/victory-polar-axis:build:lib:esm\",\n        \"./packages/victory-scatter:build:lib:esm\",\n        \"./packages/victory-selection-container:build:lib:esm\",\n        \"./packages/victory-shared-events:build:lib:esm\",\n        \"./packages/victory-stack:build:lib:esm\",\n        \"./packages/victory-tooltip:build:lib:esm\",\n        \"./packages/victory-voronoi:build:lib:esm\",\n        \"./packages/victory-voronoi-container:build:lib:esm\",\n        \"./packages/victory-zoom-container:build:lib:esm\"\n      ]\n    },\n    \"build:typescript\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"types:create\"\n      ]\n    },\n    \"build:docs\": {\n      \"command\": \"pnpm run --filter victory-docs build\",\n      \"dependencies\": [\n        \"build:lib:esm\"\n      ]\n    },\n    \"format\": {\n      \"command\": \"prettier --config .prettierrc.json --ignore-path .prettierignore --check \\\"./**/*.{js,jsx,json,ts,tsx}\\\"\"\n    },\n    \"format:fix\": {\n      \"command\": \"prettier --config .prettierrc.json --ignore-path .prettierignore --write \\\"./**/*.{js,jsx,json,ts,tsx}\\\"\"\n    },\n    \"lint\": {\n      \"dependencies\": [\n        \"lint:root\",\n        \"lint:pkgs\"\n      ]\n    },\n    \"lint:fix\": {\n      \"dependencies\": [\n        \"lint:root:fix\",\n        \"lint:pkgs:fix\"\n      ]\n    },\n    \"lint:root\": {\n      \"command\": \"eslint --color *.js scripts config stories test website\",\n      \"files\": [\n        \"*.js\",\n        \"scripts\",\n        \"config\",\n        \"stories\",\n        \"test\",\n        \"website\",\n        \"!**/node_modules/**\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:root:fix\": {\n      \"command\": \"eslint --color --fix *.js scripts config stories test website\",\n      \"files\": [\n        \"*.js\",\n        \"scripts\",\n        \"config\",\n        \"stories\",\n        \"test\",\n        \"website\",\n        \"!**/node_modules/**\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:pkgs\": {\n      \"command\": \"eslint --color packages\",\n      \"dependencies\": [\n        \"build\"\n      ]\n    },\n    \"lint:pkgs:fix\": {\n      \"command\": \"eslint --color --fix packages\",\n      \"dependencies\": [\n        \"build\"\n      ]\n    },\n    \"jest\": {\n      \"dependencies\": [\n        \"jest:pkgs\"\n      ]\n    },\n    \"jest:pkgs\": {\n      \"dependencies\": [\n        \"./packages/victory-native:jest\",\n        \"./packages/victory-vendor:jest\",\n        \"./packages/victory:jest\",\n        \"./packages/victory-area:jest\",\n        \"./packages/victory-axis:jest\",\n        \"./packages/victory-bar:jest\",\n        \"./packages/victory-box-plot:jest\",\n        \"./packages/victory-brush-container:jest\",\n        \"./packages/victory-brush-line:jest\",\n        \"./packages/victory-candlestick:jest\",\n        \"./packages/victory-canvas:jest\",\n        \"./packages/victory-chart:jest\",\n        \"./packages/victory-core:jest\",\n        \"./packages/victory-create-container:jest\",\n        \"./packages/victory-cursor-container:jest\",\n        \"./packages/victory-errorbar:jest\",\n        \"./packages/victory-group:jest\",\n        \"./packages/victory-histogram:jest\",\n        \"./packages/victory-legend:jest\",\n        \"./packages/victory-line:jest\",\n        \"./packages/victory-pie:jest\",\n        \"./packages/victory-polar-axis:jest\",\n        \"./packages/victory-scatter:jest\",\n        \"./packages/victory-selection-container:jest\",\n        \"./packages/victory-shared-events:jest\",\n        \"./packages/victory-stack:jest\",\n        \"./packages/victory-tooltip:jest\",\n        \"./packages/victory-voronoi:jest\",\n        \"./packages/victory-voronoi-container:jest\",\n        \"./packages/victory-zoom-container:jest\"\n      ]\n    },\n    \"storybook:build\": {\n      \"command\": \"storybook build\",\n      \"files\": [\n        \".storybook\",\n        \"stories\",\n        \"packages/victory*/src/**/*.stories.*\"\n      ],\n      \"output\": [\n        \"storybook-static\"\n      ],\n      \"dependencies\": [\n        \"build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"sync\": {\n      \"dependencies\": [\n        \"sync:pkgs\",\n        \"sync:tsconfig\"\n      ]\n    },\n    \"types:check\": {\n      \"dependencies\": [\n        \"./packages/victory-native:types:check\",\n        \"./packages/victory-vendor:types:check\",\n        \"./packages/victory:types:check\",\n        \"./packages/victory-area:types:check\",\n        \"./packages/victory-axis:types:check\",\n        \"./packages/victory-bar:types:check\",\n        \"./packages/victory-box-plot:types:check\",\n        \"./packages/victory-brush-container:types:check\",\n        \"./packages/victory-brush-line:types:check\",\n        \"./packages/victory-candlestick:types:check\",\n        \"./packages/victory-canvas:types:check\",\n        \"./packages/victory-chart:types:check\",\n        \"./packages/victory-core:types:check\",\n        \"./packages/victory-create-container:types:check\",\n        \"./packages/victory-cursor-container:types:check\",\n        \"./packages/victory-errorbar:types:check\",\n        \"./packages/victory-group:types:check\",\n        \"./packages/victory-histogram:types:check\",\n        \"./packages/victory-legend:types:check\",\n        \"./packages/victory-line:types:check\",\n        \"./packages/victory-pie:types:check\",\n        \"./packages/victory-polar-axis:types:check\",\n        \"./packages/victory-scatter:types:check\",\n        \"./packages/victory-selection-container:types:check\",\n        \"./packages/victory-shared-events:types:check\",\n        \"./packages/victory-stack:types:check\",\n        \"./packages/victory-tooltip:types:check\",\n        \"./packages/victory-voronoi:types:check\",\n        \"./packages/victory-voronoi-container:types:check\",\n        \"./packages/victory-zoom-container:types:check\"\n      ]\n    },\n    \"types:create\": {\n      \"dependencies\": [\n        \"./packages/victory-native:types:create\",\n        \"./packages/victory-vendor:types:create\",\n        \"./packages/victory:types:create\",\n        \"./packages/victory-area:types:create\",\n        \"./packages/victory-axis:types:create\",\n        \"./packages/victory-bar:types:create\",\n        \"./packages/victory-box-plot:types:create\",\n        \"./packages/victory-brush-container:types:create\",\n        \"./packages/victory-brush-line:types:create\",\n        \"./packages/victory-candlestick:types:create\",\n        \"./packages/victory-canvas:types:create\",\n        \"./packages/victory-chart:types:create\",\n        \"./packages/victory-core:types:create\",\n        \"./packages/victory-create-container:types:create\",\n        \"./packages/victory-cursor-container:types:create\",\n        \"./packages/victory-errorbar:types:create\",\n        \"./packages/victory-group:types:create\",\n        \"./packages/victory-histogram:types:create\",\n        \"./packages/victory-legend:types:create\",\n        \"./packages/victory-line:types:create\",\n        \"./packages/victory-pie:types:create\",\n        \"./packages/victory-polar-axis:types:create\",\n        \"./packages/victory-scatter:types:create\",\n        \"./packages/victory-selection-container:types:create\",\n        \"./packages/victory-shared-events:types:create\",\n        \"./packages/victory-stack:types:create\",\n        \"./packages/victory-tooltip:types:create\",\n        \"./packages/victory-voronoi:types:create\",\n        \"./packages/victory-voronoi-container:types:create\",\n        \"./packages/victory-zoom-container:types:create\"\n      ]\n    },\n    \"start:docs\": {\n      \"command\": \"pnpm run --filter victory-docs start\",\n      \"dependencies\": [\n        \"build:lib:esm\"\n      ]\n    },\n    \"engines\": {\n      \"node\": \">=18.0.0\"\n    }\n  }\n}\n"
  },
  {
    "path": "packages/victory/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory/CHANGELOG.md",
    "content": "# victory\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n## 37.3.2\n\n## 37.3.1\n\n## 37.3.0\n\n## 37.2.0\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Refactor containers and portal to function components ([#2799](https://github.com/FormidableLabs/victory/pull/2799))\n\n* Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n## 37.0.1\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n## 36.9.1\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n### Patch Changes\n\n- Update victory package.json source to the correct index file ([#2765](https://github.com/FormidableLabs/victory/pull/2765))\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n## 36.8.4\n\n## 36.8.3\n\n## 36.8.2\n\n## 36.8.1\n\n## 36.8.0\n\n## 36.7.0\n\n### Patch Changes\n\n- Fix Date equality in axis ([#2642](https://github.com/FormidableLabs/victory/pull/2642))\n\n## 36.6.12\n\n### Patch Changes\n\n- Add aria-hidden flag to svg for textsize util to fix accessibility issue ([#2661](https://github.com/FormidableLabs/victory/pull/2661))\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n* Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- Updated dependencies [[`c5b4f660c`](https://github.com/FormidableLabs/victory/commit/c5b4f660cb91d8d1979d216b846a44f0c5030ec1), [`1da86d186`](https://github.com/FormidableLabs/victory/commit/1da86d18615bf75db35cfc55cc8e3d5c0b5772b6)]:\n  - victory-zoom-container@36.6.8\n  - victory-stack@36.6.8\n  - victory-area@36.6.8\n  - victory-axis@36.6.8\n  - victory-bar@36.6.8\n  - victory-box-plot@36.6.8\n  - victory-brush-container@36.6.8\n  - victory-brush-line@36.6.8\n  - victory-candlestick@36.6.8\n  - victory-canvas@36.6.8\n  - victory-chart@36.6.8\n  - victory-core@36.6.8\n  - victory-create-container@36.6.8\n  - victory-cursor-container@36.6.8\n  - victory-errorbar@36.6.8\n  - victory-group@36.6.8\n  - victory-histogram@36.6.8\n  - victory-legend@36.6.8\n  - victory-line@36.6.8\n  - victory-pie@36.6.8\n  - victory-polar-axis@36.6.8\n  - victory-scatter@36.6.8\n  - victory-selection-container@36.6.8\n  - victory-shared-events@36.6.8\n  - victory-tooltip@36.6.8\n  - victory-voronoi@36.6.8\n  - victory-voronoi-container@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies [[`3f476632f`](https://github.com/FormidableLabs/victory/commit/3f476632fcd41c31cb69fcfae74d1bbaaa78103d)]:\n  - victory-line@36.6.7\n  - victory-area@36.6.7\n  - victory-axis@36.6.7\n  - victory-bar@36.6.7\n  - victory-box-plot@36.6.7\n  - victory-brush-container@36.6.7\n  - victory-brush-line@36.6.7\n  - victory-candlestick@36.6.7\n  - victory-canvas@36.6.7\n  - victory-chart@36.6.7\n  - victory-core@36.6.7\n  - victory-create-container@36.6.7\n  - victory-cursor-container@36.6.7\n  - victory-errorbar@36.6.7\n  - victory-group@36.6.7\n  - victory-histogram@36.6.7\n  - victory-legend@36.6.7\n  - victory-pie@36.6.7\n  - victory-polar-axis@36.6.7\n  - victory-scatter@36.6.7\n  - victory-selection-container@36.6.7\n  - victory-shared-events@36.6.7\n  - victory-stack@36.6.7\n  - victory-tooltip@36.6.7\n  - victory-voronoi@36.6.7\n  - victory-voronoi-container@36.6.7\n  - victory-zoom-container@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Updated dependencies [[`6c6764f73`](https://github.com/FormidableLabs/victory/commit/6c6764f734b9655170c75798b7fe1c6d9e63f2a5)]:\n  - victory-brush-container@36.6.6\n  - victory-cursor-container@36.6.6\n  - victory-selection-container@36.6.6\n  - victory-voronoi-container@36.6.6\n  - victory-zoom-container@36.6.6\n  - victory-area@36.6.6\n  - victory-axis@36.6.6\n  - victory-bar@36.6.6\n  - victory-box-plot@36.6.6\n  - victory-brush-line@36.6.6\n  - victory-candlestick@36.6.6\n  - victory-canvas@36.6.6\n  - victory-chart@36.6.6\n  - victory-core@36.6.6\n  - victory-create-container@36.6.6\n  - victory-errorbar@36.6.6\n  - victory-group@36.6.6\n  - victory-histogram@36.6.6\n  - victory-legend@36.6.6\n  - victory-line@36.6.6\n  - victory-pie@36.6.6\n  - victory-polar-axis@36.6.6\n  - victory-scatter@36.6.6\n  - victory-shared-events@36.6.6\n  - victory-stack@36.6.6\n  - victory-tooltip@36.6.6\n  - victory-voronoi@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416), [`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-zoom-container@36.6.5\n  - victory-core@36.6.5\n  - victory-area@36.6.5\n  - victory-axis@36.6.5\n  - victory-bar@36.6.5\n  - victory-box-plot@36.6.5\n  - victory-brush-container@36.6.5\n  - victory-brush-line@36.6.5\n  - victory-candlestick@36.6.5\n  - victory-canvas@36.6.5\n  - victory-chart@36.6.5\n  - victory-create-container@36.6.5\n  - victory-cursor-container@36.6.5\n  - victory-errorbar@36.6.5\n  - victory-group@36.6.5\n  - victory-histogram@36.6.5\n  - victory-legend@36.6.5\n  - victory-line@36.6.5\n  - victory-pie@36.6.5\n  - victory-polar-axis@36.6.5\n  - victory-scatter@36.6.5\n  - victory-selection-container@36.6.5\n  - victory-shared-events@36.6.5\n  - victory-stack@36.6.5\n  - victory-tooltip@36.6.5\n  - victory-voronoi@36.6.5\n  - victory-voronoi-container@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Added explicit `any` type defs (fixes [#2358](https://github.com/FormidableLabs/victory/issues/2358)) ([`57ed0fe30`](https://github.com/FormidableLabs/victory/commit/57ed0fe304dbc8753da1126a02d44de8004e96aa))\n\n* Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n* Updated dependencies [[`57ed0fe30`](https://github.com/FormidableLabs/victory/commit/57ed0fe304dbc8753da1126a02d44de8004e96aa), [`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-canvas@36.6.4\n  - victory-create-container@36.6.4\n  - victory-selection-container@36.6.4\n  - victory-voronoi-container@36.6.4\n  - victory-zoom-container@36.6.4\n  - victory-core@36.6.4\n  - victory-area@36.6.4\n  - victory-axis@36.6.4\n  - victory-bar@36.6.4\n  - victory-box-plot@36.6.4\n  - victory-brush-container@36.6.4\n  - victory-brush-line@36.6.4\n  - victory-candlestick@36.6.4\n  - victory-chart@36.6.4\n  - victory-cursor-container@36.6.4\n  - victory-errorbar@36.6.4\n  - victory-group@36.6.4\n  - victory-histogram@36.6.4\n  - victory-legend@36.6.4\n  - victory-line@36.6.4\n  - victory-pie@36.6.4\n  - victory-polar-axis@36.6.4\n  - victory-scatter@36.6.4\n  - victory-shared-events@36.6.4\n  - victory-stack@36.6.4\n  - victory-tooltip@36.6.4\n  - victory-voronoi@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-area@36.6.3\n  - victory-axis@36.6.3\n  - victory-bar@36.6.3\n  - victory-box-plot@36.6.3\n  - victory-brush-container@36.6.3\n  - victory-brush-line@36.6.3\n  - victory-candlestick@36.6.3\n  - victory-canvas@36.6.3\n  - victory-chart@36.6.3\n  - victory-core@36.6.3\n  - victory-create-container@36.6.3\n  - victory-cursor-container@36.6.3\n  - victory-errorbar@36.6.3\n  - victory-group@36.6.3\n  - victory-histogram@36.6.3\n  - victory-legend@36.6.3\n  - victory-line@36.6.3\n  - victory-pie@36.6.3\n  - victory-polar-axis@36.6.3\n  - victory-scatter@36.6.3\n  - victory-selection-container@36.6.3\n  - victory-shared-events@36.6.3\n  - victory-stack@36.6.3\n  - victory-tooltip@36.6.3\n  - victory-voronoi@36.6.3\n  - victory-voronoi-container@36.6.3\n  - victory-zoom-container@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies [[`877c16923`](https://github.com/FormidableLabs/victory/commit/877c169230c24ab02f570a21dca10a2dce0dcf4e)]:\n  - victory-cursor-container@36.6.2\n  - victory-area@36.6.2\n  - victory-axis@36.6.2\n  - victory-bar@36.6.2\n  - victory-box-plot@36.6.2\n  - victory-brush-container@36.6.2\n  - victory-brush-line@36.6.2\n  - victory-candlestick@36.6.2\n  - victory-canvas@36.6.2\n  - victory-chart@36.6.2\n  - victory-core@36.6.2\n  - victory-create-container@36.6.2\n  - victory-errorbar@36.6.2\n  - victory-group@36.6.2\n  - victory-histogram@36.6.2\n  - victory-legend@36.6.2\n  - victory-line@36.6.2\n  - victory-pie@36.6.2\n  - victory-polar-axis@36.6.2\n  - victory-scatter@36.6.2\n  - victory-selection-container@36.6.2\n  - victory-shared-events@36.6.2\n  - victory-stack@36.6.2\n  - victory-tooltip@36.6.2\n  - victory-voronoi@36.6.2\n  - victory-voronoi-container@36.6.2\n  - victory-zoom-container@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- Updated dependencies [[`f7d50fa38`](https://github.com/FormidableLabs/victory/commit/f7d50fa381998c068a8b91af9818a6bc726b0dcd), [`f7d50fa38`](https://github.com/FormidableLabs/victory/commit/f7d50fa381998c068a8b91af9818a6bc726b0dcd), [`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-group@36.6.1\n  - victory-stack@36.6.1\n  - victory-core@36.6.1\n  - victory-axis@36.6.1\n  - victory-errorbar@36.6.1\n  - victory-scatter@36.6.1\n  - victory-cursor-container@36.6.1\n  - victory-area@36.6.1\n  - victory-bar@36.6.1\n  - victory-box-plot@36.6.1\n  - victory-brush-container@36.6.1\n  - victory-brush-line@36.6.1\n  - victory-candlestick@36.6.1\n  - victory-canvas@36.6.1\n  - victory-chart@36.6.1\n  - victory-create-container@36.6.1\n  - victory-histogram@36.6.1\n  - victory-legend@36.6.1\n  - victory-line@36.6.1\n  - victory-pie@36.6.1\n  - victory-polar-axis@36.6.1\n  - victory-selection-container@36.6.1\n  - victory-shared-events@36.6.1\n  - victory-tooltip@36.6.1\n  - victory-voronoi@36.6.1\n  - victory-voronoi-container@36.6.1\n  - victory-zoom-container@36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Updated dependencies [[`0c827edb4`](https://github.com/FormidableLabs/victory/commit/0c827edb4daf6fa61ee2a561df27ddf89ccc649f), [`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`f7bf134e5`](https://github.com/FormidableLabs/victory/commit/f7bf134e58bc1660c28f83f0eede3b19048d2656), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-box-plot@36.6.0\n  - victory-core@36.6.0\n  - victory-errorbar@36.6.0\n  - victory-brush-container@36.6.0\n  - victory-brush-line@36.6.0\n  - victory-area@36.6.0\n  - victory-axis@36.6.0\n  - victory-bar@36.6.0\n  - victory-candlestick@36.6.0\n  - victory-canvas@36.6.0\n  - victory-create-container@36.6.0\n  - victory-cursor-container@36.6.0\n  - victory-legend@36.6.0\n  - victory-line@36.6.0\n  - victory-pie@36.6.0\n  - victory-polar-axis@36.6.0\n  - victory-scatter@36.6.0\n  - victory-selection-container@36.6.0\n  - victory-shared-events@36.6.0\n  - victory-stack@36.6.0\n  - victory-tooltip@36.6.0\n  - victory-voronoi@36.6.0\n  - victory-voronoi-container@36.6.0\n  - victory-zoom-container@36.6.0\n  - victory-chart@36.6.0\n  - victory-group@36.6.0\n  - victory-histogram@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory/README.md",
    "content": "## [Victory Documentation](https://commerce.nearform.com/open-source/victory)\n\n## Getting started\n\n1. Add Victory to your project:\n\n```sh\n$ npm install victory --save\n```\n\n2. Add your first Victory component:\n\n```js\nimport React, { Component } from \"react\";\nimport { render } from \"react-dom\";\nimport { VictoryPie } from \"victory\";\n\nclass PieChart extends Component {\n  render() {\n    return <VictoryPie />;\n  }\n}\n\nrender(<PieChart />, document.getElementById(\"app\"));\n```\n\n3. `VictoryPie` component will be rendered, and you should see:\n\n<p align=\"center\">\n  <img align=\"center\" width=\"471\" alt=\"pie\" src=\"https://cloud.githubusercontent.com/assets/3719995/20915779/b51e3652-bb3c-11e6-8243-6e7521a59115.png\">\n</p>\n\nFor detailed documentation and examples please see [Victory Documentation](https://commerce.nearform.com/open-source/victory)\n\n## Requirements\n\nProjects using Victory should also depend on [React][] and [prop-types][].\n\n## Victory Native\n\nWant to use `Victory` with React Native? Check out [victory-native-xl](https://github.com/FormidableLabs/victory-native-xl)\n\nIf you would like to use this version of `Victory` with React Native, you can install the legacy version using the `legacy` npm tag. See the [available versions in npm](https://www.npmjs.com/package/victory-native?activeTab=versions).\n\n## [Contributing](CONTRIBUTING.md)\n\n[react]: https://facebook.github.io/react/\n[prop-types]: https://github.com/reactjs/prop-types\n"
  },
  {
    "path": "packages/victory/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory/package.json",
    "content": "{\n  \"name\": \"victory\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Data viz for React\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"source\": \"src/index.ts\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"victory-area\": \"37.3.6\",\n    \"victory-axis\": \"37.3.6\",\n    \"victory-bar\": \"37.3.6\",\n    \"victory-box-plot\": \"37.3.6\",\n    \"victory-brush-container\": \"37.3.6\",\n    \"victory-brush-line\": \"37.3.6\",\n    \"victory-candlestick\": \"37.3.6\",\n    \"victory-canvas\": \"37.3.6\",\n    \"victory-chart\": \"37.3.6\",\n    \"victory-core\": \"37.3.6\",\n    \"victory-create-container\": \"37.3.6\",\n    \"victory-cursor-container\": \"37.3.6\",\n    \"victory-errorbar\": \"37.3.6\",\n    \"victory-group\": \"37.3.6\",\n    \"victory-histogram\": \"37.3.6\",\n    \"victory-legend\": \"37.3.6\",\n    \"victory-line\": \"37.3.6\",\n    \"victory-pie\": \"37.3.6\",\n    \"victory-polar-axis\": \"37.3.6\",\n    \"victory-scatter\": \"37.3.6\",\n    \"victory-selection-container\": \"37.3.6\",\n    \"victory-shared-events\": \"37.3.6\",\n    \"victory-stack\": \"37.3.6\",\n    \"victory-tooltip\": \"37.3.6\",\n    \"victory-voronoi\": \"37.3.6\",\n    \"victory-voronoi-container\": \"37.3.6\",\n    \"victory-zoom-container\": \"37.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-area:build:lib:esm\",\n        \"../victory-axis:build:lib:esm\",\n        \"../victory-bar:build:lib:esm\",\n        \"../victory-box-plot:build:lib:esm\",\n        \"../victory-brush-container:build:lib:esm\",\n        \"../victory-brush-line:build:lib:esm\",\n        \"../victory-candlestick:build:lib:esm\",\n        \"../victory-canvas:build:lib:esm\",\n        \"../victory-chart:build:lib:esm\",\n        \"../victory-core:build:lib:esm\",\n        \"../victory-create-container:build:lib:esm\",\n        \"../victory-cursor-container:build:lib:esm\",\n        \"../victory-errorbar:build:lib:esm\",\n        \"../victory-group:build:lib:esm\",\n        \"../victory-histogram:build:lib:esm\",\n        \"../victory-legend:build:lib:esm\",\n        \"../victory-line:build:lib:esm\",\n        \"../victory-pie:build:lib:esm\",\n        \"../victory-polar-axis:build:lib:esm\",\n        \"../victory-scatter:build:lib:esm\",\n        \"../victory-selection-container:build:lib:esm\",\n        \"../victory-shared-events:build:lib:esm\",\n        \"../victory-stack:build:lib:esm\",\n        \"../victory-tooltip:build:lib:esm\",\n        \"../victory-voronoi:build:lib:esm\",\n        \"../victory-voronoi-container:build:lib:esm\",\n        \"../victory-zoom-container:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-area:build:lib:cjs\",\n        \"../victory-axis:build:lib:cjs\",\n        \"../victory-bar:build:lib:cjs\",\n        \"../victory-box-plot:build:lib:cjs\",\n        \"../victory-brush-container:build:lib:cjs\",\n        \"../victory-brush-line:build:lib:cjs\",\n        \"../victory-candlestick:build:lib:cjs\",\n        \"../victory-canvas:build:lib:cjs\",\n        \"../victory-chart:build:lib:cjs\",\n        \"../victory-core:build:lib:cjs\",\n        \"../victory-create-container:build:lib:cjs\",\n        \"../victory-cursor-container:build:lib:cjs\",\n        \"../victory-errorbar:build:lib:cjs\",\n        \"../victory-group:build:lib:cjs\",\n        \"../victory-histogram:build:lib:cjs\",\n        \"../victory-legend:build:lib:cjs\",\n        \"../victory-line:build:lib:cjs\",\n        \"../victory-pie:build:lib:cjs\",\n        \"../victory-polar-axis:build:lib:cjs\",\n        \"../victory-scatter:build:lib:cjs\",\n        \"../victory-selection-container:build:lib:cjs\",\n        \"../victory-shared-events:build:lib:cjs\",\n        \"../victory-stack:build:lib:cjs\",\n        \"../victory-tooltip:build:lib:cjs\",\n        \"../victory-voronoi:build:lib:cjs\",\n        \"../victory-voronoi-container:build:lib:cjs\",\n        \"../victory-zoom-container:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-area:build:lib:esm\",\n        \"../victory-axis:build:lib:esm\",\n        \"../victory-bar:build:lib:esm\",\n        \"../victory-box-plot:build:lib:esm\",\n        \"../victory-brush-container:build:lib:esm\",\n        \"../victory-brush-line:build:lib:esm\",\n        \"../victory-candlestick:build:lib:esm\",\n        \"../victory-canvas:build:lib:esm\",\n        \"../victory-chart:build:lib:esm\",\n        \"../victory-core:build:lib:esm\",\n        \"../victory-create-container:build:lib:esm\",\n        \"../victory-cursor-container:build:lib:esm\",\n        \"../victory-errorbar:build:lib:esm\",\n        \"../victory-group:build:lib:esm\",\n        \"../victory-histogram:build:lib:esm\",\n        \"../victory-legend:build:lib:esm\",\n        \"../victory-line:build:lib:esm\",\n        \"../victory-pie:build:lib:esm\",\n        \"../victory-polar-axis:build:lib:esm\",\n        \"../victory-scatter:build:lib:esm\",\n        \"../victory-selection-container:build:lib:esm\",\n        \"../victory-shared-events:build:lib:esm\",\n        \"../victory-stack:build:lib:esm\",\n        \"../victory-tooltip:build:lib:esm\",\n        \"../victory-voronoi:build:lib:esm\",\n        \"../victory-voronoi-container:build:lib:esm\",\n        \"../victory-zoom-container:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-area:build:lib:esm\",\n        \"../victory-axis:build:lib:esm\",\n        \"../victory-bar:build:lib:esm\",\n        \"../victory-box-plot:build:lib:esm\",\n        \"../victory-brush-container:build:lib:esm\",\n        \"../victory-brush-line:build:lib:esm\",\n        \"../victory-candlestick:build:lib:esm\",\n        \"../victory-canvas:build:lib:esm\",\n        \"../victory-chart:build:lib:esm\",\n        \"../victory-core:build:lib:esm\",\n        \"../victory-create-container:build:lib:esm\",\n        \"../victory-cursor-container:build:lib:esm\",\n        \"../victory-errorbar:build:lib:esm\",\n        \"../victory-group:build:lib:esm\",\n        \"../victory-histogram:build:lib:esm\",\n        \"../victory-legend:build:lib:esm\",\n        \"../victory-line:build:lib:esm\",\n        \"../victory-pie:build:lib:esm\",\n        \"../victory-polar-axis:build:lib:esm\",\n        \"../victory-scatter:build:lib:esm\",\n        \"../victory-selection-container:build:lib:esm\",\n        \"../victory-shared-events:build:lib:esm\",\n        \"../victory-stack:build:lib:esm\",\n        \"../victory-tooltip:build:lib:esm\",\n        \"../victory-voronoi:build:lib:esm\",\n        \"../victory-voronoi-container:build:lib:esm\",\n        \"../victory-zoom-container:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-area:types:create\",\n        \"../victory-axis:types:create\",\n        \"../victory-bar:types:create\",\n        \"../victory-box-plot:types:create\",\n        \"../victory-brush-container:types:create\",\n        \"../victory-brush-line:types:create\",\n        \"../victory-candlestick:types:create\",\n        \"../victory-canvas:types:create\",\n        \"../victory-chart:types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-create-container:types:create\",\n        \"../victory-cursor-container:types:create\",\n        \"../victory-errorbar:types:create\",\n        \"../victory-group:types:create\",\n        \"../victory-histogram:types:create\",\n        \"../victory-legend:types:create\",\n        \"../victory-line:types:create\",\n        \"../victory-pie:types:create\",\n        \"../victory-polar-axis:types:create\",\n        \"../victory-scatter:types:create\",\n        \"../victory-selection-container:types:create\",\n        \"../victory-shared-events:types:create\",\n        \"../victory-stack:types:create\",\n        \"../victory-tooltip:types:create\",\n        \"../victory-voronoi:types:create\",\n        \"../victory-voronoi-container:types:create\",\n        \"../victory-zoom-container:types:create\",\n        \"../victory-vendor:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-area:types:create\",\n        \"../victory-axis:types:create\",\n        \"../victory-bar:types:create\",\n        \"../victory-box-plot:types:create\",\n        \"../victory-brush-container:types:create\",\n        \"../victory-brush-line:types:create\",\n        \"../victory-candlestick:types:create\",\n        \"../victory-canvas:types:create\",\n        \"../victory-chart:types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-create-container:types:create\",\n        \"../victory-cursor-container:types:create\",\n        \"../victory-errorbar:types:create\",\n        \"../victory-group:types:create\",\n        \"../victory-histogram:types:create\",\n        \"../victory-legend:types:create\",\n        \"../victory-line:types:create\",\n        \"../victory-pie:types:create\",\n        \"../victory-polar-axis:types:create\",\n        \"../victory-scatter:types:create\",\n        \"../victory-selection-container:types:create\",\n        \"../victory-shared-events:types:create\",\n        \"../victory-stack:types:create\",\n        \"../victory-tooltip:types:create\",\n        \"../victory-voronoi:types:create\",\n        \"../victory-voronoi-container:types:create\",\n        \"../victory-zoom-container:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-area:types:create\",\n        \"../victory-axis:types:create\",\n        \"../victory-bar:types:create\",\n        \"../victory-box-plot:types:create\",\n        \"../victory-brush-container:types:create\",\n        \"../victory-brush-line:types:create\",\n        \"../victory-candlestick:types:create\",\n        \"../victory-canvas:types:create\",\n        \"../victory-chart:types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-create-container:types:create\",\n        \"../victory-cursor-container:types:create\",\n        \"../victory-errorbar:types:create\",\n        \"../victory-group:types:create\",\n        \"../victory-histogram:types:create\",\n        \"../victory-legend:types:create\",\n        \"../victory-line:types:create\",\n        \"../victory-pie:types:create\",\n        \"../victory-polar-axis:types:create\",\n        \"../victory-scatter:types:create\",\n        \"../victory-selection-container:types:create\",\n        \"../victory-shared-events:types:create\",\n        \"../victory-stack:types:create\",\n        \"../victory-tooltip:types:create\",\n        \"../victory-voronoi:types:create\",\n        \"../victory-voronoi-container:types:create\",\n        \"../victory-zoom-container:types:create\",\n        \"../victory-vendor:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-area:types:create\",\n        \"../victory-axis:types:create\",\n        \"../victory-bar:types:create\",\n        \"../victory-box-plot:types:create\",\n        \"../victory-brush-container:types:create\",\n        \"../victory-brush-line:types:create\",\n        \"../victory-candlestick:types:create\",\n        \"../victory-canvas:types:create\",\n        \"../victory-chart:types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-create-container:types:create\",\n        \"../victory-cursor-container:types:create\",\n        \"../victory-errorbar:types:create\",\n        \"../victory-group:types:create\",\n        \"../victory-histogram:types:create\",\n        \"../victory-legend:types:create\",\n        \"../victory-line:types:create\",\n        \"../victory-pie:types:create\",\n        \"../victory-polar-axis:types:create\",\n        \"../victory-scatter:types:create\",\n        \"../victory-selection-container:types:create\",\n        \"../victory-shared-events:types:create\",\n        \"../victory-stack:types:create\",\n        \"../victory-tooltip:types:create\",\n        \"../victory-voronoi:types:create\",\n        \"../victory-voronoi-container:types:create\",\n        \"../victory-zoom-container:types:create\",\n        \"../victory-vendor:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-area:build\",\n        \"../victory-axis:build\",\n        \"../victory-bar:build\",\n        \"../victory-box-plot:build\",\n        \"../victory-brush-container:build\",\n        \"../victory-brush-line:build\",\n        \"../victory-candlestick:build\",\n        \"../victory-canvas:build\",\n        \"../victory-chart:build\",\n        \"../victory-core:build\",\n        \"../victory-create-container:build\",\n        \"../victory-cursor-container:build\",\n        \"../victory-errorbar:build\",\n        \"../victory-group:build\",\n        \"../victory-histogram:build\",\n        \"../victory-legend:build\",\n        \"../victory-line:build\",\n        \"../victory-pie:build\",\n        \"../victory-polar-axis:build\",\n        \"../victory-scatter:build\",\n        \"../victory-selection-container:build\",\n        \"../victory-shared-events:build\",\n        \"../victory-stack:build\",\n        \"../victory-tooltip:build\",\n        \"../victory-voronoi:build\",\n        \"../victory-voronoi-container:build\",\n        \"../victory-zoom-container:build\",\n        \"../victory-vendor:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory/src/index.ts",
    "content": "export * from \"victory-area\";\nexport * from \"victory-axis\";\nexport * from \"victory-bar\";\nexport * from \"victory-box-plot\";\nexport * from \"victory-brush-container\";\nexport * from \"victory-brush-line\";\nexport * from \"victory-candlestick\";\nexport * from \"victory-canvas\";\nexport * from \"victory-chart\";\nexport * from \"victory-core\";\nexport * from \"victory-create-container\";\nexport * from \"victory-cursor-container\";\nexport * from \"victory-errorbar\";\nexport * from \"victory-group\";\nexport * from \"victory-histogram\";\nexport * from \"victory-legend\";\nexport * from \"victory-line\";\nexport * from \"victory-pie\";\nexport * from \"victory-polar-axis\";\nexport * from \"victory-scatter\";\nexport * from \"victory-selection-container\";\nexport * from \"victory-shared-events\";\nexport * from \"victory-stack\";\nexport * from \"victory-tooltip\";\nexport * from \"victory-voronoi\";\nexport * from \"victory-voronoi-container\";\nexport * from \"victory-zoom-container\";\n"
  },
  {
    "path": "packages/victory/src/victory.test.ts",
    "content": "/* eslint-disable @typescript-eslint/no-unused-vars */\nimport * as Victory from \"./index\";\nimport {\n  Arc,\n  ArcProps,\n  Area,\n  AreaProps,\n  Axis,\n  Background,\n  BackgroundProps,\n  Bar,\n  BarProps,\n  Border,\n  BorderProps,\n  Box,\n  BoxProps,\n  BrushHelpers,\n  Candle,\n  CandleProps,\n  CanvasBar,\n  CanvasBarProps,\n  CanvasCurve,\n  CanvasCurveProps,\n  CanvasGroup,\n  CanvasGroupProps,\n  CanvasPoint,\n  CanvasPointProps,\n  Circle,\n  ClipPath,\n  ClipPathProps,\n  Collection,\n  ContainerType,\n  CursorHelpers,\n  Curve,\n  CurveProps,\n  Data,\n  DefaultTransitions,\n  Domain,\n  ErrorBar,\n  ErrorBarProps,\n  Events,\n  Flyout,\n  FlyoutProps,\n  Helpers,\n  LabelHelpers,\n  Line,\n  LineSegment,\n  LineSegmentProps,\n  Log,\n  Path,\n  Point,\n  PointProps,\n  Portal,\n  RawZoomHelpers,\n  Rect,\n  Scale,\n  Selection,\n  SelectionHelpers,\n  Slice,\n  SliceProps,\n  Style,\n  TSpan,\n  Text,\n  TextProps,\n  TextSize,\n  Transitions,\n  UserProps,\n  VictoryAccessibleGroup,\n  VictoryAccessibleGroupProps,\n  VictoryAnimation,\n  VictoryAnimationProps,\n  VictoryArea,\n  VictoryAreaProps,\n  VictoryAxis,\n  VictoryAxisProps,\n  VictoryBar,\n  VictoryBarProps,\n  VictoryBoxPlot,\n  VictoryBoxPlotProps,\n  VictoryBrushContainer,\n  VictoryBrushContainerProps,\n  VictoryBrushLine,\n  VictoryBrushLineProps,\n  VictoryCandlestick,\n  VictoryCandlestickProps,\n  VictoryChart,\n  VictoryChartProps,\n  VictoryClipContainer,\n  VictoryClipContainerProps,\n  VictoryContainer,\n  VictoryContainerProps,\n  VictoryCursorContainer,\n  VictoryCursorContainerProps,\n  VictoryErrorBar,\n  VictoryErrorBarProps,\n  VictoryGroup,\n  VictoryGroupProps,\n  VictoryHistogram,\n  VictoryHistogramProps,\n  VictoryLabel,\n  VictoryLabelProps,\n  VictoryLegend,\n  VictoryLegendProps,\n  VictoryLine,\n  VictoryLineProps,\n  VictoryPie,\n  VictoryPieProps,\n  VictoryPolarAxis,\n  VictoryPolarAxisProps,\n  VictoryPortal,\n  VictoryPortalProps,\n  VictoryScatter,\n  VictoryScatterProps,\n  VictorySelectionContainer,\n  VictorySelectionContainerProps,\n  VictorySharedEvents,\n  VictorySharedEventsProps,\n  VictoryStack,\n  VictoryStackProps,\n  VictoryTheme,\n  VictoryThemeDefinition,\n  VictoryTooltip,\n  VictoryTooltipProps,\n  VictoryTransition,\n  VictoryVoronoi,\n  VictoryVoronoiContainer,\n  VictoryVoronoiContainerProps,\n  VictoryVoronoiProps,\n  VictoryZoomContainer,\n  VictoryZoomContainerProps,\n  Voronoi,\n  VoronoiHelpers,\n  VoronoiProps,\n  Whisker,\n  WhiskerProps,\n  Wrapper,\n  ZoomHelpers,\n  addEvents,\n  createContainer,\n  makeCreateContainerFunction,\n  useCanvasContext,\n  useVictoryBrushContainer,\n  useVictoryCursorContainer,\n  useVictorySelectionContainer,\n  useVictoryVoronoiContainer,\n  useVictoryZoomContainer,\n  VICTORY_BRUSH_CONTAINER_DEFAULT_PROPS,\n  VICTORY_CURSOR_CONTAINER_DEFAULT_PROPS,\n  VICTORY_SELECTION_CONTAINER_DEFAULT_PROPS,\n  VICTORY_VORONOI_CONTAINER_DEFAULT_PROPS,\n  VICTORY_ZOOM_CONTAINER_DEFAULT_PROPS,\n  mergeRefs,\n  useVictoryContainer,\n} from \"./index\";\n\ndescribe(\"victory\", () => {\n  it(\"ensure it has named exports\", () => {\n    expect(Area).toBeInstanceOf(Function);\n  });\n  xit(\"ensure all components have valid types\", () => {\n    /*\n     * See https://github.com/FormidableLabs/victory/issues/2411\n     * It's easy for some of our Components to accidentally get typed as 'any'.\n     * This seems to be due to our use of mixins, especially `addEvents`.\n     *\n     * This test is designed to catch those errors, so that we can be sure\n     * that all of our components are exported with the proper types.\n     */\n\n    let shouldNotBeTypedAsAny: { SHOULD_NOT_BE_TYPED_AS_ANY: true };\n\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryAccessibleGroup;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryAccessibleGroupProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryAnimation;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryAnimationProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryArea;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryAreaProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryAxis;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryAxisProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryBar;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryBarProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryBoxPlot;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryBoxPlotProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryBrushContainer;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryBrushContainerProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryBrushLine;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryBrushLineProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryCandlestick;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryCandlestickProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryChart;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryChartProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryClipContainer;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryClipContainerProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryContainer;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryContainerProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryCursorContainer;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryCursorContainerProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryErrorBar;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryErrorBarProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryGroup;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryGroupProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryHistogram;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryHistogramProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryLabel;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryLabelProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryLegend;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryLegendProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryLine;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryLineProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryPie;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryPieProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryPolarAxis;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryPolarAxisProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryPortal;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryPortalProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryScatter;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryScatterProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictorySelectionContainer;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictorySelectionContainerProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictorySharedEvents;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictorySharedEventsProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryStack;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryStackProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryTheme;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryThemeDefinition;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryTooltip;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryTooltipProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryTransition;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryVoronoi;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryVoronoiContainer;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryVoronoiContainerProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryVoronoiProps;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryZoomContainer;\n    // @ts-expect-error This will fail if the component is typed as 'any':\n    shouldNotBeTypedAsAny = VictoryZoomContainerProps;\n  });\n  it(\"ensure everything is exported correctly\", () => {\n    expect(Object.keys(Victory).sort()).toMatchInlineSnapshot(`\n      [\n        \"Arc\",\n        \"Area\",\n        \"Axis\",\n        \"Background\",\n        \"Bar\",\n        \"Border\",\n        \"Box\",\n        \"BrushHelpers\",\n        \"Candle\",\n        \"CanvasBar\",\n        \"CanvasCurve\",\n        \"CanvasGroup\",\n        \"CanvasPoint\",\n        \"Circle\",\n        \"ClipPath\",\n        \"Collection\",\n        \"CursorHelpers\",\n        \"Curve\",\n        \"Data\",\n        \"DefaultTransitions\",\n        \"Domain\",\n        \"ErrorBar\",\n        \"Events\",\n        \"Flyout\",\n        \"Helpers\",\n        \"Hooks\",\n        \"Immutable\",\n        \"LabelHelpers\",\n        \"Line\",\n        \"LineHelpers\",\n        \"LineSegment\",\n        \"Log\",\n        \"Path\",\n        \"Point\",\n        \"PointPathHelpers\",\n        \"Portal\",\n        \"PortalContext\",\n        \"PortalOutlet\",\n        \"PortalProvider\",\n        \"RawZoomHelpers\",\n        \"Rect\",\n        \"Scale\",\n        \"Selection\",\n        \"SelectionHelpers\",\n        \"Slice\",\n        \"Style\",\n        \"TSpan\",\n        \"Text\",\n        \"TextSize\",\n        \"Timer\",\n        \"TimerContext\",\n        \"Transitions\",\n        \"UserProps\",\n        \"VICTORY_BRUSH_CONTAINER_DEFAULT_PROPS\",\n        \"VICTORY_CURSOR_CONTAINER_DEFAULT_PROPS\",\n        \"VICTORY_SELECTION_CONTAINER_DEFAULT_PROPS\",\n        \"VICTORY_VORONOI_CONTAINER_DEFAULT_PROPS\",\n        \"VICTORY_ZOOM_CONTAINER_DEFAULT_PROPS\",\n        \"VictoryAccessibleGroup\",\n        \"VictoryAnimation\",\n        \"VictoryArea\",\n        \"VictoryAxis\",\n        \"VictoryBar\",\n        \"VictoryBoxPlot\",\n        \"VictoryBrushContainer\",\n        \"VictoryBrushLine\",\n        \"VictoryCandlestick\",\n        \"VictoryChart\",\n        \"VictoryClipContainer\",\n        \"VictoryContainer\",\n        \"VictoryCursorContainer\",\n        \"VictoryErrorBar\",\n        \"VictoryGroup\",\n        \"VictoryHistogram\",\n        \"VictoryLabel\",\n        \"VictoryLegend\",\n        \"VictoryLine\",\n        \"VictoryPie\",\n        \"VictoryPolarAxis\",\n        \"VictoryPortal\",\n        \"VictoryScatter\",\n        \"VictorySelectionContainer\",\n        \"VictorySharedEvents\",\n        \"VictoryStack\",\n        \"VictoryTheme\",\n        \"VictoryTooltip\",\n        \"VictoryTransition\",\n        \"VictoryVoronoi\",\n        \"VictoryVoronoiContainer\",\n        \"VictoryZoomContainer\",\n        \"Voronoi\",\n        \"VoronoiHelpers\",\n        \"Whisker\",\n        \"Wrapper\",\n        \"ZoomHelpers\",\n        \"addEvents\",\n        \"createContainer\",\n        \"getBarPath\",\n        \"getBarPosition\",\n        \"getBarWidth\",\n        \"getCornerRadius\",\n        \"getCustomBarPath\",\n        \"getHorizontalBarPath\",\n        \"getPolarBarPath\",\n        \"getStyle\",\n        \"getVerticalBarPath\",\n        \"getVerticalPolarBarPath\",\n        \"makeCreateContainerFunction\",\n        \"mergeRefs\",\n        \"useCanvasContext\",\n        \"usePortalContext\",\n        \"useVictoryBrushContainer\",\n        \"useVictoryContainer\",\n        \"useVictoryCursorContainer\",\n        \"useVictorySelectionContainer\",\n        \"useVictoryVoronoiContainer\",\n        \"useVictoryZoomContainer\",\n      ]\n    `);\n  });\n});\n"
  },
  {
    "path": "packages/victory/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-area/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-area/CHANGELOG.md",
    "content": "# victory-area\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n### Patch Changes\n\n- Upgrade typescript to 5.7.2 ([#2997](https://github.com/FormidableLabs/victory/pull/2997))\n\n* Remove deprecated babel-plugin-lodash plugin ([#2965](https://github.com/FormidableLabs/victory/pull/2965))\n\n## 37.3.2\n\n## 37.3.1\n\n### Patch Changes\n\n- Remove duplicate types from interfaces ([#2940](https://github.com/FormidableLabs/victory/pull/2940))\n\n## 37.3.0\n\n## 37.2.0\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n### Patch Changes\n\n- Ensure undefined props do not overwrite defaults ([#2852](https://github.com/FormidableLabs/victory/pull/2852))\n\n## 37.0.1\n\n### Patch Changes\n\n- Fix the signature of class static functions in components ([#2840](https://github.com/FormidableLabs/victory/pull/2840))\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n### Patch Changes\n\n- Replace lodash isNil and isNan with native code ([#2800](https://github.com/FormidableLabs/victory/pull/2800))\n\n* Replace lodash isFunction with native code ([#2802](https://github.com/FormidableLabs/victory/pull/2802))\n\n## 36.9.1\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n### Patch Changes\n\n- Migrate victory-native to TypeScript ([#2739](https://github.com/FormidableLabs/victory/pull/2739))\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n* Replace instances of lodash.range with equivalent native code ([#2760](https://github.com/FormidableLabs/victory/pull/2760))\n\n## 36.8.4\n\n## 36.8.3\n\n## 36.8.2\n\n## 36.8.1\n\n## 36.8.0\n\n### Patch Changes\n\n- Remove usage of defaultProps from components ([#2679](https://github.com/FormidableLabs/victory/pull/2679))\n\n## 36.7.0\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.8\n  - victory-vendor@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.7\n  - victory-vendor@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.6\n  - victory-vendor@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416), [`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-core@36.6.5\n  - victory-vendor@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n- Updated dependencies [[`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-core@36.6.4\n  - victory-vendor@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-core@36.6.3\n  - victory-vendor@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.2\n  - victory-vendor@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- Updated dependencies [[`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-core@36.6.1\n  - victory-vendor@36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Update source code with minor lint-based improvements (see [#2236](https://github.com/FormidableLabs/victory/issues/2236)). ([#2403](https://github.com/FormidableLabs/victory/pull/2403))\n\n- Updated dependencies [[`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-core@36.6.0\n  - victory-vendor@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-area/README.md",
    "content": "# VictoryArea\n\n`victory-area@^30.0.0` exports `VictoryArea` and `Area` components\n\nTo view documentation for `VictoryArea` please see https://commerce.nearform.com/open-source/victory/docs/victory-area\n\nTo suggest an addition or correction to this documentation please see https://github.com/FormidableLabs/victory/blob/main/docs/src/content/docs/victory-area.md\n"
  },
  {
    "path": "packages/victory-area/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-area/package.json",
    "content": "{\n  \"name\": \"victory-area\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Area Component for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"lodash\": \"^4.17.19\",\n    \"victory-core\": \"37.3.6\",\n    \"victory-vendor\": \"37.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"devDependencies\": {\n    \"victory-chart\": \"*\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\",\n        \"../victory-vendor:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:cjs\",\n        \"../victory-vendor:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\",\n        \"../victory-vendor:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\",\n        \"../victory-vendor:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-chart:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-vendor:build\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-chart:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-vendor:build\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-chart:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:build\",\n        \"../victory-vendor:build\",\n        \"../victory-chart:build\",\n        \"../victory-voronoi:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-area/src/area.test.tsx",
    "content": "import React from \"react\";\nimport { render } from \"@testing-library/react\";\nimport { VictoryContainer } from \"victory-core\";\nimport * as d3Scale from \"victory-vendor/d3-scale\";\n\nimport { Area } from \"./area\";\n\ndescribe(\"victory-primitives/area\", () => {\n  const baseProps = {\n    data: [\n      { _x1: 1, x1: 1, _y1: 4, y1: 4, _y0: 0, eventKey: 0 },\n      { _x1: 2, x1: 2, _y1: 5, y1: 5, _y0: 0, eventKey: 1 },\n      { _x1: 3, x1: 3, _y1: 7, y1: 7, _y0: 0, eventKey: 2 },\n      { _x1: 4, x1: 4, _y1: 10, y1: 10, _y0: 0, eventKey: 3 },\n      { _x1: 5, x1: 5, _y1: 15, y1: 15, _y0: 0, eventKey: 4 },\n    ],\n    scale: {\n      x: d3Scale.scaleLinear(),\n      y: d3Scale.scaleLinear(),\n    },\n    interpolation: \"basis\",\n    style: {\n      stroke: \"tomato\",\n    },\n  };\n\n  it(\"should render a single area and no line when no line style is given\", () => {\n    const props = Object.assign({}, baseProps, {\n      style: {\n        stroke: \"none\",\n      },\n    });\n\n    const { container } = render(\n      <VictoryContainer>\n        <Area {...props} />\n      </VictoryContainer>,\n    );\n    expect(container.querySelectorAll(\"path\")).toHaveLength(1);\n  });\n\n  it(\"should render an area and line when a line style is given\", () => {\n    const { container } = render(\n      <VictoryContainer>\n        <Area {...baseProps} />\n      </VictoryContainer>,\n    );\n    // multiple paths should be grouped\n    expect(container.querySelectorAll(\"path\")).toHaveLength(2);\n  });\n});\n"
  },
  {
    "path": "packages/victory-area/src/area.tsx",
    "content": "/* eslint no-magic-numbers: [\"error\", { \"ignore\": [-1, 0, 1, 2] }]*/\nimport React from \"react\";\nimport defaults from \"lodash/defaults\";\nimport * as d3Shape from \"victory-vendor/d3-shape\";\nimport {\n  Helpers,\n  Path,\n  UserProps,\n  VictoryCommonPrimitiveProps,\n  LineHelpers,\n  VictoryCommonThemeProps,\n} from \"victory-core\";\n\nconst defined = (d) => {\n  const y = d._y1 !== undefined ? d._y1 : d._y;\n  return y !== null && y !== undefined && d._y0 !== null;\n};\n\nconst getXAccessor = (scale) => {\n  return (d) => scale.x(d._x1 !== undefined ? d._x1 : d._x);\n};\n\nconst getYAccessor = (scale) => {\n  return (d) => scale.y(d._y1 !== undefined ? d._y1 : d._y);\n};\n\nconst getY0Accessor = (scale) => {\n  return (d) => scale.y(d._y0);\n};\n\nconst getAngleAccessor = (scale) => {\n  return (d) => {\n    const x = scale.x(d._x1 !== undefined ? d._x1 : d._x);\n    return -1 * x + Math.PI / 2;\n  };\n};\n\nconst getCartesianArea = (props: AreaProps) => {\n  const { horizontal, scale } = props;\n  const interpolationFunction = LineHelpers.getInterpolationFunction(props);\n  return horizontal\n    ? d3Shape\n        .area()\n        .defined(defined)\n        .curve(interpolationFunction)\n        .x0(getY0Accessor(scale))\n        .x1(getYAccessor(scale))\n        .y(getXAccessor(scale))\n    : d3Shape\n        .area()\n        .defined(defined)\n        .curve(interpolationFunction)\n        .x(getXAccessor(scale))\n        .y1(getYAccessor(scale))\n        .y0(getY0Accessor(scale));\n};\n\nconst getAreaFunction = (props: AreaProps) => {\n  const { polar, scale } = props;\n  const interpolationFunction = LineHelpers.getInterpolationFunction(props);\n  return polar\n    ? d3Shape\n        .radialArea()\n        .defined(defined)\n        .curve(interpolationFunction)\n        .angle(getAngleAccessor(scale))\n        .outerRadius(getYAccessor(scale))\n        .innerRadius(getY0Accessor(scale))\n    : getCartesianArea(props);\n};\n\nconst evaluateProps = (props: AreaProps) => {\n  /**\n   * Potential evaluated props are:\n   * `ariaLabel`\n   * `desc`\n   * `id`\n   * `style`\n   * `tabIndex`\n   */\n  const ariaLabel = Helpers.evaluateProp(props.ariaLabel, props);\n  const desc = Helpers.evaluateProp(props.desc, props);\n  const id = Helpers.evaluateProp(props.id, props);\n  const style = Helpers.evaluateStyle(\n    Object.assign({ fill: \"black\" }, props.style),\n    props,\n  );\n  const tabIndex = Helpers.evaluateProp(props.tabIndex, props);\n\n  return Object.assign({}, props, { ariaLabel, desc, id, style, tabIndex });\n};\n\nconst defaultProps = {\n  groupComponent: <g />,\n  pathComponent: <Path />,\n  role: \"presentation\",\n  shapeRendering: \"auto\",\n};\n\n/**\n * The area primitive used by VictoryArea\n */\nexport const Area: React.FC<AreaProps> = (initialProps) => {\n  const props = evaluateProps(defaults({}, initialProps, defaultProps));\n  const {\n    ariaLabel,\n    role,\n    shapeRendering,\n    className,\n    polar,\n    origin,\n    data,\n    pathComponent,\n    events,\n    groupComponent,\n    clipPath,\n    id,\n    style,\n    desc,\n    tabIndex,\n  } = props;\n  const userProps = UserProps.getSafeUserProps(props);\n  const defaultTransform =\n    polar && origin ? `translate(${origin.x}, ${origin.y})` : undefined;\n  const transform = props.transform || defaultTransform;\n  const renderLine =\n    style.stroke && style.stroke !== \"none\" && style.stroke !== \"transparent\";\n  const areaFunction = getAreaFunction(props);\n  const lineFunction = renderLine && LineHelpers.getLineFunction(props);\n\n  const areaStroke = style.stroke ? \"none\" : style.fill;\n\n  const sharedProps = {\n    \"aria-label\": ariaLabel,\n    className,\n    role,\n    shapeRendering,\n    transform,\n    ...events,\n    clipPath,\n    tabIndex,\n  };\n\n  const area = React.cloneElement(\n    pathComponent!,\n    Object.assign(\n      {\n        key: `${id}-area`,\n        style: Object.assign({}, style, { stroke: areaStroke }),\n        d: areaFunction(data),\n        desc,\n        tabIndex,\n      },\n      sharedProps,\n      userProps,\n    ),\n  );\n\n  const line = renderLine\n    ? React.cloneElement(\n        pathComponent!,\n        Object.assign(\n          {\n            key: `${id}-area-stroke`,\n            style: Object.assign({}, style, { fill: \"none\" }),\n            d: lineFunction(data),\n          },\n          sharedProps,\n        ),\n      )\n    : null;\n\n  return renderLine\n    ? React.cloneElement(groupComponent!, userProps, [area, line])\n    : area;\n};\n\nexport interface AreaProps extends VictoryCommonPrimitiveProps {\n  horizontal?: VictoryCommonThemeProps[\"horizontal\"];\n  groupComponent?: React.ReactElement;\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n  interpolation?: string | Function;\n  pathComponent?: React.ReactElement;\n}\n"
  },
  {
    "path": "packages/victory-area/src/helper-methods.test.tsx",
    "content": "import * as d3Scale from \"victory-vendor/d3-scale\";\n\nimport { getDataWithBaseline } from \"./helper-methods\";\n\ndescribe(\"victory-area/helper-methods\", () => {\n  describe(\"getDataWithBaseline\", () => {\n    const data = [\n      { _x: 1, _y: 1 },\n      { _x: 2, _y: 1 },\n    ];\n    const stackedData = [\n      { _x: 1, _x0: 0, _x1: 1, _y: 1, _y0: 1, _y1: 2 },\n      { _x: 2, _x0: 0, _x1: 2, _y: 1, _y0: 1, _y1: 2 },\n    ];\n    const defaultDomain = { x: [0, 10], y: [0, 10] };\n    const nonZeroDomain = { x: [0, 10], y: [1, 10] };\n    const negativeDomain = { x: [0, 10], y: [-1, 10] };\n    const scale = (domain) => {\n      return {\n        x: d3Scale.scaleLinear().domain(domain.x),\n        y: d3Scale.scaleLinear().domain(domain.y),\n      };\n    };\n\n    it(\"should return the minimum if yOffset is not present\", () => {\n      const props = { data };\n      const result = getDataWithBaseline(props, scale(defaultDomain));\n      const expectedResult = [\n        { _y0: 0, _y1: 1, _y: 1, _x: 1, _x0: 0, _x1: 1 },\n        { _y0: 0, _y1: 1, _y: 1, _x: 2, _x0: 0, _x1: 2 },\n      ];\n      expect(result).toEqual(expectedResult);\n    });\n\n    it(\"should return the domain minimum when it is greater than zero\", () => {\n      const props = { data };\n      const result = getDataWithBaseline(props, scale(nonZeroDomain));\n      const expectedResult = [\n        { _y0: 1, _y1: 1, _y: 1, _x: 1, _x0: 0, _x1: 1 },\n        { _y0: 1, _y1: 1, _y: 1, _x: 2, _x0: 0, _x1: 2 },\n      ];\n      expect(result).toEqual(expectedResult);\n    });\n\n    it(\"should return zero when the domain minimum is negative\", () => {\n      const props = { data };\n      const result = getDataWithBaseline(props, scale(negativeDomain));\n      const expectedResult = [\n        { _y0: 0, _y1: 1, _y: 1, _x: 1, _x0: 0, _x1: 1 },\n        { _y0: 0, _y1: 1, _y: 1, _x: 2, _x0: 0, _x1: 2 },\n      ];\n      expect(result).toEqual(expectedResult);\n    });\n\n    it(\"should return yOffset if present\", () => {\n      const props = { data: stackedData };\n      const result = getDataWithBaseline(props, scale(defaultDomain));\n      const expectedResult = stackedData;\n      expect(result).toEqual(expectedResult);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-area/src/helper-methods.tsx",
    "content": "import {\n  Helpers,\n  LabelHelpers,\n  Data,\n  Domain,\n  Scale,\n  Collection,\n} from \"victory-core\";\n\nexport const getDataWithBaseline = (props, scale) => {\n  let data = Data.getData(props);\n  if (data.length < 2) {\n    data = [];\n  }\n  const getDefaultMin = (axis) => {\n    const defaultZero =\n      Scale.getType(scale[axis]) === \"log\" ? 1 / Number.MAX_SAFE_INTEGER : 0;\n    const domain = scale[axis].domain();\n    const minY = Collection.getMinValue(domain);\n    const maxY = Collection.getMaxValue(domain);\n    let defaultMin: typeof minY = defaultZero;\n    if (minY.valueOf() < 0 && maxY.valueOf() <= 0) {\n      defaultMin = maxY;\n    } else if (minY.valueOf() >= 0 && maxY.valueOf() > 0) {\n      defaultMin = minY;\n    }\n    return Collection.containsDates(domain) ? new Date(defaultMin) : defaultMin;\n  };\n\n  return data.map((datum) => {\n    const _y1 = datum._y1 !== undefined ? datum._y1 : datum._y;\n    const _y0 = datum._y0 !== undefined ? datum._y0 : getDefaultMin(\"y\");\n    const _x1 = datum._x1 !== undefined ? datum._x1 : datum._x;\n    const _x0 = datum._x0 !== undefined ? datum._x0 : getDefaultMin(\"x\");\n    return Object.assign({}, datum, { _y0, _y1, _x0, _x1 });\n  });\n};\n\nconst getCalculatedValues = (props) => {\n  const { polar } = props;\n  const defaultStyles = Helpers.getDefaultStyles(props, \"area\");\n  const style = Helpers.getStyles(props.style, defaultStyles);\n  const range = {\n    x: Helpers.getRange(props, \"x\"),\n    y: Helpers.getRange(props, \"y\"),\n  };\n  const domain = {\n    x: Domain.getDomainWithZero(props, \"x\"),\n    y: Domain.getDomainWithZero(props, \"y\"),\n  };\n  const scale = {\n    x: Scale.getBaseScale(props, \"x\")\n      .domain(domain.x)\n      .range(props.horizontal ? range.y : range.x),\n    y: Scale.getBaseScale(props, \"y\")\n      .domain(domain.y)\n      .range(props.horizontal ? range.x : range.y),\n  };\n  const origin = polar\n    ? props.origin || Helpers.getPolarOrigin(props)\n    : undefined;\n  const data = getDataWithBaseline(props, scale);\n  return { style, data, scale, domain, origin };\n};\n\nexport const getBaseProps = (initialProps, fallbackProps) => {\n  const modifiedProps = Helpers.modifyProps(\n    initialProps,\n    fallbackProps,\n    \"area\",\n  );\n  const props = Object.assign(\n    {},\n    modifiedProps,\n    getCalculatedValues(modifiedProps),\n  );\n  const {\n    data,\n    domain,\n    events,\n    groupComponent,\n    height,\n    horizontal,\n    interpolation,\n    origin,\n    padding,\n    polar,\n    scale,\n    sharedEvents,\n    standalone,\n    style,\n    theme,\n    width,\n    labels,\n    name,\n    disableInlineStyles,\n  } = props;\n  const initialChildProps = {\n    parent: {\n      style: style.parent,\n      width,\n      height,\n      scale,\n      data,\n      domain,\n      standalone,\n      theme,\n      polar,\n      origin,\n      padding,\n      name,\n      horizontal,\n    },\n    all: {\n      data: {\n        horizontal,\n        polar,\n        origin,\n        scale,\n        data,\n        interpolation,\n        groupComponent,\n        style: disableInlineStyles ? {} : style.data,\n        disableInlineStyles,\n      },\n    },\n  };\n  return data.reduce((childProps, datum, index) => {\n    const text = LabelHelpers.getText(props, datum, index);\n    if (\n      (text !== undefined && text !== null) ||\n      (labels && (events || sharedEvents))\n    ) {\n      const eventKey = !Helpers.isNil(datum.eventKey) ? datum.eventKey : index;\n      childProps[eventKey] = { labels: LabelHelpers.getProps(props, index) };\n    }\n    return childProps;\n  }, initialChildProps);\n};\n"
  },
  {
    "path": "packages/victory-area/src/index.ts",
    "content": "export * from \"./victory-area\";\nexport * from \"./area\";\n"
  },
  {
    "path": "packages/victory-area/src/victory-area.test.tsx",
    "content": "import { fireEvent, render, screen } from \"@testing-library/react\";\nimport React from \"react\";\nimport { VictoryChart } from \"victory-chart\";\nimport { Helpers } from \"victory-core\";\nimport { curveCatmullRom } from \"victory-vendor/d3-shape\";\n\nimport { calculateD3Path } from \"../../../test/helpers/svg\";\nimport { Area } from \"./area\";\nimport { VictoryArea, VictoryAreaProps } from \"./victory-area\";\n\ndescribe(\"components/victory-area\", () => {\n  describe(\"default component rendering\", () => {\n    it(\"attaches safe user props to the container component\", () => {\n      render(\n        <VictoryArea\n          data-testid=\"victory-area\"\n          aria-label=\"Chart\"\n          unsafe-prop=\"test\"\n        />,\n      );\n\n      const container = screen.getByTestId(\"victory-area\");\n      expect(screen.getByLabelText(\"Chart\")).toBeDefined();\n      expect(container).not.toHaveAttribute(\"unsafe-prop\");\n      expect(container.nodeName).toEqual(\"svg\");\n    });\n\n    it(\"attaches safe user props to the group component if the component is rendered inside a VictoryChart\", () => {\n      render(\n        <VictoryArea\n          data-testid=\"victory-area\"\n          aria-label=\"Chart\"\n          unsafe-prop=\"test\"\n        />,\n        { wrapper: VictoryChart as any },\n      );\n\n      const container = screen.getByTestId(\"victory-area\");\n      expect(screen.getByLabelText(\"Chart\")).toBeDefined();\n      expect(container).not.toHaveAttribute(\"unsafe-prop\");\n      expect(container.nodeName).toEqual(\"g\");\n    });\n\n    it(\"renders an svg with the correct viewbox\", () => {\n      const { container } = render(<VictoryArea />);\n      const viewBoxValue = `0 0 ${450} ${300}`;\n      expect(container.querySelector(\"svg\")!.getAttribute(\"viewBox\")).toEqual(\n        viewBoxValue,\n      );\n    });\n  });\n\n  describe(\"component rendering with data\", () => {\n    it(\"renders the correct d3 path\", () => {\n      const props: VictoryAreaProps = {\n        width: 400,\n        height: 300,\n        padding: 50,\n        scale: \"linear\",\n        interpolation: \"linear\",\n        data: [\n          { x: 0, y: 0, y0: 0 },\n          { x: 2, y: 3, y0: 0 },\n          { x: 4, y: 1, y0: 0 },\n        ],\n      };\n      const { container } = render(<VictoryArea {...props} />);\n      expect(container.querySelector(\"path\")!.getAttribute(\"d\")).toEqual(\n        calculateD3Path(props, \"area\"),\n      );\n    });\n\n    it(\"renders the correct d3 path with custom interpolation string property\", () => {\n      const props: VictoryAreaProps = {\n        interpolation: \"catmullRom\",\n        width: 400,\n        height: 300,\n        padding: 50,\n        scale: \"linear\",\n        data: [\n          { x: 0, y: 0, y0: 0 },\n          { x: 2, y: 3, y0: 0 },\n          { x: 4, y: 1, y0: 0 },\n        ],\n      };\n\n      const { container } = render(<VictoryArea {...props} />);\n\n      expect(container.querySelector(\"path\")!.getAttribute(\"d\")).toEqual(\n        calculateD3Path(props, \"area\"),\n      );\n    });\n\n    it(\"renders the correct d3 path with custom interpolation function\", () => {\n      const props: VictoryAreaProps = {\n        interpolation: curveCatmullRom,\n        width: 400,\n        height: 300,\n        padding: 50,\n        scale: \"linear\",\n        data: [\n          { x: 0, y: 0, y0: 0 },\n          { x: 2, y: 3, y0: 0 },\n          { x: 4, y: 1, y0: 0 },\n        ],\n      };\n\n      const { container } = render(<VictoryArea {...props} />);\n\n      expect(container.querySelector(\"path\")!.getAttribute(\"d\")).toEqual(\n        calculateD3Path(props, \"area\"),\n      );\n    });\n\n    it(\"sorts data according to sortKey prop\", () => {\n      const props: VictoryAreaProps = {\n        scale: \"linear\",\n        interpolation: \"linear\",\n        sortKey: \"x\",\n        data: Helpers.range(5)\n\n          .map((i) => ({ x: i, y: i, y0: 0 }))\n          .reverse(),\n      };\n      render(\n        <VictoryArea\n          {...props}\n          dataComponent={\n            <Area\n              data-testid=\"area\"\n              data-json={({ data }) => JSON.stringify(data)}\n            />\n          }\n        />,\n      );\n\n      const area = screen.getByTestId(\"area\");\n      const data = JSON.parse(area.getAttribute(\"data-json\")!);\n      const xValues = data.map((d) => d._x);\n\n      expect(xValues).toEqual([0, 1, 2, 3, 4]);\n    });\n\n    it(\"sorts data according to sortOrder prop\", () => {\n      const props: VictoryAreaProps = {\n        scale: \"linear\",\n        interpolation: \"linear\",\n        sortKey: \"x\",\n        sortOrder: \"descending\",\n        data: Helpers.range(5)\n          .map((i) => ({ x: i, y: i, y0: 0 }))\n          .reverse(),\n      };\n      render(\n        <VictoryArea\n          {...props}\n          dataComponent={\n            <Area\n              data-testid=\"area\"\n              data-json={({ data }) => JSON.stringify(data)}\n            />\n          }\n        />,\n      );\n\n      const area = screen.getByTestId(\"area\");\n      const data = JSON.parse(area.getAttribute(\"data-json\")!);\n      const xValues = data.map((d) => d._x);\n\n      expect(xValues).toEqual([4, 3, 2, 1, 0]);\n    });\n  });\n\n  describe(\"event handling\", () => {\n    it(\"attaches an event to the parent svg\", () => {\n      const clickHandler = jest.fn();\n      render(\n        <VictoryArea\n          data-testid=\"container\"\n          events={[\n            {\n              target: \"parent\",\n              eventHandlers: { onClick: clickHandler },\n            },\n          ]}\n        />,\n      );\n      const svg = screen.getByTestId(\"container\");\n      fireEvent.click(svg);\n      expect(clickHandler).toHaveBeenCalled();\n    });\n\n    it(\"attaches an event to data\", () => {\n      const clickHandler = jest.fn();\n      render(\n        <VictoryArea\n          dataComponent={<Area data-testid=\"data\" />}\n          events={[\n            {\n              target: \"data\",\n              eventHandlers: { onClick: clickHandler },\n            },\n          ]}\n        />,\n      );\n      const dataComponent = screen.getByTestId(\"data\");\n\n      fireEvent.click(dataComponent);\n      expect(clickHandler).toHaveBeenCalled();\n    });\n\n    it(\"attaches an event to a label\", () => {\n      const clickHandler = jest.fn();\n      render(\n        <VictoryArea\n          data={[\n            { x: 1, y: 1 },\n            { x: 2, y: 2 },\n          ]}\n          labels={({ datum }) => datum.x}\n          events={[\n            {\n              target: \"labels\",\n              eventHandlers: { onClick: clickHandler },\n            },\n          ]}\n        />,\n      );\n      fireEvent.click(screen.getByText(\"1\"));\n\n      expect(clickHandler).toHaveBeenCalled();\n    });\n  });\n\n  describe(\"accessibility\", () => {\n    it(\"adds an aria role to the path area\", () => {\n      const { container } = render(<VictoryArea />);\n      container.querySelectorAll(\"path\").forEach((p) => {\n        expect(p.getAttribute(\"role\")).toBe(\"presentation\");\n      });\n    });\n\n    it(\"adds aria-label and tabIndex to Area primitive\", () => {\n      const ariaTestData = [\n        { x: 1, y: 2 },\n        { x: 2, y: 3 },\n        { x: 3, y: 5 },\n        { x: 4, y: 4 },\n        { x: 5, y: 7 },\n      ];\n      const { container } = render(\n        <VictoryArea\n          data={ariaTestData}\n          dataComponent={\n            <Area\n              ariaLabel={({ data }) =>\n                `data point 1's x value is ${data![0].x}`\n              }\n              tabIndex={4}\n            />\n          }\n        />,\n      );\n\n      container.querySelectorAll(\"path\").forEach((p, i) => {\n        expect(p.getAttribute(\"aria-label\")).toEqual(\n          `data point 1's x value is ${ariaTestData[i].x}`,\n        );\n        expect(parseInt(p.getAttribute(\"tabindex\")!)).toEqual(4);\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-area/src/victory-area.tsx",
    "content": "import React from \"react\";\nimport { getBaseProps } from \"./helper-methods\";\nimport { Area } from \"./area\";\nimport {\n  Helpers,\n  VictoryLabel,\n  VictoryContainer,\n  DefaultTransitions,\n  VictoryClipContainer,\n  addEvents,\n  VictoryTheme,\n  Data,\n  Domain,\n  UserProps,\n  EventPropTypeInterface,\n  InterpolationPropType,\n  StringOrNumberOrCallback,\n  VictoryCommonProps,\n  VictoryDatableProps,\n  VictoryMultiLabelableProps,\n  VictoryStyleInterface,\n  EventsMixinClass,\n} from \"victory-core\";\n\nconst fallbackProps = {\n  width: 450,\n  height: 300,\n  padding: 50,\n  interpolation: \"linear\",\n};\n\nconst options = {\n  components: [\n    { name: \"parent\", index: \"parent\" },\n    { name: \"data\", index: \"all\" },\n    { name: \"labels\" },\n  ],\n};\n\nexport type VictoryAreaTTargetType = \"data\" | \"labels\" | \"parent\";\n\nexport interface VictoryAreaProps\n  extends VictoryCommonProps,\n    VictoryDatableProps,\n    VictoryMultiLabelableProps {\n  eventKey?: string[] | number[] | StringOrNumberOrCallback;\n  events?: EventPropTypeInterface<VictoryAreaTTargetType, string | number>[];\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n  interpolation?: InterpolationPropType | Function;\n  style?: VictoryStyleInterface;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface VictoryAreaBase extends EventsMixinClass<VictoryAreaProps> {}\n\n/**\n * Draw area charts with React. VictoryArea is a composable component, so it doesn't include axes.\n * Add VictoryArea as a child of VictoryChart for a complete chart.\n */\nclass VictoryAreaBase extends React.Component<VictoryAreaProps> {\n  static animationWhitelist = [\n    \"data\",\n    \"domain\",\n    \"height\",\n    \"padding\",\n    \"style\",\n    \"width\",\n  ];\n\n  static defaultProps: VictoryAreaProps = {\n    containerComponent: <VictoryContainer />,\n    dataComponent: <Area />,\n    groupComponent: <VictoryClipContainer />,\n    labelComponent: <VictoryLabel renderInPortal />,\n    samples: 50,\n    sortKey: \"x\",\n    sortOrder: \"ascending\",\n    standalone: true,\n    theme: VictoryTheme.grayscale,\n  };\n\n  static displayName = \"VictoryArea\";\n  static role = \"area\";\n  static continuous = true;\n  static defaultTransitions = DefaultTransitions.continuousTransitions();\n  static defaultPolarTransitions =\n    DefaultTransitions.continuousPolarTransitions();\n  static getDomain = Domain.getDomainWithZero;\n  static getData = Data.getData;\n  static getBaseProps(props) {\n    return getBaseProps(props, fallbackProps);\n  }\n  static expectedComponents = [\n    \"dataComponent\",\n    \"labelComponent\",\n    \"groupComponent\",\n    \"containerComponent\",\n  ];\n\n  // Overridden in native versions\n  shouldAnimate() {\n    return !!this.props.animate;\n  }\n\n  render() {\n    const { animationWhitelist, role } = VictoryAreaBase;\n    const props = Helpers.modifyProps(this.props, fallbackProps, role);\n\n    if (this.shouldAnimate()) {\n      return this.animateComponent(props, animationWhitelist);\n    }\n\n    const children = this.renderContinuousData(props);\n    const component = props.standalone\n      ? this.renderContainer(props.containerComponent, children)\n      : children;\n\n    return UserProps.withSafeUserProps(component, props);\n  }\n}\n\nexport const VictoryArea = addEvents(VictoryAreaBase, options);\n"
  },
  {
    "path": "packages/victory-area/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-area/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-axis/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-axis/CHANGELOG.md",
    "content": "# victory-axis\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n### Patch Changes\n\n- Remove deprecated babel-plugin-lodash plugin ([#2965](https://github.com/FormidableLabs/victory/pull/2965))\n\n* Improve types in victory-core helpers ([#2999](https://github.com/FormidableLabs/victory/pull/2999))\n\n## 37.3.2\n\n## 37.3.1\n\n### Patch Changes\n\n- Remove duplicate types from interfaces ([#2940](https://github.com/FormidableLabs/victory/pull/2940))\n\n## 37.3.0\n\n## 37.2.0\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n## 37.0.1\n\n### Patch Changes\n\n- Fix the signature of class static functions in components ([#2840](https://github.com/FormidableLabs/victory/pull/2840))\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n## 36.9.1\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n## 36.8.4\n\n## 36.8.3\n\n### Patch Changes\n\n- Refactor param reassignments ([#2724](https://github.com/FormidableLabs/victory/pull/2724))\n\n## 36.8.2\n\n## 36.8.1\n\n## 36.8.0\n\n## 36.7.0\n\n### Patch Changes\n\n- Fix Date equality in axis ([#2642](https://github.com/FormidableLabs/victory/pull/2642))\n\n## 36.6.13\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-core@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n- Updated dependencies [[`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-core@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-core@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- - Removed Template Literal Types to increase TS compatibility (fixes [#2418](https://github.com/FormidableLabs/victory/issues/2418)) ([#2420](https://github.com/FormidableLabs/victory/pull/2420))\n  - Improved type for `VictoryLabelProps[\"textAnchor\"]` (fixes [#2361](https://github.com/FormidableLabs/victory/issues/2361))\n  - Fixed exported types for `VictoryAxis`, `VictoryBoxPlot`, `VictoryErrorBar`, and `VictoryScatter` (fixes [#2411](https://github.com/FormidableLabs/victory/issues/2411))\n  - Migrate `victory-cursor-container` to TS (fixes [#2402](https://github.com/FormidableLabs/victory/issues/2402))\n- Updated dependencies [[`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-core@36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Update source code with minor lint-based improvements (see [#2236](https://github.com/FormidableLabs/victory/issues/2236)). ([#2403](https://github.com/FormidableLabs/victory/pull/2403))\n\n- Updated dependencies [[`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-core@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-axis/README.md",
    "content": "# VictoryAxis\n\n`victory-axis@^30.0.0` exports `VictoryAxis` component\n\nTo view documentation for `VictoryAxis` please see https://commerce.nearform.com/open-source/victory/docs/victory-axis\n\nTo suggest an addition or correction to this documentation please see https://github.com/FormidableLabs/victory/blob/main/docs/src/content/docs/victory-axis.md\n"
  },
  {
    "path": "packages/victory-axis/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-axis/package.json",
    "content": "{\n  \"name\": \"victory-axis\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Axis Component for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"lodash\": \"^4.17.19\",\n    \"victory-core\": \"37.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:build\",\n        \"../victory-vendor:build\",\n        \"../victory-voronoi:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-axis/src/helper-methods.tsx",
    "content": "import defaults from \"lodash/defaults\";\nimport { Helpers, Scale, Axis } from \"victory-core\";\nimport { VictoryAxisProps } from \"./victory-axis\";\n\nconst orientationSign = {\n  top: -1,\n  left: -1,\n  right: 1,\n  bottom: 1,\n};\n\nconst exists = (val) => val !== null && val !== undefined;\n\nconst getCurrentAxis = (props, axis) => {\n  const { orientation, horizontal } = props;\n  if (orientation) {\n    const dimensions = { top: \"x\", bottom: \"x\", left: \"y\", right: \"y\" };\n    return dimensions[orientation];\n  }\n  const otherAxis = axis === \"x\" ? \"y\" : \"x\";\n  return horizontal ? otherAxis : axis;\n};\n\nconst getScale = (props) => {\n  const axis = Axis.getAxis(props);\n  const currentAxis = getCurrentAxis(props, axis);\n  const scale = Scale.getBaseScale(props, axis);\n  const propsDomain = props.domain && props.domain[axis];\n  const domain = propsDomain || Axis.getDomain(props) || scale.domain();\n  scale.range(Helpers.getRange(props, currentAxis));\n  scale.domain(domain);\n  return scale;\n};\n\nconst getStyleObject = (props) => {\n  const { theme, dependentAxis } = props;\n  const generalAxisStyle = theme && theme.axis && theme.axis.style;\n  const axisType = dependentAxis ? \"dependentAxis\" : \"independentAxis\";\n  const specificAxisStyle = theme && theme[axisType] && theme[axisType].style;\n\n  const mergeStyles = () => {\n    const styleNamespaces = [\n      \"axis\",\n      \"axisLabel\",\n      \"grid\",\n      \"parent\",\n      \"tickLabels\",\n      \"ticks\",\n    ];\n    return styleNamespaces.reduce((memo, curr) => {\n      memo[curr] = defaults(\n        {},\n        specificAxisStyle[curr],\n        generalAxisStyle[curr],\n      );\n      return memo;\n    }, {});\n  };\n\n  return generalAxisStyle && specificAxisStyle\n    ? mergeStyles()\n    : specificAxisStyle || generalAxisStyle;\n};\n\nexport const getStyles = (\n  props,\n  styleObject: VictoryAxisProps[\"style\"] = {},\n) => {\n  const style = props.style || {};\n  const parentStyleProps = { height: \"100%\", width: \"100%\" };\n  return {\n    parent: defaults(style.parent, styleObject.parent, parentStyleProps),\n    axis: defaults({}, style.axis, styleObject.axis),\n    axisLabel: defaults({}, style.axisLabel, styleObject.axisLabel),\n    grid: defaults({}, style.grid, styleObject.grid),\n    ticks: defaults({}, style.ticks, styleObject.ticks),\n    tickLabels: defaults({}, style.tickLabels, styleObject.tickLabels),\n  };\n};\n\nconst getTickProps = (layout, style, datum) => {\n  const { position, transform } = layout;\n  return {\n    x1: transform.x,\n    y1: transform.y,\n    x2: transform.x + position.x2,\n    y2: transform.y + position.y2,\n    style,\n    datum,\n  };\n};\n\n// eslint-disable-next-line max-params\nconst getTickLabelProps = (layout, style, anchors, datum, text) => {\n  const { position, transform } = layout;\n  return {\n    style,\n    x: transform.x + position.x,\n    y: transform.y + position.y,\n    verticalAnchor: anchors.verticalAnchor,\n    textAnchor: anchors.textAnchor,\n    angle: style.angle,\n    text,\n    datum,\n  };\n};\n\nconst getGridProps = (layout, style, datum) => {\n  const { edge, transform } = layout;\n  return {\n    x1: transform.x,\n    y1: transform.y,\n    x2: edge.x + transform.x,\n    y2: edge.y + transform.y,\n    style,\n    datum,\n  };\n};\n\nconst getAxisProps = (modifiedProps, calculatedValues, globalTransform) => {\n  const { style, padding, isVertical } = calculatedValues;\n  const { width, height } = modifiedProps;\n  return {\n    style: style.axis,\n    x1: isVertical ? globalTransform.x : padding.left + globalTransform.x,\n    x2: isVertical\n      ? globalTransform.x\n      : width - padding.right + globalTransform.x,\n    y1: isVertical ? padding.top + globalTransform.y : globalTransform.y,\n    y2: isVertical\n      ? height - padding.bottom + globalTransform.y\n      : globalTransform.y,\n  };\n};\n\nconst getEvaluatedStyles = (style, props) => {\n  return {\n    tickStyle: Helpers.evaluateStyle(style.ticks, props),\n    labelStyle: Helpers.evaluateStyle(style.tickLabels, props),\n    gridStyle: Helpers.evaluateStyle(style.grid, props),\n  };\n};\n\nconst getAxisLabelProps = (props, calculatedValues, globalTransform) => {\n  const { style, orientation, padding, labelPadding, isVertical } =\n    calculatedValues;\n  const sign = orientationSign[orientation];\n  const hPadding = padding.left + padding.right;\n  const vPadding = padding.top + padding.bottom;\n  const verticalAnchor = sign < 0 ? \"end\" : \"start\";\n  const labelStyle = style.axisLabel;\n  const angle = isVertical ? -90 : 0; // eslint-disable-line no-magic-numbers\n  const x = isVertical\n    ? globalTransform.x + sign * labelPadding\n    : (props.width - hPadding) / 2 + padding.left + globalTransform.x;\n  const y = isVertical\n    ? (props.height - vPadding) / 2 + padding.top + globalTransform.y\n    : sign * labelPadding + globalTransform.y;\n\n  return {\n    x,\n    y,\n    verticalAnchor: labelStyle.verticalAnchor || verticalAnchor,\n    textAnchor: labelStyle.textAnchor || \"middle\",\n    angle: labelStyle.angle === undefined ? angle : labelStyle.angle,\n    style: labelStyle,\n    text: props.label,\n  };\n};\n\nconst getAnchors = (orientation, isVertical) => {\n  const anchorOrientation = {\n    top: \"end\",\n    left: \"end\",\n    right: \"start\",\n    bottom: \"start\",\n  };\n  const anchor = anchorOrientation[orientation];\n  return {\n    textAnchor: isVertical ? anchor : \"middle\",\n    verticalAnchor: isVertical ? \"middle\" : anchor,\n  };\n};\n\nconst getLabelPadding = (props, style) => {\n  const labelStyle = style.axisLabel || {};\n  if (labelStyle.padding !== undefined && labelStyle.padding !== null) {\n    return labelStyle.padding;\n  }\n  const isVertical = Axis.isVertical(props);\n  // TODO: magic numbers\n  /* eslint-disable no-magic-numbers*/\n  const fontSize = labelStyle.fontSize || 14;\n  return props.label ? fontSize * (isVertical ? 2.3 : 1.6) : 0;\n  /* eslint-enable no-magic-numbers*/\n};\n\nconst getDefaultOrientations = (axis, originSign, horizontal) => {\n  const sign = originSign || \"positive\";\n  const orientations = {\n    positive: { x: \"bottom\", y: \"left\" },\n    negative: { x: \"top\", y: \"right\" },\n  };\n  const horizontalOrientations = {\n    positive: { x: \"left\", y: \"bottom\" },\n    negative: { x: \"right\", y: \"top\" },\n  };\n  return horizontal\n    ? horizontalOrientations[sign][axis]\n    : orientations[sign][axis];\n};\n\nconst getStandaloneOffset = (props, calculatedValues) => {\n  const {\n    style,\n    scale,\n    orientation,\n    padding,\n    axis,\n    ticks,\n    stringTicks,\n    isVertical,\n    labelPadding,\n  } = calculatedValues;\n  const { polar, horizontal } = props;\n  const sharedProps = {\n    scale: { [axis]: scale },\n    polar,\n    horizontal,\n    ticks,\n    stringTicks,\n  };\n  const xPadding = orientation === \"right\" ? padding.right : padding.left;\n  const yPadding = orientation === \"top\" ? padding.top : padding.bottom;\n  const offsetX =\n    props.offsetX !== null && props.offsetX !== undefined\n      ? props.offsetX\n      : xPadding;\n  const offsetY =\n    props.offsetY !== null && props.offsetY !== undefined\n      ? props.offsetY\n      : yPadding;\n  const fontSize = style.axisLabel.fontSize || 14; // eslint-disable-line no-magic-numbers\n  const tickSizes = ticks.map((data, index) => {\n    const tick = stringTicks ? props.tickValues[data - 1] : data;\n    const tickStyle = Helpers.evaluateStyle(\n      style.ticks,\n      Object.assign({}, sharedProps, { tick, index }),\n    );\n    return tickStyle.size || 0;\n  });\n  const totalPadding = fontSize + 2 * Math.max(...tickSizes) + labelPadding;\n  const minimumPadding = 1.2 * fontSize; // eslint-disable-line no-magic-numbers\n  const x = isVertical ? totalPadding : minimumPadding;\n  const y = isVertical ? minimumPadding : totalPadding;\n\n  return {\n    x: offsetX !== null && offsetX !== undefined ? offsetX : x,\n    y: offsetY !== null && offsetY !== undefined ? offsetY : y,\n  };\n};\n\nconst isEqual = (a, b) => {\n  if (a instanceof Date && b instanceof Date) {\n    return a.getTime() === b.getTime();\n  }\n  return a === b;\n};\n\nconst getOffset = (props, calculatedValues) => {\n  const { scale, origin, orientation, orientations, domain, padding } =\n    calculatedValues;\n  const { top, bottom, left, right } = padding;\n\n  const calculatedOrientation = {\n    x:\n      orientation === \"bottom\" || orientation === \"top\"\n        ? orientation\n        : orientations.x,\n    y:\n      orientation === \"left\" || orientation === \"right\"\n        ? orientation\n        : orientations.y,\n  };\n\n  // make the axes line up, and cross when appropriate\n  const orientationOffset = {\n    x: calculatedOrientation.y === \"left\" ? left : right,\n    y: calculatedOrientation.x === \"bottom\" ? bottom : top,\n  };\n  const originOffset = {\n    x: calculatedOrientation.y === \"left\" ? 0 : props.width,\n    y: calculatedOrientation.x === \"bottom\" ? props.height : 0,\n  };\n  const originPosition = {\n    x:\n      isEqual(origin.x, domain.x[0]) || isEqual(origin.x, domain.x[1])\n        ? 0\n        : scale.x(origin.x),\n    y:\n      isEqual(origin.y, domain.y[0]) || isEqual(origin.y, domain.y[1])\n        ? 0\n        : scale.y(origin.y),\n  };\n  const x = originPosition.x\n    ? Math.abs(originOffset.x - originPosition.x)\n    : orientationOffset.x;\n  const y = originPosition.y\n    ? Math.abs(originOffset.y - originPosition.y)\n    : orientationOffset.y;\n  const offsetX = exists(props.offsetX) ? props.offsetX : x;\n  const offsetY = exists(props.offsetY) ? props.offsetY : y;\n\n  return {\n    x: offsetX,\n    y: offsetY,\n  };\n};\n\nconst getHorizontalOffset = (props, calculatedValues) => {\n  const { scale, origin, orientation, orientations, domain, padding } =\n    calculatedValues;\n  const { top, bottom, left, right } = padding;\n\n  const calculatedOrientation = {\n    y:\n      orientation === \"bottom\" || orientation === \"top\"\n        ? orientation\n        : orientations.x,\n    x:\n      orientation === \"left\" || orientation === \"right\"\n        ? orientation\n        : orientations.y,\n  };\n\n  // make the axes line up, and cross when appropriate\n  const orientationOffset = {\n    x: calculatedOrientation.y === \"bottom\" ? bottom : top,\n    y: calculatedOrientation.x === \"left\" ? left : right,\n  };\n  const originOffset = {\n    y: calculatedOrientation.x === \"left\" ? 0 : props.width,\n    x: calculatedOrientation.y === \"bottom\" ? props.height : 0,\n  };\n  const originPosition = {\n    x:\n      isEqual(origin.x, domain.x[0]) || isEqual(origin.x, domain.x[1])\n        ? 0\n        : scale.x(origin.x),\n    y:\n      isEqual(origin.y, domain.y[0]) || isEqual(origin.y, domain.y[1])\n        ? 0\n        : scale.y(origin.y),\n  };\n\n  const y = originPosition.x\n    ? Math.abs(originOffset.x - originPosition.x)\n    : orientationOffset.x;\n  const x = originPosition.y\n    ? Math.abs(originOffset.y - originPosition.y)\n    : orientationOffset.y;\n  const offsetX = exists(props.offsetX) ? props.offsetX : x;\n  const offsetY = exists(props.offsetY) ? props.offsetY : y;\n\n  return {\n    x: offsetX,\n    y: offsetY,\n  };\n};\n\nconst getTransform = (props, calculatedValues, offset) => {\n  const { orientation, axis } = calculatedValues;\n  const axisValue = Axis.getAxisValue(props, axis);\n  return {\n    top: {\n      x: 0,\n      y: axisValue !== undefined ? axisValue : offset.y,\n    },\n    bottom: {\n      x: 0,\n      y: axisValue !== undefined ? axisValue : props.height - offset.y,\n    },\n    left: {\n      x: axisValue !== undefined ? axisValue : offset.x,\n      y: 0,\n    },\n    right: {\n      x: axisValue !== undefined ? axisValue : props.width - offset.x,\n      y: 0,\n    },\n  }[orientation];\n};\n\nconst getTickPosition = (style, orientation, isVertical) => {\n  const { tickStyle, labelStyle } = style;\n  const size = tickStyle.size || 0;\n  const tickPadding = tickStyle.padding || 0;\n  const labelPadding = labelStyle.padding || 0;\n  const tickSpacing = size + tickPadding + labelPadding;\n  const sign = orientationSign[orientation];\n  return {\n    x: isVertical ? sign * tickSpacing : 0,\n    x2: isVertical ? sign * size : 0,\n    y: isVertical ? 0 : sign * tickSpacing,\n    y2: isVertical ? 0 : sign * size,\n  };\n};\n\nconst getTickTransform = (tick, globalTransform, isVertical) => {\n  return {\n    x: isVertical ? globalTransform.x : tick + globalTransform.x,\n    y: isVertical ? tick + globalTransform.y : globalTransform.y,\n  };\n};\n\nconst getGridEdge = (props, calculatedValues) => {\n  const { orientation, padding, isVertical } = calculatedValues;\n  const sign = -orientationSign[orientation];\n  const x = isVertical\n    ? sign * (props.width - (padding.left + padding.right))\n    : 0;\n  const y = isVertical\n    ? 0\n    : sign * (props.height - (padding.top + padding.bottom));\n  return { x, y };\n};\n\nconst getGridOffset = (calculatedValues, offset) => {\n  const { padding, orientation, crossAxis } = calculatedValues;\n  const xPadding = orientation === \"right\" ? padding.right : padding.left;\n  const yPadding = orientation === \"top\" ? padding.top : padding.bottom;\n  return {\n    x: crossAxis ? offset.x - xPadding : 0,\n    y: crossAxis ? offset.y - yPadding : 0,\n  };\n};\n\nconst getLayoutProps = (modifiedProps, calculatedValues) => {\n  let offset;\n  if (calculatedValues.domain.x && calculatedValues.domain.y) {\n    offset = modifiedProps.horizontal\n      ? getHorizontalOffset(modifiedProps, calculatedValues)\n      : getOffset(modifiedProps, calculatedValues);\n  } else {\n    offset = getStandaloneOffset(modifiedProps, calculatedValues);\n  }\n  return {\n    globalTransform: getTransform(modifiedProps, calculatedValues, offset),\n    gridOffset: getGridOffset(calculatedValues, offset),\n    gridEdge: getGridEdge(modifiedProps, calculatedValues),\n  };\n};\n\nconst getOrientation = (props) => {\n  if (props.orientation) {\n    return props.orientation;\n  }\n  const defaultOrientations = {\n    dependent: props.horizontal ? \"bottom\" : \"left\",\n    independent: props.horizontal ? \"left\" : \"bottom\",\n  };\n  return props.dependentAxis\n    ? defaultOrientations.dependent\n    : defaultOrientations.independent;\n};\n\nconst getCalculatedValues = (props) => {\n  const defaultStyles = getStyleObject(props);\n  const style = getStyles(props, defaultStyles);\n  const padding = Helpers.getPadding(props.padding);\n  const labelPadding = getLabelPadding(props, style);\n  const stringTicks = Axis.stringTicks(props) ? props.tickValues : undefined;\n  const axis = Axis.getAxis(props);\n  const axisDomain = Axis.getDomain(props);\n  const axisScale = getScale(props);\n  const xAxisDomain = axis === \"x\" ? axisDomain : undefined;\n  const yAxisDomain = axis === \"y\" ? axisDomain : undefined;\n  const xAxisScale = axis === \"x\" ? axisScale : undefined;\n  const yAxisScale = axis === \"y\" ? axisScale : undefined;\n  const crossAxis = !(props.crossAxis === false || props.standalone === true);\n  const ticks = Axis.getTicks(props, axisScale, crossAxis);\n  const tickFormat = Axis.getTickFormat(props, axisScale);\n  const range = {\n    x: Helpers.getRange(props, \"x\"),\n    y: Helpers.getRange(props, \"y\"),\n  };\n  // use full domain if passed in from parent,\n  // otherwise use the just the one axis available\n  const domain = {\n    x: props.domain && props.domain.x ? props.domain.x : xAxisDomain,\n    y: props.domain && props.domain.y ? props.domain.y : yAxisDomain,\n  };\n  // use full scale if passed in from parent,\n  // otherwise use the just the one axis available\n  const scale = {\n    x:\n      props.domain && props.domain.x\n        ? Scale.getBaseScale(props, \"x\")\n            .domain(props.domain.x)\n            .range(props.horizontal ? range.y : range.x)\n        : xAxisScale,\n    y:\n      props.domain && props.domain.y\n        ? Scale.getBaseScale(props, \"y\")\n            .domain(props.domain.y)\n            .range(props.horizontal ? range.x : range.y)\n        : yAxisScale,\n  };\n  const origin = domain.x && domain.y ? Axis.getOrigin(domain) : undefined;\n  const originSign = origin\n    ? {\n        x: Axis.getOriginSign(origin.x, domain.x),\n        y: Axis.getOriginSign(origin.y, domain.y),\n      }\n    : undefined;\n  const orientations = originSign\n    ? {\n        x: getDefaultOrientations(\"x\", originSign.y, props.horizontal),\n        y: getDefaultOrientations(\"y\", originSign.x, props.horizontal),\n      }\n    : undefined;\n  const orientation = orientations\n    ? props.orientation || orientations[axis]\n    : getOrientation(props);\n  const isVertical = Axis.isVertical(Object.assign({}, props, { orientation }));\n  const anchors = getAnchors(orientation, isVertical);\n  return {\n    anchors,\n    axis,\n    crossAxis,\n    domain,\n    isVertical,\n    labelPadding,\n    orientation,\n    orientations,\n    origin,\n    padding,\n    scale,\n    stringTicks,\n    style,\n    tickFormat,\n    ticks,\n  };\n};\n\nexport const getBaseProps = (initialProps, fallbackProps) => {\n  const props = Axis.modifyProps(initialProps, fallbackProps);\n  const calculatedValues = getCalculatedValues(props);\n  const {\n    axis,\n    style,\n    orientation,\n    isVertical,\n    scale,\n    ticks,\n    tickFormat,\n    anchors,\n    domain,\n    stringTicks,\n  } = calculatedValues;\n  const otherAxis = axis === \"x\" ? \"y\" : \"x\";\n  const { width, height, standalone, theme, polar, padding, horizontal } =\n    props;\n  const { globalTransform, gridOffset, gridEdge } = getLayoutProps(\n    props,\n    calculatedValues,\n  );\n  const sharedProps = {\n    scale: { [axis]: scale[axis] },\n    polar,\n    horizontal,\n    ticks,\n    stringTicks,\n  };\n  const axisProps = getAxisProps(props, calculatedValues, globalTransform);\n  const axisLabelProps = getAxisLabelProps(\n    props,\n    calculatedValues,\n    globalTransform,\n  );\n  const initialChildProps = {\n    parent: Object.assign(\n      {\n        style: style.parent,\n        ticks,\n        standalone,\n        theme,\n        width,\n        height,\n        padding,\n        domain,\n      },\n      sharedProps,\n    ),\n  };\n  const gridProps = {\n    dimension: otherAxis,\n    range: { [otherAxis]: Helpers.getRange(props, otherAxis) },\n    scale:\n      props.scale && props.scale[otherAxis]\n        ? { [otherAxis]: props.scale[otherAxis] }\n        : undefined,\n  };\n\n  return (ticks as number[]).reduce((childProps, tickValue, index) => {\n    const tick = stringTicks ? stringTicks[index] : tickValue;\n    const text = tickFormat(tickValue, index, ticks);\n    const styles = getEvaluatedStyles(\n      style,\n      Object.assign({}, sharedProps, { tick, tickValue, index, text }),\n    );\n    const tickLayout = {\n      position: getTickPosition(styles, orientation, isVertical),\n      transform: getTickTransform(\n        scale[axis]?.(tickValue),\n        globalTransform,\n        isVertical,\n      ),\n    };\n\n    const gridLayout = {\n      edge: gridEdge,\n      transform: {\n        x: isVertical\n          ? -gridOffset.x + globalTransform.x\n          : scale[axis]?.(tickValue) + globalTransform.x,\n        y: isVertical\n          ? scale[axis]?.(tickValue) + globalTransform.y\n          : gridOffset.y + globalTransform.y,\n      },\n    };\n    childProps[index] = {\n      axis: Object.assign({ dimension: axis }, sharedProps, axisProps),\n      axisLabel: Object.assign({}, sharedProps, axisLabelProps),\n      ticks: Object.assign(\n        {},\n        sharedProps,\n        getTickProps(tickLayout, styles.tickStyle, tickValue),\n      ),\n      tickLabels: Object.assign(\n        {},\n        sharedProps,\n        getTickLabelProps(\n          tickLayout,\n          styles.labelStyle,\n          anchors,\n          tickValue,\n          text,\n        ),\n      ),\n      grid: Object.assign(\n        {},\n        sharedProps,\n        gridProps,\n        getGridProps(gridLayout, styles.gridStyle, tickValue),\n      ),\n    };\n    return childProps;\n  }, initialChildProps);\n};\n"
  },
  {
    "path": "packages/victory-axis/src/index.ts",
    "content": "export * from \"./victory-axis\";\n"
  },
  {
    "path": "packages/victory-axis/src/victory-axis.tsx",
    "content": "import React from \"react\";\nimport isEmpty from \"lodash/isEmpty\";\nimport {\n  VictoryLabel,\n  VictoryContainer,\n  VictoryTheme,\n  LineSegment,\n  TextSize,\n  addEvents,\n  Axis,\n  UserProps,\n  EventPropTypeInterface,\n  OrientationTypes,\n  VictoryAxisCommonProps,\n  VictoryCommonProps,\n  VictorySingleLabelableProps,\n  EventsMixinClass,\n} from \"victory-core\";\nimport { getBaseProps, getStyles } from \"./helper-methods\";\n\nconst fallbackProps = {\n  width: 450,\n  height: 300,\n  padding: 50,\n};\n\nconst options = {\n  components: [\n    { name: \"axis\", index: 0 },\n    { name: \"axisLabel\", index: 0 },\n    { name: \"grid\" },\n    { name: \"parent\", index: \"parent\" },\n    { name: \"ticks\" },\n    { name: \"tickLabels\" },\n  ],\n};\n\nexport type VictoryAxisTTargetType =\n  | \"axis\"\n  | \"axisLabel\"\n  | \"grid\"\n  | \"ticks\"\n  | \"tickLabels\"\n  | \"parent\";\n\nexport interface VictoryAxisProps\n  extends VictoryAxisCommonProps,\n    VictoryCommonProps,\n    VictorySingleLabelableProps {\n  crossAxis?: boolean;\n  events?: EventPropTypeInterface<VictoryAxisTTargetType, number | string>[];\n  fixLabelOverlap?: boolean;\n  offsetX?: number;\n  offsetY?: number;\n  orientation?: OrientationTypes;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface VictoryAxisBase extends EventsMixinClass<VictoryAxisProps> {}\n\nclass VictoryAxisBase extends React.Component<VictoryAxisProps> {\n  static animationWhitelist: Array<keyof VictoryAxisProps> = [\n    \"style\",\n    \"domain\",\n    \"range\",\n    \"tickCount\",\n    \"tickValues\",\n    \"offsetX\",\n    \"offsetY\",\n    \"padding\",\n    \"width\",\n    \"height\",\n  ];\n\n  static displayName = \"VictoryAxis\";\n\n  static role = \"axis\";\n\n  static defaultTransitions = {\n    onExit: {\n      duration: 500,\n    },\n    onEnter: {\n      duration: 500,\n    },\n  };\n\n  static defaultProps = {\n    axisComponent: <LineSegment />,\n    axisLabelComponent: <VictoryLabel />,\n    tickLabelComponent: <VictoryLabel />,\n    tickComponent: <LineSegment />,\n    gridComponent: <LineSegment />,\n    standalone: true,\n    theme: VictoryTheme.grayscale,\n    containerComponent: <VictoryContainer />,\n    groupComponent: <g role=\"presentation\" />,\n    fixLabelOverlap: false,\n  };\n\n  static getDomain = Axis.getDomain;\n  static getAxis = Axis.getAxis;\n  static getStyles(props) {\n    return getStyles(props);\n  }\n  static getBaseProps(props) {\n    return getBaseProps(props, fallbackProps);\n  }\n  static expectedComponents: Array<keyof VictoryAxisProps> = [\n    \"axisComponent\",\n    \"axisLabelComponent\",\n    \"groupComponent\",\n    \"containerComponent\",\n    \"tickComponent\",\n    \"tickLabelComponent\",\n    \"gridComponent\",\n  ];\n\n  renderLine(props) {\n    const { axisComponent } = props;\n    const axisProps = this.getComponentProps(axisComponent, \"axis\", 0);\n    return React.cloneElement(axisComponent, axisProps);\n  }\n\n  renderLabel(props) {\n    const { axisLabelComponent, label } = props;\n    if (!label) {\n      return null;\n    }\n    const axisLabelProps = this.getComponentProps(\n      axisLabelComponent,\n      \"axisLabel\",\n      0,\n    );\n    return React.cloneElement(axisLabelComponent, axisLabelProps);\n  }\n\n  renderGridAndTicks(props) {\n    const { tickComponent, tickLabelComponent, gridComponent, name } = props;\n    const shouldRender = (componentProps) => {\n      const { style = {}, events = {} } = componentProps;\n      const visible =\n        style.stroke !== \"transparent\" &&\n        style.stroke !== \"none\" &&\n        style.strokeWidth !== 0;\n      return visible || !isEmpty(events);\n    };\n\n    return this.dataKeys.map((key, index) => {\n      const tickProps = this.getComponentProps(tickComponent, \"ticks\", index);\n      const BaseTickComponent = React.cloneElement(tickComponent, tickProps);\n      const TickComponent = shouldRender(BaseTickComponent.props)\n        ? BaseTickComponent\n        : undefined;\n      const gridProps = this.getComponentProps(gridComponent, \"grid\", index);\n      const BaseGridComponent = React.cloneElement(gridComponent, gridProps);\n      const GridComponent = shouldRender(BaseGridComponent.props)\n        ? BaseGridComponent\n        : undefined;\n      const tickLabelProps = this.getComponentProps(\n        tickLabelComponent,\n        \"tickLabels\",\n        index,\n      );\n      const TickLabel = React.cloneElement(tickLabelComponent, tickLabelProps);\n      const children = [GridComponent, TickComponent, TickLabel].filter(\n        Boolean,\n      );\n      return React.cloneElement(\n        props.groupComponent,\n        { key: `${name}-tick-group-${key}` },\n        children,\n      );\n    });\n  }\n\n  fixLabelOverlap(gridAndTicks, props) {\n    const isVertical = Axis.isVertical(props);\n    const size = isVertical ? props.height : props.width;\n    const isVictoryLabel = (child) => child.type && child.type.role === \"label\";\n    const labels = gridAndTicks\n      .map((gridAndTick) => gridAndTick.props.children)\n      .reduce((accumulator, childArr) => accumulator.concat(childArr), [])\n      .filter(isVictoryLabel)\n      .map((child) => child.props);\n    const paddingToObject = (padding) =>\n      typeof padding === \"object\"\n        ? Object.assign({}, { top: 0, right: 0, bottom: 0, left: 0 }, padding)\n        : { top: padding, right: padding, bottom: padding, left: padding };\n    const labelsSumSize = labels.reduce((sum, label) => {\n      const padding = paddingToObject(label.style.padding);\n      const labelSize = TextSize.approximateTextSize(label.text, {\n        angle: label.angle,\n        fontSize: label.style.fontSize,\n        letterSpacing: label.style.letterSpacing,\n        fontFamily: label.style.fontFamily,\n      });\n      return (\n        sum +\n        (isVertical\n          ? labelSize.height + padding.top + padding.bottom\n          : labelSize.width + padding.right + padding.left)\n      );\n    }, 0);\n    const availiableLabelCount = Math.floor(\n      (size * gridAndTicks.length) / labelsSumSize,\n    );\n    const divider = Math.ceil(gridAndTicks.length / availiableLabelCount) || 1;\n    const getLabelCoord = (gridAndTick) =>\n      gridAndTick.props.children\n        .filter(isVictoryLabel)\n        .reduce(\n          (prev, child) => (isVertical ? child.props.y : child.props.x) || 0,\n          0,\n        );\n    const sorted = gridAndTicks.sort(\n      (a, b) =>\n        isVertical\n          ? getLabelCoord(b) - getLabelCoord(a) // ordinary axis has top-bottom orientation\n          : getLabelCoord(a) - getLabelCoord(b), // ordinary axis has left-right orientation\n    );\n    return sorted.filter((gridAndTick, index) => index % divider === 0);\n  }\n\n  // Overridden in native versions\n  shouldAnimate() {\n    return !!this.props.animate;\n  }\n\n  render(): React.ReactElement {\n    const { animationWhitelist } = VictoryAxis;\n    const props = Axis.modifyProps(this.props, fallbackProps);\n    const userProps = UserProps.getSafeUserProps(this.props);\n\n    if (this.shouldAnimate()) {\n      return this.animateComponent(props, animationWhitelist);\n    }\n\n    const gridAndTicks = this.renderGridAndTicks(props);\n    const modifiedGridAndTicks = props.fixLabelOverlap\n      ? this.fixLabelOverlap(gridAndTicks, props)\n      : gridAndTicks;\n    const children = [\n      this.renderLine(props),\n      this.renderLabel(props),\n      ...modifiedGridAndTicks,\n    ];\n    const container = React.cloneElement(props.containerComponent, userProps);\n    return props.standalone\n      ? this.renderContainer(container, children)\n      : React.cloneElement(props.groupComponent, userProps, children);\n  }\n}\n\nexport const VictoryAxis = addEvents(VictoryAxisBase, options);\n"
  },
  {
    "path": "packages/victory-axis/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-axis/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-bar/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-bar/CHANGELOG.md",
    "content": "# victory-bar\n\n## 37.3.6\n\n## 37.3.5\n\n### Patch Changes\n\n- Fix \"props.groupComponent is undefined\" error ([#3014](https://github.com/FormidableLabs/victory/pull/3014))\n\n## 37.3.4\n\n## 37.3.3\n\n### Patch Changes\n\n- Remove deprecated babel-plugin-lodash plugin ([#2965](https://github.com/FormidableLabs/victory/pull/2965))\n\n* Zoomed bar graph items will no longer be culled from the view when more than 50% of width or height is outside of the clipping parent. Instead they will be clipped once 100% outside\" ([#2970](https://github.com/FormidableLabs/victory/pull/2970))\n\n## 37.3.2\n\n## 37.3.1\n\n### Patch Changes\n\n- Remove duplicate types from interfaces ([#2940](https://github.com/FormidableLabs/victory/pull/2940))\n\n## 37.3.0\n\n## 37.2.0\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n### Patch Changes\n\n- Ensure undefined props do not overwrite defaults ([#2852](https://github.com/FormidableLabs/victory/pull/2852))\n\n## 37.0.1\n\n### Patch Changes\n\n- Fix the signature of class static functions in components ([#2840](https://github.com/FormidableLabs/victory/pull/2840))\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n### Patch Changes\n\n- Replace lodash isNil and isNan with native code ([#2800](https://github.com/FormidableLabs/victory/pull/2800))\n\n* Replace lodash isFunction with native code ([#2802](https://github.com/FormidableLabs/victory/pull/2802))\n\n## 36.9.1\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n* Replace instances of lodash.range with equivalent native code ([#2760](https://github.com/FormidableLabs/victory/pull/2760))\n\n## 36.8.4\n\n## 36.8.3\n\n### Patch Changes\n\n- Fix incorrect typescript props ([#2745](https://github.com/FormidableLabs/victory/pull/2745))\n\n* Refactor param reassignments ([#2724](https://github.com/FormidableLabs/victory/pull/2724))\n\n## 36.8.2\n\n### Patch Changes\n\n- Migrate victory-bar to TypeScript ([#2709](https://github.com/FormidableLabs/victory/pull/2709))\n\n## 36.8.1\n\n## 36.8.0\n\n### Minor Changes\n\n- Remove v37 experimental code ([#2697](https://github.com/FormidableLabs/victory/pull/2697))\n\n### Patch Changes\n\n- Remove usage of defaultProps from components ([#2679](https://github.com/FormidableLabs/victory/pull/2679))\n\n## 36.7.0\n\n### Minor Changes\n\n- added ref forwarding for path and bar components ([#2673](https://github.com/FormidableLabs/victory/pull/2673))\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.8\n  - victory-vendor@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.7\n  - victory-vendor@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.6\n  - victory-vendor@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416), [`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-core@36.6.5\n  - victory-vendor@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n- Updated dependencies [[`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-core@36.6.4\n  - victory-vendor@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-core@36.6.3\n  - victory-vendor@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.2\n  - victory-vendor@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- Updated dependencies [[`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-core@36.6.1\n  - victory-vendor@36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Update source code with minor lint-based improvements (see [#2236](https://github.com/FormidableLabs/victory/issues/2236)). ([#2403](https://github.com/FormidableLabs/victory/pull/2403))\n\n- Updated dependencies [[`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-core@36.6.0\n  - victory-vendor@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-bar/README.md",
    "content": "# VictoryBar\n\n`victory-bar@^30.0.0` exports `VictoryBar` and `Bar` components\n\nTo view documentation for `VictoryBar` please see https://commerce.nearform.com/open-source/victory/docs/victory-bar\n\nTo suggest an addition or correction to documentation for `VictoryBar` please see https://github.com/FormidableLabs/victory/blob/main/docs/src/content/docs/victory-bar.md\n"
  },
  {
    "path": "packages/victory-bar/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-bar/package.json",
    "content": "{\n  \"name\": \"victory-bar\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Bar Component for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"lodash\": \"^4.17.19\",\n    \"victory-core\": \"37.3.6\",\n    \"victory-vendor\": \"37.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"devDependencies\": {\n    \"victory-chart\": \"*\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\",\n        \"../victory-vendor:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:cjs\",\n        \"../victory-vendor:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\",\n        \"../victory-vendor:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\",\n        \"../victory-vendor:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-chart:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-vendor:build\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-chart:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-vendor:build\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-chart:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:build\",\n        \"../victory-vendor:build\",\n        \"../victory-chart:build\",\n        \"../victory-voronoi:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-bar/src/bar-helper-methods.ts",
    "content": "import isPlainObject from \"lodash/isPlainObject\";\nimport { Helpers, VictoryStyleObject } from \"victory-core\";\nimport { BarProps } from \"./bar\";\nimport {\n  VictoryBarCornerRadiusObject,\n  VictoryBarCornerRadiusKey,\n} from \"./victory-bar\";\n\nconst DEFAULT_BAR_WIDTH = 8;\n\nexport const getBarWidth = (\n  barWidth: BarProps[\"barWidth\"],\n  props: BarProps,\n) => {\n  const { scale, data, style } = props;\n  if (barWidth) {\n    return Helpers.evaluateProp(barWidth, props);\n  } else if (style.width) {\n    return style.width;\n  }\n  const range = scale.x.range();\n  const extent = Math.abs(range[1] - range[0]);\n  const bars = data.length + 2;\n  const barRatio = props.barRatio || 0.5;\n  const defaultWidth =\n    barRatio * (data.length < 2 ? DEFAULT_BAR_WIDTH : extent / bars);\n  return Math.max(1, defaultWidth);\n};\n\nconst getCornerRadiusFromObject = (\n  cornerRadius: VictoryBarCornerRadiusObject,\n  props: BarProps,\n) => {\n  const realCornerRadius: VictoryBarCornerRadiusObject = {\n    topLeft: 0,\n    topRight: 0,\n    bottomLeft: 0,\n    bottomRight: 0,\n  };\n  const updateCornerRadius = (\n    corner: VictoryBarCornerRadiusKey,\n    fallback: \"top\" | \"bottom\",\n  ) => {\n    if (!Helpers.isNil(cornerRadius[corner])) {\n      realCornerRadius[corner] = Helpers.evaluateProp(\n        cornerRadius[corner],\n        props,\n      );\n    } else if (!Helpers.isNil(cornerRadius[fallback])) {\n      realCornerRadius[corner] = Helpers.evaluateProp(\n        cornerRadius[fallback],\n        props,\n      );\n    }\n  };\n  updateCornerRadius(\"topLeft\", \"top\");\n  updateCornerRadius(\"topRight\", \"top\");\n  updateCornerRadius(\"bottomLeft\", \"bottom\");\n  updateCornerRadius(\"bottomRight\", \"bottom\");\n  return realCornerRadius;\n};\n\nfunction isCornerRadiusObject(\n  cornerRadius: BarProps[\"cornerRadius\"],\n): cornerRadius is VictoryBarCornerRadiusObject {\n  return isPlainObject(cornerRadius);\n}\n\nexport const getCornerRadius = (\n  cornerRadius: BarProps[\"cornerRadius\"],\n  props: BarProps,\n) => {\n  const realCornerRadius: VictoryBarCornerRadiusObject = {\n    topLeft: 0,\n    topRight: 0,\n    bottomLeft: 0,\n    bottomRight: 0,\n  };\n  if (!cornerRadius) {\n    return realCornerRadius;\n  }\n  if (isCornerRadiusObject(cornerRadius)) {\n    return getCornerRadiusFromObject(cornerRadius, props);\n  }\n  realCornerRadius.topLeft = Helpers.evaluateProp(cornerRadius, props);\n  realCornerRadius.topRight = Helpers.evaluateProp(cornerRadius, props);\n  return realCornerRadius;\n};\n\nexport const getStyle = (style: VictoryStyleObject = {}, props: BarProps) => {\n  if (props.disableInlineStyles) {\n    return {};\n  }\n  const stroke = style.fill || \"black\";\n  const baseStyle = { fill: \"black\", stroke };\n  return Helpers.evaluateStyle(Object.assign(baseStyle, style), props);\n};\n"
  },
  {
    "path": "packages/victory-bar/src/bar.test.tsx",
    "content": "import React from \"react\";\nimport { render } from \"@testing-library/react\";\nimport * as d3Scale from \"victory-vendor/d3-scale\";\nimport { VictoryContainer } from \"victory-core\";\n\nimport { getBarShape } from \"../../../test/helpers\";\nimport { Bar } from \"./bar\";\n\ndescribe(\"victory-primitives/bar\", () => {\n  const baseProps = {\n    data: [\n      { _x: 2, x: 2, _y: 4, y: 4, eventKey: 0 },\n      { _x: 3, x: 3, _y: 5, y: 5, eventKey: 1 },\n    ],\n    datum: { _x: 2, x: 2, _y: 4, y: 4, eventKey: 0 },\n    x: 2,\n    x0: 0,\n    y: 10,\n    y0: 0,\n    scale: {\n      x: d3Scale.scaleLinear(),\n      y: d3Scale.scaleLinear(),\n    },\n  };\n\n  const renderBarSvg = (props = {}) => {\n    const combinedProps = { ...baseProps, ...props };\n    const { container } = render(\n      <VictoryContainer>\n        <Bar {...combinedProps} />\n      </VictoryContainer>,\n    );\n    return container.querySelector(\"path\");\n  };\n\n  it(\"should render a vertical bar\", () => {\n    const bar = renderBarSvg();\n    const barShape = getBarShape(bar);\n    expect(Math.round(barShape.height)).toEqual(10);\n  });\n\n  it(\"should render a horizontal bar\", () => {\n    const props = { horizontal: true };\n\n    const bar = renderBarSvg(props);\n    const barShape = getBarShape(bar);\n\n    expect(Math.round(barShape.width)).toEqual(2);\n  });\n\n  it(\"should render a default bar width when one is not provided\", () => {\n    const props = {\n      width: 10,\n      padding: 1,\n      data: Array(4),\n    };\n\n    const bar = renderBarSvg(props);\n    const barShape = getBarShape(bar);\n\n    expect(Math.floor(barShape.width)).toEqual(2);\n  });\n\n  it(\"should allow override of width by passing a style\", () => {\n    const props = { style: { width: 3 } };\n\n    const bar = renderBarSvg(props);\n    const barShape = getBarShape(bar);\n\n    expect(Math.floor(barShape.width)).toEqual(3);\n  });\n\n  it(\"should allow modification of width by passing barRatio\", () => {\n    const props = {\n      data: [{ _x: 2, x: 2, _y: 4, y: 4, eventKey: 0 }],\n      barRatio: 3,\n    };\n\n    const bar = renderBarSvg(props);\n    const barShape = getBarShape(bar);\n\n    expect(Math.floor(barShape.width)).toEqual(24);\n  });\n});\n"
  },
  {
    "path": "packages/victory-bar/src/bar.tsx",
    "content": "import React, { forwardRef } from \"react\";\nimport defaults from \"lodash/defaults\";\nimport {\n  Helpers,\n  NumberOrCallback,\n  Path,\n  VictoryCommonPrimitiveProps,\n} from \"victory-core\";\nimport { getStyle, getBarWidth, getCornerRadius } from \"./bar-helper-methods\";\nimport { getPolarBarPath, getBarPath } from \"./path-helper-methods\";\nimport {\n  VictoryBarAlignmentType,\n  VictoryBarCornerRadiusObject,\n} from \"./victory-bar\";\n\nexport interface BarProps extends VictoryCommonPrimitiveProps {\n  alignment?: VictoryBarAlignmentType;\n  barOffset?: number[];\n  barRatio?: number;\n  barWidth?: NumberOrCallback;\n  cornerRadius?: NumberOrCallback | VictoryBarCornerRadiusObject;\n  datum?: any;\n  getPath?: (props: BarProps) => string;\n  horizontal?: boolean;\n  pathComponent?: React.ReactElement;\n  width?: number;\n  x?: number;\n  y?: number;\n  y0?: number;\n}\n\nconst evaluateProps = (props: BarProps) => {\n  /**\n   * Potential evaluated props of following must be evaluated in this order:\n   * 1) `style`\n   * 2) `barWidth`\n   * 3) `cornerRadius`\n   *\n   * Everything else does not have to be evaluated in a particular order:\n   * `ariaLabel`\n   * `desc`\n   * `id`\n   * `tabIndex`\n   */\n  const style = getStyle(props.style, props);\n  const barWidth = getBarWidth(\n    props.barWidth,\n    Object.assign({}, props, { style }),\n  );\n  const cornerRadius = getCornerRadius(\n    props.cornerRadius,\n    Object.assign({}, props, { style, barWidth }),\n  );\n\n  const ariaLabel = Helpers.evaluateProp(props.ariaLabel, props);\n  const desc = Helpers.evaluateProp(props.desc, props);\n  const id = Helpers.evaluateProp(props.id, props);\n  const tabIndex = Helpers.evaluateProp(props.tabIndex, props);\n\n  return Object.assign({}, props, {\n    ariaLabel,\n    style,\n    barWidth,\n    cornerRadius,\n    desc,\n    id,\n    tabIndex,\n  });\n};\n\nconst defaultProps: Partial<BarProps> = {\n  pathComponent: <Path />,\n  role: \"presentation\",\n  shapeRendering: \"auto\",\n};\n\nexport const Bar = forwardRef<SVGPathElement, BarProps>(\n  // eslint-disable-next-line prefer-arrow-callback\n  function Bar(initialProps, ref) {\n    const props = evaluateProps(defaults({}, initialProps, defaultProps));\n    const { polar, origin, style, barWidth, cornerRadius } = props;\n\n    const path = polar\n      ? getPolarBarPath(props, cornerRadius)\n      : getBarPath(props, barWidth, cornerRadius);\n    const defaultTransform =\n      polar && origin ? `translate(${origin.x}, ${origin.y})` : undefined;\n\n    if (!props.pathComponent) {\n      return null;\n    }\n\n    return React.cloneElement(props.pathComponent, {\n      ...props.events,\n      \"aria-label\": props.ariaLabel,\n      style,\n      d: path,\n      className: props.className,\n      clipPath: props.clipPath,\n      desc: props.desc,\n      index: props.index,\n      role: props.role,\n      shapeRendering: props.shapeRendering,\n      transform: props.transform || defaultTransform,\n      tabIndex: props.tabIndex,\n      ref,\n    });\n  },\n);\n"
  },
  {
    "path": "packages/victory-bar/src/geometry-helper-methods.test.ts",
    "content": "import { circle, point } from \"./geometry-helper-methods\";\n\ndescribe(\"point\", () => {\n  describe(\"calculates distances\", () => {\n    const expectDistanceToBeClose = (p0, p1, answerRoot = 2) => {\n      const answer = Math.sqrt(answerRoot);\n      expect(p0.distance(p1)).toBeCloseTo(answer);\n    };\n\n    it(\"between positive coordinates\", () => {\n      const p0 = point(1, 2);\n      const p1 = point(2, 3);\n      expectDistanceToBeClose(p0, p1);\n    });\n\n    it(\"between negative coordinates\", () => {\n      const p0 = point(-1, -2);\n      const p1 = point(-2, -3);\n      expectDistanceToBeClose(p0, p1);\n    });\n\n    it(\"between zero, zero coordinates\", () => {\n      const p0 = point(0, 0);\n      const p1 = point(0, 0);\n      expectDistanceToBeClose(p0, p1, 0);\n    });\n  });\n\n  it(\"can add correctly\", () => {\n    const p0 = point(1, 1);\n    const p1 = point(2, 3);\n    const { x, y } = p0.add(p1);\n    expect(x).toEqual(3);\n    expect(y).toEqual(4);\n  });\n\n  it(\"can subtract correctly\", () => {\n    const p0 = point(1, 1);\n    const p1 = point(2, 3);\n    const { x, y } = p1.subtract(p0);\n    expect(x).toEqual(1);\n    expect(y).toEqual(2);\n  });\n\n  it(\"can scalar multiply correctly\", () => {\n    const p = point(3, 4);\n    const { x, y } = p.scalarMult(-2);\n    expect(x).toEqual(-6);\n    expect(y).toEqual(-8);\n  });\n\n  it(\"can scalar divide correctly\", () => {\n    const p = point(3, 4);\n    const { x, y } = p.scalarDivide(2);\n    const answerX = 1.5;\n    const answerY = 2;\n    expect(x).toBeCloseTo(answerX);\n    expect(y).toBeCloseTo(answerY);\n  });\n\n  it(\"throws when dividing by zero\", () => {\n    const p = point(3, 4);\n    expect(() => p.scalarDivide(0)).toThrow();\n  });\n\n  it(\"can check for equality correctly\", () => {\n    const p0 = point(3, 4);\n    const p1 = point(3, 4);\n    expect(p0.equals(p1)).toBeTruthy();\n  });\n});\n\ndescribe(\"circle\", () => {\n  describe(\"calculates circle-circle intersection correctly\", () => {\n    it(\"handles separate circles\", () => {\n      const c0 = circle(point(0, 0), 1);\n      const c1 = circle(point(0, 10), 1);\n      expect(c0.intersection(c1)).toEqual([]);\n    });\n\n    it(\"handles one circle containing another\", () => {\n      const c0 = circle(point(0, 0), 2);\n      const c1 = circle(point(0, 0), 10);\n      expect(c0.intersection(c1)).toEqual([]);\n    });\n\n    it(\"handles same circle case\", () => {\n      const c0 = circle(point(0, 0), 1);\n      const c1 = circle(point(0, 0), 1);\n      expect(c0.intersection(c1)).toEqual([]);\n    });\n\n    it(\"handles circles of zero radius\", () => {\n      const c0 = circle(point(0, 0), 0);\n      const c1 = circle(point(0, 0), 0);\n      expect(c0.intersection(c1)).toEqual([]);\n\n      const c2 = circle(point(0, 0), 0);\n      const c3 = circle(point(0, 1), 0);\n      expect(c2.intersection(c3)).toEqual([]);\n    });\n\n    it(\"handles circles meeting at exactly one point\", () => {\n      const c0 = circle(point(0, 0), 1);\n      const c1 = circle(point(0, 2), 1);\n      const [{ x: x0, y: y0 }, { x: x1, y: y1 }] = c0.intersection(c1);\n      expect(x0).toEqual(0);\n      expect(x1).toEqual(0);\n      expect(y0).toEqual(1);\n      expect(y1).toEqual(1);\n    });\n\n    it(\"handles circles meeting at two points\", () => {\n      const c0 = circle(point(2, 3), 3);\n      const c1 = circle(point(1, -1), 4);\n      const [{ x: x0, y: y0 }, { x: x1, y: y1 }] = c0.intersection(c1);\n      expect(x0).toBeCloseTo(-0.96);\n      expect(y0).toBeCloseTo(2.49);\n      expect(x1).toBeCloseTo(4.37);\n      expect(y1).toBeCloseTo(1.16);\n    });\n\n    it(\"the left-most point is the 0th element, the right-most is the 1st\", () => {\n      const c0 = circle(point(2, 3), 3);\n      const c1 = circle(point(1, -1), 4);\n      const [{ x: x0 }, { x: x1 }] = c0.intersection(c1);\n      expect(x0 <= x1).toBeTruthy();\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-bar/src/geometry-helper-methods.ts",
    "content": "/**\n * A point in the 2d plane\n */\nexport const point = (x: number, y: number) => ({\n  x,\n  y,\n  distance(p1: { x: number; y: number }) {\n    return Math.sqrt(Math.pow(this.x - p1.x, 2) + Math.pow(this.y - p1.y, 2));\n  },\n  // vector addition in 2d plane\n  add(p1: { x: number; y: number }) {\n    return point(this.x + p1.x, this.y + p1.y);\n  },\n  // vector subtraction in 2d\n  // returns p0 - p1\n  subtract(p1: { x: number; y: number }) {\n    return point(this.x - p1.x, this.y - p1.y);\n  },\n  // multiply a 2d point by a scalar\n  scalarMult(n: number) {\n    return point(this.x * n, this.y * n);\n  },\n  scalarDivide(n: number) {\n    if (n === 0) {\n      throw new Error(\"Division by 0 error\");\n    }\n    return point(this.x / n, this.y / n);\n  },\n  equals(p1: { x: number; y: number }) {\n    return this.x === p1.x && this.y === p1.y;\n  },\n});\n\ntype Center = ReturnType<typeof point>;\n\n/**\n * A circle in the 2d plane\n */\nexport const circle = (center: Center, radius: number) => ({\n  center,\n  radius,\n  hasIntersection(circle1: { center: Center; radius: number }) {\n    const P0 = this.center;\n    const P1 = circle1.center;\n    const r0 = this.radius;\n    const r1 = circle1.radius;\n    const d = P0.distance(P1);\n\n    if (d > r0 + r1) {\n      return false; // separate circles\n    }\n    if (d < Math.abs(r0 - r1)) {\n      return false; // one circle contains another\n    }\n    return true;\n  },\n  equals(circle1: { center: Center; radius: number }) {\n    const P0 = this.center;\n    const P1 = circle1.center;\n    const r0 = this.radius;\n    const r1 = circle1.radius;\n    return r0 === r1 && P0.equals(P1);\n  },\n  // Source: http://paulbourke.net/geometry/circlesphere/\n  // \"Intersection of two circles\" by Paul Bourke\n  // Left-most point is returned as 0th element of array\n  // Right-most point is returned as 1st elemennt of array\n  intersection(circle1: { center: Center; radius: number }) {\n    const P0 = this.center;\n    const P1 = circle1.center;\n    const r0 = this.radius;\n    const r1 = circle1.radius;\n    const d = P0.distance(P1);\n    if (!this.hasIntersection(circle1) || this.equals(circle1)) {\n      return [];\n    }\n    const a = (Math.pow(r0, 2) - Math.pow(r1, 2) + Math.pow(d, 2)) / (2 * d);\n    const h = Math.sqrt(Math.pow(r0, 2) - Math.pow(a, 2));\n    const P2 = P0.add(P1.subtract(P0).scalarMult(a).scalarDivide(d));\n    const { x: x0, y: y0 } = P0;\n    const { x: x1, y: y1 } = P1;\n    const { x: x2, y: y2 } = P2;\n    const P3s = [\n      point(x2 - (h * (y1 - y0)) / d, y2 + (h * (x1 - x0)) / d),\n      point(x2 + (h * (y1 - y0)) / d, y2 - (h * (x1 - x0)) / d),\n    ];\n    P3s.sort((Point1, Point2) => Point1.x - Point2.x);\n    return P3s;\n  },\n  solveX(y: number) {\n    const sqrt = Math.sqrt(\n      Math.pow(this.radius, 2) - Math.pow(y - this.center.y, 2),\n    );\n    return [this.center.x - sqrt, this.center.x + sqrt];\n  },\n  solveY(x: number) {\n    const sqrt = Math.sqrt(\n      Math.pow(this.radius, 2) - Math.pow(x - this.center.x, 2),\n    );\n    return [this.center.y - sqrt, this.center.y + sqrt];\n  },\n});\n"
  },
  {
    "path": "packages/victory-bar/src/helper-methods.ts",
    "content": "import {\n  Collection,\n  Data,\n  Domain,\n  Helpers,\n  LabelHelpers,\n  Scale,\n  VictoryClipContainer,\n} from \"victory-core\";\n\nexport const getBarPosition = (props, datum) => {\n  const getDefaultMin = (axis) => {\n    const defaultZero =\n      Scale.getType(props.scale[axis]) === \"log\"\n        ? 1 / Number.MAX_SAFE_INTEGER\n        : 0;\n    let defaultMin = defaultZero;\n    const minY = Collection.getMinValue(props.domain[axis]) as number;\n    const maxY = Collection.getMaxValue(props.domain[axis]) as number;\n\n    if (minY < 0 && maxY <= 0) {\n      defaultMin = maxY;\n    } else if (minY >= 0 && maxY > 0) {\n      defaultMin = minY;\n    }\n\n    return datum[`_${axis}`] instanceof Date\n      ? new Date(defaultMin)\n      : defaultMin;\n  };\n  const _y0 = datum._y0 !== undefined ? datum._y0 : getDefaultMin(\"y\");\n  const _x0 = datum._x0 !== undefined ? datum._x0 : getDefaultMin(\"x\");\n  return Helpers.scalePoint(props, Object.assign({}, datum, { _y0, _x0 }));\n};\n\nconst getCalculatedValues = (props) => {\n  const { polar } = props;\n  const defaultStyles = Helpers.getDefaultStyles(props, \"bar\");\n  const style = !props.disableInlineStyles\n    ? Helpers.getStyles(props.style, defaultStyles)\n    : {};\n  const range = props.range || {\n    x: Helpers.getRange(props, \"x\"),\n    y: Helpers.getRange(props, \"y\"),\n  };\n  const domain = {\n    x: Domain.getDomainWithZero(props, \"x\"),\n    y: Domain.getDomainWithZero(props, \"y\"),\n  };\n  const scale = {\n    x: Scale.getBaseScale(props, \"x\")\n      .domain(domain.x)\n      .range(props.horizontal ? range.y : range.x),\n    y: Scale.getBaseScale(props, \"y\")\n      .domain(domain.y)\n      .range(props.horizontal ? range.x : range.y),\n  };\n  const origin = polar\n    ? props.origin || Helpers.getPolarOrigin(props)\n    : undefined;\n\n  let data = Data.getData(props);\n  data = Data.formatDataFromDomain(data, domain, 0);\n\n  // when inside a zoom container, reset the _x and _y properties of each datum to the original\n  // x and y property values so they will not be clipped. See https://github.com/FormidableLabs/victory/pull/2970\n  if (props.groupComponent?.type === VictoryClipContainer) {\n    data = data.map((datum) => ({ ...datum, _x: datum.x, _y: datum.y }));\n  }\n\n  return { style, data, scale, domain, origin };\n};\n\nexport const getBaseProps = (initialProps, fallbackProps) => {\n  const modifiedProps = Helpers.modifyProps(initialProps, fallbackProps, \"bar\");\n  const props = Object.assign(\n    {},\n    modifiedProps,\n    getCalculatedValues(modifiedProps),\n  );\n  const {\n    alignment,\n    barRatio,\n    cornerRadius,\n    data,\n    disableInlineStyles,\n    domain,\n    events,\n    height,\n    horizontal,\n    origin,\n    padding,\n    polar,\n    scale,\n    sharedEvents,\n    standalone,\n    style,\n    theme,\n    width,\n    labels,\n    name,\n    barWidth,\n    getPath,\n  } = props;\n  const initialChildProps = {\n    parent: {\n      horizontal,\n      domain,\n      scale,\n      width,\n      height,\n      data,\n      standalone,\n      name,\n      theme,\n      polar,\n      origin,\n      padding,\n      style: style.parent,\n    },\n  };\n\n  return data.reduce((childProps, datum, index) => {\n    const eventKey = !Helpers.isNil(datum.eventKey) ? datum.eventKey : index;\n    const { x, y, y0, x0 } = getBarPosition(props, datum);\n\n    const dataProps = {\n      alignment,\n      barRatio,\n      barWidth,\n      cornerRadius,\n      data,\n      datum,\n      disableInlineStyles,\n      getPath,\n      horizontal,\n      index,\n      polar,\n      origin,\n      scale,\n      style: style.data,\n      width,\n      height,\n      x,\n      y,\n      y0,\n      x0,\n    };\n\n    childProps[eventKey] = {\n      data: dataProps,\n    };\n\n    const text = LabelHelpers.getText(props, datum, index);\n    if (\n      (text !== undefined && text !== null) ||\n      (labels && (events || sharedEvents))\n    ) {\n      childProps[eventKey].labels = LabelHelpers.getProps(props, index);\n    }\n\n    return childProps;\n  }, initialChildProps);\n};\n"
  },
  {
    "path": "packages/victory-bar/src/index.ts",
    "content": "export * from \"./victory-bar\";\nexport * from \"./bar\";\nexport { getBarPosition } from \"./helper-methods\";\nexport {\n  getVerticalBarPath,\n  getHorizontalBarPath,\n  getVerticalPolarBarPath,\n  getCustomBarPath,\n  getPolarBarPath,\n  getBarPath,\n} from \"./path-helper-methods\";\nexport { getBarWidth, getStyle, getCornerRadius } from \"./bar-helper-methods\";\n"
  },
  {
    "path": "packages/victory-bar/src/path-helper-methods.ts",
    "content": "import * as d3Shape from \"victory-vendor/d3-shape\";\nimport { BarProps } from \"./bar\";\n\nimport { circle, point } from \"./geometry-helper-methods\";\n\nconst getPosition = (props, width) => {\n  const { x, x0, y, y0, horizontal } = props;\n  const alignment = props.alignment || \"middle\";\n  const size = alignment === \"middle\" ? width / 2 : width;\n  const sign = horizontal ? -1 : 1;\n  if (horizontal) {\n    return {\n      x0,\n      x1: x,\n      y0: alignment === \"start\" ? y : y - sign * size,\n      y1: alignment === \"end\" ? y : y + sign * size,\n    };\n  }\n\n  return {\n    x0: alignment === \"start\" ? x : x - sign * size,\n    x1: alignment === \"end\" ? x : x + sign * size,\n    y0,\n    y1: y,\n  };\n};\n\nconst getAngle = (props, index: number) => {\n  const { data, scale } = props;\n  const x = data[index]._x1 === undefined ? \"_x\" : \"_x1\";\n  return scale.x(data[index][x]);\n};\n\nconst getAngularWidth = (props, width) => {\n  const { scale } = props;\n  const range = scale.y.range();\n  const r = Math.max(...range);\n  const angularRange = Math.abs(scale.x.range()[1] - scale.x.range()[0]);\n  return (width / (2 * Math.PI * r)) * angularRange;\n};\n\nconst transformAngle = (angle: number) => {\n  return -1 * angle + Math.PI / 2;\n};\n\nexport const getCustomBarPath = (\n  props: BarProps,\n  width: number,\n): string | undefined => {\n  const { getPath } = props;\n  if (typeof getPath === \"function\") {\n    const propsWithCalculatedValues = {\n      ...props,\n      ...getPosition(props, width),\n    };\n    return getPath(propsWithCalculatedValues);\n  }\n};\n\nconst getStartAngle = (props, index: number) => {\n  const { data, scale, alignment } = props;\n  const currentAngle = getAngle(props, index);\n  const angularRange = Math.abs(scale.x.range()[1] - scale.x.range()[0]);\n  const previousAngle =\n    index === 0\n      ? getAngle(props, data.length - 1) - Math.PI * 2\n      : getAngle(props, index - 1);\n  if (index === 0 && angularRange < 2 * Math.PI) {\n    return scale.x.range()[0];\n  } else if (alignment === \"start\" || alignment === \"end\") {\n    return alignment === \"start\" ? previousAngle : currentAngle;\n  }\n  return (currentAngle + previousAngle) / 2;\n};\n\nconst getEndAngle = (props, index: number) => {\n  const { data, scale, alignment } = props;\n  const currentAngle = getAngle(props, index);\n  const angularRange = Math.abs(scale.x.range()[1] - scale.x.range()[0]);\n  const lastAngle =\n    scale.x.range()[1] === 2 * Math.PI\n      ? getAngle(props, 0) + Math.PI * 2\n      : scale.x.range()[1];\n  const nextAngle =\n    index === data.length - 1\n      ? getAngle(props, 0) + Math.PI * 2\n      : getAngle(props, index + 1);\n  if (index === data.length - 1 && angularRange < 2 * Math.PI) {\n    return lastAngle;\n  } else if (alignment === \"start\" || alignment === \"end\") {\n    return alignment === \"start\" ? currentAngle : nextAngle;\n  }\n  return (currentAngle + nextAngle) / 2;\n};\n\nconst mapPointsToPath = (coords, cornerRadius, direction) => {\n  const topLeftPath = `${cornerRadius.topLeft} ${cornerRadius.topLeft} ${direction}`;\n  const topRightPath = `${cornerRadius.topRight} ${cornerRadius.topRight} ${direction}`;\n  const bottomLeftPath = `${cornerRadius.bottomLeft} ${cornerRadius.bottomLeft} ${direction}`;\n  const bottomRightPath = `${cornerRadius.bottomRight} ${cornerRadius.bottomRight} ${direction}`;\n\n  const commands = [\n    \"M\",\n    `A ${bottomLeftPath},`,\n    \"L\",\n    `A ${topLeftPath},`,\n    \"L\",\n    `A ${topRightPath},`,\n    \"L\",\n    `A ${bottomRightPath},`,\n  ];\n  const path = commands.reduce(\n    (acc, command, i) => `${acc}${command} ${coords[i].x}, ${coords[i].y} \\n`,\n    \"\",\n  );\n  return `${path} z`;\n};\n\nconst getVerticalBarPoints = (position, sign, cr) => {\n  const { x0, x1, y0, y1 } = position;\n\n  const getHalfPoints = (side) => {\n    const isLeft = side === \"Left\";\n    const signL = isLeft ? 1 : -1;\n    const x = isLeft ? x0 : x1;\n    let bottomPoint = { x: x + signL * cr[`bottom${side}`], y: y0 };\n    let bottomMiddlePoint = { x, y: y0 - sign * cr[`bottom${side}`] };\n    let topMiddlePoint = { x, y: y1 + sign * cr[`top${side}`] };\n    let topPoint = { x: x + signL * cr[`top${side}`], y: y1 };\n    const hasIntersection =\n      sign === 1\n        ? y0 - cr[`bottom${side}`] < y1 + cr[`top${side}`]\n        : y0 + cr[`bottom${side}`] > y1 - cr[`top${side}`];\n    if (hasIntersection) {\n      const topCenter = point(\n        x + signL * cr[`top${side}`],\n        y1 + sign * cr[`top${side}`],\n      );\n      const topCircle = circle(topCenter, cr[`top${side}`]);\n      const bottomCenter = point(\n        x + signL * cr[`bottom${side}`],\n        y0 - sign * cr[`bottom${side}`],\n      );\n      const bottomCircle = circle(bottomCenter, cr[`bottom${side}`]);\n      const circleIntersection = topCircle.intersection(bottomCircle);\n      const hasArcIntersection = circleIntersection.length > 0;\n      if (hasArcIntersection) {\n        const arcIntersection = circleIntersection[isLeft ? 0 : 1];\n        bottomMiddlePoint = { x: arcIntersection.x, y: arcIntersection.y };\n        topMiddlePoint = { x: arcIntersection.x, y: arcIntersection.y };\n      } else {\n        const hasBottomLineTopArcIntersection =\n          cr[`top${side}`] > cr[`bottom${side}`];\n        if (hasBottomLineTopArcIntersection) {\n          const newX = topCircle.solveX(y0)[isLeft ? 0 : 1];\n          bottomPoint = { x: newX, y: y0 };\n          bottomMiddlePoint = { x: newX, y: y0 };\n          topMiddlePoint = { x: newX, y: y0 };\n        } else {\n          const newX = bottomCircle.solveX(y1)[isLeft ? 0 : 1];\n          bottomMiddlePoint = { x: newX, y: y1 };\n          topMiddlePoint = { x: newX, y: y1 };\n          topPoint = { x: newX, y: y1 };\n        }\n      }\n    }\n    const points = [bottomPoint, bottomMiddlePoint, topMiddlePoint, topPoint];\n    return isLeft ? points : points.reverse();\n  };\n\n  return getHalfPoints(\"Left\").concat(getHalfPoints(\"Right\"));\n};\n\nconst getHorizontalBarPoints = (position, sign, cr) => {\n  const { y0, y1 } = position;\n  const x0 = position.x0 < position.x1 ? position.x0 : position.x1;\n  const x1 = position.x0 < position.x1 ? position.x1 : position.x0;\n\n  const getHalfPoints = (side) => {\n    const isTop = side === \"top\";\n    const signL = isTop ? -1 : 1;\n    const y = isTop ? y1 : y0;\n    let leftPoint = { x: x0, y: y - signL * cr[`${side}Left`] };\n    let leftMiddlePoint = { x: x0 + cr[`${side}Left`], y };\n    let rightMiddlePoint = { x: x1 - cr[`${side}Right`], y };\n    let rightPoint = { x: x1, y: y - signL * cr[`${side}Right`] };\n    const hasIntersection = leftMiddlePoint.x > rightMiddlePoint.x;\n    if (hasIntersection) {\n      const leftCenter = point(\n        x0 + cr[`${side}Left`],\n        y - signL * cr[`${side}Left`],\n      );\n      const leftCircle = circle(leftCenter, cr[`${side}Left`]);\n      const rightCenter = point(\n        x1 - cr[`${side}Right`],\n        y - signL * cr[`${side}Right`],\n      );\n      const rightCircle = circle(rightCenter, cr[`${side}Right`]);\n      const circleIntersection = leftCircle.intersection(rightCircle);\n      const hasArcIntersection = circleIntersection.length > 0;\n      if (hasArcIntersection) {\n        const arcIntersection = circleIntersection[sign > 0 ? 1 : 0];\n        leftMiddlePoint = { x: arcIntersection.x, y: arcIntersection.y };\n        rightMiddlePoint = { x: arcIntersection.x, y: arcIntersection.y };\n      } else {\n        const hasLeftLineRightArcIntersection =\n          cr[`${side}Right`] > cr[`${side}Left`];\n        if (hasLeftLineRightArcIntersection) {\n          const newY = rightCircle.solveY(x0)[isTop ? 0 : 1];\n          leftPoint = { x: x0, y: newY };\n          leftMiddlePoint = { x: x0, y: newY };\n          rightMiddlePoint = { x: x0, y: newY };\n        } else {\n          const newY = leftCircle.solveY(x1)[isTop ? 0 : 1];\n          rightPoint = { x: x1, y: newY };\n          rightMiddlePoint = { x: x1, y: newY };\n          leftMiddlePoint = { x: x1, y: newY };\n        }\n      }\n    }\n    return [leftPoint, leftMiddlePoint, rightMiddlePoint, rightPoint];\n  };\n  const topPoints = getHalfPoints(\"top\");\n  const bottomPoints = getHalfPoints(\"bottom\");\n  return [\n    bottomPoints[1],\n    bottomPoints[0],\n    ...topPoints,\n    // eslint-disable-next-line no-magic-numbers\n    bottomPoints[3],\n    bottomPoints[2],\n  ];\n};\n\nexport const getVerticalBarPath = (props, width, cornerRadius) => {\n  const position = getPosition(props, width);\n\n  const sign = position.y0 > position.y1 ? 1 : -1;\n  const direction = sign > 0 ? \"0 0 1\" : \"0 0 0\";\n  const points = getVerticalBarPoints(position, sign, cornerRadius);\n  return mapPointsToPath(points, cornerRadius, direction);\n};\n\nexport const getHorizontalBarPath = (props, width, cornerRadius) => {\n  const position = getPosition(props, width);\n\n  const sign = position.x0 < position.x1 ? 1 : -1;\n  const direction = \"0 0 1\";\n  const cr = {\n    topRight: sign > 0 ? cornerRadius.topLeft : cornerRadius.bottomLeft,\n    bottomRight: sign > 0 ? cornerRadius.topRight : cornerRadius.bottomRight,\n    bottomLeft: sign > 0 ? cornerRadius.bottomRight : cornerRadius.topRight,\n    topLeft: sign > 0 ? cornerRadius.bottomLeft : cornerRadius.topLeft,\n  };\n  const points = getHorizontalBarPoints(position, sign, cr);\n  return mapPointsToPath(points, cr, direction);\n};\n\nexport const getVerticalPolarBarPath = (props: BarProps, cornerRadius) => {\n  const { datum, scale, index, alignment, style } = props;\n  const r1 = scale.y(datum._y0 || 0);\n  const r2 = scale.y(datum._y1 !== undefined ? datum._y1 : datum._y);\n  const currentAngle = scale.x(datum._x1 !== undefined ? datum._x1 : datum._x);\n  let start;\n  let end;\n  if (style.width) {\n    const width = getAngularWidth(props, style.width);\n    const size = alignment === \"middle\" ? width / 2 : width;\n    start = alignment === \"start\" ? currentAngle : currentAngle - size;\n    end = alignment === \"end\" ? currentAngle : currentAngle + size;\n  } else {\n    start = getStartAngle(props, Number(index));\n    end = getEndAngle(props, Number(index));\n  }\n\n  const getPath = (edge): string => {\n    const pathFunction: any = d3Shape\n      .arc()\n      .innerRadius(r1)\n      .outerRadius(r2)\n      .startAngle(transformAngle(start))\n      .endAngle(transformAngle(end))\n      .cornerRadius(cornerRadius[edge]);\n\n    return pathFunction();\n  };\n\n  const getPathData = (edge) => {\n    const rightPath = getPath(`${edge}Right`);\n    const rightMoves: string[] = rightPath.match(/[A-Z]/g) || [];\n    const rightCoords = rightPath.split(/[A-Z]/).slice(1);\n    const rightMiddle = rightMoves.indexOf(\"L\");\n\n    const leftPath = getPath(`${edge}Left`);\n    const leftMoves: string[] = leftPath.match(/[A-Z]/g) || [];\n    const leftCoords = leftPath.split(/[A-Z]/).slice(1);\n    const leftMiddle = leftMoves.indexOf(\"L\");\n\n    return {\n      rightMoves,\n      rightCoords,\n      rightMiddle,\n      leftMoves,\n      leftCoords,\n      leftMiddle,\n    };\n  };\n\n  const getTopPath = () => {\n    const { topRight, topLeft } = cornerRadius;\n    const arcLength = r2 * Math.abs(end - start);\n    const {\n      rightMoves,\n      rightCoords,\n      rightMiddle,\n      leftMoves,\n      leftCoords,\n      leftMiddle,\n    } = getPathData(\"top\");\n    let moves;\n    let coords;\n    if (topRight === topLeft || arcLength < 2 * topRight + 2 * topLeft) {\n      moves = topRight > topLeft ? rightMoves : leftMoves;\n      coords = topRight > topLeft ? rightCoords : leftCoords;\n    } else {\n      // eslint-disable-next-line no-magic-numbers\n      const isShort = (middle) => middle < 3;\n      const rightOffset = topLeft > topRight && isShort(rightMiddle) ? 1 : 2;\n      let leftOffset;\n      if (topRight > topLeft) {\n        const defaultOffset = isShort(rightMiddle)\n          ? leftMiddle\n          : leftMiddle - 2;\n        leftOffset = isShort(leftMiddle) ? leftMiddle - 1 : defaultOffset;\n      } else {\n        const defaultOffset = isShort(leftMiddle) ? 1 : 2;\n        leftOffset = isShort(rightMiddle) ? defaultOffset : leftMiddle - 2;\n      }\n      moves = [\n        ...rightMoves.slice(0, rightOffset),\n        ...leftMoves.slice(leftOffset),\n      ];\n      coords = [\n        ...rightCoords.slice(0, rightOffset),\n        ...leftCoords.slice(leftOffset),\n      ];\n    }\n\n    const middle = moves.indexOf(\"L\");\n    const subMoves = moves.slice(0, middle);\n    const subCoords = coords.slice(0, middle);\n    return subMoves.map((m, i) => ({\n      command: m,\n      coords: subCoords[i].split(\",\"),\n    }));\n  };\n\n  const getBottomPath = () => {\n    const { bottomRight, bottomLeft } = cornerRadius;\n    const arcLength = r1 * Math.abs(end - start);\n    const {\n      rightMoves,\n      rightCoords,\n      rightMiddle,\n      leftMoves,\n      leftCoords,\n      leftMiddle,\n    } = getPathData(\"bottom\");\n    let moves;\n    let coords;\n    if (\n      bottomRight === bottomLeft ||\n      arcLength < 2 * bottomRight + 2 * bottomLeft\n    ) {\n      moves = bottomRight > bottomLeft ? rightMoves : leftMoves;\n      coords = bottomRight > bottomLeft ? rightCoords : leftCoords;\n    } else {\n      // eslint-disable-next-line no-magic-numbers\n      const isShort = (m, middle) => m.length - middle < 4;\n      const shortPath =\n        bottomRight > bottomLeft\n          ? isShort(rightMoves, rightMiddle)\n          : isShort(leftMoves, leftMiddle);\n      // eslint-disable-next-line no-magic-numbers\n      const rightOffset = shortPath ? -1 : -3;\n\n      moves = [\n        ...leftMoves.slice(0, leftMiddle + 2),\n        ...rightMoves.slice(rightOffset),\n      ];\n      coords = [\n        ...leftCoords.slice(0, leftMiddle + 2),\n        ...rightCoords.slice(rightOffset),\n      ];\n    }\n    const middle = moves.indexOf(\"L\");\n    const subMoves = moves.slice(middle, -1);\n    const subCoords = coords.slice(middle, -1);\n    return subMoves.map((m, i) => ({\n      command: m,\n      coords: subCoords[i].split(\",\"),\n    }));\n  };\n\n  const topPath = getTopPath();\n  const bottomPath = getBottomPath();\n  const moves = [...topPath, ...bottomPath];\n  const path = moves.reduce(\n    (memo, move) => `${memo}${move.command} ${move.coords.join()}`,\n    \"\",\n  );\n  return `${path} z`;\n};\n\nexport const getBarPath = (props: BarProps, width: number, cornerRadius) => {\n  if (props.getPath) {\n    return getCustomBarPath(props, width);\n  }\n\n  return props.horizontal\n    ? getHorizontalBarPath(props, width, cornerRadius)\n    : getVerticalBarPath(props, width, cornerRadius);\n};\n\nexport const getPolarBarPath = (props: BarProps, cornerRadius) => {\n  // TODO Radial bars\n  return getVerticalPolarBarPath(props, cornerRadius);\n};\n"
  },
  {
    "path": "packages/victory-bar/src/victory-bar.test.tsx",
    "content": "import * as React from \"react\";\nimport { render, fireEvent, screen } from \"@testing-library/react\";\nimport { VictoryChart } from \"victory-chart\";\nimport { Helpers } from \"victory-core\";\n\nimport { isBar, getBarHeight } from \"../../../test/helpers\";\nimport { Bar } from \"./bar\";\nimport { VictoryBar } from \"./victory-bar\";\n\ndescribe(\"components/victory-bar\", () => {\n  describe(\"default component rendering\", () => {\n    it(\"attaches safe user props to the container component\", () => {\n      render(\n        <VictoryBar\n          data-testid=\"victory-bar\"\n          aria-label=\"Chart\"\n          unsafe-prop=\"test\"\n        />,\n      );\n\n      const container = screen.getByTestId(\"victory-bar\");\n      expect(screen.getByLabelText(\"Chart\")).toBeDefined();\n      expect(container).not.toHaveAttribute(\"unsafe-prop\");\n      expect(container.tagName).toEqual(\"svg\");\n    });\n\n    it(\"attaches safe user props to the group component if the component is rendered inside a VictoryChart\", () => {\n      render(\n        <VictoryBar\n          data-testid=\"victory-bar\"\n          aria-label=\"Chart\"\n          unsafe-prop=\"test\"\n        />,\n        { wrapper: VictoryChart },\n      );\n\n      const container = screen.getByTestId(\"victory-bar\");\n      expect(screen.getByLabelText(\"Chart\")).toBeDefined();\n      expect(container).not.toHaveAttribute(\"unsafe-prop\");\n      expect(container.tagName).toEqual(\"g\");\n    });\n\n    it(\"renders an svg with the correct width and height\", () => {\n      const { container } = render(<VictoryBar />);\n      const svg = container.querySelector(\"svg\");\n      expect(svg?.getAttribute(\"style\")).toContain(\"width: 100%; height: 100%\");\n    });\n\n    it(\"renders an svg with the correct viewBox\", () => {\n      const { container } = render(<VictoryBar />);\n      const svg = container.querySelector(\"svg\");\n      const viewBoxValue = `0 0 ${450} ${300}`;\n      expect(svg?.getAttribute(\"viewBox\")).toEqual(viewBoxValue);\n    });\n\n    it(\"renders 4 bars\", () => {\n      const { container } = render(<VictoryBar />);\n      const bars = container.querySelectorAll(\"path\");\n      expect(bars.length).toEqual(4);\n    });\n\n    it(\"renders each bar as a rectangle\", () => {\n      const { container } = render(<VictoryBar />);\n      const barCommandStrings = Array.from(\n        container.querySelectorAll(\"path\"),\n      ).map((bar) => bar.getAttribute(\"d\"));\n      barCommandStrings.forEach((commandString) => {\n        expect(isBar(commandString)).toBeTruthy();\n      });\n    });\n  });\n\n  describe(\"rendering data\", () => {\n    it(\"renders bars for {x, y} shaped data (default)\", () => {\n      const data = Helpers.range(10).map((i) => ({ x: i, y: i }));\n      const { container } = render(<VictoryBar data={data} />);\n      const bars = container.querySelectorAll(\"path\");\n      expect(bars.length).toEqual(10);\n    });\n\n    it(\"renders ordered bars when sortKey is passed\", () => {\n      const data = Helpers.range(5)\n        .map((i) => ({ x: i, y: i }))\n        .reverse();\n      const { container } = render(<VictoryBar data={data} sortKey=\"x\" />);\n      const barHeight = Array.from(container.querySelectorAll(\"path\")).map(\n        (bar) => {\n          const commandString = bar.getAttribute(\"d\");\n          return getBarHeight(commandString);\n        },\n      );\n\n      const ascendingBars = [...barHeight].sort((a, b) => a - b);\n\n      expect(barHeight).toEqual(ascendingBars);\n    });\n\n    it(\"renders reverse ordered bars when sortOrder is descending\", () => {\n      const data = Helpers.range(5)\n        .map((i) => ({ x: i, y: i }))\n        .reverse();\n      const { container } = render(\n        <VictoryBar data={data} sortKey=\"x\" sortOrder=\"descending\" />,\n      );\n      const barHeight = Array.from(container.querySelectorAll(\"path\")).map(\n        (bar) => {\n          const commandString = bar.getAttribute(\"d\");\n          return getBarHeight(commandString);\n        },\n      );\n      const descendingBars = [...barHeight].sort((a, b) => b - a);\n\n      expect(barHeight).toEqual(descendingBars);\n    });\n\n    it(\"renders bars for array-shaped data\", () => {\n      const data = Helpers.range(20).map((i) => [i, i]);\n      const { container } = render(<VictoryBar data={data} x={0} y={1} />);\n      const bars = container.querySelectorAll(\"path\");\n      expect(bars).toHaveLength(20);\n    });\n\n    it(\"renders bars for deeply-nested data\", () => {\n      const data = Helpers.range(8).map((i) => ({\n        a: { b: [{ x: i, y: i }] },\n      }));\n      const { container } = render(\n        <VictoryBar data={data} x=\"a.b[0].x\" y=\"a.b[0].y\" />,\n      );\n      const bars = container.querySelectorAll(\"path\");\n      expect(bars).toHaveLength(8);\n    });\n\n    it(\"renders bars values with null accessor\", () => {\n      const data = Helpers.range(8);\n      const { container } = render(\n        // @ts-expect-error \"'null' is not assignable to 'x'\"\n        <VictoryBar data={data} x={null} y={null} />,\n      );\n      const bars = container.querySelectorAll(\"path\");\n      expect(bars).toHaveLength(8);\n    });\n\n    it(\"renders bars with appropriate relative heights\", () => {\n      const { container } = render(\n        <VictoryBar\n          data={[\n            { x: 1, y: 1 },\n            { x: 2, y: 2 },\n            { x: 3, y: 3 },\n          ]}\n        />,\n      );\n      const bars = Array.from(container.querySelectorAll(\"path\"));\n      const heights = bars.map((bar) => {\n        const commandString = bar.getAttribute(\"d\");\n        return getBarHeight(commandString);\n      });\n\n      expect(Math.trunc(heights[1] / 2)).toEqual(Math.trunc(heights[0]));\n      expect(((heights[2] / 3) * 2).toFixed(3)).toEqual(heights[1].toFixed(3));\n    });\n\n    it(\"does not render data with null x or y values\", () => {\n      const data = [\n        { x: 1, y: 2 },\n        { x: null, y: 4 },\n        { x: 5, y: null },\n      ];\n      const { container } = render(<VictoryBar data={data} />);\n      expect(container.querySelectorAll(\"path\")).toHaveLength(1);\n    });\n  });\n\n  describe(\"event handling\", () => {\n    const clickHandler = jest.fn();\n\n    beforeEach(() => {\n      clickHandler.mockReset();\n    });\n\n    it(\"attaches an event to the parent svg\", () => {\n      const { container } = render(\n        <VictoryBar\n          events={[\n            {\n              target: \"parent\",\n              eventHandlers: { onClick: clickHandler },\n            },\n          ]}\n        />,\n      );\n      const bar = container.querySelector(\"path\");\n      fireEvent.click(bar!);\n\n      expect(clickHandler).toHaveBeenCalled();\n    });\n\n    it(\"attaches an event to data\", () => {\n      const data = [\n        { x: 0, y: 0, label: \"0\" },\n        { x: 1, y: 1, label: \"1\" },\n        { x: 2, y: 2, label: \"2\" },\n      ];\n      const { container } = render(\n        <VictoryBar\n          data={data}\n          events={[\n            {\n              target: \"data\",\n              eventHandlers: { onClick: clickHandler },\n            },\n          ]}\n        />,\n      );\n      const bars = container.querySelectorAll(\"path\");\n      bars.forEach((bar, index) => {\n        clickHandler.mockReset();\n        fireEvent.click(bar);\n        expect(clickHandler).toHaveBeenCalled();\n\n        const barContext = clickHandler.mock.calls[0][1];\n        expect(barContext.datum.x).toEqual(data[index].x);\n      });\n    });\n\n    it(\"attaches an event to a label\", () => {\n      const data = [\n        { x: 0, y: 0, label: \"label 0\" },\n        { x: 1, y: 1, label: \"label 1\" },\n        { x: 2, y: 2, label: \"label 2\" },\n      ];\n\n      render(\n        <VictoryBar\n          data={data}\n          labels={({ datum }) => datum.label}\n          events={[\n            {\n              target: \"labels\",\n              eventHandlers: { onClick: clickHandler },\n            },\n          ]}\n        />,\n      );\n      const label = screen.getByText(\"label 1\");\n\n      fireEvent.click(label);\n\n      expect(clickHandler).toHaveBeenCalled();\n    });\n  });\n\n  describe(\"accessibility\", () => {\n    it(\"adds an aria role to each bar in the series\", () => {\n      const data = Helpers.range(10).map((y, x) => ({ x, y }));\n      render(<VictoryBar data={data} />);\n      const presentationElements = screen.getAllByRole(\"presentation\");\n      expect(presentationElements).toHaveLength(11); // bars plus container\n    });\n\n    it(\"applies aria-label and tabIndex to the Bar primitive\", () => {\n      const data = Helpers.range(5, 11).map((y, x) => ({ y, x }));\n      const { container } = render(\n        <VictoryBar\n          data={data}\n          dataComponent={\n            <Bar\n              ariaLabel={({ datum }) => `x: ${datum.x}`}\n              tabIndex={({ index }) => (index as number) + 1}\n            />\n          }\n        />,\n      );\n\n      container.querySelectorAll(\"path\").forEach((bar, index) => {\n        expect(parseInt(bar.getAttribute(\"tabindex\")!)).toEqual(index + 1);\n        expect(bar.getAttribute(\"aria-label\")).toEqual(`x: ${data[index].x}`);\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-bar/src/victory-bar.tsx",
    "content": "import React from \"react\";\nimport { getBaseProps } from \"./helper-methods\";\nimport { Bar } from \"./bar\";\nimport {\n  Helpers,\n  VictoryLabel,\n  VictoryContainer,\n  VictoryTheme,\n  addEvents,\n  Data,\n  Domain,\n  UserProps,\n  EventPropTypeInterface,\n  NumberOrCallback,\n  StringOrNumberOrCallback,\n  VictoryClipContainer,\n  VictoryCommonProps,\n  VictoryDatableProps,\n  VictoryMultiLabelableProps,\n  VictoryStyleInterface,\n  EventsMixinClass,\n} from \"victory-core\";\n\nexport type VictoryBarCornerRadiusKey =\n  | \"top\"\n  | \"bottom\"\n  | \"topLeft\"\n  | \"topRight\"\n  | \"bottomLeft\"\n  | \"bottomRight\";\n\nexport type VictoryBarCornerRadiusObject = Partial<\n  Record<VictoryBarCornerRadiusKey, NumberOrCallback>\n>;\n\nexport type VictoryBarTTargetType = \"data\" | \"labels\" | \"parent\";\n\nexport type VictoryBarAlignmentType = \"start\" | \"middle\" | \"end\";\n\nexport interface VictoryBarProps\n  extends VictoryCommonProps,\n    VictoryDatableProps,\n    VictoryMultiLabelableProps {\n  alignment?: VictoryBarAlignmentType;\n  barRatio?: number;\n  barWidth?: NumberOrCallback;\n  cornerRadius?: NumberOrCallback | VictoryBarCornerRadiusObject;\n  events?: EventPropTypeInterface<\n    VictoryBarTTargetType,\n    number | string | number[] | string[]\n  >[];\n  eventKey?: StringOrNumberOrCallback;\n  getPath?: (props: VictoryBarProps) => string;\n  style?: VictoryStyleInterface;\n}\n\nconst fallbackProps = {\n  width: 450,\n  height: 300,\n  padding: 50,\n};\n\nconst defaultData = [\n  { x: 1, y: 1 },\n  { x: 2, y: 2 },\n  { x: 3, y: 3 },\n  { x: 4, y: 4 },\n];\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface VictoryBarBase extends EventsMixinClass<VictoryBarProps> {}\n\n/**\n * Draw SVG bar charts with React. VictoryBar is a composable component, so it doesn\"t include axes\n * Check out VictoryChart for complete bar charts and more.\n */\nclass VictoryBarBase extends React.Component<VictoryBarProps> {\n  static animationWhitelist: (keyof VictoryBarProps)[] = [\n    \"data\",\n    \"domain\",\n    \"height\",\n    \"padding\",\n    \"style\",\n    \"width\",\n  ];\n\n  static displayName = \"VictoryBar\";\n\n  static role = \"bar\";\n\n  static defaultTransitions = {\n    onLoad: {\n      duration: 2000,\n      before: () => ({ _y: 0, _y1: 0, _y0: 0 }),\n      after: (datum) => ({ _y: datum._y, _y1: datum._y1, _y0: datum._y0 }),\n    },\n    onExit: {\n      duration: 500,\n      before: () => ({ _y: 0, yOffset: 0 }),\n    },\n    onEnter: {\n      duration: 500,\n      before: () => ({ _y: 0, _y1: 0, _y0: 0 }),\n      after: (datum) => ({ _y: datum._y, _y1: datum._y1, _y0: datum._y0 }),\n    },\n  };\n\n  static defaultProps: VictoryBarProps = {\n    containerComponent: <VictoryContainer />,\n    data: defaultData,\n    dataComponent: <Bar />,\n    groupComponent: <g role=\"presentation\" />,\n    labelComponent: <VictoryLabel />,\n    samples: 50,\n    sortOrder: \"ascending\",\n    standalone: true,\n    theme: VictoryTheme.grayscale,\n  };\n\n  static getDomain = Domain.getDomainWithZero;\n  static getData = Data.getData;\n  static getBaseProps(props: VictoryBarProps) {\n    return getBaseProps(props, fallbackProps);\n  }\n  static expectedComponents: (keyof VictoryBarProps)[] = [\n    \"dataComponent\",\n    \"labelComponent\",\n    \"groupComponent\",\n    \"containerComponent\",\n  ];\n  // passed to addEvents.renderData to prevent data props with undefined _x or _y from excluding data from render.\n  // used when inside of VictoryZoomContainer\n  static shouldRenderDatum = () => true;\n  // Overridden in native versions\n  shouldAnimate() {\n    return !!this.props.animate;\n  }\n\n  render(): React.ReactElement {\n    const { animationWhitelist, role } = VictoryBar;\n    const props = Helpers.modifyProps(this.props, fallbackProps, role);\n\n    if (this.shouldAnimate()) {\n      return this.animateComponent(props, animationWhitelist);\n    }\n\n    let children;\n    // when inside a zoom container (the only place VictoryClipContainer is used), all data\n    // should be renderable so bars won't dissappear before they've fully exited the container's bounds\n    // see https://github.com/FormidableLabs/victory/pull/2970\n    if (props.groupComponent?.type === VictoryClipContainer) {\n      children = this.renderData(props, VictoryBarBase.shouldRenderDatum);\n    } else {\n      children = this.renderData(props);\n    }\n\n    const component = props.standalone\n      ? this.renderContainer(props.containerComponent, children)\n      : children;\n\n    return UserProps.withSafeUserProps(component, props);\n  }\n}\n\nexport const VictoryBar = addEvents(VictoryBarBase);\n"
  },
  {
    "path": "packages/victory-bar/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-bar/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-box-plot/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-box-plot/CHANGELOG.md",
    "content": "# victory-box-plot\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n### Patch Changes\n\n- Remove deprecated babel-plugin-lodash plugin ([#2965](https://github.com/FormidableLabs/victory/pull/2965))\n\n## 37.3.2\n\n## 37.3.1\n\n## 37.3.0\n\n## 37.2.0\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n## 37.0.1\n\n### Patch Changes\n\n- Fix the signature of class static functions in components ([#2840](https://github.com/FormidableLabs/victory/pull/2840))\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n### Patch Changes\n\n- Replace lodash keys with native code ([#2811](https://github.com/FormidableLabs/victory/pull/2811))\n\n* Replace lodash array utils with native code ([#2810](https://github.com/FormidableLabs/victory/pull/2810))\n\n- Replace lodash isNil and isNan with native code ([#2800](https://github.com/FormidableLabs/victory/pull/2800))\n\n* Replace lodash isFunction with native code ([#2802](https://github.com/FormidableLabs/victory/pull/2802))\n\n## 36.9.1\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n### Patch Changes\n\n- Migrate victory-native to TypeScript ([#2739](https://github.com/FormidableLabs/victory/pull/2739))\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n## 36.8.4\n\n## 36.8.3\n\n### Patch Changes\n\n- Refactor param reassignments ([#2724](https://github.com/FormidableLabs/victory/pull/2724))\n\n## 36.8.2\n\n## 36.8.1\n\n## 36.8.0\n\n## 36.7.0\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.8\n  - victory-vendor@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.7\n  - victory-vendor@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.6\n  - victory-vendor@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416), [`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-core@36.6.5\n  - victory-vendor@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n- Updated dependencies [[`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-core@36.6.4\n  - victory-vendor@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-core@36.6.3\n  - victory-vendor@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.2\n  - victory-vendor@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- Updated dependencies [[`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-core@36.6.1\n  - victory-vendor@36.6.1\n\n## 36.6.0\n\n### Minor Changes\n\n- Migrated victory-box-plot to TypeScript ([#2387](https://github.com/FormidableLabs/victory/pull/2387))\n\n### Patch Changes\n\n- Update source code with minor lint-based improvements (see [#2236](https://github.com/FormidableLabs/victory/issues/2236)). ([#2403](https://github.com/FormidableLabs/victory/pull/2403))\n\n- Updated dependencies [[`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-core@36.6.0\n  - victory-vendor@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-box-plot/README.md",
    "content": "# VictoryBoxPlot\n\n`victory-box-plot@^30.0.0` exports `VictoryBoxPlot` component\n\nTo view documentation for `VictoryBoxPlot` please see https://commerce.nearform.com/open-source/victory/docs/victory-box-plot\n\nTo suggest an addition or correction to this documentation please see https://github.com/FormidableLabs/victory/blob/main/docs/src/content/docs/victory-boxplot.md\n"
  },
  {
    "path": "packages/victory-box-plot/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-box-plot/package.json",
    "content": "{\n  \"name\": \"victory-box-plot\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Box Plot Component for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"lodash\": \"^4.17.19\",\n    \"victory-core\": \"37.3.6\",\n    \"victory-vendor\": \"37.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"devDependencies\": {\n    \"victory-chart\": \"*\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\",\n        \"../victory-vendor:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:cjs\",\n        \"../victory-vendor:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\",\n        \"../victory-vendor:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\",\n        \"../victory-vendor:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-chart:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-vendor:build\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-chart:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-vendor:build\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-chart:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:build\",\n        \"../victory-vendor:build\",\n        \"../victory-chart:build\",\n        \"../victory-voronoi:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-box-plot/src/helper-methods.tsx",
    "content": "import defaults from \"lodash/defaults\";\nimport groupBy from \"lodash/groupBy\";\nimport orderBy from \"lodash/orderBy\";\nimport uniq from \"lodash/uniq\";\n\nimport { Helpers, Scale, Domain, Data, Collection } from \"victory-core\";\nimport {\n  min as d3Min,\n  max as d3Max,\n  quantile as d3Quantile,\n} from \"victory-vendor/d3-array\";\nimport { VictoryBoxPlotProps } from \"./victory-box-plot\";\n\nconst TYPES = [\"max\", \"min\", \"median\", \"q1\", \"q3\"];\n\nconst checkProcessedData = (data) => {\n  /* check if the data is pre-processed. start by checking that it has\n  all required quartile attributes. */\n  const hasQuartileAttributes = data.every((datum) => {\n    return TYPES.every((val) => typeof datum[`_${val}`] !== \"undefined\");\n  });\n\n  if (hasQuartileAttributes) {\n    // check that the independent variable is distinct\n    const values = data.map((d) => d._x);\n    if (!uniq(values).length === values.length) {\n      throw new Error(`\n        data prop may only take an array of objects with a unique\n        independent variable. Make sure your x values are distinct.\n      `);\n    }\n    return true;\n  }\n  return false;\n};\n\nconst nanToNull = (val) => (Number.isNaN(val) ? null : val);\n\nconst getSummaryStatistics = (data) => {\n  const dependentVars = data.map((datum) => datum._y);\n  const quartiles = {\n    _q1: nanToNull(d3Quantile(dependentVars, 0.25)), // eslint-disable-line no-magic-numbers\n    _q3: nanToNull(d3Quantile(dependentVars, 0.75)), // eslint-disable-line no-magic-numbers\n    _min: nanToNull(d3Min(dependentVars)),\n    _median: nanToNull(d3Quantile(dependentVars, 0.5)),\n    _max: nanToNull(d3Max(dependentVars)),\n  };\n\n  return Object.assign({}, data[0], quartiles, { _y: data[0]._y });\n};\n\nconst processData = (data) => {\n  /* check if the data is coming in a pre-processed form,\n  i.e. { x || y, min, max, q1, q3, median }. if not, process it. */\n  const isProcessed = checkProcessedData(data);\n  if (!isProcessed) {\n    // check if the data is coming with x or y values as an array\n    const arrayX = data.every((datum) => Array.isArray(datum._x));\n    const arrayY = data.every((datum) => Array.isArray(datum._y));\n    const sortKey = \"_y\";\n    const groupKey = \"_x\";\n    if (arrayX) {\n      throw new Error(`\n        data should not be given as in array for x\n      `);\n    } else if (arrayY) {\n      /* generate summary statistics for each datum. to do this, flatten\n      the depedentVarArray and process each datum separately */\n      return data.map((datum) => {\n        const dataArray = datum[sortKey].map((d) =>\n          Object.assign({}, datum, { [sortKey]: d }),\n        );\n        const sortedData = orderBy(dataArray, sortKey);\n        return getSummaryStatistics(sortedData);\n      });\n    } else {\n      /* Group data by independent variable and generate summary statistics for each group */\n      const groupedData = groupBy(data, groupKey);\n      return Object.keys(groupedData).map((key) => {\n        const datum = groupedData[key];\n        const sortedData = orderBy(datum, sortKey);\n        return getSummaryStatistics(sortedData);\n      });\n    }\n  } else {\n    return data;\n  }\n};\n\nexport const getData = (props) => {\n  const accessorTypes = TYPES.concat(\"x\", \"y\");\n  const formattedData = Data.formatData(props.data, props, accessorTypes);\n  return formattedData.length ? processData(formattedData) : [];\n};\n\nconst reduceDataset = (dataset, props, axis) => {\n  const minDomain = Domain.getMinFromProps(props, axis);\n  const maxDomain = Domain.getMaxFromProps(props, axis);\n\n  const minData =\n    minDomain !== undefined\n      ? minDomain\n      : dataset.reduce((memo, datum) => {\n          return memo < datum[`_${axis}`] ? memo : datum[`_${axis}`];\n        }, Infinity);\n  const maxData =\n    maxDomain !== undefined\n      ? maxDomain\n      : dataset.reduce((memo, datum) => {\n          return memo > datum[`_${axis}`] ? memo : datum[`_${axis}`];\n        }, -Infinity);\n  return Domain.getDomainFromMinMax(minData, maxData);\n};\n\nconst getDomainFromMinMaxValues = (dataset, props, axis) => {\n  const minDomain = Domain.getMinFromProps(props, axis);\n  const maxDomain = Domain.getMaxFromProps(props, axis);\n  const minData =\n    minDomain !== undefined\n      ? minDomain\n      : dataset.reduce((memo, datum) => {\n          return memo < datum._min ? memo : datum._min;\n        }, Infinity);\n  const maxData =\n    maxDomain !== undefined\n      ? maxDomain\n      : dataset.reduce((memo, datum) => {\n          return memo > datum._max ? memo : datum._max;\n        }, -Infinity);\n  return Domain.getDomainFromMinMax(minData, maxData);\n};\n\nconst getDomainFromData = (props, axis) => {\n  const minDomain = Domain.getMinFromProps(props, axis);\n  const maxDomain = Domain.getMaxFromProps(props, axis);\n  const dataset = getData(props);\n  if (dataset.length < 1) {\n    return minDomain !== undefined && maxDomain !== undefined\n      ? Domain.getDomainFromMinMax(minDomain, maxDomain)\n      : undefined;\n  }\n  return axis === \"y\"\n    ? getDomainFromMinMaxValues(dataset, props, axis)\n    : reduceDataset(dataset, props, axis);\n};\n\nexport const getDomain = (props, axis) => {\n  return Domain.createDomainFunction(getDomainFromData)(props, axis);\n};\n\nconst getLabelStyle = (props, styleObject, namespace?) => {\n  const component = props[`${namespace}LabelComponent`] || props.labelComponent;\n  const baseStyle = styleObject[`${namespace}Labels`] || styleObject.labels;\n  if (!Helpers.isTooltip(component)) {\n    return baseStyle;\n  }\n  const tooltipTheme = (props.theme && props.theme.tooltip) || {};\n  return defaults({}, tooltipTheme.style, baseStyle);\n};\n\nconst getStyles = (props, styleObject: VictoryBoxPlotProps[\"style\"] = {}) => {\n  if (props.disableInlineStyles) {\n    return {};\n  }\n  const style = props.style || {};\n  const parentStyles = { height: \"100%\", width: \"100%\" };\n  const labelStyles = defaults(\n    {},\n    style.labels,\n    getLabelStyle(props, styleObject),\n  );\n  const boxStyles = defaults({}, style.boxes, styleObject.boxes);\n  const whiskerStyles = defaults({}, style.whiskers, styleObject.whiskers);\n  return {\n    boxes: boxStyles,\n    labels: labelStyles,\n    parent: defaults({}, style.parent, styleObject.parent, parentStyles),\n    max: defaults({}, style.max, styleObject.max, whiskerStyles),\n    maxLabels: defaults(\n      {},\n      style.maxLabels,\n      getLabelStyle(props, styleObject, \"max\"),\n      labelStyles,\n    ),\n    median: defaults({}, style.median, styleObject.median, whiskerStyles),\n    medianLabels: defaults(\n      {},\n      style.medianLabels,\n      getLabelStyle(props, styleObject, \"median\"),\n      labelStyles,\n    ),\n    min: defaults({}, style.min, styleObject.min, whiskerStyles),\n    minLabels: defaults(\n      {},\n      style.minLabels,\n      getLabelStyle(props, styleObject, \"min\"),\n      labelStyles,\n    ),\n    q1: defaults({}, style.q1, styleObject.q1, boxStyles),\n    q1Labels: defaults(\n      {},\n      style.q1Labels,\n      getLabelStyle(props, styleObject, \"q1\"),\n      labelStyles,\n    ),\n    q3: defaults({}, style.q3, styleObject.q3, boxStyles),\n    q3Labels: defaults(\n      {},\n      style.q3Labels,\n      getLabelStyle(props, styleObject, \"q3\"),\n      labelStyles,\n    ),\n    whiskers: whiskerStyles,\n  };\n};\n\nconst getCalculatedValues = (props) => {\n  const { theme, horizontal } = props;\n  const data = getData(props);\n  const range = {\n    x: Helpers.getRange(props, \"x\"),\n    y: Helpers.getRange(props, \"y\"),\n  };\n  const domain = {\n    x: getDomain(props, \"x\"),\n    y: getDomain(props, \"y\"),\n  };\n  const scale = {\n    x: Scale.getBaseScale(props, \"x\")\n      .domain(domain.x)\n      .range(props.horizontal ? range.y : range.x),\n    y: Scale.getBaseScale(props, \"y\")\n      .domain(domain.y)\n      .range(props.horizontal ? range.x : range.y),\n  };\n  const defaultStyles =\n    theme && theme.boxplot && theme.boxplot.style ? theme.boxplot.style : {};\n  const style = getStyles(props, defaultStyles);\n  const defaultOrientation = props.horizontal ? \"top\" : \"right\";\n  const labelOrientation = props.labelOrientation || defaultOrientation;\n  const boxWidth = props.boxWidth || 1;\n  return { data, horizontal, domain, scale, style, labelOrientation, boxWidth };\n};\n\nconst getWhiskerProps = (props, type) => {\n  const {\n    horizontal,\n    style,\n    boxWidth,\n    whiskerWidth,\n    datum,\n    scale,\n    index,\n    disableInlineStyles,\n  } = props;\n  const { min, max, q1, q3, x, y } = props.positions;\n  const boxValue = type === \"min\" ? q1 : q3;\n  const whiskerValue = type === \"min\" ? min : max;\n  const width = typeof whiskerWidth === \"number\" ? whiskerWidth : boxWidth;\n  return {\n    datum,\n    index,\n    scale,\n    majorWhisker: {\n      x1: horizontal ? boxValue : x,\n      y1: horizontal ? y : boxValue,\n      x2: horizontal ? whiskerValue : x,\n      y2: horizontal ? y : whiskerValue,\n    },\n    minorWhisker: {\n      x1: horizontal ? whiskerValue : x - width / 2,\n      y1: horizontal ? y - width / 2 : whiskerValue,\n      x2: horizontal ? whiskerValue : x + width / 2,\n      y2: horizontal ? y + width / 2 : whiskerValue,\n    },\n    style: disableInlineStyles ? {} : style[type] || style.whisker,\n    disableInlineStyles,\n  };\n};\n\nconst getBoxProps = (props, type) => {\n  const {\n    horizontal,\n    boxWidth,\n    style,\n    scale,\n    datum,\n    index,\n    disableInlineStyles,\n  } = props;\n  const { median, q1, q3, x, y } = props.positions;\n  const defaultX = type === \"q1\" ? q1 : median;\n  const defaultY = type === \"q1\" ? median : q3;\n  const defaultWidth = type === \"q1\" ? median - q1 : q3 - median;\n  const defaultHeight = type === \"q1\" ? q1 - median : median - q3;\n  return {\n    datum,\n    scale,\n    index,\n    x: horizontal ? defaultX : x - boxWidth / 2,\n    y: horizontal ? y - boxWidth / 2 : defaultY,\n    width: horizontal ? defaultWidth : boxWidth,\n    height: horizontal ? boxWidth : defaultHeight,\n    style: disableInlineStyles ? {} : style[type] || style.boxes,\n    disableInlineStyles,\n  };\n};\n\nconst getMedianProps = (props) => {\n  const {\n    boxWidth,\n    horizontal,\n    style,\n    datum,\n    scale,\n    index,\n    disableInlineStyles,\n  } = props;\n  const { median, x, y } = props.positions;\n  return {\n    datum,\n    scale,\n    index,\n    x1: horizontal ? median : x - boxWidth / 2,\n    y1: horizontal ? y - boxWidth / 2 : median,\n    x2: horizontal ? median : x + boxWidth / 2,\n    y2: horizontal ? y + boxWidth / 2 : median,\n    style: disableInlineStyles ? {} : style.median,\n    disableInlineStyles,\n  };\n};\n\nconst getText = (props, type) => {\n  const { datum, index, labels } = props;\n  const propName = `${type}Labels`;\n  const labelProp = props[propName];\n  if (!labelProp && !labels) {\n    return null;\n  } else if (labelProp === true || labels === true) {\n    const dataName = `_${type}`;\n    return `${datum[dataName]}`;\n  }\n  return Array.isArray(labelProp) ? labelProp[index] : labelProp;\n};\n\nconst getOrientation = (labelOrientation, type) =>\n  (typeof labelOrientation === \"object\" && labelOrientation[type]) ||\n  labelOrientation;\n\nconst getLabelProps = (props, text, type) => {\n  const {\n    datum,\n    positions,\n    index,\n    boxWidth,\n    horizontal,\n    labelOrientation,\n    style,\n    theme,\n    disableInlineStyles,\n  } = props;\n  const orientation = getOrientation(labelOrientation, type);\n  const namespace = `${type}Labels`;\n  const labelStyle = style[namespace] || style.labels;\n  const defaultVerticalAnchors = {\n    top: \"end\",\n    bottom: \"start\",\n    left: \"middle\",\n    right: \"middle\",\n  };\n  const defaultTextAnchors = {\n    left: \"end\",\n    right: \"start\",\n    top: \"middle\",\n    bottom: \"middle\",\n  };\n  const whiskerWidth =\n    typeof props.whiskerWidth === \"number\" ? props.whiskerWidth : boxWidth;\n  const width = type === \"min\" || type === \"max\" ? whiskerWidth : boxWidth;\n\n  const getOffset = (coord) => {\n    const sign = {\n      x: orientation === \"left\" ? -1 : 1,\n      y: orientation === \"top\" ? -1 : 1,\n    };\n    return (sign[coord] * width) / 2 + sign[coord] * (labelStyle.padding || 0);\n  };\n\n  const labelProps = {\n    text,\n    datum,\n    index,\n    orientation,\n    style: disableInlineStyles ? {} : labelStyle,\n    y: horizontal ? positions.y : positions[type],\n    x: horizontal ? positions[type] : positions.x,\n    dy: horizontal ? getOffset(\"y\") : 0,\n    dx: horizontal ? 0 : getOffset(\"x\"),\n    textAnchor: labelStyle.textAnchor || defaultTextAnchors[orientation],\n    verticalAnchor:\n      labelStyle.verticalAnchor || defaultVerticalAnchors[orientation],\n    angle: labelStyle.angle,\n    horizontal,\n    disableInlineStyles,\n  };\n\n  const component = props[`${type}LabelComponent`];\n  if (!Helpers.isTooltip(component)) {\n    return labelProps;\n  }\n  const tooltipTheme = (theme && theme.tooltip) || {};\n  return defaults({}, labelProps, Helpers.omit(tooltipTheme, [\"style\"]));\n};\n\nconst getDataProps = (props, type) => {\n  if (type === \"median\") {\n    return getMedianProps(props);\n  } else if (type === \"min\" || type === \"max\") {\n    return getWhiskerProps(props, type);\n  }\n  return getBoxProps(props, type);\n};\n\n// if all data points on an axis are out of bound of the domain, filter out this datum\nconst isDatumOutOfBounds = (datum, domain) => {\n  const exists = (val) => val !== undefined;\n  const { _x, _min, _max } = datum;\n\n  const minDomainX = Collection.getMinValue(domain.x);\n  const maxDomainX = Collection.getMaxValue(domain.x);\n  const minDomainY = Collection.getMinValue(domain.y);\n  const maxDomainY = Collection.getMaxValue(domain.y);\n  const underMin = (min) => (val) => exists(val) && val < min;\n  const overMax = (max) => (val) => exists(val) && val > max;\n  const isUnderMinX = underMin(minDomainX);\n  const isUnderMinY = underMin(minDomainY);\n  const isOverMaxX = overMax(maxDomainX);\n  const isOverMaxY = overMax(maxDomainY);\n  let yOutOfBounds;\n  let xOutOfBounds;\n\n  // if x is out of the bounds of the domain\n  if (isUnderMinX(_x) || isOverMaxX(_x)) xOutOfBounds = true;\n  // if min/max are out of the bounds of the domain\n  if (\n    (isUnderMinY(_min) && isUnderMinY(_max)) ||\n    (isOverMaxY(_min) && isOverMaxY(_max))\n  )\n    yOutOfBounds = true;\n\n  return yOutOfBounds || xOutOfBounds;\n};\n\nexport const getBaseProps = (initialProps, fallbackProps) => {\n  const modifiedProps = Helpers.modifyProps(\n    initialProps,\n    fallbackProps,\n    \"boxplot\",\n  );\n  const props = Object.assign(\n    {},\n    modifiedProps,\n    getCalculatedValues(modifiedProps),\n  );\n  const {\n    groupComponent,\n    width,\n    height,\n    padding,\n    standalone,\n    theme,\n    events,\n    sharedEvents,\n    scale,\n    horizontal,\n    data,\n    style,\n    domain,\n    name,\n  } = props;\n  const initialChildProps = {\n    parent: {\n      domain,\n      scale,\n      width,\n      height,\n      data,\n      standalone,\n      name,\n      theme,\n      style: style.parent || {},\n      padding,\n      groupComponent,\n      horizontal,\n    },\n  };\n  const boxScale = scale.y;\n  return data.reduce((acc, datum, index) => {\n    const eventKey = !Helpers.isNil(datum.eventKey) ? datum.eventKey : index;\n\n    if (isDatumOutOfBounds(datum, domain)) return acc;\n\n    const positions = {\n      x: horizontal ? scale.y(datum._y) : scale.x(datum._x),\n      y: horizontal ? scale.x(datum._x) : scale.y(datum._y),\n      min: boxScale(datum._min),\n      max: boxScale(datum._max),\n      median: boxScale(datum._median),\n      q1: boxScale(datum._q1),\n      q3: boxScale(datum._q3),\n    };\n    const dataProps = Object.assign({ index, datum, positions }, props);\n    const dataObj = TYPES.reduce((memo, type) => {\n      memo[type] = getDataProps(dataProps, type);\n      return memo;\n    }, {});\n\n    acc[eventKey] = dataObj;\n\n    TYPES.forEach((type) => {\n      const labelText = getText(dataProps, type);\n      const labelProp = props.labels || props[`${type}Labels`];\n      if (\n        (labelText !== null && labelText !== undefined) ||\n        (labelProp && (events || sharedEvents))\n      ) {\n        const target = `${type}Labels`;\n        acc[eventKey][target] = getLabelProps(\n          Object.assign({}, props, dataProps),\n          labelText,\n          type,\n        );\n      }\n    });\n\n    return acc;\n  }, initialChildProps);\n};\n"
  },
  {
    "path": "packages/victory-box-plot/src/index.ts",
    "content": "export * from \"./victory-box-plot\";\n"
  },
  {
    "path": "packages/victory-box-plot/src/victory-box-plot.test.tsx",
    "content": "import { render, screen } from \"@testing-library/react\";\nimport React from \"react\";\nimport { VictoryChart } from \"victory-chart\";\nimport { Border, LineSegment, Whisker } from \"victory-core\";\n\nimport { VictoryBoxPlot } from \"./victory-box-plot\";\n\nconst TEST_GROUP_ID = \"test-group-id\";\nconst dataset = [\n  { x: 1, min: 1, max: 18, median: 8, q1: 5, q3: 15 },\n  { x: 2, min: 4, max: 20, median: 10, q1: 7, q3: 15 },\n  { x: 3, min: 3, max: 12, median: 6, q1: 5, q3: 10 },\n];\n\nconst TestGroup = ({ children }: { children?: React.ReactElement[] }) => {\n  return <g data-testid={TEST_GROUP_ID}>{children}</g>;\n};\n\nconst renderWithTestGroup = (data: any[] = dataset) => {\n  const { container } = render(\n    <VictoryBoxPlot data={data} groupComponent={<TestGroup />} />,\n  );\n  const groups = screen.getAllByTestId(TEST_GROUP_ID);\n\n  return { container, groups };\n};\n\ndescribe(\"components/victory-box-plot\", () => {\n  describe(\"default component rendering\", () => {\n    it(\"attaches safe user props to the container component\", () => {\n      render(\n        <VictoryBoxPlot\n          data-testid=\"victory-boxplot\"\n          aria-label=\"Chart\"\n          unsafe-prop=\"test\"\n        />,\n      );\n\n      const container = screen.getByTestId(\"victory-boxplot\");\n      expect(screen.getByLabelText(\"Chart\")).toBeDefined();\n      expect(container).not.toHaveAttribute(\"unsafe-prop\");\n      expect(container.nodeName).toEqual(\"svg\");\n    });\n\n    it(\"attaches safe user props to the group component if the component is rendered inside a VictoryChart\", () => {\n      render(\n        <VictoryBoxPlot\n          data-testid=\"victory-boxplot\"\n          aria-label=\"Chart\"\n          unsafe-prop=\"test\"\n        />,\n        { wrapper: VictoryChart },\n      );\n\n      const container = screen.getByTestId(\"victory-boxplot\");\n      expect(screen.getByLabelText(\"Chart\")).toBeDefined();\n      expect(container).not.toHaveAttribute(\"unsafe-prop\");\n      expect(container.nodeName).toEqual(\"g\");\n    });\n\n    it(\"renders an svg with the correct width and height\", () => {\n      const { container } = render(<VictoryBoxPlot data={dataset} />);\n      const svg = container.querySelector(\"svg\");\n      expect(svg?.getAttribute(\"style\")).toContain(\"width: 100%; height: 100%\");\n    });\n\n    it(\"renders an svg with the correct viewBox\", () => {\n      const { container } = render(<VictoryBoxPlot data={dataset} />);\n      const svg = container.querySelector(\"svg\");\n      const viewBoxValue = `0 0 ${450} ${300}`;\n      expect(svg?.getAttribute(\"viewBox\")).toEqual(viewBoxValue);\n    });\n\n    it(\"renders 3 points\", () => {\n      const { container } = render(<VictoryBoxPlot data={dataset} />);\n      const points = container.querySelectorAll(\"rect\");\n      // two boxes per point\n      expect(points).toHaveLength(6);\n    });\n  });\n\n  it(\"does not render data with null x or y values\", () => {\n    const data = [\n      { x: 1, y: 2 },\n      { x: 1, y: 3 },\n      { x: null, y: 2 },\n      { x: null, y: 3 },\n      { x: 2, y: null },\n      { x: 2, y: null },\n    ];\n    const { groups } = renderWithTestGroup(data);\n\n    expect(groups).toHaveLength(1);\n  });\n\n  it(\"does not render data with null y values when given an array\", () => {\n    const data = [\n      { x: 1, y: [1, 2, 3] },\n      { x: 1, y: [null, 2, 5] },\n    ];\n\n    const { groups } = renderWithTestGroup(data);\n\n    expect(groups).toHaveLength(1);\n  });\n\n  it(\"does not render data with null min, max, median, q1, or q3 values\", () => {\n    const data = [\n      { x: 1, min: 2, median: 5, max: 10, q1: 3, q3: 7 },\n      { x: 2, min: null, median: 4, max: 9, q1: 3, q3: 6 },\n      { x: 3, min: 1, median: null, max: 12, q1: 4, q3: 10 },\n      { x: 4, min: 3, median: 9, max: null, q1: 5, q3: 13 },\n      { x: 5, min: 2, median: 8, max: 15, q1: null, q3: 12 },\n      { x: 5, min: 2, median: 10, max: 20, q1: 8, q3: null },\n    ];\n\n    const { groups } = renderWithTestGroup(data);\n\n    expect(groups).toHaveLength(1);\n  });\n\n  describe(\"accessibility\", () => {\n    const buildLabel = (a, b) => `First value: ${a} Second value: ${b}`;\n    it(\"adds an aria role to each point in the series\", () => {\n      const { container } = render(<VictoryBoxPlot data={dataset} />);\n\n      container.querySelectorAll(\"rect\").forEach((box) => {\n        expect(box.getAttribute(\"role\")).toEqual(\"presentation\");\n      });\n    });\n\n    it(\"applies aria-label to whisker primitive\", () => {\n      render(\n        <VictoryBoxPlot\n          data={dataset}\n          maxComponent={\n            <Whisker\n              ariaLabel={({ datum }) => buildLabel(datum.x, datum._max)}\n              tabIndex={({ index }) => Number(index) + 1}\n            />\n          }\n        />,\n      );\n\n      dataset\n        .map(({ x, max }) => buildLabel(x, max))\n        .forEach((label, index) => {\n          const [labeledWhisker] = screen.getAllByLabelText(label);\n          expect(labeledWhisker).toBeDefined();\n          expect(labeledWhisker.getAttribute(\"tabindex\")).toEqual(\n            `${index + 1}`,\n          );\n        });\n    });\n\n    it(\"applies aria-label to border primitive\", () => {\n      render(\n        <VictoryBoxPlot\n          data={dataset}\n          q3Component={\n            <Border\n              ariaLabel={({ datum }) => buildLabel(datum.x, datum._q3)}\n              tabIndex={({ index }) => Number(index) + 1}\n            />\n          }\n        />,\n      );\n\n      dataset\n        .map(({ x, q3 }) => buildLabel(x, q3))\n        .forEach((label, index) => {\n          const labeledBorder = screen.getByLabelText(label);\n          expect(labeledBorder).toBeDefined();\n          expect(labeledBorder.getAttribute(\"tabindex\")).toEqual(\n            `${index + 1}`,\n          );\n        });\n    });\n\n    it(\"applies tabIndex and aria-label to line-segmnet primitive\", () => {\n      render(\n        <VictoryBoxPlot\n          data={dataset}\n          medianComponent={\n            <LineSegment\n              ariaLabel={({ datum }) => buildLabel(datum.x, datum._median)}\n              tabIndex={({ index }) => Number(index) + 1}\n            />\n          }\n        />,\n      );\n\n      dataset\n        .map(({ x, median }) => buildLabel(x, median))\n        .forEach((label, index) => {\n          const labeledLine = screen.getByLabelText(label);\n          expect(labeledLine).toBeDefined();\n          expect(labeledLine.getAttribute(\"tabindex\")).toEqual(`${index + 1}`);\n        });\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-box-plot/src/victory-box-plot.tsx",
    "content": "import React from \"react\";\nimport {\n  Helpers,\n  VictoryLabel,\n  addEvents,\n  LineSegment,\n  VictoryContainer,\n  VictoryTheme,\n  Box,\n  Whisker,\n  DefaultTransitions,\n  UserProps,\n  EventPropTypeInterface,\n  DomainPropType,\n  DomainPaddingPropType,\n  OrientationTypes,\n  StringOrNumberOrCallback,\n  VictoryDatableProps,\n  VictoryCommonProps,\n  VictoryStyleObject,\n  VictoryLabelStyleObject,\n  EventsMixinClass,\n} from \"victory-core\";\nimport { getDomain, getData, getBaseProps } from \"./helper-methods\";\n\nconst fallbackProps = {\n  width: 450,\n  height: 300,\n  padding: {\n    top: 20,\n    right: 20,\n    bottom: 20,\n    left: 20,\n  },\n};\n\nconst defaultData = [\n  { x: 1, min: 5, q1: 7, median: 12, q3: 18, max: 20 },\n  { x: 2, min: 2, q1: 5, median: 8, q3: 12, max: 15 },\n];\n\nconst options = {\n  components: [\n    { name: \"min\" },\n    { name: \"minLabels\" },\n    { name: \"max\" },\n    { name: \"maxLabels\" },\n    { name: \"median\" },\n    { name: \"medianLabels\" },\n    { name: \"q1\" },\n    { name: \"q1Labels\" },\n    { name: \"q3\" },\n    { name: \"q3Labels\" },\n    { name: \"parent\", index: \"parent\" },\n  ],\n};\n\nexport type VictoryBoxPlotLabelType =\n  | boolean\n  | (string | number)[]\n  | { (): any }\n  | { (data: any): string | null };\n\nexport interface VictoryBoxPlotStyleInterface {\n  parent?: VictoryStyleObject;\n  max?: VictoryStyleObject;\n  maxLabels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n  min?: VictoryStyleObject;\n  minLabels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n  median?: VictoryStyleObject;\n  medianLabels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n  q1?: VictoryStyleObject;\n  q1Labels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n  q3?: VictoryStyleObject;\n  q3Labels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n  boxes?: VictoryStyleObject;\n  whiskers?: VictoryStyleObject;\n}\n\nexport interface VictoryBoxPlotLabelOrientationInterface {\n  max?: OrientationTypes;\n  min?: OrientationTypes;\n  median?: OrientationTypes;\n  q1?: OrientationTypes;\n  q3?: OrientationTypes;\n}\n\nexport interface VictoryBoxPlotProps\n  extends VictoryCommonProps,\n    VictoryDatableProps {\n  boxWidth?: number;\n  datum?: any;\n  domain?: DomainPropType;\n  domainPadding?: DomainPaddingPropType;\n  events?: EventPropTypeInterface<string, StringOrNumberOrCallback>[];\n  eventKey?: StringOrNumberOrCallback;\n  horizontal?: boolean;\n  labelOrientation?: OrientationTypes | VictoryBoxPlotLabelOrientationInterface;\n  labels?: boolean;\n  max?: StringOrNumberOrCallback | string[];\n  maxComponent?: React.ReactElement;\n  maxLabelComponent?: React.ReactElement;\n  maxLabels?: VictoryBoxPlotLabelType;\n  median?: StringOrNumberOrCallback | string[];\n  medianComponent?: React.ReactElement;\n  medianLabelComponent?: React.ReactElement;\n  medianLabels?: VictoryBoxPlotLabelType;\n  min?: StringOrNumberOrCallback | string[];\n  minComponent?: React.ReactElement;\n  minLabelComponent?: React.ReactElement;\n  minLabels?: VictoryBoxPlotLabelType;\n  q1?: StringOrNumberOrCallback | string[];\n  q1Component?: React.ReactElement;\n  q1LabelComponent?: React.ReactElement;\n  q1Labels?: VictoryBoxPlotLabelType;\n  q3?: StringOrNumberOrCallback | string[];\n  q3Component?: React.ReactElement;\n  q3LabelComponent?: React.ReactElement;\n  q3Labels?: VictoryBoxPlotLabelType;\n  style?: VictoryBoxPlotStyleInterface;\n  text?: StringOrNumberOrCallback | string[];\n  whiskerWidth?: number;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface VictoryBoxPlotBase extends EventsMixinClass<VictoryBoxPlotProps> {}\n\nclass VictoryBoxPlotBase extends React.Component<VictoryBoxPlotProps> {\n  static animationWhitelist: Array<keyof VictoryBoxPlotProps> = [\n    \"data\",\n    \"domain\",\n    \"height\",\n    \"padding\",\n    \"style\",\n    \"width\",\n  ];\n\n  static displayName = \"VictoryBoxPlot\";\n  static role = \"boxplot\";\n  static defaultTransitions = DefaultTransitions.discreteTransitions();\n\n  static defaultProps: VictoryBoxPlotProps = {\n    containerComponent: <VictoryContainer />,\n    data: defaultData,\n    dataComponent: <Box />,\n    groupComponent: <g role=\"presentation\" />,\n    maxComponent: <Whisker />,\n    maxLabelComponent: <VictoryLabel />,\n    medianComponent: <LineSegment />,\n    medianLabelComponent: <VictoryLabel />,\n    minComponent: <Whisker />,\n    minLabelComponent: <VictoryLabel />,\n    q1Component: <Box />,\n    q1LabelComponent: <VictoryLabel />,\n    q3Component: <Box />,\n    q3LabelComponent: <VictoryLabel />,\n    samples: 50,\n    sortKey: \"x\",\n    sortOrder: \"ascending\",\n    standalone: true,\n    theme: VictoryTheme.grayscale,\n  };\n\n  static getDomain(props, axis) {\n    return getDomain(props, axis);\n  }\n  static getData(props) {\n    return getData(props);\n  }\n  static getBaseProps(props) {\n    return getBaseProps(props, fallbackProps);\n  }\n  static expectedComponents: Array<keyof VictoryBoxPlotProps> = [\n    \"maxComponent\",\n    \"maxLabelComponent\",\n    \"medianComponent\",\n    \"medianLabelComponent\",\n    \"minComponent\",\n    \"minLabelComponent\",\n    \"q1Component\",\n    \"q1LabelComponent\",\n    \"q3Component\",\n    \"q3LabelComponent\",\n    \"groupComponent\",\n    \"containerComponent\",\n  ];\n\n  renderBoxPlot(props) {\n    const types = [\"q1\", \"q3\", \"max\", \"min\", \"median\"];\n    const dataComponents = types\n      .map((type) => {\n        return this.dataKeys.reduce((validDataComponents, _key, index) => {\n          const baseComponent = props[`${type}Component`];\n          const componentProps = this.getComponentProps(\n            baseComponent,\n            type,\n            index,\n          );\n          if (this.shouldRenderDatum(componentProps.datum)) {\n            validDataComponents.push(\n              React.cloneElement(baseComponent, componentProps),\n            );\n          }\n          return validDataComponents;\n        }, [] as React.ReactElement[]);\n      })\n      .flat();\n\n    const labelComponents = types\n      .map((type) => {\n        const components = this.dataKeys.reduce(\n          (validComponents, _key, index) => {\n            const name = `${type}Labels`;\n            const baseComponent = props[`${type}LabelComponent`];\n            const labelProps = this.getComponentProps(\n              baseComponent,\n              name,\n              index,\n            );\n            if (labelProps.text !== undefined && labelProps.text !== null) {\n              validComponents.push(\n                React.cloneElement(baseComponent, labelProps),\n              );\n            }\n            return validComponents;\n          },\n          [] as React.ReactElement[],\n        );\n        return components.filter(Boolean);\n      })\n      .flat();\n\n    const children = [...dataComponents, ...labelComponents];\n    return this.renderContainer(props.groupComponent, children);\n  }\n\n  // Overridden in native versions\n  shouldAnimate() {\n    return !!this.props.animate;\n  }\n\n  shouldRenderDatum(datum) {\n    const hasX = !Helpers.isNil(datum._x);\n    const hasY = !Helpers.isNil(datum._y);\n    const hasSummaryStatistics =\n      !Helpers.isNil(datum._min) &&\n      !Helpers.isNil(datum._max) &&\n      !Helpers.isNil(datum._median) &&\n      !Helpers.isNil(datum._q1) &&\n      !Helpers.isNil(datum._q3);\n\n    return hasSummaryStatistics && (this.props.horizontal ? hasY : hasX);\n  }\n\n  render(): React.ReactElement {\n    const { animationWhitelist, role } = VictoryBoxPlot;\n    const props = Helpers.modifyProps(this.props, fallbackProps, role);\n\n    if (this.shouldAnimate()) {\n      return this.animateComponent(props, animationWhitelist);\n    }\n\n    const children = this.renderBoxPlot(props);\n    const component = props.standalone\n      ? this.renderContainer(props.containerComponent, children)\n      : children;\n\n    return UserProps.withSafeUserProps(component, props);\n  }\n}\n\nexport const VictoryBoxPlot = addEvents(VictoryBoxPlotBase, options);\n"
  },
  {
    "path": "packages/victory-box-plot/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-box-plot/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-brush-container/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-brush-container/CHANGELOG.md",
    "content": "# victory-brush-container\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n### Patch Changes\n\n- Remove deprecated babel-plugin-lodash plugin ([#2965](https://github.com/FormidableLabs/victory/pull/2965))\n\n## 37.3.2\n\n## 37.3.1\n\n## 37.3.0\n\n## 37.2.0\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Refactor containers and portal to function components ([#2799](https://github.com/FormidableLabs/victory/pull/2799))\n\n* Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n## 37.0.1\n\n### Patch Changes\n\n- Fix the signature of class static functions in components ([#2840](https://github.com/FormidableLabs/victory/pull/2840))\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n### Patch Changes\n\n- Improve types for brush container and candlestick ([#2794](https://github.com/FormidableLabs/victory/pull/2794))\n\n* Replace lodash array utils with native code ([#2810](https://github.com/FormidableLabs/victory/pull/2810))\n\n- Replace lodash values and mapValues with native code ([#2808](https://github.com/FormidableLabs/victory/pull/2808))\n\n* Replace lodash isFunction with native code ([#2802](https://github.com/FormidableLabs/victory/pull/2802))\n\n## 36.9.1\n\n### Patch Changes\n\n- Fix victory-native component prop types ([#2785](https://github.com/FormidableLabs/victory/pull/2785))\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n## 36.8.4\n\n## 36.8.3\n\n### Patch Changes\n\n- Refactor param reassignments ([#2724](https://github.com/FormidableLabs/victory/pull/2724))\n\n## 36.8.2\n\n## 36.8.1\n\n## 36.8.0\n\n## 36.7.0\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Improved the exported types (fixes [#2451](https://github.com/FormidableLabs/victory/issues/2451)) ([#2452](https://github.com/FormidableLabs/victory/pull/2452))\n\n- Updated dependencies []:\n  - victory-core@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-core@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n- Updated dependencies [[`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-core@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-core@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- Updated dependencies [[`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-core@36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Migrate victory-brush-container and victory-brush-line to TypeScript ([#2393](https://github.com/FormidableLabs/victory/pull/2393))\n\n* Update source code with minor lint-based improvements (see [#2236](https://github.com/FormidableLabs/victory/issues/2236)). ([#2403](https://github.com/FormidableLabs/victory/pull/2403))\n\n* Updated dependencies [[`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-core@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-brush-container/README.md",
    "content": "# VictoryBrushContainer\n\n`victory-brush-container@^30.0.0` exports `VictoryBrushContainer`, `brushContainerMixin` and `BrushHelpers`\n\nTo view documentation for `VictoryBrushContainer` please see https://commerce.nearform.com/open-source/victory/docs/victory-brush-container\n\nTo suggest an addition or correction to this documentation please see https://github.com/FormidableLabs/victory/blob/main/docs/src/content/docs/victory-brush-container.md\n"
  },
  {
    "path": "packages/victory-brush-container/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-brush-container/package.json",
    "content": "{\n  \"name\": \"victory-brush-container\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Interactive Brush Component for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"lodash\": \"^4.17.19\",\n    \"react-fast-compare\": \"^3.2.0\",\n    \"victory-core\": \"37.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:build\",\n        \"../victory-vendor:build\",\n        \"../victory-voronoi:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-brush-container/src/brush-helpers.test.tsx",
    "content": "import { BrushHelpers } from \"./brush-helpers\";\n\ndescribe(\"containers/brush-helpers\", () => {\n  const { withinBounds, constrainBox } = BrushHelpers;\n  describe(\"withinBounds\", () => {\n    it(\"returns true when within bounds\", () => {\n      const point = { x: 1, y: 1 };\n      const bounds = { x1: 0, x2: 2, y1: 0, y2: 2 };\n      const isWithinBoundsResults = withinBounds(point, bounds);\n\n      expect(isWithinBoundsResults).toBeTruthy();\n    });\n\n    it(\"returns false when not within bounds\", () => {\n      const point = { x: 10, y: 1 };\n      const bounds = { x1: 0, x2: 2, y1: 0, y2: 2 };\n      const isWithinBoundsResults = withinBounds(point, bounds);\n\n      expect(isWithinBoundsResults).toBeFalsy();\n    });\n\n    it(\"returns true when within bounds using dates\", () => {\n      const point = { x: new Date(\"1/2/2022\"), y: 1 };\n      const bounds = {\n        x1: new Date(\"1/1/2022\"),\n        x2: new Date(\"2/1/2022\"),\n        y1: 0,\n        y2: 2,\n      };\n      const isWithinBoundsResults = withinBounds(point, bounds);\n\n      expect(isWithinBoundsResults).toBeTruthy();\n    });\n\n    it(\"returns false when not within bounds using dates\", () => {\n      const point = { x: new Date(\"3/2/2022\"), y: 1 };\n      const bounds = {\n        x1: new Date(\"1/1/2022\"),\n        x2: new Date(\"2/1/2022\"),\n        y1: 0,\n        y2: 2,\n      };\n      const isWithinBoundsResults = withinBounds(point, bounds);\n\n      expect(isWithinBoundsResults).toBeFalsy();\n    });\n  });\n\n  describe(\"constrainBox\", () => {\n    it(\"returns the correct box\", () => {\n      const fullDomainBox = { x1: 0, x2: 2, y1: 0, y2: 2 };\n      const box = { x1: 1, x2: 2, y1: 1, y2: 2 };\n      const constrainBoxResult = constrainBox(box, fullDomainBox);\n\n      expect(constrainBoxResult).toEqual({ x1: 1, y1: 1, x2: 2, y2: 2 });\n    });\n\n    it(\"returns the correct box when x axis consists of dates\", () => {\n      const fullDomainBox = {\n        x1: new Date(\"1/2/2022 PST\"),\n        x2: new Date(\"2/1/2022 PST\"),\n        y1: 0,\n        y2: 2,\n      };\n      const box = {\n        x1: new Date(\"1/1/2022 PST\"),\n        x2: new Date(\"1/10/2022 PST\"),\n        y1: 1,\n        y2: 2,\n      };\n      const constrainBoxResult = constrainBox(box, fullDomainBox);\n\n      expect(constrainBoxResult).toEqual({\n        x1: 1641110400000,\n        y1: 1,\n        x2: 1641888000000,\n        y2: 2,\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-brush-container/src/brush-helpers.ts",
    "content": "import defaults from \"lodash/defaults\";\nimport throttle from \"lodash/throttle\";\n\nimport { Helpers as CoreHelpers, Selection } from \"victory-core\";\nimport isEqual from \"react-fast-compare\";\n\nconst Helpers = {\n  getDimension(props) {\n    const { horizontal, brushDimension } = props;\n    if (!horizontal || !brushDimension) {\n      return brushDimension;\n    }\n    return brushDimension === \"x\" ? \"y\" : \"x\";\n  },\n\n  withinBounds(point, bounds, padding?) {\n    const { x1, x2, y1, y2 } = CoreHelpers.mapValues(bounds, Number);\n    const { x, y } = CoreHelpers.mapValues(point, Number);\n    const paddingValue = padding ? padding / 2 : 0;\n    return (\n      x + paddingValue >= Math.min(x1, x2) &&\n      x - paddingValue <= Math.max(x1, x2) &&\n      y + paddingValue >= Math.min(y1, y2) &&\n      y - paddingValue <= Math.max(y1, y2)\n    );\n  },\n\n  getDomainBox(props, fullDomain, selectedDomain?) {\n    const brushDimension = this.getDimension(props);\n    const fullDomainObject = defaults({}, fullDomain, props.domain);\n    const selectedDomainObject = defaults({}, selectedDomain, fullDomainObject);\n    const fullCoords = Selection.getDomainCoordinates(props, fullDomainObject);\n    const selectedCoords = Selection.getDomainCoordinates(\n      props,\n      selectedDomainObject,\n    );\n\n    return {\n      x1:\n        brushDimension !== \"y\"\n          ? Math.min(...selectedCoords.x)\n          : Math.min(...fullCoords.x),\n      x2:\n        brushDimension !== \"y\"\n          ? Math.max(...selectedCoords.x)\n          : Math.max(...fullCoords.x),\n      y1:\n        brushDimension !== \"x\"\n          ? Math.min(...selectedCoords.y)\n          : Math.min(...fullCoords.y),\n      y2:\n        brushDimension !== \"x\"\n          ? Math.max(...selectedCoords.y)\n          : Math.max(...fullCoords.y),\n    };\n  },\n\n  getHandles(props, domainBox) {\n    const brushDimension = this.getDimension(props);\n    const { x1, x2, y1, y2 } = domainBox;\n    const minX = Math.min(x1, x2);\n    const maxX = Math.max(x1, x2);\n    const minY = Math.min(y1, y2);\n    const maxY = Math.max(y1, y2);\n    const handleWidth = props.handleWidth / 2;\n    return {\n      left: brushDimension !== \"y\" && {\n        x1: minX - handleWidth,\n        x2: minX + handleWidth,\n        y1,\n        y2,\n      },\n      right: brushDimension !== \"y\" && {\n        x1: maxX - handleWidth,\n        x2: maxX + handleWidth,\n        y1,\n        y2,\n      },\n      top: brushDimension !== \"x\" && {\n        x1,\n        x2,\n        y1: minY - handleWidth,\n        y2: minY + handleWidth,\n      },\n      bottom: brushDimension !== \"x\" && {\n        x1,\n        x2,\n        y1: maxY - handleWidth,\n        y2: maxY + handleWidth,\n      },\n    };\n  },\n\n  getActiveHandles(point, props, domainBox) {\n    const handles = this.getHandles(props, domainBox);\n    const activeHandles = [\"top\", \"bottom\", \"left\", \"right\"].reduce(\n      (memo, opt) =>\n        handles[opt] && this.withinBounds(point, handles[opt])\n          ? memo.concat(opt)\n          : memo,\n      [] as string[],\n    );\n    return activeHandles.length && activeHandles;\n  },\n\n  getResizeMutation(box, handles) {\n    const { x1, y1, x2, y2 } = box;\n    const mutations = {\n      left: { x1: Math.max(x1, x2), x2: Math.min(x1, x2), y1, y2 },\n      right: { x1: Math.min(x1, x2), x2: Math.max(x1, x2), y1, y2 },\n      top: { y1: Math.max(y1, y2), y2: Math.min(y1, y2), x1, x2 },\n      bottom: { y1: Math.min(y1, y2), y2: Math.max(y1, y2), x1, x2 },\n    };\n    return handles.reduce((memo, current) => {\n      return Object.assign(memo, mutations[current]);\n    }, {});\n  },\n\n  getMinimumDomain() {\n    return {\n      x: [0, 1 / Number.MAX_SAFE_INTEGER],\n      y: [0, 1 / Number.MAX_SAFE_INTEGER],\n    };\n  },\n\n  getDefaultBrushArea(targetProps, cachedDomain, evt) {\n    const { domain, fullDomain, scale, horizontal, allowResize } = targetProps;\n    const defaultBrushArea =\n      !allowResize && !targetProps.defaultBrushArea\n        ? \"move\"\n        : targetProps.defaultBrushArea;\n    if (defaultBrushArea === \"none\") {\n      return this.getMinimumDomain();\n    } else if (defaultBrushArea === \"disable\") {\n      return cachedDomain;\n    } else if (defaultBrushArea === \"move\") {\n      const brushBox = this.getDomainBox(targetProps, fullDomain, cachedDomain);\n      const parentSVG = targetProps.parentSVG || Selection.getParentSVG(evt);\n      const pannedBox = this.panBox(\n        {\n          ...targetProps,\n          ...brushBox,\n          brushDomain: cachedDomain,\n          startX: (brushBox.x1 + brushBox.x2) / 2,\n          startY: (brushBox.y1 + brushBox.y2) / 2,\n        },\n        Selection.getSVGEventCoordinates(evt, parentSVG),\n      );\n      const fullDomainBox =\n        targetProps.fullDomainBox || this.getDomainBox(targetProps, fullDomain);\n      const constrainedBox = this.constrainBox(pannedBox, fullDomainBox);\n      return Selection.getBounds({ ...constrainedBox, scale, horizontal });\n    }\n    return domain;\n  },\n\n  getSelectionMutation(point, box, brushDimension) {\n    const { x, y } = point;\n    const { x1, x2, y1, y2 } = box;\n    return {\n      x1: brushDimension !== \"y\" ? x : x1,\n      y1: brushDimension !== \"x\" ? y : y1,\n      x2: brushDimension !== \"y\" ? x : x2,\n      y2: brushDimension !== \"x\" ? y : y2,\n    };\n  },\n\n  panBox(props, point) {\n    const { domain, startX, startY } = props;\n    const brushDimension = this.getDimension(props);\n    const brushDomain = defaults({}, props.brushDomain, domain);\n    const fullDomain = defaults({}, props.fullDomain, domain);\n    const { x1, x2, y1, y2 } = props.x1\n      ? props\n      : this.getDomainBox(props, fullDomain, brushDomain);\n\n    const { x, y } = point;\n    const delta = {\n      x: startX ? startX - x : 0,\n      y: startY ? startY - y : 0,\n    };\n    return {\n      x1:\n        brushDimension !== \"y\" ? Math.min(x1, x2) - delta.x : Math.min(x1, x2),\n      x2:\n        brushDimension !== \"y\" ? Math.max(x1, x2) - delta.x : Math.max(x1, x2),\n      y1:\n        brushDimension !== \"x\" ? Math.min(y1, y2) - delta.y : Math.min(y1, y2),\n      y2:\n        brushDimension !== \"x\" ? Math.max(y1, y2) - delta.y : Math.max(y1, y2),\n    };\n  },\n\n  constrainBox(box, fullDomainBox) {\n    const { x1, y1, x2, y2 } = CoreHelpers.mapValues(fullDomainBox, Number);\n    return {\n      x1: box.x2 > x2 ? x2 - Math.abs(box.x2 - box.x1) : Math.max(box.x1, x1),\n      y1: box.y2 > y2 ? y2 - Math.abs(box.y2 - box.y1) : Math.max(box.y1, y1),\n      x2: box.x1 < x1 ? x1 + Math.abs(box.x2 - box.x1) : Math.min(box.x2, x2),\n      y2: box.y1 < y1 ? y1 + Math.abs(box.y2 - box.y1) : Math.min(box.y2, y2),\n    };\n  },\n\n  constrainPoint(point, fullDomainBox) {\n    const { x1, y1, x2, y2 } = CoreHelpers.mapValues(fullDomainBox, Number);\n    return {\n      x: Math.min(Math.max(point.x, x1), x2),\n      y: Math.min(Math.max(point.y, y1), y2),\n    };\n  },\n\n  hasMoved(props) {\n    const { x1, x2, y1, y2, mouseMoveThreshold } = props;\n    const brushDimension = this.getDimension(props);\n    const xMoved = Math.abs(x1 - x2) >= mouseMoveThreshold;\n    const yMoved = Math.abs(y1 - y2) >= mouseMoveThreshold;\n    switch (brushDimension) {\n      case \"x\":\n        return xMoved;\n      case \"y\":\n        return yMoved;\n      default:\n        return xMoved || yMoved;\n    }\n  },\n\n  onMouseDown(evt, targetProps) {\n    evt.preventDefault();\n    const {\n      handleWidth,\n      cachedBrushDomain,\n      domain,\n      allowResize,\n      allowDrag,\n      allowDraw,\n    } = targetProps;\n    const brushDimension = this.getDimension(targetProps);\n    const defaultBrushArea =\n      !allowResize && !targetProps.defaultBrushArea\n        ? \"move\"\n        : targetProps.defaultBrushArea;\n    // Don't trigger events for static brushes\n    if (!allowResize && !allowDrag) {\n      return {};\n    }\n\n    const fullDomainBox =\n      targetProps.fullDomainBox || this.getDomainBox(targetProps, domain);\n    const parentSVG = targetProps.parentSVG || Selection.getParentSVG(evt);\n    const { x, y } = Selection.getSVGEventCoordinates(evt, parentSVG);\n    // Ignore events that occur outside of the maximum domain region\n    if (!this.withinBounds({ x, y }, fullDomainBox, handleWidth)) {\n      return {};\n    }\n\n    const brushDomain = defaults({}, targetProps.brushDomain, domain);\n\n    const currentDomain = isEqual(brushDomain, cachedBrushDomain)\n      ? targetProps.currentDomain || brushDomain || domain\n      : brushDomain || domain;\n\n    const domainBox = this.getDomainBox(targetProps, domain, currentDomain);\n\n    const activeHandles =\n      allowResize && this.getActiveHandles({ x, y }, targetProps, domainBox);\n    // If the event occurs in any of the handle regions, start a resize\n    if (activeHandles) {\n      return [\n        {\n          target: \"parent\",\n          mutation: () => {\n            return {\n              isSelecting: true,\n              domainBox,\n              fullDomainBox,\n              cachedBrushDomain: brushDomain,\n              currentDomain,\n              parentSVG,\n              ...this.getResizeMutation(domainBox, activeHandles),\n            };\n          },\n        },\n      ];\n    } else if (\n      this.withinBounds({ x, y }, domainBox) &&\n      !isEqual(domain, currentDomain)\n    ) {\n      // if the event occurs within a selected region start a panning event, unless the whole\n      // domain is selected\n      return [\n        {\n          target: \"parent\",\n          mutation: () => ({\n            isPanning: allowDrag,\n            startX: x,\n            startY: y,\n            domainBox,\n            fullDomainBox,\n            currentDomain,\n            cachedBrushDomain: brushDomain,\n            parentSVG,\n            ...domainBox, // set x1, x2, y1, y2\n          }),\n        },\n      ];\n    }\n    // if the event occurs outside the region, or if the whole domain is selected,\n    // start a new selection\n    return allowDraw\n      ? [\n          {\n            target: \"parent\",\n            mutation: () => ({\n              isSelecting: allowResize || defaultBrushArea === \"move\",\n              domainBox,\n              fullDomainBox,\n              parentSVG,\n              cachedBrushDomain: brushDomain,\n              cachedCurrentDomain: currentDomain,\n              currentDomain: this.getMinimumDomain(),\n              ...this.getSelectionMutation({ x, y }, domainBox, brushDimension),\n            }),\n          },\n        ]\n      : {};\n  },\n\n  onGlobalMouseMove(evt, targetProps) {\n    const {\n      scale,\n      isPanning,\n      isSelecting,\n      fullDomainBox,\n      onBrushDomainChange,\n      allowResize,\n      allowDrag,\n      horizontal,\n      mouseMoveThreshold,\n      parentSVG,\n    } = targetProps;\n    const brushDimension = this.getDimension(targetProps);\n    const { x, y } = Selection.getSVGEventCoordinates(evt, parentSVG);\n    if (\n      (!allowResize && !allowDrag) ||\n      (mouseMoveThreshold > 0 &&\n        !this.hasMoved({ ...targetProps, x2: x, y2: y }))\n    ) {\n      return {};\n    }\n    if (allowDrag && isPanning) {\n      const { startX, startY } = targetProps;\n      const pannedBox = this.panBox(targetProps, { x, y });\n      const constrainedBox = this.constrainBox(pannedBox, fullDomainBox);\n      const currentDomain = Selection.getBounds({\n        ...constrainedBox,\n        scale,\n        horizontal,\n      });\n      const mutatedProps = {\n        currentDomain,\n        parentSVG,\n        startX:\n          pannedBox.x2 >= fullDomainBox.x2 || pannedBox.x1 <= fullDomainBox.x1\n            ? startX\n            : x,\n        startY:\n          pannedBox.y2 >= fullDomainBox.y2 || pannedBox.y1 <= fullDomainBox.y1\n            ? startY\n            : y,\n        ...constrainedBox,\n      };\n\n      if (CoreHelpers.isFunction(onBrushDomainChange)) {\n        onBrushDomainChange(\n          currentDomain,\n          defaults({}, mutatedProps, targetProps),\n        );\n      }\n      return [\n        {\n          target: \"parent\",\n          mutation: () => mutatedProps,\n        },\n      ];\n    } else if (allowResize && isSelecting) {\n      const { x: x2, y: y2 } = this.constrainPoint(\n        {\n          x: brushDimension !== \"y\" ? x : targetProps.x2,\n          y: brushDimension !== \"x\" ? y : targetProps.y2,\n        },\n        fullDomainBox,\n      );\n      const currentDomain = Selection.getBounds({\n        x2,\n        y2,\n        x1: targetProps.x1,\n        y1: targetProps.y1,\n        scale,\n        horizontal,\n      });\n\n      const mutatedProps = { x2, y2, currentDomain, parentSVG };\n      if (CoreHelpers.isFunction(onBrushDomainChange)) {\n        onBrushDomainChange(\n          currentDomain,\n          defaults({}, mutatedProps, targetProps),\n        );\n      }\n      return [\n        {\n          target: \"parent\",\n          mutation: () => mutatedProps,\n        },\n      ];\n    }\n    return {};\n  },\n\n  onGlobalMouseUp(evt, targetProps) {\n    // if a panning or selection has not been started, ignore the event\n    if (!targetProps.isPanning && !targetProps.isSelecting) {\n      return {};\n    }\n\n    const {\n      x1,\n      y1,\n      x2,\n      y2,\n      isPanning,\n      isSelecting,\n      onBrushDomainChange,\n      onBrushDomainChangeEnd,\n      onBrushCleared,\n      currentDomain,\n      allowResize,\n      allowDrag,\n    } = targetProps;\n    const defaultBrushArea =\n      !allowResize && !targetProps.defaultBrushArea\n        ? \"move\"\n        : targetProps.defaultBrushArea;\n    const defaultBrushHasArea =\n      defaultBrushArea !== undefined && defaultBrushArea !== \"none\";\n    const mutatedProps: {\n      isPanning: boolean;\n      isSelecting: boolean;\n      currentDomain?: any;\n    } = { isPanning: false, isSelecting: false };\n\n    // if the mouse hasn't moved since a mouseDown event, select the default brush area\n    if ((allowResize || defaultBrushHasArea) && (x1 === x2 || y1 === y2)) {\n      const cachedDomain = targetProps.cachedCurrentDomain || currentDomain;\n      const defaultDomain = this.getDefaultBrushArea(\n        targetProps,\n        cachedDomain,\n        evt,\n      );\n      mutatedProps.currentDomain = defaultDomain;\n      if (CoreHelpers.isFunction(onBrushDomainChange)) {\n        onBrushDomainChange(\n          defaultDomain,\n          defaults({}, mutatedProps, targetProps),\n        );\n      }\n      if (CoreHelpers.isFunction(onBrushDomainChangeEnd)) {\n        onBrushDomainChangeEnd(\n          defaultDomain,\n          defaults({}, mutatedProps, targetProps),\n        );\n      }\n      if (CoreHelpers.isFunction(onBrushCleared)) {\n        onBrushCleared(defaultDomain, defaults({}, mutatedProps, targetProps));\n      }\n    } else if ((allowDrag && isPanning) || (allowResize && isSelecting)) {\n      if (CoreHelpers.isFunction(onBrushDomainChangeEnd)) {\n        onBrushDomainChangeEnd(\n          currentDomain,\n          defaults({}, mutatedProps, targetProps),\n        );\n      }\n    }\n\n    return [\n      {\n        target: \"parent\",\n        mutation: () => mutatedProps,\n      },\n    ];\n  },\n};\n\nexport const BrushHelpers = {\n  ...Helpers,\n  onMouseDown: Helpers.onMouseDown.bind(Helpers),\n  onGlobalMouseUp: Helpers.onGlobalMouseUp.bind(Helpers),\n  onGlobalMouseMove: throttle(\n    Helpers.onGlobalMouseMove.bind(Helpers),\n    16, // eslint-disable-line no-magic-numbers\n    { leading: true, trailing: false },\n  ),\n};\n"
  },
  {
    "path": "packages/victory-brush-container/src/index.ts",
    "content": "export * from \"./victory-brush-container\";\nexport * from \"./brush-helpers\";\n"
  },
  {
    "path": "packages/victory-brush-container/src/victory-brush-container.tsx",
    "content": "import React from \"react\";\nimport {\n  Selection,\n  Rect,\n  DomainTuple,\n  VictoryContainerProps,\n  VictoryContainer,\n  VictoryEventHandler,\n} from \"victory-core\";\nimport { BrushHelpers } from \"./brush-helpers\";\nimport defaults from \"lodash/defaults\";\nimport isEqual from \"react-fast-compare\";\n\nexport interface VictoryBrushContainerProps extends VictoryContainerProps {\n  allowDrag?: boolean;\n  allowDraw?: boolean;\n  allowResize?: boolean;\n  brushComponent?: React.ReactElement;\n  brushDimension?: \"x\" | \"y\";\n  brushDomain?: { x?: DomainTuple; y?: DomainTuple };\n  brushStyle?: React.CSSProperties;\n  defaultBrushArea?: \"all\" | \"none\" | \"disable\" | \"move\";\n  disable?: boolean;\n  handleComponent?: React.ReactElement;\n  handleStyle?: React.CSSProperties;\n  handleWidth?: number;\n  onBrushCleared?: (\n    domain: { x: DomainTuple; y: DomainTuple },\n    props: VictoryBrushContainerProps,\n  ) => void;\n  onBrushDomainChange?: (\n    domain: { x: DomainTuple; y: DomainTuple },\n    props: VictoryBrushContainerProps,\n  ) => void;\n  onBrushDomainChangeEnd?: (\n    domain: { x: DomainTuple; y: DomainTuple },\n    props: VictoryBrushContainerProps,\n  ) => void;\n}\n\ninterface VictoryBrushContainerMutatedProps extends VictoryBrushContainerProps {\n  domain: { x: DomainTuple; y: DomainTuple };\n  currentDomain: { x: DomainTuple; y: DomainTuple } | undefined;\n  cachedBrushDomain: { x: DomainTuple; y: DomainTuple } | undefined;\n}\n\nexport const VICTORY_BRUSH_CONTAINER_DEFAULT_PROPS = {\n  allowDrag: true,\n  allowDraw: true,\n  allowResize: true,\n  brushComponent: <Rect />,\n  brushStyle: {\n    stroke: \"transparent\",\n    fill: \"black\",\n    fillOpacity: 0.1,\n  },\n  handleComponent: <Rect />,\n  handleStyle: {\n    stroke: \"transparent\",\n    fill: \"transparent\",\n  },\n  handleWidth: 8,\n  mouseMoveThreshold: 0,\n};\n\nexport const useVictoryBrushContainer = (\n  initialProps: VictoryBrushContainerProps,\n) => {\n  const props = {\n    ...VICTORY_BRUSH_CONTAINER_DEFAULT_PROPS,\n    ...(initialProps as VictoryBrushContainerMutatedProps),\n  };\n  const { children } = props;\n\n  const getSelectBox = (coordinates) => {\n    const { x, y } = coordinates;\n    const { brushStyle, brushComponent, name } = props;\n    const brushComponentStyle =\n      brushComponent.props && brushComponent.props.style;\n    const cursor = !props.allowDrag && !props.allowResize ? \"auto\" : \"move\";\n    return x[0] !== x[1] && y[0] !== y[1]\n      ? React.cloneElement(brushComponent, {\n          key: `${name}-brush`,\n          width: Math.abs(x[1] - x[0]) || 1,\n          height: Math.abs(y[1] - y[0]) || 1,\n          x: Math.min(x[0], x[1]),\n          y: Math.min(y[0], y[1]),\n          cursor,\n          style: defaults({}, brushComponentStyle, brushStyle),\n        })\n      : null;\n  };\n\n  const getCursorPointers = () => {\n    const cursors = {\n      yProps: \"ns-resize\",\n      xProps: \"ew-resize\",\n    };\n    if (!props.allowResize && props.allowDrag) {\n      cursors.xProps = \"move\";\n      cursors.yProps = \"move\";\n    } else if (!props.allowResize && !props.allowDrag) {\n      cursors.xProps = \"auto\";\n      cursors.yProps = \"auto\";\n    }\n    return cursors;\n  };\n\n  const getHandles = (domain) => {\n    const { handleWidth, handleStyle, handleComponent, name } = props;\n    const domainBox = BrushHelpers.getDomainBox(props, domain);\n    const { x1, x2, y1, y2 } = domainBox;\n    const { top, bottom, left, right } = BrushHelpers.getHandles(\n      props,\n      domainBox,\n    );\n    const width = Math.abs(x2 - x1) || 1;\n    const height = Math.abs(y2 - y1) || 1;\n    const handleComponentStyle =\n      (handleComponent.props && handleComponent.props.style) || {};\n    const style = defaults({}, handleComponentStyle, handleStyle);\n\n    const cursors = getCursorPointers();\n    const yProps = {\n      style,\n      width,\n      height: handleWidth,\n      cursor: cursors.yProps,\n    };\n    const xProps = {\n      style,\n      width: handleWidth,\n      height,\n      cursor: cursors.xProps,\n    };\n\n    const handleProps = {\n      top: top && Object.assign({ x: top.x1, y: top.y1 }, yProps),\n      bottom: bottom && Object.assign({ x: bottom.x1, y: bottom.y1 }, yProps),\n      left: left && Object.assign({ y: left.y1, x: left.x1 }, xProps),\n      right: right && Object.assign({ y: right.y1, x: right.x1 }, xProps),\n    };\n    const handles = [\"top\", \"bottom\", \"left\", \"right\"].reduce(\n      (memo, curr) =>\n        handleProps[curr]\n          ? memo.concat(\n              React.cloneElement(\n                handleComponent,\n                Object.assign(\n                  { key: `${name}-handle-${curr}` },\n                  handleProps[curr],\n                ),\n              ),\n            )\n          : memo,\n      [] as React.ReactElement[],\n    );\n    return handles.length ? handles : null;\n  };\n\n  const getRect = () => {\n    const { currentDomain, cachedBrushDomain } = props;\n    const brushDomain = defaults({}, props.brushDomain, props.domain);\n    const domain = isEqual(brushDomain, cachedBrushDomain)\n      ? defaults({}, currentDomain, brushDomain)\n      : brushDomain;\n    const coordinates = Selection.getDomainCoordinates(props, domain);\n    const selectBox = getSelectBox(coordinates);\n    return selectBox ? [selectBox, getHandles(domain)] : [];\n  };\n\n  return {\n    props,\n    children: [\n      ...React.Children.toArray(children),\n      ...getRect(),\n    ] as React.ReactElement[],\n  };\n};\n\nexport const VictoryBrushContainer = (\n  initialProps: VictoryBrushContainerProps,\n) => {\n  const { props, children } = useVictoryBrushContainer(initialProps);\n  return <VictoryContainer {...props}>{children}</VictoryContainer>;\n};\n\nVictoryBrushContainer.role = \"container\";\n\nVictoryBrushContainer.defaultEvents = (\n  initialProps: VictoryBrushContainerProps,\n) => {\n  const props = { ...VICTORY_BRUSH_CONTAINER_DEFAULT_PROPS, ...initialProps };\n  const createEventHandler =\n    (\n      handler: VictoryEventHandler,\n      isDisabled?: (targetProps: any) => boolean,\n    ): VictoryEventHandler =>\n    // eslint-disable-next-line max-params\n    (event, targetProps, eventKey, context) =>\n      props.disable || isDisabled?.(targetProps)\n        ? {}\n        : handler(event, { ...props, ...targetProps }, eventKey, context);\n\n  return [\n    {\n      target: \"parent\",\n      eventHandlers: {\n        onMouseDown: createEventHandler(BrushHelpers.onMouseDown),\n        onTouchStart: createEventHandler(BrushHelpers.onMouseDown),\n        onGlobalMouseMove: createEventHandler(\n          BrushHelpers.onGlobalMouseMove,\n          (targetProps) => !targetProps.isPanning && !targetProps.isSelecting,\n        ),\n        onGlobalTouchMove: createEventHandler(\n          BrushHelpers.onGlobalMouseMove,\n          (targetProps) => !targetProps.isPanning && !targetProps.isSelecting,\n        ),\n        onGlobalMouseUp: createEventHandler(BrushHelpers.onGlobalMouseUp),\n        onGlobalTouchEnd: createEventHandler(BrushHelpers.onGlobalMouseUp),\n        onGlobalTouchCancel: createEventHandler(BrushHelpers.onGlobalMouseUp),\n      },\n    },\n  ];\n};\n"
  },
  {
    "path": "packages/victory-brush-container/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-brush-container/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-brush-line/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-brush-line/CHANGELOG.md",
    "content": "# victory-brush-line\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n### Patch Changes\n\n- Remove deprecated babel-plugin-lodash plugin ([#2965](https://github.com/FormidableLabs/victory/pull/2965))\n\n## 37.3.2\n\n## 37.3.1\n\n## 37.3.0\n\n## 37.2.0\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n## 37.0.1\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n### Patch Changes\n\n- Replace lodash isFunction with native code ([#2802](https://github.com/FormidableLabs/victory/pull/2802))\n\n## 36.9.1\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n### Patch Changes\n\n- Migrate victory-native to TypeScript ([#2739](https://github.com/FormidableLabs/victory/pull/2739))\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n## 36.8.4\n\n## 36.8.3\n\n### Patch Changes\n\n- Refactor param reassignments ([#2724](https://github.com/FormidableLabs/victory/pull/2724))\n\n## 36.8.2\n\n## 36.8.1\n\n## 36.8.0\n\n## 36.7.0\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-core@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n- Updated dependencies [[`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-core@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-core@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- Updated dependencies [[`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-core@36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Migrate victory-brush-container and victory-brush-line to TypeScript ([#2393](https://github.com/FormidableLabs/victory/pull/2393))\n\n* Update source code with minor lint-based improvements (see [#2236](https://github.com/FormidableLabs/victory/issues/2236)). ([#2403](https://github.com/FormidableLabs/victory/pull/2403))\n\n* Updated dependencies [[`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-core@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-brush-line/README.md",
    "content": "# VictoryBrushLine\n\n`victory-brush-line@^30.0.0` exports `VictoryBrushLine`\n\nTo view documentation for `VictoryBrushLine` please see https://commerce.nearform.com/open-source/victory/docs/victory-brush-line\n\nTo suggest an addition or correction to this documentation please see https://github.com/FormidableLabs/victory/blob/main/docs/src/content/docs/victory-brush-line.md\n"
  },
  {
    "path": "packages/victory-brush-line/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-brush-line/package.json",
    "content": "{\n  \"name\": \"victory-brush-line\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Interactive Brush Line Component for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"lodash\": \"^4.17.19\",\n    \"react-fast-compare\": \"^3.2.0\",\n    \"victory-core\": \"37.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:build\",\n        \"../victory-vendor:build\",\n        \"../victory-voronoi:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-brush-line/src/index.ts",
    "content": "export * from \"./victory-brush-line\";\n"
  },
  {
    "path": "packages/victory-brush-line/src/victory-brush-line.tsx",
    "content": "import React from \"react\";\nimport defaults from \"lodash/defaults\";\nimport pick from \"lodash/pick\";\n\nimport {\n  Selection,\n  Helpers,\n  Collection,\n  LineSegment,\n  Scale,\n  Domain,\n  Box,\n  DomainTuple,\n  VictoryStyleObject,\n} from \"victory-core\";\nimport isEqual from \"react-fast-compare\";\n\nexport type VictoryBrushLineTargetType = \"data\" | \"labels\" | \"parent\";\nexport interface VictoryBrushLineProps {\n  allowDrag?: boolean;\n  allowDraw?: boolean;\n  allowResize?: boolean;\n  brushAreaComponent?: React.ReactElement;\n  brushAreaStyle?: VictoryStyleObject;\n  brushAreaWidth?: number;\n  brushComponent?: React.ReactElement;\n  brushDomain?: DomainTuple;\n  brushStyle?: VictoryStyleObject;\n  brushWidth?: number;\n  className?: string;\n  dimension?: \"x\" | \"y\";\n  events?: React.DOMAttributes<any>;\n  disable?: boolean;\n  groupComponent?: React.ReactElement;\n  handleComponent?: React.ReactElement;\n  handleStyle?: VictoryStyleObject;\n  handleWidth?: number;\n  id?: string | number;\n  lineComponent?: React.ReactElement;\n  name?: string;\n  onBrushDomainChange?: (\n    domain: DomainTuple,\n    props?: VictoryBrushLineProps,\n  ) => void;\n  style?: VictoryStyleObject;\n  type?: string;\n  width?: number;\n}\n\nconst SMALL_NUMBER = 1 / Number.MAX_SAFE_INTEGER;\nconst getScale = (props) => {\n  const { scale = {}, dimension = \"x\" } = props;\n\n  if (scale[dimension]) {\n    return scale[dimension];\n  }\n  const fallbackScale = Scale.getBaseScale(props, dimension);\n  const range = Helpers.getRange(props, dimension);\n  const domain = Domain.getDomainFromProps(props, dimension) || [0, 1];\n  fallbackScale.range(range).domain(domain);\n  return fallbackScale;\n};\n\nconst getDimension = (props) => {\n  const { horizontal, dimension = \"x\" } = props;\n  if (!horizontal) {\n    return dimension;\n  }\n  return dimension === \"x\" ? \"y\" : \"x\";\n};\n\nconst toRange = (props, domain) => {\n  const scale = getScale(props);\n  return [scale(Math.min(...domain)), scale(Math.max(...domain))];\n};\n\nconst toDomain = (props, range) => {\n  const scale = getScale(props);\n  return [scale.invert(Math.min(...range)), scale.invert(Math.max(...range))];\n};\n\nconst getFullRange = (props) => {\n  const scale = getScale(props);\n  return scale.range();\n};\n\nconst getFullDomain = (props) => {\n  const scale = getScale(props);\n  return scale.domain();\n};\n\nconst withinBound = (value, bound) => {\n  return (\n    value >= Collection.getMinValue(bound) &&\n    value <= Collection.getMaxValue(bound)\n  );\n};\n\nconst getBrushDomain = (brushDomain, fullDomain) => {\n  if (brushDomain) {\n    const brushMin = Collection.getMinValue(brushDomain);\n    const brushMax = Collection.getMaxValue(brushDomain);\n    const domainMin = Collection.getMinValue(fullDomain);\n    const domainMax = Collection.getMaxValue(fullDomain);\n    const defaultMin =\n      brushMin < domainMin ? domainMin : Number(domainMax) - SMALL_NUMBER;\n    const defaultMax =\n      brushMax > domainMax ? domainMax : Number(domainMin) + SMALL_NUMBER;\n    const min = withinBound(brushMin, fullDomain) ? brushMin : defaultMin;\n    const max = withinBound(brushMax, fullDomain) ? brushMax : defaultMax;\n    return [min, max];\n  }\n  return fullDomain;\n};\n\ntype ReduceReturnType = {\n  min?: string;\n  max?: string;\n};\n\nconst getActiveHandle = (props, position, range) => {\n  const width = props.handleWidth / 2;\n  const dimension = getDimension(props);\n  const getHandle = (type) => {\n    const base = {\n      min: dimension === \"x\" ? Math.min(...range) : Math.max(...range),\n      max: dimension === \"x\" ? Math.max(...range) : Math.min(...range),\n    };\n    return [base[type] - width, base[type] + width];\n  };\n  const active = [\"min\", \"max\"].reduce((memo, type) => {\n    memo[type] = withinBound(position, getHandle(type)) ? type : undefined;\n    return memo;\n  }, {} as ReduceReturnType);\n  return active.min && active.max ? \"both\" : active.min || active.max;\n};\n\nconst getMinimumDomain = () => {\n  return [0, SMALL_NUMBER];\n};\n\nconst panBox = (props, position) => {\n  const { brushDomain, startPosition } = props;\n  const range = toRange(props, brushDomain);\n  const fullRange = getFullRange(props);\n  const size = Math.abs(range[1] - range[0]);\n  const globalMin = Math.min(...fullRange);\n  const globalMax = Math.max(...fullRange);\n  const delta = startPosition ? startPosition - position : 0;\n  const min = Math.min(...range) - delta;\n  const max = Math.max(...range) - delta;\n  const constrainedMin =\n    min > globalMax - size ? globalMax - size : Math.max(min, globalMin);\n  const constrainedMax =\n    max < globalMin + size ? globalMin + size : Math.min(max, globalMax);\n  return [constrainedMin, constrainedMax];\n};\n\nconst fallbackProps = {\n  brushAreaStyle: {\n    stroke: \"none\",\n    fill: \"black\",\n    opacity: ({ active }) => (active ? 0.2 : 0.1), // eslint-disable-line no-magic-numbers\n  },\n  brushStyle: {\n    pointerEvents: \"none\",\n    stroke: \"none\",\n    fill: \"black\",\n    opacity: ({ active }) => (active ? 0.4 : 0.3), // eslint-disable-line no-magic-numbers\n  },\n  handleStyle: {\n    pointerEvents: \"none\",\n    stroke: \"none\",\n    fill: \"none\",\n  },\n};\n\nexport class VictoryBrushLine<\n  T extends VictoryBrushLineProps,\n> extends React.Component<T> {\n  static defaultProps = {\n    allowDrag: true,\n    allowDraw: true,\n    allowResize: true,\n    brushAreaComponent: <Box />,\n    brushComponent: <Box />,\n    groupComponent: <g />,\n    handleComponent: <Box />,\n    handleWidth: 10,\n    lineComponent: <LineSegment />,\n    width: 10,\n  };\n\n  static defaultEvents = function (props) {\n    return props.disable\n      ? undefined\n      : [\n          {\n            target: props.type,\n            eventHandlers: {\n              onMouseEnter: (evt, targetProps) => {\n                evt.preventDefault();\n                const { allowResize, brushDomain } = targetProps;\n                const dimension = getDimension(targetProps);\n                const parentSVG =\n                  targetProps.parentSVG || Selection.getParentSVG(evt);\n                const position = Selection.getSVGEventCoordinates(\n                  evt,\n                  parentSVG,\n                )[dimension];\n                const fullDomain = getFullDomain(targetProps);\n                const currentDomain = getBrushDomain(brushDomain, fullDomain);\n                const range = toRange(targetProps, currentDomain);\n                const activeHandle =\n                  allowResize && getActiveHandle(targetProps, position, range);\n                const activeBrushes = {\n                  brushArea: !targetProps.brushDomain,\n                  brush:\n                    withinBound(position, range) &&\n                    !isEqual(fullDomain, currentDomain),\n                  minHandle: activeHandle === \"min\" || activeHandle === \"both\",\n                  maxHandle: activeHandle === \"min\" || activeHandle === \"both\",\n                };\n                return [\n                  {\n                    mutation: () => ({\n                      activeBrushes,\n                      brushDomain: targetProps.brushDomain,\n                      parentSVG,\n                    }),\n                  },\n                ];\n              },\n              onMouseDown: (evt, targetProps) => {\n                evt.preventDefault();\n                const {\n                  allowResize,\n                  allowDrag,\n                  allowDraw,\n                  activeBrushes,\n                  brushDomain,\n                } = targetProps;\n                const dimension = getDimension(targetProps);\n\n                // Don't trigger events for static brushes\n                if (!allowResize && !allowDrag) {\n                  return [];\n                }\n\n                const fullDomain = getFullDomain(targetProps);\n                const currentDomain = getBrushDomain(brushDomain, fullDomain);\n                const parentSVG =\n                  targetProps.parentSVG || Selection.getParentSVG(evt);\n                const position = Selection.getSVGEventCoordinates(\n                  evt,\n                  parentSVG,\n                )[dimension];\n                const range = toRange(targetProps, currentDomain);\n                const activeHandle =\n                  allowResize && getActiveHandle(targetProps, position, range);\n                // If the event occurs in any of the handle regions, start a resize\n                if (activeHandle) {\n                  return [\n                    {\n                      mutation: () => {\n                        return {\n                          parentSVG,\n                          isSelecting: true,\n                          activeHandle,\n                          brushDomain: currentDomain,\n                          startPosition: position,\n                          activeBrushes,\n                        };\n                      },\n                    },\n                  ];\n                } else if (\n                  withinBound(position, range) &&\n                  !isEqual(fullDomain, currentDomain)\n                ) {\n                  // if the event occurs within a selected region start a panning event, unless the whole\n                  // domain is selected\n                  return [\n                    {\n                      mutation: () => ({\n                        isPanning: allowDrag,\n                        startPosition: position,\n                        brushDomain: currentDomain,\n                        activeBrushes,\n                        parentSVG,\n                      }),\n                    },\n                  ];\n                }\n                // if the event occurs outside the region, or if the whole domain is selected,\n                // start a new selection\n                return allowDraw\n                  ? [\n                      {\n                        mutation: () => ({\n                          isSelecting: allowResize,\n                          brushDomain: null,\n                          startPosition: position,\n                          activeBrushes,\n                          parentSVG,\n                        }),\n                      },\n                    ]\n                  : [];\n              },\n\n              onMouseMove: (evt, targetProps) => {\n                const {\n                  isPanning,\n                  isSelecting,\n                  allowResize,\n                  allowDrag,\n                  onBrushDomainChange,\n                  brushDomain,\n                } = targetProps;\n                const dimension = getDimension(targetProps);\n\n                if (isPanning || isSelecting) {\n                  evt.preventDefault();\n                  evt.stopPropagation();\n                }\n                const parentSVG =\n                  targetProps.parentSVG || Selection.getParentSVG(evt);\n                const position = Selection.getSVGEventCoordinates(\n                  evt,\n                  parentSVG,\n                )[dimension];\n                const fullDomain = getFullDomain(targetProps);\n                const domain = getBrushDomain(brushDomain, fullDomain);\n                const initialRange = toRange(targetProps, domain);\n                const activeHandle = getActiveHandle(\n                  targetProps,\n                  position,\n                  initialRange,\n                );\n                const activeBrushes = {\n                  brushArea: !targetProps.brushDomain,\n                  brush:\n                    withinBound(position, initialRange) &&\n                    !isEqual(fullDomain, domain),\n                  minHandle: activeHandle === \"min\" || activeHandle === \"both\",\n                  maxHandle: activeHandle === \"max\" || activeHandle === \"both\",\n                };\n                if (!targetProps.isPanning && !targetProps.isSelecting) {\n                  return [\n                    {\n                      mutation: () => ({\n                        activeBrushes,\n                        brushDomain: targetProps.brushDomain,\n                        parentSVG,\n                      }),\n                    },\n                  ];\n                }\n                if (allowDrag && isPanning) {\n                  const fullRange = getFullRange(targetProps);\n                  const range = panBox(targetProps, position);\n                  const currentDomain = toDomain(targetProps, range);\n                  const startPosition =\n                    Math.max(...range) >= Math.max(...fullRange) ||\n                    Math.min(...range) <= Math.min(...fullRange)\n                      ? targetProps.startPosition\n                      : position;\n                  const mutatedProps = {\n                    startPosition,\n                    isPanning: true,\n                    brushDomain: currentDomain,\n                    activeBrushes: { brush: true },\n                    parentSVG,\n                  };\n\n                  if (Helpers.isFunction(onBrushDomainChange)) {\n                    onBrushDomainChange(\n                      currentDomain,\n                      defaults({}, mutatedProps, targetProps),\n                    );\n                  }\n                  return [\n                    {\n                      mutation: () => mutatedProps,\n                    },\n                  ];\n                } else if (allowResize && isSelecting) {\n                  let currentDomain = brushDomain || getMinimumDomain();\n                  const range = toRange(targetProps, currentDomain);\n                  const oppositeHandle =\n                    targetProps.activeHandle === \"min\" ? \"max\" : \"min\";\n                  const handle =\n                    targetProps.activeHandle &&\n                    getActiveHandle(targetProps, position, range) === \"both\"\n                      ? oppositeHandle\n                      : targetProps.activeHandle;\n                  if (!handle) {\n                    currentDomain = toDomain(targetProps, [\n                      targetProps.startPosition,\n                      position,\n                    ]);\n                  } else {\n                    const rangeMax =\n                      dimension === \"x\"\n                        ? Math.max(...range)\n                        : Math.min(...range);\n                    const rangeMin =\n                      dimension === \"x\"\n                        ? Math.min(...range)\n                        : Math.max(...range);\n                    const min = handle === \"max\" ? rangeMin : position;\n                    const max = handle === \"min\" ? rangeMax : position;\n                    currentDomain = toDomain(targetProps, [min, max]);\n                  }\n                  const mutatedProps = {\n                    brushDomain: currentDomain,\n                    startPosition: targetProps.startPosition,\n                    isSelecting,\n                    activeHandle: handle,\n                    parentSVG,\n                    activeBrushes: {\n                      brush: true,\n                      minHandle: activeHandle === \"min\",\n                      maxHandle: activeHandle === \"max\",\n                    },\n                  };\n                  if (Helpers.isFunction(onBrushDomainChange)) {\n                    onBrushDomainChange(\n                      currentDomain,\n                      defaults({}, mutatedProps, targetProps),\n                    );\n                  }\n                  return [\n                    {\n                      mutation: () => mutatedProps,\n                    },\n                  ];\n                }\n                return [];\n              },\n              onMouseUp: (evt, targetProps) => {\n                const {\n                  onBrushDomainChange,\n                  brushDomain,\n                  allowResize,\n                  activeBrushes,\n                } = targetProps;\n                // if the mouse hasn't moved since a mouseDown event, select the whole domain region\n                const mutatedProps = {\n                  isPanning: false,\n                  isSelecting: false,\n                  activeHandle: null,\n                  startPosition: null,\n                  brushDomain,\n                  activeBrushes,\n                };\n                if (allowResize && Helpers.isFunction(onBrushDomainChange)) {\n                  onBrushDomainChange(\n                    brushDomain,\n                    defaults({}, mutatedProps, targetProps),\n                  );\n                }\n                return [\n                  {\n                    mutation: () => mutatedProps,\n                  },\n                ];\n              },\n              onMouseLeave: (evt, targetProps) => {\n                const { brushDomain } = targetProps;\n                return [\n                  {\n                    mutation: () => ({\n                      isPanning: false,\n                      isSelecting: false,\n                      activeHandle: null,\n                      startPosition: null,\n                      brushDomain,\n                      activeBrushes: {},\n                    }),\n                  },\n                ];\n              },\n            },\n          },\n        ];\n  };\n\n  getRectDimensions(props, brushWidth, domain?) {\n    const { brushDomain } = props;\n    const dimension = getDimension(props);\n    const range = toRange(\n      props,\n      domain || getBrushDomain(brushDomain, getFullDomain(props)),\n    );\n    const coordinates =\n      dimension === \"x\"\n        ? {\n            y1: props.y1,\n            y2: props.y2,\n            x1: Math.min(...range),\n            x2: Math.max(...range),\n          }\n        : {\n            x1: props.x1,\n            x2: props.x2,\n            y1: Math.min(...range),\n            y2: Math.max(...range),\n          };\n    const { x1, x2, y1, y2 } = coordinates;\n    const offset = {\n      x: dimension === \"x\" ? 0 : brushWidth / 2,\n      y: dimension === \"y\" ? 0 : brushWidth / 2,\n    };\n\n    const x = Math.min(x1, x2) - offset.x;\n    const y = Math.min(y1, y2) - offset.y;\n    const width = Math.max(x1, x2) + offset.x - x;\n    const height = Math.max(y1, y2) + offset.y - y;\n    return { x, y, width, height };\n  }\n\n  getHandleDimensions(props) {\n    const { handleWidth, x1, x2, y1, y2, brushDomain } = props;\n    const dimension = getDimension(props);\n    const brushWidth = props.brushWidth || props.width;\n    const domain = getBrushDomain(brushDomain, getFullDomain(props));\n    const range = toRange(props, domain);\n    const defaultX = Math.min(x1, x2) - brushWidth / 2;\n    const defaultY = Math.min(y1, y2) - brushWidth / 2;\n    const x = {\n      min: dimension === \"x\" ? Math.min(...range) - handleWidth / 2 : defaultX,\n      max: dimension === \"x\" ? Math.max(...range) - handleWidth / 2 : defaultX,\n    };\n    const y = {\n      min: dimension === \"y\" ? Math.max(...range) - handleWidth / 2 : defaultY,\n      max: dimension === \"y\" ? Math.min(...range) - handleWidth / 2 : defaultY,\n    };\n    const width = dimension === \"x\" ? handleWidth : brushWidth;\n    const height = dimension === \"x\" ? brushWidth : handleWidth;\n\n    return {\n      min: { x: x.min, y: y.min, width, height },\n      max: { x: x.max, y: y.max, width, height },\n    };\n  }\n\n  getCursor(props) {\n    const { activeBrushes = {} } = props;\n    const dimension = getDimension(props);\n    if (activeBrushes.minHandle || activeBrushes.maxHandle) {\n      return dimension === \"x\" ? \"ew-resize\" : \"ns-resize\";\n    } else if (activeBrushes.brush) {\n      return \"move\";\n    }\n    return \"crosshair\";\n  }\n\n  renderHandles(props) {\n    const {\n      handleComponent,\n      handleStyle,\n      id,\n      brushDomain,\n      datum = {},\n      activeBrushes = {},\n    } = props;\n    if (!brushDomain) {\n      return null;\n    }\n    const handleDimensions = this.getHandleDimensions(props);\n    const style = Object.assign({}, fallbackProps.handleStyle, handleStyle);\n    const minDatum = Object.assign(\n      { handleValue: Collection.getMinValue(brushDomain) },\n      datum,\n    );\n    const maxDatum = Object.assign(\n      { handleValue: Collection.getMaxValue(brushDomain) },\n      datum,\n    );\n    const minHandleProps = Object.assign(\n      {\n        key: `${id}-min`,\n        style: Helpers.evaluateStyle(style, {\n          datum: minDatum,\n          active: activeBrushes.minHandle,\n        }),\n      },\n      handleDimensions.min,\n    );\n    const maxHandleProps = Object.assign(\n      {\n        key: `${id}-max`,\n        style: Helpers.evaluateStyle(style, {\n          datum: maxDatum,\n          active: activeBrushes.maxHandle,\n        }),\n      },\n      handleDimensions.max,\n    );\n    return [\n      React.cloneElement(handleComponent, minHandleProps),\n      React.cloneElement(handleComponent, maxHandleProps),\n    ];\n  }\n\n  renderBrush(props) {\n    const {\n      brushComponent,\n      brushStyle,\n      activeBrushes = {},\n      datum = {},\n      brushDomain,\n    } = props;\n    if (!brushDomain) {\n      return null;\n    }\n    const brushWidth = props.brushWidth || props.width;\n    const rectDimensions = this.getRectDimensions(props, brushWidth);\n    const baseStyle = Object.assign({}, fallbackProps.brushStyle, brushStyle);\n    const style = Helpers.evaluateStyle(baseStyle, {\n      datum,\n      active: activeBrushes.brush,\n    });\n    const brushProps = Object.assign({ style }, rectDimensions);\n    return React.cloneElement(brushComponent, brushProps);\n  }\n\n  renderBrushArea(props) {\n    const {\n      brushAreaComponent,\n      brushAreaStyle,\n      activeBrushes = {},\n      datum = {},\n    } = props;\n    const brushAreaWidth = props.brushAreaWidth || props.width;\n    const cursor = this.getCursor(props);\n    const rectDimensions = this.getRectDimensions(\n      props,\n      brushAreaWidth,\n      getFullDomain(props),\n    );\n    const baseStyle = Object.assign(\n      { cursor },\n      fallbackProps.brushAreaStyle,\n      brushAreaStyle,\n    );\n    const style = Helpers.evaluateStyle(baseStyle, {\n      datum,\n      active: activeBrushes.brushArea,\n    });\n    const brushAreaProps = Object.assign({ style }, rectDimensions);\n    return React.cloneElement(brushAreaComponent, brushAreaProps);\n  }\n\n  renderLine(props) {\n    const filteredProps = pick(props, [\n      \"x1\",\n      \"x2\",\n      \"y1\",\n      \"y2\",\n      \"datum\",\n      \"scale\",\n      \"active\",\n      \"style\",\n    ]);\n    return React.cloneElement(props.lineComponent, filteredProps);\n  }\n\n  render() {\n    return (\n      <g {...this.props.events}>\n        {this.renderLine(this.props)}\n        {this.renderBrushArea(this.props)}\n        {this.renderBrush(this.props)}\n        {this.renderHandles(this.props)}\n      </g>\n    );\n  }\n}\n"
  },
  {
    "path": "packages/victory-brush-line/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-brush-line/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-candlestick/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-candlestick/CHANGELOG.md",
    "content": "# victory-candlestick\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n### Patch Changes\n\n- Remove deprecated babel-plugin-lodash plugin ([#2965](https://github.com/FormidableLabs/victory/pull/2965))\n\n## 37.3.2\n\n## 37.3.1\n\n### Patch Changes\n\n- Remove duplicate types from interfaces ([#2940](https://github.com/FormidableLabs/victory/pull/2940))\n\n* Prevents boolean passed to candlestick labels prop from rendering ([#2931](https://github.com/FormidableLabs/victory/pull/2931))\n\n## 37.3.0\n\n## 37.2.0\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n### Patch Changes\n\n- Ensure undefined props do not overwrite defaults ([#2852](https://github.com/FormidableLabs/victory/pull/2852))\n\n## 37.0.1\n\n### Patch Changes\n\n- Fix the signature of class static functions in components ([#2840](https://github.com/FormidableLabs/victory/pull/2840))\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n### Patch Changes\n\n- Improve types for brush container and candlestick ([#2794](https://github.com/FormidableLabs/victory/pull/2794))\n\n* Replace lodash isNil and isNan with native code ([#2800](https://github.com/FormidableLabs/victory/pull/2800))\n\n- Replace lodash isFunction with native code ([#2802](https://github.com/FormidableLabs/victory/pull/2802))\n\n## 36.9.1\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n* Replace instances of lodash.range with equivalent native code ([#2760](https://github.com/FormidableLabs/victory/pull/2760))\n\n## 36.8.4\n\n## 36.8.3\n\n### Patch Changes\n\n- Refactor param reassignments ([#2724](https://github.com/FormidableLabs/victory/pull/2724))\n\n## 36.8.2\n\n### Patch Changes\n\n- Migrate victory-candlestick to TypeScript ([#2716](https://github.com/FormidableLabs/victory/pull/2716))\n\n## 36.8.1\n\n## 36.8.0\n\n### Patch Changes\n\n- Remove usage of defaultProps from components ([#2679](https://github.com/FormidableLabs/victory/pull/2679))\n\n## 36.7.0\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-core@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n- Updated dependencies [[`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-core@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-core@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- Updated dependencies [[`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-core@36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Update source code with minor lint-based improvements (see [#2236](https://github.com/FormidableLabs/victory/issues/2236)). ([#2403](https://github.com/FormidableLabs/victory/pull/2403))\n\n- Updated dependencies [[`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-core@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-candlestick/README.md",
    "content": "# VictoryCandlestick\n\n`victory-candlestick@^30.0.0` exports `VictoryCandlestick` and `Candle` components\n\nTo view documentation for `VictoryCandlestick` please see https://commerce.nearform.com/open-source/victory/docs/victory-candlestick\n\nTo suggest an addition or correction to this documentation please see https://github.com/FormidableLabs/victory/blob/main/docs/src/content/docs/victory-candlestick.md\n"
  },
  {
    "path": "packages/victory-candlestick/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-candlestick/package.json",
    "content": "{\n  \"name\": \"victory-candlestick\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Candlestick Component for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"lodash\": \"^4.17.19\",\n    \"victory-core\": \"37.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"devDependencies\": {\n    \"victory-vendor\": \"*\",\n    \"victory-chart\": \"*\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-chart:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-chart:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-chart:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:build\",\n        \"../victory-vendor:build\",\n        \"../victory-chart:build\",\n        \"../victory-voronoi:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-candlestick/src/candle.test.tsx",
    "content": "import React from \"react\";\nimport { render } from \"@testing-library/react\";\nimport { VictoryContainer } from \"victory-core\";\nimport * as d3Scale from \"victory-vendor/d3-scale\";\n\nimport { Candle } from \"./candle\";\n\ndescribe(\"victory-primitives/candle\", () => {\n  const baseProps = {\n    data: [\n      { x: 1, open: 10, close: 30, high: 50, low: 5, eventKey: 0 },\n      { x: 2, open: 40, close: 80, high: 100, low: 10, eventKey: 1 },\n    ],\n    datum: { x: 1, open: 10, close: 30, high: 50, low: 5, eventKey: 0 },\n    scale: {\n      x: d3Scale.scaleLinear(),\n      y: d3Scale.scaleLinear(),\n    },\n    candleWidth: 2,\n    x: 5,\n    high: 50,\n    low: 5,\n    close: 30,\n    open: 10,\n  };\n\n  const renderCandle = (props = {}) =>\n    render(\n      <VictoryContainer>\n        <Candle {...baseProps} {...props} />\n      </VictoryContainer>,\n    );\n\n  it(\"should render a wick line\", () => {\n    const { container } = renderCandle();\n    const wicks = container.querySelectorAll(\"line\");\n    const values = [\n      {\n        x1: 5,\n        x2: 5,\n        y1: 50,\n        y2: 10,\n      },\n      {\n        x1: 5,\n        x2: 5,\n        y1: 30,\n        y2: 5,\n      },\n    ];\n\n    wicks.forEach((wick, i) => {\n      const [x1, x2, y1, y2] = [\"x1\", \"x2\", \"y1\", \"y2\"].map((prop) =>\n        parseInt(wick.getAttribute(prop) || \"\"),\n      );\n      expect(values[i]).toMatchObject({ x1, x2, y1, y2 });\n    });\n  });\n\n  it(\"should render a candle rectangle\", () => {\n    const { container } = renderCandle();\n    const rect = container.querySelector(\"rect\");\n    const [width, height, x, y] = [\"width\", \"height\", \"x\", \"y\"].map((prop) =>\n      rect?.getAttribute(prop),\n    );\n\n    // width = style.width || 0.5 * (width - 2 * padding) / data.length;\n\n    expect(width).toEqual(\"2\");\n    expect(height).toEqual(\"20\");\n    // x = x - width / 2\n    expect(x).toEqual(\"4\");\n    expect(y).toEqual(\"10\");\n  });\n});\n"
  },
  {
    "path": "packages/victory-candlestick/src/candle.tsx",
    "content": "import React from \"react\";\nimport {\n  Helpers,\n  Line,\n  NumberOrCallback,\n  Rect,\n  VictoryCommonPrimitiveProps,\n  VictoryStyleObject,\n} from \"victory-core\";\nimport defaults from \"lodash/defaults\";\n\nexport interface CandleProps extends VictoryCommonPrimitiveProps {\n  candleRatio?: number;\n  candleWidth?: NumberOrCallback;\n  close?: number;\n  datum?: any;\n  groupComponent?: React.ReactElement;\n  high?: number;\n  lineComponent?: React.ReactElement;\n  low?: number;\n  open?: number;\n  rectComponent?: React.ReactElement;\n  wickStrokeWidth?: number;\n  width?: number;\n  x?: number;\n}\n\nconst getCandleWidth = (\n  candleWidth: CandleProps[\"candleWidth\"],\n  props: CandleProps,\n) => {\n  const { style } = props;\n  if (candleWidth) {\n    return Helpers.isFunction(candleWidth)\n      ? Helpers.evaluateProp(candleWidth, props)\n      : candleWidth;\n  } else if (style.width) {\n    return style.width;\n  }\n  return candleWidth;\n};\n\nconst getCandleProps = (props, style: VictoryStyleObject) => {\n  const { id, x, close, open, horizontal, candleWidth } = props;\n  const candleLength = Math.abs(close - open);\n  return {\n    key: `${id}-candle`,\n    style: Helpers.omit(style, [\"width\"]),\n    x: horizontal ? Math.min(open, close) : x - candleWidth / 2,\n    y: horizontal ? x - candleWidth / 2 : Math.min(open, close),\n    width: horizontal ? candleLength : candleWidth,\n    height: horizontal ? candleWidth : candleLength,\n  };\n};\n\nconst getHighWickProps = (props, style: VictoryStyleObject) => {\n  const { horizontal, high, open, close, x, id } = props;\n  return {\n    key: `${id}-highWick`,\n    style: Helpers.omit(style, [\"width\"]),\n    x1: horizontal ? high : x,\n    x2: horizontal ? Math.max(open, close) : x,\n    y1: horizontal ? x : high,\n    y2: horizontal ? x : Math.min(open, close),\n  };\n};\n\nconst getLowWickProps = (props, style: VictoryStyleObject) => {\n  const { horizontal, low, open, close, x, id } = props;\n  return {\n    key: `${id}-lowWick`,\n    style: Helpers.omit(style, [\"width\"]),\n    x1: horizontal ? Math.min(open, close) : x,\n    x2: horizontal ? low : x,\n    y1: horizontal ? x : Math.max(open, close),\n    y2: horizontal ? x : low,\n  };\n};\n\nconst evaluateProps = (props) => {\n  /**\n   * Potential evaluated props of following must be evaluated in this order:\n   * 1) `style`\n   * 2) `cornerRadius`\n   *\n   * Everything else does not have to be evaluated in a particular order:\n   * `ariaLabel`\n   * `desc`\n   * `id`\n   * `tabIndex`\n   */\n  const style = Helpers.evaluateStyle(\n    Object.assign({ stroke: \"black\" }, props.style),\n    props,\n  );\n  const candleWidth = getCandleWidth(\n    props.candleWidth,\n    Object.assign({}, props, { style }),\n  );\n\n  const ariaLabel = Helpers.evaluateProp(props.ariaLabel, props);\n  const desc = Helpers.evaluateProp(props.desc, props);\n  const id = Helpers.evaluateProp(props.id, props);\n  const tabIndex = Helpers.evaluateProp(props.tabIndex, props);\n\n  return Object.assign({}, props, {\n    ariaLabel,\n    style,\n    candleWidth,\n    desc,\n    id,\n    tabIndex,\n  });\n};\n\nconst defaultProps: Partial<CandleProps> = {\n  groupComponent: <g />,\n  lineComponent: <Line />,\n  rectComponent: <Rect />,\n  role: \"presentation\",\n  shapeRendering: \"auto\",\n};\n\nexport const Candle = (props: CandleProps) => {\n  const modifiedProps = evaluateProps(defaults({}, props, defaultProps));\n  const {\n    ariaLabel,\n    events,\n    groupComponent,\n    clipPath,\n    rectComponent,\n    lineComponent,\n    role,\n    shapeRendering,\n    className,\n    wickStrokeWidth,\n    transform,\n    style,\n    desc,\n    tabIndex,\n  } = modifiedProps;\n  const wickStyle = defaults({ strokeWidth: wickStrokeWidth }, style);\n  const sharedProps = {\n    ...events,\n    \"aria-label\": ariaLabel,\n    role,\n    shapeRendering,\n    className,\n    transform,\n    clipPath,\n    desc,\n    tabIndex,\n  };\n  const candleProps = Object.assign(\n    getCandleProps(modifiedProps, style),\n    sharedProps,\n  );\n  const highWickProps = Object.assign(\n    getHighWickProps(modifiedProps, wickStyle),\n    sharedProps,\n  );\n  const lowWickProps = Object.assign(\n    getLowWickProps(modifiedProps, wickStyle),\n    sharedProps,\n  );\n\n  return React.cloneElement(groupComponent, {}, [\n    React.cloneElement(rectComponent, candleProps),\n    React.cloneElement(lineComponent, highWickProps),\n    React.cloneElement(lineComponent, lowWickProps),\n  ]);\n};\n"
  },
  {
    "path": "packages/victory-candlestick/src/helper-methods.test.ts",
    "content": "import { fromJS } from \"immutable\";\nimport { Helpers } from \"victory-core\";\n\nimport { getData, getDomain } from \"./helper-methods\";\n\nconst immutableGetDataTest = {\n  createData: (x) => fromJS(x),\n  testLabel: \"with immutable data\",\n};\nconst getDataTest = {\n  createData: (x) => x,\n  testLabel: \"with js data\",\n};\n\n[getDataTest, immutableGetDataTest].forEach(({ createData, testLabel }) => {\n  describe(`victory-candlestick/helper-methods ${testLabel}`, () => {\n    describe(\"getData\", () => {\n      it(\"sorts data by sortKey\", () => {\n        const data = createData(\n          Helpers.range(5)\n            .map((i) => ({ x: i, open: i, close: i, high: i, low: i }))\n            .reverse(),\n        );\n\n        const dataResult = getData({\n          data,\n          x: \"x\",\n          open: \"open\",\n          close: \"close\",\n          high: \"high\",\n          low: \"low\",\n          sortKey: \"x\",\n        });\n\n        expect(dataResult.map((datum) => datum.x)).toEqual([0, 1, 2, 3, 4]);\n      });\n    });\n\n    describe(\"getDomain\", () => {\n      const dataSet = createData([\n        { x: 5, open: 10, close: 20, high: 25, low: 5 },\n        { x: 10, open: 15, close: 25, high: 30, low: 10 },\n      ]);\n\n      it(\"returns a domain array for the x axis\", () => {\n        const domainXResult = getDomain(\n          {\n            data: dataSet,\n            x: \"x\",\n            open: \"open\",\n            close: \"close\",\n            high: \"high\",\n            low: \"low\",\n          },\n          \"x\",\n        );\n        expect(domainXResult).toEqual([5, 10]);\n      });\n\n      it(\"returns a domain array for the y axis\", () => {\n        const domainYResult = getDomain(\n          {\n            data: dataSet,\n            open: \"open\",\n            close: \"close\",\n            high: \"high\",\n            low: \"low\",\n          },\n          \"y\",\n        );\n        expect(domainYResult).toEqual([5, 30]);\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-candlestick/src/helper-methods.ts",
    "content": "import defaults from \"lodash/defaults\";\nimport isPlainObject from \"lodash/isPlainObject\";\n\nimport {\n  Helpers,\n  Scale,\n  Domain,\n  Data,\n  LabelHelpers,\n  Collection,\n  VictoryStyleObject,\n} from \"victory-core\";\n\nconst TYPES = [\"close\", \"open\", \"high\", \"low\"];\n\nconst DEFAULT_CANDLE_WIDTH = 8;\n\nexport const getData = (props) => {\n  const accessorTypes = [\"x\", \"high\", \"low\", \"close\", \"open\"];\n  return Data.formatData(props.data, props, accessorTypes);\n};\n\nconst reduceData = (dataset, axis, type) => {\n  const yDataTypes = { min: \"_low\", max: \"_high\" };\n  const dataType = axis === \"x\" ? \"_x\" : yDataTypes[type];\n  const baseCondition = type === \"min\" ? Infinity : -Infinity;\n  return dataset.reduce((memo, datum) => {\n    const current = datum[dataType];\n    return (memo < current && type === \"min\") ||\n      (memo > current && type === \"max\")\n      ? memo\n      : current;\n  }, baseCondition);\n};\n\nconst getDomainFromData = (props, axis) => {\n  const minDomain = Domain.getMinFromProps(props, axis);\n  const maxDomain = Domain.getMaxFromProps(props, axis);\n  const dataset = getData(props);\n  if (dataset.length < 1) {\n    return minDomain !== undefined && maxDomain !== undefined\n      ? Domain.getDomainFromMinMax(minDomain, maxDomain)\n      : undefined;\n  }\n  const min =\n    minDomain !== undefined ? minDomain : reduceData(dataset, axis, \"min\");\n  const max =\n    maxDomain !== undefined ? maxDomain : reduceData(dataset, axis, \"max\");\n  return Domain.getDomainFromMinMax(min, max);\n};\n\nexport const getDomain = (props, axis) => {\n  return Domain.createDomainFunction(getDomainFromData)(props, axis);\n};\n\nconst getLabelStyle = (props, styleObject, namespace) => {\n  const component = props[`${namespace}LabelComponent`];\n  const baseStyle = styleObject[`${namespace}Labels`] || styleObject.labels;\n  if (!Helpers.isTooltip(component)) {\n    return baseStyle;\n  }\n  const tooltipTheme = (props.theme && props.theme.tooltip) || {};\n  return defaults({}, tooltipTheme.style, baseStyle);\n};\n\nconst getStyles = (\n  props,\n  style,\n  defaultStyles: {\n    parent?: any;\n    labels?: any;\n    data?: any;\n  } = {},\n) => {\n  if (props.disableInlineStyles) {\n    return {};\n  }\n  const width = \"100%\";\n  const height = \"100%\";\n\n  if (!style) {\n    return defaults(\n      {\n        parent: {\n          height,\n          width,\n        },\n      },\n      defaultStyles,\n    );\n  }\n\n  const defaultParent = defaultStyles.parent || {};\n  const defaultLabels = defaultStyles.labels || {};\n  const defaultData = defaultStyles.data || {};\n  const labelStyle = defaults({}, style.labels, defaultLabels);\n  return {\n    parent: defaults({}, style.parent, defaultParent, {\n      width,\n      height,\n    }),\n    labels: labelStyle,\n    data: defaults({}, style.data, defaultData),\n    openLabels: defaults(\n      {},\n      style.openLabels,\n      getLabelStyle(props, defaultStyles, \"open\"),\n      labelStyle,\n    ),\n    closeLabels: defaults(\n      {},\n      style.closeLabels,\n      getLabelStyle(props, defaultStyles, \"close\"),\n      labelStyle,\n    ),\n    lowLabels: defaults(\n      {},\n      style.lowLabels,\n      getLabelStyle(props, defaultStyles, \"low\"),\n      labelStyle,\n    ),\n    highLabels: defaults(\n      {},\n      style.highLabels,\n      getLabelStyle(props, defaultStyles, \"high\"),\n      labelStyle,\n    ),\n  };\n};\n\n// This method will edit or remove candlestick data points that fall outside of the desired domain\n\nconst formatDataFromDomain = (datum, domain) => {\n  const minDomainX = Collection.getMinValue(domain.x);\n  const maxDomainX = Collection.getMaxValue(domain.x);\n  const minDomainY = Collection.getMinValue(domain.y);\n  const maxDomainY = Collection.getMaxValue(domain.y);\n  let { _x, _low, _open, _close, _high } = datum;\n\n  // if _x falls outside of min or max\n  if (_x < minDomainX || _x > maxDomainX) _x = null;\n\n  // if all values fall outside of domain, null the data point\n  if (\n    _low < minDomainY &&\n    _open < minDomainY &&\n    _close < minDomainY &&\n    _high < minDomainY\n  )\n    _low = _open = _close = _high = null;\n  if (\n    _low > maxDomainY &&\n    _open > maxDomainY &&\n    _close > maxDomainY &&\n    _high > maxDomainY\n  )\n    _low = _open = _close = _high = null;\n\n  return Object.assign({}, datum, { _x, _low, _open, _close, _high });\n};\n\nconst getCalculatedValues = (props) => {\n  const { polar } = props;\n  const defaultStyle = Helpers.getDefaultStyles(props, \"candlestick\");\n  const style = getStyles(props, props.style, defaultStyle);\n  const data = getData(props);\n  const range = {\n    x: Helpers.getRange(props, \"x\"),\n    y: Helpers.getRange(props, \"y\"),\n  };\n  const domain = {\n    x: getDomain(props, \"x\"),\n    y: getDomain(props, \"y\"),\n  };\n  const scale = {\n    x: Scale.getBaseScale(props, \"x\")\n      .domain(domain.x)\n      .range(props.horizontal ? range.y : range.x),\n    y: Scale.getBaseScale(props, \"y\")\n      .domain(domain.y)\n      .range(props.horizontal ? range.x : range.y),\n  };\n  const origin = polar\n    ? props.origin || Helpers.getPolarOrigin(props)\n    : undefined;\n  const defaultOrientation = props.horizontal ? \"top\" : \"right\";\n  const labelOrientation = props.labelOrientation || defaultOrientation;\n  return { domain, data, scale, style, origin, labelOrientation };\n};\n\nconst isTransparent = (attr) => {\n  return attr === \"none\" || attr === \"transparent\";\n};\n\nconst getDataStyles = (\n  datum,\n  style: { fill?: string; stroke?: string } = {},\n  props,\n) => {\n  if (props.disableInlineStyles) {\n    return {};\n  }\n  const candleColor =\n    datum._open > datum._close\n      ? props.candleColors.negative\n      : props.candleColors.positive;\n  const fill = style.fill || candleColor;\n  const strokeColor = style.stroke;\n  const stroke = isTransparent(strokeColor) ? fill : strokeColor || \"black\";\n  return Object.assign({}, style, { stroke, fill });\n};\n\nconst getText = (props, type) => {\n  const { datum, index, labels } = props;\n  const propName = `${type}Labels`;\n  const labelProp = props[propName];\n  if (!labelProp && !labels) {\n    return null;\n  } else if (labelProp === true || labels === true) {\n    const dataName = `_${type}`;\n    return `${datum[dataName]}`;\n  }\n  return Array.isArray(labelProp) ? labelProp[index] : labelProp;\n};\n\nconst getCandleWidth = (props, style?: VictoryStyleObject) => {\n  const { data, candleWidth, scale } = props;\n  if (candleWidth) {\n    return Helpers.isFunction(candleWidth)\n      ? Helpers.evaluateProp(candleWidth, props)\n      : candleWidth;\n  } else if (style && style.width) {\n    return style.width;\n  }\n  const range = scale.x.range();\n  const extent = Math.abs(range[1] - range[0]);\n  const candles = data.length + 2;\n  const candleRatio = props.candleRatio || 0.5;\n  const defaultWidth =\n    candleRatio * (data.length < 2 ? DEFAULT_CANDLE_WIDTH : extent / candles);\n  return Math.max(1, defaultWidth);\n};\n\nconst getOrientation = (labelOrientation, type = \"labels\") => {\n  return isPlainObject(labelOrientation)\n    ? labelOrientation[type]\n    : labelOrientation;\n};\n\nconst calculatePlotValues = (props) => {\n  const {\n    positions,\n    labelStyle,\n    x,\n    horizontal,\n    computedType,\n    candleWidth,\n    orientation,\n  } = props;\n  positions.labels = (positions.open + positions.close) / 2;\n\n  const signX = orientation === \"left\" ? -1 : 1;\n  const signY = orientation === \"top\" ? -1 : 1;\n\n  if (horizontal) {\n    const yValue = x;\n    const xValue = positions[computedType];\n\n    const dy =\n      orientation === \"top\" || orientation === \"bottom\"\n        ? signY * (candleWidth / 2) + signY * (labelStyle?.padding || 0)\n        : 0;\n\n    const dx =\n      orientation === \"top\" || orientation === \"bottom\"\n        ? 0\n        : signX * (labelStyle?.padding || 1);\n\n    return { yValue, xValue, dx, dy };\n  }\n  const xValue = x;\n  const yValue = positions[computedType];\n\n  const dy =\n    orientation === \"top\" || orientation === \"bottom\"\n      ? signY * (labelStyle?.padding || 1)\n      : 0;\n\n  const dx =\n    orientation === \"top\" || orientation === \"bottom\"\n      ? 0\n      : signX * (candleWidth / 2) + signX * (labelStyle?.padding || 0);\n\n  return { yValue, xValue, dx, dy };\n};\n\n/* eslint-disable max-params*/\nconst getLabelProps = (props, text, style, type?: string) => {\n  const {\n    x,\n    high,\n    low,\n    open,\n    close,\n    index,\n    scale,\n    datum,\n    data,\n    horizontal,\n    candleWidth,\n    labelOrientation,\n    theme,\n  } = props;\n\n  const component = props[`${type}LabelComponent`] || props.labelComponent;\n  const defaultOrientation = horizontal ? \"top\" : \"right\";\n  const orientation =\n    (component.props && component.props.orientation) ||\n    getOrientation(labelOrientation, type) ||\n    defaultOrientation;\n  const positions = { high, low, open, close };\n  const namespace = type ? `${type}Labels` : \"labels\";\n  const labelStyle = style[namespace] || style.labels;\n  const defaultVerticalAnchors = {\n    top: \"end\",\n    bottom: \"start\",\n    left: \"middle\",\n    right: \"middle\",\n  };\n  const defaultTextAnchors = {\n    left: \"end\",\n    right: \"start\",\n    top: \"middle\",\n    bottom: \"middle\",\n  };\n  const computedType = type ? type : \"labels\";\n\n  const plotProps = {\n    positions,\n    labelStyle,\n    x,\n    horizontal,\n    computedType,\n    candleWidth,\n    orientation,\n  };\n  const { yValue, xValue, dx, dy } = calculatePlotValues(plotProps);\n\n  const labelProps = {\n    style: labelStyle,\n    y: yValue,\n    x: xValue,\n    dx,\n    dy,\n    text,\n    index,\n    scale,\n    datum,\n    data,\n    orientation,\n    textAnchor: labelStyle?.textAnchor || defaultTextAnchors[orientation],\n    verticalAnchor:\n      labelStyle?.verticalAnchor || defaultVerticalAnchors[orientation],\n    angle: labelStyle?.angle,\n    horizontal,\n  };\n\n  if (!Helpers.isTooltip(component)) {\n    return labelProps;\n  }\n  const tooltipTheme = (theme && theme.tooltip) || {};\n  return defaults({}, labelProps, Helpers.omit(tooltipTheme, [\"style\"]));\n};\n/* eslint-enable max-params*/\n\nexport const getBaseProps = (initialProps, fallbackProps) => {\n  const props = Helpers.modifyProps(initialProps, fallbackProps, \"candlestick\");\n  const calculatedValues = getCalculatedValues(props);\n  const { data, style, scale, domain, origin, labelOrientation } =\n    calculatedValues;\n  const {\n    groupComponent,\n    width,\n    height,\n    padding,\n    standalone,\n    name,\n    candleWidth,\n    candleRatio,\n    theme,\n    polar,\n    wickStrokeWidth,\n    labels,\n    events,\n    sharedEvents,\n    horizontal,\n    disableInlineStyles,\n  } = props;\n  const initialChildProps = {\n    parent: {\n      domain,\n      scale,\n      width,\n      height,\n      data,\n      standalone,\n      theme,\n      polar,\n      origin,\n      name,\n      style: style.parent,\n      padding,\n      horizontal,\n    },\n  };\n\n  return data.reduce((childProps, datum, index) => {\n    const eventKey = !Helpers.isNil(datum.eventKey) ? datum.eventKey : index;\n    const x = scale.x(datum._x1 !== undefined ? datum._x1 : datum._x);\n    const formattedDatum = formatDataFromDomain(datum, domain);\n    const { _low, _open, _close, _high } = formattedDatum;\n    const high = scale.y(_high);\n    const close = scale.y(_close);\n    const open = scale.y(_open);\n    const low = scale.y(_low);\n\n    const dataStyle = getDataStyles(formattedDatum, style.data, props);\n    const dataProps = {\n      x,\n      high,\n      low,\n      candleWidth,\n      candleRatio,\n      scale,\n      data,\n      datum: formattedDatum,\n      groupComponent,\n      index,\n      style: dataStyle,\n      width,\n      polar,\n      origin,\n      wickStrokeWidth,\n      open,\n      close,\n      horizontal,\n      labelOrientation,\n      disableInlineStyles,\n    };\n    dataProps.candleWidth = getCandleWidth(dataProps);\n    const extendedProps = defaults(Object.assign({}, dataProps), props);\n\n    childProps[eventKey] = {\n      data: dataProps,\n    };\n\n    if (labels) {\n      const text = LabelHelpers.getText(props, formattedDatum, index);\n      if (\n        (text !== undefined && text !== null) ||\n        (labels && (events || sharedEvents))\n      ) {\n        childProps[eventKey].labels = getLabelProps(extendedProps, text, style);\n      }\n    }\n\n    TYPES.forEach((type) => {\n      const labelText = getText(extendedProps, type);\n      const labelProp = props.labels || props[`${type}Labels`];\n      if (\n        (labelText !== null && labelText !== undefined) ||\n        (labelProp && (events || sharedEvents))\n      ) {\n        const target = `${type}Labels`;\n        childProps[eventKey][target] = getLabelProps(\n          extendedProps,\n          labelText,\n          style,\n          type,\n        );\n      }\n    });\n\n    return childProps;\n  }, initialChildProps);\n};\n"
  },
  {
    "path": "packages/victory-candlestick/src/index.ts",
    "content": "export * from \"./victory-candlestick\";\nexport * from \"./candle\";\n"
  },
  {
    "path": "packages/victory-candlestick/src/victory-candlestick.test.tsx",
    "content": "import { fireEvent, render, screen } from \"@testing-library/react\";\nimport React from \"react\";\nimport { VictoryChart } from \"victory-chart\";\nimport { Helpers } from \"victory-core\";\nimport { Candle } from \"./candle\";\nimport { VictoryCandlestick } from \"./victory-candlestick\";\n\nconst MyCandle = () => <div data-testid=\"my-candle\" />;\n\nconst dataSet = [\n  { x: 5, open: 10, close: 20, high: 25, low: 5 },\n  { x: 1, open: 80, close: 40, high: 120, low: 10, label: \"1\" },\n];\n\ndescribe(\"components/victory-candlestick\", () => {\n  describe(\"default component rendering\", () => {\n    it(\"attaches safe user props to the container component\", () => {\n      render(\n        <VictoryCandlestick\n          data-testid=\"victory-candlestick\"\n          aria-label=\"Chart\"\n          unsafe-prop=\"test\"\n        />,\n      );\n\n      const container = screen.getByTestId(\"victory-candlestick\");\n      expect(screen.getByLabelText(\"Chart\")).toBeDefined();\n      expect(container).not.toHaveAttribute(\"unsafe-prop\");\n      expect(container.nodeName).toEqual(\"svg\");\n    });\n\n    it(\"attaches safe user props to the group component if the component is rendered inside a VictoryChart\", () => {\n      render(\n        <VictoryCandlestick\n          data-testid=\"victory-candlestick\"\n          aria-label=\"Chart\"\n          unsafe-prop=\"test\"\n        />,\n        { wrapper: VictoryChart },\n      );\n\n      const container = screen.getByTestId(\"victory-candlestick\");\n      expect(screen.getByLabelText(\"Chart\")).toBeDefined();\n      expect(container).not.toHaveAttribute(\"unsafe-prop\");\n      expect(container.nodeName).toEqual(\"g\");\n    });\n\n    it(\"renders an svg with the correct width and height\", () => {\n      const { container } = render(<VictoryCandlestick data={dataSet} />);\n      const svg = container.querySelector(\"svg\");\n      expect(svg?.getAttribute(\"style\")).toContain(\"width: 100%; height: 100%\");\n    });\n\n    it(\"renders an svg with the correct viewBox\", () => {\n      const { container } = render(<VictoryCandlestick data={dataSet} />);\n      const svg = container.querySelector(\"svg\");\n      const viewBoxValue = `0 0 ${450} ${300}`;\n      expect(svg?.getAttribute(\"viewBox\")).toEqual(viewBoxValue);\n    });\n\n    it(\"renders 8 points\", () => {\n      const { container } = render(<VictoryCandlestick />);\n      const points = container.querySelectorAll(\"rect\");\n      expect(points).toHaveLength(8);\n    });\n  });\n\n  describe(\"rendering data\", () => {\n    it(\"renders injected points for {x, y} shaped data (default)\", () => {\n      const data = Helpers.range(5).map((i) => ({\n        x: i,\n        open: i,\n        close: i,\n        high: i,\n        low: i,\n      }));\n      render(<VictoryCandlestick data={data} dataComponent={<MyCandle />} />);\n\n      const points = screen.getAllByTestId(\"my-candle\");\n      expect(points).toHaveLength(5);\n    });\n\n    it(\"renders points for {x, y} shaped data (default)\", () => {\n      const data = Helpers.range(5).map((i) => ({\n        x: i,\n        open: i,\n        close: i,\n        high: i,\n        low: i,\n      }));\n      const { container } = render(<VictoryCandlestick data={data} />);\n      const points = container.querySelectorAll(\"rect\");\n      expect(points).toHaveLength(5);\n    });\n\n    it(\"renders ordered bars when sortKey is passed\", () => {\n      const data = Helpers.range(5)\n        .map((i) => ({ x: i, open: i, close: i, high: i, low: i }))\n        .reverse();\n      const { container } = render(\n        <VictoryCandlestick data={data} sortKey=\"x\" />,\n      );\n      const candles = container.querySelectorAll(\"rect\");\n      const xValues = Array.from(candles).map((bar) =>\n        Number(bar.getAttribute(\"x\")),\n      );\n      const xValuesAscending = [...xValues].sort((a, b) => a - b);\n      expect(xValues).toEqual(xValuesAscending);\n    });\n\n    it(\"renders reverse ordered bars when sortOrder is descending\", () => {\n      const data = Helpers.range(5)\n        .map((i) => ({ x: i, open: i, close: i, high: i, low: i }))\n        .reverse();\n      const { container } = render(\n        <VictoryCandlestick data={data} sortKey=\"x\" sortOrder=\"descending\" />,\n      );\n      const candles = container.querySelectorAll(\"rect\");\n      const xValues = Array.from(candles).map((bar) =>\n        Number(bar.getAttribute(\"x\")),\n      );\n      const xValuesDescending = [...xValues].sort((a, b) => b - a);\n      expect(xValues).toEqual(xValuesDescending);\n    });\n\n    it(\"renders points for array-shaped data\", () => {\n      const data = Helpers.range(10).map((i) => [i, i, i, i, i]);\n      const { container } = render(\n        <VictoryCandlestick\n          data={data}\n          x={0}\n          open={1}\n          close={2}\n          high={3}\n          low={4}\n        />,\n      );\n      const points = container.querySelectorAll(\"rect\");\n      expect(points).toHaveLength(10);\n    });\n\n    it(\"renders points for deeply-nested data\", () => {\n      const data = Helpers.range(20).map((i) => ({\n        a: { b: [{ x: i, open: i, close: i, high: i, low: i }] },\n      }));\n      const { container } = render(\n        <VictoryCandlestick\n          data={data}\n          x=\"a.b[0].x\"\n          open=\"a.b[0].open\"\n          close=\"a.b[0].close\"\n          high=\"a.b[0].high\"\n          low=\"a.b[0].low\"\n        />,\n      );\n      const points = container.querySelectorAll(\"rect\");\n      expect(points).toHaveLength(20);\n    });\n\n    it(\"renders data values with null accessor\", () => {\n      const data = Helpers.range(10);\n      const { container } = render(\n        // @ts-expect-error \"'null' is not assignable to 'x'\"\n        <VictoryCandlestick\n          data={data}\n          x={null}\n          open={null}\n          close={null}\n          high={null}\n          low={null}\n        />,\n      );\n      const points = container.querySelectorAll(\"rect\");\n      expect(points).toHaveLength(10);\n    });\n\n    it(\"does not render data with null x, open, close, high, or low values\", () => {\n      const data = [\n        { x: 1, open: 10, close: 17, high: 19, low: 8 },\n        { x: null, open: 17, close: 17, high: 17, low: 17 },\n        { x: 2, open: null, close: 17, high: 17, low: 17 },\n        { x: 3, open: 17, close: null, high: 17, low: 17 },\n        { x: 4, open: 17, close: 17, high: null, low: 17 },\n        { x: 5, open: 17, close: 17, high: 17, low: null },\n      ];\n      const { container } = render(<VictoryCandlestick data={data} />);\n      const points = container.querySelectorAll(\"rect\");\n      expect(points).toHaveLength(1);\n    });\n\n    it(\"does not render a label when it receives true as the lablels prop\", () => {\n      const data = [{ x: 1, open: 10, close: 17, high: 19, low: 8 }];\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore\n      const { container } = render(<VictoryCandlestick data={data} labels />);\n      const trueLabel = Array.from(\n        container.querySelectorAll(\"text[id^=candlestick-labels] > tspan\"),\n      ).find((t) => t.textContent === \"true\");\n      expect(trueLabel).toBe(undefined);\n    });\n  });\n\n  describe(\"event handling\", () => {\n    const clickHandler = jest.fn();\n\n    beforeEach(() => {\n      clickHandler.mockReset();\n    });\n\n    it(\"attaches an event to data\", () => {\n      const { container } = render(\n        <VictoryCandlestick\n          data={dataSet}\n          events={[\n            {\n              target: \"data\",\n              eventHandlers: { onClick: clickHandler },\n            },\n          ]}\n        />,\n      );\n\n      const data = container.querySelectorAll(\"rect\");\n\n      data.forEach((node, index) => {\n        clickHandler.mockReset();\n        fireEvent.click(node);\n        const { key } = clickHandler.mock.calls[0][1];\n        expect(key).toEqual(`candlestick-data-${index}`);\n      });\n    });\n  });\n\n  describe(\"accessibility\", () => {\n    it(\"adds an aria role to each point in the series\", () => {\n      const data = [\n        { x: 0, open: 9, close: 30, high: 56, low: 7 },\n        { x: 1, open: 80, close: 40, high: 120, low: 10 },\n        { x: 2, open: 50, close: 80, high: 90, low: 20 },\n      ];\n      render(<VictoryCandlestick data={data} />);\n\n      const presentationElements = screen.getAllByRole(\"presentation\");\n\n      // Each data point is 4 (container, rect and 2 lines) for 12 total\n      // plus the chart container element\n      expect(presentationElements).toHaveLength(13);\n    });\n\n    it(\"adds an aria-label and tabIndex to Candle primitive\", () => {\n      const data = [\n        { x: new Date(2016, 6, 1), open: 20, close: 43, high: 66, low: 7 },\n        { x: new Date(2016, 6, 2), open: 80, close: 40, high: 120, low: 10 },\n        { x: new Date(2016, 6, 3), open: 50, close: 80, high: 90, low: 20 },\n      ];\n      const { container } = render(\n        <VictoryCandlestick\n          data={data}\n          dataComponent={\n            <Candle\n              data-testid=\"candle\"\n              ariaLabel={({ datum }) =>\n                `open ${datum.open}, close ${datum.close}`\n              }\n              tabIndex={({ index }) => Number(index) + 5}\n            />\n          }\n        />,\n      );\n\n      container.querySelectorAll(\"rect\").forEach((node, index) => {\n        const expectedLabel = `open ${data[index].open}, close ${data[index].close}`;\n        expect(node.getAttribute(\"aria-label\")).toEqual(expectedLabel);\n        expect(node.getAttribute(\"tabindex\")).toEqual(`${index + 5}`);\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-candlestick/src/victory-candlestick.tsx",
    "content": "import React from \"react\";\nimport {\n  Helpers,\n  VictoryLabel,\n  addEvents,\n  VictoryContainer,\n  VictoryTheme,\n  DefaultTransitions,\n  UserProps,\n  StringOrNumberOrCallback,\n  EventPropTypeInterface,\n  OrientationTypes,\n  VictoryCommonProps,\n  VictoryDatableProps,\n  VictoryLabelStyleObject,\n  VictoryMultiLabelableProps,\n  VictoryStyleObject,\n  NumberOrCallback,\n  EventsMixinClass,\n} from \"victory-core\";\nimport { Candle } from \"./candle\";\nimport { getDomain, getData, getBaseProps } from \"./helper-methods\";\n\nexport interface VictoryCandlestickStyleInterface {\n  close?: VictoryStyleObject;\n  closeLabels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n  data?: VictoryStyleObject;\n  high?: VictoryStyleObject;\n  highLabels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n  labels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n  low?: VictoryStyleObject;\n  lowLabels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n  open?: VictoryStyleObject;\n  openLabels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n  parent?: VictoryStyleObject;\n}\n\nexport type VictoryCandlestickLabelsType =\n  | (string | number)[]\n  | boolean\n  | ((datum: any) => number | string);\n\nexport interface VictoryCandlestickProps\n  extends Omit<VictoryCommonProps, \"polar\">,\n    VictoryDatableProps,\n    VictoryMultiLabelableProps {\n  candleColors?: {\n    positive?: string;\n    negative?: string;\n  };\n  candleRatio?: number;\n  candleWidth?: NumberOrCallback;\n  close?: StringOrNumberOrCallback | string[];\n  closeLabelComponent?: React.ReactElement;\n  closeLabels?: VictoryCandlestickLabelsType;\n  eventKey?: StringOrNumberOrCallback | string[];\n  events?: EventPropTypeInterface<\n    | \"data\"\n    | \"labels\"\n    | \"open\"\n    | \"openLabels\"\n    | \"close\"\n    | \"closeLabels\"\n    | \"low\"\n    | \"lowLabels\"\n    | \"high\"\n    | \"highLabels\",\n    StringOrNumberOrCallback | string[]\n  >[];\n  high?: StringOrNumberOrCallback | string[];\n  highLabelComponent?: React.ReactElement;\n  highLabels?: VictoryCandlestickLabelsType;\n  labelOrientation?:\n    | OrientationTypes\n    | {\n        open?: OrientationTypes;\n        close?: OrientationTypes;\n        low?: OrientationTypes;\n        high?: OrientationTypes;\n      };\n  low?: StringOrNumberOrCallback | string[];\n  lowLabelComponent?: React.ReactElement;\n  lowLabels?: VictoryCandlestickLabelsType;\n  open?: StringOrNumberOrCallback | string[];\n  openLabelComponent?: React.ReactElement;\n  openLabels?: VictoryCandlestickLabelsType;\n  size?: number;\n  style?: VictoryCandlestickStyleInterface;\n  wickStrokeWidth?: number;\n}\n\n/* eslint-disable no-magic-numbers */\nconst fallbackProps = {\n  width: 450,\n  height: 300,\n  padding: 50,\n  candleColors: {\n    positive: \"#ffffff\",\n    negative: \"#252525\",\n  },\n};\n\nconst options = {\n  components: [\n    { name: \"lowLabels\" },\n    { name: \"highLabels\" },\n    { name: \"openLabels\" },\n    { name: \"closeLabels\" },\n    { name: \"labels\" },\n    { name: \"data\" },\n    { name: \"parent\", index: \"parent\" },\n  ],\n};\n\nconst defaultData = [\n  { x: new Date(2016, 6, 1), open: 5, close: 10, high: 15, low: 0 },\n  { x: new Date(2016, 6, 2), open: 10, close: 15, high: 20, low: 5 },\n  { x: new Date(2016, 6, 3), open: 15, close: 20, high: 25, low: 10 },\n  { x: new Date(2016, 6, 4), open: 20, close: 25, high: 30, low: 15 },\n  { x: new Date(2016, 6, 5), open: 25, close: 30, high: 35, low: 20 },\n  { x: new Date(2016, 6, 6), open: 30, close: 35, high: 40, low: 25 },\n  { x: new Date(2016, 6, 7), open: 35, close: 40, high: 45, low: 30 },\n  { x: new Date(2016, 6, 8), open: 40, close: 45, high: 50, low: 35 },\n];\n/* eslint-enable no-magic-numbers */\nconst datumHasXandY = (datum) => {\n  return !Helpers.isNil(datum._x) && !Helpers.isNil(datum._y);\n};\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface VictoryCandlestickBase\n  extends EventsMixinClass<VictoryCandlestickProps> {}\n\n/**\n * VictoryCandlestick renders a dataset as a series of candlesticks.\n * VictoryCandlestick can be composed with VictoryChart to create candlestick charts.\n */\nclass VictoryCandlestickBase extends React.Component<VictoryCandlestickProps> {\n  static animationWhitelist = [\n    \"data\",\n    \"domain\",\n    \"height\",\n    \"padding\",\n    \"samples\",\n    \"size\",\n    \"style\",\n    \"width\",\n  ];\n\n  static displayName = \"VictoryCandlestick\";\n  static role = \"candlestick\";\n  static defaultTransitions = DefaultTransitions.discreteTransitions();\n\n  static defaultProps: VictoryCandlestickProps = {\n    containerComponent: <VictoryContainer />,\n    data: defaultData,\n    dataComponent: <Candle />,\n    groupComponent: <g role=\"presentation\" />,\n    labelComponent: <VictoryLabel />,\n    highLabelComponent: <VictoryLabel />,\n    lowLabelComponent: <VictoryLabel />,\n    openLabelComponent: <VictoryLabel />,\n    closeLabelComponent: <VictoryLabel />,\n    samples: 50,\n    sortOrder: \"ascending\",\n    standalone: true,\n    theme: VictoryTheme.grayscale,\n  };\n\n  static getDomain(props, axis) {\n    return getDomain(props, axis);\n  }\n  static getData(props) {\n    return getData(props);\n  }\n  static getBaseProps(props: VictoryCandlestickProps) {\n    return getBaseProps(props, fallbackProps);\n  }\n  static expectedComponents = [\n    \"openLabelComponent\",\n    \"closeLabelComponent\",\n    \"highLabelComponent\",\n    \"lowLabelComponent\",\n    \"dataComponent\",\n    \"labelComponent\",\n    \"groupComponent\",\n    \"containerComponent\",\n  ];\n\n  // Overridden in native versions\n  shouldAnimate() {\n    return !!this.props.animate;\n  }\n\n  shouldRenderDatum = (datum) => {\n    return (\n      !Helpers.isNil(datum._x) &&\n      !Helpers.isNil(datum._high) &&\n      !Helpers.isNil(datum._low) &&\n      !Helpers.isNil(datum._close) &&\n      !Helpers.isNil(datum._open)\n    );\n  };\n\n  renderCandleData(\n    props: VictoryCandlestickProps,\n    shouldRenderDatum = datumHasXandY,\n  ) {\n    const { dataComponent, labelComponent, groupComponent } = props;\n    const types = [\"close\", \"open\", \"low\", \"high\"];\n\n    if (!groupComponent) {\n      throw new Error(\"VictoryCandlestick expects a groupComponent prop\");\n    }\n\n    const children: React.ReactElement[] = [];\n\n    if (dataComponent) {\n      const dataComponents = this.dataKeys.reduce<React.ReactElement[]>(\n        (validDataComponents, _dataKey, index) => {\n          const dataProps = this.getComponentProps(\n            dataComponent,\n            \"data\",\n            index,\n          );\n          if (shouldRenderDatum((dataProps as any).datum)) {\n            validDataComponents.push(\n              React.cloneElement(dataComponent, dataProps),\n            );\n          }\n          return validDataComponents;\n        },\n        [],\n      );\n\n      children.push(...dataComponents);\n    }\n\n    const labelComponents = types.flatMap((type) =>\n      this.dataKeys\n        .map((key, index) => {\n          const name = `${type}Labels`;\n          const baseComponent: React.ReactElement =\n            props[`${type}LabelComponent`];\n          const labelProps = this.getComponentProps(baseComponent, name, index);\n          if (\n            (labelProps as any).text !== undefined &&\n            (labelProps as any).text !== null\n          ) {\n            return React.cloneElement(baseComponent, labelProps);\n          }\n          return undefined;\n        })\n        .filter(\n          (comp: React.ReactElement | undefined): comp is React.ReactElement =>\n            comp !== undefined,\n        ),\n    );\n\n    children.push(...labelComponents);\n\n    if (labelComponent) {\n      const labelsComponents = this.dataKeys\n        .map((_dataKey, index) => {\n          const labelProps = this.getComponentProps(\n            labelComponent,\n            \"labels\",\n            index,\n          );\n          if (\n            (labelProps as any).text !== undefined &&\n            (labelProps as any).text !== null &&\n            typeof (labelProps as any).text !== \"boolean\"\n          ) {\n            return React.cloneElement(labelComponent, labelProps);\n          }\n          return undefined;\n        })\n        .filter(\n          (comp: React.ReactElement | undefined): comp is React.ReactElement =>\n            comp !== undefined,\n        );\n\n      children.push(...labelsComponents);\n    }\n\n    return this.renderContainer(groupComponent, children);\n  }\n\n  render(): React.ReactElement {\n    const { animationWhitelist, role } = VictoryCandlestick;\n    const props = Helpers.modifyProps(this.props, fallbackProps, role);\n\n    if (this.shouldAnimate()) {\n      return this.animateComponent(props, animationWhitelist);\n    }\n\n    const children = this.renderCandleData(props, this.shouldRenderDatum);\n\n    const component = props.standalone\n      ? this.renderContainer(props.containerComponent, children)\n      : children;\n\n    return UserProps.withSafeUserProps(component, props);\n  }\n}\n\nexport const VictoryCandlestick = addEvents(VictoryCandlestickBase, options);\n"
  },
  {
    "path": "packages/victory-candlestick/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-candlestick/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-canvas/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-canvas/CHANGELOG.md",
    "content": "# victory-canvas\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n## 37.3.2\n\n## 37.3.1\n\n## 37.3.0\n\n## 37.2.0\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n## 37.0.1\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n## 36.9.1\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n## 36.8.4\n\n## 36.8.3\n\n### Patch Changes\n\n- Fix incorrect typescript props ([#2745](https://github.com/FormidableLabs/victory/pull/2745))\n\n## 36.8.2\n\n### Patch Changes\n\n- Migrate victory-canvas to TypeScript ([#2710](https://github.com/FormidableLabs/victory/pull/2710))\n\n## 36.8.1\n\n## 36.8.0\n\n## 36.7.0\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-bar@36.6.8\n  - victory-core@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-bar@36.6.7\n  - victory-core@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-bar@36.6.6\n  - victory-core@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-core@36.6.5\n  - victory-bar@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Added explicit `any` type defs (fixes [#2358](https://github.com/FormidableLabs/victory/issues/2358)) ([`57ed0fe30`](https://github.com/FormidableLabs/victory/commit/57ed0fe304dbc8753da1126a02d44de8004e96aa))\n\n* Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n* Updated dependencies [[`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-core@36.6.4\n  - victory-bar@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-bar@36.6.3\n  - victory-core@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-bar@36.6.2\n  - victory-core@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- Updated dependencies [[`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-core@36.6.1\n  - victory-bar@36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Update source code with minor lint-based improvements (see [#2236](https://github.com/FormidableLabs/victory/issues/2236)). ([#2403](https://github.com/FormidableLabs/victory/pull/2403))\n\n- Updated dependencies [[`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-core@36.6.0\n  - victory-bar@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-canvas/README.md",
    "content": "#VictoryCanvas\n\nThis is an experimental set of primitive components that can be used in place of the default Victory primitives to render data to a Canvas container rather than SVG.\n\nThe current version of this package includes components for line, bar, and scatter charts.\n\nExample usage:\n\n```jsx\n<VictoryLine\n  groupComponent={<CanvasGroup />}\n  dataComponent={<CanvasCurve />}\n  data={data}\n/>\n```\n\n```jsx\n<VictoryBar\n  groupComponent={<CanvasGroup />}\n  dataComponent={<CanvasBar />}\n  data={data}\n/>\n```\n\n```jsx\n<VictoryScatter\n  groupComponent={<CanvasGroup />}\n  dataComponent={<CanvasPoint />}\n  data={data}\n/>\n```\n\nThis package currently exports:\n\n- `CanvasGroup`\n- `CanvasCurve`\n- `CanvasPoint`\n- `CanvasBar`\n\nPlease visit our documentation site to read more about these components\nhttps://commerce.nearform.com/open-source/victory\n\nTo suggest an addition or correction to this documentation please see https://github.com/FormidableLabs/victory/blob/main/docs/src/content/docs\n"
  },
  {
    "path": "packages/victory-canvas/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-canvas/package.json",
    "content": "{\n  \"name\": \"victory-canvas\",\n  \"version\": \"37.3.6\",\n  \"description\": \"HTML5 Canvas Components for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"lodash\": \"^4.17.19\",\n    \"victory-bar\": \"37.3.6\",\n    \"victory-core\": \"37.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-bar:build:lib:esm\",\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-bar:build:lib:cjs\",\n        \"../victory-core:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-bar:build:lib:esm\",\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-bar:build:lib:esm\",\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-bar:types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-bar:types:create\",\n        \"../victory-core:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-bar:types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-bar:types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-bar:build\",\n        \"../victory-core:build\",\n        \"../victory-vendor:build\",\n        \"../victory-voronoi:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-canvas/src/canvas-bar.tsx",
    "content": "import React from \"react\";\nimport {\n  BarProps,\n  VictoryBarAlignmentType,\n  VictoryBarCornerRadiusObject,\n  getBarPath,\n  getBarWidth,\n  getCornerRadius,\n  getPolarBarPath,\n  getStyle,\n} from \"victory-bar\";\nimport { useCanvasContext } from \"./hooks/use-canvas-context\";\nimport { NumberOrCallback, VictoryCommonPrimitiveProps } from \"victory-core\";\n\nexport interface CanvasBarProps extends VictoryCommonPrimitiveProps {\n  alignment?: VictoryBarAlignmentType;\n  barOffset?: number[];\n  barRatio?: number;\n  barWidth?: NumberOrCallback;\n  cornerRadius?: NumberOrCallback | VictoryBarCornerRadiusObject;\n  datum?: any;\n  getPath?: (props: CanvasBarProps) => string;\n  horizontal?: boolean;\n  width?: number;\n  x?: number;\n  y?: number;\n  y0?: number;\n}\n\nconst evaluateProps = (props: CanvasBarProps) => {\n  /**\n   * Potential evaluated props of following must be evaluated in this order:\n   * 1) `style`\n   * 2) `barWidth`\n   * 3) `cornerRadius`\n   */\n  const style = getStyle(props.style, props as BarProps);\n  const barWidth = getBarWidth(\n    props.barWidth,\n    Object.assign({}, props, { style }),\n  );\n  const cornerRadius = getCornerRadius(\n    props.cornerRadius,\n    Object.assign({}, props, { style, barWidth }),\n  );\n  const modifiedProps = Object.assign({}, props, {\n    style,\n    barWidth,\n    cornerRadius,\n  });\n  return modifiedProps;\n};\n\nconst usePreviousValue = (value) => {\n  const ref = React.useRef();\n  React.useEffect(() => {\n    ref.current = value;\n  });\n  return ref.current;\n};\n\nexport const CanvasBar = (props: CanvasBarProps) => {\n  const { canvasRef } = useCanvasContext();\n  const modifiedProps = evaluateProps(props);\n  const { polar, style, barWidth, cornerRadius, origin } = modifiedProps;\n\n  const path2d = React.useMemo(() => {\n    const p = polar\n      ? getPolarBarPath(modifiedProps, cornerRadius)\n      : getBarPath(modifiedProps, barWidth, cornerRadius);\n\n    return new Path2D(p);\n  }, [polar, barWidth, cornerRadius, modifiedProps]);\n\n  const previousPath = usePreviousValue(path2d);\n\n  const draw = React.useCallback(\n    (ctx: CanvasRenderingContext2D, path: Path2D) => {\n      ctx.fillStyle = style.fill;\n      ctx.strokeStyle = style.stroke;\n      ctx.globalAlpha = style.fillOpacity;\n      ctx.lineWidth = style.strokeWidth;\n\n      if (polar) {\n        ctx.translate(origin?.x || 0, origin?.y || 0);\n      }\n      ctx.fill(path);\n      ctx.setTransform(1, 0, 0, 1, 0, 0);\n    },\n    [style, origin, polar],\n  );\n\n  // This will clear the previous bar without clearing the entire canvas\n  const clearPreviousPath = React.useCallback(\n    (ctx: CanvasRenderingContext2D) => {\n      if (previousPath) {\n        ctx.save();\n        // This ensures that the entire shape is erased\n        const strokeWidth = (style.strokeWidth as number) || 0;\n        ctx.lineWidth = strokeWidth + 2;\n\n        ctx.globalCompositeOperation = \"destination-out\";\n        draw(ctx, previousPath);\n        ctx.stroke(previousPath);\n\n        ctx.restore();\n      }\n    },\n    [draw, previousPath, style],\n  );\n\n  React.useEffect(() => {\n    const ctx = canvasRef.current?.getContext(\"2d\");\n    if (!ctx) return;\n    clearPreviousPath(ctx);\n    draw(ctx, path2d);\n  }, [\n    canvasRef,\n    draw,\n    polar,\n    barWidth,\n    cornerRadius,\n    modifiedProps,\n    path2d,\n    clearPreviousPath,\n  ]);\n\n  return null;\n};\n"
  },
  {
    "path": "packages/victory-canvas/src/canvas-curve.tsx",
    "content": "import React from \"react\";\nimport {\n  LineHelpers,\n  NumberOrCallback,\n  StringOrCallback,\n  VictoryCommonPrimitiveProps,\n} from \"victory-core\";\nimport { useCanvasContext } from \"./hooks/use-canvas-context\";\nimport { LineRadial } from \"../../victory-vendor/d3-shape\";\n\nexport interface CanvasCurveProps extends VictoryCommonPrimitiveProps {\n  ariaLabel?: StringOrCallback;\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n  interpolation?: string | Function;\n  openCurve?: boolean;\n  tabIndex?: NumberOrCallback;\n}\n\nexport const CanvasCurve = (props: CanvasCurveProps) => {\n  const { canvasRef, clear, clip } = useCanvasContext();\n  const { style, data } = props;\n  const { stroke, strokeWidth } = style;\n\n  const draw = React.useCallback(\n    (ctx: CanvasRenderingContext2D) => {\n      const line = LineHelpers.getLineFunction(props) as LineRadial<\n        [number, number]\n      >;\n      ctx.strokeStyle = stroke;\n      ctx.lineWidth = strokeWidth;\n      line.context(ctx)(data);\n      ctx.stroke();\n    },\n    [data, props, stroke, strokeWidth],\n  );\n\n  React.useEffect(() => {\n    const ctx = canvasRef.current?.getContext(\"2d\");\n    if (!ctx) return;\n    clear(ctx);\n    draw(ctx);\n    clip(ctx);\n  }, [canvasRef, draw, clear, clip]);\n\n  return null;\n};\n"
  },
  {
    "path": "packages/victory-canvas/src/canvas-group.tsx",
    "content": "import React from \"react\";\nimport { CanvasContext } from \"./hooks/use-canvas-context\";\nimport { PaddingProps } from \"victory-core\";\n\nexport interface CanvasGroupProps {\n  children?: React.ReactNode | React.ReactNode[];\n  clipWidth?: number;\n  height?: number;\n  padding?: PaddingProps;\n  width?: number;\n}\n\nexport const CanvasGroup = (props: CanvasGroupProps) => {\n  const canvasRef = React.useRef<HTMLCanvasElement>(null);\n  const { children, width = 0, height = 0, clipWidth, padding } = props;\n\n  const clear = React.useCallback(\n    (ctx: CanvasRenderingContext2D) => {\n      return ctx.clearRect(0, 0, width, height);\n    },\n    [width, height],\n  );\n\n  // This needs to be called in the child component to ensure it is called after the\n  // shape is drawn\n  const clip = React.useCallback(\n    (ctx: CanvasRenderingContext2D) => {\n      const paddingRight =\n        typeof padding === \"number\" ? padding : padding?.right || 0;\n      const paddingLeft =\n        typeof padding === \"number\" ? padding : padding?.left || 0;\n\n      const maxClipWidth = width - paddingRight - paddingLeft;\n      ctx.clearRect(\n        width - paddingRight,\n        0,\n        clipWidth ? (maxClipWidth - clipWidth) * -1 : 0,\n        height,\n      );\n    },\n    [width, height, padding, clipWidth],\n  );\n\n  return (\n    <CanvasContext.Provider\n      value={{\n        canvasRef,\n        clear,\n        clip,\n      }}\n    >\n      <foreignObject width={width} height={height} x={0} y={0}>\n        <canvas width={width} height={height} ref={canvasRef} />\n      </foreignObject>\n      {children}\n    </CanvasContext.Provider>\n  );\n};\n\nCanvasGroup.role = \"container\";\n"
  },
  {
    "path": "packages/victory-canvas/src/canvas-point.tsx",
    "content": "import React from \"react\";\nimport {\n  Helpers,\n  PointPathHelpers,\n  ScatterSymbolType,\n  VictoryCommonPrimitiveProps,\n} from \"victory-core\";\nimport { useCanvasContext } from \"./hooks/use-canvas-context\";\n\nexport interface CanvasPointProps extends VictoryCommonPrimitiveProps {\n  datum?: any;\n  getPath?: (x: number, y: number, size: number) => string;\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n  size?: number | Function;\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n  symbol?: ScatterSymbolType | Function;\n  x?: number;\n  y?: number;\n}\n\nconst getPath = (props) => {\n  const { x, y, size, symbol } = props;\n  if (props.getPath) {\n    return props.getPath(x, y, size);\n  }\n  const pathFunctions = {\n    circle: PointPathHelpers.circle,\n    square: PointPathHelpers.square,\n    diamond: PointPathHelpers.diamond,\n    triangleDown: PointPathHelpers.triangleDown,\n    triangleUp: PointPathHelpers.triangleUp,\n    plus: PointPathHelpers.plus,\n    minus: PointPathHelpers.minus,\n    star: PointPathHelpers.star,\n    cross: PointPathHelpers.cross,\n  };\n  const symbolFunction =\n    typeof pathFunctions[symbol] === \"function\"\n      ? pathFunctions[symbol]\n      : pathFunctions.circle;\n  return symbolFunction(x, y, size);\n};\n\nconst evaluateProps = (props: CanvasPointProps) => {\n  /**\n   * Potential evaluated props are:\n   * `size`\n   * `style`\n   * `symbol`\n   */\n  const size = Helpers.evaluateProp(props.size, props);\n  const style = Helpers.evaluateStyle(props.style, props);\n  const symbol = Helpers.evaluateProp(props.symbol, props);\n\n  return Object.assign({}, props, {\n    size,\n    style,\n    symbol,\n  });\n};\n\nexport const CanvasPoint = (props: CanvasPointProps) => {\n  const { canvasRef } = useCanvasContext();\n  const modifiedProps = evaluateProps(props);\n\n  const draw = React.useCallback(\n    (ctx: CanvasRenderingContext2D) => {\n      const { style } = modifiedProps;\n      const path = getPath(modifiedProps);\n      ctx.fillStyle = style.fill;\n\n      const path2d = new Path2D(path);\n      ctx.fill(path2d);\n    },\n    [modifiedProps],\n  );\n\n  React.useEffect(() => {\n    const ctx = canvasRef.current?.getContext(\"2d\");\n    if (!ctx) return;\n    draw(ctx);\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  return null;\n};\n"
  },
  {
    "path": "packages/victory-canvas/src/hooks/use-canvas-context.ts",
    "content": "import React from \"react\";\n\nexport type CanvasContextValue = {\n  canvasRef: React.RefObject<HTMLCanvasElement>;\n  clear: (ctx: CanvasRenderingContext2D) => void;\n  clip: (ctx: CanvasRenderingContext2D) => void;\n};\n\nexport const CanvasContext = React.createContext<\n  CanvasContextValue | undefined\n>(undefined);\n\nexport const useCanvasContext = () => {\n  const context = React.useContext(CanvasContext);\n  if (!context) {\n    throw new Error(\n      `This component must be wrapped in a CanvasContext.Provider component.\n      Try setting groupComponent={<CanvasGroup />} in your chart component.`,\n    );\n  }\n  return context;\n};\n"
  },
  {
    "path": "packages/victory-canvas/src/index.ts",
    "content": "export * from \"./canvas-bar\";\nexport * from \"./canvas-group\";\nexport * from \"./canvas-curve\";\nexport * from \"./canvas-point\";\nexport { useCanvasContext } from \"./hooks/use-canvas-context\";\n"
  },
  {
    "path": "packages/victory-canvas/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-canvas/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-chart/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-chart/CHANGELOG.md",
    "content": "# victory-chart\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n### Patch Changes\n\n- Remove deprecated babel-plugin-lodash plugin ([#2965](https://github.com/FormidableLabs/victory/pull/2965))\n\n* Improve types in victory-core helpers ([#2999](https://github.com/FormidableLabs/victory/pull/2999))\n\n## 37.3.2\n\n## 37.3.1\n\n## 37.3.0\n\n## 37.2.0\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n### Patch Changes\n\n- Ensure undefined props do not overwrite defaults ([#2852](https://github.com/FormidableLabs/victory/pull/2852))\n\n## 37.0.1\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n## 36.9.1\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n## 36.8.4\n\n## 36.8.3\n\n### Patch Changes\n\n- Refactor param reassignments ([#2724](https://github.com/FormidableLabs/victory/pull/2724))\n\n## 36.8.2\n\n### Patch Changes\n\n- Assign merged props to a const instead of modifying initialProps ([#2718](https://github.com/FormidableLabs/victory/pull/2718))\n\n## 36.8.1\n\n## 36.8.0\n\n### Minor Changes\n\n- Remove v37 experimental code ([#2697](https://github.com/FormidableLabs/victory/pull/2697))\n\n### Patch Changes\n\n- Remove usage of defaultProps from components ([#2679](https://github.com/FormidableLabs/victory/pull/2679))\n\n* Fixed issue where VictoryChart would throw an unhandled exception when passed non-element children (fixes [#2391](https://github.com/FormidableLabs/victory/issues/2391)) ([#2536](https://github.com/FormidableLabs/victory/pull/2536))\n\n## 36.7.0\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-axis@36.6.8\n  - victory-core@36.6.8\n  - victory-polar-axis@36.6.8\n  - victory-shared-events@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-axis@36.6.7\n  - victory-core@36.6.7\n  - victory-polar-axis@36.6.7\n  - victory-shared-events@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-axis@36.6.6\n  - victory-core@36.6.6\n  - victory-polar-axis@36.6.6\n  - victory-shared-events@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-core@36.6.5\n  - victory-axis@36.6.5\n  - victory-polar-axis@36.6.5\n  - victory-shared-events@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n- Updated dependencies [[`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-core@36.6.4\n  - victory-axis@36.6.4\n  - victory-polar-axis@36.6.4\n  - victory-shared-events@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-axis@36.6.3\n  - victory-core@36.6.3\n  - victory-polar-axis@36.6.3\n  - victory-shared-events@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-axis@36.6.2\n  - victory-core@36.6.2\n  - victory-polar-axis@36.6.2\n  - victory-shared-events@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- Updated dependencies [[`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-core@36.6.1\n  - victory-axis@36.6.1\n  - victory-polar-axis@36.6.1\n  - victory-shared-events@36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Updated dependencies [[`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-core@36.6.0\n  - victory-axis@36.6.0\n  - victory-polar-axis@36.6.0\n  - victory-shared-events@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-chart/README.md",
    "content": "# VictoryChart\n\n`victory-chart@^30.0.0` exports `VictoryChart`\n\nTo view documentation for `VictoryChart` please see https://commerce.nearform.com/open-source/victory/docs/victory-chart\n\nTo suggest an addition or correction to this documentation please see https://github.com/FormidableLabs/victory/blob/main/docs/src/content/docs/victory-chart.md\n"
  },
  {
    "path": "packages/victory-chart/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-chart/package.json",
    "content": "{\n  \"name\": \"victory-chart\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Chart Component for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"lodash\": \"^4.17.19\",\n    \"react-fast-compare\": \"^3.2.0\",\n    \"victory-axis\": \"37.3.6\",\n    \"victory-core\": \"37.3.6\",\n    \"victory-polar-axis\": \"37.3.6\",\n    \"victory-shared-events\": \"37.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-axis:build:lib:esm\",\n        \"../victory-core:build:lib:esm\",\n        \"../victory-polar-axis:build:lib:esm\",\n        \"../victory-shared-events:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-axis:build:lib:cjs\",\n        \"../victory-core:build:lib:cjs\",\n        \"../victory-polar-axis:build:lib:cjs\",\n        \"../victory-shared-events:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-axis:build:lib:esm\",\n        \"../victory-core:build:lib:esm\",\n        \"../victory-polar-axis:build:lib:esm\",\n        \"../victory-shared-events:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-axis:build:lib:esm\",\n        \"../victory-core:build:lib:esm\",\n        \"../victory-polar-axis:build:lib:esm\",\n        \"../victory-shared-events:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-axis:types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-polar-axis:types:create\",\n        \"../victory-shared-events:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-axis:types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-polar-axis:types:create\",\n        \"../victory-shared-events:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-axis:types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-polar-axis:types:create\",\n        \"../victory-shared-events:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-axis:types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-polar-axis:types:create\",\n        \"../victory-shared-events:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-axis:build\",\n        \"../victory-core:build\",\n        \"../victory-polar-axis:build\",\n        \"../victory-shared-events:build\",\n        \"../victory-vendor:build\",\n        \"../victory-voronoi:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-chart/src/helper-methods.test.tsx",
    "content": "import React from \"react\";\nimport { VictoryAxis } from \"victory-axis\";\n\nimport { getChildComponents } from \"./helper-methods\";\n\nconst MockVictoryLine = () => <div data-testid=\"victory-line\" />;\n\ndescribe(\"victory-chart/helpers-methods\", () => {\n  describe(\"getChildComponents\", () => {\n    const defaultAxes = {\n      independent: <VictoryAxis />,\n      dependent: <VictoryAxis dependentAxis />,\n    };\n\n    it(\"returns a pair of default axes when no children are given\", () => {\n      const children = [];\n      const result = getChildComponents({ children }, defaultAxes);\n      expect(result).toHaveLength(2);\n      expect(result).toEqual([defaultAxes.independent, defaultAxes.dependent]);\n    });\n\n    it(\"adds default axes when none of the children are axis components\", () => {\n      const line = <MockVictoryLine />;\n      const children = [line];\n      const result = getChildComponents({ children }, defaultAxes);\n      expect(result).toHaveLength(3);\n      expect(result).toContain(defaultAxes.independent);\n      expect(result).toContain(defaultAxes.dependent);\n    });\n\n    it(\"does not add default axes if axis any axis components exist in children\", () => {\n      const axis = <VictoryAxis />;\n      const children = [axis];\n      const result = getChildComponents({ children }, defaultAxes);\n      expect(result).toHaveLength(1);\n      expect((result[0] as typeof axis).props).toEqual(axis.props);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-chart/src/helper-methods.tsx",
    "content": "import React from \"react\";\nimport { Helpers, Scale, Axis, Wrapper } from \"victory-core\";\nimport defaults from \"lodash/defaults\";\n\nconst fallbackProps = {\n  width: 450,\n  height: 300,\n  padding: 50,\n};\n\nfunction getAxisProps(child, props, calculatedProps) {\n  const { domain, scale, stringMap, categories, horizontal } = calculatedProps;\n  return {\n    stringMap,\n    horizontal,\n    categories,\n    startAngle: props.startAngle,\n    endAngle: props.endAngle,\n    innerRadius: props.innerRadius,\n    domain,\n    scale,\n  };\n}\n\nexport function getBackgroundWithProps(props, calculatedProps) {\n  const backgroundElement = props.backgroundComponent;\n\n  const height = props.polar\n    ? calculatedProps.range.y[1]\n    : calculatedProps.range.y[0] - calculatedProps.range.y[1];\n  const width = calculatedProps.range.x[1] - calculatedProps.range.x[0];\n\n  const xScale = props.horizontal\n    ? calculatedProps.scale.y.range()[0]\n    : calculatedProps.scale.x.range()[0];\n  const yScale = props.horizontal\n    ? calculatedProps.scale.x.range()[1]\n    : calculatedProps.scale.y.range()[1];\n\n  const xCoordinate = props.polar ? calculatedProps.origin.x : xScale;\n  const yCoordinate = props.polar ? calculatedProps.origin.y : yScale;\n  const parentName = props.name || \"chart\";\n\n  const backgroundProps = {\n    height,\n    polar: props.polar,\n    scale: calculatedProps.scale,\n    style: props.style.background,\n    x: xCoordinate,\n    y: yCoordinate,\n    key: `${parentName}-background`,\n    width,\n  };\n\n  return React.cloneElement(\n    backgroundElement,\n    defaults({}, backgroundElement.props, backgroundProps),\n  );\n}\n\nfunction getChildProps(child, props, calculatedProps) {\n  const axisChild = Axis.findAxisComponents([child]);\n  if (axisChild.length > 0) {\n    return getAxisProps(axisChild[0], props, calculatedProps);\n  }\n  const { categories, domain, range, scale, stringMap, horizontal } =\n    calculatedProps;\n  return { categories, domain, range, scale, stringMap, horizontal };\n}\n\nfunction getStyles(props) {\n  const styleProps = props.style && props.style.parent;\n\n  return {\n    parent: defaults({}, styleProps, {\n      height: \"100%\",\n      width: \"100%\",\n      userSelect: \"none\",\n    }),\n  };\n}\n\nexport function getCalculatedProps(initialProps, childComponents) {\n  const style = getStyles(initialProps);\n  const props = Helpers.modifyProps(initialProps, fallbackProps, \"chart\");\n  const { horizontal, polar } = props;\n  const allStrings = Wrapper.getStringsFromChildren(props, childComponents);\n  const categories = Wrapper.getCategories(props, childComponents, allStrings);\n  const stringMap = createStringMap(props, childComponents, allStrings);\n  const domain = {\n    x: getDomain(\n      Object.assign({}, props, { categories }),\n      \"x\",\n      childComponents,\n    ),\n    y: getDomain(\n      Object.assign({}, props, { categories }),\n      \"y\",\n      childComponents,\n    ),\n  };\n\n  const range = {\n    x: Helpers.getRange(props, \"x\"),\n    y: Helpers.getRange(props, \"y\"),\n  };\n  const baseScale = {\n    x: Scale.getScaleFromProps(props, \"x\") || Wrapper.getScale(props, \"x\"),\n    y: Scale.getScaleFromProps(props, \"y\") || Wrapper.getScale(props, \"y\"),\n  };\n  const scale = {\n    x: baseScale.x.domain(domain.x).range(horizontal ? range.y : range.x),\n    y: baseScale.y.domain(domain.y).range(horizontal ? range.x : range.y),\n  };\n\n  const origin = polar ? Helpers.getPolarOrigin(props) : Axis.getOrigin(domain);\n\n  const padding = Helpers.getPadding(props.padding);\n\n  return {\n    categories,\n    domain,\n    range,\n    horizontal,\n    scale,\n    stringMap,\n    style,\n    origin,\n    padding,\n  };\n}\n\nexport function getChildren(props, childComponents, calculatedProps) {\n  const children = childComponents || getChildComponents(props);\n  const newCalculatedProps =\n    calculatedProps || getCalculatedProps(props, children);\n  const baseStyle = newCalculatedProps.style.parent;\n  const { height, polar, theme, width } = props;\n  const { origin, horizontal } = newCalculatedProps;\n  const parentName = props.name || \"chart\";\n\n  return children.filter(React.isValidElement).map((child, index) => {\n    const role = child.type && child.type.role;\n    const style = Array.isArray(child.props.style)\n      ? child.props.style\n      : defaults({}, child.props.style, { parent: baseStyle });\n    const childProps = getChildProps(child, props, newCalculatedProps);\n    const name = child.props.name || `${parentName}-${role}-${index}`;\n    const newProps = defaults(\n      {\n        horizontal,\n        height,\n        polar,\n        theme,\n        width,\n        style,\n        name,\n        origin: polar ? origin : undefined,\n        padding: newCalculatedProps.padding,\n        key: `${name}-key-${index}`,\n        standalone: false,\n      },\n      childProps,\n    );\n    return React.cloneElement(child, newProps);\n  });\n}\n\nexport const getChildComponents = (props, defaultAxes?) => {\n  let childComponents = React.Children.toArray(props.children);\n\n  if (childComponents.length === 0) {\n    childComponents.push(defaultAxes.independent, defaultAxes.dependent);\n  } else {\n    const axisComponents = {\n      dependent: Axis.getAxisComponentsWithParent(childComponents, \"dependent\"),\n      independent: Axis.getAxisComponentsWithParent(\n        childComponents,\n        \"independent\",\n      ),\n    };\n\n    if (\n      axisComponents.dependent.length === 0 &&\n      axisComponents.independent.length === 0\n    ) {\n      childComponents = props.prependDefaultAxes\n        ? [defaultAxes.independent, defaultAxes.dependent].concat(\n            childComponents,\n          )\n        : childComponents.concat([\n            defaultAxes.independent,\n            defaultAxes.dependent,\n          ]);\n    }\n  }\n\n  return childComponents;\n};\n\nconst getDomain = (props, axis, childComponents) => {\n  const children = childComponents || React.Children.toArray(props.children);\n  const domain = Wrapper.getDomain(props, axis, children);\n  const axisComponent = Axis.getAxisComponent(children, axis);\n  const invertDomain =\n    axisComponent && axisComponent.props && axisComponent.props.invertAxis;\n  return invertDomain ? domain.concat().reverse() : domain;\n};\n\nconst createStringMap = (props, childComponents, allStrings) => {\n  const x =\n    !allStrings.x || allStrings.x.length === 0\n      ? null\n      : allStrings.x.reduce((memo, string, index) => {\n          memo[string] = index + 1;\n          return memo;\n        }, {});\n\n  const y =\n    !allStrings.y || allStrings.y.length === 0\n      ? null\n      : allStrings.y.reduce((memo, string, index) => {\n          memo[string] = index + 1;\n          return memo;\n        }, {});\n  return { x, y };\n};\n"
  },
  {
    "path": "packages/victory-chart/src/index.ts",
    "content": "export * from \"./victory-chart\";\n"
  },
  {
    "path": "packages/victory-chart/src/victory-chart.test.tsx",
    "content": "import React from \"react\";\nimport { VictoryAxis } from \"victory-axis\";\nimport { render, screen, fireEvent } from \"@testing-library/react\";\n\nimport { VictoryChart } from \"./victory-chart\";\n\ndescribe(\"components/victory-chart\", () => {\n  describe(\"default component rendering\", () => {\n    it(\"renders an svg with the correct width and height\", () => {\n      const { container } = render(<VictoryChart />);\n      const svg = container.querySelector(\"svg\")!;\n\n      expect(svg.getAttribute(\"style\")).toContain(\"width: 100%; height: 100%\");\n    });\n\n    it(\"renders an svg with the correct viewBox\", () => {\n      const { container } = render(<VictoryChart />);\n      const svg = container.querySelector(\"svg\")!;\n      const viewBoxValue = `0 0 ${450} ${300}`;\n\n      expect(svg.getAttribute(\"viewBox\")).toEqual(viewBoxValue);\n    });\n  });\n\n  describe(\"axis rendering\", () => {\n    it(\"renders two axes by default\", () => {\n      const props = {\n        defaultAxes: {\n          independent: <VictoryAxis data-testid=\"axis\" />,\n          dependent: <VictoryAxis data-testid=\"axis\" dependentAxis />,\n        },\n      };\n      render(<VictoryChart {...props} />);\n\n      const axes = screen.getAllByTestId(\"axis\");\n\n      expect(axes).toHaveLength(2);\n    });\n\n    it(\"renders one axis if one axis is given\", () => {\n      render(\n        <VictoryChart>\n          <VictoryAxis data-testid=\"axis\" />\n        </VictoryChart>,\n      );\n      const axes = screen.getAllByTestId(\"axis\");\n\n      expect(axes).toHaveLength(1);\n    });\n\n    // TODO: Is this test useful? It's hard to test this with react testing library, which\n    // may mean it should be removed.\n    it(\"allows axis to control the crossAxis, and offset props\", () => {\n      render(\n        <VictoryChart>\n          <VictoryAxis\n            data-testid=\"axis\"\n            crossAxis={false}\n            offsetX={50}\n            offsetY={50}\n            data-cross-axis={(props) => props.crossAxis}\n            data-offset-x={(props) => props.offsetX}\n            data-offset-y={(props) => props.offsetY}\n          />\n        </VictoryChart>,\n      );\n      const axis = screen.getByTestId(\"axis\");\n\n      expect(axis.getAttribute(\"data-cross-axis\")).toEqual(\"false\");\n      expect(axis.getAttribute(\"data-offset-x\")).toEqual(\"50\");\n      expect(axis.getAttribute(\"data-offset-y\")).toEqual(\"50\");\n    });\n\n    it(\"accepts user props\", () => {\n      render(<VictoryChart data-testid=\"victory-chart\" aria-label=\"Chart\" />);\n\n      expect(screen.getByTestId(\"victory-chart\")).toBeDefined();\n      expect(screen.getByLabelText(\"Chart\")).toBeDefined();\n    });\n  });\n\n  describe(\"event handling\", () => {\n    it(\"attaches an event to the parent svg\", () => {\n      const clickHandler = jest.fn();\n      const { container } = render(\n        <VictoryChart\n          events={[\n            {\n              target: \"parent\",\n              eventHandlers: { onClick: clickHandler },\n            },\n          ]}\n        />,\n      );\n      const svg = container.querySelector(\"svg\")!;\n\n      fireEvent.click(svg);\n\n      expect(clickHandler).toHaveBeenCalled();\n    });\n  });\n\n  describe(\"animation\", () => {\n    it(\"handles basic animation parameters without crashing\", () => {\n      const { container } = render(\n        <VictoryChart animate={{ duration: 2000, easing: \"bounce\" }} />,\n      );\n\n      expect(container.querySelector(\"svg\")).toBeInTheDocument();\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-chart/src/victory-chart.tsx",
    "content": "import React from \"react\";\nimport defaults from \"lodash/defaults\";\nimport isEmpty from \"lodash/isEmpty\";\n\nimport {\n  Background,\n  Helpers,\n  Hooks,\n  UserProps,\n  VictoryContainer,\n  VictoryTheme,\n  Wrapper,\n  CategoryPropType,\n  DomainPropType,\n  EventPropTypeInterface,\n  StringOrNumberOrCallback,\n  VictoryCommonProps,\n  VictoryStyleInterface,\n  VictoryStyleObject,\n} from \"victory-core\";\nimport { VictorySharedEvents } from \"victory-shared-events\";\nimport { VictoryAxis } from \"victory-axis\";\nimport { VictoryPolarAxis } from \"victory-polar-axis\";\nimport {\n  getBackgroundWithProps,\n  getChildComponents,\n  getCalculatedProps,\n  getChildren,\n} from \"./helper-methods\";\nimport isEqual from \"react-fast-compare\";\n\nconst fallbackProps = {\n  width: 450,\n  height: 300,\n  padding: 50,\n};\n\nconst defaultProps = {\n  backgroundComponent: <Background />,\n  containerComponent: <VictoryContainer />,\n  defaultAxes: {\n    independent: <VictoryAxis />,\n    dependent: <VictoryAxis dependentAxis />,\n  },\n  defaultPolarAxes: {\n    independent: <VictoryPolarAxis />,\n    dependent: <VictoryPolarAxis dependentAxis />,\n  },\n  groupComponent: <g />,\n  standalone: true,\n  theme: VictoryTheme.grayscale,\n};\n\nconst VictoryChartImpl: React.FC<VictoryChartProps> = (initialProps) => {\n  const propsWithDefaults = React.useMemo(\n    () => defaults({}, initialProps, defaultProps),\n    [initialProps],\n  );\n  const role = \"chart\";\n  const { getAnimationProps, setAnimationState, getProps } =\n    Hooks.useAnimationState();\n  const props = getProps(propsWithDefaults);\n\n  const modifiedProps = Helpers.modifyProps(props, fallbackProps, role);\n  const {\n    desc,\n    eventKey,\n    containerComponent,\n    standalone,\n    groupComponent,\n    externalEventMutations,\n    width,\n    height,\n    theme,\n    polar,\n    name,\n    title,\n  } = modifiedProps;\n\n  const axes = props.polar\n    ? modifiedProps.defaultPolarAxes\n    : modifiedProps.defaultAxes;\n\n  const childComponents = React.useMemo(\n    () => getChildComponents(modifiedProps, axes),\n    [modifiedProps, axes],\n  );\n\n  const calculatedProps = React.useMemo(\n    () => getCalculatedProps(modifiedProps, childComponents),\n    [modifiedProps, childComponents],\n  );\n  const { domain, scale, style, origin, horizontal } = calculatedProps;\n\n  const newChildren = React.useMemo(() => {\n    const children = getChildren(props, childComponents, calculatedProps);\n\n    const mappedChildren = children.map((child, index) => {\n      const childProps = Object.assign(\n        { animate: getAnimationProps(props, child, index) },\n        child.props,\n      );\n      return React.cloneElement(child, childProps);\n    });\n\n    if (props.style && props.style.background) {\n      const backgroundComponent = getBackgroundWithProps(\n        props,\n        calculatedProps,\n      );\n\n      mappedChildren.unshift(backgroundComponent);\n    }\n\n    return mappedChildren;\n  }, [getAnimationProps, childComponents, props, calculatedProps]);\n\n  const containerProps = React.useMemo(() => {\n    if (standalone) {\n      return {\n        desc,\n        domain,\n        width,\n        height,\n        horizontal,\n        name,\n        origin: polar ? origin : undefined,\n        polar,\n        theme,\n        title,\n        scale,\n        standalone,\n        style: style.parent,\n      };\n    }\n    return {};\n  }, [\n    desc,\n    domain,\n    height,\n    horizontal,\n    name,\n    origin,\n    polar,\n    scale,\n    standalone,\n    style,\n    title,\n    theme,\n    width,\n  ]);\n\n  const container = React.useMemo(() => {\n    if (standalone) {\n      const defaultContainerProps = defaults(\n        {},\n        containerComponent.props,\n        containerProps,\n        UserProps.getSafeUserProps(propsWithDefaults),\n      );\n      return React.cloneElement(containerComponent, defaultContainerProps);\n    }\n    return groupComponent;\n  }, [\n    groupComponent,\n    standalone,\n    containerComponent,\n    containerProps,\n    propsWithDefaults,\n  ]);\n\n  const events = React.useMemo(() => {\n    return Wrapper.getAllEvents(props);\n  }, [props]);\n\n  const previousProps = Hooks.usePreviousProps(propsWithDefaults);\n\n  React.useEffect(() => {\n    // This is called before dismount to keep state in sync\n    return () => {\n      if (propsWithDefaults.animate) {\n        setAnimationState(previousProps, propsWithDefaults);\n      }\n    };\n  }, [setAnimationState, previousProps, propsWithDefaults]);\n\n  if (!isEmpty(events)) {\n    return (\n      <VictorySharedEvents\n        container={container}\n        eventKey={eventKey}\n        events={events}\n        externalEventMutations={externalEventMutations}\n      >\n        {newChildren}\n      </VictorySharedEvents>\n    );\n  }\n  return React.cloneElement(container, container.props, newChildren);\n};\n\nexport const VictoryChart = React.memo(VictoryChartImpl, isEqual);\n\nVictoryChart.displayName = \"VictoryChart\";\n// @ts-expect-error FIXME: Does this \"expectedComponents\" do anything?\nVictoryChart.expectedComponents = [\"groupComponent\", \"containerComponent\"];\n\nexport type AxesType = {\n  dependent?: React.ReactElement | null;\n  independent?: React.ReactElement | null;\n};\n\nexport interface VictoryChartProps extends VictoryCommonProps {\n  backgroundComponent?: React.ReactElement;\n  categories?: CategoryPropType;\n  children?: React.ReactNode | React.ReactNode[];\n  desc?: string;\n  defaultAxes?: AxesType;\n  defaultPolarAxes?: AxesType;\n  domain?: DomainPropType;\n  endAngle?: number;\n  eventKey?: StringOrNumberOrCallback;\n  events?: EventPropTypeInterface<\n    string,\n    string[] | number[] | string | number\n  >[];\n  innerRadius?: number;\n  prependDefaultAxes?: boolean;\n  startAngle?: number;\n  style?: Pick<VictoryStyleInterface, \"parent\"> & {\n    background?: VictoryStyleObject;\n  };\n  title?: string;\n}\n"
  },
  {
    "path": "packages/victory-chart/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-chart/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-core/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-core/CHANGELOG.md",
    "content": "# victory-core\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n### Patch Changes\n\n- Upgrade typescript to 5.7.2 ([#2997](https://github.com/FormidableLabs/victory/pull/2997))\n\n* Remove deprecated babel-plugin-lodash plugin ([#2965](https://github.com/FormidableLabs/victory/pull/2965))\n\n- Improve types in victory-core helpers ([#2999](https://github.com/FormidableLabs/victory/pull/2999))\n\n* Zoomed bar graph items will no longer be culled from the view when more than 50% of width or height is outside of the clipping parent. Instead they will be clipped once 100% outside\" ([#2970](https://github.com/FormidableLabs/victory/pull/2970))\n\n- fix hydration error using victory line with nextjs ([#2973](https://github.com/FormidableLabs/victory/pull/2973))\n\n## 37.3.2\n\n### Patch Changes\n\n- Fix regression to touchAction override in VictoryContainer ([#2953](https://github.com/FormidableLabs/victory/pull/2953))\n\n## 37.3.1\n\n### Patch Changes\n\n- Remove duplicate types from interfaces ([#2940](https://github.com/FormidableLabs/victory/pull/2940))\n\n## 37.3.0\n\n### Minor Changes\n\n- Clean theme color updates and other minor adjustments ([#2920](https://github.com/FormidableLabs/victory/pull/2920))\n\n* Fix VictoryPortal id changing for every render ([#2929](https://github.com/FormidableLabs/victory/pull/2929))\n\n### Patch Changes\n\n- fix categories array of strings ([#2919](https://github.com/FormidableLabs/victory/pull/2919))\n\n## 37.2.0\n\n### Minor Changes\n\n- Minor updates for clean theme ([#2909](https://github.com/FormidableLabs/victory/pull/2909))\n\n* more minor updates to clean theme ([#2915](https://github.com/FormidableLabs/victory/pull/2915))\n\n### Patch Changes\n\n- replace useId for backwards compatibility ([#2916](https://github.com/FormidableLabs/victory/pull/2916))\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Refactor containers and portal to function components ([#2799](https://github.com/FormidableLabs/victory/pull/2799))\n\n* Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n### Patch Changes\n\n- Ensure undefined props do not overwrite defaults ([#2852](https://github.com/FormidableLabs/victory/pull/2852))\n\n## 37.0.1\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n### Patch Changes\n\n- Replace lodash keys with native code ([#2811](https://github.com/FormidableLabs/victory/pull/2811))\n\n* Replace lodash identity with native code ([#2829](https://github.com/FormidableLabs/victory/pull/2829))\n\n- Refactor victory-accessible-group to a function component ([#2777](https://github.com/FormidableLabs/victory/pull/2777))\n\n* Convert victory-animation to function component ([#2788](https://github.com/FormidableLabs/victory/pull/2788))\n\n- Replace lodash.invert with native code ([#2830](https://github.com/FormidableLabs/victory/pull/2830))\n\n* Replace lodash difference with native code ([#2828](https://github.com/FormidableLabs/victory/pull/2828))\n\n- Replace lodash array utils with native code ([#2810](https://github.com/FormidableLabs/victory/pull/2810))\n\n* allow VictoryBoxPlot childStyles to override VictoryGroup parent styles ([#2824](https://github.com/FormidableLabs/victory/pull/2824))\n\n- Replace lodash values and mapValues with native code ([#2808](https://github.com/FormidableLabs/victory/pull/2808))\n\n* Replace lodash isNil and isNan with native code ([#2800](https://github.com/FormidableLabs/victory/pull/2800))\n\n- Replace lodash isFunction with native code ([#2802](https://github.com/FormidableLabs/victory/pull/2802))\n\n## 36.9.1\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n### Patch Changes\n\n- Migrate victory-native to TypeScript ([#2739](https://github.com/FormidableLabs/victory/pull/2739))\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n* Replace instances of lodash.range with equivalent native code ([#2760](https://github.com/FormidableLabs/victory/pull/2760))\n\n## 36.8.4\n\n## 36.8.3\n\n### Patch Changes\n\n- Fix incorrect typescript props ([#2745](https://github.com/FormidableLabs/victory/pull/2745))\n\n* Refactor param reassignments ([#2724](https://github.com/FormidableLabs/victory/pull/2724))\n\n- Migrate victory-shared-events to TypeScript ([#2733](https://github.com/FormidableLabs/victory/pull/2733))\n\n* Migrate victory-tooltip to typescript ([#2725](https://github.com/FormidableLabs/victory/pull/2725))\n\n## 36.8.2\n\n### Patch Changes\n\n- Fix the label background position when using dy fns ([#2720](https://github.com/FormidableLabs/victory/pull/2720))\n\n* Migrate victory-legend to TypeScript ([#2712](https://github.com/FormidableLabs/victory/pull/2712))\n\n## 36.8.1\n\n### Patch Changes\n\n- Correctly type props in Victory Primitives ([#2695](https://github.com/FormidableLabs/victory/pull/2695))\n\n## 36.8.0\n\n### Minor Changes\n\n- Remove v37 experimental code ([#2697](https://github.com/FormidableLabs/victory/pull/2697))\n\n### Patch Changes\n\n- Remove usage of defaultProps from components ([#2679](https://github.com/FormidableLabs/victory/pull/2679))\n\n* Fixed issue where VictoryChart would throw an unhandled exception when passed non-element children (fixes [#2391](https://github.com/FormidableLabs/victory/issues/2391)) ([#2536](https://github.com/FormidableLabs/victory/pull/2536))\n\n- Fix text label measurements after SSR hydration mismatch ([#2626](https://github.com/FormidableLabs/victory/pull/2626))\n\n## 36.7.0\n\n### Minor Changes\n\n- added ref forwarding for path and bar components ([#2673](https://github.com/FormidableLabs/victory/pull/2673))\n\n## 36.6.12\n\n### Patch Changes\n\n- Add aria-hidden flag to svg for textsize util to fix accessibility issue ([#2661](https://github.com/FormidableLabs/victory/pull/2661))\n\n## 36.6.11\n\n### Patch Changes\n\n- Fix text size regression when using line-height ([#2615](https://github.com/FormidableLabs/victory/pull/2615))\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Lint fixes. ([#2497](https://github.com/FormidableLabs/victory/pull/2497))\n\n* Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n- Improve accuracy of text size measurements (fixes [#2475](https://github.com/FormidableLabs/victory/issues/2475)) ([#2505](https://github.com/FormidableLabs/victory/pull/2505))\n\n## 36.6.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-vendor@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-vendor@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-vendor@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Manually included types for Immutable (fixes [#2439](https://github.com/FormidableLabs/victory/issues/2439)) ([#2440](https://github.com/FormidableLabs/victory/pull/2440))\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-vendor@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n- Updated dependencies [[`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-vendor@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-vendor@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-vendor@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- - Removed Template Literal Types to increase TS compatibility (fixes [#2418](https://github.com/FormidableLabs/victory/issues/2418)) ([#2420](https://github.com/FormidableLabs/victory/pull/2420))\n  - Improved type for `VictoryLabelProps[\"textAnchor\"]` (fixes [#2361](https://github.com/FormidableLabs/victory/issues/2361))\n  - Fixed exported types for `VictoryAxis`, `VictoryBoxPlot`, `VictoryErrorBar`, and `VictoryScatter` (fixes [#2411](https://github.com/FormidableLabs/victory/issues/2411))\n  - Migrate `victory-cursor-container` to TS (fixes [#2402](https://github.com/FormidableLabs/victory/issues/2402))\n- Updated dependencies []:\n  - victory-vendor@36.6.1\n\n## 36.6.0\n\n### Minor Changes\n\n- Migration of victory-errorbar to TypeScript ([#2395](https://github.com/FormidableLabs/victory/pull/2395))\n\n### Patch Changes\n\n- Update source code with minor lint-based improvements (see [#2236](https://github.com/FormidableLabs/victory/issues/2236)). ([#2403](https://github.com/FormidableLabs/victory/pull/2403))\n\n- Updated dependencies [[`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-vendor@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-core/README.md",
    "content": "# VictoryCore\n\n`victory-core@30.0.0` exports packages that are used by several Victory components:\n\n- `VictoryAnimation`\n- `VictoryClipContainer`\n- `VictoryContainer`\n- `VictoryLabel`\n- `VictoryPortal` and `Portal`\n- `VictoryTheme`\n- `VictoryTransition`\n- Several primitive components:\n  `Arc`, `Border` / `Box`, `Circle`, `ClipPath`, `LineSegment` (formerly `Axis` / `Grid`), `Line`, `Path`, `Point`, `Rect`, `Text`, `TSpan`, `Whisker`\n- Several utilities:\n  - `addEvents`, `Axis`, `Collection`, `CommonProps`, `Data`, `DefaultTransitions`, `Domain`, `Events`, `Helpers`, `Immutable`, `LabelHelpers`, `Log`, `PropTypes`, `Scale`, `Selection`, `Style`, `TextSize`, `Timer`, `Transitions`, `Wrapper`\n\nPlease visit our documentation site to read more about these components\nhttps://commerce.nearform.com/open-source/victory\n\nTo suggest an addition or correction to this documentation please see https://github.com/FormidableLabs/victory/blob/main/docs/src/content/docs\n"
  },
  {
    "path": "packages/victory-core/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-core/package.json",
    "content": "{\n  \"name\": \"victory-core\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Victory Core\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"lodash\": \"^4.17.21\",\n    \"react-fast-compare\": \"^3.2.0\",\n    \"victory-vendor\": \"37.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-vendor:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-vendor:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-vendor:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-vendor:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-vendor:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-vendor:build\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-vendor:build\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-vendor:build\",\n        \"../victory-voronoi:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-core/src/exports.test.ts",
    "content": "import * as VictoryCore from \"./index\";\n\n/* eslint-disable @typescript-eslint/no-unused-vars */\n\n// Import EVERYTHING from 'victory-core' to ensure it's getting exported correctly:\nimport {\n  // @ts-expect-error TEST_EXPORTS should not be defined, so it should error!\n  TEST_EXPORTS,\n  AnimatePropTypeInterface,\n  AnimationData,\n  AnimationEasing,\n  AnimationInfo,\n  AnimationStyle,\n  Arc,\n  ArcProps,\n  Axis,\n  Background,\n  BackgroundProps,\n  BlockProps,\n  Border,\n  BorderProps,\n  Box,\n  CallbackArgs,\n  CategoryPropType,\n  Circle,\n  ClipPath,\n  ClipPathProps,\n  Collection,\n  ColorScalePropType,\n  CoordinatesPropType,\n  D3Scale,\n  Data,\n  DataGetterPropType,\n  DefaultTransitions,\n  Domain,\n  DomainPaddingPropType,\n  DomainPropType,\n  DomainTuple,\n  EventCallbackInterface,\n  EventPropTypeInterface,\n  Events,\n  Helpers,\n  Hooks,\n  Immutable,\n  InterpolationPropType,\n  LabelHelpers,\n  LabelOrientationType,\n  LabelProps,\n  Line,\n  LineHelpers,\n  LineSegment,\n  LineSegmentProps,\n  Log,\n  NumberOrCallback,\n  OrientationOrCallback,\n  OrientationTypes,\n  OriginType,\n  PaddingOrCallback,\n  PaddingProps,\n  PaddingType,\n  Path,\n  Point,\n  PointPathHelpers,\n  PointProps,\n  Portal,\n  PortalContext,\n  PortalContextValue,\n  PortalOutlet,\n  PortalOutletProps,\n  PortalProvider,\n  PortalProviderProps,\n  PortalProps,\n  RangePropType,\n  RangeTuple,\n  Rect,\n  SVGCoordinateBounds,\n  SVGCoordinateType,\n  Scale,\n  ScaleName,\n  ScalePropType,\n  ScaleXYPropType,\n  ScatterSymbolType,\n  Selection,\n  SliceNumberOrCallback,\n  SortOrderPropType,\n  StringOrCallback,\n  StringOrNumberOrCallback,\n  StringOrNumberOrList,\n  Style,\n  TSpan,\n  Text,\n  TextAnchorType,\n  TextProps,\n  TextSize,\n  TextSizeStyleInterface,\n  TickProps,\n  Timer,\n  TimerContext,\n  Transitions,\n  UserProps,\n  VerticalAnchorType,\n  VictoryAccessibleGroup,\n  VictoryAccessibleGroupProps,\n  VictoryAnimation,\n  VictoryAnimationProps,\n  VictoryAnimationState,\n  VictoryAxisCommonProps,\n  VictoryClipContainer,\n  VictoryClipContainerProps,\n  VictoryCommonPrimitiveProps,\n  VictoryCommonProps,\n  VictoryCommonThemeProps,\n  VictoryContainer,\n  useVictoryContainer,\n  VictoryContainerProps,\n  VictoryDatableProps,\n  VictoryLabel,\n  VictoryLabelProps,\n  VictoryLabelStyleObject,\n  VictoryLabelableProps,\n  VictoryMultiLabelableProps,\n  VictoryNumberCallback,\n  VictoryOrientationCallback,\n  VictoryPaddingCallback,\n  VictoryPortal,\n  VictoryPortalProps,\n  VictoryPrimitiveShapeProps,\n  VictorySingleLabelableProps,\n  VictoryStringCallback,\n  VictoryStringOrNumberCallback,\n  VictoryStyleInterface,\n  VictoryStyleObject,\n  VictoryTheme,\n  VictoryThemeDefinition,\n  VictoryTickStyleObject,\n  VictoryTransition,\n  Whisker,\n  WhiskerAxes,\n  WhiskerProps,\n  Wrapper,\n  addEvents,\n  mergeRefs,\n  usePortalContext,\n} from \"./index\";\nimport pick from \"lodash/pick\";\n\ndescribe(\"victory-core\", () => {\n  it(\"exports addEvents\", () => {\n    // This test exists to ensure we don't have an \"unused import\" error\n    expect(addEvents).toBeInstanceOf(Function);\n  });\n  it(\"should export everything\", () => {\n    expect(Object.keys(VictoryCore).sort()).toMatchInlineSnapshot(`\n      [\n        \"Arc\",\n        \"Axis\",\n        \"Background\",\n        \"Border\",\n        \"Box\",\n        \"Circle\",\n        \"ClipPath\",\n        \"Collection\",\n        \"Data\",\n        \"DefaultTransitions\",\n        \"Domain\",\n        \"Events\",\n        \"Helpers\",\n        \"Hooks\",\n        \"Immutable\",\n        \"LabelHelpers\",\n        \"Line\",\n        \"LineHelpers\",\n        \"LineSegment\",\n        \"Log\",\n        \"Path\",\n        \"Point\",\n        \"PointPathHelpers\",\n        \"Portal\",\n        \"PortalContext\",\n        \"PortalOutlet\",\n        \"PortalProvider\",\n        \"Rect\",\n        \"Scale\",\n        \"Selection\",\n        \"Style\",\n        \"TSpan\",\n        \"Text\",\n        \"TextSize\",\n        \"Timer\",\n        \"TimerContext\",\n        \"Transitions\",\n        \"UserProps\",\n        \"VictoryAccessibleGroup\",\n        \"VictoryAnimation\",\n        \"VictoryClipContainer\",\n        \"VictoryContainer\",\n        \"VictoryLabel\",\n        \"VictoryPortal\",\n        \"VictoryTheme\",\n        \"VictoryTransition\",\n        \"Whisker\",\n        \"Wrapper\",\n        \"addEvents\",\n        \"mergeRefs\",\n        \"usePortalContext\",\n        \"useVictoryContainer\",\n      ]\n    `);\n  });\n\n  describe(\"namespaces\", () => {\n    // These \"namespaces\" represent when we use `export * as`\n    const namespaces = [\n      \"Axis\",\n      \"Collection\",\n      \"Data\",\n      \"DefaultTransitions\",\n      \"Domain\",\n      \"Events\",\n      \"Helpers\",\n      \"Hooks\",\n      \"Immutable\",\n      \"LabelHelpers\",\n      \"LineHelpers\",\n      \"Log\",\n      \"PointPathHelpers\",\n      \"Scale\",\n      \"Selection\",\n      \"Style\",\n      \"TextSize\",\n      \"Transitions\",\n      \"UserProps\",\n      \"Wrapper\",\n    ];\n\n    it(\"should export all namespaces\", () => {\n      expect(pick(VictoryCore, namespaces)).toMatchInlineSnapshot(`\n        {\n          \"Axis\": {\n            \"findAxisComponents\": [Function],\n            \"getAxis\": [Function],\n            \"getAxisComponent\": [Function],\n            \"getAxisComponentsWithParent\": [Function],\n            \"getAxisValue\": [Function],\n            \"getDomain\": [Function],\n            \"getOrigin\": [Function],\n            \"getOriginSign\": [Function],\n            \"getTickFormat\": [Function],\n            \"getTicks\": [Function],\n            \"isVertical\": [Function],\n            \"modifyProps\": [Function],\n            \"stringTicks\": [Function],\n          },\n          \"Collection\": {\n            \"containsDates\": [Function],\n            \"containsNumbers\": [Function],\n            \"containsOnlyStrings\": [Function],\n            \"containsStrings\": [Function],\n            \"difference\": [Function],\n            \"getMaxValue\": [Function],\n            \"getMinValue\": [Function],\n            \"isArrayOfArrays\": [Function],\n            \"removeUndefined\": [Function],\n          },\n          \"Data\": {\n            \"createStringMap\": [Function],\n            \"downsample\": [Function],\n            \"formatData\": [Function],\n            \"formatDataFromDomain\": [Function],\n            \"generateData\": [Function],\n            \"getCategories\": [Function],\n            \"getData\": [Function],\n            \"getStringsFromAxes\": [Function],\n            \"getStringsFromCategories\": [Function],\n            \"getStringsFromData\": [Function],\n            \"isDataComponent\": [Function],\n          },\n          \"DefaultTransitions\": {\n            \"continuousPolarTransitions\": [Function],\n            \"continuousTransitions\": [Function],\n            \"discreteTransitions\": [Function],\n          },\n          \"Domain\": {\n            \"createDomainFunction\": [Function],\n            \"formatDomain\": [Function],\n            \"getDomain\": [Function],\n            \"getDomainFromCategories\": [Function],\n            \"getDomainFromData\": [Function],\n            \"getDomainFromMinMax\": [Function],\n            \"getDomainFromProps\": [Function],\n            \"getDomainWithZero\": [Function],\n            \"getMaxFromProps\": [Function],\n            \"getMinFromProps\": [Function],\n            \"getSymmetricDomain\": [Function],\n            \"isDomainComponent\": [Function],\n          },\n          \"Events\": {\n            \"emulateReactEvent\": [Function],\n            \"getComponentEvents\": [Function],\n            \"getEventState\": [Function],\n            \"getEvents\": [Function],\n            \"getExternalMutation\": [Function],\n            \"getExternalMutations\": [Function],\n            \"getExternalMutationsWithChildren\": [Function],\n            \"getGlobalEventNameFromKey\": [Function],\n            \"getGlobalEvents\": [Function],\n            \"getPartialEvents\": [Function],\n            \"getScopedEvents\": [Function],\n            \"omitGlobalEvents\": [Function],\n          },\n          \"Helpers\": {\n            \"createAccessor\": [Function],\n            \"degreesToRadians\": [Function],\n            \"evaluateProp\": [Function],\n            \"evaluateStyle\": [Function],\n            \"getCurrentAxis\": [Function],\n            \"getDefaultStyles\": [Function],\n            \"getPadding\": [Function],\n            \"getPoint\": [Function],\n            \"getPolarOrigin\": [Function],\n            \"getRadius\": [Function],\n            \"getRange\": [Function],\n            \"getStyles\": [Function],\n            \"invert\": [Function],\n            \"isFunction\": [Function],\n            \"isHorizontal\": [Function],\n            \"isNil\": [Function],\n            \"isTooltip\": [Function],\n            \"mapValues\": [Function],\n            \"modifyProps\": [Function],\n            \"omit\": [Function],\n            \"radiansToDegrees\": [Function],\n            \"range\": [Function],\n            \"reduceChildren\": [Function],\n            \"scalePoint\": [Function],\n          },\n          \"Hooks\": {\n            \"useAnimationState\": [Function],\n            \"usePreviousProps\": [Function],\n          },\n          \"Immutable\": {\n            \"IMMUTABLE_ITERABLE\": \"@@__IMMUTABLE_ITERABLE__@@\",\n            \"IMMUTABLE_LIST\": \"@@__IMMUTABLE_LIST__@@\",\n            \"IMMUTABLE_MAP\": \"@@__IMMUTABLE_MAP__@@\",\n            \"IMMUTABLE_RECORD\": \"@@__IMMUTABLE_RECORD__@@\",\n            \"isImmutable\": [Function],\n            \"isIterable\": [Function],\n            \"isList\": [Function],\n            \"isMap\": [Function],\n            \"isRecord\": [Function],\n            \"shallowToJS\": [Function],\n          },\n          \"LabelHelpers\": {\n            \"getDegrees\": [Function],\n            \"getPolarAngle\": [Function],\n            \"getPolarTextAnchor\": [Function],\n            \"getPolarVerticalAnchor\": [Function],\n            \"getProps\": [Function],\n            \"getText\": [Function],\n          },\n          \"LineHelpers\": {\n            \"getInterpolationFunction\": [Function],\n            \"getLineFunction\": [Function],\n          },\n          \"Log\": {\n            \"warn\": [Function],\n          },\n          \"PointPathHelpers\": {\n            \"circle\": [Function],\n            \"cross\": [Function],\n            \"diamond\": [Function],\n            \"minus\": [Function],\n            \"plus\": [Function],\n            \"square\": [Function],\n            \"star\": [Function],\n            \"triangleDown\": [Function],\n            \"triangleUp\": [Function],\n          },\n          \"Scale\": {\n            \"getBaseScale\": [Function],\n            \"getDefaultScale\": [Function],\n            \"getScaleFromName\": [Function],\n            \"getScaleFromProps\": [Function],\n            \"getScaleType\": [Function],\n            \"getType\": [Function],\n            \"validScale\": [Function],\n          },\n          \"Selection\": {\n            \"getBounds\": [Function],\n            \"getDataCoordinates\": [Function],\n            \"getDomainCoordinates\": [Function],\n            \"getParentSVG\": [Function],\n            \"getSVGEventCoordinates\": [Function],\n          },\n          \"Style\": {\n            \"getColorScale\": [Function],\n            \"toTransformString\": [Function],\n          },\n          \"TextSize\": {\n            \"_approximateTextSizeInternal\": {\n              \"impl\": [Function],\n            },\n            \"approximateTextSize\": [Function],\n            \"convertLengthToPixels\": [Function],\n          },\n          \"Transitions\": {\n            \"getInitialTransitionState\": [Function],\n            \"getTransitionPropsFactory\": [Function],\n          },\n          \"UserProps\": {\n            \"assert\": [Function],\n            \"getSafeUserProps\": [Function],\n            \"withSafeUserProps\": [Function],\n          },\n          \"Wrapper\": {\n            \"addBinsToParentPropsIfHistogram\": [Function],\n            \"getAllEvents\": [Function],\n            \"getCategories\": [Function],\n            \"getCategoryAndAxisStringsFromChildren\": [Function],\n            \"getChildStyle\": [Function],\n            \"getColor\": [Function],\n            \"getData\": [Function],\n            \"getDataFromChildren\": [Function],\n            \"getDefaultDomainPadding\": [Function],\n            \"getDomain\": [Function],\n            \"getDomainFromChildren\": [Function],\n            \"getScale\": [Function],\n            \"getStringsFromChildren\": [Function],\n            \"getStringsFromChildrenCategories\": [Function],\n            \"getStringsFromData\": [Function],\n            \"getStyle\": [Function],\n            \"getWidth\": [Function],\n          },\n        }\n      `);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-core/src/index.ts",
    "content": "export * from \"./types/callbacks\";\nexport * from \"./types/prop-types\";\nexport * from \"./victory-accessible-group/victory-accessible-group\";\nexport * from \"./victory-animation/victory-animation\";\nexport * from \"./victory-container/victory-container\";\nexport * from \"./victory-label/victory-label\";\nexport * from \"./victory-transition/victory-transition\";\nexport * from \"./victory-clip-container/victory-clip-container\";\nexport * from \"./victory-theme/types\";\nexport * from \"./victory-theme/victory-theme\";\nexport * from \"./victory-portal/portal\";\nexport * from \"./victory-portal/victory-portal\";\nexport * from \"./victory-portal/portal-context\";\nexport * from \"./victory-portal/portal-outlet\";\nexport * from \"./victory-primitives\";\nexport { Border as Box } from \"./victory-primitives\";\nexport type { BorderProps as BoxProps } from \"./victory-primitives\";\nexport * from \"./victory-util\";\n"
  },
  {
    "path": "packages/victory-core/src/types/callbacks.ts",
    "content": "import { D3Scale, Datum, ID, ScalePropType } from \"./prop-types\";\nimport { BlockProps, OrientationTypes } from \"../victory-theme/types\";\n\n/**\n * This is the first parameter of a callback when a callback is used to\n * resolve the value of a property instead of a concrete value.\n *\n * Note that additional properties here like `scale`, `x`, `y`, etc are resolved\n * values of properties from the VictoryXXXProps for each component.\n */\nexport interface CallbackArgs {\n  active?: boolean;\n  data?: Datum[];\n  datum?: Datum;\n  horizontal?: boolean;\n  index?: ID;\n  x?: number;\n  y?: number;\n  scale?:\n    | ScalePropType\n    | D3Scale\n    | {\n        x?: ScalePropType | D3Scale;\n        y?: ScalePropType | D3Scale;\n      };\n  tick?: any;\n  ticks?: any;\n  text?: any;\n}\n\nexport type VictoryStringOrNumberCallback = (\n  args: CallbackArgs,\n) => string | number;\n\nexport type VictoryStringCallback = (args: CallbackArgs) => string;\nexport type StringOrNumberOrCallback =\n  | string\n  | number\n  | VictoryStringOrNumberCallback;\nexport type StringOrCallback = string | VictoryStringCallback;\nexport type SliceNumberOrCallback<\n  T,\n  P extends string | number | symbol = never,\n> = number | ((props: Omit<T, P>) => number);\nexport type VictoryNumberCallback = (args: CallbackArgs) => number;\nexport type VictoryPaddingCallback = (\n  args: CallbackArgs,\n) => number | BlockProps;\nexport type VictoryOrientationCallback = (\n  args: CallbackArgs,\n) => OrientationTypes;\nexport type NumberOrCallback = number | VictoryNumberCallback;\nexport type PaddingOrCallback = number | BlockProps | VictoryPaddingCallback;\nexport type OrientationOrCallback =\n  | OrientationTypes\n  | VictoryOrientationCallback;\n"
  },
  {
    "path": "packages/victory-core/src/types/prop-types.ts",
    "content": "import * as React from \"react\";\nimport {\n  ScaleLinear,\n  ScaleLogarithmic,\n  ScalePower,\n  ScaleTime,\n} from \"victory-vendor/d3-scale\";\nimport {\n  AnimationEasing,\n  AnimationStyle,\n} from \"../victory-animation/victory-animation\";\nimport { CallbackArgs, StringOrNumberOrCallback } from \"./callbacks\";\n\nexport type AxisType = \"x\" | \"y\";\nexport type DatumValue = number | string | Date | null | undefined;\nexport type Datum = any;\nexport type ForAxes<T> = T | { x?: T; y?: T };\nexport type ID = number | string;\nexport type ValueOrAccessor<ValueType, PropsType = CallbackArgs> =\n  | ValueType\n  | ((props: PropsType) => ValueType);\nexport type Tuple<T> = [T, T];\nexport type ValueOrAxes<T> = T | ForAxes<T>;\n\nexport type DomainPaddingPropType = ValueOrAxes<PaddingType>;\nexport type DomainPropType = ValueOrAxes<DomainTuple>;\nexport type DomainValue = number | Date;\n// This should be a tuple type, but every time we use it, it fails with a type error.\n// type number[] is not assignable to type [number, number] | [Date, Date].\nexport type DomainTuple = Tuple<number> | Tuple<Date>;\nexport type PaddingType = number | Tuple<number>;\nexport type RangePropType = ValueOrAxes<RangeTuple>;\nexport type RangeTuple = number[];\nexport type StringOrNumberOrList = string | number | (string | number)[];\n\nexport interface Padding {\n  top: number;\n  bottom: number;\n  left: number;\n  right: number;\n}\n\nexport interface AnimatePropTypeInterface {\n  duration?: number;\n  delay?: number;\n  onEnd?: () => void;\n  onExit?: {\n    duration?: number;\n    before?: (datum: Datum, index: number, data: Datum[]) => AnimationStyle;\n  };\n  onEnter?: {\n    duration?: number;\n    before?: (datum: Datum, index: number, data: Datum[]) => AnimationStyle;\n    after?: (datum: Datum, index: number, data: Datum[]) => AnimationStyle;\n  };\n  onLoad?: {\n    duration?: number;\n    before?: (datum: Datum, index: number, data: Datum[]) => AnimationStyle;\n    after?: (datum: Datum, index: number, data: Datum[]) => AnimationStyle;\n  };\n  easing?: AnimationEasing;\n  animationWhitelist?: string[];\n}\n\nexport interface EventCallbackInterface<TTarget, TEventKey> {\n  childName?: string | string[];\n  target?: TTarget;\n  eventKey?: TEventKey;\n  mutation: (props: any) => any;\n  callback?: (props: any) => any;\n}\n\nexport interface EventPropTypeInterface<TTarget, TEventKey> {\n  childName?: string | Array<StringOrNumberOrCallback>;\n  target: TTarget;\n  eventKey?: TEventKey;\n  eventHandlers: {\n    [key: string]:\n      | {\n          (\n            event: React.SyntheticEvent<any>,\n            props?: any,\n          ): EventCallbackInterface<TTarget, TEventKey>;\n        }\n      | {\n          (\n            event: React.SyntheticEvent<any>,\n            props?: any,\n          ): EventCallbackInterface<TTarget, TEventKey>[];\n        }\n      | {\n          (event: React.SyntheticEvent<any>, props?: any): void;\n        };\n  };\n}\n\ntype NumberValue = number | { valueOf(): number };\n/**\n * D3 scale function shape. Don't want to introduce typing dependency to d3\n */\nexport interface D3Scale<TRange = any> {\n  (numberValue: NumberValue): number;\n  base?: () => number;\n  ticks: (count?: number) => number[];\n  tickFormat: (count?: number) => (d: number) => string;\n  domain: {\n    (): number[];\n    (domain: NumberValue[]): D3Scale<TRange>;\n  };\n  range: {\n    (): TRange[];\n    (range: TRange): D3Scale<TRange>;\n  };\n  copy: () => this;\n  invert: (value: number) => number;\n}\n\nexport type D3ScaleFn<TRange = any, TOutput = any> = () =>\n  | ScaleLinear<TRange, TOutput, unknown>\n  | ScaleLogarithmic<TRange, TOutput, unknown>\n  | ScaleTime<TRange, TOutput, unknown>\n  | ScalePower<TRange, TOutput, unknown>;\n\nexport type ScaleName = \"linear\" | \"time\" | \"log\" | \"sqrt\";\nexport type ScalePropType = ScaleName;\nexport type ScaleXYPropType = {\n  x: D3Scale;\n  y: D3Scale;\n};\n\nexport type CategoryPropType =\n  | string[]\n  | { x: string[] }\n  | { y: string[] }\n  | {\n      x: string[];\n      y: string[];\n    };\n\nexport type DataGetterPropType = ValueOrAccessor<\n  string | string[] | number | number[],\n  any // The arg will be the `datum`, which can have any type\n>;\n\nexport type InterpolationPropType =\n  | \"basis\"\n  | \"basisClosed\"\n  | \"basisOpen\"\n  | \"bundle\"\n  | \"cardinal\"\n  | \"cardinalClosed\"\n  | \"cardinalOpen\"\n  | \"catmullRom\"\n  | \"catmullRomClosed\"\n  | \"catmullRomOpen\"\n  | \"linear\"\n  | \"linearClosed\"\n  | \"monotoneX\"\n  | \"monotoneY\"\n  | \"natural\"\n  | \"radial\"\n  | \"step\"\n  | \"stepAfter\"\n  | \"stepBefore\";\n\nexport type ColorScalePropType =\n  | \"grayscale\"\n  | \"qualitative\"\n  | \"heatmap\"\n  | \"warm\"\n  | \"cool\"\n  | \"red\"\n  | \"green\"\n  | \"blue\"\n  | string[];\n\nexport type SortOrderPropType = \"ascending\" | \"descending\";\n\nexport interface VictoryLabelableProps {\n  labelComponent?: React.ReactElement;\n}\n\nexport interface VictoryMultiLabelableProps extends VictoryLabelableProps {\n  labels?:\n    | string[]\n    | number[]\n    | { (data: any): string | string[] | number | number[] | null };\n}\n\nexport interface VictorySingleLabelableProps extends VictoryLabelableProps {\n  label?: string | { (data: any): string | number | null };\n}\n\nexport type CoordinatesPropType = {\n  x: number;\n  y: number;\n};\n\nexport type VictoryEventHandler = (\n  event?: any,\n  targetProps?: any,\n  eventKey?: any,\n  context?: any,\n) => void;\n"
  },
  {
    "path": "packages/victory-core/src/victory-accessible-group/victory-accessible-group.test.tsx",
    "content": "import { render } from \"@testing-library/react\";\nimport React from \"react\";\n\nimport { SVGWrapper } from \"../../../../test/helpers\";\nimport { VictoryAccessibleGroup } from \"./victory-accessible-group\";\n\ndescribe(\"components/victory-accessible-group\", () => {\n  it(\"renders an g with an aria-label\", () => {\n    const { container } = render(\n      <VictoryAccessibleGroup aria-label=\"test-aria-label\" />,\n      { wrapper: SVGWrapper },\n    );\n    expect(container.querySelector(\"g\")).toMatchInlineSnapshot(`\n      <g\n        aria-label=\"test-aria-label\"\n        class=\"VictoryAccessibleGroup\"\n      />\n    `);\n  });\n\n  it(\"renders an g with a tabIndex and className\", () => {\n    const { container } = render(\n      <VictoryAccessibleGroup tabIndex={5} className=\"accessibility\" />,\n      { wrapper: SVGWrapper },\n    );\n    expect(container.querySelector(\"g\")).toMatchInlineSnapshot(`\n      <g\n        class=\"accessibility\"\n        tabindex=\"5\"\n      />\n    `);\n  });\n\n  it(\"renders an g with a desc node if given\", () => {\n    const { container } = render(\n      <VictoryAccessibleGroup\n        aria-label=\"desc node tests\"\n        desc=\"test description\"\n        aria-describedby=\"describes group\"\n      />,\n      { wrapper: SVGWrapper },\n    );\n    expect(container.querySelector(\"g\")).toMatchInlineSnapshot(`\n      <g\n        aria-describedby=\"describes group\"\n        aria-label=\"desc node tests\"\n        class=\"VictoryAccessibleGroup\"\n      >\n        <desc\n          id=\"describes group\"\n        >\n          test description\n        </desc>\n      </g>\n    `);\n  });\n\n  it(\"uses the desc getAttribute value for descId and aria-describedby if no aria-describedby getAttribute value\", () => {\n    const { container } = render(\n      <VictoryAccessibleGroup\n        aria-label=\"desc node tests\"\n        desc=\"applies to both aria-describedby and descId\"\n      />,\n      { wrapper: SVGWrapper },\n    );\n    expect(container.querySelector(\"g\")).toMatchInlineSnapshot(`\n      <g\n        aria-describedby=\"applies-to-both-aria-describedby-and-descId\"\n        aria-label=\"desc node tests\"\n        class=\"VictoryAccessibleGroup\"\n      >\n        <desc\n          id=\"applies-to-both-aria-describedby-and-descId\"\n        >\n          applies to both aria-describedby and descId\n        </desc>\n      </g>\n    `);\n  });\n});\n"
  },
  {
    "path": "packages/victory-core/src/victory-accessible-group/victory-accessible-group.tsx",
    "content": "import React from \"react\";\n\nexport interface VictoryAccessibleGroupProps {\n  desc?: string;\n  \"aria-describedby\"?: string;\n  \"aria-label\"?: string;\n  children?: React.ReactElement | React.ReactElement[];\n  className?: string;\n  tabIndex?: number;\n}\n\nexport const VictoryAccessibleGroup = ({\n  desc,\n  children,\n  tabIndex,\n  className = \"VictoryAccessibleGroup\",\n  ...props\n}: VictoryAccessibleGroupProps) => {\n  const descId =\n    desc && (props[\"aria-describedby\"] || desc.split(\" \").join(\"-\"));\n\n  return desc ? (\n    <g\n      aria-label={props[\"aria-label\"]}\n      aria-describedby={descId}\n      className={className}\n      tabIndex={tabIndex}\n    >\n      <desc id={descId}>{desc}</desc>\n      {children}\n    </g>\n  ) : (\n    <g\n      aria-label={props[\"aria-label\"]}\n      aria-describedby={props[\"aria-describedby\"]}\n      className={className}\n      tabIndex={tabIndex}\n    >\n      {children}\n    </g>\n  );\n};\n"
  },
  {
    "path": "packages/victory-core/src/victory-animation/util.test.tsx",
    "content": "import { victoryInterpolator } from \"./util\";\n\ndescribe(\"victoryInterpolator\", () => {\n  it(\"does not attempt to interpolate identical values\", () => {\n    // This case fails with the default interpolator, returning *almost* 3.\n    expect(victoryInterpolator(3, 3)(0.25920000000000004)).toEqual(3);\n  });\n\n  it(\"does not attempt to interpolate Boolean values\", () => {\n    // The default interpolator would return 0.5.\n    expect(victoryInterpolator(false, true)(0.5)).toEqual(true);\n  });\n\n  it(\"always returns the end value if starting from null\", () => {\n    const interpolator = victoryInterpolator(null, 5);\n    expect(interpolator(0)).toEqual(5);\n    expect(interpolator(0.49)).toEqual(5);\n    expect(interpolator(0.5)).toEqual(5);\n    expect(interpolator(1)).toEqual(5);\n  });\n\n  it(\"always returns the end value if ending on null\", () => {\n    const interpolator = victoryInterpolator(5, null);\n    expect(interpolator(0)).toBeNull();\n    expect(interpolator(0.49)).toBeNull();\n    expect(interpolator(0.5)).toBeNull();\n    expect(interpolator(1)).toBeNull();\n  });\n\n  it(\"always returns the end value if starting from undefined\", () => {\n    const interpolator = victoryInterpolator(undefined, 5);\n    expect(interpolator(0)).toEqual(5);\n    expect(interpolator(0.49)).toEqual(5);\n    expect(interpolator(0.5)).toEqual(5);\n    expect(interpolator(1)).toEqual(5);\n  });\n\n  it(\"always returns the end value if ending on undefined\", () => {\n    const interpolator = victoryInterpolator(5, undefined);\n    expect(interpolator(0)).toBeUndefined();\n    expect(interpolator(0.49)).toBeUndefined();\n    expect(interpolator(0.5)).toBeUndefined();\n    expect(interpolator(1)).toBeUndefined();\n  });\n\n  it(\"interpolates functions\", () => {\n    const fromFn = () => 5;\n    const toFn = () => 10;\n    const interpolator = victoryInterpolator(fromFn, toFn);\n    const halfwayFn = interpolator(0.5);\n    expect(halfwayFn).toBeInstanceOf(Function);\n    expect(halfwayFn()).toEqual(7.5);\n  });\n\n  it(\"interpolates string values\", () => {\n    // From https://github.com/d3/d3-interpolate/blob/main/test/value-test.js#L5-L7\n    const interpolator = victoryInterpolator(\"foo\", \"bar\");\n    expect(interpolator(0.5)).toEqual(\"bar\");\n  });\n\n  it(\"interpolates color values\", () => {\n    // From https://github.com/d3/d3-interpolate/blob/main/test/value-test.js#L15\n    const interpolator = victoryInterpolator(\"red\", \"blue\");\n    expect(interpolator(0.5)).toEqual(\"rgb(128, 0, 128)\");\n  });\n\n  it(\"interpolates object values\", () => {\n    // From https://github.com/d3/d3-interpolate/blob/main/test/value-test.js#L44\n    const interpolator = victoryInterpolator(\n      { color: \"red\" },\n      { color: \"blue\" },\n    );\n    expect(interpolator(0.5)).toEqual({ color: \"rgb(128, 0, 128)\" });\n  });\n});\n"
  },
  {
    "path": "packages/victory-core/src/victory-animation/util.ts",
    "content": "import isPlainObject from \"lodash/isPlainObject\";\nimport orderBy from \"lodash/orderBy\";\n\nimport { interpolate } from \"victory-vendor/d3-interpolate\";\n\nexport const isInterpolatable = function (obj) {\n  // d3 turns null into 0 and undefined into NaN, which we don't want.\n  if (obj !== null) {\n    switch (typeof obj) {\n      case \"undefined\":\n        return false;\n      case \"number\":\n        // The standard `isNaN` is fine in this case since we already know the\n        // type is number.\n        return (\n          !isNaN(obj) &&\n          obj !== Number.POSITIVE_INFINITY &&\n          obj !== Number.NEGATIVE_INFINITY\n        );\n      case \"string\":\n        // d3 might not *actually* be able to interpolate the string, but it\n        // won't cause any issues to let it try.\n        return true;\n      case \"boolean\":\n        // d3 turns Booleans into integers, which we don't want. Sure, we could\n        // interpolate from 0 -> 1, but we'd be sending a non-Boolean to\n        // something expecting a Boolean.\n        return false;\n      case \"object\":\n        // Don't try to interpolate class instances (except Date or Array).\n        return obj instanceof Date || Array.isArray(obj) || isPlainObject(obj);\n      case \"function\":\n        // Careful! There may be extra properties on function objects that the\n        // component expects to access - for instance, it may be a `d3.scale()`\n        // function, which has its own methods attached. We don't know if the\n        // component is only going to call the function (in which case it's\n        // safely interpolatable) or if it's going to access special properties\n        // (in which case our function generated from `interpolateFunction` will\n        // most likely cause an error). We could check for enumerable properties\n        // on the function object here to see if it's a \"plain\" function, but\n        // let's just require that components prevent such function props from\n        // being animated in the first place.\n        return true;\n    }\n  }\n  return false;\n};\n\n/**\n * Interpolate immediately to the end value at the given step `when`.\n * Some nicer default behavior might be to jump at the halfway point or return\n * `a` if `t` is 0 (instead of always returning `b`). But d3's default\n * interpolator does not do these things:\n *\n *   d3.interpolate('aaa', 'bbb')(0) === 'bbb'\n *\n * ...and things might get wonky if we don't replicate that behavior.\n *\n * @param {any} a - Start value.\n * @param {any} b - End value.\n * @param {Number} when - Step value (0 to 1) at which to jump to `b`.\n * @returns {Function} An interpolation function.\n */\nexport const interpolateImmediate = function (a, b, when = 0) {\n  return function (t) {\n    return t < when ? a : b;\n  };\n};\n\n/**\n * Interpolate to or from a function. The interpolated value will be a function\n * that calls `a` (if it's a function) and `b` (if it's a function) and calls\n * `d3.interpolate` on the resulting values. Note that our function won't\n * necessarily be called (that's up to the component this eventually gets\n * passed to) - but if it does get called, it will return an appropriately\n * interpolated value.\n *\n * @param {any} a - Start value.\n * @param {any} b - End value.\n * @returns {Function} An interpolation function.\n */\nexport const interpolateFunction = function (a, b) {\n  return function (t) {\n    if (t >= 1) {\n      return b;\n    }\n    return function (this: unknown) {\n      /* eslint-disable prefer-rest-params */\n      const aval = typeof a === \"function\" ? a.apply(this, arguments) : a;\n      const bval = typeof b === \"function\" ? b.apply(this, arguments) : b;\n      return interpolate(aval, bval)(t);\n    };\n  };\n};\n\n/**\n * Interpolate to or from an object. This method is a modification of the object interpolator in\n * d3-interpolate https://github.com/d3/d3-interpolate/blob/master/src/object.js. This interpolator\n * differs in that it uses our custom interpolators when interpolating the value of each property in\n * an object. This allows the correct interpolation of nested objects, including styles\n *\n * @param {any} startValue - Start value.\n * @param {any} endValue - End value.\n * @returns {Function} An interpolation function.\n */\nexport const interpolateObject = function (startValue, endValue) {\n  const interpolateTypes = (x, y) => {\n    if (x === y || !isInterpolatable(x) || !isInterpolatable(y)) {\n      return interpolateImmediate(x, y);\n    }\n    if (typeof x === \"function\" || typeof y === \"function\") {\n      return interpolateFunction(x, y);\n    }\n    if (\n      (typeof x === \"object\" && isPlainObject(x)) ||\n      (typeof y === \"object\" && isPlainObject(y))\n    ) {\n      return interpolateObject(x, y);\n    }\n    return interpolate(x, y);\n  };\n\n  // When the value is an array, attempt to sort by \"key\" so that animating nodes may be identified\n  // based on \"key\" instead of index\n  const keyData = (val) => {\n    return Array.isArray(val) ? orderBy(val, \"key\") : val;\n  };\n\n  const i = {};\n  const c = {};\n  let a = startValue;\n  let b = endValue;\n  let k;\n\n  if (a === null || typeof a !== \"object\") {\n    a = {};\n  }\n  if (b === null || typeof b !== \"object\") {\n    b = {};\n  }\n\n  for (k in b) {\n    if (k in a) {\n      i[k] = interpolateTypes(keyData(a[k]), keyData(b[k]));\n    } else {\n      c[k] = b[k];\n    }\n  }\n\n  return function (t) {\n    for (k in i) {\n      c[k] = i[k](t);\n    }\n    return c;\n  };\n};\n\nexport const interpolateString = function (a, b) {\n  const format = (val) => {\n    return typeof val === \"string\" ? val.replace(/,/g, \"\") : val;\n  };\n\n  return interpolate(format(a), format(b));\n};\n\n/**\n * By default, the list of interpolators used by `d3.interpolate` has a few\n * downsides:\n *\n * - `null` values get turned into 0.\n * - `undefined`, `function`, and some other value types get turned into NaN.\n * - Boolean types get turned into numbers, which probably will be meaningless\n *   to whatever is consuming them.\n * - It tries to interpolate between identical start and end values, doing\n *   unnecessary calculations that sometimes result in floating point rounding\n *   errors.\n *\n * If only the default interpolators are used, `VictoryAnimation` will happily\n * pass down NaN (and other bad) values as props to the wrapped component.\n * The component will then either use the incorrect values or complain that it\n * was passed props of the incorrect type. This custom interpolator is added\n * using the `d3.interpolators` API, and prevents such cases from happening\n * for most values.\n *\n * @param {any} a - Start value.\n * @param {any} b - End value.\n * @returns {Function|undefined} An interpolation function, if necessary.\n */\nexport const victoryInterpolator = function <T>(a: T, b: T): (t: number) => T {\n  // If the values are strictly equal, or either value is not interpolatable,\n  // just use either the start value `a` or end value `b` at every step, as\n  // there is no reasonable in-between value.\n  if (a === b || !isInterpolatable(a) || !isInterpolatable(b)) {\n    return interpolateImmediate(a, b);\n  }\n  if (typeof a === \"function\" || typeof b === \"function\") {\n    return interpolateFunction(a, b);\n  }\n  if (isPlainObject(a) || isPlainObject(b)) {\n    // @ts-expect-error These generics are tough, but they work :)\n    return interpolateObject(a, b);\n  }\n  if (typeof a === \"string\" || typeof b === \"string\") {\n    return interpolateString(a, b);\n  }\n  // @ts-expect-error These generics are tough, but they work :)\n  return interpolate(a, b);\n};\n"
  },
  {
    "path": "packages/victory-core/src/victory-animation/victory-animation.tsx",
    "content": "import React from \"react\";\nimport * as d3Ease from \"victory-vendor/d3-ease\";\nimport { victoryInterpolator } from \"./util\";\nimport TimerContext from \"../victory-util/timer-context\";\n\n/**\n * Single animation object to interpolate\n */\nexport type AnimationStyle = { [key: string]: string | number };\n/**\n * Animation styles to interpolate\n */\n\nexport type AnimationData = AnimationStyle | AnimationStyle[];\n\nexport type AnimationEasing =\n  | \"back\"\n  | \"backIn\"\n  | \"backOut\"\n  | \"backInOut\"\n  | \"bounce\"\n  | \"bounceIn\"\n  | \"bounceOut\"\n  | \"bounceInOut\"\n  | \"circle\"\n  | \"circleIn\"\n  | \"circleOut\"\n  | \"circleInOut\"\n  | \"linear\"\n  | \"linearIn\"\n  | \"linearOut\"\n  | \"linearInOut\"\n  | \"cubic\"\n  | \"cubicIn\"\n  | \"cubicOut\"\n  | \"cubicInOut\"\n  | \"elastic\"\n  | \"elasticIn\"\n  | \"elasticOut\"\n  | \"elasticInOut\"\n  | \"exp\"\n  | \"expIn\"\n  | \"expOut\"\n  | \"expInOut\"\n  | \"poly\"\n  | \"polyIn\"\n  | \"polyOut\"\n  | \"polyInOut\"\n  | \"quad\"\n  | \"quadIn\"\n  | \"quadOut\"\n  | \"quadInOut\"\n  | \"sin\"\n  | \"sinIn\"\n  | \"sinOut\"\n  | \"sinInOut\";\n\nexport interface VictoryAnimationProps {\n  children: (style: AnimationStyle, info: AnimationInfo) => React.ReactElement;\n  duration?: number;\n  easing?: AnimationEasing;\n  delay?: number;\n  onEnd?: () => void;\n  data: AnimationData;\n}\n\nexport interface VictoryAnimationState {\n  data: AnimationStyle;\n  animationInfo: AnimationInfo;\n}\n\nexport interface AnimationInfo {\n  progress: number;\n  animating: boolean;\n  terminating?: boolean;\n}\n\nexport interface VictoryAnimation {\n  context: React.ContextType<typeof TimerContext>;\n}\n\n/** d3-ease changed the naming scheme for ease from \"linear\" -> \"easeLinear\" etc. */\nconst formatAnimationName = (name: AnimationEasing) => {\n  const capitalizedName = name.charAt(0).toUpperCase() + name.slice(1);\n  return `ease${capitalizedName}`;\n};\n\nconst DEFAULT_DURATION = 1000;\n\nexport const VictoryAnimation = ({\n  duration = DEFAULT_DURATION,\n  easing = \"quadInOut\",\n  delay = 0,\n  data,\n  children,\n  onEnd,\n}: VictoryAnimationProps) => {\n  const [state, setState] = React.useState<VictoryAnimationState>({\n    data: Array.isArray(data) ? data[0] : data,\n    animationInfo: {\n      progress: 0,\n      animating: false,\n    },\n  });\n\n  const timer = React.useContext(TimerContext).animationTimer;\n  const queue = React.useRef<AnimationStyle[]>(\n    Array.isArray(data) ? data.slice(1) : [],\n  );\n  const interpolator = React.useRef<null | ((value: number) => AnimationStyle)>(\n    null,\n  );\n  const loopID = React.useRef<number | undefined>(undefined);\n  const ease = d3Ease[formatAnimationName(easing)];\n\n  React.useEffect(() => {\n    // Length check prevents us from triggering `onEnd` in `traverseQueue`.\n    if (queue.current.length) {\n      traverseQueue();\n    }\n\n    // Clean up the animation loop\n    return () => {\n      if (loopID.current) {\n        timer.unsubscribe(loopID.current);\n      } else {\n        timer.stop();\n      }\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  React.useEffect(() => {\n    // If the previous animation didn't finish, force it to complete before starting a new one\n    if (\n      interpolator.current &&\n      state.animationInfo &&\n      state.animationInfo.progress < 1\n    ) {\n      setState({\n        data: interpolator.current(1),\n        animationInfo: {\n          progress: 1,\n          animating: false,\n          terminating: true,\n        },\n      });\n    } else {\n      // Cancel existing loop if it exists\n      timer.unsubscribe(loopID.current);\n      // Set the tween queue to the new data\n      queue.current = Array.isArray(data) ? data : [data];\n      // Start traversing the tween queue\n      traverseQueue();\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [data]);\n\n  const traverseQueue = () => {\n    if (queue.current.length) {\n      const nextData = queue.current[0];\n\n      // Compare cached version to next props\n      interpolator.current = victoryInterpolator(state.data, nextData);\n\n      // Reset step to zero\n      if (delay) {\n        setTimeout(() => {\n          loopID.current = timer.subscribe(functionToBeRunEachFrame, duration);\n        }, delay);\n      } else {\n        loopID.current = timer.subscribe(functionToBeRunEachFrame, duration);\n      }\n    } else if (onEnd) {\n      onEnd();\n    }\n  };\n\n  const functionToBeRunEachFrame = (elapsed: number) => {\n    if (!interpolator.current) return;\n\n    // Step can generate imprecise values, sometimes greater than 1\n    // if this happens set the state to 1 and return, cancelling the timer\n    const step = duration ? elapsed / duration : 1;\n\n    if (step >= 1) {\n      setState({\n        data: interpolator.current(1),\n        animationInfo: {\n          progress: 1,\n          animating: false,\n          terminating: true,\n        },\n      });\n      if (loopID.current) {\n        timer.unsubscribe(loopID.current);\n      }\n      queue.current.shift();\n      traverseQueue();\n      return;\n    }\n\n    // If we're not at the end of the timer, set the state by passing\n    // current step value that's transformed by the ease function to the\n    // interpolator, which is cached for performance whenever props are received\n    setState({\n      data: interpolator.current(ease(step)),\n      animationInfo: {\n        progress: step,\n        animating: step < 1,\n      },\n    });\n  };\n\n  return children(state.data, state.animationInfo);\n};\n"
  },
  {
    "path": "packages/victory-core/src/victory-clip-container/victory-clip-container.tsx",
    "content": "import React from \"react\";\nimport defaults from \"lodash/defaults\";\nimport uniqueId from \"lodash/uniqueId\";\n\nimport * as Helpers from \"../victory-util/helpers\";\nimport * as UserProps from \"../victory-util/user-props\";\nimport { ClipPath } from \"../victory-primitives/clip-path\";\nimport { Circle } from \"../victory-primitives/circle\";\nimport { Rect } from \"../victory-primitives/rect\";\n\nimport { BlockProps } from \"../victory-theme/victory-theme\";\nimport { OriginType } from \"../victory-label/victory-label\";\n\nexport interface VictoryClipContainerProps {\n  \"aria-label\"?: string;\n  children?: React.ReactElement | React.ReactElement[];\n  circleComponent?: React.ReactElement;\n  className?: string;\n  clipHeight?: number;\n  clipId?: number | string;\n  clipPadding?: BlockProps;\n  clipPathComponent?: React.ReactElement;\n  clipWidth?: number;\n  events?: React.DOMAttributes<any>;\n  groupComponent?: React.ReactElement;\n  origin?: OriginType;\n  polar?: boolean;\n  radius?: number;\n  rectComponent?: React.ReactElement;\n  translateX?: number;\n  translateY?: number;\n}\n\ninterface VictoryClipContainerState {\n  clipId?: number | string;\n}\n\nexport class VictoryClipContainer extends React.Component<\n  VictoryClipContainerProps,\n  VictoryClipContainerState\n> {\n  static displayName = \"VictoryClipContainer\";\n  static role = \"container\";\n\n  static defaultProps = {\n    circleComponent: <Circle />,\n    rectComponent: <Rect />,\n    clipPathComponent: <ClipPath />,\n    groupComponent: <g />,\n  };\n  public clipId: VictoryClipContainerProps[\"clipId\"];\n\n  constructor(props: VictoryClipContainerProps) {\n    super(props);\n    this.state = {\n      clipId: props?.clipId,\n    };\n  }\n\n  // The clipId state is used to prevent hydration mismatches between the server and client (issue #2941).\n  // A better alternative would be to utilize React 18's useId hook instead of uniqueId, which would avoid needing state for this purpose.\n  // However, this component currently supports React 16 at the time of writing, so this workaround is necessary.\n  componentDidMount() {\n    if (!this.state.clipId) {\n      this.setState({ clipId: uniqueId(\"victory-clip-\") });\n    }\n  }\n\n  calculateAttributes(props) {\n    const {\n      polar,\n      origin,\n      clipWidth = 0,\n      clipHeight = 0,\n      translateX = 0,\n      translateY = 0,\n    } = props;\n    const clipPadding = Helpers.getPadding(props.clipPadding);\n    const radius = props.radius || Helpers.getRadius(props);\n    return {\n      x: (polar ? origin.x : translateX) - clipPadding.left,\n      y: (polar ? origin.y : translateY) - clipPadding.top,\n      width: Math.max(\n        (polar ? radius : clipWidth) + clipPadding.left + clipPadding.right,\n        0,\n      ),\n      height: Math.max(\n        (polar ? radius : clipHeight) + clipPadding.top + clipPadding.bottom,\n        0,\n      ),\n    };\n  }\n\n  renderClippedGroup(props, clipId) {\n    const userProps = UserProps.getSafeUserProps(props);\n    const {\n      style,\n      events,\n      transform,\n      children,\n      className,\n      groupComponent,\n      tabIndex,\n    } = props;\n    const clipComponent = this.renderClipComponent(props, clipId);\n    const groupProps = Object.assign(\n      {\n        className,\n        style,\n        transform,\n        key: `clipped-group-${clipId}`,\n        clipPath: `url(#${clipId})`,\n      },\n      events,\n    );\n    return React.cloneElement(\n      groupComponent,\n      { ...groupProps, tabIndex, ...userProps },\n      [clipComponent, ...React.Children.toArray(children)],\n    );\n  }\n\n  renderGroup(props) {\n    const {\n      style,\n      events,\n      transform,\n      children,\n      className,\n      groupComponent,\n      tabIndex,\n    } = props;\n    return React.cloneElement(\n      groupComponent,\n      Object.assign(\n        {\n          className,\n          style,\n          transform,\n          \"aria-label\": props[\"aria-label\"],\n          tabIndex,\n        },\n        events,\n      ),\n      children,\n    );\n  }\n\n  renderClipComponent(props, clipId) {\n    const {\n      polar,\n      origin,\n      clipWidth = 0,\n      clipHeight = 0,\n      translateX = 0,\n      translateY = 0,\n      circleComponent,\n      rectComponent,\n      clipPathComponent,\n    } = props;\n    const { top, bottom, left, right } = Helpers.getPadding(props.clipPadding);\n    let child;\n    if (polar) {\n      const radius = props.radius || Helpers.getRadius(props);\n      const circleProps = {\n        r: Math.max(radius + left + right, radius + top + bottom, 0),\n        cx: origin.x - left,\n        cy: origin.y - top,\n      };\n      child = React.cloneElement(circleComponent, circleProps);\n    } else {\n      const rectProps = {\n        x: translateX - left,\n        y: translateY - top,\n        width: Math.max(clipWidth + left + right, 0),\n        height: Math.max(clipHeight + top + bottom, 0),\n      };\n      child = React.cloneElement(rectComponent, rectProps);\n    }\n\n    return React.cloneElement(\n      clipPathComponent,\n      Object.assign({ key: `clip-path-${clipId}` }, props, { clipId }),\n      child,\n    );\n  }\n\n  getClipValue(props, axis) {\n    const clipValues = { x: props.clipWidth, y: props.clipHeight };\n    if (clipValues[axis] !== undefined) {\n      return clipValues[axis];\n    }\n    const range = Helpers.getRange(props, axis);\n    return range ? Math.abs(range[0] - range[1]) || undefined : undefined;\n  }\n\n  getTranslateValue(props, axis) {\n    const translateValues = { x: props.translateX, y: props.translateY };\n    if (translateValues[axis] !== undefined) {\n      return translateValues[axis];\n    }\n    const range = Helpers.getRange(props, axis);\n    return range ? Math.min(...range) : undefined;\n  }\n  render() {\n    const clipHeight = this.getClipValue(this.props, \"y\");\n    const clipWidth = this.getClipValue(this.props, \"x\");\n    if (clipWidth === undefined || clipHeight === undefined) {\n      return this.renderGroup(this.props);\n    }\n    const translateX = this.getTranslateValue(this.props, \"x\");\n    const translateY = this.getTranslateValue(this.props, \"y\");\n    const clipProps = defaults({}, this.props, {\n      clipHeight,\n      clipWidth,\n      translateX,\n      translateY,\n    });\n    return this.renderClippedGroup(clipProps, this.state.clipId);\n  }\n}\n"
  },
  {
    "path": "packages/victory-core/src/victory-container/victory-container.test.tsx",
    "content": "import React from \"react\";\n\nimport { VictoryContainer } from \"./victory-container\";\nimport { fireEvent, render } from \"@testing-library/react\";\n\ndescribe(\"components/victory-container\", () => {\n  it(\"renders an svg with a role of img\", () => {\n    const { container } = render(<VictoryContainer />);\n    const output = container.querySelector(\"svg\")!;\n    expect(output.getAttribute(\"role\")).toContain(\"img\");\n  });\n\n  it(\"renders an svg with a custom role\", () => {\n    const { container } = render(<VictoryContainer role=\"presentation\" />);\n    expect(container.querySelector(\"svg\")!.getAttribute(\"role\")).toEqual(\n      \"presentation\",\n    );\n  });\n\n  it(\"renders an svg with a title node\", () => {\n    const { container } = render(\n      <VictoryContainer\n        containerId=\"victory-container\"\n        title=\"Victory Chart\"\n      />,\n    );\n    expect(container.querySelector(\"title\")).toMatchInlineSnapshot(`\n      <title\n        id=\"victory-container-title\"\n      >\n        Victory Chart\n      </title>\n    `);\n  });\n\n  it(\"renders an svg with a desc node\", () => {\n    const { container } = render(\n      <VictoryContainer containerId=\"victory-container\" desc=\"description\" />,\n    );\n    expect(container.querySelector(\"desc\")).toMatchInlineSnapshot(`\n      <desc\n        id=\"victory-container-desc\"\n      >\n        description\n      </desc>\n    `);\n  });\n\n  it(\"renders an svg with an aria-describedby attribute\", () => {\n    const { container } = render(\n      <VictoryContainer aria-describedby=\"testid\" desc=\"description\" />,\n    );\n    const describedElement = container.querySelector(\n      `svg[aria-describedby~=\"testid\"]`,\n    );\n    expect(describedElement).toBeDefined();\n  });\n\n  it(\"renders an svg with an aria-labelledby attribute\", () => {\n    const { container } = render(\n      <VictoryContainer aria-labelledby=\"testid\" title=\"title\" />,\n    );\n    const describedElement = container.querySelector(\n      `svg[aria-labelledby~=\"testid\"]`,\n    );\n    expect(describedElement).toBeDefined();\n  });\n\n  it(\"renders an svg with the correct viewbox\", () => {\n    const width = 300;\n    const height = 300;\n    const { container } = render(\n      <VictoryContainer width={width} height={height} />,\n    );\n    const svg = container.querySelector(\"svg\")!;\n    const viewBoxValue = `0 0 ${width} ${height}`;\n    expect(svg.getAttribute(\"viewBox\")).toEqual(viewBoxValue);\n  });\n\n  it(\"attaches an event to the container\", () => {\n    const clickHandler = jest.fn();\n    const { container } = render(\n      <VictoryContainer events={{ onClick: clickHandler }} />,\n    );\n    const svg = container.querySelector(\"svg\")!;\n    fireEvent.click(svg);\n    expect(clickHandler).toBeCalled();\n  });\n});\n"
  },
  {
    "path": "packages/victory-core/src/victory-container/victory-container.tsx",
    "content": "import React, { useRef } from \"react\";\nimport uniqueId from \"lodash/uniqueId\";\nimport { Portal } from \"../victory-portal/portal\";\nimport * as UserProps from \"../victory-util/user-props\";\nimport { OriginType } from \"../victory-label/victory-label\";\nimport { D3Scale } from \"../types/prop-types\";\nimport { VictoryThemeDefinition } from \"../victory-theme/types\";\nimport { mergeRefs } from \"../victory-util\";\nimport { PortalOutlet } from \"../victory-portal/portal-outlet\";\nimport { PortalProvider } from \"../victory-portal/portal-context\";\n\nexport interface VictoryContainerProps {\n  \"aria-describedby\"?: string;\n  \"aria-labelledby\"?: string;\n  children?: React.ReactElement | React.ReactElement[];\n  className?: string;\n  containerId?: number | string;\n  containerRef?: React.Ref<HTMLElement>;\n  desc?: string;\n  events?: React.DOMAttributes<any>;\n  height?: number;\n  name?: string;\n  origin?: OriginType;\n  polar?: boolean;\n  portalComponent?: React.ReactElement;\n  portalZIndex?: number;\n  preserveAspectRatio?: string;\n  responsive?: boolean;\n  role?: string;\n  scale?: {\n    x?: D3Scale;\n    y?: D3Scale;\n  };\n  style?: React.CSSProperties;\n  tabIndex?: number;\n  theme?: VictoryThemeDefinition;\n  title?: string;\n  width?: number;\n  // Props defined by the Open UI Automation (OUIA) 1.0-RC spec\n  // See https://ouia.readthedocs.io/en/latest/README.html#ouia-component\n  ouiaId?: number | string;\n  ouiaSafe?: boolean;\n  ouiaType?: string;\n}\n\nconst defaultProps = {\n  className: \"VictoryContainer\",\n  portalComponent: <Portal />,\n  portalZIndex: 99,\n  responsive: true,\n  role: \"img\",\n};\n\nexport function useVictoryContainer<TProps extends VictoryContainerProps>(\n  initialProps: TProps,\n) {\n  const props = { ...defaultProps, ...initialProps };\n  const { title, desc, width, height, responsive } = props;\n\n  const localContainerRef = useRef<HTMLDivElement>(null);\n\n  // Generated ID stored in ref because it needs to persist across renders\n  const generatedId = useRef(uniqueId(\"victory-container-\"));\n  const containerId = props.containerId ?? generatedId.current;\n\n  const getIdForElement = (elName: string) => `${containerId}-${elName}`;\n\n  const userProps = UserProps.getSafeUserProps(props);\n\n  const dimensions = responsive\n    ? { width: \"100%\", height: \"100%\" }\n    : { width, height };\n\n  const viewBox = responsive ? `0 0 ${width} ${height}` : undefined;\n\n  const preserveAspectRatio = responsive\n    ? props.preserveAspectRatio\n    : undefined;\n\n  const ariaLabelledBy =\n    [title && getIdForElement(\"title\"), props[\"aria-labelledby\"]]\n      .filter(Boolean)\n      .join(\" \") || undefined;\n\n  const ariaDescribedBy =\n    [desc && getIdForElement(\"desc\"), props[\"aria-describedby\"]]\n      .filter(Boolean)\n      .join(\" \") || undefined;\n\n  const titleId = getIdForElement(\"title\");\n  const descId = getIdForElement(\"desc\");\n\n  return {\n    ...props,\n    titleId,\n    descId,\n    dimensions,\n    viewBox,\n    preserveAspectRatio,\n    ariaLabelledBy,\n    ariaDescribedBy,\n    userProps,\n    localContainerRef,\n  };\n}\n\nexport const VictoryContainer = (initialProps: VictoryContainerProps) => {\n  const {\n    role,\n    title,\n    desc,\n    children,\n    className,\n    portalZIndex,\n    portalComponent,\n    width,\n    height,\n    style,\n    tabIndex,\n    responsive,\n    events,\n    ouiaId,\n    ouiaSafe,\n    ouiaType,\n    dimensions,\n    ariaDescribedBy,\n    ariaLabelledBy,\n    viewBox,\n    preserveAspectRatio,\n    userProps,\n    titleId,\n    descId,\n    containerRef,\n    localContainerRef,\n  } = useVictoryContainer(initialProps);\n\n  React.useEffect(() => {\n    if (!events?.onWheel) return;\n\n    const handleWheel = (e: WheelEvent) => e.preventDefault();\n\n    const container = localContainerRef?.current;\n    container?.addEventListener(\"wheel\", handleWheel);\n\n    return () => {\n      container?.removeEventListener(\"wheel\", handleWheel);\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  return (\n    <div\n      className={className}\n      style={{\n        ...style,\n        width: responsive ? style?.width : dimensions.width,\n        height: responsive ? style?.height : dimensions.height,\n        pointerEvents: style?.pointerEvents ?? \"none\",\n        touchAction: style?.touchAction ?? \"none\",\n        position: style?.position ?? \"relative\",\n      }}\n      data-ouia-component-id={ouiaId}\n      data-ouia-component-type={ouiaType}\n      data-ouia-safe={ouiaSafe}\n      ref={mergeRefs([localContainerRef, containerRef])}\n    >\n      <PortalProvider>\n        <svg\n          width={width}\n          height={height}\n          tabIndex={tabIndex}\n          role={role}\n          aria-labelledby={ariaLabelledBy}\n          aria-describedby={ariaDescribedBy}\n          viewBox={viewBox}\n          preserveAspectRatio={preserveAspectRatio}\n          style={{ ...dimensions, pointerEvents: \"all\" }}\n          {...userProps}\n          {...events}\n        >\n          {title ? <title id={titleId}>{title}</title> : null}\n          {desc ? <desc id={descId}>{desc}</desc> : null}\n          {children}\n        </svg>\n        <div\n          style={{\n            ...dimensions,\n            zIndex: portalZIndex,\n            position: \"absolute\",\n            top: 0,\n            left: 0,\n          }}\n        >\n          <PortalOutlet\n            as={portalComponent}\n            width={width}\n            height={height}\n            viewBox={viewBox}\n            preserveAspectRatio={preserveAspectRatio}\n            style={{\n              ...dimensions,\n              overflow: \"visible\",\n            }}\n          />\n        </div>\n      </PortalProvider>\n    </div>\n  );\n};\n\nVictoryContainer.role = \"container\";\n"
  },
  {
    "path": "packages/victory-core/src/victory-label/victory-label.test.tsx",
    "content": "import React from \"react\";\nimport { screen, fireEvent, render } from \"@testing-library/react\";\n\nimport { SVGWrapper } from \"../../../../test/helpers\";\nimport { Log } from \"../victory-util\";\nimport { VictoryLabel } from \"./victory-label\";\n\ndescribe(\"components/victory-label\", () => {\n  it(\"accepts user props\", () => {\n    render(\n      <VictoryLabel\n        data-testid=\"victory-label\"\n        aria-label=\"test-aria-label\"\n        text=\"label\"\n      />,\n      { wrapper: SVGWrapper },\n    );\n\n    expect(screen.getByTestId(\"victory-label\")).toBeDefined();\n    expect(screen.getByLabelText(\"test-aria-label\")).toBeDefined();\n  });\n\n  it(\"has expected content with render\", () => {\n    const { container } = render(<VictoryLabel text=\"such text, wow\" />, {\n      wrapper: SVGWrapper,\n    });\n    expect(container.querySelector(\"tspan\")!.innerHTML).toMatchInlineSnapshot(\n      `\"such text, wow\"`,\n    );\n  });\n\n  it(\"sets dx and dy for text element\", () => {\n    const { container } = render(\n      <VictoryLabel dx={30} dy={30} text=\"such text, wow\" />,\n      { wrapper: SVGWrapper },\n    );\n    const output = container.querySelector(\"text\")!;\n    expect(output.getAttribute(\"dx\")).toEqual(\"30\");\n    // dy = props.dy + (capHeight(0.71) / 2 + (0.5 - length(1) / 2) * lineHeight(1)) * fontSize(14);\n    expect(output.getAttribute(\"dy\")).toBeNull();\n  });\n\n  it(\"sets x and y for text element\", () => {\n    const { container } = render(\n      // @ts-expect-error \"type string is not assignable to number\"\n      <VictoryLabel x=\"100%\" y={30} text=\"such text, wow\" />,\n      { wrapper: SVGWrapper },\n    );\n    const output = container.querySelector(\"text\")!;\n    expect(output.getAttribute(\"x\")).toEqual(\"100%\");\n    expect(parseFloat(output.getAttribute(\"y\")!)).toEqual(34.97);\n  });\n\n  it(\"has a transform property that rotates the text to match the labelAngle getAttribute\", () => {\n    const { container } = render(\n      <VictoryLabel angle={46} text=\"such text, wow\" />,\n      { wrapper: SVGWrapper },\n    );\n    const output = container.querySelector(\"text\")!;\n    expect(output.getAttribute(\"transform\")).toContain(\"rotate(46\");\n  });\n\n  it(\"accepts the angle getAttribute as a function\", () => {\n    const { container } = render(\n      <VictoryLabel angle={() => 46} text=\"such text, wow\" />,\n      { wrapper: SVGWrapper },\n    );\n    const output = container.querySelector(\"text\")!;\n    expect(output.getAttribute(\"transform\")).toContain(\"rotate(46\");\n  });\n\n  it(\"strips px from fontSize\", () => {\n    // This suppresses the warning about the fontSize being a string.\n    // TODO: For some reason this test file doesn't respect the eslint override for this rule.\n\n    jest.spyOn(console, \"warn\").mockImplementation(() => {});\n    const { container } = render(\n      <VictoryLabel\n        style={{ fontSize: \"10px\" }}\n        text=\"such text, wow\"\n        data-font-size={(props) => props.style.fontSize}\n      />,\n      { wrapper: SVGWrapper },\n    );\n    const output = container.querySelector(\"text\")!;\n    expect(output.getAttribute(\"data-font-size\")).toEqual(\"10\");\n  });\n\n  it(\"uses a default fontSize when an invalid fontSize is given\", () => {\n    // This suppresses the console warning for invalid fontSize prop\n    // TODO: For some reason this test file doesn't respect the eslint override for this rule.\n\n    jest.spyOn(Log, \"warn\").mockImplementation(() => {});\n\n    const { container } = render(\n      <VictoryLabel style={{ fontSize: \"foo\" }} text=\"such text, wow\" />,\n      { wrapper: SVGWrapper },\n    );\n    const output = container.querySelector(\"tspan\")!;\n    expect(output.getAttribute(\"style\")).toContain(\"font-size: 14px\");\n  });\n\n  it(\"renders an array of text as seperate tspans\", () => {\n    const { container } = render(\n      <VictoryLabel text={[\"one\", \"two\", \"three\"]} />,\n      { wrapper: SVGWrapper },\n    );\n    const output = container.querySelectorAll(\"tspan\");\n    expect(output.length).toEqual(3);\n  });\n\n  it(\"renders splits newlines into tspans\", () => {\n    const { container } = render(<VictoryLabel text={\"one\\ntwo\\nthree\"} />, {\n      wrapper: SVGWrapper,\n    });\n    const output = container.querySelectorAll(\"tspan\");\n    expect(output.length).toEqual(3);\n  });\n\n  it(\"renders title and desc if provided \", () => {\n    const { container } = render(\n      <VictoryLabel text=\"title and desc\" title=\"title\" desc=\"desc\" />,\n      { wrapper: SVGWrapper },\n    );\n\n    const { container: container2 } = render(\n      <VictoryLabel text=\"title and desc\" />,\n      { wrapper: SVGWrapper },\n    );\n\n    const title = container.querySelectorAll(\"title\");\n    expect(title.length).toEqual(1);\n\n    const desc = container.querySelectorAll(\"desc\");\n    expect(desc.length).toEqual(1);\n\n    const noTitle = container2.querySelectorAll(\"title\");\n    expect(noTitle.length).toEqual(0);\n\n    const noDesc = container2.querySelectorAll(\"desc\");\n    expect(noDesc.length).toEqual(0);\n  });\n\n  it(\"renders tspan styles independently when `style` is an array\", () => {\n    const fill = [\"red\", \"green\", \"blue\"];\n    const { container } = render(\n      <VictoryLabel\n        text={\"one\\ntwo\\nthree\"}\n        style={[{ fill: fill[0] }, { fill: fill[1] }, { fill: fill[2] }]}\n      />,\n      { wrapper: SVGWrapper },\n    );\n    const output = container.querySelectorAll(\"tspan\");\n    output.forEach((tspan, index) => {\n      expect(tspan.getAttribute(\"style\")).toContain(`fill: ${fill[index]}`);\n    });\n  });\n\n  describe(\"event handling\", () => {\n    it(\"attaches an to the parent object\", () => {\n      const clickHandler = jest.fn();\n      const { container } = render(\n        <VictoryLabel text=\"hi\" events={{ onClick: clickHandler }} />,\n        { wrapper: SVGWrapper },\n      );\n      fireEvent.click(container.querySelector(\"text\")!);\n      expect(clickHandler).toHaveBeenCalled();\n    });\n  });\n\n  it(\"renders 'tspan' elements inline when `inline` getAttribute is passed\", () => {\n    const { container } = render(\n      <VictoryLabel text={[\"Inline\", \"label\", \"testing\"]} inline dx={5} />,\n      { wrapper: SVGWrapper },\n    );\n\n    const output = container.querySelectorAll(\"tspan\");\n    output.forEach((tspan) => {\n      // passing `inline` sets x and dy to undefined\n      expect(tspan.getAttribute(\"x\")).toBeNull();\n      expect(\n        tspan.getAttribute(\"dy\") === null || tspan.getAttribute(\"dy\") === \"0\",\n      ).toBeTruthy();\n      expect(tspan.getAttribute(\"dx\")).toEqual(\"5\");\n    });\n  });\n\n  it(\"passes lineHeight as an array if provided\", () => {\n    const lineHeight = [1, 2, 3];\n    const expectedDy = [0, 21, 35];\n    const { container } = render(\n      <VictoryLabel\n        text={[\"lineHeight\", \"array\", \"testing\"]}\n        lineHeight={lineHeight}\n      />,\n      { wrapper: SVGWrapper },\n    );\n\n    const output = container.querySelectorAll(\"tspan\");\n    output.forEach((tspan, index) => {\n      /*\n      to calculate dy:\n      ((this.lineHeight[i] + (this.lineHeight[i - 1] || this.lineHeight[0])) / 2)\n      */\n      expect(parseInt(tspan.getAttribute(\"dy\")!)).toEqual(expectedDy[index]);\n    });\n  });\n\n  it(\"defaults lineHeight to 1 if an empty array is provided for lineHeight\", () => {\n    const expectedDy = [0, 14, 14, 14];\n    const { container } = render(\n      <VictoryLabel\n        text={[\"lineHeight\", \"empty\", \"array\", \"testing\"]}\n        lineHeight={[]}\n      />,\n      { wrapper: SVGWrapper },\n    );\n\n    const output = container.querySelectorAll(\"tspan\");\n    output.forEach((tspan, index) => {\n      expect(parseInt(tspan.getAttribute(\"dy\")!)).toEqual(expectedDy[index]);\n    });\n  });\n\n  it(\"defaults style to `defaultStyles` if an empty array is provided for `style`\", () => {\n    const { container } = render(\n      <VictoryLabel text={[\"style\", \"empty\", \"array\", \"testing\"]} style={[]} />,\n      { wrapper: SVGWrapper },\n    );\n\n    expect(\n      container.querySelector(\"tspan\")!.getAttribute(\"style\"),\n    ).toMatchInlineSnapshot(\n      `\"fill: #252525; font-size: 14px; font-family: 'Gill Sans', 'Gill Sans MT', 'Ser­avek', 'Trebuchet MS', sans-serif; stroke: transparent;\"`,\n    );\n  });\n\n  it(\"passes id if provided as a string\", () => {\n    const { container } = render(\n      <VictoryLabel text=\"Some VictoryLabel\" id=\"my-custom-id\" />,\n      { wrapper: SVGWrapper },\n    );\n\n    const output = container.querySelectorAll(\"text\");\n    output.forEach((text) => {\n      expect(text.getAttribute(\"id\")).toEqual(\"my-custom-id\");\n    });\n  });\n\n  it(\"passes id if provided as a number\", () => {\n    const { container } = render(\n      <VictoryLabel text=\"Some VictoryLabel\" id={12345} />,\n      { wrapper: SVGWrapper },\n    );\n\n    const output = container.querySelectorAll(\"text\");\n    output.forEach((text) => {\n      expect(text.getAttribute(\"id\")).toEqual(\"12345\");\n    });\n  });\n\n  it(\"runs function if id provided as a function\", () => {\n    const { container } = render(\n      <VictoryLabel\n        text=\"Some VictoryLabel\"\n        id={() => `created-in-function-${Math.random()}`}\n      />,\n      { wrapper: SVGWrapper },\n    );\n\n    const output = container.querySelectorAll(\"text\");\n    output.forEach((text) => {\n      expect(text.getAttribute(\"id\")).toMatch(/^created-in-function-[\\d\\.]+$/);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-core/src/victory-label/victory-label.tsx",
    "content": "/* eslint no-magic-numbers: [\"error\", { \"ignore\": [-0.5, 0.5, 0, 1, 2] }]*/\nimport React from \"react\";\nimport defaults from \"lodash/defaults\";\nimport isEmpty from \"lodash/isEmpty\";\n\nimport { VictoryPortal } from \"../victory-portal/victory-portal\";\nimport { Rect } from \"../victory-primitives/rect\";\nimport { Text } from \"../victory-primitives/text\";\nimport { TSpan } from \"../victory-primitives/tspan\";\nimport * as Helpers from \"../victory-util/helpers\";\nimport * as LabelHelpers from \"../victory-util/label-helpers\";\nimport * as Log from \"../victory-util/log\";\nimport * as Style from \"../victory-util/style\";\nimport * as TextSize from \"../victory-util/textsize\";\nimport * as UserProps from \"../victory-util/user-props\";\nimport {\n  NumberOrCallback,\n  StringOrCallback,\n  StringOrNumberOrCallback,\n} from \"../types/callbacks\";\nimport { ValueOrAccessor } from \"../types/prop-types\";\nimport {\n  PaddingProps,\n  VerticalAnchorType,\n  VictoryLabelStyleObject,\n} from \"../victory-theme/victory-theme\";\n\nexport type TextAnchorType = \"start\" | \"middle\" | \"end\" | \"inherit\";\nexport type OriginType = { x: number; y: number };\nexport type LabelOrientationType = \"parallel\" | \"perpendicular\" | \"vertical\";\n\nexport interface VictoryLabelProps {\n  angle?: StringOrNumberOrCallback;\n  ariaLabel?: StringOrCallback;\n  backgroundComponent?: React.ReactElement;\n  backgroundStyle?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n  backgroundPadding?: PaddingProps | PaddingProps[];\n  capHeight?: StringOrNumberOrCallback;\n  children?: StringOrNumberOrCallback;\n  className?: string;\n  datum?: Record<string, any>;\n  data?: any[];\n  desc?: string;\n  direction?: string;\n  disableInlineStyles?: boolean;\n  events?: React.DOMAttributes<any>;\n  groupComponent?: React.ReactElement;\n  id?: StringOrNumberOrCallback;\n  inline?: boolean;\n  labelPlacement?: LabelOrientationType;\n  lineHeight?: StringOrNumberOrCallback | (string | number)[];\n  origin?: OriginType;\n  polar?: boolean;\n  renderInPortal?: boolean;\n  style?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n  tabIndex?: NumberOrCallback;\n  text?: string[] | StringOrNumberOrCallback;\n  textComponent?: React.ReactElement;\n  textAnchor?: ValueOrAccessor<TextAnchorType>;\n  title?: string;\n  transform?: ValueOrAccessor<string | object>;\n  tspanComponent?: React.ReactElement;\n  verticalAnchor?: ValueOrAccessor<VerticalAnchorType>;\n  x?: number;\n  y?: number;\n  dx?: StringOrNumberOrCallback;\n  dy?: StringOrNumberOrCallback;\n}\n\nconst defaultStyles = {\n  fill: \"#252525\",\n  fontSize: 14,\n  fontFamily:\n    \"'Gill Sans', 'Gill Sans MT', 'Ser­avek', 'Trebuchet MS', sans-serif\",\n  stroke: \"transparent\",\n};\n\nconst getPosition = (props, dimension) => {\n  if (!props.datum) {\n    return 0;\n  }\n  const scaledPoint = Helpers.scalePoint(props, props.datum);\n  return scaledPoint[dimension];\n};\n\nconst getFontSize = (style) => {\n  const baseSize = style && style.fontSize;\n  if (typeof baseSize === \"number\") {\n    return baseSize;\n  } else if (baseSize === undefined || baseSize === null) {\n    return defaultStyles.fontSize;\n  } else if (typeof baseSize === \"string\") {\n    const fontSize = Number(baseSize.replace(\"px\", \"\"));\n    if (!isNaN(fontSize)) {\n      return fontSize;\n    }\n    Log.warn(\"fontSize should be expressed as a number of pixels\");\n    return defaultStyles.fontSize;\n  }\n  return defaultStyles.fontSize;\n};\n\nconst getSingleValue = <T,>(prop: T | T[], index = 0): T => {\n  return Array.isArray(prop) ? prop[index] || prop[0] : prop;\n};\n\nconst shouldUseMultilineBackgrounds = (props) => {\n  const { backgroundStyle, backgroundPadding } = props;\n  return (\n    (Array.isArray(backgroundStyle) && !isEmpty(backgroundStyle)) ||\n    (Array.isArray(backgroundPadding) && !isEmpty(backgroundPadding))\n  );\n};\n\nconst getStyles = (style, props) => {\n  if (props.disableInlineStyles) {\n    const baseStyles = Helpers.evaluateStyle(style, props);\n    return {\n      // Font size is necessary to calculate the y position of the label\n      fontSize: getFontSize(baseStyles),\n    };\n  }\n  const getSingleStyle = (s) => {\n    const baseStyles = Helpers.evaluateStyle(\n      s ? defaults({}, s, defaultStyles) : defaultStyles,\n      props,\n    );\n    return Object.assign({}, baseStyles, { fontSize: getFontSize(baseStyles) });\n  };\n\n  return Array.isArray(style) && !isEmpty(style)\n    ? style.map((s) => getSingleStyle(s))\n    : getSingleStyle(style);\n};\n\nconst getBackgroundStyles = (style, props) => {\n  if (!style) {\n    return undefined;\n  }\n  return Array.isArray(style) && !isEmpty(style)\n    ? style.map((s) => Helpers.evaluateStyle(s, props))\n    : Helpers.evaluateStyle(style, props);\n};\n\nconst getBackgroundPadding = (props) => {\n  if (props.backgroundPadding && Array.isArray(props.backgroundPadding)) {\n    return props.backgroundPadding.map((backgroundPadding) => {\n      const padding = Helpers.evaluateProp(backgroundPadding, props);\n      return Helpers.getPadding(padding);\n    });\n  }\n  const padding = Helpers.evaluateProp(props.backgroundPadding, props);\n  return Helpers.getPadding(padding);\n};\n\nconst getLineHeight = (props) => {\n  const lineHeight = Helpers.evaluateProp(props.lineHeight, props);\n  if (Array.isArray(lineHeight)) {\n    return isEmpty(lineHeight) ? [1] : lineHeight;\n  }\n  return lineHeight;\n};\n\nconst getContent = (text, props) => {\n  if (text === undefined || text === null) {\n    return undefined;\n  }\n  if (Array.isArray(text)) {\n    return text.map((line) => Helpers.evaluateProp(line, props));\n  }\n  const child = Helpers.evaluateProp(text, props);\n  if (child === undefined || child === null) {\n    return undefined;\n  }\n  return Array.isArray(child) ? child : `${child}`.split(\"\\n\");\n};\n\nconst getDy = (props, verticalAnchor, lineHeight) => {\n  const dy = props.dy ? Helpers.evaluateProp(props.dy, props) : 0;\n  const length = props.inline ? 1 : props.text.length;\n  const capHeight = Helpers.evaluateProp(props.capHeight, props);\n  const anchor = verticalAnchor\n    ? Helpers.evaluateProp(verticalAnchor, props)\n    : \"middle\";\n  const fontSizes = [...Array(length).keys()].map(\n    (i) => getSingleValue(props.style, i).fontSize,\n  );\n  const lineHeights = [...Array(length).keys()].map((i) =>\n    getSingleValue(lineHeight, i),\n  );\n\n  if (anchor === \"start\") {\n    return dy + (capHeight / 2 + lineHeights[0] / 2) * fontSizes[0];\n  } else if (props.inline) {\n    return anchor === \"end\"\n      ? dy + (capHeight / 2 - lineHeights[0] / 2) * fontSizes[0]\n      : dy + (capHeight / 2) * fontSizes[0];\n  } else if (length === 1) {\n    return anchor === \"end\"\n      ? dy + (capHeight / 2 + (0.5 - length) * lineHeights[0]) * fontSizes[0]\n      : dy +\n          (capHeight / 2 + (0.5 - length / 2) * lineHeights[0]) * fontSizes[0];\n  }\n  const allHeights = [...Array(length).keys()].reduce((memo, i) => {\n    return (\n      memo +\n      ((capHeight / 2 + (0.5 - length) * lineHeights[i]) * fontSizes[i]) /\n        length\n    );\n  }, 0);\n  return anchor === \"end\"\n    ? dy + allHeights\n    : dy +\n        allHeights / 2 +\n        (capHeight / 2) * lineHeights[length - 1] * fontSizes[length - 1];\n};\n\nconst getTransform = (props, x, y) => {\n  const { polar } = props;\n  const style = getSingleValue(props.style);\n  const defaultAngle = polar ? LabelHelpers.getPolarAngle(props) : 0;\n  const baseAngle =\n    style.angle === undefined\n      ? Helpers.evaluateProp(props.angle, props)\n      : style.angle;\n  const angle = baseAngle === undefined ? defaultAngle : baseAngle;\n  const transform = props.transform || style.transform;\n  const transformPart = transform && Helpers.evaluateProp(transform, props);\n  const rotatePart = angle && { rotate: [angle, x, y] };\n  return transformPart || angle\n    ? Style.toTransformString(transformPart, rotatePart)\n    : undefined;\n};\n\nconst getXCoordinate = (calculatedProps, labelSizeWidth) => {\n  const { direction, textAnchor, x, dx } = calculatedProps;\n  if (direction === \"rtl\") {\n    return x - labelSizeWidth;\n  }\n\n  switch (textAnchor) {\n    case \"middle\":\n      return Math.round(x - labelSizeWidth / 2);\n    case \"end\":\n      return Math.round(x - labelSizeWidth);\n    default:\n      // start\n      return x + (dx || 0);\n  }\n};\n\nconst getYCoordinate = (calculatedProps, textHeight) => {\n  const { verticalAnchor, y, originalDy = 0 } = calculatedProps;\n  const offset = y + originalDy;\n\n  switch (verticalAnchor) {\n    case \"start\":\n      return Math.floor(offset);\n    case \"end\":\n      return Math.ceil(offset - textHeight);\n    default:\n      // middle\n      return Math.floor(offset - textHeight / 2);\n  }\n};\n\nconst getFullBackground = (calculatedProps, tspanValues) => {\n  const {\n    dx = 0,\n    transform,\n    backgroundComponent,\n    backgroundStyle,\n    inline,\n    backgroundPadding,\n    capHeight,\n  } = calculatedProps;\n  const textSizes = tspanValues.map((tspan) => {\n    return tspan.textSize;\n  });\n\n  const height = inline\n    ? Math.max(...textSizes.map((size) => size.height))\n    : textSizes.reduce((memo, size, i) => {\n        const capHeightAdjustment = i ? 0 : capHeight / 2;\n        return (\n          memo + size.height * (tspanValues[i].lineHeight - capHeightAdjustment)\n        );\n      }, 0);\n\n  const width = inline\n    ? textSizes.reduce((memo, size, index) => {\n        const offset = index ? dx : 0;\n        return memo + size.width + offset;\n      }, 0)\n    : Math.max(...textSizes.map((size) => size.width));\n\n  const xCoordinate = getXCoordinate(calculatedProps, width);\n  const yCoordinate = getYCoordinate(calculatedProps, height);\n\n  const backgroundProps = {\n    key: \"background\",\n    height: height + backgroundPadding.top + backgroundPadding.bottom,\n    style: backgroundStyle,\n    transform,\n    width: width + backgroundPadding.left + backgroundPadding.right,\n    x: inline\n      ? xCoordinate - backgroundPadding.left\n      : xCoordinate + dx - backgroundPadding.left,\n    y: yCoordinate,\n  };\n\n  return React.cloneElement(\n    backgroundComponent,\n    defaults({}, backgroundComponent.props, backgroundProps),\n  );\n};\n\nconst getInlineXOffset = (calculatedProps, textElements, index) => {\n  const { textAnchor } = calculatedProps;\n  const widths = textElements.map((t) => t.widthWithPadding);\n  const totalWidth = widths.reduce((memo, width) => memo + width, 0);\n  const centerOffset = -totalWidth / 2;\n  switch (textAnchor) {\n    case \"start\":\n      return widths.reduce(\n        (memo, width, i) => (i < index ? memo + width : memo),\n        0,\n      );\n    case \"end\":\n      return widths.reduce(\n        (memo, width, i) => (i > index ? memo - width : memo),\n        0,\n      );\n    default:\n      // middle\n      return widths.reduce((memo, width, i) => {\n        const offsetWidth = i < index ? width : 0;\n        return i === index ? memo + width / 2 : memo + offsetWidth;\n      }, centerOffset);\n  }\n};\n\nconst getChildBackgrounds = (calculatedProps, tspanValues) => {\n  const {\n    dy,\n    dx,\n    transform,\n    backgroundStyle,\n    backgroundPadding,\n    backgroundComponent,\n    inline,\n    y,\n  } = calculatedProps;\n\n  const textElements = tspanValues.map((current, i) => {\n    const previous = getSingleValue(tspanValues, i - 1);\n    const labelSize = current.textSize;\n    const totalLineHeight = current.fontSize * current.lineHeight;\n    const textHeight = Math.ceil(totalLineHeight);\n    const padding = getSingleValue(backgroundPadding, i);\n    const prevPadding = getSingleValue(backgroundPadding, i - 1);\n    const xOffset = inline ? dx || 0 : 0;\n\n    const childDy =\n      i && !inline\n        ? previous.fontSize * previous.lineHeight +\n          prevPadding.top +\n          prevPadding.bottom\n        : dy - totalLineHeight * 0.5 - (current.fontSize - current.capHeight);\n\n    return {\n      textHeight,\n      labelSize,\n      heightWithPadding: textHeight + padding.top + padding.bottom,\n      widthWithPadding:\n        labelSize.width + padding.left + padding.right + xOffset,\n      y,\n      fontSize: current.fontSize,\n      dy: childDy,\n    };\n  });\n\n  return textElements.map((textElement, i) => {\n    const xCoordinate = getXCoordinate(\n      calculatedProps,\n      textElement.labelSize.width,\n    );\n    const yCoordinate = textElements.slice(0, i + 1).reduce((prev, curr) => {\n      return prev + curr.dy;\n    }, y);\n    const padding = getSingleValue(backgroundPadding, i);\n    const height = textElement.heightWithPadding;\n    const xCoord = inline\n      ? getInlineXOffset(calculatedProps, textElements, i) +\n        xCoordinate -\n        padding.left\n      : xCoordinate;\n    const yCoord = inline\n      ? getYCoordinate(calculatedProps, height) - padding.top\n      : yCoordinate;\n    const backgroundProps = {\n      key: `tspan-background-${i}`,\n      height,\n      style: getSingleValue(backgroundStyle, i),\n      width: textElement.widthWithPadding,\n      transform,\n      x: xCoord - padding.left,\n      y: yCoord,\n    };\n\n    return React.cloneElement(\n      backgroundComponent,\n      defaults({}, backgroundComponent.props, backgroundProps),\n    );\n  });\n};\n\nconst getBackgroundElement = (calculatedProps, tspanValues) => {\n  return shouldUseMultilineBackgrounds(calculatedProps)\n    ? getChildBackgrounds(calculatedProps, tspanValues)\n    : getFullBackground(calculatedProps, tspanValues);\n};\n\nconst calculateSpanDy = (tspanValues, i, calculatedProps) => {\n  const current = getSingleValue(tspanValues, i);\n  const previous = getSingleValue(tspanValues, i - 1);\n  const previousHeight = previous.fontSize * previous.lineHeight;\n  const currentHeight = current.fontSize * current.lineHeight;\n  const previousCaps = previous.fontSize - previous.capHeight;\n  const currentCaps = current.fontSize - current.capHeight;\n\n  const textHeight =\n    previousHeight -\n    previous.fontSize / 2 +\n    current.fontSize / 2 -\n    previousHeight / 2 +\n    currentHeight / 2 -\n    currentCaps / 2 +\n    previousCaps / 2;\n\n  return shouldUseMultilineBackgrounds(calculatedProps)\n    ? textHeight +\n        current.backgroundPadding.top +\n        previous.backgroundPadding.bottom\n    : textHeight;\n};\n\nconst getTSpanDy = (tspanValues, calculatedProps, i) => {\n  const { inline } = calculatedProps;\n  const current = getSingleValue(tspanValues, i);\n\n  if (i && !inline) {\n    return calculateSpanDy(tspanValues, i, calculatedProps);\n  } else if (inline) {\n    return i === 0 ? current.backgroundPadding.top : undefined;\n  }\n  return current.backgroundPadding.top;\n};\n\nconst evaluateProps = (props) => {\n  /* Potential evaluated props are\n    1) text\n    2) style\n    3) everything else\n  */\n  const text = getContent(props.text, props);\n  const style = getStyles(props.style, Object.assign({}, props, { text }));\n  const backgroundStyle = getBackgroundStyles(\n    props.backgroundStyle,\n    Object.assign({}, props, { text, style }),\n  );\n  const backgroundPadding = getBackgroundPadding(\n    Object.assign({}, props, { text, style, backgroundStyle }),\n  );\n  const id = Helpers.evaluateProp(props.id, props);\n  return Object.assign({}, props, {\n    backgroundStyle,\n    backgroundPadding,\n    style,\n    text,\n    id,\n  });\n};\n\nconst getCalculatedProps = <T extends VictoryLabelProps>(props: T) => {\n  const ariaLabel = Helpers.evaluateProp(props.ariaLabel, props);\n  const style = getSingleValue(props.style!);\n  const lineHeight = getLineHeight(props);\n  const direction = props.direction\n    ? Helpers.evaluateProp(props.direction, props)\n    : \"inherit\";\n  const textAnchor = props.textAnchor\n    ? Helpers.evaluateProp(props.textAnchor, props)\n    : style.textAnchor || \"start\";\n  const verticalAnchor = props.verticalAnchor\n    ? Helpers.evaluateProp(props.verticalAnchor, props)\n    : style.verticalAnchor || \"middle\";\n  const dx = props.dx ? Helpers.evaluateProp(props.dx, props) : 0;\n  const dy = getDy(props, verticalAnchor, lineHeight);\n  const x = props.x !== undefined ? props.x : getPosition(props, \"x\");\n  const y = props.y !== undefined ? props.y : getPosition(props, \"y\");\n  const transform = getTransform(props, x, y);\n\n  return Object.assign({}, props, {\n    ariaLabel,\n    lineHeight,\n    direction,\n    textAnchor,\n    verticalAnchor,\n    dx,\n    dy,\n    originalDy: Helpers.evaluateProp(props.dy, props),\n    transform,\n    x,\n    y,\n  });\n};\n\nconst renderLabel = (calculatedProps, tspanValues) => {\n  const {\n    ariaLabel,\n    inline,\n    className,\n    title,\n    events,\n    direction,\n    text,\n    textAnchor,\n    dx,\n    dy,\n    transform,\n    x,\n    y,\n    desc,\n    id,\n    tabIndex,\n    tspanComponent,\n    textComponent,\n  } = calculatedProps;\n  const userProps = UserProps.getSafeUserProps(calculatedProps);\n\n  const textProps = {\n    \"aria-label\": ariaLabel,\n    key: \"text\",\n    ...events,\n    direction,\n    dx,\n    x,\n    y: y + dy,\n    transform,\n    className,\n    title,\n    desc: Helpers.evaluateProp(desc, calculatedProps),\n    tabIndex: Helpers.evaluateProp(tabIndex, calculatedProps),\n    id,\n    ...userProps,\n  };\n\n  const tspans = text.map((line, i) => {\n    const currentStyle = tspanValues[i].style;\n    const tspanProps = {\n      key: `${id}-key-${i}`,\n      x: !inline ? x : undefined,\n      dx: inline ? dx + tspanValues[i].backgroundPadding.left : dx,\n      dy: getTSpanDy(tspanValues, calculatedProps, i),\n      textAnchor: currentStyle.textAnchor || textAnchor,\n      style: currentStyle,\n      children: line,\n    };\n    return React.cloneElement(tspanComponent, tspanProps);\n  });\n\n  return React.cloneElement(textComponent, textProps, tspans);\n};\n\nconst defaultProps = {\n  backgroundComponent: <Rect />,\n  groupComponent: <g />,\n  direction: \"inherit\",\n  textComponent: <Text />,\n  tspanComponent: <TSpan />,\n  capHeight: 0.71, // Magic number from d3.\n  lineHeight: 1,\n};\nexport const VictoryLabel: {\n  role: string;\n  defaultStyles: typeof defaultStyles;\n} & React.FC<VictoryLabelProps> = (initialProps) => {\n  const props = evaluateProps(defaults({}, initialProps, defaultProps));\n\n  if (props.text === null || props.text === undefined) {\n    return null;\n  }\n  const calculatedProps = getCalculatedProps(props);\n\n  const { text, style, capHeight, backgroundPadding, lineHeight } =\n    calculatedProps;\n\n  const tspanValues = (text as string[]).map((line, i) => {\n    const currentStyle = getSingleValue(style, i);\n    const capHeightPx = TextSize.convertLengthToPixels(\n      `${capHeight}em`,\n      currentStyle.fontSize as number,\n    );\n    const currentLineHeight = getSingleValue(lineHeight, i);\n    return {\n      style: currentStyle,\n      fontSize: currentStyle.fontSize || defaultStyles.fontSize,\n      capHeight: capHeightPx,\n      text: line,\n      // TODO: This looks like a bug:\n      textSize: TextSize.approximateTextSize(line, currentStyle),\n      lineHeight: currentLineHeight,\n      backgroundPadding: getSingleValue(backgroundPadding, i),\n    };\n  });\n\n  const label = renderLabel(calculatedProps, tspanValues);\n\n  if (props.backgroundStyle) {\n    const backgroundElement = getBackgroundElement(\n      calculatedProps,\n      tspanValues,\n    );\n    const children = [backgroundElement, label];\n    const backgroundWithLabel = React.cloneElement(\n      props.groupComponent!,\n      {},\n      children,\n    );\n\n    return props.renderInPortal ? (\n      <VictoryPortal>{backgroundWithLabel}</VictoryPortal>\n    ) : (\n      backgroundWithLabel\n    );\n  }\n\n  return props.renderInPortal ? <VictoryPortal>{label}</VictoryPortal> : label;\n};\n\nVictoryLabel.displayName = \"VictoryLabel\";\nVictoryLabel.role = \"label\";\nVictoryLabel.defaultStyles = defaultStyles;\n"
  },
  {
    "path": "packages/victory-core/src/victory-portal/portal-context.tsx",
    "content": "import React from \"react\";\n\nexport interface PortalContextValue {\n  addChild: (id: string, node: React.ReactElement) => void;\n  removeChild: (id: string) => void;\n  children: Map<string, React.ReactElement>;\n}\n\nexport const PortalContext = React.createContext<\n  PortalContextValue | undefined\n>(undefined);\nPortalContext.displayName = \"PortalContext\";\n\nexport const usePortalContext = () => {\n  const context = React.useContext(PortalContext);\n  return context;\n};\n\nexport interface PortalProviderProps {\n  children?: React.ReactNode;\n}\n\nexport const PortalProvider = ({ children }: PortalProviderProps) => {\n  const [portalChildren, setPortalChildren] = React.useState<\n    Map<string, React.ReactElement>\n  >(new Map());\n  const addChild = React.useCallback(\n    (id: string, element: React.ReactElement) => {\n      setPortalChildren((prevChildren) => {\n        const nextChildren = new Map(prevChildren);\n        nextChildren.set(id, element);\n        return nextChildren;\n      });\n    },\n    [setPortalChildren],\n  );\n\n  const removeChild = React.useCallback(\n    (id: string) => {\n      setPortalChildren((prevChildren) => {\n        const nextChildren = new Map(prevChildren);\n        nextChildren.delete(id);\n        return nextChildren;\n      });\n    },\n    [setPortalChildren],\n  );\n\n  const contextValue: PortalContextValue = React.useMemo(\n    () => ({\n      addChild,\n      removeChild,\n      children: portalChildren,\n    }),\n    [addChild, removeChild, portalChildren],\n  );\n\n  return (\n    <PortalContext.Provider value={contextValue}>\n      {children}\n    </PortalContext.Provider>\n  );\n};\n"
  },
  {
    "path": "packages/victory-core/src/victory-portal/portal-outlet.tsx",
    "content": "import React from \"react\";\nimport { usePortalContext } from \"./portal-context\";\n\nexport interface PortalOutletProps {\n  as: React.ReactElement;\n  width?: number;\n  height?: number;\n  viewBox?: string;\n  preserveAspectRatio?: string;\n  style?: React.CSSProperties;\n  children?: (children: React.ReactElement[]) => React.ReactNode | undefined;\n}\n\nexport const PortalOutlet = ({\n  as: portalComponent,\n  ...props\n}: PortalOutletProps) => {\n  const portalContext = usePortalContext();\n\n  if (!portalContext) {\n    return null;\n  }\n\n  const children = Array.from(portalContext.children.values());\n  return React.cloneElement(portalComponent, props, children);\n};\n"
  },
  {
    "path": "packages/victory-core/src/victory-portal/portal.tsx",
    "content": "import React from \"react\";\n\nexport interface PortalProps {\n  className?: string;\n  height?: number;\n  style?: React.CSSProperties;\n  viewBox?: string;\n  width?: number;\n}\n\nexport const Portal = React.forwardRef<SVGSVGElement, PortalProps>(\n  (props, ref) => {\n    return <svg ref={ref} {...props} />;\n  },\n);\n"
  },
  {
    "path": "packages/victory-core/src/victory-portal/victory-portal.tsx",
    "content": "import React, { useState } from \"react\";\nimport defaults from \"lodash/defaults\";\nimport uniqueId from \"lodash/uniqueId\";\n\nimport * as Log from \"../victory-util/log\";\nimport * as Helpers from \"../victory-util/helpers\";\nimport { usePortalContext } from \"./portal-context\";\n\nexport interface VictoryPortalProps {\n  children: React.ReactElement;\n  groupComponent?: React.ReactElement;\n}\n\nconst defaultProps: Partial<VictoryPortalProps> = {\n  groupComponent: <g />,\n};\n\nexport const VictoryPortal = (initialProps: VictoryPortalProps) => {\n  const props = { ...defaultProps, ...initialProps };\n  const [id] = useState(uniqueId());\n  const portalContext = usePortalContext();\n\n  if (!portalContext) {\n    const msg =\n      \"`renderInPortal` is not supported outside of `VictoryContainer`. \" +\n      \"Component will be rendered in place\";\n    Log.warn(msg);\n  }\n\n  const children = Array.isArray(props.children)\n    ? props.children[0]\n    : props.children;\n  const { groupComponent } = props;\n  const childProps = (children && children.props) || {};\n  const standardProps = childProps.groupComponent\n    ? { groupComponent, standalone: false }\n    : {};\n  const newProps = defaults(\n    standardProps,\n    childProps,\n    Helpers.omit(props, [\"children\", \"groupComponent\"]),\n    { key: childProps.key ?? id },\n  );\n  const child = children && React.cloneElement(children, newProps);\n\n  React.useEffect(() => {\n    portalContext?.addChild(id, child);\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [props.children]);\n\n  React.useEffect(() => {\n    return () => portalContext?.removeChild(id);\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  return portalContext ? null : child;\n};\n\nVictoryPortal.role = \"portal\";\n"
  },
  {
    "path": "packages/victory-core/src/victory-primitives/arc.tsx",
    "content": "/* eslint no-magic-numbers: [\"error\", { \"ignore\": [0, 1, 2, 180] }]*/\nimport React from \"react\";\nimport defaults from \"lodash/defaults\";\n\nimport * as Helpers from \"../victory-util/helpers\";\nimport { VictoryCommonPrimitiveProps } from \"../victory-util/common-props\";\nimport { Path } from \"./path\";\n\nexport interface ArcProps extends VictoryCommonPrimitiveProps {\n  closedPath?: boolean;\n  cx?: number;\n  cy?: number;\n  datum?: any;\n  endAngle?: number;\n  pathComponent?: React.ReactElement;\n  r?: number;\n  startAngle?: number;\n  type?: string;\n}\n\nconst getArcPath = (props) => {\n  const { cx, cy, r, startAngle, endAngle, closedPath } = props;\n  // Always draw the path as two arcs so that complete circles may be rendered.\n  const halfAngle = Math.abs(endAngle - startAngle) / 2 + startAngle;\n  const x1 = cx + r * Math.cos(Helpers.degreesToRadians(startAngle));\n  const y1 = cy - r * Math.sin(Helpers.degreesToRadians(startAngle));\n  const x2 = cx + r * Math.cos(Helpers.degreesToRadians(halfAngle));\n  const y2 = cy - r * Math.sin(Helpers.degreesToRadians(halfAngle));\n  const x3 = cx + r * Math.cos(Helpers.degreesToRadians(endAngle));\n  const y3 = cy - r * Math.sin(Helpers.degreesToRadians(endAngle));\n  const largerArcFlag1 = halfAngle - startAngle <= 180 ? 0 : 1;\n  const largerArcFlag2 = endAngle - halfAngle <= 180 ? 0 : 1;\n  const arcStart = closedPath\n    ? ` M ${cx}, ${cy} L ${x1}, ${y1}`\n    : `M ${x1}, ${y1}`;\n  const arc1 = `A ${r}, ${r}, 0, ${largerArcFlag1}, 0, ${x2}, ${y2}`;\n  const arc2 = `A ${r}, ${r}, 0, ${largerArcFlag2}, 0, ${x3}, ${y3}`;\n  const arcEnd = closedPath ? \"Z\" : \"\";\n  return `${arcStart} ${arc1} ${arc2} ${arcEnd}`;\n};\n\nconst evaluateProps = (props) => {\n  /**\n   * Potential evaluated props are:\n   * `ariaLabel`\n   * `desc`\n   * `id`\n   * `style`\n   * `tabIndex`\n   */\n  const ariaLabel = Helpers.evaluateProp(props.ariaLabel, props);\n  const desc = Helpers.evaluateProp(props.desc, props);\n  const id = Helpers.evaluateProp(props.id, props);\n  const style = Helpers.evaluateStyle(\n    Object.assign({ stroke: \"black\", fill: \"none\" }, props.style),\n    props,\n  );\n  const tabIndex = Helpers.evaluateProp(props.tabIndex, props);\n\n  return Object.assign({}, props, { ariaLabel, desc, id, style, tabIndex });\n};\n\nconst defaultProps = {\n  pathComponent: <Path />,\n  role: \"presentation\",\n  shapeRendering: \"auto\",\n};\n\nexport const Arc = (initialProps: ArcProps) => {\n  const props = evaluateProps(defaults({}, initialProps, defaultProps));\n\n  return React.cloneElement(props.pathComponent!, {\n    ...props.events,\n    \"aria-label\": props.ariaLabel,\n    d: getArcPath(props),\n    style: props.style,\n    desc: props.desc,\n    tabIndex: props.tabIndex,\n    className: props.className,\n    role: props.role,\n    shapeRendering: props.shapeRendering,\n    transform: props.transform,\n    clipPath: props.clipPath,\n  });\n};\n"
  },
  {
    "path": "packages/victory-core/src/victory-primitives/background.tsx",
    "content": "import React from \"react\";\nimport defaults from \"lodash/defaults\";\n\nimport * as Helpers from \"../victory-util/helpers\";\nimport { VictoryCommonPrimitiveProps } from \"../victory-util/common-props\";\nimport { Rect } from \"./rect\";\nimport { Circle } from \"./circle\";\n\nexport interface BackgroundProps extends VictoryCommonPrimitiveProps {\n  circleComponent?: React.ReactElement;\n  height?: number;\n  rectComponent?: React.ReactElement;\n  rx?: number;\n  ry?: number;\n  width?: number;\n  x?: number;\n  y?: number;\n}\n\nconst evaluateProps = (props) => {\n  /**\n   * Potential evaluated prop is:\n   * `id`\n   */\n  const id = Helpers.evaluateProp(props.id, props);\n\n  return Object.assign({}, props, { id });\n};\n\nconst defaultProps = {\n  circleComponent: <Circle />,\n  rectComponent: <Rect />,\n  role: \"presentation\",\n  shapeRendering: \"auto\",\n};\n\nexport const Background = (initialProps: BackgroundProps) => {\n  const props = evaluateProps(defaults({}, initialProps, defaultProps));\n\n  return props.polar\n    ? React.cloneElement(props.circleComponent!, {\n        ...props.events,\n        style: props.style,\n        role: props.role,\n        shapeRendering: props.shapeRendering,\n        cx: props.x,\n        cy: props.y,\n        r: props.height,\n        className: props.className,\n      })\n    : React.cloneElement(props.rectComponent!, {\n        ...props.events,\n        style: props.style,\n        role: props.role,\n        shapeRendering: props.shapeRendering,\n        x: props.x,\n        y: props.y,\n        rx: props.rx,\n        ry: props.ry,\n        width: props.width,\n        height: props.height,\n        className: props.className,\n      });\n};\n"
  },
  {
    "path": "packages/victory-core/src/victory-primitives/border.tsx",
    "content": "import React from \"react\";\nimport defaults from \"lodash/defaults\";\n\nimport * as Helpers from \"../victory-util/helpers\";\nimport { VictoryCommonPrimitiveProps } from \"../victory-util/common-props\";\nimport { Rect } from \"./rect\";\n\nexport interface BorderProps extends VictoryCommonPrimitiveProps {\n  width?: number;\n  height?: number;\n  rectComponent?: React.ReactElement;\n  x?: number;\n  y?: number;\n}\n\nconst evaluateProps = (props) => {\n  /**\n   * Potential evaluated props are:\n   * `ariaLabel`\n   * `desc`\n   * `id`\n   * `style`\n   * `tabIndex`\n   */\n  const ariaLabel = Helpers.evaluateProp(props.ariaLabel, props);\n  const desc = Helpers.evaluateProp(props.desc, props);\n  const id = Helpers.evaluateProp(props.id, props);\n  const style = Helpers.evaluateStyle(\n    Object.assign({ fill: \"none\" }, props.style),\n    props,\n  );\n  const tabIndex = Helpers.evaluateProp(props.tabIndex, props);\n\n  return Object.assign({}, props, { ariaLabel, desc, id, style, tabIndex });\n};\n\nconst defaultProps = {\n  rectComponent: <Rect />,\n  role: \"presentation\",\n  shapeRendering: \"auto\",\n};\n\nexport const Border = (initialProps: BorderProps) => {\n  const props = evaluateProps(defaults({}, initialProps, defaultProps));\n\n  return React.cloneElement(props.rectComponent!, {\n    ...props.events,\n    \"aria-label\": props.ariaLabel,\n    style: props.style,\n    desc: props.desc,\n    tabIndex: props.tabIndex,\n    transform: props.transform,\n    className: props.className,\n    role: props.role,\n    shapeRendering: props.shapeRendering,\n    x: props.x,\n    y: props.y,\n    width: props.width,\n    height: props.height,\n    clipPath: props.clipPath,\n  });\n};\n"
  },
  {
    "path": "packages/victory-core/src/victory-primitives/circle.tsx",
    "content": "import React, { forwardRef } from \"react\";\nimport { evaluateProp } from \"../victory-util/helpers\";\nimport { VictoryPrimitiveShapeProps } from \"./types\";\n\nexport const Circle = forwardRef<SVGCircleElement, VictoryPrimitiveShapeProps>(\n  (props, ref) => {\n    /* eslint-disable-next-line @typescript-eslint/no-unused-vars --\n     * origin conflicts with the SVG element's origin attribute\n     */\n    const { desc, id, tabIndex, origin, ...rest } = props;\n\n    const svgProps: React.SVGProps<SVGCircleElement> = {\n      vectorEffect: \"non-scaling-stroke\",\n      id: evaluateProp(id, props)?.toString(),\n      tabIndex: evaluateProp(tabIndex, props),\n      ...rest,\n    };\n    return desc ? (\n      <circle {...svgProps} ref={ref}>\n        <desc>{desc}</desc>\n      </circle>\n    ) : (\n      <circle {...svgProps} ref={ref} />\n    );\n  },\n);\n"
  },
  {
    "path": "packages/victory-core/src/victory-primitives/clip-path.test.tsx",
    "content": "import { render } from \"@testing-library/react\";\nimport React from \"react\";\n\nimport { SVGWrapper } from \"../../../../test/helpers\";\nimport { ClipPath } from \"./clip-path\";\n\ndescribe(\"victory-primitives/clip-path\", () => {\n  const baseProps = {\n    clipId: 4,\n    clipPadding: {\n      top: 2,\n      bottom: 2,\n      left: 2,\n      right: 2,\n    },\n    clipHeight: 30,\n    clipWidth: 20,\n    translateX: 3,\n    translateY: 8,\n  };\n\n  it(\"should render a children\", () => {\n    const { container } = render(\n      <ClipPath {...baseProps}>\n        <rect data-testid=\"rect\" />\n      </ClipPath>,\n      { wrapper: SVGWrapper },\n    );\n\n    expect(container.querySelector(\"clipPath\")).toMatchInlineSnapshot(`\n      <clippath\n        id=\"4\"\n      >\n        <rect\n          data-testid=\"rect\"\n        />\n      </clippath>\n    `);\n  });\n\n  it(\"should render a clipPath with the passed id\", () => {\n    const { container } = render(<ClipPath {...baseProps} />, {\n      wrapper: SVGWrapper,\n    });\n\n    expect(container.querySelector(\"clipPath\")).toMatchInlineSnapshot(`\n      <clippath\n        id=\"4\"\n      />\n    `);\n  });\n});\n"
  },
  {
    "path": "packages/victory-core/src/victory-primitives/clip-path.tsx",
    "content": "import React from \"react\";\nimport { VictoryCommonPrimitiveProps } from \"../victory-util/common-props\";\n\nexport interface ClipPathProps extends VictoryCommonPrimitiveProps {\n  children?: React.ReactNode[] | React.ReactNode;\n  clipId?: number | string;\n}\n\nexport const ClipPath = (props: ClipPathProps) => (\n  <defs>\n    {<clipPath id={props.clipId?.toString()}>{props.children}</clipPath>}\n  </defs>\n);\n"
  },
  {
    "path": "packages/victory-core/src/victory-primitives/index.ts",
    "content": "export * from \"./arc\";\nexport * from \"./background\";\nexport * from \"./border\";\nexport * from \"./circle\";\nexport * from \"./clip-path\";\nexport * from \"./line\";\nexport * from \"./line-segment\";\nexport * from \"./path\";\nexport * from \"./point\";\nexport * from \"./rect\";\nexport * from \"./text\";\nexport * from \"./tspan\";\nexport * from \"./types\";\nexport * from \"./whisker\";\n"
  },
  {
    "path": "packages/victory-core/src/victory-primitives/line-segment.tsx",
    "content": "import React from \"react\";\nimport defaults from \"lodash/defaults\";\n\nimport * as Helpers from \"../victory-util/helpers\";\nimport { VictoryCommonPrimitiveProps } from \"../victory-util/common-props\";\nimport { Line } from \"./line\";\n\nexport interface LineSegmentProps extends VictoryCommonPrimitiveProps {\n  datum?: any;\n  lineComponent?: React.ReactElement;\n  x1?: number;\n  x2?: number;\n  y1?: number;\n  y2?: number;\n}\n\nconst evaluateProps = (props) => {\n  /**\n   * Potential evaluated props are:\n   * `ariaLabel`\n   * `desc`\n   * `id`\n   * `style`\n   * `tabIndex`\n   */\n  const ariaLabel = Helpers.evaluateProp(props.ariaLabel, props);\n  const desc = Helpers.evaluateProp(props.desc, props);\n  const id = Helpers.evaluateProp(props.id, props);\n  const style = Helpers.evaluateStyle(\n    Object.assign({ stroke: \"black\" }, props.style),\n    props,\n  );\n  const tabIndex = Helpers.evaluateProp(props.tabIndex, props);\n\n  return Object.assign({}, props, { ariaLabel, desc, id, style, tabIndex });\n};\n\nconst defaultProps = {\n  lineComponent: <Line />,\n  role: \"presentation\",\n  shapeRendering: \"auto\",\n};\n\nexport const LineSegment = (initialProps: LineSegmentProps) => {\n  const props = evaluateProps(defaults({}, initialProps, defaultProps));\n\n  return React.cloneElement(props.lineComponent!, {\n    ...props.events,\n    \"aria-label\": props.ariaLabel,\n    style: props.style,\n    desc: props.desc,\n    tabIndex: props.tabIndex,\n    className: props.className,\n    role: props.role,\n    shapeRendering: props.shapeRendering,\n    x1: props.x1,\n    x2: props.x2,\n    y1: props.y1,\n    y2: props.y2,\n    transform: props.transform,\n    clipPath: props.clipPath,\n  });\n};\n"
  },
  {
    "path": "packages/victory-core/src/victory-primitives/line.test.tsx",
    "content": "import React from \"react\";\nimport { render } from \"@testing-library/react\";\n\nimport { Line } from \"./line\";\n\ndescribe(\"victory-primitives/line\", () => {\n  const baseProps = {\n    x1: 0,\n    y1: 1,\n    x2: 2,\n    y2: 4,\n  };\n\n  it(\"should render a line element with the correct coordinates\", () => {\n    // @ts-expect-error \"baseProps has no properties in common with VictoryPrimitiveShapeProps\"\n    const { container } = render(<Line {...baseProps} />, { wrapper: \"svg\" });\n    expect(container.querySelector(\"line\")).toMatchInlineSnapshot(`\n      <line\n        vector-effect=\"non-scaling-stroke\"\n        x1=\"0\"\n        x2=\"2\"\n        y1=\"1\"\n        y2=\"4\"\n      />\n    `);\n  });\n});\n"
  },
  {
    "path": "packages/victory-core/src/victory-primitives/line.tsx",
    "content": "import React, { forwardRef } from \"react\";\nimport { evaluateProp } from \"../victory-util/helpers\";\nimport { VictoryPrimitiveShapeProps } from \"./types\";\n\nexport const Line = forwardRef<SVGLineElement, VictoryPrimitiveShapeProps>(\n  (props, ref) => {\n    /* eslint-disable-next-line @typescript-eslint/no-unused-vars --\n     * origin conflicts with the SVG element's origin attribute\n     */\n    const { desc, id, tabIndex, origin, ...rest } = props;\n\n    const svgProps: React.SVGProps<SVGLineElement> = {\n      vectorEffect: \"non-scaling-stroke\",\n      id: evaluateProp(id, props)?.toString(),\n      tabIndex: evaluateProp(tabIndex, props),\n      ...rest,\n    };\n\n    return desc ? (\n      <line {...svgProps} ref={ref}>\n        <desc>{desc}</desc>\n      </line>\n    ) : (\n      <line {...svgProps} ref={ref} />\n    );\n  },\n);\n"
  },
  {
    "path": "packages/victory-core/src/victory-primitives/path.tsx",
    "content": "import React, { forwardRef } from \"react\";\nimport { evaluateProp } from \"../victory-util/helpers\";\nimport { VictoryPrimitiveShapeProps } from \"./types\";\n\nexport const Path = forwardRef<SVGPathElement, VictoryPrimitiveShapeProps>(\n  (props, ref) => {\n    /* eslint-disable-next-line @typescript-eslint/no-unused-vars --\n     * origin conflicts with the SVG element's origin attribute\n     */\n    const { desc, id, tabIndex, origin, ...rest } = props;\n\n    const svgProps: React.SVGProps<SVGPathElement> = {\n      id: evaluateProp(id, props)?.toString(),\n      tabIndex: evaluateProp(tabIndex, props),\n      ...rest,\n    };\n\n    return desc ? (\n      <path {...svgProps} ref={ref}>\n        <desc>{desc}</desc>\n      </path>\n    ) : (\n      <path {...svgProps} ref={ref} />\n    );\n  },\n);\n"
  },
  {
    "path": "packages/victory-core/src/victory-primitives/point.test.tsx",
    "content": "import { render } from \"@testing-library/react\";\nimport React from \"react\";\n\nimport { SVGWrapper } from \"../../../../test/helpers\";\nimport { PointPathHelpers } from \"../victory-util\";\nimport { Point } from \"./point\";\n\ndescribe(\"victory-primitives/point\", () => {\n  const baseProps = {\n    x: 5,\n    y: 10,\n    size: 1,\n  };\n\n  (\n    [\n      \"circle\",\n      \"square\",\n      \"diamond\",\n      \"triangleDown\",\n      \"triangleUp\",\n      \"plus\",\n      \"minus\",\n      \"star\",\n      \"cross\",\n    ] as const\n  ).forEach((symbol) => {\n    it(`should render the appropriate symbol for \"${symbol}\"`, () => {\n      const stub = jest\n        .spyOn(PointPathHelpers, symbol)\n\n        .mockImplementation(() => `${symbol} symbol`);\n      const props = Object.assign({}, baseProps, { symbol });\n      const { container } = render(<Point {...props} />, {\n        wrapper: SVGWrapper,\n      });\n      const directions = container.querySelector(\"path\")!.getAttribute(\"d\");\n\n      expect(stub).toHaveBeenCalledTimes(1);\n      expect(stub).toHaveBeenCalledWith(5, 10, 1);\n      expect(directions).toEqual(`${symbol} symbol`);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-core/src/victory-primitives/point.tsx",
    "content": "import React from \"react\";\nimport defaults from \"lodash/defaults\";\n\nimport * as Helpers from \"../victory-util/helpers\";\nimport * as pathHelpers from \"../victory-util/point-path-helpers\";\nimport { VictoryCommonPrimitiveProps } from \"../victory-util/common-props\";\nimport * as UserProps from \"../victory-util/user-props\";\nimport { Path } from \"./path\";\nimport { ScatterSymbolType } from \"./types\";\n\nexport interface PointProps extends VictoryCommonPrimitiveProps {\n  datum?: any;\n  getPath?: (x: number, y: number, size: number) => string;\n  pathComponent?: React.ReactElement;\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n  size?: number | Function;\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n  symbol?: ScatterSymbolType | Function;\n  x?: number;\n  y?: number;\n}\n\nconst getPath = (props) => {\n  const { x, y, size, symbol } = props;\n  if (props.getPath) {\n    return props.getPath(x, y, size);\n  }\n  const pathFunctions = pathHelpers;\n  const symbolFunction =\n    typeof pathFunctions[symbol] === \"function\"\n      ? pathFunctions[symbol]\n      : pathFunctions.circle;\n  return symbolFunction(x, y, size);\n};\n\nconst evaluateProps = (props) => {\n  /**\n   * Potential evaluated props are:\n   * `ariaLabel`\n   * `desc`\n   * `id`\n   * `size`\n   * `style`\n   * `symbol`\n   * `tabIndex`\n   */\n  const ariaLabel = Helpers.evaluateProp(props.ariaLabel, props);\n  const desc = Helpers.evaluateProp(props.desc, props);\n  const id = Helpers.evaluateProp(props.id, props);\n  const size = Helpers.evaluateProp(props.size, props);\n  const style = Helpers.evaluateStyle(props.style, props);\n  const symbol = Helpers.evaluateProp(props.symbol, props);\n  const tabIndex = Helpers.evaluateProp(props.tabIndex, props);\n\n  return Object.assign({}, props, {\n    ariaLabel,\n    desc,\n    id,\n    size,\n    style,\n    symbol,\n    tabIndex,\n  });\n};\n\nconst defaultProps = {\n  pathComponent: <Path />,\n  role: \"presentation\",\n  shapeRendering: \"auto\",\n};\n\nexport const Point = (initialProps: PointProps) => {\n  const props = evaluateProps(defaults({}, initialProps, defaultProps));\n  const userProps = UserProps.getSafeUserProps(props);\n\n  return React.cloneElement(props.pathComponent!, {\n    ...props.events,\n    \"aria-label\": props.ariaLabel,\n    d: getPath(props),\n    style: props.style,\n    desc: props.desc,\n    tabIndex: props.tabIndex,\n    role: props.role,\n    shapeRendering: props.shapeRendering,\n    className: props.className,\n    transform: props.transform,\n    clipPath: props.clipPath,\n    ...userProps,\n  });\n};\n"
  },
  {
    "path": "packages/victory-core/src/victory-primitives/rect.tsx",
    "content": "import React, { forwardRef } from \"react\";\nimport { evaluateProp } from \"../victory-util/helpers\";\nimport { VictoryPrimitiveShapeProps } from \"./types\";\n\nexport const Rect = forwardRef<SVGRectElement, VictoryPrimitiveShapeProps>(\n  (props, ref) => {\n    /* eslint-disable-next-line @typescript-eslint/no-unused-vars --\n     * origin conflicts with the SVG element's origin attribute\n     */\n    const { desc, id, tabIndex, origin, ...rest } = props;\n\n    const svgProps: React.SVGProps<SVGRectElement> = {\n      vectorEffect: \"non-scaling-stroke\",\n      id: evaluateProp(id, props)?.toString(),\n      tabIndex: evaluateProp(tabIndex, props),\n      ...rest,\n    };\n\n    return desc ? (\n      <rect {...svgProps} ref={ref}>\n        <desc>{desc}</desc>\n      </rect>\n    ) : (\n      <rect {...svgProps} ref={ref} />\n    );\n  },\n);\n"
  },
  {
    "path": "packages/victory-core/src/victory-primitives/text.tsx",
    "content": "import React from \"react\";\nimport { evaluateProp } from \"../victory-util/helpers\";\nimport { VictoryCommonPrimitiveProps } from \"../victory-util/common-props\";\n\nexport interface TextProps extends VictoryCommonPrimitiveProps {\n  children?: React.ReactNode;\n  desc?: string;\n  title?: string;\n}\n\nexport const Text = (props: TextProps) => {\n  /* eslint-disable-next-line @typescript-eslint/no-unused-vars --\n   * origin conflicts with the SVG element's origin attribute\n   */\n  const { children, desc, id, origin, tabIndex, title, ...rest } = props;\n\n  const svgProps: React.SVGProps<SVGTextElement> = {\n    id: evaluateProp(id, props)?.toString(),\n    tabIndex: evaluateProp(tabIndex, props),\n    ...rest,\n  };\n\n  return (\n    <text {...svgProps}>\n      {title && <title>{title}</title>}\n      {desc && <desc>{desc}</desc>}\n      {children}\n    </text>\n  );\n};\n"
  },
  {
    "path": "packages/victory-core/src/victory-primitives/tspan.tsx",
    "content": "import React from \"react\";\nimport { evaluateProp } from \"../victory-util/helpers\";\nimport { VictoryCommonPrimitiveProps } from \"../victory-util/common-props\";\n\nexport const TSpan = (props: VictoryCommonPrimitiveProps) => {\n  /* eslint-disable-next-line @typescript-eslint/no-unused-vars --\n   * origin conflicts with the SVG element's origin attribute\n   */\n  const { desc, id, tabIndex, origin, ...rest } = props;\n\n  const svgProps: React.SVGProps<SVGTSpanElement> = {\n    id: evaluateProp(id, props)?.toString(),\n    tabIndex: evaluateProp(tabIndex, props),\n    ...rest,\n  };\n\n  return <tspan {...svgProps} />;\n};\n"
  },
  {
    "path": "packages/victory-core/src/victory-primitives/types.ts",
    "content": "import { VictoryCommonPrimitiveProps } from \"../victory-util/common-props\";\n\nexport type ScatterSymbolType =\n  | \"circle\"\n  | \"cross\"\n  | \"diamond\"\n  | \"plus\"\n  | \"minus\"\n  | \"square\"\n  | \"star\"\n  | \"triangleDown\"\n  | \"triangleUp\";\n\nexport interface VictoryPrimitiveShapeProps\n  extends VictoryCommonPrimitiveProps {\n  desc?: string;\n  rx?: number;\n  ry?: number;\n}\n"
  },
  {
    "path": "packages/victory-core/src/victory-primitives/whisker.tsx",
    "content": "import React from \"react\";\nimport defaults from \"lodash/defaults\";\n\nimport * as Helpers from \"../victory-util/helpers\";\nimport { VictoryCommonPrimitiveProps } from \"../victory-util/common-props\";\nimport { Line } from \"./line\";\n\nexport type WhiskerAxes = {\n  x1?: number;\n  x2?: number;\n  y1?: number;\n  y2?: number;\n};\n\nexport interface WhiskerProps extends VictoryCommonPrimitiveProps {\n  groupComponent?: React.ReactElement;\n  lineComponent?: React.ReactElement;\n  majorWhisker?: WhiskerAxes;\n  minorWhisker?: WhiskerAxes;\n}\n\nconst evaluateProps = (props) => {\n  /**\n   * Potential evaluated props are:\n   * `ariaLabel`\n   * `desc`\n   * `id`\n   * `style`\n   * `tabIndex`\n   */\n  const ariaLabel = Helpers.evaluateProp(props.ariaLabel, props);\n  const desc = Helpers.evaluateProp(props.desc, props);\n  const id = Helpers.evaluateProp(props.id, props);\n  const style = Helpers.evaluateStyle(props.style, props);\n  const tabIndex = Helpers.evaluateProp(props.tabIndex, props);\n\n  return Object.assign({}, props, { ariaLabel, desc, id, style, tabIndex });\n};\n\nconst defaultProps = {\n  groupComponent: <g />,\n  lineComponent: <Line />,\n  role: \"presentation\",\n  shapeRendering: \"auto\",\n};\n\nexport const Whisker = (initialProps: WhiskerProps) => {\n  const props = evaluateProps(defaults({}, initialProps, defaultProps));\n  const {\n    ariaLabel,\n    groupComponent,\n    lineComponent,\n    events,\n    className,\n    majorWhisker,\n    minorWhisker,\n    transform,\n    clipPath,\n    role,\n    shapeRendering,\n    style,\n    desc,\n    tabIndex,\n  } = props;\n  const baseProps = {\n    ...events,\n    style,\n    desc,\n    tabIndex,\n    className,\n    transform,\n    clipPath,\n    role,\n    shapeRendering,\n  };\n\n  return React.cloneElement(groupComponent, {}, [\n    React.cloneElement(\n      lineComponent,\n      Object.assign(\n        { key: \"major-whisker\", \"aria-label\": ariaLabel },\n        baseProps,\n        majorWhisker,\n      ),\n    ),\n    React.cloneElement(\n      lineComponent,\n      Object.assign(\n        { key: \"minor-whisker\", \"aria-label\": ariaLabel },\n        baseProps,\n        minorWhisker,\n      ),\n    ),\n  ]);\n};\n"
  },
  {
    "path": "packages/victory-core/src/victory-theme/clean.tsx",
    "content": "import { VictoryThemeDefinition } from \"./victory-theme\";\n\n// *\n// * Colors\n// *\n\nconst gray = {\n  white: \"#FFFFFF\",\n  \"50\": \"#FAFAFA\",\n  \"100\": \"#F2F2F2\",\n  \"200\": \"#E8E8E8\",\n  \"300\": \"#E0E0E0\",\n  \"400\": \"#D1D1D1\",\n  \"500\": \"#757575\",\n  \"600\": \"#5C5C5C\",\n  \"700\": \"#424242\",\n  \"800\": \"#333333\",\n  \"900\": \"#292929\",\n  black: \"#0F0F0F\",\n};\nconst yellow = {\n  \"100\": \"#FFEAB6\",\n  \"300\": \"#FFD66E\",\n  \"500\": \"#FCB400\",\n  \"900\": \"#B87503\",\n};\nconst orange = {\n  \"100\": \"#FEE2D5\",\n  \"300\": \"#FFA981\",\n  \"500\": \"#FF6F2C\",\n  \"700\": \"#FF4E1B\",\n  \"900\": \"#D74D26\",\n};\nconst red = {\n  \"100\": \"#FFDCE5\",\n  \"300\": \"#FF9EB7\",\n  \"500\": \"#F82B60\",\n  \"700\": \"#D31A3D\",\n  \"900\": \"#BA1E45\",\n};\nconst purple = {\n  \"100\": \"#EDE3FE\",\n  \"300\": \"#CDB0FF\",\n  \"500\": \"#8B46FF\",\n  \"900\": \"#6B1CB0\",\n};\nconst blue = {\n  \"100\": \"#CFDFFF\",\n  \"300\": \"#9CC7FF\",\n  \"500\": \"#2D7FF9\",\n  \"700\": \"#0056B3\",\n  \"900\": \"#2750AE\",\n};\nconst cyan = {\n  \"100\": \"#D0F0FD\",\n  \"300\": \"#77D1F3\",\n  \"500\": \"#18BFFF\",\n  \"900\": \"#0B76B7\",\n};\nconst teal = {\n  \"100\": \"#C2F5E9\",\n  \"300\": \"#72DDC3\",\n  \"500\": \"#20D9D2\",\n  \"900\": \"#06A09B\",\n};\nconst green = {\n  \"100\": \"#D1F7C4\",\n  \"300\": \"#93E088\",\n  \"500\": \"#20C933\",\n  \"700\": \"#1B9B2A\",\n  \"900\": \"#338A17\",\n};\n\nconst colors = {\n  blue: blue[\"500\"],\n  cyan: cyan[\"500\"],\n  green: green[\"500\"],\n  yellow: yellow[\"500\"],\n  orange: orange[\"500\"],\n  red: red[\"500\"],\n  purple: purple[\"500\"],\n  teal: teal[\"500\"],\n};\n\nconst colorScale = Object.values(colors);\nconst grayscale = [\n  gray[\"100\"],\n  gray[\"300\"],\n  gray[\"500\"],\n  gray[\"700\"],\n  gray[\"900\"],\n];\nconst warm = [\n  yellow[\"300\"],\n  yellow[\"500\"],\n  orange[\"500\"],\n  orange[\"900\"],\n  red[\"500\"],\n];\nconst cool = [\n  purple[\"500\"],\n  blue[\"500\"],\n  cyan[\"500\"],\n  teal[\"500\"],\n  green[\"500\"],\n];\nconst heatmap = [\n  green[\"900\"],\n  green[\"500\"],\n  yellow[\"500\"],\n  orange[\"500\"],\n  red[\"500\"],\n];\nconst redPalette = Object.values(red);\nconst greenPalette = Object.values(green);\nconst bluePalette = Object.values(blue);\n\nconst defaultColor = blue[\"500\"];\n\n// *\n// * Typography\n// *\nconst sansSerif =\n  \"'Inter', 'Helvetica Neue', 'Seravek', 'Helvetica', sans-serif\";\nconst letterSpacing = \"normal\";\nconst fontSize = 12;\n// *\n// * Layout\n// *\nconst padding = 8;\nconst baseProps = {\n  width: 450,\n  height: 300,\n  padding: 60,\n  colorScale,\n};\n// *\n// * Labels\n// *\nconst baseLabelStyles = {\n  fontFamily: sansSerif,\n  fontSize,\n  fontWeight: 300,\n  letterSpacing,\n  padding,\n  fill: gray[\"900\"],\n  stroke: \"transparent\",\n};\n\nconst centeredLabelStyles = Object.assign(\n  { textAnchor: \"middle\" },\n  baseLabelStyles,\n);\n\n// *\n// * Strokes\n// *\nconst strokeDasharray = \"10, 5\";\nconst strokeLinecap = \"round\";\nconst strokeLinejoin = \"round\";\nconst borderRadius = 1;\n// *\n// * Theme\n// *\nexport const clean: VictoryThemeDefinition = {\n  palette: {\n    colors,\n    grayscale,\n    qualitative: colorScale,\n    heatmap,\n    warm,\n    cool,\n    red: redPalette,\n    green: greenPalette,\n    blue: bluePalette,\n  },\n  area: Object.assign(\n    {\n      style: {\n        data: {\n          fill: defaultColor,\n          strokeWidth: 2,\n          fillOpacity: 0.5,\n        },\n        labels: baseLabelStyles,\n      },\n    },\n    baseProps,\n  ),\n  axis: Object.assign(\n    {\n      style: {\n        axis: {\n          fill: \"transparent\",\n          stroke: gray[\"500\"],\n          strokeWidth: 1,\n          strokeLinecap,\n          strokeLinejoin,\n        },\n        axisLabel: Object.assign({}, centeredLabelStyles, {\n          padding: 35,\n          stroke: \"transparent\",\n        }),\n        grid: {\n          fill: \"none\",\n          stroke: \"none\",\n          painterEvents: \"painted\",\n        },\n        ticks: {\n          fill: \"transparent\",\n          size: 5,\n          stroke: \"transparent\",\n        },\n        tickLabels: baseLabelStyles,\n      },\n    },\n    baseProps,\n  ),\n  polarAxis: Object.assign({\n    style: {\n      axis: {\n        stroke: gray[\"500\"],\n      },\n      grid: {\n        stroke: gray[\"400\"],\n        strokeDasharray,\n        strokeLinecap,\n        strokeLinejoin,\n        pointerEvents: \"painted\",\n      },\n      ticks: {\n        fill: \"transparent\",\n        size: 5,\n        stroke: gray[\"400\"],\n        strokeWidth: 1,\n        strokeLinecap,\n        strokeLinejoin,\n      },\n      tickLabels: baseLabelStyles,\n    },\n  }),\n  polarDependentAxis: Object.assign({\n    style: {\n      axis: {\n        stroke: gray[\"500\"],\n      },\n      grid: {\n        stroke: gray[\"400\"],\n        strokeDasharray,\n        strokeLinecap,\n        strokeLinejoin,\n        pointerEvents: \"painted\",\n      },\n      ticks: {\n        fill: \"transparent\",\n        size: 5,\n        stroke: gray[\"300\"],\n        strokeWidth: 1,\n        strokeLinecap,\n        strokeLinejoin,\n      },\n      tickLabels: baseLabelStyles,\n    },\n  }),\n  bar: Object.assign(\n    {\n      style: {\n        data: {\n          fill: defaultColor,\n          padding,\n          strokeWidth: 1,\n          fillOpacity: 0.5,\n        },\n        labels: baseLabelStyles,\n      },\n      cornerRadius: { top: borderRadius },\n    },\n    baseProps,\n  ),\n  boxplot: Object.assign(\n    {\n      style: {\n        max: { padding, stroke: gray[\"400\"], strokeWidth: 2 },\n        maxLabels: Object.assign({}, baseLabelStyles, { padding: 3 }),\n        median: { padding, stroke: gray.white, strokeWidth: 2 },\n        medianLabels: Object.assign({}, baseLabelStyles, { padding: 3 }),\n        min: { padding, stroke: gray[\"400\"], strokeWidth: 2 },\n        minLabels: Object.assign({}, baseLabelStyles, { padding: 3 }),\n        q1: { padding, fill: colorScale[0], rx: borderRadius, strokeWidth: 2 },\n        q1Labels: Object.assign({}, baseLabelStyles, { padding: 3 }),\n        q3: { padding, fill: colorScale[1], rx: borderRadius },\n        q3Labels: Object.assign({}, baseLabelStyles, { padding: 3 }),\n      },\n      boxWidth: 20,\n    },\n    baseProps,\n  ),\n  candlestick: Object.assign(\n    {\n      style: {\n        data: {\n          stroke: gray[\"300\"],\n          strokeWidth: 0,\n          rx: borderRadius,\n        },\n        labels: Object.assign({}, baseLabelStyles, { padding: 5 }),\n      },\n      candleColors: {\n        positive: green[\"500\"],\n        negative: red[\"500\"],\n      },\n      wickStrokeWidth: 2,\n    },\n    baseProps,\n  ),\n  chart: baseProps,\n  errorbar: Object.assign(\n    {\n      borderWidth: 8,\n      style: {\n        data: {\n          fill: \"transparent\",\n          opacity: 1,\n          stroke: gray[\"700\"],\n          strokeWidth: 2,\n          strokeLinecap,\n        },\n        labels: baseLabelStyles,\n      },\n    },\n    baseProps,\n  ),\n  group: Object.assign(\n    {\n      colorScale,\n    },\n    baseProps,\n  ),\n  histogram: Object.assign(\n    {\n      style: {\n        data: {\n          fill: cyan[\"500\"],\n          fillOpacity: 0.5,\n        },\n        labels: baseLabelStyles,\n      },\n      binSpacing: 4,\n      cornerRadius: { top: borderRadius },\n    },\n    baseProps,\n  ),\n  label: baseLabelStyles,\n  legend: {\n    colorScale,\n    gutter: 24,\n    borderPadding: 10,\n    orientation: \"horizontal\",\n    titleOrientation: \"top\",\n    centerTitle: true,\n    style: {\n      data: {\n        type: \"circle\",\n      },\n      labels: { ...baseLabelStyles, fontSize: 12 },\n      title: Object.assign({}, baseLabelStyles, { padding, fontSize: 16 }),\n      border: { stroke: gray[\"200\"], strokeWidth: 2, padding: 16 },\n    },\n  },\n  line: Object.assign(\n    {\n      style: {\n        data: {\n          fill: \"transparent\",\n          opacity: 1,\n          stroke: defaultColor,\n          strokeWidth: 2,\n          strokeLinecap,\n          strokeLinejoin,\n        },\n        labels: baseLabelStyles,\n      },\n    },\n    baseProps,\n  ),\n  pie: Object.assign(\n    {\n      style: {\n        parent: {\n          backgroundColor: gray.white,\n        },\n        data: {\n          padding,\n          stroke: gray.white,\n          strokeWidth: 1,\n        },\n        labels: {\n          ...baseLabelStyles,\n          padding: 20,\n          fill: gray[\"600\"],\n          fontSize: 10,\n        },\n      },\n      colorScale,\n      cornerRadius: borderRadius,\n    },\n    baseProps,\n  ),\n  scatter: Object.assign(\n    {\n      style: {\n        data: {\n          fill: defaultColor,\n          opacity: 1,\n          stroke: \"transparent\",\n          strokeWidth: 0,\n        },\n        labels: {\n          ...baseLabelStyles,\n          padding: 20,\n        },\n      },\n    },\n    baseProps,\n  ),\n  stack: Object.assign(\n    {\n      colorScale,\n    },\n    baseProps,\n  ),\n  tooltip: {\n    style: Object.assign({}, baseLabelStyles, {\n      padding: 0,\n      pointerEvents: \"none\",\n    }),\n    flyoutStyle: {\n      stroke: gray[\"300\"],\n      strokeWidth: 2,\n      fill: gray.white,\n      pointerEvents: \"none\",\n    },\n    flyoutPadding: { top: 8, bottom: 8, left: 16, right: 16 },\n    cornerRadius: borderRadius,\n    pointerLength: 4,\n  },\n  voronoi: Object.assign(\n    {\n      style: {\n        data: {\n          fill: blue[\"100\"],\n          stroke: defaultColor,\n          strokeWidth: 2,\n        },\n        labels: Object.assign({}, baseLabelStyles, {\n          padding: 5,\n          pointerEvents: \"none\",\n        }),\n        flyout: {\n          stroke: gray[\"900\"],\n          strokeWidth: 1,\n          fill: gray[\"100\"],\n          pointerEvents: \"none\",\n        },\n        padding: { left: 2, bottom: 2 },\n      },\n    },\n    baseProps,\n  ),\n};\n"
  },
  {
    "path": "packages/victory-core/src/victory-theme/grayscale.tsx",
    "content": "import { VictoryThemeDefinition } from \"./types\";\n\n// *\n// * Colors\n// *\nconst colors = {\n  blue: \"#4F7DA1\",\n  pink: \"#E2A37F\",\n  teal: \"#00796B\",\n  purple: \"#DF948A\",\n  green: \"#8BC34A\",\n  orange: \"#F4511E\",\n  cyan: \"#006064\",\n  red: \"#DF5A49\",\n  yellow: \"#FFF59D\",\n};\n\nconst colorScale = [\n  \"#252525\",\n  \"#525252\",\n  \"#737373\",\n  \"#969696\",\n  \"#bdbdbd\",\n  \"#d9d9d9\",\n  \"#f0f0f0\",\n];\n\nconst charcoal = \"#252525\";\nconst grey = \"#969696\";\n\nconst qualitative = [\n  \"#334D5C\",\n  \"#45B29D\",\n  \"#EFC94C\",\n  \"#E27A3F\",\n  \"#DF5A49\",\n  \"#4F7DA1\",\n  \"#55DBC1\",\n  \"#EFDA97\",\n  \"#E2A37F\",\n  \"#DF948A\",\n];\nconst heatmap = [\"#428517\", \"#77D200\", \"#D6D305\", \"#EC8E19\", \"#C92B05\"];\nconst warm = [\"#940031\", \"#C43343\", \"#DC5429\", \"#FF821D\", \"#FFAF55\"];\nconst cool = [\"#2746B9\", \"#0B69D4\", \"#2794DB\", \"#31BB76\", \"#60E83B\"];\nconst red = [\"#FCAE91\", \"#FB6A4A\", \"#DE2D26\", \"#A50F15\", \"#750B0E\"];\nconst green = [\"#354722\", \"#466631\", \"#649146\", \"#8AB25C\", \"#A9C97E\"];\nconst blue = [\"#002C61\", \"#004B8F\", \"#006BC9\", \"#3795E5\", \"#65B4F4\"];\n\n// *\n// * Typography\n// *\nconst sansSerif = \"'Gill Sans', 'Seravek', 'Trebuchet MS', sans-serif\";\nconst letterSpacing = \"normal\";\nconst fontSize = 14;\n// *\n// * Layout\n// *\nconst baseProps = {\n  width: 450,\n  height: 300,\n  padding: 50,\n  colorScale,\n};\n// *\n// * Labels\n// *\nconst baseLabelStyles = {\n  fontFamily: sansSerif,\n  fontSize,\n  letterSpacing,\n  padding: 10,\n  fill: charcoal,\n  stroke: \"transparent\",\n};\n\nconst centeredLabelStyles = Object.assign(\n  { textAnchor: \"middle\" },\n  baseLabelStyles,\n);\n// *\n// * Strokes\n// *\nconst strokeLinecap = \"round\";\nconst strokeLinejoin = \"round\";\n\nexport const grayscale: VictoryThemeDefinition = {\n  palette: {\n    colors,\n    grayscale: colorScale,\n    qualitative,\n    heatmap,\n    warm,\n    cool,\n    red,\n    green,\n    blue,\n  },\n  area: Object.assign(\n    {\n      style: {\n        data: {\n          fill: charcoal,\n        },\n        labels: baseLabelStyles,\n      },\n    },\n    baseProps,\n  ),\n  axis: Object.assign(\n    {\n      style: {\n        axis: {\n          fill: \"transparent\",\n          stroke: charcoal,\n          strokeWidth: 1,\n          strokeLinecap,\n          strokeLinejoin,\n        },\n        axisLabel: Object.assign({}, centeredLabelStyles, {\n          padding: 25,\n        }),\n        grid: {\n          fill: \"none\",\n          stroke: \"none\",\n          pointerEvents: \"painted\",\n        },\n        ticks: {\n          fill: \"transparent\",\n          size: 1,\n          stroke: \"transparent\",\n        },\n        tickLabels: baseLabelStyles,\n      },\n    },\n    baseProps,\n  ),\n  bar: Object.assign(\n    {\n      style: {\n        data: {\n          fill: charcoal,\n          padding: 8,\n          strokeWidth: 0,\n        },\n        labels: baseLabelStyles,\n      },\n    },\n    baseProps,\n  ),\n  boxplot: Object.assign(\n    {\n      style: {\n        max: { padding: 8, stroke: charcoal, strokeWidth: 1 },\n        maxLabels: Object.assign({}, baseLabelStyles, { padding: 3 }),\n        median: { padding: 8, stroke: charcoal, strokeWidth: 1 },\n        medianLabels: Object.assign({}, baseLabelStyles, { padding: 3 }),\n        min: { padding: 8, stroke: charcoal, strokeWidth: 1 },\n        minLabels: Object.assign({}, baseLabelStyles, { padding: 3 }),\n        q1: { padding: 8, fill: grey },\n        q1Labels: Object.assign({}, baseLabelStyles, { padding: 3 }),\n        q3: { padding: 8, fill: grey },\n        q3Labels: Object.assign({}, baseLabelStyles, { padding: 3 }),\n      },\n      boxWidth: 20,\n    },\n    baseProps,\n  ),\n  candlestick: Object.assign(\n    {\n      style: {\n        data: {\n          stroke: charcoal,\n          strokeWidth: 1,\n        },\n        labels: Object.assign({}, baseLabelStyles, { padding: 5 }),\n      },\n      candleColors: {\n        positive: \"#ffffff\",\n        negative: charcoal,\n      },\n    },\n    baseProps,\n  ),\n  chart: baseProps,\n  errorbar: Object.assign(\n    {\n      borderWidth: 8,\n      style: {\n        data: {\n          fill: \"transparent\",\n          stroke: charcoal,\n          strokeWidth: 2,\n        },\n        labels: baseLabelStyles,\n      },\n    },\n    baseProps,\n  ),\n  group: Object.assign(\n    {\n      colorScale,\n    },\n    baseProps,\n  ),\n  histogram: Object.assign(\n    {\n      style: {\n        data: {\n          fill: grey,\n          stroke: charcoal,\n          strokeWidth: 2,\n        },\n        labels: baseLabelStyles,\n      },\n    },\n    baseProps,\n  ),\n  legend: {\n    colorScale,\n    gutter: 10,\n    orientation: \"vertical\",\n    titleOrientation: \"top\",\n    style: {\n      data: {\n        type: \"circle\",\n      },\n      labels: baseLabelStyles,\n      title: Object.assign({}, baseLabelStyles, { padding: 5 }),\n    },\n  },\n  line: Object.assign(\n    {\n      style: {\n        data: {\n          fill: \"transparent\",\n          stroke: charcoal,\n          strokeWidth: 2,\n        },\n        labels: baseLabelStyles,\n      },\n    },\n    baseProps,\n  ),\n  pie: {\n    style: {\n      data: {\n        padding: 10,\n        stroke: \"transparent\",\n        strokeWidth: 1,\n      },\n      labels: Object.assign({}, baseLabelStyles, { padding: 20 }),\n    },\n    colorScale,\n    width: 400,\n    height: 400,\n    padding: 50,\n  },\n  scatter: Object.assign(\n    {\n      style: {\n        data: {\n          fill: charcoal,\n          stroke: \"transparent\",\n          strokeWidth: 0,\n        },\n        labels: baseLabelStyles,\n      },\n    },\n    baseProps,\n  ),\n  stack: Object.assign(\n    {\n      colorScale,\n    },\n    baseProps,\n  ),\n  tooltip: {\n    style: Object.assign({}, baseLabelStyles, {\n      padding: 0,\n      pointerEvents: \"none\",\n    }),\n    flyoutStyle: {\n      stroke: charcoal,\n      strokeWidth: 1,\n      fill: \"#f0f0f0\",\n      pointerEvents: \"none\",\n    },\n    flyoutPadding: 5,\n    cornerRadius: 5,\n    pointerLength: 10,\n  },\n  voronoi: Object.assign(\n    {\n      style: {\n        data: {\n          fill: \"transparent\",\n          stroke: \"transparent\",\n          strokeWidth: 0,\n        },\n        labels: Object.assign({}, baseLabelStyles, {\n          padding: 5,\n          pointerEvents: \"none\",\n        }),\n        flyout: {\n          stroke: charcoal,\n          strokeWidth: 1,\n          fill: \"#f0f0f0\",\n          pointerEvents: \"none\",\n        },\n      },\n    },\n    baseProps,\n  ),\n};\n"
  },
  {
    "path": "packages/victory-core/src/victory-theme/material.tsx",
    "content": "import { VictoryThemeDefinition, VictoryThemePalette } from \"./types\";\n\n// *\n// * Colors\n// *\nconst yellow200 = \"#FFF59D\";\nconst deepOrange600 = \"#F4511E\";\nconst lime300 = \"#DCE775\";\nconst lightGreen500 = \"#8BC34A\";\nconst teal700 = \"#00796B\";\nconst cyan900 = \"#006064\";\nconst colorScale = [\n  deepOrange600,\n  yellow200,\n  lime300,\n  lightGreen500,\n  teal700,\n  cyan900,\n];\nconst blueGrey50 = \"#ECEFF1\";\nconst blueGrey300 = \"#90A4AE\";\nconst blueGrey700 = \"#455A64\";\nconst grey900 = \"#212121\";\n\nconst colors: VictoryThemePalette = {\n  blue: \"#4F7DA1\",\n  pink: \"#E2A37F\",\n  teal: teal700,\n  purple: \"#DF948A\",\n  green: lightGreen500,\n  orange: deepOrange600,\n  cyan: cyan900,\n  red: \"#DF5A49\",\n  yellow: yellow200,\n};\n\nconst grayscale = [blueGrey50, blueGrey300, blueGrey700, grey900];\nconst qualitative = [\n  \"#334D5C\",\n  \"#45B29D\",\n  \"#EFC94C\",\n  \"#E27A3F\",\n  \"#DF5A49\",\n  \"#4F7DA1\",\n  \"#55DBC1\",\n  \"#EFDA97\",\n  \"#E2A37F\",\n  \"#DF948A\",\n];\nconst heatmap = [\"#428517\", \"#77D200\", \"#D6D305\", \"#EC8E19\", \"#C92B05\"];\nconst warm = [\"#940031\", \"#C43343\", \"#DC5429\", \"#FF821D\", \"#FFAF55\"];\nconst cool = [\"#2746B9\", \"#0B69D4\", \"#2794DB\", \"#31BB76\", \"#60E83B\"];\nconst red = [\"#FCAE91\", \"#FB6A4A\", \"#DE2D26\", \"#A50F15\", \"#750B0E\"];\nconst green = [\"#354722\", \"#466631\", \"#649146\", \"#8AB25C\", \"#A9C97E\"];\nconst blue = [\"#002C61\", \"#004B8F\", \"#006BC9\", \"#3795E5\", \"#65B4F4\"];\n\n// *\n// * Typography\n// *\nconst sansSerif = \"'Helvetica Neue', 'Helvetica', sans-serif\";\nconst letterSpacing = \"normal\";\nconst fontSize = 12;\n// *\n// * Layout\n// *\nconst padding = 8;\nconst baseProps = {\n  width: 350,\n  height: 350,\n  padding: 50,\n};\n// *\n// * Labels\n// *\nconst baseLabelStyles = {\n  fontFamily: sansSerif,\n  fontSize,\n  letterSpacing,\n  padding,\n  fill: blueGrey700,\n  stroke: \"transparent\",\n  strokeWidth: 0,\n};\n\nconst centeredLabelStyles = Object.assign(\n  { textAnchor: \"middle\" },\n  baseLabelStyles,\n);\n// *\n// * Strokes\n// *\nconst strokeDasharray = \"10, 5\";\nconst strokeLinecap = \"round\";\nconst strokeLinejoin = \"round\";\n\nexport const material: VictoryThemeDefinition = {\n  palette: {\n    colors,\n    grayscale,\n    qualitative,\n    heatmap,\n    warm,\n    cool,\n    red,\n    green,\n    blue,\n  },\n  area: Object.assign(\n    {\n      style: {\n        data: {\n          fill: grey900,\n        },\n        labels: baseLabelStyles,\n      },\n    },\n    baseProps,\n  ),\n  axis: Object.assign(\n    {\n      style: {\n        axis: {\n          fill: \"transparent\",\n          stroke: blueGrey300,\n          strokeWidth: 2,\n          strokeLinecap,\n          strokeLinejoin,\n        },\n        axisLabel: Object.assign({}, centeredLabelStyles, {\n          padding,\n          stroke: \"transparent\",\n        }),\n        grid: {\n          fill: \"none\",\n          stroke: blueGrey50,\n          strokeDasharray,\n          strokeLinecap,\n          strokeLinejoin,\n          pointerEvents: \"painted\",\n        },\n        ticks: {\n          fill: \"transparent\",\n          size: 5,\n          stroke: blueGrey300,\n          strokeWidth: 1,\n          strokeLinecap,\n          strokeLinejoin,\n        },\n        tickLabels: Object.assign({}, baseLabelStyles, {\n          fill: blueGrey700,\n        }),\n      },\n    },\n    baseProps,\n  ),\n  polarDependentAxis: Object.assign({\n    style: {\n      ticks: {\n        fill: \"transparent\",\n        size: 1,\n        stroke: \"transparent\",\n      },\n    },\n  }),\n  bar: Object.assign(\n    {\n      style: {\n        data: {\n          fill: blueGrey700,\n          padding,\n          strokeWidth: 0,\n        },\n        labels: baseLabelStyles,\n      },\n    },\n    baseProps,\n  ),\n  boxplot: Object.assign(\n    {\n      style: {\n        max: { padding, stroke: blueGrey700, strokeWidth: 1 },\n        maxLabels: Object.assign({}, baseLabelStyles, { padding: 3 }),\n        median: { padding, stroke: blueGrey700, strokeWidth: 1 },\n        medianLabels: Object.assign({}, baseLabelStyles, { padding: 3 }),\n        min: { padding, stroke: blueGrey700, strokeWidth: 1 },\n        minLabels: Object.assign({}, baseLabelStyles, { padding: 3 }),\n        q1: { padding, fill: blueGrey700 },\n        q1Labels: Object.assign({}, baseLabelStyles, { padding: 3 }),\n        q3: { padding, fill: blueGrey700 },\n        q3Labels: Object.assign({}, baseLabelStyles, { padding: 3 }),\n      },\n      boxWidth: 20,\n    },\n    baseProps,\n  ),\n  candlestick: Object.assign(\n    {\n      style: {\n        data: {\n          stroke: blueGrey700,\n        },\n        labels: Object.assign({}, baseLabelStyles, { padding: 5 }),\n      },\n      candleColors: {\n        positive: \"#ffffff\",\n        negative: blueGrey700,\n      },\n    },\n    baseProps,\n  ),\n  chart: baseProps,\n  errorbar: Object.assign(\n    {\n      borderWidth: 8,\n      style: {\n        data: {\n          fill: \"transparent\",\n          opacity: 1,\n          stroke: blueGrey700,\n          strokeWidth: 2,\n        },\n        labels: baseLabelStyles,\n      },\n    },\n    baseProps,\n  ),\n  group: Object.assign(\n    {\n      colorScale,\n    },\n    baseProps,\n  ),\n  histogram: Object.assign(\n    {\n      style: {\n        data: {\n          fill: blueGrey700,\n          stroke: grey900,\n          strokeWidth: 2,\n        },\n        labels: baseLabelStyles,\n      },\n    },\n    baseProps,\n  ),\n  legend: {\n    colorScale,\n    gutter: 10,\n    orientation: \"vertical\",\n    titleOrientation: \"top\",\n    style: {\n      data: {\n        type: \"circle\",\n      },\n      labels: baseLabelStyles,\n      title: Object.assign({}, baseLabelStyles, { padding: 5 }),\n    },\n  },\n  line: Object.assign(\n    {\n      style: {\n        data: {\n          fill: \"transparent\",\n          opacity: 1,\n          stroke: blueGrey700,\n          strokeWidth: 2,\n        },\n        labels: baseLabelStyles,\n      },\n    },\n    baseProps,\n  ),\n  pie: Object.assign(\n    {\n      colorScale,\n      style: {\n        data: {\n          padding,\n          stroke: blueGrey50,\n          strokeWidth: 1,\n        },\n        labels: Object.assign({}, baseLabelStyles, { padding: 20 }),\n      },\n    },\n    baseProps,\n  ),\n  scatter: Object.assign(\n    {\n      style: {\n        data: {\n          fill: blueGrey700,\n          opacity: 1,\n          stroke: \"transparent\",\n          strokeWidth: 0,\n        },\n        labels: baseLabelStyles,\n      },\n    },\n    baseProps,\n  ),\n  stack: Object.assign(\n    {\n      colorScale,\n    },\n    baseProps,\n  ),\n  tooltip: {\n    style: Object.assign({}, baseLabelStyles, {\n      padding: 0,\n      pointerEvents: \"none\",\n    }),\n    flyoutStyle: {\n      stroke: grey900,\n      strokeWidth: 1,\n      fill: \"#f0f0f0\",\n      pointerEvents: \"none\",\n    },\n    flyoutPadding: 5,\n    cornerRadius: 5,\n    pointerLength: 10,\n  },\n  voronoi: Object.assign(\n    {\n      style: {\n        data: {\n          fill: \"transparent\",\n          stroke: \"transparent\",\n          strokeWidth: 0,\n        },\n        labels: Object.assign({}, baseLabelStyles, {\n          padding: 5,\n          pointerEvents: \"none\",\n        }),\n        flyout: {\n          stroke: grey900,\n          strokeWidth: 1,\n          fill: \"#f0f0f0\",\n          pointerEvents: \"none\",\n        },\n      },\n    },\n    baseProps,\n  ),\n};\n"
  },
  {
    "path": "packages/victory-core/src/victory-theme/types.ts",
    "content": "import * as React from \"react\";\nimport {\n  VictoryCommonThemeProps,\n  VictoryDatableProps,\n} from \"../victory-util/common-props\";\nimport {\n  NumberOrCallback,\n  OrientationOrCallback,\n  PaddingOrCallback,\n  StringOrNumberOrCallback,\n} from \"../types/callbacks\";\nimport { DomainPropType } from \"../types/prop-types\";\n\nexport type BlockProps = {\n  top?: number;\n  bottom?: number;\n  left?: number;\n  right?: number;\n};\nexport type PaddingProps = number | BlockProps;\nexport type OrientationTypes = \"top\" | \"bottom\" | \"left\" | \"right\";\nexport type VictoryStyleObject = {\n  [K in keyof React.CSSProperties]: StringOrNumberOrCallback;\n};\nexport type LabelProps = React.CSSProperties & {\n  angle?: number;\n  verticalAnchor?: VerticalAnchorType;\n};\nexport type VictoryLabelStyleObject = {\n  [K in keyof LabelProps]: StringOrNumberOrCallback;\n};\n\n/**\n * Style interface used in components/themeing\n */\nexport interface VictoryStyleInterface {\n  parent?: VictoryStyleObject;\n  data?: VictoryStyleObject;\n  labels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n  border?: VictoryStyleObject;\n}\n\nexport type TickProps = React.CSSProperties & { size?: number };\nexport type VictoryTickStyleObject = {\n  [K in keyof TickProps]: StringOrNumberOrCallback;\n};\n\nexport interface VictoryAxisCommonProps {\n  axisComponent?: React.ReactElement;\n  axisLabelComponent?: React.ReactElement;\n  axisValue?: number | string | object | Date;\n  dependentAxis?: boolean;\n  domain?: DomainPropType;\n  gridComponent?: React.ReactElement;\n  invertAxis?: boolean;\n  style?: {\n    parent?: VictoryStyleObject;\n    axis?: VictoryStyleObject;\n    axisLabel?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n    grid?: VictoryStyleObject;\n    ticks?: VictoryTickStyleObject;\n    tickLabels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n  };\n  tickComponent?: React.ReactElement;\n  tickCount?: number;\n  tickLabelComponent?: React.ReactElement;\n  tickFormat?:\n    | any[]\n    | { (tick: any, index: number, ticks: any[]): string | number };\n  tickValues?: any[];\n}\n\nexport type VerticalAnchorType = \"start\" | \"middle\" | \"end\";\n// #region Victory Theme\n// Note: Many SVG attributes are missed in CSSProperties interface\ntype VictoryThemePaletteKeys =\n  | \"blue\"\n  | \"pink\"\n  | \"teal\"\n  | \"purple\"\n  | \"green\"\n  | \"orange\"\n  | \"cyan\"\n  | \"red\"\n  | \"yellow\";\n\nexport type VictoryThemePalette = {\n  [key in VictoryThemePaletteKeys]?: string;\n};\n\nexport interface VictoryThemeDefinition {\n  palette?: {\n    colors?: VictoryThemePalette;\n    grayscale?: string[];\n    qualitative?: string[];\n    heatmap?: string[];\n    warm?: string[];\n    cool?: string[];\n    red?: string[];\n    blue?: string[];\n    green?: string[];\n  };\n  area?: {\n    style?: {\n      data?: VictoryStyleObject;\n      labels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n    };\n  } & VictoryCommonThemeProps &\n    VictoryDatableProps;\n  axis?: {\n    style?: {\n      axis?: VictoryStyleObject;\n      axisLabel?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n      grid?: VictoryStyleObject;\n      ticks?: VictoryTickStyleObject;\n      tickLabels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n    };\n    offsetX?: number;\n    offsetY?: number;\n  } & VictoryCommonThemeProps;\n  bar?: {\n    style?: {\n      data?: VictoryStyleObject;\n      labels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n    };\n  } & VictoryCommonThemeProps &\n    VictoryDatableProps;\n  boxplot?: {\n    style?: {\n      max?: VictoryStyleObject;\n      maxLabels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n      median?: VictoryStyleObject;\n      medianLabels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n      min?: VictoryStyleObject;\n      minLabels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n      q1?: VictoryStyleObject;\n      q1Labels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n      q3?: VictoryStyleObject;\n      q3Labels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n    };\n    boxWidth?: number;\n  } & VictoryCommonThemeProps;\n  candlestick?: {\n    style?: {\n      data?: VictoryStyleObject;\n      labels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n    };\n    candleColors?: {\n      positive?: string;\n      negative?: string;\n    };\n  } & VictoryCommonThemeProps;\n  chart?: VictoryCommonThemeProps;\n  dependentAxis?: {\n    style?: {\n      axis?: VictoryStyleObject;\n      axisLabel?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n      grid?: VictoryStyleObject;\n      ticks?: VictoryTickStyleObject;\n      tickLabels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n    };\n    offsetX?: number;\n    offsetY?: number;\n    orientation?: OrientationTypes;\n  } & VictoryCommonThemeProps;\n  errorbar?: {\n    borderWidth?: number;\n    style?: {\n      data?: VictoryStyleObject;\n      labels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n    };\n  } & VictoryCommonThemeProps;\n  group?: {\n    style?: {\n      data?: VictoryStyleObject;\n      labels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n    };\n  } & VictoryCommonThemeProps;\n  histogram?: {\n    style?: {\n      data?: VictoryStyleObject;\n      labels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n    };\n  } & VictoryCommonThemeProps;\n  independentAxis?: {\n    style?: {\n      axis?: VictoryStyleObject;\n      axisLabel?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n      grid?: VictoryStyleObject;\n      ticks?: VictoryTickStyleObject;\n      tickLabels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n    };\n    offsetX?: number;\n    offsetY?: number;\n    orientation?: OrientationTypes;\n  } & VictoryCommonThemeProps;\n  label?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n  legend?: {\n    gutter?: number | BlockProps;\n    rowGutter?: number | BlockProps;\n    orientation?: string;\n    titleOrientation?: string;\n    style?: {\n      data?: VictoryStyleObject & {\n        type?: string;\n      };\n      border?: VictoryStyleObject;\n      labels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n      title?: VictoryLabelStyleObject;\n    };\n    itemsPerRow?: number;\n    x?: number;\n    y?: number;\n    centerTitle?: boolean;\n    borderPadding?: number | BlockProps;\n  } & VictoryCommonThemeProps;\n  line?: {\n    style?: {\n      data?: VictoryStyleObject;\n      labels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n    };\n  } & VictoryCommonThemeProps &\n    VictoryDatableProps;\n  pie?: {\n    style?: {\n      data?: VictoryStyleObject;\n      labels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n    };\n  } & VictoryCommonThemeProps &\n    VictoryDatableProps;\n  polarAxis?: {\n    style?: {\n      axis?: VictoryStyleObject;\n      axisLabel?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n      grid?: VictoryStyleObject;\n      ticks?: VictoryTickStyleObject;\n      tickLabels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n    };\n  } & VictoryCommonThemeProps;\n  polarDependentAxis?: {\n    style?: {\n      axis?: VictoryStyleObject;\n      axisLabel?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n      grid?: VictoryStyleObject;\n      ticks?: VictoryTickStyleObject;\n      tickLabels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n    };\n  } & VictoryCommonThemeProps;\n  polarIndependentAxis?: {\n    style?: {\n      axis?: VictoryStyleObject;\n      axisLabel?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n      grid?: VictoryStyleObject;\n      ticks?: VictoryTickStyleObject;\n      tickLabels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n    };\n  } & VictoryCommonThemeProps;\n  scatter?: {\n    style?: {\n      data?: VictoryStyleObject;\n      labels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n    };\n  } & VictoryCommonThemeProps &\n    VictoryDatableProps;\n  stack?: VictoryCommonThemeProps;\n  tooltip?: {\n    style?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n    flyoutStyle?: VictoryStyleObject;\n    cornerRadius?: NumberOrCallback;\n    pointerLength?: NumberOrCallback;\n    flyoutPadding?: PaddingOrCallback;\n    flyoutWidth?: NumberOrCallback;\n    flyoutHeight?: NumberOrCallback;\n    orientation?: OrientationOrCallback;\n    pointerOrientation?: OrientationOrCallback;\n  };\n  voronoi?: {\n    style?: {\n      data?: VictoryStyleObject;\n      labels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n      flyout?: VictoryStyleObject;\n    };\n  } & VictoryCommonThemeProps &\n    VictoryDatableProps;\n}\n"
  },
  {
    "path": "packages/victory-core/src/victory-theme/victory-theme.tsx",
    "content": "import { grayscale } from \"./grayscale\";\nimport { material } from \"./material\";\nimport { clean } from \"./clean\";\n\nexport * from \"./types\";\n\nexport const VictoryTheme = { grayscale, material, clean };\n"
  },
  {
    "path": "packages/victory-core/src/victory-transition/victory-transition.tsx",
    "content": "import React from \"react\";\nimport defaults from \"lodash/defaults\";\nimport pick from \"lodash/pick\";\nimport isEqual from \"react-fast-compare\";\n\nimport { VictoryAnimation } from \"../victory-animation/victory-animation\";\nimport * as Collection from \"../victory-util/collection\";\nimport * as Helpers from \"../victory-util/helpers\";\nimport TimerContext from \"../victory-util/timer-context\";\nimport * as Transitions from \"../victory-util/transitions\";\nimport Timer from \"../victory-util/timer\";\n\ntype VictoryTransitionChild = React.ReactElement<\n  // Props:\n  {\n    polar?: boolean;\n    domain?: number[] | { x: number[]; y: number[] };\n    groupComponent?: React.ReactElement;\n  },\n  // Type:\n  {\n    new (props: any): React.Component<any, any>;\n    continuous?: boolean;\n  }\n>;\ninterface VictoryTransitionProps {\n  animate?: boolean | any;\n  animationWhitelist?: string[];\n  children: VictoryTransitionChild;\n}\n\ninterface VictoryTransitionState {\n  oldProps?: VictoryTransitionProps | null;\n  nextProps?: VictoryTransitionProps;\n  nodesShouldLoad?: boolean;\n  nodesDoneLoad?: boolean;\n  nodesWillExit?: boolean;\n  nodesWillEnter?: boolean;\n  nodesShouldEnter?: boolean;\n  childrenTransitions?: unknown;\n}\n\nexport interface VictoryTransition {\n  context: React.ContextType<typeof TimerContext>;\n}\n\nexport class VictoryTransition extends React.Component<\n  VictoryTransitionProps,\n  VictoryTransitionState\n> {\n  static displayName = \"VictoryTransition\";\n\n  static contextType = TimerContext;\n  private continuous: boolean;\n  private timer: Timer;\n  private transitionProps: any;\n\n  constructor(props, context) {\n    super(props, context);\n    this.state = {\n      nodesShouldLoad: false,\n      nodesDoneLoad: false,\n    };\n    const child = this.props.children;\n    const polar = child.props.polar;\n    this.continuous = !polar && child.type && child.type.continuous === true;\n    this.timer = this.context.transitionTimer;\n  }\n\n  componentDidMount() {\n    this.setState({ nodesShouldLoad: true });\n  }\n\n  shouldComponentUpdate(nextProps: VictoryTransitionProps) {\n    if (!isEqual(this.props, nextProps)) {\n      this.timer.bypassAnimation();\n      this.setState(this.getTransitionState(this.props, nextProps), () =>\n        this.timer.resumeAnimation(),\n      );\n    }\n    return true;\n  }\n\n  componentWillUnmount() {\n    this.timer.stop();\n  }\n\n  private getTransitionState(\n    props: VictoryTransitionProps,\n    nextProps: VictoryTransitionProps,\n  ): VictoryTransitionState {\n    const { animate } = props;\n    if (!animate) {\n      return {};\n    } else if (animate.parentState) {\n      const state = animate.parentState;\n      const oldProps = state.nodesWillExit ? props : null;\n      return { oldProps, nextProps };\n    }\n    const oldChildren = React.Children.toArray(props.children);\n    const nextChildren = React.Children.toArray(nextProps.children);\n    const {\n      nodesWillExit,\n      nodesWillEnter,\n      childrenTransitions,\n      nodesShouldEnter,\n    } = Transitions.getInitialTransitionState(oldChildren, nextChildren);\n    return {\n      nodesWillExit,\n      nodesWillEnter,\n      childrenTransitions,\n      nodesShouldEnter,\n      oldProps: nodesWillExit ? props : null,\n      nextProps,\n    };\n  }\n\n  private getDomainFromChildren(\n    props: VictoryTransitionProps,\n    axis: \"x\" | \"y\",\n  ) {\n    const getChildDomains = (children) => {\n      return children.reduce((memo, child) => {\n        if (child.type && Helpers.isFunction(child.type.getDomain)) {\n          const childDomain =\n            child.props && child.type.getDomain(child.props, axis);\n          return childDomain ? memo.concat(childDomain) : memo;\n        } else if (child.props && child.props.children) {\n          return memo.concat(\n            getChildDomains(React.Children.toArray(child.props.children)),\n          );\n        }\n        return memo;\n      }, []);\n    };\n\n    const child = React.Children.toArray(\n      props.children,\n    )[0] as VictoryTransitionChild;\n    const childProps: any = child.props || {};\n    const domain = Array.isArray(childProps.domain)\n      ? childProps.domain\n      : childProps.domain && childProps.domain[axis];\n    if (!childProps.children && domain) {\n      return domain;\n    }\n    const childDomains = getChildDomains([child]);\n    return childDomains.length === 0\n      ? [0, 1]\n      : [\n          Collection.getMinValue(childDomains),\n          Collection.getMaxValue(childDomains),\n        ];\n  }\n\n  pickProps() {\n    if (!this.state) {\n      return this.props;\n    }\n    return this.state.nodesWillExit\n      ? this.state.oldProps || this.props\n      : this.props;\n  }\n\n  private pickDomainProps(props: VictoryTransitionProps) {\n    const parentState = props.animate?.parentState;\n    if (parentState && parentState.nodesWillExit) {\n      return this.continuous || parentState.continuous\n        ? parentState.nextProps || this.state.nextProps || props\n        : props;\n    }\n    return this.continuous && this.state.nodesWillExit\n      ? this.state.nextProps || props\n      : props;\n  }\n\n  getClipWidth(props, child) {\n    const getDefaultClipWidth = () => {\n      const range = Helpers.getRange(child.props, \"x\");\n      return range ? Math.abs(range[1] - range[0]) : props.width;\n    };\n    const clipWidth = this.transitionProps\n      ? this.transitionProps.clipWidth\n      : undefined;\n    return clipWidth !== undefined ? clipWidth : getDefaultClipWidth();\n  }\n\n  render() {\n    const props = this.pickProps();\n    const getTransitionProps = this.props.animate?.getTransitions\n      ? this.props.animate.getTransitions\n      : Transitions.getTransitionPropsFactory(props, this.state, (newState) =>\n          this.setState(newState),\n        );\n    const child = React.Children.toArray(\n      props.children,\n    )[0] as VictoryTransitionChild;\n    const transitionProps = getTransitionProps(child);\n    this.transitionProps = transitionProps;\n    const domain = {\n      x: this.getDomainFromChildren(this.pickDomainProps(props), \"x\"),\n      y: this.getDomainFromChildren(props, \"y\"),\n    };\n    const clipWidth = this.getClipWidth(props, child);\n    const combinedProps = defaults(\n      { domain, clipWidth },\n      transitionProps,\n      child.props,\n    );\n    const animationWhitelist = props.animationWhitelist || [];\n    const whitelist = animationWhitelist.concat([\"clipWidth\"]);\n    const propsToAnimate = whitelist.length\n      ? pick(combinedProps, whitelist)\n      : combinedProps;\n    return (\n      <VictoryAnimation {...combinedProps.animate} data={propsToAnimate}>\n        {(newProps) => {\n          if (child.props.groupComponent) {\n            const groupComponent = this.continuous\n              ? React.cloneElement(child.props.groupComponent, {\n                  clipWidth: newProps.clipWidth || 0,\n                })\n              : child.props.groupComponent;\n            return React.cloneElement(\n              child,\n              defaults(\n                { animate: null, animating: true, groupComponent },\n                newProps,\n                combinedProps,\n              ),\n            );\n          }\n          return React.cloneElement(\n            child,\n            defaults(\n              { animate: null, animating: true },\n              newProps,\n              combinedProps,\n            ),\n          );\n        }}\n      </VictoryAnimation>\n    );\n  }\n}\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/add-events.tsx",
    "content": "import React from \"react\";\nimport defaults from \"lodash/defaults\";\nimport isEmpty from \"lodash/isEmpty\";\nimport pick from \"lodash/pick\";\n\nimport isEqual from \"react-fast-compare\";\n\nimport { VictoryLabelableProps } from \"../types/prop-types\";\nimport { VictoryTransition } from \"../victory-transition/victory-transition\";\nimport { VictoryCommonProps, VictoryDatableProps } from \"./common-props\";\nimport { difference } from \"./collection\";\nimport type { ComponentEvent } from \"./events\";\nimport * as Events from \"./events\";\nimport { isFunction, isNil } from \"./helpers\";\n\n// DISCLAIMER:\n// This file is not currently tested, and it is first on the list of files\n// to refactor in our current refactoring effort. Please do not make changes\n// to this file without manual testing and/or refactoring and adding tests.\n\nconst datumHasXandY = (datum) => {\n  return !isNil(datum._x) && !isNil(datum._y);\n};\n\n//  used for checking state changes. Expected components can be passed in via options\nconst defaultComponents: NonNullable<MixinOptions[\"components\"]> = [\n  { name: \"parent\", index: \"parent\" },\n  { name: \"data\" },\n  { name: \"labels\" },\n];\n\nexport type MixinOptions = {\n  components?: Array<{\n    name: string;\n    index?: string | number;\n  }>;\n};\n\nexport interface EventMixinCommonProps\n  extends VictoryCommonProps,\n    VictoryDatableProps,\n    VictoryLabelableProps {}\n\n/**\n * These methods will be implemented by the Mixin,\n * and are accessible to the Wrapped Component.\n *\n * To make your Wrapped Component type-safe, use \"interface merging\" like so:\n * @example\n *    interface MyComponent extends EventsMixinClass<MyProps> {}\n *    class MyComponent extends React.Component<MyProps> { ... }\n */\nexport interface EventsMixinClass<TProps> {\n  renderContainer(\n    component: React.ReactElement,\n    children: React.ReactElement | React.ReactElement[],\n  ): React.ReactElement;\n  cacheValues<TThis>(this: TThis, obj: Partial<TThis>): void;\n  getEventState: typeof Events.getEventState;\n  renderData(props: TProps, shouldRenderDatum?: () => boolean);\n  renderContinuousData(props: TProps);\n  animateComponent(\n    props: TProps,\n    defaultAnimationWhitelist: string[],\n  ): React.ReactElement;\n  getComponentProps(\n    component: React.ReactNode,\n    type: string,\n    index: string | number,\n  ): TProps;\n  dataKeys: string[];\n}\n\n/**\n * These fields are calculated by the Mixin\n */\nexport interface EventMixinCalculatedValues {\n  componentEvents: Array<ComponentEvent>;\n  getSharedEventState: (key: string, value: string) => unknown;\n  baseProps: Record<string, object>;\n  dataKeys: string[];\n  hasEvents: unknown;\n  events: unknown;\n}\n\n/**\n * These are the common roles that we care about internally.\n */\nexport type VictoryComponentCommonRole =\n  | \"container\"\n  | \"group\"\n  | \"histogram\"\n  | \"label\"\n  | \"line\"\n  | \"portal\"\n  | \"stack\"\n  | \"tooltip\"\n  | \"voronoi\";\n\n/**\n * A component can have any \"role\",\n * but there are certain ones that we actually care about internally\n */\nexport type VictoryComponentRole = VictoryComponentCommonRole | string;\n\n/**\n * Static component fields used by Victory for common behavior\n */\nexport interface VictoryComponentConfiguration<TProps> {\n  getBaseProps?(props: TProps): EventMixinCalculatedValues[\"baseProps\"];\n  role?: VictoryComponentRole;\n  expectedComponents?: Array<keyof TProps | string>;\n  getChildren?: (\n    props: TProps,\n    childComponents?: Array<React.ReactNode>,\n    calculatedProps?: TProps,\n  ) => void;\n  animationWhitelist?: Array<keyof TProps | string>;\n}\n\n/**\n * This represents the class itself, including static fields\n */\nexport interface WrappedComponentClass<TProps>\n  extends VictoryComponentConfiguration<TProps> {\n  new (props: TProps): React.Component<TProps>;\n}\n\nexport function addEvents<\n  TBase extends WrappedComponentClass<TProps>,\n  TProps extends EventMixinCommonProps,\n>(WrappedComponent: TBase, options: MixinOptions = {}) {\n  // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n  interface AddEventsMixin extends EventMixinCalculatedValues {}\n\n  // @ts-expect-error \"TS2545: A mixin class must have a constructor with a single rest parameter of type 'any[]'.\"\n  class AddEventsMixin\n    extends WrappedComponent\n    implements EventsMixinClass<TProps>\n  {\n    constructor(props: TProps) {\n      super(props);\n\n      this.cacheValues(this.getCalculatedValues(props));\n    }\n    state = {};\n    getEventState = Events.getEventState.bind(this);\n    getScopedEvents = Events.getScopedEvents.bind(this);\n    getEvents = (p, target, eventKey) => {\n      return Events.getEvents.call(\n        this,\n        p,\n        target,\n        eventKey,\n        this.getScopedEvents,\n      );\n    };\n    externalMutations = this.getExternalMutations(this.props);\n    calculatedState = this.getStateChanges(this.props);\n    globalEvents = {};\n    prevGlobalEventKeys: string[] = [];\n    boundGlobalEvents = {};\n\n    shouldComponentUpdate(nextProps: TProps) {\n      const externalMutations = this.getExternalMutations(nextProps);\n      // @ts-expect-error \"Property 'animating' does not exist on type EventMixinCommonProps\"\n      const animating = this.props.animating || this.props.animate;\n      const newMutation = !isEqual(externalMutations, this.externalMutations);\n      if (animating || newMutation) {\n        this.cacheValues(this.getCalculatedValues(nextProps));\n        this.externalMutations = externalMutations;\n        this.applyExternalMutations(nextProps, externalMutations);\n        return true;\n      }\n      const calculatedState = this.getStateChanges(nextProps);\n      if (!isEqual(this.calculatedState, calculatedState)) {\n        this.cacheValues(this.getCalculatedValues(nextProps));\n        return true;\n      }\n      if (!isEqual(this.props, nextProps)) {\n        this.cacheValues(this.getCalculatedValues(nextProps));\n        return true;\n      }\n      return false;\n    }\n\n    componentDidMount() {\n      const globalEventKeys = Object.keys(this.globalEvents);\n      globalEventKeys.forEach((key) => this.addGlobalListener(key));\n      this.prevGlobalEventKeys = globalEventKeys;\n    }\n\n    componentDidUpdate(prevProps) {\n      const calculatedState = this.getStateChanges(prevProps);\n      this.calculatedState = calculatedState;\n      const globalEventKeys = Object.keys(this.globalEvents);\n      const removedGlobalEventKeys = difference(\n        this.prevGlobalEventKeys,\n        globalEventKeys,\n      );\n      removedGlobalEventKeys.forEach((key) => this.removeGlobalListener(key));\n      const addedGlobalEventKeys = difference(\n        globalEventKeys,\n        this.prevGlobalEventKeys,\n      );\n      addedGlobalEventKeys.forEach((key) => this.addGlobalListener(key));\n      this.prevGlobalEventKeys = globalEventKeys;\n    }\n\n    componentWillUnmount() {\n      this.prevGlobalEventKeys.forEach((key) => this.removeGlobalListener(key));\n    }\n\n    addGlobalListener(key) {\n      const boundListener = (event) => {\n        const listener = this.globalEvents[key];\n        return listener && listener(Events.emulateReactEvent(event));\n      };\n      this.boundGlobalEvents[key] = boundListener;\n      window.addEventListener(\n        Events.getGlobalEventNameFromKey(key),\n        boundListener,\n      );\n    }\n\n    removeGlobalListener(key) {\n      window.removeEventListener(\n        Events.getGlobalEventNameFromKey(key),\n        this.boundGlobalEvents[key],\n      );\n    }\n\n    // compile all state changes from own and parent state. Order doesn't matter, as any state\n    // state change should trigger a re-render\n    getStateChanges(props) {\n      if (!this.hasEvents) {\n        return {};\n      }\n\n      const getState = (key, type) => {\n        const result = defaults(\n          {},\n          this.getEventState(key, type),\n          this.getSharedEventState(key, type),\n        );\n        return isEmpty(result) ? undefined : result;\n      };\n\n      const components = options.components || defaultComponents;\n      const stateChanges = components\n        .map((component) => {\n          if (!props.standalone && component.name === \"parent\") {\n            // don't check for changes on parent props for non-standalone components\n            return undefined;\n          }\n          return component.index !== undefined\n            ? getState(component.index, component.name)\n            : this.dataKeys\n                .map((key) => getState(key, component.name))\n                .filter(Boolean);\n        })\n        .filter(Boolean);\n      return stateChanges;\n    }\n\n    applyExternalMutations(props, externalMutations) {\n      if (!isEmpty(externalMutations)) {\n        const callbacks = props.externalEventMutations.reduce(\n          (memo, mutation) =>\n            isFunction(mutation.callback)\n              ? memo.concat(mutation.callback)\n              : memo,\n          [] as Array<() => void>,\n        );\n        const compiledCallbacks = callbacks.length\n          ? () => {\n              callbacks.forEach((c) => c());\n            }\n          : undefined;\n        this.setState(externalMutations, compiledCallbacks);\n      }\n    }\n\n    getCalculatedValues(props): EventMixinCalculatedValues {\n      const { sharedEvents } = props;\n      const components = WrappedComponent.expectedComponents;\n      const componentEvents = Events.getComponentEvents(props, components);\n      const getSharedEventState =\n        sharedEvents && isFunction(sharedEvents.getEventState)\n          ? sharedEvents.getEventState\n          : () => undefined;\n      const baseProps = this.getBaseProps(props, getSharedEventState);\n      const dataKeys = Object.keys(baseProps).filter((key) => key !== \"parent\");\n      const hasEvents = props.events || props.sharedEvents || componentEvents;\n      const events = this.getAllEvents(props);\n      return {\n        componentEvents,\n        getSharedEventState,\n        baseProps,\n        dataKeys,\n        hasEvents,\n        events,\n      };\n    }\n\n    getExternalMutations(props: TProps) {\n      const { sharedEvents, externalEventMutations } = props;\n      return isEmpty(externalEventMutations) || sharedEvents\n        ? undefined\n        : Events.getExternalMutations(\n            externalEventMutations,\n            this.baseProps,\n            this.state,\n          );\n    }\n\n    cacheValues(obj) {\n      Object.keys(obj).forEach((key) => {\n        this[key] = obj[key];\n      });\n    }\n\n    getBaseProps(props, getSharedEventState): this[\"baseProps\"] {\n      const getSharedEventStateFunction =\n        getSharedEventState || this.getSharedEventState.bind(this);\n      const sharedParentState = getSharedEventStateFunction(\"parent\", \"parent\");\n      const parentState = this.getEventState(\"parent\", \"parent\");\n      const baseParentProps = defaults({}, parentState, sharedParentState);\n      const parentPropsList = baseParentProps.parentControlledProps;\n      const parentProps = parentPropsList\n        ? pick(baseParentProps, parentPropsList)\n        : {};\n      const modifiedProps = defaults({}, parentProps, props);\n\n      return typeof WrappedComponent.getBaseProps === \"function\"\n        ? WrappedComponent.getBaseProps(modifiedProps)\n        : {};\n    }\n\n    getAllEvents(props) {\n      if (Array.isArray(this.componentEvents)) {\n        return Array.isArray(props.events)\n          ? this.componentEvents.concat(...props.events)\n          : this.componentEvents;\n      }\n      return props.events;\n    }\n\n    getComponentProps(\n      component: React.ReactNode,\n      type: string,\n      index: string | number,\n    ) {\n      const name = this.props.name || WrappedComponent.role;\n      const key = (this.dataKeys && this.dataKeys[index]) || index;\n      const id = `${name}-${type}-${key}`;\n\n      const baseProps =\n        (this.baseProps[key] && this.baseProps[key][type]) ||\n        this.baseProps[key];\n\n      if (!baseProps && !this.hasEvents) {\n        return undefined;\n      }\n\n      const currentProps =\n        component && typeof component === \"object\" && \"props\" in component\n          ? component.props\n          : undefined;\n\n      if (this.hasEvents) {\n        const baseEvents = this.getEvents(this.props, type, key);\n        const componentProps = defaults(\n          { index, key: id },\n          this.getEventState(key, type),\n          this.getSharedEventState(key, type),\n          currentProps,\n          baseProps,\n          { id },\n        );\n\n        const events = defaults(\n          {},\n          Events.getPartialEvents(baseEvents, key, componentProps),\n          componentProps.events,\n        );\n\n        return Object.assign({}, componentProps, { events });\n      }\n\n      return defaults({ index, key: id }, currentProps, baseProps, { id });\n    }\n\n    renderContainer(component, children) {\n      const isContainer = component.type && component.type.role === \"container\";\n      const parentProps = isContainer\n        ? this.getComponentProps(component, \"parent\", \"parent\")\n        : {};\n\n      if (parentProps.events) {\n        this.globalEvents = Events.getGlobalEvents(parentProps.events);\n        parentProps.events = Events.omitGlobalEvents(parentProps.events);\n      }\n\n      return React.cloneElement(component, parentProps, children);\n    }\n\n    animateComponent(\n      props: TProps,\n      defaultAnimationWhitelist: string[],\n    ): React.ReactElement {\n      const animationWhitelist =\n        (typeof props.animate === \"object\" &&\n          props.animate?.animationWhitelist) ||\n        defaultAnimationWhitelist;\n\n      const Comp = this.constructor;\n\n      return (\n        <VictoryTransition\n          animate={props.animate}\n          animationWhitelist={animationWhitelist}\n        >\n          <Comp {...props} />\n        </VictoryTransition>\n      );\n    }\n\n    // Used by `VictoryLine` and `VictoryArea`\n    renderContinuousData(props: TProps) {\n      const { dataComponent, labelComponent, groupComponent } = props;\n      const dataKeys = this.dataKeys.filter((value) => value !== \"all\");\n      const labelComponents = dataKeys.reduce((memo, key) => {\n        let newMemo = memo;\n        const labelProps = this.getComponentProps(\n          labelComponent,\n          \"labels\",\n          key,\n        );\n        if (\n          labelProps &&\n          labelProps.text !== undefined &&\n          labelProps.text !== null\n        ) {\n          newMemo = newMemo.concat(\n            React.cloneElement(labelComponent!, labelProps),\n          );\n        }\n        return newMemo;\n      }, [] as React.ReactElement[]);\n\n      const dataProps = this.getComponentProps(dataComponent, \"data\", \"all\");\n      const children = [\n        React.cloneElement(dataComponent!, dataProps),\n        ...labelComponents,\n      ];\n      return this.renderContainer(groupComponent, children);\n    }\n\n    renderData(props, shouldRenderDatum = datumHasXandY) {\n      const { dataComponent, labelComponent, groupComponent } = props;\n      const dataComponents = this.dataKeys.reduce(\n        (validDataComponents, _dataKey, index) => {\n          const dataProps = this.getComponentProps(\n            dataComponent,\n            \"data\",\n            index,\n          );\n          if (shouldRenderDatum(dataProps.datum)) {\n            validDataComponents.push(\n              React.cloneElement(dataComponent, dataProps),\n            );\n          }\n          return validDataComponents;\n        },\n        [] as React.ReactElement[],\n      );\n\n      const labelComponents = this.dataKeys\n        .map((_dataKey, index) => {\n          const labelProps = this.getComponentProps(\n            labelComponent,\n            \"labels\",\n            index,\n          );\n          if (labelProps.text !== undefined && labelProps.text !== null) {\n            return React.cloneElement(labelComponent, labelProps);\n          }\n          return undefined;\n        })\n        .filter(Boolean);\n\n      const children = [...dataComponents, ...labelComponents];\n      return this.renderContainer(groupComponent, children);\n    }\n  }\n\n  return AddEventsMixin;\n}\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/axis.test.tsx",
    "content": "/* eslint-disable react/no-multi-comp */\nimport React from \"react\";\n\nimport * as Axis from \"./axis\";\nimport * as Scale from \"./scale\";\n\ndescribe(\"helpers/axis\", () => {\n  describe(\"isVertical\", () => {\n    it(\"returns true when the orientation is vertical\", () => {\n      const props = { orientation: \"left\" };\n      const verticalResult = Axis.isVertical(props);\n      expect(verticalResult).toEqual(true);\n    });\n\n    it(\"returns false when the orientation is horizontal\", () => {\n      const props = { orientation: \"bottom\" };\n      const verticalResult = Axis.isVertical(props);\n      expect(verticalResult).toEqual(false);\n    });\n  });\n\n  describe(\"getDomain\", () => {\n    it(\"determines a domain from tickValues\", () => {\n      const props = { tickValues: [1, 2, 3] };\n      const domainResult = Axis.getDomain(props);\n      expect(domainResult).toEqual([1, 3]);\n    });\n\n    it(\"determines a domain from string tick values\", () => {\n      const props = { tickValues: [\"a\", \"b\", \"c\", \"d\"] };\n      const domainResult = Axis.getDomain(props);\n      expect(domainResult).toEqual([1, 4]);\n    });\n\n    it(\"reverses a domain from tickValues when the axis is vertical\", () => {\n      const props = { tickValues: [1, 2, 3], dependentAxis: true };\n      const domainResult = Axis.getDomain(props);\n      expect(domainResult).toEqual([3, 1]);\n    });\n\n    it(\"determines a domain from props\", () => {\n      const props = { domain: [1, 2] };\n      const domainResult = Axis.getDomain(props);\n      expect(domainResult).toEqual([1, 2]);\n    });\n\n    it(\"calculates a domain from a single tickValue\", () => {\n      const props = { tickValues: [1] };\n      const domainResult = Axis.getDomain(props);\n      const verySmallNumber = Math.pow(10, -10);\n      expect(domainResult).toEqual([1 - verySmallNumber, 1 + verySmallNumber]);\n    });\n\n    it(\"returns undefined if the given axis doesn't match this axis\", () => {\n      const props = { domain: [1, 3] };\n      const domainResultX = Axis.getDomain(props, \"x\");\n      expect(domainResultX).toEqual([1, 3]);\n      const domainResultY = Axis.getDomain(props, \"y\");\n      expect(domainResultY).toBeUndefined();\n    });\n  });\n\n  describe(\"getAxis\", () => {\n    it(\"determines the axis based on type (dependent / independent)\", () => {\n      expect(Axis.getAxis({ dependentAxis: true })).toEqual(\"y\");\n      expect(Axis.getAxis({})).toEqual(\"x\");\n    });\n  });\n\n  describe(\"getAxisComponent\", () => {\n    const MockVictoryAxis = (props) => <div {...props} />;\n    MockVictoryAxis.getAxis = (props) => (props.dependentAxis ? \"y\" : \"x\");\n    MockVictoryAxis.role = \"axis\";\n\n    const MockVictoryBar = (props) => <div {...props} />;\n\n    const dependentAxis = <MockVictoryAxis dependentAxis />;\n    const independentAxis = <MockVictoryAxis dependentAxis={false} />;\n    const bar = <MockVictoryBar />;\n\n    beforeEach(() => {\n      jest.spyOn(dependentAxis.type, \"getAxis\");\n    });\n\n    afterEach(() => {\n      jest.clearAllMocks();\n    });\n\n    it(\"returns the independent axis when called with 'x'\", () => {\n      const childComponents = [dependentAxis, independentAxis, bar];\n      const componentResult = Axis.getAxisComponent(childComponents, \"x\");\n      expect(dependentAxis.type.getAxis).toBeCalledWith(dependentAxis.props);\n      expect(independentAxis.type.getAxis).toBeCalledWith(\n        independentAxis.props,\n      );\n      expect(componentResult).toEqual(independentAxis);\n    });\n  });\n\n  describe(\"getTickFormat\", () => {\n    const scale = Scale.getBaseScale({ scale: { x: \"linear\" } }, \"x\");\n    const ticks = [1, 2, 3, 4, 5];\n    beforeEach(() => {\n      jest.spyOn(scale, \"tickFormat\");\n    });\n\n    afterEach(() => {\n      jest.clearAllMocks();\n    });\n\n    it(\"returns tickFormat function from props\", () => {\n      const props = { tickFormat: (x) => x * 5 };\n      const tickProps = { scale, ticks };\n      const formatResult = Axis.getTickFormat(props, tickProps);\n      expect(scale.tickFormat).not.toHaveBeenCalled();\n      expect(formatResult).toEqual(props.tickFormat);\n    });\n\n    it(\"converts tickFormat array from props to a function\", () => {\n      const props = { tickFormat: [1, 2, 3, 4, 5] };\n      const tickProps = { scale, ticks };\n      const formatResult = Axis.getTickFormat(props, tickProps);\n      expect(scale.tickFormat).not.toHaveBeenCalled();\n      expect(formatResult).toBeInstanceOf(Function);\n    });\n\n    it(\"converts tickFormat string array from props to a function\", () => {\n      const props = { tickValues: [\"cats\", \"dogs\", \"birds\"] };\n      const tickProps = { scale, ticks };\n      const formatResult = Axis.getTickFormat(props, tickProps);\n      expect(scale.tickFormat).not.toHaveBeenCalled();\n      expect(formatResult).toBeInstanceOf(Function);\n    });\n\n    it(\"calculates a tick format from scale\", () => {\n      const props = {};\n      const tickProps = { scale, ticks };\n      const formatResult = Axis.getTickFormat(props, tickProps);\n      expect(formatResult).toBeInstanceOf(Function);\n    });\n  });\n\n  describe(\"getTicks\", () => {\n    const scale = Scale.getBaseScale({ scale: { x: \"linear\" } }, \"x\");\n    beforeEach(() => {\n      jest.spyOn(scale, \"ticks\");\n    });\n\n    afterEach(() => {\n      jest.clearAllMocks();\n    });\n\n    it(\"returns tickValues from props\", () => {\n      const props = { tickValues: [1, 2, 3] };\n      const tickResult = Axis.getTicks(props, scale);\n      expect(tickResult).toEqual(props.tickValues);\n    });\n\n    it(\"returns converts string tickValues to numbers\", () => {\n      const props = { tickValues: [\"a\", \"b\", \"c\", \"d\"] };\n      const tickResult = Axis.getTicks(props, scale);\n      expect(tickResult).toEqual([1, 2, 3, 4]);\n    });\n\n    it(\"calculates tickValues from scale.ticks()\", () => {\n      const props = { tickCount: 5 };\n      Axis.getTicks(props, scale);\n      expect(scale.ticks).toBeCalledWith(5);\n    });\n\n    // TODO: This is failing, but I'm not sure whether it's an issue with the test or the code\n    it.skip(\"calculates tickValues from scale.ticks(), and removes zero if axes cross\", () => {\n      const props = { tickCount: 5, crossAxis: true };\n      const tickResult = Axis.getTicks(props, scale);\n      expect(scale.ticks).toBeCalledWith(5);\n      expect(tickResult).not.toContain(0);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/axis.tsx",
    "content": "import React from \"react\";\nimport defaults from \"lodash/defaults\";\nimport isObject from \"lodash/isObject\";\nimport uniq from \"lodash/uniq\";\nimport orderBy from \"lodash/orderBy\";\n\nimport * as Collection from \"./collection\";\nimport * as Domain from \"./domain\";\nimport * as Helpers from \"./helpers\";\nimport { D3Scale } from \"../types/prop-types\";\n\n/**\n * Returns the first argument it receives\n * @param value The value to return\n * @returns The value given\n */\nfunction identity<T>(value: T): T {\n  return value;\n}\n\n/**\n * Returns the axis (x or y) of a particular axis component\n * @param {Object} props: the props object.\n * @param {Boolean} horizontal: true for horizontal charts\n * @returns {String} the dimension appropriate for the axis given its props\n */\nexport function getAxis(props) {\n  const { dependentAxis } = props;\n  return dependentAxis ? \"y\" : \"x\";\n}\n\n/**\n * Returns all axis components that pass a given predicate\n * @param {Array} childComponents: an array of children\n * @param {Function} predicate: a predicate function that will be called with each\n * @returns {Array} all axis components that pass the given predicate or []\n */\nexport function findAxisComponents(childComponents, predicate?) {\n  const predicateFunction = predicate || identity;\n  const findAxes = (children) => {\n    return children.reduce((memo, child) => {\n      if (\n        child.type &&\n        child.type.role === \"axis\" &&\n        predicateFunction(child)\n      ) {\n        return memo.concat(child);\n      } else if (child.props && child.props.children) {\n        return memo.concat(\n          findAxes(React.Children.toArray(child.props.children)),\n        );\n      }\n      return memo;\n    }, []);\n  };\n\n  return findAxes(childComponents);\n}\n\n/**\n * Returns a single axis component of the desired axis type (x or y)\n * @param {Array} childComponents: an array of children\n * @param {String} axis: desired axis either \"x\" or \"y\".\n * @returns {ReactComponent} an axis component of the desired axis or undefined\n */\nexport function getAxisComponent(childComponents, axis) {\n  const matchesAxis = (component) => {\n    const type = component.type.getAxis(component.props);\n    return type === axis;\n  };\n  return findAxisComponents(childComponents, matchesAxis)[0];\n}\n\n/**\n * Returns all axis components of the desired axis type (x or y) along with any\n * parent components excluding VictoryChart\n * @param {Array} childComponents: an optional array of children.\n * @param {String} type: desired axis either \"dependent\" or \"independent\".\n * @returns {ReactComponent} an axis component of the desired type or undefined\n */\nexport function getAxisComponentsWithParent(childComponents, type) {\n  const matchesType = (child) => {\n    return type === \"dependent\"\n      ? child.props.dependentAxis\n      : !child.props.dependentAxis;\n  };\n\n  const findComponents = (children) => {\n    return children.reduce((memo, child) => {\n      if (child.type && child.type.role === \"axis\" && matchesType(child)) {\n        return memo.concat(child);\n      } else if (child.props && child.props.children) {\n        const childAxis = findComponents(\n          React.Children.toArray(child.props.children),\n        );\n        return childAxis.length > 0 ? memo.concat(child) : memo;\n      }\n      return memo;\n    }, []);\n  };\n\n  return findComponents(childComponents);\n}\n\nexport function getOrigin(domain) {\n  const getSingleOrigin = (d) => {\n    const domainMin = Math.min(...d);\n    const domainMax = Math.max(...d);\n    return domainMax < 0 ? domainMax : Math.max(0, domainMin);\n  };\n\n  return {\n    x: Collection.containsDates(domain.x)\n      ? new Date(Math.min(...domain.x))\n      : getSingleOrigin(domain.x),\n    y: Collection.containsDates(domain.y)\n      ? new Date(Math.min(...domain.y))\n      : getSingleOrigin(domain.y),\n  };\n}\n\nexport function getOriginSign(origin, domain) {\n  const getSign = () => {\n    return origin <= 0 && Math.max(...domain) <= 0 ? \"negative\" : \"positive\";\n  };\n  return Collection.containsDates(domain) ? \"positive\" : getSign();\n}\n\n/**\n * @param {Object} props: axis component props\n * @returns {Boolean} true when the axis is vertical\n */\nexport function isVertical(props) {\n  const orientation =\n    props.orientation || (props.dependentAxis ? \"left\" : \"bottom\");\n  const vertical = { top: false, bottom: false, left: true, right: true };\n  return vertical[orientation];\n}\n\n/**\n * @param {Object} props: axis component props\n * @returns {Boolean} true when tickValues contain strings\n */\nexport function stringTicks(props) {\n  return (\n    props.tickValues !== undefined &&\n    Collection.containsStrings(props.tickValues)\n  );\n}\n\nfunction getDefaultTickFormat(props) {\n  const { tickValues } = props;\n  const axis = getAxis(props);\n  const stringMap = props.stringMap && props.stringMap[axis];\n  const fallbackFormat =\n    tickValues && !Collection.containsDates(tickValues) ? (x) => x : undefined;\n  if (!stringMap) {\n    return stringTicks(props)\n      ? (x, index) => tickValues[index]\n      : fallbackFormat;\n  }\n  const invertedStringMap = stringMap && Helpers.invert(stringMap);\n  const tickValueArray = orderBy(Object.values(stringMap), (n) => n);\n  const dataNames = tickValueArray.map((tick: any) => invertedStringMap[tick]);\n  // string ticks should have one tick of padding at the beginning\n  const dataTicks = [\"\", ...dataNames, \"\"];\n  return (x) => dataTicks[x];\n}\n\nfunction getStringTicks(props) {\n  const axis = getAxis(props);\n  const stringMap = props.stringMap && props.stringMap[axis];\n  const categories = Array.isArray(props.categories)\n    ? props.categories\n    : props.categories && props.categories[axis];\n  const ticksFromCategories =\n    categories && Collection.containsOnlyStrings(categories)\n      ? categories.map((tick) => stringMap[tick])\n      : undefined;\n  const ticksFromStringMap = stringMap && Object.values(stringMap);\n  return ticksFromCategories && ticksFromCategories.length !== 0\n    ? ticksFromCategories\n    : ticksFromStringMap;\n}\n\nfunction getTickArray(props) {\n  const { tickValues, tickFormat } = props;\n\n  if (tickValues?.length === 0) {\n    return [];\n  }\n\n  const axis = getAxis(props);\n  const stringMap = props.stringMap && props.stringMap[axis];\n  const getTicksFromFormat = () => {\n    if (!tickFormat || !Array.isArray(tickFormat)) {\n      return undefined;\n    }\n    return Collection.containsStrings(tickFormat)\n      ? tickFormat.map((t, i) => i)\n      : tickFormat;\n  };\n\n  let ticks = tickValues;\n  if (stringMap) {\n    ticks = getStringTicks(props);\n  }\n  if (tickValues && Collection.containsStrings(tickValues)) {\n    ticks = stringMap\n      ? tickValues.map((tick) => stringMap[tick])\n      : Helpers.range(1, tickValues.length + 1);\n  }\n  const tickArray = ticks ? uniq(ticks) : getTicksFromFormat();\n  const buildTickArray = (arr: number[]) => {\n    const newTickArray = [] as Array<{ value: number; index: number }>;\n    const domain = (props.domain && props.domain[axis]) || props.domain;\n    if (arr) {\n      arr.forEach((t, index) => {\n        if (Array.isArray(domain)) {\n          if (\n            t >= Collection.getMinValue(domain).valueOf() &&\n            t <= Collection.getMaxValue(domain).valueOf()\n          ) {\n            newTickArray.push({\n              value: t,\n              index,\n            });\n          }\n        } else {\n          newTickArray.push({\n            value: t,\n            index,\n          });\n        }\n      });\n      return newTickArray;\n    }\n    return undefined;\n  };\n  return Array.isArray(tickArray) && tickArray.length\n    ? buildTickArray(tickArray)\n    : undefined;\n}\n\nexport function getTickFormat(props, scale) {\n  const { tickFormat } = props;\n  const axis = getAxis(props);\n  const stringMap = props.stringMap && props.stringMap[axis];\n  if (!tickFormat) {\n    const defaultTickFormat = getDefaultTickFormat(props);\n    // If there is no user-provided tick format, we use d3's tickFormat function\n    // by default. This changed the default formatting for some scale types when\n    // we upgraded to d3-scale@4..\n    const scaleTickFormat =\n      scale.tickFormat && Helpers.isFunction(scale.tickFormat)\n        ? scale.tickFormat()\n        : (x) => x;\n    return defaultTickFormat || scaleTickFormat;\n  } else if (tickFormat && Array.isArray(tickFormat)) {\n    const tickArray = getTickArray(props);\n    const tickArrayIndices = tickArray?.map((v) => v.index);\n    const filteredTickFormat = tickFormat.filter((t, index) =>\n      tickArrayIndices?.includes(index),\n    );\n    return (x, index) => filteredTickFormat[index];\n  } else if (tickFormat && Helpers.isFunction(tickFormat)) {\n    const applyStringTicks = (tick, index, ticks) => {\n      const invertedStringMap = Helpers.invert(stringMap);\n      const stringTickArray = ticks.map((t) => invertedStringMap[t]);\n      return props.tickFormat(invertedStringMap[tick], index, stringTickArray);\n    };\n    return stringMap ? applyStringTicks : tickFormat;\n  }\n  return (x) => x;\n}\n\nfunction downsampleTicks(ticks: number[], tickCount: number) {\n  if (!tickCount || !Array.isArray(ticks) || ticks.length <= tickCount) {\n    return ticks;\n  }\n  const k = Math.floor(ticks.length / tickCount);\n  return ticks.filter((d, i) => i % k === 0);\n}\n\nexport function getTicks(props, scale: D3Scale, filterZero = false) {\n  const { tickCount } = props;\n  const tickArray = getTickArray(props);\n\n  if (tickArray?.length === 0) {\n    return [\"\"];\n  }\n\n  const tickValues = tickArray ? tickArray.map((v) => v.value) : undefined;\n  if (tickValues) {\n    return downsampleTicks(tickValues, tickCount);\n  } else if (scale.ticks && Helpers.isFunction(scale.ticks)) {\n    // eslint-disable-next-line no-magic-numbers\n    const defaultTickCount = tickCount || 5;\n    const scaleTicks = scale.ticks(defaultTickCount);\n    const scaledTickArray =\n      Array.isArray(scaleTicks) && scaleTicks.length\n        ? scaleTicks\n        : scale.domain();\n    const ticks = downsampleTicks(scaledTickArray, tickCount);\n    if (filterZero) {\n      const filteredTicks = ticks.filter((value) => value !== 0);\n      return filteredTicks.length ? filteredTicks : ticks;\n    }\n    return ticks;\n  }\n  return scale.domain();\n}\n\n/**\n * Returns a domain based tickValues\n * @param {Object} props: the props object\n * @param {String} axis: either x or y\n * @returns {Array} returns a domain from tickValues\n */\n\nfunction getDomainFromData(props, axis) {\n  const { polar, startAngle = 0, endAngle = 360 } = props;\n  const tickArray = getTickArray(props);\n  const tickValues =\n    tickArray && tickArray?.length !== 0\n      ? tickArray.map((v) => v.value)\n      : undefined;\n  if (!Array.isArray(tickValues)) {\n    return undefined;\n  }\n  const minDomain = Domain.getMinFromProps(props, axis);\n  const maxDomain = Domain.getMaxFromProps(props, axis);\n  const tickStrings = stringTicks(props);\n  const ticks = tickValues.map((value) => Number(value));\n  const defaultMin = tickStrings ? 1 : Collection.getMinValue(ticks);\n  const defaultMax = tickStrings\n    ? tickValues.length\n    : Collection.getMaxValue(ticks);\n  const min = minDomain !== undefined ? minDomain : defaultMin;\n  const max = maxDomain !== undefined ? maxDomain : defaultMax;\n  const initialDomain = Domain.getDomainFromMinMax(min, max);\n  const domain =\n    polar && axis === \"x\" && Math.abs(startAngle - endAngle) === 360\n      ? Domain.getSymmetricDomain(initialDomain, ticks)\n      : initialDomain;\n  if (isVertical(props) && !polar) {\n    domain.reverse();\n  }\n  return domain;\n}\n\n// exposed for use by VictoryChart\nexport function getDomain(props, axis?) {\n  const inherentAxis = getAxis(props);\n  if (axis && axis !== inherentAxis) {\n    return undefined;\n  }\n  return Domain.createDomainFunction(getDomainFromData)(props, inherentAxis);\n}\n\nexport function getAxisValue(props, axis) {\n  if (!props.axisValue) {\n    return undefined;\n  }\n  const scaleAxis = axis === \"x\" ? \"y\" : \"x\";\n  const scale =\n    isObject(props.scale) && Helpers.isFunction(props.scale[scaleAxis])\n      ? props.scale[scaleAxis]\n      : undefined;\n  if (!scale) {\n    return undefined;\n  }\n  const stringMapAxis = axis === \"x\" ? \"y\" : \"x\";\n  const stringMap = isObject(props.stringMap) && props.stringMap[stringMapAxis];\n  const axisValue =\n    stringMap && typeof props.axisValue === \"string\"\n      ? stringMap[props.axisValue]\n      : props.axisValue;\n  return scale(axisValue);\n}\n\nexport function modifyProps(props, fallbackProps) {\n  if (!isObject(props.theme)) {\n    return Helpers.modifyProps(props, fallbackProps, \"axis\");\n  }\n  let role = \"axis\";\n  if (props.dependentAxis && props.theme.dependentAxis) {\n    role = \"dependentAxis\";\n  } else if (!props.dependentAxis && props.theme.independentAxis) {\n    role = \"independentAxis\";\n  }\n  if (role === \"axis\") {\n    return Helpers.modifyProps(props, fallbackProps, \"axis\");\n  }\n  const axisTheme = defaults({}, props.theme[role], props.theme.axis);\n  const theme = Object.assign({}, props.theme, { axis: axisTheme });\n  return Helpers.modifyProps(\n    Object.assign({}, props, { theme }),\n    fallbackProps,\n    \"axis\",\n  );\n}\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/collection.test.ts",
    "content": "import * as Collection from \"./collection\";\n\ndescribe(\"victory-util/collection\", () => {\n  describe(\"containsStrings\", () => {\n    it(\"handles empty argument\", () => {\n      // @ts-expect-error \"Method expects 1 argument\"\n      expect(Collection.containsStrings()).toEqual(false);\n    });\n\n    it(\"handles empty array\", () => {\n      expect(Collection.containsStrings([])).toEqual(false);\n    });\n\n    it(\"returns false for collections of non-strings\", () => {\n      expect(Collection.containsStrings([0, 1])).toEqual(false);\n      expect(Collection.containsStrings([undefined, null, NaN])).toEqual(false);\n      expect(Collection.containsStrings([{}, { a: \"foo\" }])).toEqual(false);\n    });\n\n    it(\"returns false for collections with strings\", () => {\n      expect(Collection.containsStrings([\"hello\"])).toEqual(true);\n      expect(Collection.containsStrings([\"hello\", \"there\"])).toEqual(true);\n      expect(Collection.containsStrings([0, \"hello\", {}, null])).toEqual(true);\n    });\n  });\n\n  describe(\"containsOnlyStrings\", () => {\n    it(\"handles empty argument\", () => {\n      // @ts-expect-error \"Method expects 1 argument\"\n      expect(Collection.containsOnlyStrings()).toEqual(false);\n    });\n\n    it(\"handles empty array\", () => {\n      expect(Collection.containsOnlyStrings([])).toEqual(false);\n    });\n\n    it(\"returns false for collections of non-strings\", () => {\n      expect(Collection.containsOnlyStrings([0, 1])).toEqual(false);\n      expect(Collection.containsOnlyStrings([undefined, null, NaN])).toEqual(\n        false,\n      );\n      expect(Collection.containsOnlyStrings([{}, { a: \"foo\" }])).toEqual(false);\n    });\n\n    it(\"returns false for collections with some strings\", () => {\n      expect(Collection.containsOnlyStrings([\"hello\", 0])).toEqual(false);\n      expect(Collection.containsOnlyStrings([\"hello\", [\"not me\"]])).toEqual(\n        false,\n      );\n      expect(Collection.containsOnlyStrings([0, \"hello\", {}, null])).toEqual(\n        false,\n      );\n    });\n\n    it(\"returns true for collections with only strings\", () => {\n      expect(Collection.containsOnlyStrings([\"hello\"])).toEqual(true);\n      expect(Collection.containsOnlyStrings([\"hello\", \"there\"])).toEqual(true);\n    });\n  });\n\n  describe(\"difference\", () => {\n    it(\"handles empty arguments\", () => {\n      // @ts-expect-error \"Method expects 2 arguments\"\n      expect(Collection.difference()).toEqual([]);\n    });\n\n    it(\"handles empty arrays\", () => {\n      expect(Collection.difference([], [])).toEqual([]);\n    });\n\n    it(\"returns an empty array if there are no differences\", () => {\n      expect(Collection.difference([1, 2], [1, 2])).toEqual([]);\n    });\n\n    it(\"returns the difference between two arrays\", () => {\n      expect(Collection.difference([1, 2], [2, 3])).toEqual([1]);\n    });\n\n    it(\"returns the difference between two unequal arrays\", () => {\n      expect(Collection.difference([1, 2, 3, 4, 5], [5, 2, 10])).toEqual([\n        1, 3, 4,\n      ]);\n    });\n  });\n\n  describe(\"isArrayOfArrays\", () => {\n    it(\"handles empty argument\", () => {\n      // @ts-expect-error \"Method expects 1 argument\"\n      expect(Collection.isArrayOfArrays()).toEqual(false);\n    });\n\n    it(\"handles empty array\", () => {\n      expect(Collection.isArrayOfArrays([])).toEqual(false);\n    });\n\n    it(\"returns false for collections of non-arrays\", () => {\n      expect(Collection.isArrayOfArrays([1])).toEqual(false);\n      expect(Collection.isArrayOfArrays([{}])).toEqual(false);\n      expect(Collection.isArrayOfArrays([\"a\"])).toEqual(false);\n    });\n\n    it(\"returns false for mixed collections\", () => {\n      expect(Collection.isArrayOfArrays([[], 1, {}])).toEqual(false);\n      expect(Collection.isArrayOfArrays([1, [], {}])).toEqual(false);\n      expect(Collection.isArrayOfArrays([1, {}, []])).toEqual(false);\n    });\n\n    it(\"returns true for collections of arrays\", () => {\n      expect(Collection.isArrayOfArrays([[]])).toEqual(true);\n      expect(Collection.isArrayOfArrays([[{}]])).toEqual(true);\n      expect(Collection.isArrayOfArrays([[[]]])).toEqual(true);\n      expect(Collection.isArrayOfArrays([[], []])).toEqual(true);\n    });\n  });\n\n  describe(\"removeUndefined\", () => {\n    it(\"handles empty array\", () => {\n      expect(Collection.removeUndefined([])).toEqual([]);\n    });\n\n    it(\"does not filter non-undefineds\", () => {\n      const testArray = [0, 1, \"a\", {}, false, null, NaN];\n      expect(Collection.removeUndefined(testArray)).toEqual(testArray);\n    });\n\n    it(\"filters out undefineds\", () => {\n      const testArray = [\n        undefined,\n        0,\n        undefined,\n        {},\n        false,\n        null,\n        NaN,\n        undefined,\n      ];\n      const expectedArray = [0, {}, false, null, NaN];\n      expect(Collection.removeUndefined(testArray)).toEqual(expectedArray);\n    });\n  });\n\n  describe(\"getMaxValue\", () => {\n    it(\"returns a date if array contains dates\", () => {\n      const array = [new Date(2016, 3, 6), new Date(2017, 5, 3), 10];\n      expect(Collection.getMaxValue(array)).toEqual(new Date(2017, 5, 3));\n    });\n\n    it(\"returns a number if array does not contain dates\", () => {\n      const array = [3, 8, 10];\n      expect(Collection.getMaxValue(array)).toEqual(10);\n    });\n\n    it(\"allows values to be concated and returns the appropriate number\", () => {\n      const array = [3, 8, 10];\n      expect(Collection.getMaxValue(array, 1, 20)).toEqual(20);\n    });\n  });\n\n  describe(\"getMinValue\", () => {\n    it(\"returns a date if array contains dates\", () => {\n      const array = [\n        new Date(2016, 3, 6),\n        new Date(2017, 5, 3),\n        new Date(2015, 11, 4),\n      ];\n      expect(Collection.getMinValue(array)).toEqual(new Date(2015, 11, 4));\n    });\n\n    it(\"returns a number if array does not contain dates\", () => {\n      const array = [3, 8, 10];\n      expect(Collection.getMinValue(array)).toEqual(3);\n    });\n\n    it(\"allows values to be concated and returns the appropriate number\", () => {\n      const array = [3, 8, 10];\n      expect(Collection.getMinValue(array, 1, 20)).toEqual(1);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/collection.tsx",
    "content": "function isNonEmptyArray<T>(\n  collection: Array<T> | unknown,\n): collection is Array<T> {\n  return Array.isArray(collection) && collection.length > 0;\n}\n\nexport function containsStrings<T>(collection: Array<T>) {\n  return (\n    Array.isArray(collection) &&\n    collection.some((value) => typeof value === \"string\")\n  );\n}\n\nexport function containsDates(collection: Array<number | Date>): boolean {\n  return (\n    Array.isArray(collection) &&\n    collection.some((value) => value instanceof Date)\n  );\n}\n\nexport function containsNumbers(collection) {\n  return (\n    Array.isArray(collection) &&\n    collection.some((value) => typeof value === \"number\")\n  );\n}\n\nexport function containsOnlyStrings(\n  collection: Array<string> | unknown,\n): collection is Array<string> {\n  return (\n    isNonEmptyArray(collection) &&\n    collection.every((value) => typeof value === \"string\")\n  );\n}\n\n/**\n * Creates an array of array values not included in the other given arrays\n * @param a The array to inspect\n * @param b The values to exclude\n * @returns The new array of filtered values\n */\nexport function difference<T>(a: Array<T>, b: Array<T>): Array<T> {\n  if (a && b) {\n    return a.filter((value) => !b.includes(value));\n  }\n  return [];\n}\n\nexport function isArrayOfArrays<T>(\n  collection: Array<T> | Array<Array<T>> | unknown,\n): collection is Array<Array<T>> {\n  return (\n    isNonEmptyArray(collection) &&\n    (collection as Array<Array<T>>).every(Array.isArray)\n  );\n}\n\nexport function removeUndefined(arr) {\n  return arr.filter((el) => el !== undefined);\n}\n\nexport function getMaxValue(\n  arr: Array<number | Date>,\n  ...values: Array<number | Date>\n): number | Date {\n  const array = arr.concat(values) as number[];\n  return containsDates(array)\n    ? new Date(Math.max(...array)) // Dates will be coerced to numbers\n    : Math.max(...array);\n}\n\nexport function getMinValue(\n  arr: Array<number | Date>,\n  ...values: Array<number | Date>\n): number | Date {\n  const array = arr.concat(values) as number[];\n  return containsDates(array)\n    ? new Date(Math.min(...array)) // Dates will be coerced to numbers\n    : Math.min(...array);\n}\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/common-props.tsx",
    "content": "import * as React from \"react\";\nimport { OriginType } from \"../victory-label/victory-label\";\nimport { PaddingProps, VictoryThemeDefinition } from \"../victory-theme/types\";\nimport {\n  AnimatePropTypeInterface,\n  CategoryPropType,\n  ColorScalePropType,\n  D3Scale,\n  DataGetterPropType,\n  DomainPaddingPropType,\n  DomainPropType,\n  EventCallbackInterface,\n  RangePropType,\n  ScalePropType,\n  SortOrderPropType,\n  StringOrNumberOrList,\n} from \"../types/prop-types\";\nimport { NumberOrCallback, StringOrCallback } from \"../types/callbacks\";\n\nexport interface VictoryDatableProps {\n  categories?: CategoryPropType;\n  data?: readonly any[];\n  dataComponent?: React.ReactElement;\n  domain?: DomainPropType;\n  domainPadding?: DomainPaddingPropType;\n  samples?: number;\n  sortKey?: DataGetterPropType;\n  sortOrder?: SortOrderPropType;\n  x?: DataGetterPropType;\n  y?: DataGetterPropType;\n  y0?: DataGetterPropType;\n}\nexport interface VictoryCommonThemeProps {\n  animate?: boolean | AnimatePropTypeInterface;\n  colorScale?: ColorScalePropType;\n  containerComponent?: React.ReactElement;\n  disableInlineStyles?: boolean;\n  domainPadding?: DomainPaddingPropType;\n  externalEventMutations?: EventCallbackInterface<\n    string | string[],\n    StringOrNumberOrList\n  >[];\n  groupComponent?: React.ReactElement;\n  height?: number;\n  horizontal?: boolean;\n  maxDomain?: number | { x?: number; y?: number };\n  minDomain?: number | { x?: number; y?: number };\n  name?: string;\n  origin?: OriginType;\n  padding?: PaddingProps;\n  polar?: boolean;\n  range?: RangePropType;\n  scale?:\n    | ScalePropType\n    | D3Scale\n    | {\n        x?: ScalePropType | D3Scale;\n        y?: ScalePropType | D3Scale;\n      };\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n  sharedEvents?: { events: any[]; getEventState: Function };\n  singleQuadrantDomainPadding?: boolean | { x?: boolean; y?: boolean };\n  standalone?: boolean;\n  width?: number;\n}\nexport interface VictoryCommonProps extends VictoryCommonThemeProps {\n  theme?: VictoryThemeDefinition;\n}\nexport interface VictoryCommonPrimitiveProps {\n  active?: boolean;\n  ariaLabel?: StringOrCallback;\n  className?: string;\n  clipPath?: string;\n  data?: any;\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n  desc?: string | Function;\n  disableInlineStyles?: boolean;\n  events?: object;\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n  id?: number | string | Function;\n  index?: number | string;\n  origin?: OriginType;\n  polar?: boolean;\n  role?: string;\n  scale?: any;\n  shapeRendering?: string;\n  style?: any;\n  tabIndex?: NumberOrCallback;\n  transform?: string;\n}\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/data.test.tsx",
    "content": "/* eslint no-unused-expressions: 0, max-nested-callbacks: 0 */\nimport React from \"react\";\nimport { fromJS } from \"immutable\";\n\nimport * as Data from \"./data\";\nimport { VictoryPortal } from \"../victory-portal/victory-portal\";\n\nconst immutableDataTest = {\n  createData: (data) => fromJS(data),\n  testLabel: \"data in immutable\",\n};\n\nconst dataTest = {\n  createData: (data) => data,\n  testLabel: \"data in js\",\n};\n\ndescribe(\"victory-util/data\", () => {\n  describe(\"createStringMap\", () => {\n    const tickValues = [\"one\", \"two\", \"three\"];\n    const categories = [\"red\", \"green\", \"blue\"];\n\n    it(\"returns a string map from strings in tickValues\", () => {\n      const props = { tickValues };\n      const stringMap = Data.createStringMap(props, \"x\");\n      expect(stringMap).toEqual({ one: 1, two: 2, three: 3 });\n    });\n\n    it(\"returns a string map from strings in categories\", () => {\n      const props = { categories };\n      const stringMap = Data.createStringMap(props, \"x\");\n      expect(stringMap).toEqual({ red: 1, green: 2, blue: 3 });\n    });\n\n    [dataTest, immutableDataTest].forEach(({ createData, testLabel }) => {\n      describe(`returning string maps with ${testLabel}`, () => {\n        const data = createData([\n          { x: \"one\", y: 1 },\n          { x: \"red\", y: 2 },\n          { x: \"cat\", y: 3 },\n        ]);\n\n        it(\"returns a string map from strings in data\", () => {\n          const props = { data };\n          const stringMap = Data.createStringMap(props, \"x\");\n          expect(stringMap).toEqual({ one: 1, red: 2, cat: 3 });\n        });\n\n        it(\"a unique set of values is returned from multiple sources\", () => {\n          const props = { tickValues, data };\n          const stringMap = Data.createStringMap(props, \"x\");\n          expect(stringMap).toEqual({\n            one: 1,\n            two: 2,\n            three: 3,\n            red: 4,\n            cat: 5,\n          });\n        });\n      });\n    });\n  });\n\n  [dataTest, immutableDataTest].forEach(({ createData, testLabel }) => {\n    describe(`getStringsFromData with ${testLabel}`, () => {\n      it(\"returns an array of strings from a data prop\", () => {\n        const props = {\n          data: createData([\n            { x: \"one\", y: 1 },\n            { x: \"red\", y: 2 },\n            { x: \"cat\", y: 3 },\n          ]),\n        };\n        const dataStrings = Data.getStringsFromData(props, \"x\");\n        expect(dataStrings).toEqual([\"one\", \"red\", \"cat\"]);\n      });\n\n      it(\"returns an array of strings from array-type data\", () => {\n        const props = {\n          data: createData([\n            [\"one\", 1],\n            [\"red\", 2],\n            [\"cat\", 3],\n          ]),\n          x: 0,\n          y: 1,\n        };\n        const dataStrings = Data.getStringsFromData(props, \"x\");\n        expect(dataStrings).toEqual([\"one\", \"red\", \"cat\"]);\n      });\n\n      it(\"only returns strings, if data is mixed\", () => {\n        const props = {\n          data: createData([\n            { x: 1, y: 1 },\n            { x: \"three\", y: 3 },\n          ]),\n        };\n        expect(Data.getStringsFromData(props, \"x\")).toEqual([\"three\"]);\n      });\n\n      it(\"returns an empty array when no strings are present\", () => {\n        const props = {\n          data: createData([\n            { x: 1, y: 1 },\n            { x: 3, y: 3 },\n          ]),\n        };\n        expect(Data.getStringsFromData(props, \"x\")).toEqual([]);\n      });\n\n      it(\"returns an empty array when the data prop is undefined\", () => {\n        expect(Data.getStringsFromData({}, \"x\")).toEqual([]);\n      });\n    });\n  });\n\n  describe(\"getStringsFromAxes\", () => {\n    it(\"returns an array of strings when tickValues is an array\", () => {\n      const props = { tickValues: [1, \"three\", 5] };\n      expect(Data.getStringsFromAxes(props, \"x\")).toEqual([\"three\"]);\n    });\n\n    it(\"returns an array of strings when tickValues is an object\", () => {\n      const props = { tickValues: { x: [1, \"three\", 5] } };\n      expect(Data.getStringsFromAxes(props, \"x\")).toEqual([\"three\"]);\n    });\n\n    it(\"returns an empty array when a given axis is not defined\", () => {\n      const props = { tickValues: { y: [1, \"three\", 5] } };\n      expect(Data.getStringsFromAxes(props, \"x\")).toEqual([]);\n    });\n\n    it(\"returns an empty array when no strings are present\", () => {\n      const props = { tickValues: [1, 3, 5] };\n      expect(Data.getStringsFromAxes(props, \"x\")).toEqual([]);\n    });\n\n    it(\"returns an empty array when the tickValues prop is undefined\", () => {\n      expect(Data.getStringsFromAxes({}, \"x\")).toEqual([]);\n    });\n  });\n\n  describe(\"getStringsFromCategories\", () => {\n    it(\"returns an empty array when no strings are present\", () => {\n      const props = { categories: [1, 3, 5] };\n      expect(Data.getStringsFromCategories(props, \"x\")).toEqual([]);\n    });\n\n    it(\"returns an empty array when the category prop is undefined\", () => {\n      expect(Data.getStringsFromCategories({}, \"x\")).toEqual([]);\n    });\n  });\n\n  [dataTest, immutableDataTest].forEach(({ createData, testLabel }) => {\n    describe(`formatData with ${testLabel}`, () => {\n      it(\"formats a single dataset\", () => {\n        const dataset = [\n          { _x: 1, _y: 3, x: 1, y: 3 },\n          { _x: 2, _y: 5, x: 2, y: 5 },\n        ];\n        const props = { data: createData(dataset) };\n        const formatted = Data.formatData(dataset, props);\n        expect(Array.isArray(formatted)).toBeTruthy();\n        expect(Object.keys(formatted[0])).toEqual(\n          expect.arrayContaining([\"_x\", \"_y\", \"x\", \"y\"]),\n        );\n      });\n    });\n  });\n\n  describe(\"getData\", () => {\n    [dataTest, immutableDataTest].forEach(({ createData, testLabel }) => {\n      describe(`with ${testLabel}`, () => {\n        it(\"formats and returns the data prop\", () => {\n          const data = createData([\n            { x: \"kittens\", y: 3 },\n            { x: \"cats\", y: 5 },\n          ]);\n          const props = { data, x: \"x\", y: \"y\" };\n          const expectedReturnWithEventKeys = [\n            { _x: 1, x: \"kittens\", xName: \"kittens\", _y: 3, y: 3 },\n            { _x: 2, x: \"cats\", xName: \"cats\", _y: 5, y: 5 },\n          ];\n          const returnData = Data.getData(props);\n          expect(returnData).toEqual(expectedReturnWithEventKeys);\n        });\n\n        it(\"uses the event key when it is passed in\", () => {\n          const data = createData([\n            { x: 2, y: 2, eventKey: 13 },\n            { x: 1, y: 3, eventKey: 21 },\n            { x: 3, y: 1, eventKey: 11 },\n          ]);\n\n          const returnData = Data.getData({ data });\n\n          expect(returnData).toEqual([\n            { _x: 2, x: 2, _y: 2, y: 2, eventKey: 13 },\n            { _x: 1, x: 1, _y: 3, y: 3, eventKey: 21 },\n            { _x: 3, x: 3, _y: 1, y: 1, eventKey: 11 },\n          ]);\n        });\n\n        it(\"uses a custom event key when it is passed in\", () => {\n          const data = createData([\n            { x: 2, y: 2, myEventKey: 3 },\n            { x: 1, y: 3, myEventKey: 2 },\n            { x: 3, y: 1, myEventKey: 1 },\n          ]);\n\n          const returnData = Data.getData({ data, eventKey: \"myEventKey\" });\n\n          expect(returnData).toEqual([\n            { _x: 2, x: 2, _y: 2, y: 2, eventKey: 3, myEventKey: 3 },\n            { _x: 1, x: 1, _y: 3, y: 3, eventKey: 2, myEventKey: 2 },\n            { _x: 3, x: 3, _y: 1, y: 1, eventKey: 1, myEventKey: 1 },\n          ]);\n        });\n\n        it(\"uses a eventKey functions\", () => {\n          const data = createData([\n            { x: 2, y: 2 },\n            { x: 1, y: 3 },\n            { x: 3, y: 1 },\n          ]);\n\n          const returnData = Data.getData({ data, eventKey: (d) => d.x });\n\n          expect(returnData).toEqual([\n            { _x: 2, x: 2, _y: 2, y: 2, eventKey: 2 },\n            { _x: 1, x: 1, _y: 3, y: 3, eventKey: 1 },\n            { _x: 3, x: 3, _y: 1, y: 1, eventKey: 3 },\n          ]);\n        });\n\n        it(\"uses a eventKey functions with index\", () => {\n          const data = createData([\n            { x: 2, y: 2 },\n            { x: 1, y: 3 },\n            { x: 3, y: 1 },\n          ]);\n\n          const returnData = Data.getData({ data, eventKey: (d, i) => i });\n\n          expect(returnData).toEqual([\n            { _x: 2, x: 2, _y: 2, y: 2, eventKey: 0 },\n            { _x: 1, x: 1, _y: 3, y: 3, eventKey: 1 },\n            { _x: 3, x: 3, _y: 1, y: 1, eventKey: 2 },\n          ]);\n        });\n\n        it(\"does not sort data when sort key not passed\", () => {\n          const data = createData([\n            { x: 2, y: 2 },\n            { x: 1, y: 3 },\n            { x: 3, y: 1 },\n          ]);\n\n          const returnData = Data.getData({ data });\n\n          expect(returnData).toEqual([\n            { _x: 2, x: 2, _y: 2, y: 2 },\n            { _x: 1, x: 1, _y: 3, y: 3 },\n            { _x: 3, x: 3, _y: 1, y: 1 },\n          ]);\n        });\n\n        it(\"sorts data according to sort key\", () => {\n          const data = createData([\n            { x: 1, y: 1, order: 2 },\n            { x: 3, y: 3, order: 1 },\n            { x: 2, y: 2, order: 3 },\n          ]);\n\n          const returnData = Data.getData({ data, sortKey: \"order\" });\n\n          expect(returnData).toEqual([\n            { _x: 3, x: 3, _y: 3, y: 3, order: 1 },\n            { _x: 1, x: 1, _y: 1, y: 1, order: 2 },\n            { _x: 2, x: 2, _y: 2, y: 2, order: 3 },\n          ]);\n        });\n\n        it(\"sorts data according to sort key and sort order\", () => {\n          const data = createData([\n            { x: 1, y: 1, order: 2 },\n            { x: 3, y: 3, order: 1 },\n            { x: 2, y: 2, order: 3 },\n          ]);\n\n          const returnData = Data.getData({\n            data,\n            sortKey: \"order\",\n            sortOrder: \"descending\",\n          });\n\n          expect(returnData).toEqual([\n            { _x: 2, x: 2, _y: 2, y: 2, order: 3 },\n            { _x: 1, x: 1, _y: 1, y: 1, order: 2 },\n            { _x: 3, x: 3, _y: 3, y: 3, order: 1 },\n          ]);\n        });\n\n        // Ensures previous VictoryLine api for sortKey prop stays consistent\n        it(\"sorts data according to evaluated sort key when sort key is x or y\", () => {\n          const data = createData([\n            { _x: 2, x: 10, _y: 2, y: 10 },\n            { _x: 1, x: 20, _y: 3, y: 20 },\n            { _x: 3, x: 30, _y: 1, y: 30 },\n          ]);\n\n          const returnDataX = Data.getData({ data, sortKey: \"x\" });\n\n          expect(returnDataX).toEqual([\n            { _x: 1, x: 20, _y: 3, y: 20 },\n            { _x: 2, x: 10, _y: 2, y: 10 },\n            { _x: 3, x: 30, _y: 1, y: 30 },\n          ]);\n\n          const returnDataY = Data.getData({ data, sortKey: \"y\" });\n          expect(returnDataY).toEqual([\n            { _x: 3, x: 30, _y: 1, y: 30 },\n            { _x: 2, x: 10, _y: 2, y: 10 },\n            { _x: 1, x: 20, _y: 3, y: 20 },\n          ]);\n        });\n      });\n    });\n\n    it(\"generates a dataset from domain\", () => {\n      const generatedReturn = [\n        { x: 0, y: 0 },\n        { x: 10, y: 10 },\n      ];\n      const props = { x: \"x\", y: \"y\", domain: { x: [0, 10], y: [0, 10] } };\n      const returnData = Data.generateData(props);\n      expect(returnData).toEqual(generatedReturn);\n    });\n\n    it(\"generates a dataset from negative domain\", () => {\n      const generatedReturn = [\n        { x: -10, y: 0 },\n        { x: 10, y: 10 },\n      ];\n      const props = { x: \"x\", y: \"y\", domain: { x: [-10, 10], y: [0, 10] } };\n      const returnData = Data.generateData(props);\n      expect(returnData).toEqual(generatedReturn);\n    });\n\n    it(\"generates a dataset from domain and samples\", () => {\n      const generatedReturn = [\n        { x: 0, y: 0 },\n        { x: 5, y: 5 },\n        { x: 10, y: 10 },\n      ];\n      const props = {\n        x: \"x\",\n        y: \"y\",\n        domain: { x: [0, 10], y: [0, 10] },\n        samples: 2,\n      };\n      const returnData = Data.generateData(props);\n      expect(returnData).toEqual(generatedReturn);\n    });\n  });\n\n  describe(\"isDataComponent\", () => {\n    class TestDataComponent extends React.Component {\n      static role = \"area\";\n    }\n    it(\"returns true when a component has a static role matching a whitelist\", () => {\n      expect(Data.isDataComponent(<TestDataComponent />)).toBe(true);\n    });\n\n    it(\"returns false when a component has a role that does not match the whitelist\", () => {\n      // eslint-disable-next-line react/no-multi-comp\n      class TestFooComponent extends React.Component {\n        static role = \"foo\";\n      }\n      expect(Data.isDataComponent(<TestFooComponent />)).toBe(false);\n    });\n\n    it(\"returns true when a data component is wrapped in VictoryPortal\", () => {\n      expect(\n        Data.isDataComponent(\n          <VictoryPortal>\n            <TestDataComponent />\n          </VictoryPortal>,\n        ),\n      ).toBe(true);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/data.ts",
    "content": "import React from \"react\";\nimport isEmpty from \"lodash/isEmpty\";\nimport isEqual from \"lodash/isEqual\";\nimport isPlainObject from \"lodash/isPlainObject\";\nimport isUndefined from \"lodash/isUndefined\";\nimport omitBy from \"lodash/omitBy\";\nimport orderBy from \"lodash/orderBy\";\nimport property from \"lodash/property\";\nimport uniq from \"lodash/uniq\";\n\nimport * as Helpers from \"./helpers\";\nimport * as Collection from \"./collection\";\nimport * as Scale from \"./scale\";\nimport * as Immutable from \"./immutable\";\n\n// Private Functions\n\nfunction parseDatum(datum) {\n  const immutableDatumWhitelist = {\n    errorX: true,\n    errorY: true,\n  };\n\n  return Immutable.isImmutable(datum)\n    ? Immutable.shallowToJS(datum, immutableDatumWhitelist)\n    : datum;\n}\n\nfunction getLength(data: unknown[]) {\n  return Immutable.isIterable(data) ? data.size : data.length;\n}\n\n// Returns generated data for a given axis based on domain and sample from props\nfunction generateDataArray(props, axis) {\n  const propsDomain = isPlainObject(props.domain)\n    ? props.domain[axis]\n    : props.domain;\n  const domain = propsDomain || Scale.getBaseScale(props, axis).domain();\n  const samples = props.samples || 1;\n  const domainMax = Math.max(...domain);\n  const domainMin = Math.min(...domain);\n  const step = (domainMax - domainMin) / samples;\n  const values = Helpers.range(domainMin, domainMax, step);\n  return values[values.length - 1] === domainMax\n    ? values\n    : values.concat(domainMax);\n}\n\n// Returns sorted data. If no sort keys are provided, data is returned unaltered.\nfunction sortData(dataset, sortKey, sortOrder = \"ascending\") {\n  if (!sortKey) {\n    return dataset;\n  }\n\n  // Ensures previous VictoryLine api for sortKey prop stays consistent\n  let formattedSortKey = sortKey;\n  if (sortKey === \"x\" || sortKey === \"y\") {\n    formattedSortKey = `_${sortKey}`;\n  }\n  const order = sortOrder === \"ascending\" ? \"asc\" : \"desc\";\n  return orderBy(dataset, formattedSortKey, order);\n}\n\n// This method will remove data points that break certain scales. (log scale only)\nfunction cleanData(dataset, props) {\n  const smallNumber = 1 / Number.MAX_SAFE_INTEGER;\n  const scaleType = {\n    x: Scale.getScaleType(props, \"x\"),\n    y: Scale.getScaleType(props, \"y\"),\n  };\n  if (scaleType.x !== \"log\" && scaleType.y !== \"log\") {\n    return dataset;\n  }\n  const rules = (datum, axis) => {\n    return scaleType[axis] === \"log\" ? datum[`_${axis}`] !== 0 : true;\n  };\n\n  const sanitize = (datum) => {\n    const _x = rules(datum, \"x\") ? datum._x : smallNumber;\n    const _y = rules(datum, \"y\") ? datum._y : smallNumber;\n    const _y0 = rules(datum, \"y0\") ? datum._y0 : smallNumber;\n    return Object.assign({}, datum, { _x, _y, _y0 });\n  };\n\n  return dataset.map((datum) => {\n    if (rules(datum, \"x\") && rules(datum, \"y\") && rules(datum, \"y0\")) {\n      return datum;\n    }\n    return sanitize(datum);\n  });\n}\n\n// Returns a data accessor given an eventKey prop\nfunction getEventKey(key) {\n  // creates a data accessor function\n  // given a property key, path, array index, or null for identity.\n  if (Helpers.isFunction(key)) {\n    return key;\n  } else if (key === null || key === undefined) {\n    return () => undefined;\n  }\n  // otherwise, assume it is an array index, property key or path (_.property handles all three)\n  return property(key);\n}\n\n// Returns data with an eventKey prop added to each datum\nfunction addEventKeys(props, data) {\n  const hasEventKeyAccessor = !!props.eventKey;\n  const eventKeyAccessor = getEventKey(props.eventKey);\n  return data.map((datum, index) => {\n    if (datum.eventKey !== undefined) {\n      return datum;\n    } else if (hasEventKeyAccessor) {\n      const eventKey = eventKeyAccessor(datum, index);\n      return eventKey !== undefined\n        ? Object.assign({ eventKey }, datum)\n        : datum;\n    }\n    return datum;\n  });\n}\n\n// Exported Functions\n\n// This method will remove data points that fall outside of the desired domain (non-continuous charts only)\nexport function formatDataFromDomain(dataset, domain, defaultBaseline?) {\n  const exists = (val) => val !== undefined;\n\n  const minDomainX = Collection.getMinValue(domain.x);\n  const maxDomainX = Collection.getMaxValue(domain.x);\n  const minDomainY = Collection.getMinValue(domain.y);\n  const maxDomainY = Collection.getMaxValue(domain.y);\n\n  const underMin = (min) => (val) => exists(val) && val < min;\n  const overMax = (max) => (val) => exists(val) && val > max;\n\n  const isUnderMinX = underMin(minDomainX);\n  const isUnderMinY = underMin(minDomainY);\n  const isOverMaxX = overMax(maxDomainX);\n  const isOverMaxY = overMax(maxDomainY);\n\n  return dataset.map((datum) => {\n    let { _x, _y, _y0, _y1 } = datum;\n\n    // single x point less than min domain\n    if (isUnderMinX(_x) || isOverMaxX(_x)) _x = null;\n\n    const baseline = exists(_y0) ? _y0 : defaultBaseline;\n    const value = exists(_y1) ? _y1 : _y;\n\n    if (!exists(value)) return datum;\n\n    // value only and less than min domain or greater than max domain\n    if (!exists(baseline) && (isUnderMinY(value) || isOverMaxY(value)))\n      _y = null;\n\n    // baseline and value are both less than min domain or both greater than max domain\n    if (\n      (isUnderMinY(baseline) && isUnderMinY(value)) ||\n      (isOverMaxY(baseline) && isOverMaxY(value))\n    )\n      _y = _y0 = _y1 = null;\n\n    // baseline and value with only baseline below min, set baseline to minDomainY\n    if (isUnderMinY(baseline) && !isUnderMinY(value)) _y0 = minDomainY;\n    // baseline and value with only baseline above max, set baseline to maxDomainY\n    if (isOverMaxY(baseline) && !isOverMaxY(value)) _y0 = maxDomainY;\n\n    return Object.assign({}, datum, omitBy({ _x, _y, _y0, _y1 }, isUndefined));\n  });\n}\n\n/**\n * Returns an object mapping string data to numeric data\n * @param {Object} props: the props object\n * @param {String} axis: the current axis\n * @returns {Object} an object mapping string data to numeric data\n */\nexport function createStringMap(props, axis) {\n  const stringsFromAxes = getStringsFromAxes(props, axis);\n  const stringsFromCategories = getStringsFromCategories(props, axis);\n  const stringsFromData = getStringsFromData(props, axis);\n\n  const allStrings = uniq([\n    ...stringsFromAxes,\n    ...stringsFromCategories,\n    ...stringsFromData,\n  ]);\n  return allStrings.length === 0\n    ? null\n    : allStrings.reduce((memo, string, index) => {\n        memo[string] = index + 1;\n        return memo;\n      }, {});\n}\n\n/**\n * Reduces the size of a data array, such that it is <= maxPoints.\n * @param {Array} data: an array of data; must be sorted\n * @param {Number} maxPoints: maximum number of data points to return\n * @param {Number} startingIndex: the index of the data[0] *in the entire dataset*; this function\n                   assumes `data` param is a subset of larger dataset that has been zoommed\n  * @returns {Array} an array of data, a subset of data param\n  */\nexport function downsample(data, maxPoints, startingIndex = 0) {\n  // ensures that the downampling of data while zooming looks good.\n  const dataLength = getLength(data);\n  if (dataLength > maxPoints) {\n    // limit k to powers of 2, e.g. 64, 128, 256\n    // so that the same points will be chosen reliably, reducing flicker on zoom\n    const k = Math.pow(2, Math.ceil(Math.log2(dataLength / maxPoints)));\n    return data.filter(\n      // ensure modulo is always calculated from same reference: i + startingIndex\n      (d, i) => (i + startingIndex) % k === 0,\n    );\n  }\n  return data;\n}\n\n/**\n * Returns formatted data. Data accessors are applied, and string values are replaced.\n * @param {Array} dataset: the original domain\n * @param {Object} props: the props object\n * @param {Array} expectedKeys: an array of expected data keys\n * @returns {Array} the formatted data\n */\nexport function formatData(\n  dataset: any[],\n  props: any,\n  expectedKeys?: string[],\n) {\n  const isArrayOrIterable =\n    Array.isArray(dataset) || Immutable.isIterable(dataset);\n  if (!isArrayOrIterable || getLength(dataset) < 1) {\n    return [];\n  }\n\n  const defaultKeys = [\"x\", \"y\", \"y0\"];\n  // TODO: We shouldn’t mutate the expectedKeys param here,\n  // but we need to figure out why changing it causes regressions in tests.\n  // eslint-disable-next-line no-param-reassign\n  expectedKeys = Array.isArray(expectedKeys) ? expectedKeys : defaultKeys;\n\n  const createAccessor = (name) => {\n    return Helpers.createAccessor(\n      props[name] !== undefined ? props[name] : name,\n    );\n  };\n\n  const accessor = expectedKeys.reduce((memo, type) => {\n    memo[type] = createAccessor(type);\n    return memo;\n  }, {});\n\n  const preformattedData =\n    isEqual(expectedKeys, defaultKeys) &&\n    props.x === \"_x\" &&\n    props.y === \"_y\" &&\n    props.y0 === \"_y0\";\n\n  let stringMap;\n  if (preformattedData === false) {\n    // stringMap is not required if the data is preformatted\n    stringMap = {\n      x:\n        expectedKeys.indexOf(\"x\") !== -1\n          ? createStringMap(props, \"x\")\n          : undefined,\n      y:\n        expectedKeys.indexOf(\"y\") !== -1\n          ? createStringMap(props, \"y\")\n          : undefined,\n      y0:\n        expectedKeys.indexOf(\"y0\") !== -1\n          ? createStringMap(props, \"y\")\n          : undefined,\n    };\n  }\n\n  const data = preformattedData\n    ? dataset\n    : dataset.reduce((dataArr, datum, index) => {\n        const parsedDatum = parseDatum(datum);\n        const fallbackValues = { x: index, y: parsedDatum };\n        const processedValues = expectedKeys!.reduce((memo, type) => {\n          const processedValue = accessor[type](parsedDatum);\n          const value =\n            processedValue !== undefined\n              ? processedValue\n              : fallbackValues[type];\n          if (value !== undefined) {\n            if (typeof value === \"string\" && stringMap[type]) {\n              memo[`${type}Name`] = value;\n              memo[`_${type}`] = stringMap[type][value];\n            } else {\n              memo[`_${type}`] = value;\n            }\n          }\n          return memo;\n        }, {});\n\n        const formattedDatum = Object.assign({}, processedValues, parsedDatum);\n        if (!isEmpty(formattedDatum)) {\n          dataArr.push(formattedDatum);\n        }\n\n        return dataArr;\n      }, []);\n\n  const sortedData = sortData(data, props.sortKey, props.sortOrder);\n  const cleanedData = cleanData(sortedData, props);\n  return addEventKeys(props, cleanedData);\n}\n\n/**\n * Returns generated x and y data based on domain and sample from props\n * @param {Object} props: the props object\n * @returns {Array} an array of data\n */\nexport function generateData(props) {\n  const xValues = generateDataArray(props, \"x\");\n  const yValues = generateDataArray(props, \"y\");\n  const values = xValues.map((x, i) => {\n    return { x, y: yValues[i] };\n  });\n  return values;\n}\n\n/**\n * Returns an array of categories for a given axis\n * @param {Object} props: the props object\n * @param {String} axis: the current axis\n * @returns {Array} an array of categories\n */\nexport function getCategories(props, axis) {\n  return props.categories && !Array.isArray(props.categories)\n    ? props.categories[axis]\n    : props.categories;\n}\n\n/**\n * Returns an array of formatted data\n * @param {Object} props: the props object\n * @returns {Array} an array of data\n */\nexport function getData(props) {\n  return props.data\n    ? formatData(props.data, props)\n    : formatData(generateData(props), props);\n}\n\n/**\n * Returns an array of strings from axis tickValues for a given axis\n * @param {Object} props: the props object\n * @param {String} axis: the current axis\n * @returns {Array} an array of strings\n */\nexport function getStringsFromAxes(props, axis) {\n  const { tickValues, tickFormat } = props;\n  let tickValueArray;\n  if (!tickValues || (!Array.isArray(tickValues) && !tickValues[axis])) {\n    tickValueArray = tickFormat && Array.isArray(tickFormat) ? tickFormat : [];\n  } else {\n    tickValueArray = tickValues[axis] || tickValues;\n  }\n  return tickValueArray.filter((val) => typeof val === \"string\");\n}\n\n/**\n * Returns an array of strings from categories for a given axis\n * @param {Object} props: the props object\n * @param {String} axis: the current axis\n * @returns {Array} an array of strings\n */\nexport function getStringsFromCategories(props, axis) {\n  if (!props.categories) {\n    return [];\n  }\n  const categories = getCategories(props, axis);\n  const categoryStrings =\n    categories && categories.filter((val) => typeof val === \"string\");\n  return categoryStrings ? Collection.removeUndefined(categoryStrings) : [];\n}\n\n/**\n * Returns an array of strings from data\n * @param {Object} props: the props object\n * @param {String} axis: the current axis\n * @returns {Array} an array of strings\n */\nexport function getStringsFromData(props, axis) {\n  const isArrayOrIterable =\n    Array.isArray(props.data) || Immutable.isIterable(props.data);\n  if (!isArrayOrIterable) {\n    return [];\n  }\n\n  const key = props[axis] === undefined ? axis : props[axis];\n  const accessor = Helpers.createAccessor(key);\n\n  // support immutable data\n  const data = props.data.reduce((memo, d) => {\n    memo.push(parseDatum(d));\n    return memo;\n  }, []);\n\n  const sortedData = sortData(data, props.sortKey, props.sortOrder);\n  const dataStrings = sortedData\n    .reduce((dataArr, datum) => {\n      const parsedDatum = parseDatum(datum);\n      dataArr.push(accessor(parsedDatum));\n      return dataArr;\n    }, [])\n    .filter((datum) => typeof datum === \"string\");\n\n  // return a unique set of strings\n  return dataStrings.reduce((prev, curr) => {\n    if (curr !== undefined && curr !== null && prev.indexOf(curr) === -1) {\n      prev.push(curr);\n    }\n    return prev;\n  }, []);\n}\n\n/**\n * Checks whether a given component can be used to calculate data\n * @param {Component} component: a React component instance\n * @returns {Boolean} Returns true if the given component has a role included in the whitelist\n */\nexport function isDataComponent(component) {\n  const getRole = (child) => {\n    return child && child.type ? child.type.role : \"\";\n  };\n  let role = getRole(component);\n  if (role === \"portal\") {\n    const children = React.Children.toArray(component.props.children);\n    role = children.length ? getRole(children[0]) : \"\";\n  }\n  const whitelist = [\n    \"area\",\n    \"bar\",\n    \"boxplot\",\n    \"candlestick\",\n    \"errorbar\",\n    \"group\",\n    \"histogram\",\n    \"line\",\n    \"pie\",\n    \"scatter\",\n    \"stack\",\n    \"voronoi\",\n  ];\n  return whitelist.includes(role);\n}\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/default-transitions.ts",
    "content": "import { AnimatePropTypeInterface } from \"../types/prop-types\";\n\nexport function continuousTransitions(): AnimatePropTypeInterface {\n  return {\n    onLoad: {\n      duration: 2000,\n    },\n    onExit: {\n      duration: 500,\n    },\n    onEnter: {\n      duration: 500,\n    },\n  };\n}\n\nexport function continuousPolarTransitions(): AnimatePropTypeInterface {\n  return {\n    onLoad: {\n      duration: 2000,\n      before: () => ({ _y: 0, _y1: 0, _y0: 0 }),\n      after: (datum) => ({ _y: datum._y, _y1: datum._y1, _y0: datum._y0 }),\n    },\n    onExit: {\n      duration: 500,\n      before: (datum, index, data) => {\n        const adjacent = (attr) => {\n          const adj = index === 0 ? data[index + 1] : data[index - 1];\n          return adj[attr];\n        };\n        return {\n          _x: adjacent(\"_x\"),\n          _y: adjacent(\"_y\"),\n          _y0: adjacent(\"_y0\"),\n        };\n      },\n    },\n    onEnter: {\n      duration: 500,\n      before: (datum, index, data) => {\n        const adjacent = (attr) => {\n          const adj = index === 0 ? data[index + 1] : data[index - 1];\n          return adj[attr];\n        };\n        return {\n          _x: adjacent(\"_x\"),\n          _y: adjacent(\"_y\"),\n          _y0: adjacent(\"_y0\"),\n        };\n      },\n      after: (datum) => ({\n        _x: datum._x,\n        _y: datum._y,\n        _y1: datum._y1,\n        _y0: datum._y0,\n      }),\n    },\n  };\n}\n\nexport function discreteTransitions(): AnimatePropTypeInterface {\n  return {\n    onLoad: {\n      duration: 2000,\n      before: () => ({ opacity: 0 }),\n      after: (datum) => datum,\n    },\n    onExit: {\n      duration: 600,\n      before: () => ({ opacity: 0 }),\n    },\n    onEnter: {\n      duration: 600,\n      before: () => ({ opacity: 0 }),\n      after: (datum) => datum,\n    },\n  };\n}\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/domain.test.tsx",
    "content": "import React from \"react\";\n\nimport { VictoryPortal } from \"../victory-portal/victory-portal\";\nimport * as Domain from \"./domain\";\n\ndescribe(\"victory-util/domain\", () => {\n  describe(\"createDomainFunction\", () => {\n    it(\"returns a function equivalent to getDomain when no props are given\", () => {\n      const props = {\n        x: \"x\",\n        y: \"y\",\n        domain: { y: [1, 2] },\n        data: [\n          { x: 1, y: 3 },\n          { x: 3, y: 5 },\n        ],\n      };\n      const domainGetter = Domain.createDomainFunction();\n      expect(domainGetter(props, \"x\")).toEqual(Domain.getDomain(props, \"x\"));\n    });\n\n    it(\"returns a function that uses a custom getDomainFromData function when given\", () => {\n      const props = {\n        x: \"x\",\n        y: \"y\",\n        data: [\n          { x: 1, y: 3 },\n          { x: 3, y: 5 },\n        ],\n      };\n      const getDomainFromData = () => [0, 10];\n      const domainGetter = Domain.createDomainFunction(getDomainFromData);\n      expect(domainGetter(props, \"x\")).toEqual([0, 10]);\n    });\n\n    it(\"returns a function that uses a custom formatDomain function when given\", () => {\n      const props = { domain: [0, 1] };\n      const formatDomain = () => [0, 10];\n      const domainGetter = Domain.createDomainFunction(null, formatDomain);\n      expect(domainGetter(props, \"x\")).toEqual([0, 10]);\n    });\n  });\n\n  describe(\"formatDomain\", () => {\n    const baseProps = { width: 100, height: 100, padding: 0 };\n    it(\"returns the domain when no domain padding is specified\", () => {\n      const domain = [0, 1];\n      const paddedDomain = Domain.formatDomain(domain, baseProps, \"x\");\n      expect(paddedDomain).toEqual(domain);\n    });\n\n    it(\"pads the domain a particular number of pixels\", () => {\n      const domain = [0, 100];\n      const padding = [5, 10, 20];\n      padding.forEach((pad) => {\n        const domainPadding = { x: pad };\n        const props = { ...baseProps, domainPadding };\n        const paddedDomain = Domain.formatDomain(domain, props, \"x\");\n        const adjustedDomain = domain[1] + pad;\n        const adjustedPercent =\n          adjustedDomain / (baseProps.width - baseProps.padding);\n        const totalPadding = adjustedPercent * pad;\n        expect(paddedDomain).toEqual([0, domain[1] + totalPadding]);\n      });\n    });\n\n    it(\"filters zero from the domain for log scales\", () => {\n      const verySmallNumber = 1 / Number.MAX_SAFE_INTEGER;\n      const props = { scale: { y: \"log\" } };\n      const formattedDomain = Domain.formatDomain([0, 1], props, \"y\");\n      expect(formattedDomain).toEqual([verySmallNumber, 1]);\n    });\n  });\n\n  describe(\"getDomain\", () => {\n    it(\"gets the domain from props if they exist\", () => {\n      const props = { domain: [1, 2] };\n      const resultDomain = Domain.getDomain(props, \"x\");\n      expect(resultDomain).toEqual(props.domain);\n    });\n\n    it(\"gets the domain from data if props don't exist for a particular axis\", () => {\n      const props = {\n        x: \"x\",\n        y: \"y\",\n        domain: { y: [1, 2] },\n        data: [\n          { x: 1, y: 3 },\n          { x: 3, y: 5 },\n        ],\n      };\n      const resultDomain = Domain.getDomain(props, \"x\");\n      expect(resultDomain).toEqual([1, 3]);\n    });\n  });\n\n  describe(\"getDomainFromCategories\", () => {\n    it(\"calculates a domain from categories for the independent axis\", () => {\n      const props = { categories: [1, 2, 3] };\n      const domainResult = Domain.getDomainFromCategories(props, \"x\");\n      expect(domainResult).toEqual([1, 3]);\n    });\n\n    it(\"calculates a domain from categories for the dependent axis\", () => {\n      const props = { categories: { y: [1, 2, 3] } };\n      const domainResult = Domain.getDomainFromCategories(props, \"y\");\n      expect(domainResult).toEqual([1, 3]);\n    });\n\n    it(\"calculates a domain from string categories\", () => {\n      const props = { categories: { x: [\"cats\", \"kittens\"] } };\n      const domainResult = Domain.getDomainFromCategories(props, \"x\");\n      expect(domainResult).toEqual([1, 2]);\n    });\n  });\n\n  describe(\"getDomainFromData\", () => {\n    it(\"returns a domain from a dataset\", () => {\n      const dataset = [\n        { _x: 1, _y: 3 },\n        { _x: 3, _y: 5 },\n      ];\n      const resultDomain = Domain.getDomainFromData({}, \"x\", dataset);\n      expect(resultDomain).toEqual([1, 3]);\n    });\n  });\n\n  describe(\"getDomainFromProps\", () => {\n    it(\"gets the domain from a domain array\", () => {\n      const props = { domain: [1, 2] };\n      const resultDomain = Domain.getDomainFromProps(props, \"x\");\n      expect(resultDomain).toEqual(props.domain);\n    });\n\n    it(\"gets the domain from a domain object\", () => {\n      const props = { domain: { x: [1, 2] } };\n      const resultDomain = Domain.getDomainFromProps(props, \"x\");\n      expect(resultDomain).toEqual(props.domain.x);\n    });\n\n    it(\"returns undefined if the domain props is not given\", () => {\n      expect(Domain.getDomainFromProps({}, \"x\")).toBeUndefined();\n    });\n\n    it(\"returns undefined if the domain for a given axis is not defined\", () => {\n      const props = { domain: { y: [1, 2] } };\n      const resultDomain = Domain.getDomainFromProps(props, \"x\");\n      expect(resultDomain).toBeUndefined();\n    });\n\n    it(\"returns a domain from minDomain and maxDomain if both are defined\", () => {\n      const props = { minDomain: 1, maxDomain: 10 };\n      const resultDomain = Domain.getDomainFromProps(props, \"x\");\n      expect(resultDomain).toEqual([1, 10]);\n    });\n\n    it(\"returns an adjusted domain if minDomain equals maxDomain\", () => {\n      const props = { minDomain: 1, maxDomain: 1 };\n      const verySmallNumber = Math.pow(10, -10);\n      const resultDomain = Domain.getDomainFromProps(props, \"x\");\n      expect(resultDomain).toEqual([1 - verySmallNumber, 1 + verySmallNumber]);\n    });\n\n    it(\"returns undefined if only minDomain is defined\", () => {\n      const props = { minDomain: 1 };\n      const resultDomain = Domain.getDomainFromProps(props, \"x\");\n      expect(resultDomain).toBeUndefined();\n    });\n  });\n\n  describe(\"getDomainFromMinMax\", () => {\n    it(\"returns a min max array when min and max are given\", () => {\n      const min = 1;\n      const max = 2;\n      const resultDomain = Domain.getDomainFromMinMax(min, max);\n      expect(resultDomain).toEqual([min, max]);\n    });\n\n    it(\"returns an adjusted domain if min equals max\", () => {\n      const min = 1;\n      const max = 1;\n      const verySmallNumber = Math.pow(10, -10);\n      const resultDomain = Domain.getDomainFromMinMax(min, max);\n      expect(resultDomain).toEqual([1 - verySmallNumber, 1 + verySmallNumber]);\n    });\n\n    it(\"returns a positive domain if min and max are both zero\", () => {\n      const min = 0;\n      const max = 0;\n      const verySmallNumber = Math.pow(10, -10);\n      const resultDomain = Domain.getDomainFromMinMax(min, max);\n      expect(resultDomain).toEqual([0, 2 * verySmallNumber]);\n    });\n\n    it(\"returns an adjusted date domain if min equals max\", () => {\n      const min = new Date(1980, 1, 1);\n      const max = new Date(1980, 1, 1);\n      const resultDomain = Domain.getDomainFromMinMax(min, max);\n      expect(resultDomain).toEqual([\n        new Date(Number(min) - 1),\n        new Date(Number(max) + 1),\n      ]);\n    });\n  });\n\n  describe(\"getDomainWithZero\", () => {\n    it(\"ensures that the domain includes zero for the dependent axis\", () => {\n      const props = {\n        data: [\n          { x: 1, y: 3 },\n          { x: 3, y: 5 },\n        ],\n      };\n      const resultDomain = Domain.getDomainWithZero(props, \"y\");\n      expect(resultDomain).toEqual([0, 5]);\n    });\n\n    it(\"allows minimum domain values less than zero\", () => {\n      const props = {\n        data: [\n          { x: 1, y: -3 },\n          { x: 3, y: 5 },\n        ],\n      };\n      const resultDomain = Domain.getDomainWithZero(props, \"y\");\n      expect(resultDomain).toEqual([-3, 5]);\n    });\n\n    it(\"allows explicit y0 values in props.data to set the minimum domain\", () => {\n      const props = {\n        data: [\n          { x: 1, y: 3, y0: 2 },\n          { x: 3, y: 5, y0: 3 },\n        ],\n      };\n      const resultDomain = Domain.getDomainWithZero(props, \"y\");\n      expect(resultDomain).toEqual([2, 5]);\n    });\n\n    it(\"handles negative y0 values\", () => {\n      const props = {\n        data: [\n          { x: 1, y: -3, y0: -7 },\n          { x: 3, y: -5, y0: -7 },\n        ],\n      };\n      const resultDomain = Domain.getDomainWithZero(props, \"y\");\n      expect(resultDomain).toEqual([-7, -3]);\n    });\n\n    it(\"respects props.minDomain when present\", () => {\n      const props = {\n        data: [\n          { x: 1, y: 3, y0: 2 },\n          { x: 3, y: 5, y0: 2 },\n        ],\n        minDomain: { y: 4 },\n      };\n      const resultDomain = Domain.getDomainWithZero(props, \"y\");\n      expect(resultDomain).toEqual([4, 5]);\n    });\n\n    it(\"does not force the independent domain to include zero\", () => {\n      const props = {\n        data: [\n          { x: 1, y: 3 },\n          { x: 3, y: 5 },\n        ],\n      };\n      const resultDomain = Domain.getDomainWithZero(props, \"x\");\n      expect(resultDomain).toEqual([1, 3]);\n    });\n  });\n\n  describe(\"getMaxFromProps\", () => {\n    it(\"returns maxDomain from props as an object\", () => {\n      const props = { maxDomain: { x: 3 } };\n      const maxDomain = Domain.getMaxFromProps(props, \"x\");\n      expect(maxDomain).toEqual(props.maxDomain.x);\n    });\n\n    it(\"returns maxDomain from props as a number\", () => {\n      const props = { maxDomain: 3 };\n      const maxDomain = Domain.getMaxFromProps(props, \"x\");\n      expect(maxDomain).toEqual(props.maxDomain);\n    });\n\n    it(\"returns undefined when maxDomain is not defined for a given axis\", () => {\n      const props = { maxDomain: { y: 3 } };\n      const maxDomain = Domain.getMaxFromProps(props, \"x\");\n      expect(maxDomain).toBeUndefined();\n    });\n  });\n\n  describe(\"getMinFromProps\", () => {\n    it(\"returns minDomain from props as an object\", () => {\n      const props = { minDomain: { x: 3 } };\n      const minDomain = Domain.getMinFromProps(props, \"x\");\n      expect(minDomain).toEqual(props.minDomain.x);\n    });\n\n    it(\"returns minDomain from props as a number\", () => {\n      const props = { minDomain: 3 };\n      const minDomain = Domain.getMinFromProps(props, \"x\");\n      expect(minDomain).toEqual(props.minDomain);\n    });\n\n    it(\"returns undefined when minDomain is not defined for a given axis\", () => {\n      const props = { minDomain: { y: 3 } };\n      const minDomain = Domain.getMinFromProps(props, \"x\");\n      expect(minDomain).toBeUndefined();\n    });\n  });\n\n  describe(\"getSymmetricDomain\", () => {\n    it(\"pads the domain by a value determined by data spacing\", () => {\n      const domain = [0, 10];\n      const data = [2, 4, 6, 8];\n      const resultDomain = Domain.getSymmetricDomain(domain, data);\n      expect(resultDomain).toEqual([0, 12]);\n    });\n  });\n\n  describe(\"isDomainComponent\", () => {\n    class TestDomainComponent extends React.Component {\n      static role = \"area\";\n    }\n    it(\"returns true when a component has a static role matching a whitelist\", () => {\n      expect(Domain.isDomainComponent(<TestDomainComponent />)).toBe(true);\n    });\n\n    it(\"returns false when a component has a role that does not match the whitelist\", () => {\n      // eslint-disable-next-line react/no-multi-comp\n      class TestFooComponent extends React.Component {\n        static role = \"foo\";\n      }\n      expect(Domain.isDomainComponent(<TestFooComponent />)).toBe(false);\n    });\n\n    it(\"returns true when a domain component is wrapped in VictoryPortal\", () => {\n      expect(\n        Domain.isDomainComponent(\n          <VictoryPortal>\n            <TestDomainComponent />\n          </VictoryPortal>,\n        ),\n      ).toBe(true);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/domain.ts",
    "content": "import React from \"react\";\nimport isDate from \"lodash/isDate\";\nimport isPlainObject from \"lodash/isPlainObject\";\nimport sortedUniq from \"lodash/sortedUniq\";\n\nimport * as Data from \"./data\";\nimport * as Scale from \"./scale\";\nimport * as Helpers from \"./helpers\";\nimport * as Collection from \"./collection\";\n\n// Private Methods\n\nfunction cleanDomain(domain, props, axis) {\n  const scaleType = Scale.getScaleType(props, axis);\n\n  if (scaleType !== \"log\") {\n    return domain;\n  }\n\n  const rules = (dom) => {\n    const almostZero =\n      dom[0] < 0 || dom[1] < 0\n        ? -1 / Number.MAX_SAFE_INTEGER\n        : 1 / Number.MAX_SAFE_INTEGER;\n    const domainOne = dom[0] === 0 ? almostZero : dom[0];\n    const domainTwo = dom[1] === 0 ? almostZero : dom[1];\n    return [domainOne, domainTwo];\n  };\n\n  return rules(domain);\n}\n\nfunction getDomainPadding(props, axis) {\n  const formatPadding = (padding) => {\n    return Array.isArray(padding)\n      ? { left: padding[0], right: padding[1] }\n      : { left: padding, right: padding };\n  };\n\n  return isPlainObject(props.domainPadding)\n    ? formatPadding(props.domainPadding[axis])\n    : formatPadding(props.domainPadding);\n}\n\nfunction getFlatData(dataset, axis: \"x\" | \"y\") {\n  const axisKey = `_${axis}`;\n  return dataset.flat().map((datum: any) => {\n    return datum[axisKey] && datum[axisKey][1] !== undefined\n      ? datum[axisKey][1]\n      : datum[axisKey];\n  });\n}\n\nfunction getExtremeFromData(dataset, axis, type = \"min\") {\n  const getExtreme = (arr) =>\n    type === \"max\" ? Math.max(...arr) : Math.min(...arr);\n  const initialValue = type === \"max\" ? -Infinity : Infinity;\n  let containsDate = false;\n  const result = dataset.flat().reduce((memo: number, datum: any) => {\n    const current0 =\n      datum[`_${axis}0`] !== undefined ? datum[`_${axis}0`] : datum[`_${axis}`];\n    const current1 =\n      datum[`_${axis}1`] !== undefined ? datum[`_${axis}1`] : datum[`_${axis}`];\n    const current = getExtreme([current0, current1]);\n    containsDate =\n      containsDate || current0 instanceof Date || current1 instanceof Date;\n    return getExtreme([memo, current]);\n  }, initialValue);\n  return containsDate ? new Date(result) : result;\n}\n\nfunction padDomain(domain, props, axis) {\n  if (!props.domainPadding) {\n    return domain;\n  }\n\n  const minDomain = getMinFromProps(props, axis);\n  const maxDomain = getMaxFromProps(props, axis);\n  const padding = getDomainPadding(props, axis);\n  if (!padding.left && !padding.right) {\n    return domain;\n  }\n\n  const min = Collection.getMinValue(domain);\n  const max = Collection.getMaxValue(domain);\n  const currentAxis = Helpers.getCurrentAxis(axis, props.horizontal);\n  const range = Helpers.getRange(props, currentAxis);\n  const rangeExtent = Math.abs(range[0] - range[1]);\n\n  const paddedRangeExtent = Math.max(\n    rangeExtent - padding.left - padding.right,\n    1,\n  );\n  const paddedDomainExtent =\n    (Math.abs(max.valueOf() - min.valueOf()) / paddedRangeExtent) * rangeExtent;\n\n  const simplePadding = {\n    left: (paddedDomainExtent * padding.left) / rangeExtent,\n    right: (paddedDomainExtent * padding.right) / rangeExtent,\n  };\n\n  let paddedDomain = {\n    min: min.valueOf() - simplePadding.left,\n    max: max.valueOf() + simplePadding.right,\n  };\n\n  const singleQuadrantDomainPadding = isPlainObject(\n    props.singleQuadrantDomainPadding,\n  )\n    ? props.singleQuadrantDomainPadding[axis]\n    : props.singleQuadrantDomainPadding;\n\n  const addsQuadrants =\n    (min.valueOf() >= 0 && paddedDomain.min <= 0) ||\n    (max.valueOf() <= 0 && paddedDomain.max >= 0);\n\n  const adjust = (val, type) => {\n    const coerce =\n      (type === \"min\" && min.valueOf() >= 0 && val <= 0) ||\n      (type === \"max\" && max.valueOf() <= 0 && val >= 0);\n    return coerce ? 0 : val;\n  };\n\n  if (addsQuadrants && singleQuadrantDomainPadding !== false) {\n    // Naive initial padding calculation\n    const initialPadding = {\n      // @ts-expect-error `max/min` might be dates\n      left: (Math.abs(max - min) * padding.left) / rangeExtent,\n      // @ts-expect-error `max/min` might be dates\n      right: (Math.abs(max - min) * padding.right) / rangeExtent,\n    };\n\n    // Adjust the domain by the initial padding\n    const adjustedDomain = {\n      min: adjust(min.valueOf() - initialPadding.left, \"min\"),\n      max: adjust(max.valueOf() + initialPadding.right, \"max\"),\n    };\n\n    // re-calculate padding, taking the adjusted domain into account\n    const finalPadding = {\n      left:\n        (Math.abs(adjustedDomain.max - adjustedDomain.min) * padding.left) /\n        rangeExtent,\n      right:\n        (Math.abs(adjustedDomain.max - adjustedDomain.min) * padding.right) /\n        rangeExtent,\n    };\n\n    // Adjust the domain by the final padding\n    paddedDomain = {\n      min: adjust(min.valueOf() - finalPadding.left, \"min\"),\n      max: adjust(max.valueOf() + finalPadding.right, \"max\"),\n    };\n  }\n\n  // default to minDomain / maxDomain if they exist\n  const finalDomain = {\n    min: minDomain !== undefined ? minDomain : paddedDomain.min,\n    max: maxDomain !== undefined ? maxDomain : paddedDomain.max,\n  };\n\n  return min instanceof Date || max instanceof Date\n    ? getDomainFromMinMax(new Date(finalDomain.min), new Date(finalDomain.max))\n    : getDomainFromMinMax(finalDomain.min, finalDomain.max);\n}\n\n// Public Methods\n\n/**\n * Returns a getDomain function\n * @param {Function} getDomainFromDataFunction: a function that takes props and axis and\n * returns a domain based on data\n * @param {Function} formatDomainFunction: a function that takes domain, props, and axis and\n * returns a formatted domain\n * @returns {Function} a function that takes props and axis and returns a formatted domain\n */\nexport function createDomainFunction(\n  getDomainFromDataFunction?,\n  formatDomainFunction?,\n) {\n  const getDomainFromDataFn = Helpers.isFunction(getDomainFromDataFunction)\n    ? getDomainFromDataFunction\n    : getDomainFromData;\n  const formatDomainFn = Helpers.isFunction(formatDomainFunction)\n    ? formatDomainFunction\n    : formatDomain;\n  return (props, axis) => {\n    const propsDomain = getDomainFromProps(props, axis);\n    if (propsDomain) {\n      return formatDomainFn(propsDomain, props, axis);\n    }\n    const categories = Data.getCategories(props, axis);\n    const domain = categories\n      ? getDomainFromCategories(props, axis, categories)\n      : getDomainFromDataFn(props, axis);\n    return domain ? formatDomainFn(domain, props, axis) : undefined;\n  };\n}\n\n/**\n * Returns a formatted domain.\n * @param {Array} domain: a domain in the form of a two element array\n * @param {Object} props: the props object\n * @param {String} axis: the current axis\n * @returns {Array} a domain in the form of a two element array\n */\nexport function formatDomain(domain, props, axis) {\n  return cleanDomain(padDomain(domain, props, axis), props, axis);\n}\n\n/**\n * Returns a domain for a given axis based on props, category, or data\n * @param {Object} props: the props object\n * @param {String} axis: the current axis\n * @returns {Array} the domain for the given axis\n */\nexport function getDomain(props, axis) {\n  return createDomainFunction()(props, axis);\n}\n\n/**\n * Returns a domain based on categories if they exist\n * @param {Object} props: the props object\n * @param {String} axis: the current axis\n * @param {Array} categories: an array of categories corresponding to a given axis\n * @returns {Array|undefined} returns a domain from categories or undefined\n */\nexport function getDomainFromCategories(props, axis, categories?) {\n  const categoriesArray = categories || Data.getCategories(props, axis);\n  const { polar, startAngle = 0, endAngle = 360 } = props;\n  if (!categoriesArray) {\n    return undefined;\n  }\n  const minDomain = getMinFromProps(props, axis);\n  const maxDomain = getMaxFromProps(props, axis);\n  const stringArray = Collection.containsStrings(categoriesArray)\n    ? Data.getStringsFromCategories(props, axis)\n    : [];\n  const stringMap =\n    stringArray.length === 0\n      ? null\n      : stringArray.reduce((memo, string, index) => {\n          memo[string] = index + 1;\n          return memo;\n        }, {});\n  const categoryValues = stringMap\n    ? categoriesArray.map((value) => stringMap[value])\n    : categoriesArray;\n  const min =\n    minDomain !== undefined\n      ? minDomain\n      : Collection.getMinValue(categoryValues);\n  const max =\n    maxDomain !== undefined\n      ? maxDomain\n      : Collection.getMaxValue(categoryValues);\n  const categoryDomain = getDomainFromMinMax(min, max);\n  return polar && axis === \"x\" && Math.abs(startAngle - endAngle) === 360\n    ? getSymmetricDomain(categoryDomain, categoryValues)\n    : categoryDomain;\n}\n\n/**\n * Returns a domain from a dataset for a given axis\n * @param {Object} props: the props object\n * @param {String} axis: the current axis\n * @param {Array} dataset: an array of data\n * @returns {Array} the domain based on data\n */\nexport function getDomainFromData(props, axis, dataset) {\n  const datasetArray = dataset || Data.getData(props);\n  const { polar, startAngle = 0, endAngle = 360 } = props;\n  const minDomain = getMinFromProps(props, axis);\n  const maxDomain = getMaxFromProps(props, axis);\n  if (datasetArray.length < 1) {\n    return minDomain !== undefined && maxDomain !== undefined\n      ? getDomainFromMinMax(minDomain, maxDomain)\n      : undefined;\n  }\n  const min =\n    minDomain !== undefined\n      ? minDomain\n      : getExtremeFromData(datasetArray, axis, \"min\");\n  const max =\n    maxDomain !== undefined\n      ? maxDomain\n      : getExtremeFromData(datasetArray, axis, \"max\");\n  const domain = getDomainFromMinMax(min, max);\n  return polar && axis === \"x\" && Math.abs(startAngle - endAngle) === 360\n    ? getSymmetricDomain(domain, getFlatData(datasetArray, axis))\n    : domain;\n}\n\n/**\n * Returns a domain in the form of a two element array given a min and max value.\n * @param {Number|Date} min: the props object\n * @param {Number|Date} max: the current axis\n * @returns {Array} the minDomain based on props\n */\nexport function getDomainFromMinMax(min, max) {\n  const getSinglePointDomain = (val) => {\n    // d3-scale does not properly resolve very small differences.\n    const verySmallNumber =\n      // eslint-disable-next-line no-magic-numbers\n      val === 0 ? 2 * Math.pow(10, -10) : Math.pow(10, -10);\n    const verySmallDate = 1;\n    const minVal =\n      val instanceof Date\n        ? new Date(Number(val) - verySmallDate)\n        : Number(val) - verySmallNumber;\n    const maxVal =\n      val instanceof Date\n        ? new Date(Number(val) + verySmallDate)\n        : Number(val) + verySmallNumber;\n    return val === 0 ? [0, maxVal] : [minVal, maxVal];\n  };\n  return Number(min) === Number(max) ? getSinglePointDomain(max) : [min, max];\n}\n\n/**\n * Returns a the domain for a given axis if domain is given in props\n * @param {Object} props: the props object\n * @param {String} axis: the current axis\n * @returns {Array|undefined} the domain based on props\n */\nexport function getDomainFromProps(props, axis) {\n  const minDomain = getMinFromProps(props, axis);\n  const maxDomain = getMaxFromProps(props, axis);\n  if (isPlainObject(props.domain) && props.domain[axis]) {\n    return props.domain[axis];\n  } else if (Array.isArray(props.domain)) {\n    return props.domain;\n  } else if (minDomain !== undefined && maxDomain !== undefined) {\n    return getDomainFromMinMax(minDomain, maxDomain);\n  }\n  return undefined;\n}\n\n/**\n * Returns a domain for a given axis. This method forces the domain to include\n * zero unless the domain is explicitly specified in props.\n * @param {Object} props: the props object\n * @param {String} axis: the current axis\n * @returns {Array} the domain for the given axis\n */\nexport function getDomainWithZero(props, axis) {\n  const propsDomain = getDomainFromProps(props, axis);\n  if (propsDomain) {\n    return propsDomain;\n  }\n\n  const dataset = Data.getData(props);\n  const y0Min = dataset.reduce(\n    (min, datum) => (datum._y0 < min ? datum._y0 : min),\n    Infinity,\n  );\n\n  const ensureZero = (domain) => {\n    if (axis === \"x\") {\n      return domain;\n    }\n\n    const defaultMin = y0Min !== Infinity ? y0Min : 0;\n    const maxDomainProp = getMaxFromProps(props, axis);\n    const minDomainProp = getMinFromProps(props, axis);\n    const max =\n      maxDomainProp !== undefined\n        ? maxDomainProp\n        : Collection.getMaxValue(domain, defaultMin);\n    const min =\n      minDomainProp !== undefined\n        ? minDomainProp\n        : Collection.getMinValue(domain, defaultMin);\n\n    return getDomainFromMinMax(min, max);\n  };\n\n  const getDomainFunction = () => {\n    return getDomainFromData(props, axis, dataset);\n  };\n\n  const formatDomainFunction = (domain) => {\n    return formatDomain(ensureZero(domain), props, axis);\n  };\n\n  return createDomainFunction(getDomainFunction, formatDomainFunction)(\n    props,\n    axis,\n  );\n}\n\n/**\n * Returns the maxDomain from props if it exists\n * @param {Object} props: the props object\n * @param {String} axis: the current axis\n * @returns {Number|Date|undefined} the maxDomain based on props\n */\nexport function getMaxFromProps(props, axis) {\n  if (isPlainObject(props.maxDomain) && props.maxDomain[axis] !== undefined) {\n    return props.maxDomain[axis];\n  }\n  return typeof props.maxDomain === \"number\" || isDate(props.maxDomain)\n    ? props.maxDomain\n    : undefined;\n}\n\n/**\n * Returns the minDomain from props if it exists\n * @param {Object} props: the props object\n * @param {String} axis: the current axis\n * @returns {Number|Date|undefined} the minDomain based on props\n */\nexport function getMinFromProps(props, axis) {\n  if (isPlainObject(props.minDomain) && props.minDomain[axis] !== undefined) {\n    return props.minDomain[axis];\n  }\n  return typeof props.minDomain === \"number\" || isDate(props.minDomain)\n    ? props.minDomain\n    : undefined;\n}\n\n/**\n * Returns a symmetrically padded domain for polar charts\n * @param {Array} domain: the original domain\n * @param {Array} values: a flat array of values corresponding to either tickValues, or data values\n * for a given dimension i.e. only x values.\n * @returns {Array} the symmetric domain\n */\nexport function getSymmetricDomain(domain, values: number[]) {\n  const processedData = sortedUniq(values.sort((a, b) => a - b));\n  const step = processedData[1] - processedData[0];\n  return [domain[0], domain[1] + step];\n}\n\n/**\n * Checks whether a given component can be used to calculate domain\n * @param {Component} component: a React component instance\n * @returns {Boolean} Returns true if the given component has a role included in the whitelist\n */\nexport function isDomainComponent(component) {\n  const getRole = (child) => {\n    return child && child.type ? child.type.role : \"\";\n  };\n  let role = getRole(component);\n  if (role === \"portal\") {\n    const children = React.Children.toArray(component.props.children);\n    role = children.length ? getRole(children[0]) : \"\";\n  }\n  const whitelist = [\n    \"area\",\n    \"axis\",\n    \"bar\",\n    \"boxplot\",\n    \"candlestick\",\n    \"errorbar\",\n    \"group\",\n    \"histogram\",\n    \"line\",\n    \"pie\",\n    \"scatter\",\n    \"stack\",\n    \"voronoi\",\n  ];\n  return whitelist.includes(role);\n}\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/events.test.ts",
    "content": "import * as Events from \"./events\";\n\ndescribe(\"victory-util/events\", () => {\n  describe(\"getPartialEvents\", () => {\n    it(\"returns a set of new event functions with partially applied arguments\", () => {\n      const events = {\n        onClick: (evt, childProps, index) => {\n          return { evt, childProps, index };\n        },\n      };\n      const evt = {} as React.SyntheticEvent;\n      const index = \"TEST_INDEX\";\n      const childProps = { style: { fill: \"green\" } };\n      const result = Events.getPartialEvents(events, index, childProps);\n      expect(Object.keys(result)).toEqual([\"onClick\"]);\n      expect(Object.keys(result.onClick(evt))).toEqual([\n        \"evt\",\n        \"childProps\",\n        \"index\",\n      ]);\n      expect(result.onClick(evt).index).toEqual(index);\n      expect(result.onClick(evt).childProps).toEqual(childProps);\n    });\n  });\n\n  describe(\"getEvents\", () => {\n    let fake;\n    beforeEach(() => {\n      fake = {\n        props: {\n          events: [\n            {\n              target: \"data\",\n              eventHandlers: {\n                onClick: () => {\n                  return {\n                    mutation: () => {\n                      return { foo: \"foo\" };\n                    },\n                  };\n                },\n              },\n            },\n          ],\n        },\n        baseProps: {\n          0: {\n            data: { foo: \"bar\" },\n          },\n        },\n        setState: (x) => x,\n        state: {},\n      };\n      jest.spyOn(fake, \"setState\");\n    });\n\n    afterEach(() => {\n      jest.clearAllMocks();\n    });\n\n    it(\"returns new functions that call set state\", () => {\n      const getScopedEvents = Events.getScopedEvents.bind(fake);\n      const getBoundEvents = Events.getEvents.bind(fake);\n      const index = 0;\n      const result = getBoundEvents(fake.props, \"data\", index, getScopedEvents);\n      expect(Object.keys(result)).toEqual(expect.arrayContaining([\"onClick\"]));\n      const partialEvents = Events.getPartialEvents(result, index, {});\n      expect(Object.keys(partialEvents)).toEqual(\n        expect.arrayContaining([\"onClick\"]),\n      );\n      partialEvents.onClick({} as React.SyntheticEvent);\n      expect(fake.setState).toReturnWith({\n        [index]: {\n          data: { foo: \"foo\" },\n        },\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/events.ts",
    "content": "import React from \"react\";\nimport isEmpty from \"lodash/isEmpty\";\nimport pickBy from \"lodash/pickBy\";\nimport omitBy from \"lodash/omitBy\";\nimport uniq from \"lodash/uniq\";\n\nimport type { EventMixinCalculatedValues } from \"./add-events\";\nimport { isFunction } from \"./helpers\";\n\nconst GLOBAL_EVENT_REGEX = /^onGlobal(.*)$/;\n\ntype ComponentEventKey = string | number;\nexport interface ComponentEvent {\n  target?: \"parent\" | string;\n  eventKey?: ComponentEventKey | ComponentEventKey[];\n  eventHandlers: ComponentEventHandlers;\n}\n// Normally we'd use Template Literal Types, but we're avoiding it to maximize TS compatibility with TS < 4.1\nexport type ComponentEventName = string; // `on${Capitalize<string>}`;\nexport interface ComponentEventHandlers {\n  [k: ComponentEventName]: ComponentEventHandler;\n}\nexport type ComponentEventHandler = (\n  evt: React.SyntheticEvent,\n  childProps: unknown,\n  eventKey: ComponentEventKey,\n  eventName: ComponentEventName,\n) => UpdatedProps;\nexport type UpdatedProps = any;\n\ninterface ComponentWithEvents extends EventMixinCalculatedValues {\n  state;\n  setState;\n}\n\n/* Returns all own and shared events that should be attached to a single target element,\n * i.e. an individual bar specified by target: \"data\", eventKey: [index].\n * Returned events are scoped to the appropriate state. Either that of the component itself\n * (i.e. VictoryBar) in the case of own events, or that of the parent component\n * (i.e. VictoryChart) in the case of shared events\n */\n// eslint-disable-next-line max-params\nexport function getEvents(\n  this: ComponentWithEvents,\n  props,\n  target?,\n  eventKey?,\n  // eslint-disable-next-line no-shadow\n  getScopedEvents?,\n) {\n  // Returns all events that apply to a particular target element\n  const getEventsByTarget = (events: Array<ComponentEvent>) => {\n    const getSelectedEvents = () => {\n      const targetEvents = events.reduce((memo, event) => {\n        if (event.target !== undefined) {\n          const matchesTarget = Array.isArray(event.target)\n            ? event.target.includes(target)\n            : `${event.target}` === `${target}`;\n          return matchesTarget ? memo.concat(event) : memo;\n        }\n        return memo.concat(event);\n      }, [] as ComponentEvent[]);\n\n      if (eventKey !== undefined && target !== \"parent\") {\n        return targetEvents.filter((obj) => {\n          const targetKeys = obj.eventKey;\n          const useKey = (key) => (key ? `${key}` === `${eventKey}` : true);\n          return Array.isArray(targetKeys)\n            ? targetKeys.some((k) => useKey(k))\n            : useKey(targetKeys);\n        });\n      }\n      return targetEvents;\n    };\n\n    const selectedEvents = getSelectedEvents();\n    return (\n      Array.isArray(selectedEvents) &&\n      selectedEvents.reduce(\n        (memo, event) => {\n          return event ? Object.assign(memo, event.eventHandlers) : memo;\n        },\n        {} as ComponentEvent[\"eventHandlers\"],\n      )\n    );\n  };\n\n  /* Returns all events from props and defaultEvents from components. Events handlers\n   * specified in props will override handlers for the same event if they are also\n   * specified in defaultEvents of a sub-component\n   */\n  const getAllEvents = () => {\n    // Mandatory usage: `getEvents.bind(this)`\n\n    if (Array.isArray(this.componentEvents)) {\n      return Array.isArray(props.events)\n        ? this.componentEvents.concat(...props.events)\n        : this.componentEvents;\n    }\n\n    return props.events;\n  };\n\n  const allEvents = getAllEvents();\n  const ownEvents =\n    allEvents && isFunction(getScopedEvents)\n      ? getScopedEvents(getEventsByTarget(allEvents), target)\n      : undefined;\n  if (!props.sharedEvents) {\n    return ownEvents;\n  }\n  const getSharedEvents = props.sharedEvents.getEvents;\n  const sharedEvents =\n    props.sharedEvents.events &&\n    getSharedEvents(getEventsByTarget(props.sharedEvents.events), target);\n  return Object.assign({}, sharedEvents, ownEvents);\n}\n\n/* Returns a modified events object where each event handler is replaced by a new\n * function that calls the original handler and then calls setState with the return\n * of the original event handler assigned to state property that maps to the target\n * element.\n */\n// eslint-disable-next-line max-params\nexport function getScopedEvents(\n  this: ComponentWithEvents,\n  events,\n  namespace,\n  childType,\n  baseProps,\n) {\n  if (isEmpty(events)) {\n    return {};\n  }\n\n  // Mandatory usage: `getScopedEvents.bind(this)`\n\n  const newBaseProps = baseProps || this.baseProps;\n  // returns the original base props or base state of a given target element\n  const getTargetProps = (identifier, type) => {\n    const { childName, target, key } = identifier;\n\n    const baseType = type === \"props\" ? newBaseProps : this.state || {};\n    const base =\n      childName === undefined || childName === null || !baseType[childName]\n        ? baseType\n        : baseType[childName];\n    return key === \"parent\" ? base.parent : base[key] && base[key][target];\n  };\n\n  // Returns the state object with the mutation caused by a given eventReturn\n  // applied to the appropriate property on the state object\n  const parseEvent = (eventReturn, eventKey) => {\n    const childNames =\n      namespace === \"parent\"\n        ? eventReturn.childName\n        : eventReturn.childName || childType;\n    const target = eventReturn.target || namespace;\n\n    // returns all eventKeys to modify for a targeted childName\n    const getKeys = (childName) => {\n      if (target === \"parent\") {\n        return \"parent\";\n      }\n      if (eventReturn.eventKey === \"all\") {\n        return newBaseProps[childName]\n          ? Object.keys(newBaseProps[childName]).filter(\n              (value) => value !== \"parent\",\n            )\n          : Object.keys(newBaseProps).filter((value) => value !== \"parent\");\n      } else if (eventReturn.eventKey === undefined && eventKey === \"parent\") {\n        return newBaseProps[childName]\n          ? Object.keys(newBaseProps[childName])\n          : Object.keys(newBaseProps);\n      }\n      return eventReturn.eventKey !== undefined\n        ? eventReturn.eventKey\n        : eventKey;\n    };\n\n    // returns the state object with mutated props applied for a single key\n    const getMutationObject = (key, childName) => {\n      const baseState = this.state || {};\n      if (!isFunction(eventReturn.mutation)) {\n        return baseState;\n      }\n      const mutationTargetProps = getTargetProps(\n        { childName, key, target },\n        \"props\",\n      );\n      const mutationTargetState = getTargetProps(\n        { childName, key, target },\n        \"state\",\n      );\n      const mutatedProps = eventReturn.mutation(\n        Object.assign({}, mutationTargetProps, mutationTargetState),\n        newBaseProps,\n      );\n      const childState = baseState[childName] || {};\n\n      const filterState = (state) => {\n        if (state[key] && state[key][target]) {\n          delete state[key][target];\n        }\n        if (state[key] && !Object.keys(state[key]).length) {\n          delete state[key];\n        }\n        return state;\n      };\n\n      const extendState = (state) => {\n        return target === \"parent\"\n          ? Object.assign(state, {\n              [key]: Object.assign(state[key] || {}, mutatedProps),\n            })\n          : Object.assign(state, {\n              [key]: Object.assign(state[key] || {}, {\n                [target]: mutatedProps,\n              }),\n            });\n      };\n\n      const updateState = (state) => {\n        return mutatedProps ? extendState(state) : filterState(state);\n      };\n\n      return childName !== undefined && childName !== null\n        ? Object.assign(baseState, { [childName]: updateState(childState) })\n        : updateState(baseState);\n    };\n\n    // returns entire mutated state for a given childName\n    const getReturnByChild = (childName) => {\n      const mutationKeys = getKeys(childName);\n      return Array.isArray(mutationKeys)\n        ? mutationKeys.reduce((memo, key) => {\n            return Object.assign(memo, getMutationObject(key, childName));\n          }, {})\n        : getMutationObject(mutationKeys, childName);\n    };\n\n    // returns an entire mutated state for all children\n    const allChildNames =\n      childNames === \"all\"\n        ? Object.keys(newBaseProps).filter((value) => value !== \"parent\")\n        : childNames;\n    return Array.isArray(allChildNames)\n      ? allChildNames.reduce((memo, childName) => {\n          return Object.assign(memo, getReturnByChild(childName));\n        }, {})\n      : getReturnByChild(allChildNames);\n  };\n\n  // Parses an array of event returns into a single state mutation\n  const parseEventReturn = (eventReturn, eventKey) => {\n    return Array.isArray(eventReturn)\n      ? eventReturn.reduce(\n          (memo, props) => Object.assign({}, memo, parseEvent(props, eventKey)),\n          {},\n        )\n      : parseEvent(eventReturn, eventKey);\n  };\n\n  const compileCallbacks = (eventReturn) => {\n    const getCallback = (obj) => isFunction(obj.callback) && obj.callback;\n    const callbacks = Array.isArray(eventReturn)\n      ? eventReturn.map((evtObj) => getCallback(evtObj))\n      : [getCallback(eventReturn)];\n    const callbackArray = callbacks.filter((callback) => callback !== false);\n    return callbackArray.length\n      ? () => callbackArray.forEach((callback) => callback())\n      : undefined;\n  };\n\n  // A function that calls a particular event handler, parses its return\n  // into a state mutation, and calls setState\n  // eslint-disable-next-line max-params\n  const onEvent = (evt, childProps, eventKey, eventName) => {\n    const eventReturn = events[eventName](evt, childProps, eventKey, this);\n    if (!isEmpty(eventReturn)) {\n      const callbacks = compileCallbacks(eventReturn);\n\n      this.setState(parseEventReturn(eventReturn, eventKey), callbacks);\n    }\n  };\n\n  // returns a new events object with enhanced event handlers\n  return Object.keys(events).reduce((memo, event) => {\n    memo[event] = onEvent;\n    return memo;\n  }, {});\n}\n\n/*\n * Returns a partially applied event handler for a specific target element\n * This allows event handlers to have access to props controlling each element\n */\nexport function getPartialEvents(\n  events: ComponentEventHandlers,\n  eventKey: ComponentEventKey,\n  childProps: unknown,\n): PartialEvents {\n  if (!events) return {};\n\n  return Object.keys(events).reduce((memo, eventName) => {\n    const appliedEvent = (evt) =>\n      events[eventName](evt, childProps, eventKey, eventName);\n    memo[eventName] = appliedEvent;\n    return memo;\n  }, {} as PartialEvents);\n}\nexport interface PartialEvents {\n  [eventName: ComponentEventName]: (evt: React.SyntheticEvent) => UpdatedProps;\n}\n\n/* Returns the property of the state object corresponding to event changes for\n * a particular element\n */\n// eslint-disable-next-line max-params\nexport function getEventState(\n  this: ComponentWithEvents,\n  eventKey: ComponentEventKey,\n  namespace: string,\n  childType?: string,\n) {\n  // Mandatory usage: `getEventState.bind(this)`\n\n  const state = this.state || {};\n  if (!childType) {\n    return eventKey === \"parent\"\n      ? (state[eventKey] && state[eventKey][namespace]) || state[eventKey]\n      : state[eventKey] && state[eventKey][namespace];\n  }\n  return (\n    state[childType] &&\n    state[childType][eventKey] &&\n    state[childType][eventKey][namespace]\n  );\n}\n\n/**\n * Returns a set of all mutations for shared events\n *\n * @param  {Array} mutations an array of mutations objects\n * @param  {Object} baseProps an object that describes all props for children of VictorySharedEvents\n * @param  {Object} baseState an object that describes state for children of VictorySharedEvents\n * @param  {Array} childNames an array of childNames\n *\n * @return {Object} a object describing all mutations for VictorySharedEvents\n */\n// eslint-disable-next-line max-params\nexport function getExternalMutationsWithChildren(\n  mutations,\n  baseProps = {},\n  baseState = {},\n  childNames,\n) {\n  return childNames.reduce((memo, childName) => {\n    const childState = baseState[childName];\n    const mutation = getExternalMutations(\n      mutations,\n      baseProps[childName],\n      baseState[childName],\n      childName,\n    );\n    memo[childName] = mutation ? mutation : childState;\n    return pickBy(memo, (v) => !isEmpty(v));\n  }, {});\n}\n\n/**\n * Returns a set of all mutations for a component\n *\n * @param  {Array} mutations an array of mutations objects\n * @param  {Object} baseProps a props object (scoped to a childName when used by shared events)\n * @param  {Object} baseState a state object (scoped to a childName when used by shared events)\n * @param  {String} childName an optional childName\n *\n * @return {Object} a object describing mutations for a given component\n */\n// eslint-disable-next-line max-params\nexport function getExternalMutations(\n  mutations,\n  baseProps = {},\n  baseState = {},\n  childName?,\n) {\n  const eventKeys = Object.keys(baseProps);\n  return eventKeys.reduce((memo, eventKey) => {\n    const keyState = baseState[eventKey] || {};\n    const keyProps = baseProps[eventKey] || {};\n    if (eventKey === \"parent\") {\n      const identifier = { eventKey, target: \"parent\" };\n      const mutation = getExternalMutation(\n        mutations,\n        keyProps,\n        keyState,\n        identifier,\n      );\n      memo[eventKey] =\n        mutation !== undefined\n          ? Object.assign({}, keyState, mutation)\n          : keyState;\n    } else {\n      // use keys from both state and props so that elements not intially included in baseProps\n      // will be used. (i.e. labels)\n      const targets = uniq(Object.keys(keyProps).concat(Object.keys(keyState)));\n      memo[eventKey] = targets.reduce((m, target) => {\n        const identifier = { eventKey, target, childName };\n        const mutation = getExternalMutation(\n          mutations,\n          keyProps[target],\n          keyState[target],\n          identifier,\n        );\n        m[target] =\n          mutation !== undefined\n            ? Object.assign({}, keyState[target], mutation)\n            : keyState[target];\n        return pickBy(m, (v) => !isEmpty(v));\n      }, {});\n    }\n    return pickBy(memo, (v) => !isEmpty(v));\n  }, {});\n}\n\n/**\n * Returns a set of mutations for a particular element given scoped baseProps and baseState\n *\n * @param  {Array} mutations an array of mutations objects\n * @param  {Object} baseProps a props object (scoped the element specified by the identifier)\n * @param  {Object} baseState a state object (scoped the element specified by the identifier)\n * @param  {Object} identifier { eventKey, target, childName }\n *\n * @return {Object | undefined} a object describing mutations for a given element, or undefined\n */\n// eslint-disable-next-line max-params\nexport function getExternalMutation(\n  mutations,\n  baseProps,\n  baseState,\n  identifier,\n) {\n  const filterMutations = (mutation, type) => {\n    if (typeof mutation[type] === \"string\") {\n      return mutation[type] === \"all\" || mutation[type] === identifier[type];\n    } else if (Array.isArray(mutation[type])) {\n      // coerce arrays to strings before matching\n      const stringArray = mutation[type].map((m) => `${m}`);\n      return stringArray.includes(identifier[type]);\n    }\n    return false;\n  };\n\n  let scopedMutations = Array.isArray(mutations) ? mutations : [mutations];\n  if (identifier.childName) {\n    scopedMutations = mutations.filter((m) => filterMutations(m, \"childName\"));\n  }\n  // find any mutation objects that match the target\n  const targetMutations = scopedMutations.filter((m) =>\n    filterMutations(m, \"target\"),\n  );\n  if (isEmpty(targetMutations)) {\n    return undefined;\n  }\n  const keyMutations = targetMutations.filter((m) =>\n    filterMutations(m, \"eventKey\"),\n  );\n  if (isEmpty(keyMutations)) {\n    return undefined;\n  }\n  return keyMutations.reduce((memo, curr) => {\n    const mutationFunction =\n      curr && isFunction(curr.mutation) ? curr.mutation : () => undefined;\n    const currentMutation = mutationFunction(\n      Object.assign({}, baseProps, baseState),\n    );\n    return Object.assign({}, memo, currentMutation);\n  }, {});\n}\n\n/* Returns an array of defaultEvents from sub-components of a given component.\n * i.e. any static `defaultEvents` on `labelComponent` will be returned\n */\nexport function getComponentEvents(props, components) {\n  const events =\n    Array.isArray(components) &&\n    components.reduce((memo, componentName) => {\n      const component = props[componentName];\n      const defaultEvents =\n        component && component.type && component.type.defaultEvents;\n      const componentEvents = isFunction(defaultEvents)\n        ? defaultEvents(component.props)\n        : defaultEvents;\n      return Array.isArray(componentEvents)\n        ? memo.concat(...componentEvents)\n        : memo;\n    }, [] as ComponentEvent[]);\n  return events && events.length ? events : undefined;\n}\n\nexport function getGlobalEventNameFromKey(key) {\n  const match = key.match(GLOBAL_EVENT_REGEX);\n  return match && match[1] && match[1].toLowerCase();\n}\n\nexport const getGlobalEvents = (events) =>\n  pickBy(events, (_, key) => GLOBAL_EVENT_REGEX.test(key));\n\nexport const omitGlobalEvents = (events) =>\n  omitBy(events, (_, key) => GLOBAL_EVENT_REGEX.test(key));\n\nexport const emulateReactEvent = (event) =>\n  Object.assign(event, { nativeEvent: event });\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/helpers.test.ts",
    "content": "import * as Helpers from \"./helpers\";\n\ndescribe(\"victory-util/helpers\", () => {\n  describe(\"invert\", () => {\n    it(\"inverts a given object\", () => {\n      const data = { x: 3, y: \"2\", z: 1 };\n      const invertedData = Helpers.invert(data);\n      expect(invertedData).toEqual({ 3: \"x\", 2: \"y\", 1: \"z\" });\n    });\n\n    it(\"handles duplicate values by taking the last key\", () => {\n      const data = { x: 3, y: 2, z: 1, a: 2 };\n      const invertedData = Helpers.invert(data);\n      expect(invertedData).toEqual({ 3: \"x\", 2: \"a\", 1: \"z\" });\n    });\n  });\n\n  describe(\"omit\", () => {\n    const data = { x: 3, y: 2, z: 1 };\n\n    it(\"removes omitted keys and preserves all others\", () => {\n      const newData = Helpers.omit(data, [\"x\"]);\n      // @ts-expect-error This property is deleted, as expected\n      expect(newData.x).toBeUndefined();\n      expect(newData.y).toEqual(2);\n      expect(newData.z).toEqual(1);\n    });\n\n    it(\"creates a copy of the original object\", () => {\n      const newData = Helpers.omit(data, []);\n      newData.x = 10;\n      expect(data.x).toEqual(3);\n      expect(newData.x).toEqual(10);\n    });\n\n    it(\"defaults to an empty object\", () => {\n      // @ts-expect-error This should complain\n      const newData = Helpers.omit();\n      expect(newData).toEqual({});\n    });\n\n    it(\"defaults to simple shallow copy\", () => {\n      const newData = Helpers.omit(data);\n      expect(newData).toEqual(data);\n    });\n  });\n\n  describe(\"modifyProps\", () => {\n    it(\"defaults to an empty object\", () => {\n      expect(Helpers.modifyProps({})).toEqual({});\n    });\n\n    it(\"removes the theme role's style\", () => {\n      const role = \"legend\";\n      const props = {\n        theme: {\n          legend: {\n            style: {\n              color: \"blue\",\n            },\n            data: 42,\n          },\n        },\n      };\n      const fallbackProps = {};\n      const modifiedProps = {\n        ...props,\n        data: 42,\n      };\n      expect(Helpers.modifyProps(props, fallbackProps, role)).toEqual(\n        modifiedProps,\n      );\n    });\n\n    it(\"uses fallbackProps\", () => {\n      const props = { x: 2, y: 3 };\n      const fallbackProps = { x: 12, y: 13, z: 14 };\n      const modifiedProps = { x: 2, y: 3, z: 14 };\n      expect(Helpers.modifyProps(props, fallbackProps)).toEqual(modifiedProps);\n    });\n  });\n\n  describe(\"evaluateProp\", () => {\n    const data = { x: 3, y: 2 };\n\n    it(\"evaluates functional props\", () => {\n      const testProp = (datum) => (datum.y > 0 ? \"red\" : \"blue\");\n      expect(Helpers.evaluateProp(testProp, data)).toEqual(\"red\");\n    });\n\n    it(\"doesn't alter non-functional props\", () => {\n      const testProp = \"blue\";\n      expect(Helpers.evaluateProp(testProp, data)).toEqual(\"blue\");\n    });\n  });\n\n  describe(\"evaluateStyle\", () => {\n    const data = { x: 3, y: 2 };\n\n    it(\"evaluates functional styles, without altering others\", () => {\n      const style = {\n        color: (datum) => (datum.y > 0 ? \"red\" : \"blue\"),\n        size: 5,\n      };\n      expect(Helpers.evaluateStyle(style, data)).toEqual({\n        color: \"red\",\n        size: 5,\n      });\n    });\n\n    it(\"returns no styles if disableInlineStyles is true\", () => {\n      const style = {\n        color: \"blue\",\n      };\n      const props = {\n        disableInlineStyles: true,\n      };\n      expect(Helpers.evaluateStyle(style, props)).toEqual({});\n    });\n  });\n\n  describe(\"getRange\", () => {\n    const props = {\n      width: 100,\n      height: 200,\n      padding: 0,\n    };\n\n    it(\"returns a range based on props and axis\", () => {\n      const x = Helpers.getRange(props, \"x\");\n      expect(Array.isArray(x)).toBe(true);\n      expect(x).toHaveLength(2);\n      expect(x).toEqual([0, 100]);\n\n      const y = Helpers.getRange(props, \"y\");\n      expect(Array.isArray(y)).toBe(true);\n      expect(y).toHaveLength(2);\n      expect(y).toEqual([200, 0]);\n    });\n  });\n\n  describe(\"getStyles\", () => {\n    const defaultStyles = {\n      parent: { border: \"black\" },\n      data: { fill: \"blue\", stroke: \"black\" },\n      labels: { fontSize: 10, fontFamily: \"Helvetica\" },\n    };\n\n    it(\"merges styles\", () => {\n      const style = { data: { fill: \"red\" }, labels: { fontSize: 12 } };\n      const styles = Helpers.getStyles(style, defaultStyles);\n      expect(styles.parent).toEqual({\n        border: \"black\",\n        width: \"100%\",\n        height: \"100%\",\n      });\n      expect(styles.data).toEqual({ fill: \"red\", stroke: \"black\" });\n      expect(styles.labels).toEqual({\n        fontSize: 12,\n        fontFamily: \"Helvetica\",\n      });\n    });\n  });\n\n  describe(\"getPadding\", () => {\n    it(\"sets padding from a single number\", () => {\n      const props = { padding: 40 };\n      expect(Helpers.getPadding(props.padding)).toEqual({\n        top: 40,\n        bottom: 40,\n        left: 40,\n        right: 40,\n      });\n    });\n\n    it(\"sets padding from a complete object\", () => {\n      const props = {\n        padding: { top: 20, bottom: 40, left: 60, right: 80 },\n      };\n      expect(Helpers.getPadding(props.padding)).toEqual(props.padding);\n    });\n\n    it(\"fills missing values with 0\", () => {\n      const props = {\n        padding: { top: 40, bottom: 40 },\n      };\n      expect(Helpers.getPadding(props.padding)).toEqual({\n        top: 40,\n        bottom: 40,\n        left: 0,\n        right: 0,\n      });\n    });\n  });\n\n  describe(\"createAccessor\", () => {\n    it(\"creates a valid object accessor from a property key\", () => {\n      const accessor = Helpers.createAccessor(\"k\");\n      expect(accessor({ k: 42 })).toEqual(42);\n    });\n\n    it(\"creates a valid array accessor from an index\", () => {\n      const accessor = Helpers.createAccessor(2);\n      expect(accessor([3, 4, 5])).toEqual(5);\n    });\n\n    it(\"creates a valid array accessor from a deeply nested path\", () => {\n      const accessor = Helpers.createAccessor(\"x.y[0].0.z\");\n      expect(accessor({ x: { y: [[{ z: 1987 }]] } })).toEqual(1987);\n    });\n\n    it(\"creates a value (passthrough) accessor from null/undefined\", () => {\n      const nullAccessor = Helpers.createAccessor(null);\n      const undefinedAccessor = Helpers.createAccessor(undefined);\n      expect(nullAccessor(\"ok\")).toEqual(\"ok\");\n      expect(undefinedAccessor(14)).toEqual(14);\n    });\n  });\n\n  describe(\"range\", () => {\n    it(\"returns an array of integers\", () => {\n      expect(Helpers.range(4)).toEqual([0, 1, 2, 3]);\n    });\n\n    it(\"returns an array of integers for negative n\", () => {\n      expect(Helpers.range(-4)).toEqual([0, -1, -2, -3]);\n    });\n\n    it(\"returns an array of integers from start to end\", () => {\n      expect(Helpers.range(1, 5)).toEqual([1, 2, 3, 4]);\n    });\n\n    it(\"returns an array of integers from negative start to end\", () => {\n      expect(Helpers.range(-5, 5)).toEqual([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]);\n    });\n\n    it(\"returns an array of integers from start to negative end\", () => {\n      expect(Helpers.range(5, -5)).toEqual([5, 4, 3, 2, 1, 0, -1, -2, -3, -4]);\n    });\n\n    it(\"returns an array of integers using an increment\", () => {\n      expect(Helpers.range(0, 20, 5)).toEqual([0, 5, 10, 15]);\n    });\n\n    it(\"returns an array of integers using an increment and negative start\", () => {\n      expect(Helpers.range(-10, 20, 5)).toEqual([-10, -5, 0, 5, 10, 15]);\n    });\n\n    it(\"returns an array of numbers from a floating point increment\", () => {\n      expect(Helpers.range(0, 1, 0.2).length).toEqual(5);\n    });\n\n    it(\"should parse non-integer values\", () => {\n      expect(Helpers.range(4.7)).toEqual([0, 1, 2, 3, 4]);\n    });\n\n    it(\"should not throw on undefined start value\", () => {\n      expect(Helpers.range(undefined as any)).toEqual([]);\n    });\n\n    it(\"should not throw on NaN start value\", () => {\n      expect(Helpers.range(NaN as any)).toEqual([]);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/helpers.ts",
    "content": "import React, { isValidElement } from \"react\";\nimport defaults from \"lodash/defaults\";\nimport property from \"lodash/property\";\nimport pick from \"lodash/pick\";\n\nimport { ValueOrAccessor } from \"../types/prop-types\";\n\nexport type ElementPadding = {\n  top: number;\n  bottom: number;\n  left: number;\n  right: number;\n};\n\nexport type MaybePointData = {\n  x?: number;\n  x0?: number;\n  x1?: number;\n  y?: number;\n  y0?: number;\n  y1?: number;\n  _x?: number;\n  _x0?: number;\n  _x1?: number;\n  _y?: number;\n  _y0?: number;\n  _y1?: number;\n  _voronoiX?: number;\n  _voronoiY?: number;\n};\n\n/**\n * Determine the range of a cartesian axis\n */\nfunction getCartesianRange(options: {\n  axis: \"x\" | \"y\";\n  height: number;\n  width: number;\n  padding: ElementPadding;\n}): [number, number] {\n  const vertical = options.axis !== \"x\";\n  if (vertical) {\n    return [options.height - options.padding.bottom, options.padding.top];\n  }\n  return [options.padding.left, options.width - options.padding.right];\n}\n\n/**\n * Determine the range of a polar axis in radians\n */\nfunction getPolarRange(options: {\n  axis: \"x\" | \"y\";\n  innerRadius?: number;\n  startAngle?: number;\n  endAngle?: number;\n  padding: ElementPadding;\n  height: number;\n  width: number;\n}): [number, number] {\n  if (options.axis === \"x\") {\n    const startAngle = degreesToRadians(options.startAngle || 0);\n    const endAngle = degreesToRadians(options.endAngle || 360);\n    return [startAngle, endAngle];\n  }\n  return [\n    options.innerRadius || 0,\n    getRadius({\n      height: options.height,\n      width: options.width,\n      padding: options.padding,\n    }),\n  ];\n}\n\n/**\n * Creates an object composed of the inverted keys and values of object.\n * If object contains duplicate values, subsequent values overwrite property assignments of previous values.\n */\nexport function invert(original: Record<string, string | number>) {\n  return Object.entries(original).reduce((acc, current) => {\n    acc[current[1]] = current[0];\n    return acc;\n  }, {});\n}\n\n/**\n * creates an object with some keys excluded\n * replacement for lodash.omit for performance. does not mimic the entire lodash.omit api\n * @param {Object} originalObject: created object will be based on this object\n * @param {Array<String>} ks: an array of keys to omit from the new object\n * @returns {Object} new object with same properties as originalObject\n */\nexport function omit<T, Keys extends keyof T>(\n  originalObject: T,\n  ks: Array<Keys> = [],\n): Omit<T, Keys> {\n  // code based on babel's _objectWithoutProperties\n  const newObject = {} as T;\n  for (const key in originalObject) {\n    // @ts-expect-error String is not assignable to Key\n    if (ks.indexOf(key) >= 0) {\n      continue;\n    }\n    if (!Object.prototype.hasOwnProperty.call(originalObject, key)) {\n      continue;\n    }\n    newObject[key] = originalObject[key];\n  }\n  return newObject;\n}\n\n/**\n * Coalesce the x and y values from a data point\n */\nexport function getPoint(datum: MaybePointData): MaybePointData {\n  const { _x, _x1, _x0, _voronoiX, _y, _y1, _y0, _voronoiY } = datum;\n  const defaultX = _x1 ?? _x;\n  const defaultY = _y1 ?? _y;\n\n  const point = {\n    x: _voronoiX ?? defaultX,\n    x0: _x0 ?? _x,\n    y: _voronoiY ?? defaultY,\n    y0: _y0 ?? _y,\n  };\n\n  return defaults({}, point, datum);\n}\n\n/**\n * Scale a point based on the origin, direction, and given scale function\n */\nexport function scalePoint(\n  props: {\n    scale: { x: (x?: number) => number; y: (y?: number) => number };\n    polar?: boolean;\n    horizontal?: boolean;\n    origin?: { x: number; y: number };\n  },\n  datum: MaybePointData,\n) {\n  const { scale, polar, horizontal } = props;\n  const d = getPoint(datum);\n  const origin = props.origin || { x: 0, y: 0 };\n  const x = horizontal ? scale.y(d.y) : scale.x(d.x);\n  const x0 = horizontal ? scale.y(d.y0) : scale.x(d.x0);\n  const y = horizontal ? scale.x(d.x) : scale.y(d.y);\n  const y0 = horizontal ? scale.x(d.x0) : scale.y(d.y0);\n  return {\n    x: polar ? y * Math.cos(x) + origin.x : x,\n    x0: polar ? y0 * Math.cos(x0) + origin.x : x0,\n    y: polar ? -y * Math.sin(x) + origin.y : y,\n    y0: polar ? -y0 * Math.sin(x0) + origin.x : y0,\n  };\n}\n\n/**\n * Returns a padding value from a number or partial padding values\n */\nexport function getPadding(\n  padding?: number | Partial<ElementPadding>,\n): ElementPadding {\n  const paddingVal = typeof padding === \"number\" ? padding : 0;\n  const paddingObj = typeof padding === \"object\" ? padding : {};\n  return {\n    top: paddingObj.top || paddingVal,\n    bottom: paddingObj.bottom || paddingVal,\n    left: paddingObj.left || paddingVal,\n    right: paddingObj.right || paddingVal,\n  };\n}\n\n/**\n * Returns true if the component is defined as a tooltip\n */\nexport function isTooltip(component?: { type?: { role?: string } }) {\n  const labelRole = component && component.type && component.type.role;\n  return labelRole === \"tooltip\";\n}\n\nexport function getDefaultStyles(props, role) {\n  const { theme = {}, labelComponent } = props;\n  const defaultStyles = (theme[role] && theme[role].style) || {};\n  if (!isTooltip(labelComponent)) {\n    return defaultStyles;\n  }\n  const tooltipStyle = (theme.tooltip && theme.tooltip.style) || {};\n  const labelStyle = defaults({}, tooltipStyle, defaultStyles.labels);\n  return defaults({}, { labels: labelStyle }, defaultStyles);\n}\n\nexport function getStyles(style, defaultStyles) {\n  const width = \"100%\";\n  const height = \"100%\";\n  if (!style) {\n    return defaults({ parent: { height, width } }, defaultStyles);\n  }\n  const { data, labels, parent } = style;\n  const defaultParent = (defaultStyles && defaultStyles.parent) || {};\n  const defaultLabels = (defaultStyles && defaultStyles.labels) || {};\n  const defaultData = (defaultStyles && defaultStyles.data) || {};\n  return {\n    parent: defaults({}, parent, defaultParent, { width, height }),\n    labels: defaults({}, labels, defaultLabels),\n    data: defaults({}, data, defaultData),\n  };\n}\n\n/**\n * Returns the value of a prop or accessor function with the given props\n */\nexport function evaluateProp<TValue>(\n  prop: ValueOrAccessor<TValue, Record<string, any>>,\n  props: Record<string, any>,\n): TValue {\n  return isFunction(prop) ? prop(props) : prop;\n}\n\nexport function evaluateStyle(style, props) {\n  if (props.disableInlineStyles) {\n    return {};\n  }\n  if (!style || !Object.keys(style).some((value) => isFunction(style[value]))) {\n    return style;\n  }\n  return Object.keys(style).reduce((prev, curr) => {\n    prev[curr] = evaluateProp(style[curr], props);\n    return prev;\n  }, {});\n}\n\nexport function degreesToRadians(degrees) {\n  return typeof degrees === \"number\" ? degrees * (Math.PI / 180) : degrees;\n}\n\nexport function radiansToDegrees(radians) {\n  return typeof radians === \"number\" ? radians / (Math.PI / 180) : radians;\n}\n\n/**\n * Get the maximum radius that will fit in the container\n */\nexport function getRadius(options: {\n  height: number;\n  width: number;\n  padding: ElementPadding;\n}) {\n  const { width, height, padding } = options;\n  const { left, right, top, bottom } = padding;\n  return Math.min(width - left - right, height - top - bottom) / 2;\n}\n\n/**\n * Returns the origin for a polar chart within the padded area\n */\nexport function getPolarOrigin(props: {\n  height: number;\n  width: number;\n  padding: ElementPadding;\n}): { x: number; y: number } {\n  const { width, height } = props;\n  const { top, bottom, left, right } = getPadding(props.padding);\n  const radius = Math.min(width - left - right, height - top - bottom) / 2;\n  const offsetWidth = width / 2 + left - right;\n  const offsetHeight = height / 2 + top - bottom;\n  return {\n    x: offsetWidth + radius > width ? radius + left - right : offsetWidth,\n    y: offsetHeight + radius > height ? radius + top - bottom : offsetHeight,\n  };\n}\n\n/**\n * Determine the range of an axis based on the given props\n */\nexport function getRange(\n  props: {\n    range?: [number, number];\n    polar?: boolean;\n    innerRadius?: number;\n    startAngle?: number;\n    endAngle?: number;\n    height: number;\n    width: number;\n    padding: number | Partial<ElementPadding>;\n  },\n  axis: \"x\" | \"y\",\n) {\n  if (props.range && props.range[axis]) {\n    return props.range[axis];\n  } else if (props.range && Array.isArray(props.range)) {\n    return props.range;\n  }\n  return props.polar\n    ? getPolarRange({\n        axis,\n        innerRadius: props.innerRadius,\n        startAngle: props.startAngle,\n        endAngle: props.endAngle,\n        height: props.height,\n        width: props.width,\n        padding: getPadding(props.padding),\n      })\n    : getCartesianRange({\n        axis,\n        height: props.height,\n        width: props.width,\n        padding: getPadding(props.padding),\n      });\n}\n\n/**\n * Checks if `value` is `null` or `undefined`.\n * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n */\nexport function isNil(value: any): boolean {\n  // eslint-disable-next-line eqeqeq\n  return value == null;\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @since 0.1.0\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n */\nexport function isFunction(value: any): value is (...args: any[]) => any {\n  return typeof value === \"function\";\n}\n\nexport function createAccessor(key) {\n  // creates a data accessor function\n  // given a property key, path, array index, or null for identity.\n  if (isFunction(key)) {\n    return key;\n  } else if (key === null || key === undefined) {\n    // null/undefined means \"return the data item itself\"\n    return (x) => x;\n  }\n  // otherwise, assume it is an array index, property key or path (_.property handles all three)\n  return property(key);\n}\n\nexport function modifyProps(props, fallbackProps?, role?) {\n  const theme = props.theme && props.theme[role] ? props.theme[role] : {};\n  const themeProps = omit(theme, [\"style\"]);\n  const horizontal = isHorizontal(props);\n  const defaultObject = horizontal === undefined ? {} : { horizontal };\n  return defaults(defaultObject, props, themeProps, fallbackProps);\n}\n\n/**\n * Returns the given axis or the opposite axis when horizontal\n * @param {string} axis: the given axis, either \"x\" pr \"y\"\n * @param {Boolean} horizontal: true when the chart is flipped to the horizontal orientation\n * @returns {String} the dimension appropriate for the axis given its props \"x\" or \"y\"\n */\nexport function getCurrentAxis(axis, horizontal) {\n  const otherAxis = axis === \"x\" ? \"y\" : \"x\";\n  return horizontal ? otherAxis : axis;\n}\n\n/**\n * Creates an object with the same keys as object and values generated by running\n * each own enumerable string keyed property of object through the function fn\n */\nexport function mapValues<T>(\n  values: T,\n  fn: (value?: any) => any,\n): T | undefined {\n  if (values) {\n    return Object.keys(values).reduce((acc, key) => {\n      acc[key] = fn(values[key]);\n      return acc;\n    }, {} as T);\n  }\n}\n\n/**\n * Creates an array of numbers (positive and/or negative) progressing\n * from start up to, but not including, end.\n * A step of -1 is used if a negative start is specified without an end or step.\n * If end is not specified, it's set to start with start then set to 0.\n *\n * @param start The length of the array to create, or the start value\n * @param end [The end value] If this is defined, start is the start value\n * @returns An array of the given length\n */\nexport function range(start: number, end?: number, increment?: number) {\n  // when the end index is not given, start from 0\n  const startIndex = end ? start : 0;\n\n  // when the end index is not given, the end of the range is the start index\n  let endIndex = end ? end : start;\n\n  // ensure endIndex is not a falsy value\n  if (!endIndex) endIndex = 0;\n\n  const k = endIndex - startIndex; // the value range\n  const length = Math.abs(k); //      the length of the range\n  const sign = k / length || 1; //    the sign of the range (negative or positive)\n  const inc = increment || 1; //      the step size of each increment\n\n  // normalize the array length when dealing with floating point values\n  const arrayLength = Math.max(Math.ceil(length / inc), 0);\n\n  return Array.from(Array(arrayLength), (_, i) => startIndex + i * sign * inc);\n}\n\n/**\n * @param {Array} children: an array of child components\n * @param {Function} iteratee: a function with arguments \"child\", \"childName\", and \"parent\"\n * @param {Object} parentProps: props from the parent that are applied to children\n * @param {any}  initialMemo: The object in which the iteration results are combined.\n * @param {Function} combine: Combines the result of the iteratee with the current memo\n *   to the memo for the next iteration step\n * @returns {Array} returns an array of results from calling the iteratee on all nested children\n */\n/* eslint-disable max-params */\nexport function reduceChildren<\n  TChildren extends React.ReactNode,\n  TItem,\n  TResult = TItem[],\n>(\n  children: TChildren[],\n  iteratee: (\n    child: TChildren,\n    childName: string,\n    parent?: TChildren,\n  ) => TItem | null,\n  parentProps = {},\n  // @ts-expect-error These defaults are hard to type\n  initialMemo: TResult = [],\n  combine: (memo: TResult, item: TItem) => TResult = (memo, item) =>\n    // @ts-expect-error These defaults are hard to type\n    memo.concat(item),\n): TResult {\n  const sharedProps = [\n    \"data\",\n    \"domain\",\n    \"categories\",\n    \"polar\",\n    \"startAngle\",\n    \"endAngle\",\n    \"minDomain\",\n    \"maxDomain\",\n    \"horizontal\",\n  ];\n  const traverseChildren = (childArray, names, parent?) => {\n    return childArray.reduce((memo, child, index) => {\n      let newMemo = memo;\n      const childRole = child.type && child.type.role;\n      const childName = child.props.name || `${childRole}-${names[index]}`;\n      if (child.props && child.props.children) {\n        const childProps = Object.assign(\n          {},\n          child.props,\n          pick(parentProps, sharedProps),\n        );\n\n        const nestedChildren =\n          child.type &&\n          child.type.role === \"stack\" &&\n          isFunction(child.type.getChildren)\n            ? child.type.getChildren(childProps)\n            : (\n                React.Children.toArray(\n                  child.props.children,\n                ) as Array<React.ReactElement>\n              ).map((c) => {\n                const nestedChildProps = Object.assign(\n                  {},\n                  c.props,\n                  pick(childProps, sharedProps),\n                );\n                return React.cloneElement(c, nestedChildProps);\n              });\n\n        const childNames = nestedChildren.map((c, i) => `${childName}-${i}`);\n        const nestedResults = traverseChildren(\n          nestedChildren,\n          childNames,\n          child,\n        );\n        newMemo = combine(newMemo, nestedResults);\n      } else {\n        const result = iteratee(child, childName, parent);\n        if (result) {\n          newMemo = combine(newMemo, result);\n        }\n      }\n      return newMemo;\n    }, initialMemo);\n  };\n\n  const validChildren = children.filter(isValidElement);\n  const childNames = validChildren.map((c, i) => i);\n  return traverseChildren(validChildren, childNames);\n}\n\n/**\n * @param {Object} props: the props object\n * @returns {Boolean} returns true if the props object contains `horizontal: true` of if any\n * children or nested children are horizontal\n */\nexport function isHorizontal(props: {\n  horizontal?: boolean;\n  children?: React.ReactNode;\n}) {\n  if (props.horizontal !== undefined || !props.children) {\n    return props.horizontal;\n  }\n  const traverseChildren = (childArray) => {\n    return childArray.reduce((memo, child) => {\n      const childProps = child.props || {};\n      if (memo || childProps.horizontal || !childProps.children) {\n        return memo || childProps.horizontal;\n      }\n      return traverseChildren(React.Children.toArray(childProps.children));\n    }, false);\n  };\n  return traverseChildren(React.Children.toArray(props.children));\n}\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/hooks/index.ts",
    "content": "export { usePreviousProps } from \"./use-previous-props\";\nexport { useAnimationState } from \"./use-animation-state\";\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/hooks/use-animation-state.ts",
    "content": "import React from \"react\";\nimport defaults from \"lodash/defaults\";\n\nimport * as Collection from \"../collection\";\nimport * as Transitions from \"../transitions\";\n\nconst INITIAL_STATE: AnimationState = {\n  nodesShouldLoad: false,\n  nodesDoneLoad: false,\n  animating: true,\n};\n\ntype AnyObject = Record<string, any>;\n\nexport type AnimationState = {\n  nodesShouldLoad?: boolean;\n  nodesDoneLoad?: boolean;\n  animating?: boolean;\n  childrenTransitions?: any[];\n  nodesWillExit?: boolean;\n  nodesWillEnter?: boolean;\n  nodesShouldEnter?: boolean;\n  oldProps?: AnyObject;\n  nextProps?: AnyObject;\n  continuous?: boolean;\n};\n\nexport const useAnimationState = (initialState = INITIAL_STATE) => {\n  const [state, _setState] = React.useState(initialState);\n\n  // This allows us to use a state object and maintain the same API as this.setState\n  const setState = React.useCallback(\n    (newState: AnimationState) => {\n      _setState((oldState) => ({ ...oldState, ...newState }));\n    },\n    [_setState],\n  );\n\n  // This is a copy of Wrapper.getAnimationProps\n  const getAnimationProps = React.useCallback(\n    (props: AnyObject | undefined, child, index) => {\n      if (!props?.animate) {\n        return child.props.animate;\n      }\n      const getFilteredState = () => {\n        let childrenTransitions = state && state.childrenTransitions;\n        childrenTransitions = Collection.isArrayOfArrays(childrenTransitions)\n          ? childrenTransitions[index]\n          : childrenTransitions;\n        return defaults({ childrenTransitions }, state);\n      };\n\n      let getTransitions = props.animate && props.animate.getTransitions;\n      const filteredState = getFilteredState();\n      const parentState =\n        (props.animate && props.animate.parentState) || filteredState;\n      if (!getTransitions) {\n        const getTransitionProps = Transitions.getTransitionPropsFactory(\n          props,\n          filteredState,\n          (newState) => setState(newState),\n        );\n        getTransitions = (childComponent) =>\n          getTransitionProps(childComponent, index);\n      }\n      return defaults(\n        { getTransitions, parentState },\n        props.animate,\n        child.props.animate,\n      );\n    },\n    [state, setState],\n  );\n\n  // This is a copy of Wrapper.setAnimationState\n  const setAnimationState = React.useCallback(\n    (props: AnyObject | undefined, nextProps) => {\n      if (!props?.animate) {\n        return;\n      }\n      if (props.animate.parentState) {\n        const nodesWillExit = props.animate.parentState.nodesWillExit;\n        const oldProps = nodesWillExit ? props : null;\n        const newState = defaults(\n          { oldProps, nextProps },\n          props.animate.parentState,\n        );\n        setState(newState);\n      } else {\n        const oldChildren = React.Children.toArray(props.children);\n        const nextChildren = React.Children.toArray(nextProps.children);\n        const isContinuous = (child) => {\n          const check = (c) => c.type && c.type.continuous;\n          return Array.isArray(child) ? child.some(check) : check(child);\n        };\n\n        const continuous =\n          !props.polar &&\n          oldChildren.some((child: any) => {\n            return (\n              isContinuous(child) ||\n              (child?.props?.children && isContinuous(child.props.children))\n            );\n          });\n        const {\n          nodesWillExit,\n          nodesWillEnter,\n          childrenTransitions,\n          nodesShouldEnter,\n        } = Transitions.getInitialTransitionState(oldChildren, nextChildren);\n\n        setState({\n          nodesWillExit,\n          nodesWillEnter,\n          nodesShouldEnter,\n          childrenTransitions: Collection.isArrayOfArrays(childrenTransitions)\n            ? childrenTransitions[0]\n            : childrenTransitions,\n          oldProps: nodesWillExit ? props : undefined,\n          nextProps,\n          continuous,\n        });\n      }\n    },\n    [setState],\n  );\n\n  const getProps = React.useCallback(\n    (initialProps: AnyObject) => {\n      return state && state.nodesWillExit\n        ? state.oldProps || initialProps\n        : initialProps;\n    },\n    [state],\n  );\n\n  return { state, setState, getAnimationProps, setAnimationState, getProps };\n};\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/hooks/use-previous-props.ts",
    "content": "import React from \"react\";\n\nexport function usePreviousProps<T>(props: T): T | undefined {\n  const ref = React.useRef<T>();\n  React.useEffect(() => {\n    ref.current = props;\n  });\n  return ref.current;\n}\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/immutable-types.d.ts",
    "content": "/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * Immutable data encourages pure functions (data-in, data-out) and lends itself\n * to much simpler application development and enabling techniques from\n * functional programming such as lazy evaluation.\n *\n * While designed to bring these powerful functional concepts to JavaScript, it\n * presents an Object-Oriented API familiar to Javascript engineers and closely\n * mirroring that of Array, Map, and Set. It is easy and efficient to convert to\n * and from plain Javascript types.\n\n * Note: all examples are presented in [ES6][]. To run in all browsers, they\n * need to be translated to ES3. For example:\n *\n *     // ES6\n *     foo.map(x => x * x);\n *     // ES3\n *     foo.map(function (x) { return x * x; });\n *\n * [ES6]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/New_in_JavaScript/ECMAScript_6_support_in_Mozilla\n */\n\n/**\n * Deeply converts plain JS objects and arrays to Immutable Maps and Lists.\n *\n * If a `reviver` is optionally provided, it will be called with every\n * collection as a Seq (beginning with the most nested collections\n * and proceeding to the top-level collection itself), along with the key\n * refering to each collection and the parent JS object provided as `this`.\n * For the top level, object, the key will be `\"\"`. This `reviver` is expected\n * to return a new Immutable Iterable, allowing for custom conversions from\n * deep JS objects.\n *\n * This example converts JSON to List and OrderedMap:\n *\n *     Immutable.fromJS({a: {b: [10, 20, 30]}, c: 40}, function (key, value) {\n *       var isIndexed = Immutable.Iterable.isIndexed(value);\n *       return isIndexed ? value.toList() : value.toOrderedMap();\n *     });\n *\n *     // true, \"b\", {b: [10, 20, 30]}\n *     // false, \"a\", {a: {b: [10, 20, 30]}, c: 40}\n *     // false, \"\", {\"\": {a: {b: [10, 20, 30]}, c: 40}}\n *\n * If `reviver` is not provided, the default behavior will convert Arrays into\n * Lists and Objects into Maps.\n *\n * `reviver` acts similarly to the [same parameter in `JSON.parse`][1].\n *\n * `Immutable.fromJS` is conservative in its conversion. It will only convert\n * arrays which pass `Array.isArray` to Lists, and only raw objects (no custom\n * prototype) to Map.\n *\n * Keep in mind, when using JS objects to construct Immutable Maps, that\n * JavaScript Object properties are always strings, even if written in a\n * quote-less shorthand, while Immutable Maps accept keys of any type.\n *\n * ```js\n * var obj = { 1: \"one\" };\n * Object.keys(obj); // [ \"1\" ]\n * obj[\"1\"]; // \"one\"\n * obj[1];   // \"one\"\n *\n * var map = Map(obj);\n * map.get(\"1\"); // \"one\"\n * map.get(1);   // undefined\n * ```\n *\n * Property access for JavaScript Objects first converts the key to a string,\n * but since Immutable Map keys can be of any type the argument to `get()` is\n * not altered.\n *\n * [1]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#Example.3A_Using_the_reviver_parameter\n *      \"Using the reviver parameter\"\n */\nexport function fromJS(\n  json: any,\n  reviver?: (k: any, v: Iterable<any, any>) => any,\n): any;\n\n/**\n * Value equality check with semantics similar to `Object.is`, but treats\n * Immutable `Iterable`s as values, equal if the second `Iterable` includes\n * equivalent values.\n *\n * It's used throughout Immutable when checking for equality, including `Map`\n * key equality and `Set` membership.\n *\n *     var map1 = Immutable.Map({a:1, b:1, c:1});\n *     var map2 = Immutable.Map({a:1, b:1, c:1});\n *     assert(map1 !== map2);\n *     assert(Object.is(map1, map2) === false);\n *     assert(Immutable.is(map1, map2) === true);\n *\n * Note: Unlike `Object.is`, `Immutable.is` assumes `0` and `-0` are the same\n * value, matching the behavior of ES6 Map key equality.\n */\nexport function is(first: any, second: any): boolean;\n\n/**\n * Lists are ordered indexed dense collections, much like a JavaScript\n * Array.\n *\n * Lists are immutable and fully persistent with O(log32 N) gets and sets,\n * and O(1) push and pop.\n *\n * Lists implement Deque, with efficient addition and removal from both the\n * end (`push`, `pop`) and beginning (`unshift`, `shift`).\n *\n * Unlike a JavaScript Array, there is no distinction between an\n * \"unset\" index and an index set to `undefined`. `List#forEach` visits all\n * indices from 0 to size, regardless of whether they were explicitly defined.\n */\nexport module List {\n  /**\n   * True if the provided value is a List\n   */\n  function isList(maybeList: any): boolean;\n\n  /**\n   * Creates a new List containing `values`.\n   */\n  function of<T>(...values: T[]): List<T>;\n}\n\n/**\n * Create a new immutable List containing the values of the provided\n * iterable-like.\n */\nexport function List<T>(): List<T>;\nexport function List<T>(iter: Iterable.Indexed<T>): List<T>;\nexport function List<T>(iter: Iterable.Set<T>): List<T>;\nexport function List<K, V>(iter: Iterable.Keyed<K, V>): List</*[K,V]*/ any>;\nexport function List<T>(array: Array<T>): List<T>;\nexport function List<T>(iterator: Iterator<T>): List<T>;\nexport function List<T>(iterable: /*Iterable<T>*/ Object): List<T>;\n\nexport interface List<T> extends Collection.Indexed<T> {\n  // Persistent changes\n\n  /**\n   * Returns a new List which includes `value` at `index`. If `index` already\n   * exists in this List, it will be replaced.\n   *\n   * `index` may be a negative number, which indexes back from the end of the\n   * List. `v.set(-1, \"value\")` sets the last item in the List.\n   *\n   * If `index` larger than `size`, the returned List's `size` will be large\n   * enough to include the `index`.\n   */\n  set(index: number, value: T): List<T>;\n\n  /**\n   * Returns a new List which excludes this `index` and with a size 1 less\n   * than this List. Values at indices above `index` are shifted down by 1 to\n   * fill the position.\n   *\n   * This is synonymous with `list.splice(index, 1)`.\n   *\n   * `index` may be a negative number, which indexes back from the end of the\n   * List. `v.delete(-1)` deletes the last item in the List.\n   *\n   * Note: `delete` cannot be safely used in IE8\n   * @alias remove\n   */\n  delete(index: number): List<T>;\n  remove(index: number): List<T>;\n\n  /**\n   * Returns a new List with `value` at `index` with a size 1 more than this\n   * List. Values at indices above `index` are shifted over by 1.\n   *\n   * This is synonymous with `list.splice(index, 0, value)\n   */\n  insert(index: number, value: T): List<T>;\n\n  /**\n   * Returns a new List with 0 size and no values.\n   */\n  clear(): List<T>;\n\n  /**\n   * Returns a new List with the provided `values` appended, starting at this\n   * List's `size`.\n   */\n  push(...values: T[]): List<T>;\n\n  /**\n   * Returns a new List with a size ones less than this List, excluding\n   * the last index in this List.\n   *\n   * Note: this differs from `Array#pop` because it returns a new\n   * List rather than the removed value. Use `last()` to get the last value\n   * in this List.\n   */\n  pop(): List<T>;\n\n  /**\n   * Returns a new List with the provided `values` prepended, shifting other\n   * values ahead to higher indices.\n   */\n  unshift(...values: T[]): List<T>;\n\n  /**\n   * Returns a new List with a size ones less than this List, excluding\n   * the first index in this List, shifting all other values to a lower index.\n   *\n   * Note: this differs from `Array#shift` because it returns a new\n   * List rather than the removed value. Use `first()` to get the first\n   * value in this List.\n   */\n  shift(): List<T>;\n\n  /**\n   * Returns a new List with an updated value at `index` with the return\n   * value of calling `updater` with the existing value, or `notSetValue` if\n   * `index` was not set. If called with a single argument, `updater` is\n   * called with the List itself.\n   *\n   * `index` may be a negative number, which indexes back from the end of the\n   * List. `v.update(-1)` updates the last item in the List.\n   *\n   * @see `Map#update`\n   */\n  update(updater: (value: List<T>) => List<T>): List<T>;\n  update(index: number, updater: (value: T) => T): List<T>;\n  update(index: number, notSetValue: T, updater: (value: T) => T): List<T>;\n\n  /**\n   * @see `Map#merge`\n   */\n  merge(...iterables: Iterable.Indexed<T>[]): List<T>;\n  merge(...iterables: Array<T>[]): List<T>;\n\n  /**\n   * @see `Map#mergeWith`\n   */\n  mergeWith(\n    merger: (previous?: T, next?: T, key?: number) => T,\n    ...iterables: Iterable.Indexed<T>[]\n  ): List<T>;\n  mergeWith(\n    merger: (previous?: T, next?: T, key?: number) => T,\n    ...iterables: Array<T>[]\n  ): List<T>;\n\n  /**\n   * @see `Map#mergeDeep`\n   */\n  mergeDeep(...iterables: Iterable.Indexed<T>[]): List<T>;\n  mergeDeep(...iterables: Array<T>[]): List<T>;\n\n  /**\n   * @see `Map#mergeDeepWith`\n   */\n  mergeDeepWith(\n    merger: (previous?: T, next?: T, key?: number) => T,\n    ...iterables: Iterable.Indexed<T>[]\n  ): List<T>;\n  mergeDeepWith(\n    merger: (previous?: T, next?: T, key?: number) => T,\n    ...iterables: Array<T>[]\n  ): List<T>;\n\n  /**\n   * Returns a new List with size `size`. If `size` is less than this\n   * List's size, the new List will exclude values at the higher indices.\n   * If `size` is greater than this List's size, the new List will have\n   * undefined values for the newly available indices.\n   *\n   * When building a new List and the final size is known up front, `setSize`\n   * used in conjunction with `withMutations` may result in the more\n   * performant construction.\n   */\n  setSize(size: number): List<T>;\n\n  // Deep persistent changes\n\n  /**\n   * Returns a new List having set `value` at this `keyPath`. If any keys in\n   * `keyPath` do not exist, a new immutable Map will be created at that key.\n   *\n   * Index numbers are used as keys to determine the path to follow in\n   * the List.\n   */\n  setIn(keyPath: Array<any>, value: any): List<T>;\n  setIn(keyPath: Iterable<any, any>, value: any): List<T>;\n\n  /**\n   * Returns a new List having removed the value at this `keyPath`. If any\n   * keys in `keyPath` do not exist, no change will occur.\n   *\n   * @alias removeIn\n   */\n  deleteIn(keyPath: Array<any>): List<T>;\n  deleteIn(keyPath: Iterable<any, any>): List<T>;\n  removeIn(keyPath: Array<any>): List<T>;\n  removeIn(keyPath: Iterable<any, any>): List<T>;\n\n  /**\n   * @see `Map#updateIn`\n   */\n  updateIn(keyPath: Array<any>, updater: (value: any) => any): List<T>;\n  updateIn(\n    keyPath: Array<any>,\n    notSetValue: any,\n    updater: (value: any) => any,\n  ): List<T>;\n  updateIn(keyPath: Iterable<any, any>, updater: (value: any) => any): List<T>;\n  updateIn(\n    keyPath: Iterable<any, any>,\n    notSetValue: any,\n    updater: (value: any) => any,\n  ): List<T>;\n\n  /**\n   * @see `Map#mergeIn`\n   */\n  mergeIn(\n    keyPath: Iterable<any, any>,\n    ...iterables: Iterable.Indexed<T>[]\n  ): List<T>;\n  mergeIn(keyPath: Array<any>, ...iterables: Iterable.Indexed<T>[]): List<T>;\n  mergeIn(keyPath: Array<any>, ...iterables: Array<T>[]): List<T>;\n\n  /**\n   * @see `Map#mergeDeepIn`\n   */\n  mergeDeepIn(\n    keyPath: Iterable<any, any>,\n    ...iterables: Iterable.Indexed<T>[]\n  ): List<T>;\n  mergeDeepIn(\n    keyPath: Array<any>,\n    ...iterables: Iterable.Indexed<T>[]\n  ): List<T>;\n  mergeDeepIn(keyPath: Array<any>, ...iterables: Array<T>[]): List<T>;\n\n  // Transient changes\n\n  /**\n   * Note: Not all methods can be used on a mutable collection or within\n   * `withMutations`! Only `set`, `push`, `pop`, `shift`, `unshift` and\n   * `merge` may be used mutatively.\n   *\n   * @see `Map#withMutations`\n   */\n  withMutations(mutator: (mutable: List<T>) => any): List<T>;\n\n  /**\n   * @see `Map#asMutable`\n   */\n  asMutable(): List<T>;\n\n  /**\n   * @see `Map#asImmutable`\n   */\n  asImmutable(): List<T>;\n}\n\n/**\n * Immutable Map is an unordered Iterable.Keyed of (key, value) pairs with\n * `O(log32 N)` gets and `O(log32 N)` persistent sets.\n *\n * Iteration order of a Map is undefined, however is stable. Multiple\n * iterations of the same Map will iterate in the same order.\n *\n * Map's keys can be of any type, and use `Immutable.is` to determine key\n * equality. This allows the use of any value (including NaN) as a key.\n *\n * Because `Immutable.is` returns equality based on value semantics, and\n * Immutable collections are treated as values, any Immutable collection may\n * be used as a key.\n *\n *     Map().set(List.of(1), 'listofone').get(List.of(1));\n *     // 'listofone'\n *\n * Any JavaScript object may be used as a key, however strict identity is used\n * to evaluate key equality. Two similar looking objects will represent two\n * different keys.\n *\n * Implemented by a hash-array mapped trie.\n */\nexport module Map {\n  /**\n   * True if the provided value is a Map\n   */\n  function isMap(maybeMap: any): boolean;\n\n  /**\n   * Creates a new Map from alternating keys and values\n   */\n  function of(...keyValues: any[]): Map<any, any>;\n}\n\n/**\n * Creates a new Immutable Map.\n *\n * Created with the same key value pairs as the provided Iterable.Keyed or\n * JavaScript Object or expects an Iterable of [K, V] tuple entries.\n *\n *     var newMap = Map({key: \"value\"});\n *     var newMap = Map([[\"key\", \"value\"]]);\n *\n * Keep in mind, when using JS objects to construct Immutable Maps, that\n * JavaScript Object properties are always strings, even if written in a\n * quote-less shorthand, while Immutable Maps accept keys of any type.\n *\n * ```js\n * var obj = { 1: \"one\" };\n * Object.keys(obj); // [ \"1\" ]\n * obj[\"1\"]; // \"one\"\n * obj[1];   // \"one\"\n *\n * var map = Map(obj);\n * map.get(\"1\"); // \"one\"\n * map.get(1);   // undefined\n * ```\n *\n * Property access for JavaScript Objects first converts the key to a string,\n * but since Immutable Map keys can be of any type the argument to `get()` is\n * not altered.\n */\nexport function Map<K, V>(): Map<K, V>;\nexport function Map<K, V>(iter: Iterable.Keyed<K, V>): Map<K, V>;\nexport function Map<K, V>(iter: Iterable<any, /*[K,V]*/ Array<any>>): Map<K, V>;\nexport function Map<K, V>(array: Array</*[K,V]*/ Array<any>>): Map<K, V>;\nexport function Map<V>(obj: { [key: string]: V }): Map<string, V>;\nexport function Map<K, V>(iterator: Iterator</*[K,V]*/ Array<any>>): Map<K, V>;\nexport function Map<K, V>(iterable: /*Iterable<[K,V]>*/ Object): Map<K, V>;\n\nexport interface Map<K, V> extends Collection.Keyed<K, V> {\n  // Persistent changes\n\n  /**\n   * Returns a new Map also containing the new key, value pair. If an equivalent\n   * key already exists in this Map, it will be replaced.\n   */\n  set(key: K, value: V): Map<K, V>;\n\n  /**\n   * Returns a new Map which excludes this `key`.\n   *\n   * Note: `delete` cannot be safely used in IE8, but is provided to mirror\n   * the ES6 collection API.\n   * @alias remove\n   */\n  delete(key: K): Map<K, V>;\n  remove(key: K): Map<K, V>;\n\n  /**\n   * Returns a new Map containing no keys or values.\n   */\n  clear(): Map<K, V>;\n\n  /**\n   * Returns a new Map having updated the value at this `key` with the return\n   * value of calling `updater` with the existing value, or `notSetValue` if\n   * the key was not set. If called with only a single argument, `updater` is\n   * called with the Map itself.\n   *\n   * Equivalent to: `map.set(key, updater(map.get(key, notSetValue)))`.\n   */\n  update(updater: (value: Map<K, V>) => Map<K, V>): Map<K, V>;\n  update(key: K, updater: (value: V) => V): Map<K, V>;\n  update(key: K, notSetValue: V, updater: (value: V) => V): Map<K, V>;\n\n  /**\n   * Returns a new Map resulting from merging the provided Iterables\n   * (or JS objects) into this Map. In other words, this takes each entry of\n   * each iterable and sets it on this Map.\n   *\n   * If any of the values provided to `merge` are not Iterable (would return\n   * false for `Immutable.Iterable.isIterable`) then they are deeply converted\n   * via `Immutable.fromJS` before being merged. However, if the value is an\n   * Iterable but includes non-iterable JS objects or arrays, those nested\n   * values will be preserved.\n   *\n   *     var x = Immutable.Map({a: 10, b: 20, c: 30});\n   *     var y = Immutable.Map({b: 40, a: 50, d: 60});\n   *     x.merge(y) // { a: 50, b: 40, c: 30, d: 60 }\n   *     y.merge(x) // { b: 20, a: 10, d: 60, c: 30 }\n   *\n   */\n  merge(...iterables: Iterable<K, V>[]): Map<K, V>;\n  merge(...iterables: { [key: string]: V }[]): Map<string, V>;\n\n  /**\n   * Like `merge()`, `mergeWith()` returns a new Map resulting from merging\n   * the provided Iterables (or JS objects) into this Map, but uses the\n   * `merger` function for dealing with conflicts.\n   *\n   *     var x = Immutable.Map({a: 10, b: 20, c: 30});\n   *     var y = Immutable.Map({b: 40, a: 50, d: 60});\n   *     x.mergeWith((prev, next) => prev / next, y) // { a: 0.2, b: 0.5, c: 30, d: 60 }\n   *     y.mergeWith((prev, next) => prev / next, x) // { b: 2, a: 5, d: 60, c: 30 }\n   *\n   */\n  mergeWith(\n    merger: (previous?: V, next?: V, key?: K) => V,\n    ...iterables: Iterable<K, V>[]\n  ): Map<K, V>;\n  mergeWith(\n    merger: (previous?: V, next?: V, key?: K) => V,\n    ...iterables: { [key: string]: V }[]\n  ): Map<string, V>;\n\n  /**\n   * Like `merge()`, but when two Iterables conflict, it merges them as well,\n   * recursing deeply through the nested data.\n   *\n   *     var x = Immutable.fromJS({a: { x: 10, y: 10 }, b: { x: 20, y: 50 } });\n   *     var y = Immutable.fromJS({a: { x: 2 }, b: { y: 5 }, c: { z: 3 } });\n   *     x.mergeDeep(y) // {a: { x: 2, y: 10 }, b: { x: 20, y: 5 }, c: { z: 3 } }\n   *\n   */\n  mergeDeep(...iterables: Iterable<K, V>[]): Map<K, V>;\n  mergeDeep(...iterables: { [key: string]: V }[]): Map<string, V>;\n\n  /**\n   * Like `mergeDeep()`, but when two non-Iterables conflict, it uses the\n   * `merger` function to determine the resulting value.\n   *\n   *     var x = Immutable.fromJS({a: { x: 10, y: 10 }, b: { x: 20, y: 50 } });\n   *     var y = Immutable.fromJS({a: { x: 2 }, b: { y: 5 }, c: { z: 3 } });\n   *     x.mergeDeepWith((prev, next) => prev / next, y)\n   *     // {a: { x: 5, y: 10 }, b: { x: 20, y: 10 }, c: { z: 3 } }\n   *\n   */\n  mergeDeepWith(\n    merger: (previous?: V, next?: V, key?: K) => V,\n    ...iterables: Iterable<K, V>[]\n  ): Map<K, V>;\n  mergeDeepWith(\n    merger: (previous?: V, next?: V, key?: K) => V,\n    ...iterables: { [key: string]: V }[]\n  ): Map<string, V>;\n\n  // Deep persistent changes\n\n  /**\n   * Returns a new Map having set `value` at this `keyPath`. If any keys in\n   * `keyPath` do not exist, a new immutable Map will be created at that key.\n   */\n  setIn(keyPath: Array<any>, value: any): Map<K, V>;\n  setIn(KeyPath: Iterable<any, any>, value: any): Map<K, V>;\n\n  /**\n   * Returns a new Map having removed the value at this `keyPath`. If any keys\n   * in `keyPath` do not exist, no change will occur.\n   *\n   * @alias removeIn\n   */\n  deleteIn(keyPath: Array<any>): Map<K, V>;\n  deleteIn(keyPath: Iterable<any, any>): Map<K, V>;\n  removeIn(keyPath: Array<any>): Map<K, V>;\n  removeIn(keyPath: Iterable<any, any>): Map<K, V>;\n\n  /**\n   * Returns a new Map having applied the `updater` to the entry found at the\n   * keyPath.\n   *\n   * If any keys in `keyPath` do not exist, new Immutable `Map`s will\n   * be created at those keys. If the `keyPath` does not already contain a\n   * value, the `updater` function will be called with `notSetValue`, if\n   * provided, otherwise `undefined`.\n   *\n   *     var data = Immutable.fromJS({ a: { b: { c: 10 } } });\n   *     data = data.updateIn(['a', 'b', 'c'], val => val * 2);\n   *     // { a: { b: { c: 20 } } }\n   *\n   * If the `updater` function returns the same value it was called with, then\n   * no change will occur. This is still true if `notSetValue` is provided.\n   *\n   *     var data1 = Immutable.fromJS({ a: { b: { c: 10 } } });\n   *     data2 = data1.updateIn(['x', 'y', 'z'], 100, val => val);\n   *     assert(data2 === data1);\n   *\n   */\n  updateIn(keyPath: Array<any>, updater: (value: any) => any): Map<K, V>;\n  updateIn(\n    keyPath: Array<any>,\n    notSetValue: any,\n    updater: (value: any) => any,\n  ): Map<K, V>;\n  updateIn(\n    keyPath: Iterable<any, any>,\n    updater: (value: any) => any,\n  ): Map<K, V>;\n  updateIn(\n    keyPath: Iterable<any, any>,\n    notSetValue: any,\n    updater: (value: any) => any,\n  ): Map<K, V>;\n\n  /**\n   * A combination of `updateIn` and `merge`, returning a new Map, but\n   * performing the merge at a point arrived at by following the keyPath.\n   * In other words, these two lines are equivalent:\n   *\n   *     x.updateIn(['a', 'b', 'c'], abc => abc.merge(y));\n   *     x.mergeIn(['a', 'b', 'c'], y);\n   *\n   */\n  mergeIn(\n    keyPath: Iterable<any, any>,\n    ...iterables: Iterable<K, V>[]\n  ): Map<K, V>;\n  mergeIn(keyPath: Array<any>, ...iterables: Iterable<K, V>[]): Map<K, V>;\n  mergeIn(\n    keyPath: Array<any>,\n    ...iterables: { [key: string]: V }[]\n  ): Map<string, V>;\n\n  /**\n   * A combination of `updateIn` and `mergeDeep`, returning a new Map, but\n   * performing the deep merge at a point arrived at by following the keyPath.\n   * In other words, these two lines are equivalent:\n   *\n   *     x.updateIn(['a', 'b', 'c'], abc => abc.mergeDeep(y));\n   *     x.mergeDeepIn(['a', 'b', 'c'], y);\n   *\n   */\n  mergeDeepIn(\n    keyPath: Iterable<any, any>,\n    ...iterables: Iterable<K, V>[]\n  ): Map<K, V>;\n  mergeDeepIn(keyPath: Array<any>, ...iterables: Iterable<K, V>[]): Map<K, V>;\n  mergeDeepIn(\n    keyPath: Array<any>,\n    ...iterables: { [key: string]: V }[]\n  ): Map<string, V>;\n\n  // Transient changes\n\n  /**\n   * Every time you call one of the above functions, a new immutable Map is\n   * created. If a pure function calls a number of these to produce a final\n   * return value, then a penalty on performance and memory has been paid by\n   * creating all of the intermediate immutable Maps.\n   *\n   * If you need to apply a series of mutations to produce a new immutable\n   * Map, `withMutations()` creates a temporary mutable copy of the Map which\n   * can apply mutations in a highly performant manner. In fact, this is\n   * exactly how complex mutations like `merge` are done.\n   *\n   * As an example, this results in the creation of 2, not 4, new Maps:\n   *\n   *     var map1 = Immutable.Map();\n   *     var map2 = map1.withMutations(map => {\n   *       map.set('a', 1).set('b', 2).set('c', 3);\n   *     });\n   *     assert(map1.size === 0);\n   *     assert(map2.size === 3);\n   *\n   * Note: Not all methods can be used on a mutable collection or within\n   * `withMutations`! Only `set` and `merge` may be used mutatively.\n   *\n   */\n  withMutations(mutator: (mutable: Map<K, V>) => any): Map<K, V>;\n\n  /**\n   * Another way to avoid creation of intermediate Immutable maps is to create\n   * a mutable copy of this collection. Mutable copies *always* return `this`,\n   * and thus shouldn't be used for equality. Your function should never return\n   * a mutable copy of a collection, only use it internally to create a new\n   * collection. If possible, use `withMutations` as it provides an easier to\n   * use API.\n   *\n   * Note: if the collection is already mutable, `asMutable` returns itself.\n   *\n   * Note: Not all methods can be used on a mutable collection or within\n   * `withMutations`! Only `set` and `merge` may be used mutatively.\n   */\n  asMutable(): Map<K, V>;\n\n  /**\n   * The yin to `asMutable`'s yang. Because it applies to mutable collections,\n   * this operation is *mutable* and returns itself. Once performed, the mutable\n   * copy has become immutable and can be safely returned from a function.\n   */\n  asImmutable(): Map<K, V>;\n}\n\n/**\n * A type of Map that has the additional guarantee that the iteration order of\n * entries will be the order in which they were set().\n *\n * The iteration behavior of OrderedMap is the same as native ES6 Map and\n * JavaScript Object.\n *\n * Note that `OrderedMap` are more expensive than non-ordered `Map` and may\n * consume more memory. `OrderedMap#set` is amortized O(log32 N), but not\n * stable.\n */\n\nexport module OrderedMap {\n  /**\n   * True if the provided value is an OrderedMap.\n   */\n  function isOrderedMap(maybeOrderedMap: any): boolean;\n}\n\n/**\n * Creates a new Immutable OrderedMap.\n *\n * Created with the same key value pairs as the provided Iterable.Keyed or\n * JavaScript Object or expects an Iterable of [K, V] tuple entries.\n *\n * The iteration order of key-value pairs provided to this constructor will\n * be preserved in the OrderedMap.\n *\n *     var newOrderedMap = OrderedMap({key: \"value\"});\n *     var newOrderedMap = OrderedMap([[\"key\", \"value\"]]);\n *\n */\nexport function OrderedMap<K, V>(): OrderedMap<K, V>;\nexport function OrderedMap<K, V>(iter: Iterable.Keyed<K, V>): OrderedMap<K, V>;\nexport function OrderedMap<K, V>(\n  iter: Iterable<any, /*[K,V]*/ Array<any>>,\n): OrderedMap<K, V>;\nexport function OrderedMap<K, V>(\n  array: Array</*[K,V]*/ Array<any>>,\n): OrderedMap<K, V>;\nexport function OrderedMap<V>(obj: { [key: string]: V }): OrderedMap<string, V>;\nexport function OrderedMap<K, V>(\n  iterator: Iterator</*[K,V]*/ Array<any>>,\n): OrderedMap<K, V>;\nexport function OrderedMap<K, V>(\n  iterable: /*Iterable<[K,V]>*/ Object,\n): OrderedMap<K, V>;\n\nexport interface OrderedMap<K, V> extends Map<K, V> {}\n\n/**\n * A Collection of unique values with `O(log32 N)` adds and has.\n *\n * When iterating a Set, the entries will be (value, value) pairs. Iteration\n * order of a Set is undefined, however is stable. Multiple iterations of the\n * same Set will iterate in the same order.\n *\n * Set values, like Map keys, may be of any type. Equality is determined using\n * `Immutable.is`, enabling Sets to uniquely include other Immutable\n * collections, custom value types, and NaN.\n */\nexport module Set {\n  /**\n   * True if the provided value is a Set\n   */\n  function isSet(maybeSet: any): boolean;\n\n  /**\n   * Creates a new Set containing `values`.\n   */\n  function of<T>(...values: T[]): Set<T>;\n\n  /**\n   * `Set.fromKeys()` creates a new immutable Set containing the keys from\n   * this Iterable or JavaScript Object.\n   */\n  function fromKeys<T>(iter: Iterable<T, any>): Set<T>;\n  function fromKeys(obj: { [key: string]: any }): Set<string>;\n}\n\n/**\n * Create a new immutable Set containing the values of the provided\n * iterable-like.\n */\nexport function Set<T>(): Set<T>;\nexport function Set<T>(iter: Iterable.Set<T>): Set<T>;\nexport function Set<T>(iter: Iterable.Indexed<T>): Set<T>;\nexport function Set<K, V>(iter: Iterable.Keyed<K, V>): Set</*[K,V]*/ any>;\nexport function Set<T>(array: Array<T>): Set<T>;\nexport function Set<T>(iterator: Iterator<T>): Set<T>;\nexport function Set<T>(iterable: /*Iterable<T>*/ Object): Set<T>;\n\nexport interface Set<T> extends Collection.Set<T> {\n  // Persistent changes\n\n  /**\n   * Returns a new Set which also includes this value.\n   */\n  add(value: T): Set<T>;\n\n  /**\n   * Returns a new Set which excludes this value.\n   *\n   * Note: `delete` cannot be safely used in IE8\n   * @alias remove\n   */\n  delete(value: T): Set<T>;\n  remove(value: T): Set<T>;\n\n  /**\n   * Returns a new Set containing no values.\n   */\n  clear(): Set<T>;\n\n  /**\n   * Returns a Set including any value from `iterables` that does not already\n   * exist in this Set.\n   * @alias merge\n   */\n  union(...iterables: Iterable<any, T>[]): Set<T>;\n  union(...iterables: Array<T>[]): Set<T>;\n  merge(...iterables: Iterable<any, T>[]): Set<T>;\n  merge(...iterables: Array<T>[]): Set<T>;\n\n  /**\n   * Returns a Set which has removed any values not also contained\n   * within `iterables`.\n   */\n  intersect(...iterables: Iterable<any, T>[]): Set<T>;\n  intersect(...iterables: Array<T>[]): Set<T>;\n\n  /**\n   * Returns a Set excluding any values contained within `iterables`.\n   */\n  subtract(...iterables: Iterable<any, T>[]): Set<T>;\n  subtract(...iterables: Array<T>[]): Set<T>;\n\n  // Transient changes\n\n  /**\n   * Note: Not all methods can be used on a mutable collection or within\n   * `withMutations`! Only `add` may be used mutatively.\n   *\n   * @see `Map#withMutations`\n   */\n  withMutations(mutator: (mutable: Set<T>) => any): Set<T>;\n\n  /**\n   * @see `Map#asMutable`\n   */\n  asMutable(): Set<T>;\n\n  /**\n   * @see `Map#asImmutable`\n   */\n  asImmutable(): Set<T>;\n}\n\n/**\n * A type of Set that has the additional guarantee that the iteration order of\n * values will be the order in which they were `add`ed.\n *\n * The iteration behavior of OrderedSet is the same as native ES6 Set.\n *\n * Note that `OrderedSet` are more expensive than non-ordered `Set` and may\n * consume more memory. `OrderedSet#add` is amortized O(log32 N), but not\n * stable.\n */\nexport module OrderedSet {\n  /**\n   * True if the provided value is an OrderedSet.\n   */\n  function isOrderedSet(maybeOrderedSet: any): boolean;\n\n  /**\n   * Creates a new OrderedSet containing `values`.\n   */\n  function of<T>(...values: T[]): OrderedSet<T>;\n\n  /**\n   * `OrderedSet.fromKeys()` creates a new immutable OrderedSet containing\n   * the keys from this Iterable or JavaScript Object.\n   */\n  function fromKeys<T>(iter: Iterable<T, any>): OrderedSet<T>;\n  function fromKeys(obj: { [key: string]: any }): OrderedSet<string>;\n}\n\n/**\n * Create a new immutable OrderedSet containing the values of the provided\n * iterable-like.\n */\nexport function OrderedSet<T>(): OrderedSet<T>;\nexport function OrderedSet<T>(iter: Iterable.Set<T>): OrderedSet<T>;\nexport function OrderedSet<T>(iter: Iterable.Indexed<T>): OrderedSet<T>;\nexport function OrderedSet<K, V>(\n  iter: Iterable.Keyed<K, V>,\n): OrderedSet</*[K,V]*/ any>;\nexport function OrderedSet<T>(array: Array<T>): OrderedSet<T>;\nexport function OrderedSet<T>(iterator: Iterator<T>): OrderedSet<T>;\nexport function OrderedSet<T>(iterable: /*Iterable<T>*/ Object): OrderedSet<T>;\n\nexport interface OrderedSet<T> extends Set<T> {}\n\n/**\n * Stacks are indexed collections which support very efficient O(1) addition\n * and removal from the front using `unshift(v)` and `shift()`.\n *\n * For familiarity, Stack also provides `push(v)`, `pop()`, and `peek()`, but\n * be aware that they also operate on the front of the list, unlike List or\n * a JavaScript Array.\n *\n * Note: `reverse()` or any inherent reverse traversal (`reduceRight`,\n * `lastIndexOf`, etc.) is not efficient with a Stack.\n *\n * Stack is implemented with a Single-Linked List.\n */\nexport module Stack {\n  /**\n   * True if the provided value is a Stack\n   */\n  function isStack(maybeStack: any): boolean;\n\n  /**\n   * Creates a new Stack containing `values`.\n   */\n  function of<T>(...values: T[]): Stack<T>;\n}\n\n/**\n * Create a new immutable Stack containing the values of the provided\n * iterable-like.\n *\n * The iteration order of the provided iterable is preserved in the\n * resulting `Stack`.\n */\nexport function Stack<T>(): Stack<T>;\nexport function Stack<T>(iter: Iterable.Indexed<T>): Stack<T>;\nexport function Stack<T>(iter: Iterable.Set<T>): Stack<T>;\nexport function Stack<K, V>(iter: Iterable.Keyed<K, V>): Stack</*[K,V]*/ any>;\nexport function Stack<T>(array: Array<T>): Stack<T>;\nexport function Stack<T>(iterator: Iterator<T>): Stack<T>;\nexport function Stack<T>(iterable: /*Iterable<T>*/ Object): Stack<T>;\n\nexport interface Stack<T> extends Collection.Indexed<T> {\n  // Reading values\n\n  /**\n   * Alias for `Stack.first()`.\n   */\n  peek(): T;\n\n  // Persistent changes\n\n  /**\n   * Returns a new Stack with 0 size and no values.\n   */\n  clear(): Stack<T>;\n\n  /**\n   * Returns a new Stack with the provided `values` prepended, shifting other\n   * values ahead to higher indices.\n   *\n   * This is very efficient for Stack.\n   */\n  unshift(...values: T[]): Stack<T>;\n\n  /**\n   * Like `Stack#unshift`, but accepts a iterable rather than varargs.\n   */\n  unshiftAll(iter: Iterable<any, T>): Stack<T>;\n  unshiftAll(iter: Array<T>): Stack<T>;\n\n  /**\n   * Returns a new Stack with a size ones less than this Stack, excluding\n   * the first item in this Stack, shifting all other values to a lower index.\n   *\n   * Note: this differs from `Array#shift` because it returns a new\n   * Stack rather than the removed value. Use `first()` or `peek()` to get the\n   * first value in this Stack.\n   */\n  shift(): Stack<T>;\n\n  /**\n   * Alias for `Stack#unshift` and is not equivalent to `List#push`.\n   */\n  push(...values: T[]): Stack<T>;\n\n  /**\n   * Alias for `Stack#unshiftAll`.\n   */\n  pushAll(iter: Iterable<any, T>): Stack<T>;\n  pushAll(iter: Array<T>): Stack<T>;\n\n  /**\n   * Alias for `Stack#shift` and is not equivalent to `List#pop`.\n   */\n  pop(): Stack<T>;\n\n  // Transient changes\n\n  /**\n   * Note: Not all methods can be used on a mutable collection or within\n   * `withMutations`! Only `set`, `push`, and `pop` may be used mutatively.\n   *\n   * @see `Map#withMutations`\n   */\n  withMutations(mutator: (mutable: Stack<T>) => any): Stack<T>;\n\n  /**\n   * @see `Map#asMutable`\n   */\n  asMutable(): Stack<T>;\n\n  /**\n   * @see `Map#asImmutable`\n   */\n  asImmutable(): Stack<T>;\n}\n\n/**\n * Returns a Seq.Indexed of numbers from `start` (inclusive) to `end`\n * (exclusive), by `step`, where `start` defaults to 0, `step` to 1, and `end` to\n * infinity. When `start` is equal to `end`, returns empty range.\n *\n *     Range() // [0,1,2,3,...]\n *     Range(10) // [10,11,12,13,...]\n *     Range(10,15) // [10,11,12,13,14]\n *     Range(10,30,5) // [10,15,20,25]\n *     Range(30,10,5) // [30,25,20,15]\n *     Range(30,30,5) // []\n *\n */\nexport function Range(\n  start?: number,\n  end?: number,\n  step?: number,\n): Seq.Indexed<number>;\n\n/**\n * Returns a Seq.Indexed of `value` repeated `times` times. When `times` is\n * not defined, returns an infinite `Seq` of `value`.\n *\n *     Repeat('foo') // ['foo','foo','foo',...]\n *     Repeat('bar',4) // ['bar','bar','bar','bar']\n *\n */\nexport function Repeat<T>(value: T, times?: number): Seq.Indexed<T>;\n\n/**\n * Creates a new Class which produces Record instances. A record is similar to\n * a JS object, but enforce a specific set of allowed string keys, and have\n * default values.\n *\n *     var ABRecord = Record({a:1, b:2})\n *     var myRecord = new ABRecord({b:3})\n *\n * Records always have a value for the keys they define. `remove`ing a key\n * from a record simply resets it to the default value for that key.\n *\n *     myRecord.size // 2\n *     myRecord.get('a') // 1\n *     myRecord.get('b') // 3\n *     myRecordWithoutB = myRecord.remove('b')\n *     myRecordWithoutB.get('b') // 2\n *     myRecordWithoutB.size // 2\n *\n * Values provided to the constructor not found in the Record type will\n * be ignored. For example, in this case, ABRecord is provided a key \"x\" even\n * though only \"a\" and \"b\" have been defined. The value for \"x\" will be\n * ignored for this record.\n *\n *     var myRecord = new ABRecord({b:3, x:10})\n *     myRecord.get('x') // undefined\n *\n * Because Records have a known set of string keys, property get access works\n * as expected, however property sets will throw an Error.\n *\n * Note: IE8 does not support property access. Only use `get()` when\n * supporting IE8.\n *\n *     myRecord.b // 3\n *     myRecord.b = 5 // throws Error\n *\n * Record Classes can be extended as well, allowing for custom methods on your\n * Record. This is not a common pattern in functional environments, but is in\n * many JS programs.\n *\n * Note: TypeScript does not support this type of subclassing.\n *\n *     class ABRecord extends Record({a:1,b:2}) {\n *       getAB() {\n *         return this.a + this.b;\n *       }\n *     }\n *\n *     var myRecord = new ABRecord({b: 3})\n *     myRecord.getAB() // 4\n *\n */\nexport module Record {\n  export interface Class {\n    new (): Map<string, any>;\n    new (values: { [key: string]: any }): Map<string, any>;\n    new (values: Iterable<string, any>): Map<string, any>; // deprecated\n\n    (): Map<string, any>;\n    (values: { [key: string]: any }): Map<string, any>;\n    (values: Iterable<string, any>): Map<string, any>; // deprecated\n  }\n}\n\nexport function Record(\n  defaultValues: { [key: string]: any },\n  name?: string,\n): Record.Class;\n\n/**\n * Represents a sequence of values, but may not be backed by a concrete data\n * structure.\n *\n * **Seq is immutable** — Once a Seq is created, it cannot be\n * changed, appended to, rearranged or otherwise modified. Instead, any\n * mutative method called on a `Seq` will return a new `Seq`.\n *\n * **Seq is lazy** — Seq does as little work as necessary to respond to any\n * method call. Values are often created during iteration, including implicit\n * iteration when reducing or converting to a concrete data structure such as\n * a `List` or JavaScript `Array`.\n *\n * For example, the following performs no work, because the resulting\n * Seq's values are never iterated:\n *\n *     var oddSquares = Immutable.Seq.of(1,2,3,4,5,6,7,8)\n *       .filter(x => x % 2).map(x => x * x);\n *\n * Once the Seq is used, it performs only the work necessary. In this\n * example, no intermediate data structures are ever created, filter is only\n * called three times, and map is only called once:\n *\n *     console.log(oddSquares.get(1)); // 9\n *\n * Seq allows for the efficient chaining of operations,\n * allowing for the expression of logic that can otherwise be very tedious:\n *\n *     Immutable.Seq({a:1, b:1, c:1})\n *       .flip().map(key => key.toUpperCase()).flip().toObject();\n *     // Map { A: 1, B: 1, C: 1 }\n *\n * As well as expressing logic that would otherwise be memory or time limited:\n *\n *     Immutable.Range(1, Infinity)\n *       .skip(1000)\n *       .map(n => -n)\n *       .filter(n => n % 2 === 0)\n *       .take(2)\n *       .reduce((r, n) => r * n, 1);\n *     // 1006008\n *\n * Seq is often used to provide a rich collection API to JavaScript Object.\n *\n *     Immutable.Seq({ x: 0, y: 1, z: 2 }).map(v => v * 2).toObject();\n *     // { x: 0, y: 2, z: 4 }\n */\n\nexport module Seq {\n  /**\n   * True if `maybeSeq` is a Seq, it is not backed by a concrete\n   * structure such as Map, List, or Set.\n   */\n  function isSeq(maybeSeq: any): boolean;\n\n  /**\n   * Returns a Seq of the values provided. Alias for `Seq.Indexed.of()`.\n   */\n  function of<T>(...values: T[]): Seq.Indexed<T>;\n\n  /**\n   * `Seq` which represents key-value pairs.\n   */\n  export module Keyed {}\n\n  /**\n   * Always returns a Seq.Keyed, if input is not keyed, expects an\n   * iterable of [K, V] tuples.\n   */\n  export function Keyed<K, V>(): Seq.Keyed<K, V>;\n  export function Keyed<K, V>(seq: Iterable.Keyed<K, V>): Seq.Keyed<K, V>;\n  export function Keyed<K, V>(\n    seq: Iterable<any, /*[K,V]*/ any>,\n  ): Seq.Keyed<K, V>;\n  export function Keyed<K, V>(array: Array</*[K,V]*/ any>): Seq.Keyed<K, V>;\n  export function Keyed<V>(obj: { [key: string]: V }): Seq.Keyed<string, V>;\n  export function Keyed<K, V>(\n    iterator: Iterator</*[K,V]*/ any>,\n  ): Seq.Keyed<K, V>;\n  export function Keyed<K, V>(\n    iterable: /*Iterable<[K,V]>*/ Object,\n  ): Seq.Keyed<K, V>;\n\n  export interface Keyed<K, V> extends Seq<K, V>, Iterable.Keyed<K, V> {\n    /**\n     * Returns itself\n     */\n    toSeq(): /*this*/ Seq.Keyed<K, V>;\n  }\n\n  /**\n   * `Seq` which represents an ordered indexed list of values.\n   */\n  module Indexed {\n    /**\n     * Provides an Seq.Indexed of the values provided.\n     */\n    function of<T>(...values: T[]): Seq.Indexed<T>;\n  }\n\n  /**\n   * Always returns Seq.Indexed, discarding associated keys and\n   * supplying incrementing indices.\n   */\n  export function Indexed<T>(): Seq.Indexed<T>;\n  export function Indexed<T>(seq: Iterable.Indexed<T>): Seq.Indexed<T>;\n  export function Indexed<T>(seq: Iterable.Set<T>): Seq.Indexed<T>;\n  export function Indexed<K, V>(\n    seq: Iterable.Keyed<K, V>,\n  ): Seq.Indexed</*[K,V]*/ any>;\n  export function Indexed<T>(array: Array<T>): Seq.Indexed<T>;\n  export function Indexed<T>(iterator: Iterator<T>): Seq.Indexed<T>;\n  export function Indexed<T>(iterable: /*Iterable<T>*/ Object): Seq.Indexed<T>;\n\n  export interface Indexed<T> extends Seq<number, T>, Iterable.Indexed<T> {\n    /**\n     * Returns itself\n     */\n    toSeq(): /*this*/ Seq.Indexed<T>;\n  }\n\n  /**\n   * `Seq` which represents a set of values.\n   *\n   * Because `Seq` are often lazy, `Seq.Set` does not provide the same guarantee\n   * of value uniqueness as the concrete `Set`.\n   */\n  export module Set {\n    /**\n     * Returns a Seq.Set of the provided values\n     */\n    function of<T>(...values: T[]): Seq.Set<T>;\n  }\n\n  /**\n   * Always returns a Seq.Set, discarding associated indices or keys.\n   */\n  export function Set<T>(): Seq.Set<T>;\n  export function Set<T>(seq: Iterable.Set<T>): Seq.Set<T>;\n  export function Set<T>(seq: Iterable.Indexed<T>): Seq.Set<T>;\n  export function Set<K, V>(seq: Iterable.Keyed<K, V>): Seq.Set</*[K,V]*/ any>;\n  export function Set<T>(array: Array<T>): Seq.Set<T>;\n  export function Set<T>(iterator: Iterator<T>): Seq.Set<T>;\n  export function Set<T>(iterable: /*Iterable<T>*/ Object): Seq.Set<T>;\n\n  export interface Set<T> extends Seq<T, T>, Iterable.Set<T> {\n    /**\n     * Returns itself\n     */\n    toSeq(): /*this*/ Seq.Set<T>;\n  }\n}\n\n/**\n * Creates a Seq.\n *\n * Returns a particular kind of `Seq` based on the input.\n *\n *   * If a `Seq`, that same `Seq`.\n *   * If an `Iterable`, a `Seq` of the same kind (Keyed, Indexed, or Set).\n *   * If an Array-like, an `Seq.Indexed`.\n *   * If an Object with an Iterator, an `Seq.Indexed`.\n *   * If an Iterator, an `Seq.Indexed`.\n *   * If an Object, a `Seq.Keyed`.\n *\n */\nexport function Seq<K, V>(): Seq<K, V>;\nexport function Seq<K, V>(seq: Seq<K, V>): Seq<K, V>;\nexport function Seq<K, V>(iterable: Iterable<K, V>): Seq<K, V>;\nexport function Seq<T>(array: Array<T>): Seq.Indexed<T>;\nexport function Seq<V>(obj: { [key: string]: V }): Seq.Keyed<string, V>;\nexport function Seq<T>(iterator: Iterator<T>): Seq.Indexed<T>;\nexport function Seq<T>(iterable: /*ES6Iterable<T>*/ Object): Seq.Indexed<T>;\n\nexport interface Seq<K, V> extends Iterable<K, V> {\n  /**\n   * Some Seqs can describe their size lazily. When this is the case,\n   * size will be an integer. Otherwise it will be undefined.\n   *\n   * For example, Seqs returned from `map()` or `reverse()`\n   * preserve the size of the original `Seq` while `filter()` does not.\n   *\n   * Note: `Range`, `Repeat` and `Seq`s made from `Array`s and `Object`s will\n   * always have a size.\n   */\n  size: number /*?*/;\n\n  // Force evaluation\n\n  /**\n   * Because Sequences are lazy and designed to be chained together, they do\n   * not cache their results. For example, this map function is called a total\n   * of 6 times, as each `join` iterates the Seq of three values.\n   *\n   *     var squares = Seq.of(1,2,3).map(x => x * x);\n   *     squares.join() + squares.join();\n   *\n   * If you know a `Seq` will be used multiple times, it may be more\n   * efficient to first cache it in memory. Here, the map function is called\n   * only 3 times.\n   *\n   *     var squares = Seq.of(1,2,3).map(x => x * x).cacheResult();\n   *     squares.join() + squares.join();\n   *\n   * Use this method judiciously, as it must fully evaluate a Seq which can be\n   * a burden on memory and possibly performance.\n   *\n   * Note: after calling `cacheResult`, a Seq will always have a `size`.\n   */\n  cacheResult(): /*this*/ Seq<K, V>;\n}\n\n/**\n * The `Iterable` is a set of (key, value) entries which can be iterated, and\n * is the base class for all collections in `immutable`, allowing them to\n * make use of all the Iterable methods (such as `map` and `filter`).\n *\n * Note: An iterable is always iterated in the same order, however that order\n * may not always be well defined, as is the case for the `Map` and `Set`.\n */\nexport module Iterable {\n  /**\n   * True if `maybeIterable` is an Iterable, or any of its subclasses.\n   */\n  function isIterable(maybeIterable: any): boolean;\n\n  /**\n   * True if `maybeKeyed` is an Iterable.Keyed, or any of its subclasses.\n   */\n  function isKeyed(maybeKeyed: any): boolean;\n\n  /**\n   * True if `maybeIndexed` is a Iterable.Indexed, or any of its subclasses.\n   */\n  function isIndexed(maybeIndexed: any): boolean;\n\n  /**\n   * True if `maybeAssociative` is either a keyed or indexed Iterable.\n   */\n  function isAssociative(maybeAssociative: any): boolean;\n\n  /**\n   * True if `maybeOrdered` is an Iterable where iteration order is well\n   * defined. True for Iterable.Indexed as well as OrderedMap and OrderedSet.\n   */\n  function isOrdered(maybeOrdered: any): boolean;\n\n  /**\n   * Keyed Iterables have discrete keys tied to each value.\n   *\n   * When iterating `Iterable.Keyed`, each iteration will yield a `[K, V]`\n   * tuple, in other words, `Iterable#entries` is the default iterator for\n   * Keyed Iterables.\n   */\n  export module Keyed {}\n\n  /**\n   * Creates an Iterable.Keyed\n   *\n   * Similar to `Iterable()`, however it expects iterable-likes of [K, V]\n   * tuples if not constructed from a Iterable.Keyed or JS Object.\n   */\n  export function Keyed<K, V>(iter: Iterable.Keyed<K, V>): Iterable.Keyed<K, V>;\n  export function Keyed<K, V>(\n    iter: Iterable<any, /*[K,V]*/ any>,\n  ): Iterable.Keyed<K, V>;\n  export function Keyed<K, V>(\n    array: Array</*[K,V]*/ any>,\n  ): Iterable.Keyed<K, V>;\n  export function Keyed<V>(obj: {\n    [key: string]: V;\n  }): Iterable.Keyed<string, V>;\n  export function Keyed<K, V>(\n    iterator: Iterator</*[K,V]*/ any>,\n  ): Iterable.Keyed<K, V>;\n  export function Keyed<K, V>(\n    iterable: /*Iterable<[K,V]>*/ Object,\n  ): Iterable.Keyed<K, V>;\n\n  export interface Keyed<K, V> extends Iterable<K, V> {\n    /**\n     * Returns Seq.Keyed.\n     * @override\n     */\n    toSeq(): Seq.Keyed<K, V>;\n\n    // Sequence functions\n\n    /**\n     * Returns a new Iterable.Keyed of the same type where the keys and values\n     * have been flipped.\n     *\n     *     Seq({ a: 'z', b: 'y' }).flip() // { z: 'a', y: 'b' }\n     *\n     */\n    flip(): /*this*/ Iterable.Keyed<V, K>;\n\n    /**\n     * Returns a new Iterable.Keyed of the same type with keys passed through\n     * a `mapper` function.\n     *\n     *     Seq({ a: 1, b: 2 })\n     *       .mapKeys(x => x.toUpperCase())\n     *     // Seq { A: 1, B: 2 }\n     *\n     */\n    mapKeys<M>(\n      mapper: (key?: K, value?: V, iter?: /*this*/ Iterable.Keyed<K, V>) => M,\n      context?: any,\n    ): /*this*/ Iterable.Keyed<M, V>;\n\n    /**\n     * Returns a new Iterable.Keyed of the same type with entries\n     * ([key, value] tuples) passed through a `mapper` function.\n     *\n     *     Seq({ a: 1, b: 2 })\n     *       .mapEntries(([k, v]) => [k.toUpperCase(), v * 2])\n     *     // Seq { A: 2, B: 4 }\n     *\n     */\n    mapEntries<KM, VM>(\n      mapper: (\n        entry?: /*(K, V)*/ Array<any>,\n        index?: number,\n        iter?: /*this*/ Iterable.Keyed<K, V>,\n      ) => /*[KM, VM]*/ Array<any>,\n      context?: any,\n    ): /*this*/ Iterable.Keyed<KM, VM>;\n  }\n\n  /**\n   * Indexed Iterables have incrementing numeric keys. They exhibit\n   * slightly different behavior than `Iterable.Keyed` for some methods in order\n   * to better mirror the behavior of JavaScript's `Array`, and add methods\n   * which do not make sense on non-indexed Iterables such as `indexOf`.\n   *\n   * Unlike JavaScript arrays, `Iterable.Indexed`s are always dense. \"Unset\"\n   * indices and `undefined` indices are indistinguishable, and all indices from\n   * 0 to `size` are visited when iterated.\n   *\n   * All Iterable.Indexed methods return re-indexed Iterables. In other words,\n   * indices always start at 0 and increment until size. If you wish to\n   * preserve indices, using them as keys, convert to a Iterable.Keyed by\n   * calling `toKeyedSeq`.\n   */\n  export module Indexed {}\n\n  /**\n   * Creates a new Iterable.Indexed.\n   */\n  export function Indexed<T>(iter: Iterable.Indexed<T>): Iterable.Indexed<T>;\n  export function Indexed<T>(iter: Iterable.Set<T>): Iterable.Indexed<T>;\n  export function Indexed<K, V>(\n    iter: Iterable.Keyed<K, V>,\n  ): Iterable.Indexed</*[K,V]*/ any>;\n  export function Indexed<T>(array: Array<T>): Iterable.Indexed<T>;\n  export function Indexed<T>(iterator: Iterator<T>): Iterable.Indexed<T>;\n  export function Indexed<T>(\n    iterable: /*Iterable<T>*/ Object,\n  ): Iterable.Indexed<T>;\n\n  export interface Indexed<T> extends Iterable<number, T> {\n    // Reading values\n\n    /**\n     * Returns the value associated with the provided index, or notSetValue if\n     * the index is beyond the bounds of the Iterable.\n     *\n     * `index` may be a negative number, which indexes back from the end of the\n     * Iterable. `s.get(-1)` gets the last item in the Iterable.\n     */\n    get(index: number, notSetValue?: T): T;\n\n    // Conversion to Seq\n\n    /**\n     * Returns Seq.Indexed.\n     * @override\n     */\n    toSeq(): Seq.Indexed<T>;\n\n    /**\n     * If this is an iterable of [key, value] entry tuples, it will return a\n     * Seq.Keyed of those entries.\n     */\n    fromEntrySeq(): Seq.Keyed<any, any>;\n\n    // Combination\n\n    /**\n     * Returns an Iterable of the same type with `separator` between each item\n     * in this Iterable.\n     */\n    interpose(separator: T): /*this*/ Iterable.Indexed<T>;\n\n    /**\n     * Returns an Iterable of the same type with the provided `iterables`\n     * interleaved into this iterable.\n     *\n     * The resulting Iterable includes the first item from each, then the\n     * second from each, etc.\n     *\n     *     I.Seq.of(1,2,3).interleave(I.Seq.of('A','B','C'))\n     *     // Seq [ 1, 'A', 2, 'B', 3, 'C' ]\n     *\n     * The shortest Iterable stops interleave.\n     *\n     *     I.Seq.of(1,2,3).interleave(\n     *       I.Seq.of('A','B'),\n     *       I.Seq.of('X','Y','Z')\n     *     )\n     *     // Seq [ 1, 'A', 'X', 2, 'B', 'Y' ]\n     */\n    interleave(\n      ...iterables: Array<Iterable<any, T>>\n    ): /*this*/ Iterable.Indexed<T>;\n\n    /**\n     * Splice returns a new indexed Iterable by replacing a region of this\n     * Iterable with new values. If values are not provided, it only skips the\n     * region to be removed.\n     *\n     * `index` may be a negative number, which indexes back from the end of the\n     * Iterable. `s.splice(-2)` splices after the second to last item.\n     *\n     *     Seq(['a','b','c','d']).splice(1, 2, 'q', 'r', 's')\n     *     // Seq ['a', 'q', 'r', 's', 'd']\n     *\n     */\n    splice(\n      index: number,\n      removeNum: number,\n      ...values: /*Array<Iterable.Indexed<T> | T>*/ any[]\n    ): /*this*/ Iterable.Indexed<T>;\n\n    /**\n     * Returns an Iterable of the same type \"zipped\" with the provided\n     * iterables.\n     *\n     * Like `zipWith`, but using the default `zipper`: creating an `Array`.\n     *\n     *     var a = Seq.of(1, 2, 3);\n     *     var b = Seq.of(4, 5, 6);\n     *     var c = a.zip(b); // Seq [ [ 1, 4 ], [ 2, 5 ], [ 3, 6 ] ]\n     *\n     */\n    zip(\n      ...iterables: Array<Iterable<any, any>>\n    ): /*this*/ Iterable.Indexed<any>;\n\n    /**\n     * Returns an Iterable of the same type \"zipped\" with the provided\n     * iterables by using a custom `zipper` function.\n     *\n     *     var a = Seq.of(1, 2, 3);\n     *     var b = Seq.of(4, 5, 6);\n     *     var c = a.zipWith((a, b) => a + b, b); // Seq [ 5, 7, 9 ]\n     *\n     */\n    zipWith<U, Z>(\n      zipper: (value: T, otherValue: U) => Z,\n      otherIterable: Iterable<any, U>,\n    ): Iterable.Indexed<Z>;\n    zipWith<U, V, Z>(\n      zipper: (value: T, otherValue: U, thirdValue: V) => Z,\n      otherIterable: Iterable<any, U>,\n      thirdIterable: Iterable<any, V>,\n    ): Iterable.Indexed<Z>;\n    zipWith<Z>(\n      zipper: (...any: Array<any>) => Z,\n      ...iterables: Array<Iterable<any, any>>\n    ): Iterable.Indexed<Z>;\n\n    // Search for value\n\n    /**\n     * Returns the first index at which a given value can be found in the\n     * Iterable, or -1 if it is not present.\n     */\n    indexOf(searchValue: T): number;\n\n    /**\n     * Returns the last index at which a given value can be found in the\n     * Iterable, or -1 if it is not present.\n     */\n    lastIndexOf(searchValue: T): number;\n\n    /**\n     * Returns the first index in the Iterable where a value satisfies the\n     * provided predicate function. Otherwise -1 is returned.\n     */\n    findIndex(\n      predicate: (\n        value?: T,\n        index?: number,\n        iter?: /*this*/ Iterable.Indexed<T>,\n      ) => boolean,\n      context?: any,\n    ): number;\n\n    /**\n     * Returns the last index in the Iterable where a value satisfies the\n     * provided predicate function. Otherwise -1 is returned.\n     */\n    findLastIndex(\n      predicate: (\n        value?: T,\n        index?: number,\n        iter?: /*this*/ Iterable.Indexed<T>,\n      ) => boolean,\n      context?: any,\n    ): number;\n  }\n\n  /**\n   * Set Iterables only represent values. They have no associated keys or\n   * indices. Duplicate values are possible in Seq.Sets, however the\n   * concrete `Set` does not allow duplicate values.\n   *\n   * Iterable methods on Iterable.Set such as `map` and `forEach` will provide\n   * the value as both the first and second arguments to the provided function.\n   *\n   *     var seq = Seq.Set.of('A', 'B', 'C');\n   *     assert.equal(seq.every((v, k) => v === k), true);\n   *\n   */\n  export module Set {}\n\n  /**\n   * Similar to `Iterable()`, but always returns a Iterable.Set.\n   */\n  export function Set<T>(iter: Iterable.Set<T>): Iterable.Set<T>;\n  export function Set<T>(iter: Iterable.Indexed<T>): Iterable.Set<T>;\n  export function Set<K, V>(\n    iter: Iterable.Keyed<K, V>,\n  ): Iterable.Set</*[K,V]*/ any>;\n  export function Set<T>(array: Array<T>): Iterable.Set<T>;\n  export function Set<T>(iterator: Iterator<T>): Iterable.Set<T>;\n  export function Set<T>(iterable: /*Iterable<T>*/ Object): Iterable.Set<T>;\n\n  export interface Set<T> extends Iterable<T, T> {\n    /**\n     * Returns Seq.Set.\n     * @override\n     */\n    toSeq(): Seq.Set<T>;\n  }\n}\n\n/**\n * Creates an Iterable.\n *\n * The type of Iterable created is based on the input.\n *\n *   * If an `Iterable`, that same `Iterable`.\n *   * If an Array-like, an `Iterable.Indexed`.\n *   * If an Object with an Iterator, an `Iterable.Indexed`.\n *   * If an Iterator, an `Iterable.Indexed`.\n *   * If an Object, an `Iterable.Keyed`.\n *\n * This methods forces the conversion of Objects and Strings to Iterables.\n * If you want to ensure that a Iterable of one item is returned, use\n * `Seq.of`.\n */\nexport function Iterable<K, V>(iterable: Iterable<K, V>): Iterable<K, V>;\nexport function Iterable<T>(array: Array<T>): Iterable.Indexed<T>;\nexport function Iterable<V>(obj: {\n  [key: string]: V;\n}): Iterable.Keyed<string, V>;\nexport function Iterable<T>(iterator: Iterator<T>): Iterable.Indexed<T>;\nexport function Iterable<T>(\n  iterable: /*ES6Iterable<T>*/ Object,\n): Iterable.Indexed<T>;\nexport function Iterable<V>(value: V): Iterable.Indexed<V>;\n\nexport interface Iterable<K, V> {\n  // Value equality\n\n  /**\n   * True if this and the other Iterable have value equality, as defined\n   * by `Immutable.is()`.\n   *\n   * Note: This is equivalent to `Immutable.is(this, other)`, but provided to\n   * allow for chained expressions.\n   */\n  equals(other: Iterable<K, V>): boolean;\n\n  /**\n   * Computes and returns the hashed identity for this Iterable.\n   *\n   * The `hashCode` of an Iterable is used to determine potential equality,\n   * and is used when adding this to a `Set` or as a key in a `Map`, enabling\n   * lookup via a different instance.\n   *\n   *     var a = List.of(1, 2, 3);\n   *     var b = List.of(1, 2, 3);\n   *     assert(a !== b); // different instances\n   *     var set = Set.of(a);\n   *     assert(set.has(b) === true);\n   *\n   * If two values have the same `hashCode`, they are [not guaranteed\n   * to be equal][Hash Collision]. If two values have different `hashCode`s,\n   * they must not be equal.\n   *\n   * [Hash Collision]: http://en.wikipedia.org/wiki/Collision_(computer_science)\n   */\n  hashCode(): number;\n\n  // Reading values\n\n  /**\n   * Returns the value associated with the provided key, or notSetValue if\n   * the Iterable does not contain this key.\n   *\n   * Note: it is possible a key may be associated with an `undefined` value,\n   * so if `notSetValue` is not provided and this method returns `undefined`,\n   * that does not guarantee the key was not found.\n   */\n  get(key: K, notSetValue?: V): V;\n\n  /**\n   * True if a key exists within this `Iterable`, using `Immutable.is` to determine equality\n   */\n  has(key: K): boolean;\n\n  /**\n   * True if a value exists within this `Iterable`, using `Immutable.is` to determine equality\n   * @alias contains\n   */\n  includes(value: V): boolean;\n  contains(value: V): boolean;\n\n  /**\n   * The first value in the Iterable.\n   */\n  first(): V;\n\n  /**\n   * The last value in the Iterable.\n   */\n  last(): V;\n\n  // Reading deep values\n\n  /**\n   * Returns the value found by following a path of keys or indices through\n   * nested Iterables.\n   */\n  getIn(searchKeyPath: Array<any>, notSetValue?: any): any;\n  getIn(searchKeyPath: Iterable<any, any>, notSetValue?: any): any;\n\n  /**\n   * True if the result of following a path of keys or indices through nested\n   * Iterables results in a set value.\n   */\n  hasIn(searchKeyPath: Array<any>): boolean;\n  hasIn(searchKeyPath: Iterable<any, any>): boolean;\n\n  // Conversion to JavaScript types\n\n  /**\n   * Deeply converts this Iterable to equivalent JS.\n   *\n   * `Iterable.Indexeds`, and `Iterable.Sets` become Arrays, while\n   * `Iterable.Keyeds` become Objects.\n   *\n   * @alias toJSON\n   */\n  toJS(): any;\n\n  /**\n   * Shallowly converts this iterable to an Array, discarding keys.\n   */\n  toArray(): Array<V>;\n\n  /**\n   * Shallowly converts this Iterable to an Object.\n   *\n   * Throws if keys are not strings.\n   */\n  toObject(): { [key: string]: V };\n\n  // Conversion to Collections\n\n  /**\n   * Converts this Iterable to a Map, Throws if keys are not hashable.\n   *\n   * Note: This is equivalent to `Map(this.toKeyedSeq())`, but provided\n   * for convenience and to allow for chained expressions.\n   */\n  toMap(): Map<K, V>;\n\n  /**\n   * Converts this Iterable to a Map, maintaining the order of iteration.\n   *\n   * Note: This is equivalent to `OrderedMap(this.toKeyedSeq())`, but\n   * provided for convenience and to allow for chained expressions.\n   */\n  toOrderedMap(): OrderedMap<K, V>;\n\n  /**\n   * Converts this Iterable to a Set, discarding keys. Throws if values\n   * are not hashable.\n   *\n   * Note: This is equivalent to `Set(this)`, but provided to allow for\n   * chained expressions.\n   */\n  toSet(): Set<V>;\n\n  /**\n   * Converts this Iterable to a Set, maintaining the order of iteration and\n   * discarding keys.\n   *\n   * Note: This is equivalent to `OrderedSet(this.valueSeq())`, but provided\n   * for convenience and to allow for chained expressions.\n   */\n  toOrderedSet(): OrderedSet<V>;\n\n  /**\n   * Converts this Iterable to a List, discarding keys.\n   *\n   * Note: This is equivalent to `List(this)`, but provided to allow\n   * for chained expressions.\n   */\n  toList(): List<V>;\n\n  /**\n   * Converts this Iterable to a Stack, discarding keys. Throws if values\n   * are not hashable.\n   *\n   * Note: This is equivalent to `Stack(this)`, but provided to allow for\n   * chained expressions.\n   */\n  toStack(): Stack<V>;\n\n  // Conversion to Seq\n\n  /**\n   * Converts this Iterable to a Seq of the same kind (indexed,\n   * keyed, or set).\n   */\n  toSeq(): Seq<K, V>;\n\n  /**\n   * Returns a Seq.Keyed from this Iterable where indices are treated as keys.\n   *\n   * This is useful if you want to operate on an\n   * Iterable.Indexed and preserve the [index, value] pairs.\n   *\n   * The returned Seq will have identical iteration order as\n   * this Iterable.\n   *\n   * Example:\n   *\n   *     var indexedSeq = Immutable.Seq.of('A', 'B', 'C');\n   *     indexedSeq.filter(v => v === 'B').toString() // Seq [ 'B' ]\n   *     var keyedSeq = indexedSeq.toKeyedSeq();\n   *     keyedSeq.filter(v => v === 'B').toString() // Seq { 1: 'B' }\n   *\n   */\n  toKeyedSeq(): Seq.Keyed<K, V>;\n\n  /**\n   * Returns an Seq.Indexed of the values of this Iterable, discarding keys.\n   */\n  toIndexedSeq(): Seq.Indexed<V>;\n\n  /**\n   * Returns a Seq.Set of the values of this Iterable, discarding keys.\n   */\n  toSetSeq(): Seq.Set<V>;\n\n  // Iterators\n\n  /**\n   * An iterator of this `Iterable`'s keys.\n   *\n   * Note: this will return an ES6 iterator which does not support Immutable JS sequence algorithms. Use `keySeq` instead, if this is what you want.\n   */\n  keys(): Iterator<K>;\n\n  /**\n   * An iterator of this `Iterable`'s values.\n   *\n   * Note: this will return an ES6 iterator which does not support Immutable JS sequence algorithms. Use `valueSeq` instead, if this is what you want.\n   */\n  values(): Iterator<V>;\n\n  /**\n   * An iterator of this `Iterable`'s entries as `[key, value]` tuples.\n   *\n   * Note: this will return an ES6 iterator which does not support Immutable JS sequence algorithms. Use `entrySeq` instead, if this is what you want.\n   */\n  entries(): Iterator</*[K, V]*/ Array<any>>;\n\n  // Iterables (Seq)\n\n  /**\n   * Returns a new Seq.Indexed of the keys of this Iterable,\n   * discarding values.\n   */\n  keySeq(): Seq.Indexed<K>;\n\n  /**\n   * Returns an Seq.Indexed of the values of this Iterable, discarding keys.\n   */\n  valueSeq(): Seq.Indexed<V>;\n\n  /**\n   * Returns a new Seq.Indexed of [key, value] tuples.\n   */\n  entrySeq(): Seq.Indexed</*(K, V)*/ Array<any>>;\n\n  // Sequence algorithms\n\n  /**\n   * Returns a new Iterable of the same type with values passed through a\n   * `mapper` function.\n   *\n   *     Seq({ a: 1, b: 2 }).map(x => 10 * x)\n   *     // Seq { a: 10, b: 20 }\n   *\n   */\n  map<M>(\n    mapper: (value?: V, key?: K, iter?: /*this*/ Iterable<K, V>) => M,\n    context?: any,\n  ): /*this*/ Iterable<K, M>;\n\n  /**\n   * Returns a new Iterable of the same type with only the entries for which\n   * the `predicate` function returns true.\n   *\n   *     Seq({a:1,b:2,c:3,d:4}).filter(x => x % 2 === 0)\n   *     // Seq { b: 2, d: 4 }\n   *\n   */\n  filter(\n    predicate: (value?: V, key?: K, iter?: /*this*/ Iterable<K, V>) => boolean,\n    context?: any,\n  ): /*this*/ Iterable<K, V>;\n\n  /**\n   * Returns a new Iterable of the same type with only the entries for which\n   * the `predicate` function returns false.\n   *\n   *     Seq({a:1,b:2,c:3,d:4}).filterNot(x => x % 2 === 0)\n   *     // Seq { a: 1, c: 3 }\n   *\n   */\n  filterNot(\n    predicate: (value?: V, key?: K, iter?: /*this*/ Iterable<K, V>) => boolean,\n    context?: any,\n  ): /*this*/ Iterable<K, V>;\n\n  /**\n   * Returns a new Iterable of the same type in reverse order.\n   */\n  reverse(): /*this*/ Iterable<K, V>;\n\n  /**\n   * Returns a new Iterable of the same type which includes the same entries,\n   * stably sorted by using a `comparator`.\n   *\n   * If a `comparator` is not provided, a default comparator uses `<` and `>`.\n   *\n   * `comparator(valueA, valueB)`:\n   *\n   *   * Returns `0` if the elements should not be swapped.\n   *   * Returns `-1` (or any negative number) if `valueA` comes before `valueB`\n   *   * Returns `1` (or any positive number) if `valueA` comes after `valueB`\n   *   * Is pure, i.e. it must always return the same value for the same pair\n   *     of values.\n   *\n   * When sorting collections which have no defined order, their ordered\n   * equivalents will be returned. e.g. `map.sort()` returns OrderedMap.\n   */\n  sort(comparator?: (valueA: V, valueB: V) => number): /*this*/ Iterable<K, V>;\n\n  /**\n   * Like `sort`, but also accepts a `comparatorValueMapper` which allows for\n   * sorting by more sophisticated means:\n   *\n   *     hitters.sortBy(hitter => hitter.avgHits);\n   *\n   */\n  sortBy<C>(\n    comparatorValueMapper: (\n      value?: V,\n      key?: K,\n      iter?: /*this*/ Iterable<K, V>,\n    ) => C,\n    comparator?: (valueA: C, valueB: C) => number,\n  ): /*this*/ Iterable<K, V>;\n\n  /**\n   * Returns a `Iterable.Keyed` of `Iterable.Keyeds`, grouped by the return\n   * value of the `grouper` function.\n   *\n   * Note: This is always an eager operation.\n   */\n  groupBy<G>(\n    grouper: (value?: V, key?: K, iter?: /*this*/ Iterable<K, V>) => G,\n    context?: any,\n  ): /*Map*/ Seq.Keyed<G, /*this*/ Iterable<K, V>>;\n\n  // Side effects\n\n  /**\n   * The `sideEffect` is executed for every entry in the Iterable.\n   *\n   * Unlike `Array#forEach`, if any call of `sideEffect` returns\n   * `false`, the iteration will stop. Returns the number of entries iterated\n   * (including the last iteration which returned false).\n   */\n  forEach(\n    sideEffect: (value?: V, key?: K, iter?: /*this*/ Iterable<K, V>) => any,\n    context?: any,\n  ): number;\n\n  // Creating subsets\n\n  /**\n   * Returns a new Iterable of the same type representing a portion of this\n   * Iterable from start up to but not including end.\n   *\n   * If begin is negative, it is offset from the end of the Iterable. e.g.\n   * `slice(-2)` returns a Iterable of the last two entries. If it is not\n   * provided the new Iterable will begin at the beginning of this Iterable.\n   *\n   * If end is negative, it is offset from the end of the Iterable. e.g.\n   * `slice(0, -1)` returns an Iterable of everything but the last entry. If\n   * it is not provided, the new Iterable will continue through the end of\n   * this Iterable.\n   *\n   * If the requested slice is equivalent to the current Iterable, then it\n   * will return itself.\n   */\n  slice(begin?: number, end?: number): /*this*/ Iterable<K, V>;\n\n  /**\n   * Returns a new Iterable of the same type containing all entries except\n   * the first.\n   */\n  rest(): /*this*/ Iterable<K, V>;\n\n  /**\n   * Returns a new Iterable of the same type containing all entries except\n   * the last.\n   */\n  butLast(): /*this*/ Iterable<K, V>;\n\n  /**\n   * Returns a new Iterable of the same type which excludes the first `amount`\n   * entries from this Iterable.\n   */\n  skip(amount: number): /*this*/ Iterable<K, V>;\n\n  /**\n   * Returns a new Iterable of the same type which excludes the last `amount`\n   * entries from this Iterable.\n   */\n  skipLast(amount: number): /*this*/ Iterable<K, V>;\n\n  /**\n   * Returns a new Iterable of the same type which includes entries starting\n   * from when `predicate` first returns false.\n   *\n   *     Seq.of('dog','frog','cat','hat','god')\n   *       .skipWhile(x => x.match(/g/))\n   *     // Seq [ 'cat', 'hat', 'god' ]\n   *\n   */\n  skipWhile(\n    predicate: (value?: V, key?: K, iter?: /*this*/ Iterable<K, V>) => boolean,\n    context?: any,\n  ): /*this*/ Iterable<K, V>;\n\n  /**\n   * Returns a new Iterable of the same type which includes entries starting\n   * from when `predicate` first returns true.\n   *\n   *     Seq.of('dog','frog','cat','hat','god')\n   *       .skipUntil(x => x.match(/hat/))\n   *     // Seq [ 'hat', 'god' ]\n   *\n   */\n  skipUntil(\n    predicate: (value?: V, key?: K, iter?: /*this*/ Iterable<K, V>) => boolean,\n    context?: any,\n  ): /*this*/ Iterable<K, V>;\n\n  /**\n   * Returns a new Iterable of the same type which includes the first `amount`\n   * entries from this Iterable.\n   */\n  take(amount: number): /*this*/ Iterable<K, V>;\n\n  /**\n   * Returns a new Iterable of the same type which includes the last `amount`\n   * entries from this Iterable.\n   */\n  takeLast(amount: number): /*this*/ Iterable<K, V>;\n\n  /**\n   * Returns a new Iterable of the same type which includes entries from this\n   * Iterable as long as the `predicate` returns true.\n   *\n   *     Seq.of('dog','frog','cat','hat','god')\n   *       .takeWhile(x => x.match(/o/))\n   *     // Seq [ 'dog', 'frog' ]\n   *\n   */\n  takeWhile(\n    predicate: (value?: V, key?: K, iter?: /*this*/ Iterable<K, V>) => boolean,\n    context?: any,\n  ): /*this*/ Iterable<K, V>;\n\n  /**\n   * Returns a new Iterable of the same type which includes entries from this\n   * Iterable as long as the `predicate` returns false.\n   *\n   *     Seq.of('dog','frog','cat','hat','god').takeUntil(x => x.match(/at/))\n   *     // ['dog', 'frog']\n   *\n   */\n  takeUntil(\n    predicate: (value?: V, key?: K, iter?: /*this*/ Iterable<K, V>) => boolean,\n    context?: any,\n  ): /*this*/ Iterable<K, V>;\n\n  // Combination\n\n  /**\n   * Returns a new Iterable of the same type with other values and\n   * iterable-like concatenated to this one.\n   *\n   * For Seqs, all entries will be present in\n   * the resulting iterable, even if they have the same key.\n   */\n  concat(\n    ...valuesOrIterables: /*Array<Iterable<K, V>|V*/ any[]\n  ): /*this*/ Iterable<K, V>;\n\n  /**\n   * Flattens nested Iterables.\n   *\n   * Will deeply flatten the Iterable by default, returning an Iterable of the\n   * same type, but a `depth` can be provided in the form of a number or\n   * boolean (where true means to shallowly flatten one level). A depth of 0\n   * (or shallow: false) will deeply flatten.\n   *\n   * Flattens only others Iterable, not Arrays or Objects.\n   *\n   * Note: `flatten(true)` operates on Iterable<any, Iterable<K, V>> and\n   * returns Iterable<K, V>\n   */\n  flatten(depth?: number): /*this*/ Iterable<any, any>;\n  flatten(shallow?: boolean): /*this*/ Iterable<any, any>;\n\n  /**\n   * Flat-maps the Iterable, returning an Iterable of the same type.\n   *\n   * Similar to `iter.map(...).flatten(true)`.\n   */\n  flatMap<MK, MV>(\n    mapper: (\n      value?: V,\n      key?: K,\n      iter?: /*this*/ Iterable<K, V>,\n    ) => Iterable<MK, MV>,\n    context?: any,\n  ): /*this*/ Iterable<MK, MV>;\n  flatMap<MK, MV>(\n    mapper: (\n      value?: V,\n      key?: K,\n      iter?: /*this*/ Iterable<K, V>,\n    ) => /*iterable-like*/ any,\n    context?: any,\n  ): /*this*/ Iterable<MK, MV>;\n\n  // Reducing a value\n\n  /**\n   * Reduces the Iterable to a value by calling the `reducer` for every entry\n   * in the Iterable and passing along the reduced value.\n   *\n   * If `initialReduction` is not provided, or is null, the first item in the\n   * Iterable will be used.\n   *\n   * @see `Array#reduce`.\n   */\n  reduce<R>(\n    reducer: (\n      reduction?: R,\n      value?: V,\n      key?: K,\n      iter?: /*this*/ Iterable<K, V>,\n    ) => R,\n    initialReduction?: R,\n    context?: any,\n  ): R;\n\n  /**\n   * Reduces the Iterable in reverse (from the right side).\n   *\n   * Note: Similar to this.reverse().reduce(), and provided for parity\n   * with `Array#reduceRight`.\n   */\n  reduceRight<R>(\n    reducer: (\n      reduction?: R,\n      value?: V,\n      key?: K,\n      iter?: /*this*/ Iterable<K, V>,\n    ) => R,\n    initialReduction?: R,\n    context?: any,\n  ): R;\n\n  /**\n   * True if `predicate` returns true for all entries in the Iterable.\n   */\n  every(\n    predicate: (value?: V, key?: K, iter?: /*this*/ Iterable<K, V>) => boolean,\n    context?: any,\n  ): boolean;\n\n  /**\n   * True if `predicate` returns true for any entry in the Iterable.\n   */\n  some(\n    predicate: (value?: V, key?: K, iter?: /*this*/ Iterable<K, V>) => boolean,\n    context?: any,\n  ): boolean;\n\n  /**\n   * Joins values together as a string, inserting a separator between each.\n   * The default separator is `\",\"`.\n   */\n  join(separator?: string): string;\n\n  /**\n   * Returns true if this Iterable includes no values.\n   *\n   * For some lazy `Seq`, `isEmpty` might need to iterate to determine\n   * emptiness. At most one iteration will occur.\n   */\n  isEmpty(): boolean;\n\n  /**\n   * Returns the size of this Iterable.\n   *\n   * Regardless of if this Iterable can describe its size lazily (some Seqs\n   * cannot), this method will always return the correct size. E.g. it\n   * evaluates a lazy `Seq` if necessary.\n   *\n   * If `predicate` is provided, then this returns the count of entries in the\n   * Iterable for which the `predicate` returns true.\n   */\n  count(): number;\n  count(\n    predicate: (value?: V, key?: K, iter?: /*this*/ Iterable<K, V>) => boolean,\n    context?: any,\n  ): number;\n\n  /**\n   * Returns a `Seq.Keyed` of counts, grouped by the return value of\n   * the `grouper` function.\n   *\n   * Note: This is not a lazy operation.\n   */\n  countBy<G>(\n    grouper: (value?: V, key?: K, iter?: /*this*/ Iterable<K, V>) => G,\n    context?: any,\n  ): Map<G, number>;\n\n  // Search for value\n\n  /**\n   * Returns the first value for which the `predicate` returns true.\n   */\n  find(\n    predicate: (value?: V, key?: K, iter?: /*this*/ Iterable<K, V>) => boolean,\n    context?: any,\n    notSetValue?: V,\n  ): V;\n\n  /**\n   * Returns the last value for which the `predicate` returns true.\n   *\n   * Note: `predicate` will be called for each entry in reverse.\n   */\n  findLast(\n    predicate: (value?: V, key?: K, iter?: /*this*/ Iterable<K, V>) => boolean,\n    context?: any,\n    notSetValue?: V,\n  ): V;\n\n  /**\n   * Returns the first [key, value] entry for which the `predicate` returns true.\n   */\n  findEntry(\n    predicate: (value?: V, key?: K, iter?: /*this*/ Iterable<K, V>) => boolean,\n    context?: any,\n    notSetValue?: V,\n  ): /*[K, V]*/ Array<any>;\n\n  /**\n   * Returns the last [key, value] entry for which the `predicate`\n   * returns true.\n   *\n   * Note: `predicate` will be called for each entry in reverse.\n   */\n  findLastEntry(\n    predicate: (value?: V, key?: K, iter?: /*this*/ Iterable<K, V>) => boolean,\n    context?: any,\n    notSetValue?: V,\n  ): /*[K, V]*/ Array<any>;\n\n  /**\n   * Returns the key for which the `predicate` returns true.\n   */\n  findKey(\n    predicate: (\n      value?: V,\n      key?: K,\n      iter?: /*this*/ Iterable.Keyed<K, V>,\n    ) => boolean,\n    context?: any,\n  ): K;\n\n  /**\n   * Returns the last key for which the `predicate` returns true.\n   *\n   * Note: `predicate` will be called for each entry in reverse.\n   */\n  findLastKey(\n    predicate: (\n      value?: V,\n      key?: K,\n      iter?: /*this*/ Iterable.Keyed<K, V>,\n    ) => boolean,\n    context?: any,\n  ): K;\n\n  /**\n   * Returns the key associated with the search value, or undefined.\n   */\n  keyOf(searchValue: V): K;\n\n  /**\n   * Returns the last key associated with the search value, or undefined.\n   */\n  lastKeyOf(searchValue: V): K;\n\n  /**\n   * Returns the maximum value in this collection. If any values are\n   * comparatively equivalent, the first one found will be returned.\n   *\n   * The `comparator` is used in the same way as `Iterable#sort`. If it is not\n   * provided, the default comparator is `>`.\n   *\n   * When two values are considered equivalent, the first encountered will be\n   * returned. Otherwise, `max` will operate independent of the order of input\n   * as long as the comparator is commutative. The default comparator `>` is\n   * commutative *only* when types do not differ.\n   *\n   * If `comparator` returns 0 and either value is NaN, undefined, or null,\n   * that value will be returned.\n   */\n  max(comparator?: (valueA: V, valueB: V) => number): V;\n\n  /**\n   * Like `max`, but also accepts a `comparatorValueMapper` which allows for\n   * comparing by more sophisticated means:\n   *\n   *     hitters.maxBy(hitter => hitter.avgHits);\n   *\n   */\n  maxBy<C>(\n    comparatorValueMapper: (\n      value?: V,\n      key?: K,\n      iter?: /*this*/ Iterable<K, V>,\n    ) => C,\n    comparator?: (valueA: C, valueB: C) => number,\n  ): V;\n\n  /**\n   * Returns the minimum value in this collection. If any values are\n   * comparatively equivalent, the first one found will be returned.\n   *\n   * The `comparator` is used in the same way as `Iterable#sort`. If it is not\n   * provided, the default comparator is `<`.\n   *\n   * When two values are considered equivalent, the first encountered will be\n   * returned. Otherwise, `min` will operate independent of the order of input\n   * as long as the comparator is commutative. The default comparator `<` is\n   * commutative *only* when types do not differ.\n   *\n   * If `comparator` returns 0 and either value is NaN, undefined, or null,\n   * that value will be returned.\n   */\n  min(comparator?: (valueA: V, valueB: V) => number): V;\n\n  /**\n   * Like `min`, but also accepts a `comparatorValueMapper` which allows for\n   * comparing by more sophisticated means:\n   *\n   *     hitters.minBy(hitter => hitter.avgHits);\n   *\n   */\n  minBy<C>(\n    comparatorValueMapper: (\n      value?: V,\n      key?: K,\n      iter?: /*this*/ Iterable<K, V>,\n    ) => C,\n    comparator?: (valueA: C, valueB: C) => number,\n  ): V;\n\n  // Comparison\n\n  /**\n   * True if `iter` includes every value in this Iterable.\n   */\n  isSubset(iter: Iterable<any, V>): boolean;\n  isSubset(iter: Array<V>): boolean;\n\n  /**\n   * True if this Iterable includes every value in `iter`.\n   */\n  isSuperset(iter: Iterable<any, V>): boolean;\n  isSuperset(iter: Array<V>): boolean;\n\n  /**\n   * Note: this is here as a convenience to work around an issue with\n   * TypeScript https://github.com/Microsoft/TypeScript/issues/285, but\n   * Iterable does not define `size`, instead `Seq` defines `size` as\n   * nullable number, and `Collection` defines `size` as always a number.\n   *\n   * @ignore\n   */\n  size: number;\n}\n\n/**\n * Collection is the abstract base class for concrete data structures. It\n * cannot be constructed directly.\n *\n * Implementations should extend one of the subclasses, `Collection.Keyed`,\n * `Collection.Indexed`, or `Collection.Set`.\n */\nexport module Collection {\n  /**\n   * `Collection` which represents key-value pairs.\n   */\n  export module Keyed {}\n\n  export interface Keyed<K, V> extends Collection<K, V>, Iterable.Keyed<K, V> {\n    /**\n     * Returns Seq.Keyed.\n     * @override\n     */\n    toSeq(): Seq.Keyed<K, V>;\n  }\n\n  /**\n   * `Collection` which represents ordered indexed values.\n   */\n  export module Indexed {}\n\n  export interface Indexed<T>\n    extends Collection<number, T>,\n      Iterable.Indexed<T> {\n    /**\n     * Returns Seq.Indexed.\n     * @override\n     */\n    toSeq(): Seq.Indexed<T>;\n  }\n\n  /**\n   * `Collection` which represents values, unassociated with keys or indices.\n   *\n   * `Collection.Set` implementations should guarantee value uniqueness.\n   */\n  export module Set {}\n\n  export interface Set<T> extends Collection<T, T>, Iterable.Set<T> {\n    /**\n     * Returns Seq.Set.\n     * @override\n     */\n    toSeq(): Seq.Set<T>;\n  }\n}\n\nexport interface Collection<K, V> extends Iterable<K, V> {\n  /**\n   * All collections maintain their current `size` as an integer.\n   */\n  size: number;\n}\n\n/**\n * ES6 Iterator.\n *\n * This is not part of the Immutable library, but a common interface used by\n * many types in ES6 JavaScript.\n *\n * @ignore\n */\nexport interface Iterator<T> {\n  next(): { value: T; done: boolean };\n}\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/immutable.test.ts",
    "content": "import * as Immutable from \"./immutable\";\n\ndescribe(\"victory-util/immutable\", () => {\n  it(\"should have valid type guards\", () => {\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    function noop(arg: unknown) {}\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    function typeChecks() {\n      const u: unknown = null;\n\n      // @ts-expect-error \"u is unknown\"\n      u.asImmutable();\n\n      if (Immutable.isIterable(u)) {\n        u.count();\n      }\n      if (Immutable.isList(u)) {\n        u.asImmutable();\n        u.countBy((x) => x);\n      }\n      if (Immutable.isMap(u)) {\n        u.asImmutable();\n        u.countBy((x) => x);\n      }\n      if (Immutable.isRecord(u)) {\n        noop(u.ANYTHING);\n      }\n    }\n  });\n});\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/immutable.ts",
    "content": "import type { Iterable, Record, List, Map } from \"./immutable-types\";\n\nexport const IMMUTABLE_ITERABLE = \"@@__IMMUTABLE_ITERABLE__@@\";\nexport const IMMUTABLE_RECORD = \"@@__IMMUTABLE_RECORD__@@\";\nexport const IMMUTABLE_LIST = \"@@__IMMUTABLE_LIST__@@\";\nexport const IMMUTABLE_MAP = \"@@__IMMUTABLE_MAP__@@\";\n\nexport function isIterable(x): x is Iterable<unknown, unknown> {\n  return !!(x && x[IMMUTABLE_ITERABLE]);\n}\n\nexport function isRecord(x): x is Record<string, unknown> {\n  return !!(x && x[IMMUTABLE_RECORD]);\n}\n\nexport function isImmutable(\n  x,\n): x is Iterable<unknown, unknown> | Record<string, unknown> {\n  return isIterable(x) || isRecord(x);\n}\n\nexport function isList(x): x is List<unknown> {\n  return !!(x && x[IMMUTABLE_LIST]);\n}\n\nexport function isMap(x): x is Map<unknown, unknown> {\n  return !!(x && x[IMMUTABLE_MAP]);\n}\n\nexport function shallowToJS(x, whitelist?: Record<string, boolean | unknown>) {\n  return isIterable(x)\n    ? x.reduce(\n        (result: any, curr: any, key: any) => {\n          let newCurr = curr;\n          if (whitelist && whitelist[key]) {\n            newCurr = shallowToJS(curr);\n          }\n          result[key] = newCurr;\n          return result;\n        },\n        isList(x) ? [] : {},\n      )\n    : x;\n}\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/index.ts",
    "content": "export * from \"./add-events\";\nexport * from \"./merge-refs\";\nexport * as Axis from \"./axis\";\nexport * as Collection from \"./collection\";\nexport * from \"./common-props\";\nexport * as Data from \"./data\";\nexport * as DefaultTransitions from \"./default-transitions\";\nexport * as Domain from \"./domain\";\nexport * as Events from \"./events\";\nexport * as Helpers from \"./helpers\";\nexport * as Hooks from \"./hooks\";\nexport * as Immutable from \"./immutable\";\nexport * as LabelHelpers from \"./label-helpers\";\nexport * as LineHelpers from \"./line-helpers\";\nexport * as Log from \"./log\";\nexport * as PointPathHelpers from \"./point-path-helpers\";\nexport * as Scale from \"./scale\";\nexport * as Selection from \"./selection\";\nexport type { SVGCoordinateType, SVGCoordinateBounds } from \"./selection\";\nexport * as Style from \"./style\";\nexport * as TextSize from \"./textsize\";\nexport type { TextSizeStyleInterface } from \"./textsize\";\nexport { default as Timer } from \"./timer\";\nexport { default as TimerContext } from \"./timer-context\";\nexport * as Transitions from \"./transitions\";\nexport * as UserProps from \"./user-props\";\nexport * as Wrapper from \"./wrapper\";\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/label-helpers.test.tsx",
    "content": "/* eslint max-nested-callbacks: 0 */\nimport React from \"react\";\nimport * as d3Scale from \"victory-vendor/d3-scale\";\n\nimport * as LabelHelpers from \"./label-helpers\";\nimport { VictoryLabel } from \"../victory-label/victory-label\";\n\nconst scale = { x: d3Scale.scaleLinear(), y: d3Scale.scaleLinear() };\nconst data = [\n  { x: 0, y: 0 },\n  { x: 0.5, y: 0.5 },\n];\nconst labelComponent = <VictoryLabel />;\nconst style = { labels: { fontSize: 8 } };\n\nconst basicProps = { scale, data, labelComponent, style };\n\ndescribe(\"victory-util/label-helpers\", () => {\n  describe(\"getProps\", () => {\n    it(\"returns the correct positions given a set of props an and index\", () => {\n      data.forEach((datum, index) => {\n        const labelProps = LabelHelpers.getProps(basicProps, index);\n        expect(labelProps.x).toEqual(datum.x);\n        expect(labelProps.y).toEqual(datum.y);\n      });\n    });\n    it(\"returns the correct label text from a labels array\", () => {\n      const labels = [\"one\", \"two\"];\n      const props = Object.assign({ labels }, basicProps);\n      data.forEach((datum, index) => {\n        const labelProps = LabelHelpers.getProps(props, index);\n        expect(labelProps.text).toEqual(labels[index]);\n      });\n    });\n    it(\"returns the correct label text from datum\", () => {\n      const dataWithLabels = [\n        { x: 0, y: 0, label: \"one\" },\n        { x: 0.5, y: 0.5, label: \"two\" },\n      ];\n      const props = Object.assign({}, basicProps, { data: dataWithLabels });\n      data.forEach((datum, index) => {\n        const labelProps = LabelHelpers.getProps(props, index);\n        expect(labelProps.text).toEqual(dataWithLabels[index].label);\n      });\n    });\n    it(\"returns the correct positions for polar labels\", () => {\n      const polarScale = {\n        x: d3Scale.scaleLinear().range([0, Math.PI * 2]),\n        y: d3Scale.scaleLinear(),\n      };\n      data.forEach((datum, index) => {\n        const props = Object.assign({}, basicProps, {\n          scale: polarScale,\n          polar: true,\n        });\n        const labelProps = LabelHelpers.getProps(props, index);\n        expect(labelProps.x).toEqual(datum.y * Math.cos(datum.x * Math.PI * 2));\n        // We need Math.abs here because 0 does not equal -0 :(\n        expect(Math.abs(labelProps.y)).toEqual(\n          Math.abs(-datum.y * Math.sin(datum.x * Math.PI * 2)),\n        );\n      });\n    });\n  });\n\n  describe(\"getPolarAngle\", () => {\n    it(\"returns zero when labelPlacement is vertical\", () => {\n      const angle = LabelHelpers.getPolarAngle({ labelPlacement: \"vertical\" });\n      expect(angle).toEqual(0);\n    });\n    it(\"returns angles corresponding to perpendicular labelPlacement\", () => {\n      expect(\n        LabelHelpers.getPolarAngle({ labelPlacement: \"perpendicular\" }, 15),\n      ).toEqual(75);\n      expect(\n        LabelHelpers.getPolarAngle({ labelPlacement: \"perpendicular\" }, 45),\n      ).toEqual(45);\n      expect(\n        LabelHelpers.getPolarAngle({ labelPlacement: \"perpendicular\" }, 90),\n      ).toEqual(0);\n      expect(\n        LabelHelpers.getPolarAngle({ labelPlacement: \"perpendicular\" }, 135),\n      ).toEqual(-45);\n      expect(\n        LabelHelpers.getPolarAngle({ labelPlacement: \"perpendicular\" }, 180),\n      ).toEqual(90);\n      expect(\n        LabelHelpers.getPolarAngle({ labelPlacement: \"perpendicular\" }, 225),\n      ).toEqual(45);\n      expect(\n        LabelHelpers.getPolarAngle({ labelPlacement: \"perpendicular\" }, 270),\n      ).toEqual(0);\n      expect(\n        LabelHelpers.getPolarAngle({ labelPlacement: \"perpendicular\" }, 315),\n      ).toEqual(-45);\n    });\n    it(\"returns angles corresponding to parallel labelPlacement\", () => {\n      expect(\n        LabelHelpers.getPolarAngle({ labelPlacement: \"parallel\" }, 15),\n      ).toEqual(-15);\n      expect(\n        LabelHelpers.getPolarAngle({ labelPlacement: \"parallel\" }, 45),\n      ).toEqual(-45);\n      expect(\n        LabelHelpers.getPolarAngle({ labelPlacement: \"parallel\" }, 90),\n      ).toEqual(-90);\n      expect(\n        LabelHelpers.getPolarAngle({ labelPlacement: \"parallel\" }, 135),\n      ).toEqual(45);\n      expect(\n        LabelHelpers.getPolarAngle({ labelPlacement: \"parallel\" }, 180),\n      ).toEqual(0);\n      expect(\n        LabelHelpers.getPolarAngle({ labelPlacement: \"parallel\" }, 225),\n      ).toEqual(-45);\n      expect(\n        LabelHelpers.getPolarAngle({ labelPlacement: \"parallel\" }, 270),\n      ).toEqual(-90);\n      expect(\n        LabelHelpers.getPolarAngle({ labelPlacement: \"parallel\" }, 315),\n      ).toEqual(45);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/label-helpers.ts",
    "content": "import { VictoryLabelProps } from \"../victory-label/victory-label\";\nimport * as Helpers from \"./helpers\";\nimport defaults from \"lodash/defaults\";\n\n// Private Functions\n\nfunction getVerticalAnchor(props, datum: VictoryLabelProps[\"datum\"] = {}) {\n  const sign = datum._y >= 0 ? 1 : -1;\n  const labelStyle = (props.style && props.style.labels) || {};\n  if (datum.verticalAnchor || labelStyle.verticalAnchor) {\n    return datum.verticalAnchor || labelStyle.verticalAnchor;\n  } else if (!props.horizontal) {\n    return sign >= 0 ? \"end\" : \"start\";\n  }\n  return \"middle\";\n}\n\nfunction getTextAnchor(props, datum: VictoryLabelProps[\"datum\"] = {}) {\n  const { style, horizontal } = props;\n  const sign = datum._y >= 0 ? 1 : -1;\n  const labelStyle = (style && style.labels) || {};\n  if (datum.verticalAnchor || labelStyle.verticalAnchor) {\n    return datum.verticalAnchor || labelStyle.verticalAnchor;\n  } else if (!horizontal) {\n    return \"middle\";\n  }\n  return sign >= 0 ? \"start\" : \"end\";\n}\n\nfunction getAngle(props, datum: VictoryLabelProps[\"datum\"] = {}) {\n  const labelStyle = (props.style && props.style.labels) || {};\n  return datum.angle === undefined ? labelStyle.angle : datum.angle;\n}\n\nfunction getPadding(props, datum: VictoryLabelProps[\"datum\"] = {}) {\n  const { horizontal, style } = props;\n  const labelStyle = style.labels || {};\n  const defaultPadding = Helpers.evaluateProp(labelStyle.padding, props) || 0;\n  const sign = datum._y < 0 ? -1 : 1;\n  return {\n    x: horizontal ? sign * defaultPadding : 0,\n    y: horizontal ? 0 : -1 * sign * defaultPadding,\n  };\n}\n\nfunction getOffset(props, datum) {\n  if (props.polar) {\n    return {};\n  }\n  const padding = getPadding(props, datum);\n\n  return {\n    dx: padding.x,\n    dy: padding.y,\n  };\n}\n\nfunction getPosition(props, datum) {\n  const { polar } = props;\n  const { x, y } = Helpers.scalePoint(props, datum);\n  if (!polar) {\n    return { x, y };\n  }\n  const polarPadding = getPolarPadding(props, datum);\n  return {\n    x: x + polarPadding.x,\n    y: y + polarPadding.y,\n  };\n}\n\nfunction getPolarPadding(props, datum) {\n  const { style } = props;\n  const degrees = getDegrees(props, datum);\n  const labelStyle = style.labels || {};\n  const padding = Helpers.evaluateProp(labelStyle.padding, props) || 0;\n  const angle = Helpers.degreesToRadians(degrees);\n  return {\n    x: padding * Math.cos(angle),\n    y: -padding * Math.sin(angle),\n  };\n}\n\nfunction getLabelPlacement(props) {\n  const { labelComponent, labelPlacement, polar } = props;\n  const defaultLabelPlacement = polar ? \"perpendicular\" : \"vertical\";\n  return labelPlacement\n    ? labelPlacement\n    : (labelComponent.props && labelComponent.props.labelPlacement) ||\n        defaultLabelPlacement;\n}\n\nfunction getPolarOrientation(degrees) {\n  // eslint-disable-next-line no-magic-numbers\n  if (degrees < 45 || degrees > 315) {\n    return \"right\";\n    // eslint-disable-next-line no-magic-numbers\n  } else if (degrees >= 45 && degrees <= 135) {\n    return \"top\";\n    // eslint-disable-next-line no-magic-numbers\n  } else if (degrees > 135 && degrees < 225) {\n    return \"left\";\n  }\n  return \"bottom\";\n}\n\n// Exported Functions\n\nexport function getText(props, datum: VictoryLabelProps[\"datum\"] = {}, index) {\n  if (datum.label !== undefined) {\n    return datum.label;\n  }\n  return Array.isArray(props.labels) ? props.labels[index] : props.labels;\n}\n\nexport function getPolarTextAnchor(props, degrees) {\n  const labelPlacement = getLabelPlacement(props);\n  if (\n    labelPlacement === \"perpendicular\" ||\n    (labelPlacement === \"vertical\" && (degrees === 90 || degrees === 270))\n  ) {\n    return \"middle\";\n  }\n  return degrees <= 90 || degrees > 270 ? \"start\" : \"end\";\n}\n\nexport function getPolarVerticalAnchor(props, degrees) {\n  const labelPlacement = getLabelPlacement(props);\n  const orientation = getPolarOrientation(degrees);\n  if (\n    labelPlacement === \"parallel\" ||\n    orientation === \"left\" ||\n    orientation === \"right\"\n  ) {\n    return \"middle\";\n  }\n  return orientation === \"top\" ? \"end\" : \"start\";\n}\n\nexport function getPolarAngle(props, baseAngle?) {\n  const { labelPlacement, datum } = props;\n  if (!labelPlacement || labelPlacement === \"vertical\") {\n    return 0;\n  }\n  const degrees =\n    baseAngle !== undefined ? baseAngle % 360 : getDegrees(props, datum);\n  const sign = (degrees > 90 && degrees < 180) || degrees > 270 ? 1 : -1;\n  let angle = 0;\n  if (degrees === 0 || degrees === 180) {\n    angle = 90;\n  } else if (degrees > 0 && degrees < 180) {\n    angle = 90 - degrees;\n  } else if (degrees > 180 && degrees < 360) {\n    angle = 270 - degrees;\n  }\n  const labelRotation = labelPlacement === \"perpendicular\" ? 0 : 90;\n  return angle + sign * labelRotation;\n}\n\nexport function getDegrees(props, datum) {\n  const { x } = Helpers.getPoint(datum);\n  return Helpers.radiansToDegrees(props.scale.x(x)) % 360;\n}\n\nexport function getProps(props, index) {\n  const {\n    scale,\n    data,\n    style,\n    horizontal,\n    polar,\n    width,\n    height,\n    theme,\n    labelComponent,\n    disableInlineStyles,\n  } = props;\n  const datum = data[index];\n  const degrees = getDegrees(props, datum);\n  const textAnchor = polar\n    ? getPolarTextAnchor(props, degrees)\n    : getTextAnchor(props, datum);\n  const verticalAnchor = polar\n    ? getPolarVerticalAnchor(props, degrees)\n    : getVerticalAnchor(props, datum);\n  const angle = getAngle(props, datum);\n  const text = getText(props, datum, index);\n  const labelPlacement = getLabelPlacement(props);\n  const { x, y } = getPosition(props, datum);\n  const { dx, dy } = getOffset(props, datum);\n  const labelProps = {\n    angle,\n    data,\n    datum,\n    disableInlineStyles,\n    horizontal,\n    index,\n    polar,\n    scale,\n    labelPlacement,\n    text,\n    textAnchor,\n    verticalAnchor,\n    x,\n    y,\n    dx,\n    dy,\n    width,\n    height,\n    style: style.labels,\n  };\n  if (!Helpers.isTooltip(labelComponent)) {\n    return labelProps;\n  }\n  const tooltipTheme = (theme && theme.tooltip) || {};\n  return defaults({}, labelProps, Helpers.omit(tooltipTheme, [\"style\"]));\n}\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/line-helpers.ts",
    "content": "import * as d3Shape from \"victory-vendor/d3-shape\";\n\nconst defined = (d) => {\n  const y = d._y1 !== undefined ? d._y1 : d._y;\n  return y !== null && y !== undefined && d._y0 !== null;\n};\n\nconst getXAccessor = (scale) => {\n  return (d) => scale.x(d._x1 !== undefined ? d._x1 : d._x);\n};\n\nconst getYAccessor = (scale) => {\n  return (d) => scale.y(d._y1 !== undefined ? d._y1 : d._y);\n};\n\nconst getAngleAccessor = (scale) => {\n  return (d) => {\n    const x = scale.x(d._x1 !== undefined ? d._x1 : d._x);\n    return -1 * x + Math.PI / 2;\n  };\n};\n\nexport type CurveName =\n  | \"basis\"\n  | \"cardinal\"\n  | \"bumpX\"\n  | \"bumpY\"\n  | \"bundle\"\n  | \"catmullRom\"\n  | \"linear\"\n  | \"monotoneX\"\n  | \"monotoneY\"\n  | \"step\"\n  | \"stepAfter\"\n  | \"stepBefore\"\n  | \"natural\";\n\ntype ShapeMethod = keyof Pick<\n  typeof d3Shape,\n  | \"curveBasis\"\n  | \"curveCardinal\"\n  | \"curveBumpX\"\n  | \"curveBumpY\"\n  | \"curveBundle\"\n  | \"curveCatmullRom\"\n  | \"curveLinear\"\n  | \"curveMonotoneX\"\n  | \"curveMonotoneY\"\n  | \"curveStep\"\n  | \"curveStepAfter\"\n  | \"curveStepBefore\"\n  | \"curveNatural\"\n>;\ntype ShapeMethodClosed = keyof Pick<\n  typeof d3Shape,\n  | \"curveBasisClosed\"\n  | \"curveCardinalClosed\"\n  | \"curveLinearClosed\"\n  | \"curveCatmullRomClosed\"\n>;\n\nconst toNewName = (interpolation: CurveName) => {\n  // d3 shape changed the naming scheme for interpolators from \"basis\" -> \"curveBasis\" etc.\n  const capitalize = (s) => s && s[0].toUpperCase() + s.slice(1);\n  return `curve${capitalize(interpolation)}` as ShapeMethod;\n};\nconst toNewNameClosed = (interpolation: CurveName) => {\n  return `${toNewName(interpolation)}Closed` as ShapeMethodClosed;\n};\n\nexport const getInterpolationFunction = (props) => {\n  const { interpolation } = props;\n\n  if (typeof interpolation === \"function\") {\n    return interpolation;\n  }\n  if (typeof interpolation === \"string\") {\n    const { polar, openCurve = !polar } = props;\n    const interpolationName = !openCurve\n      ? toNewNameClosed(interpolation as CurveName)\n      : toNewName(interpolation as CurveName);\n\n    return d3Shape[interpolationName];\n  }\n\n  return d3Shape.curveLinear;\n};\n\nexport const getLineFunction = (props) => {\n  const { polar, scale, horizontal } = props;\n  return polar\n    ? d3Shape\n        .lineRadial()\n        .defined(defined)\n        .curve(getInterpolationFunction(props))\n        .angle(getAngleAccessor(scale))\n        .radius(getYAccessor(scale))\n    : d3Shape\n        .line()\n        .defined(defined)\n        .curve(getInterpolationFunction(props))\n        .x(horizontal ? getYAccessor(scale) : getXAccessor(scale))\n        .y(horizontal ? getXAccessor(scale) : getYAccessor(scale));\n};\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/log.ts",
    "content": "/* global console process */\n/* eslint-disable no-console */\n\nexport function warn(message: string) {\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  // @ts-ignore - Webpack DefinePlugin will replace process.env.NODE_ENV\n  if (process.env.NODE_ENV !== \"production\") {\n    if (console && console.warn) {\n      console.warn(message);\n    }\n  }\n}\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/merge-refs.ts",
    "content": "import React from \"react\";\n\nimport * as Helpers from \"./helpers\";\n\ntype Ref<T> = React.MutableRefObject<T> | React.LegacyRef<T> | undefined | null;\n\n/**\n * Used to merge multiple React refs into a single callback ref.\n *\n * @example\n * ```tsx\n * <div ref={mergeRefs([ref, forwardedRef])} />\n * ```\n */\nexport function mergeRefs<T>(refs: Ref<T>[]): React.RefCallback<T> {\n  return (value) => {\n    refs.forEach((ref) => {\n      // If the ref is a function, it's a callback ref and we call it with the value.\n      if (Helpers.isFunction(ref)) {\n        ref(value);\n      } else if (ref !== null && ref !== undefined) {\n        // If the ref is an object (not null and not undefined), it's an object ref.\n        // We assign the value to its 'current' property.\n        (ref as React.MutableRefObject<T | null>).current = value;\n      }\n    });\n  };\n}\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/point-path-helpers.test.ts",
    "content": "import * as PathHelpers from \"./point-path-helpers\";\n\ndescribe(\"point-path-helpers\", () => {\n  const x = 0;\n  const y = 0;\n  const size = 1;\n  describe(\"circle\", () => {\n    it(\"draws a path for a circle at the correct location\", () => {\n      const pathResult = PathHelpers.circle(x, y, size);\n      expect(pathResult).toContain(`M ${x}, ${y}`);\n    });\n  });\n\n  describe(\"square\", () => {\n    it(\"draws a path for a square at the correct location\", () => {\n      const pathResult = PathHelpers.square(x, y, size);\n      const baseSize = 0.87 * size;\n      expect(pathResult).toContain(`M ${x - baseSize}, ${y + baseSize}`);\n    });\n  });\n\n  describe(\"diamond\", () => {\n    it(\"draws a path for a diamond at the correct location\", () => {\n      const pathResult = PathHelpers.diamond(0, 0, 1);\n      const baseSize = 0.87 * size;\n      const length = Math.sqrt(2 * (baseSize * baseSize));\n      expect(pathResult).toContain(\n        `M ${Math.round(x)}, ${Math.round(y + length)}`,\n      );\n    });\n  });\n\n  describe(\"triangleUp\", () => {\n    it(\"draws a path for a triangleUp at the correct location\", () => {\n      const pathResult = PathHelpers.triangleUp(0, 0, 1);\n      expect(pathResult).toContain(`M ${x - size}, ${y + size}`);\n    });\n  });\n\n  describe(\"triangleDown\", () => {\n    it(\"draws a path for a triangleDown at the correct location\", () => {\n      const pathResult = PathHelpers.triangleDown(0, 0, 1);\n      expect(pathResult).toContain(`M ${x - size}, ${y - size}`);\n    });\n  });\n\n  describe(\"plus\", () => {\n    it(\"draws a path for a plus at the correct location\", () => {\n      const pathResult = PathHelpers.plus(0, 0, 1);\n      const baseSize = 1.1 * size;\n      const distance = baseSize / 1.5;\n      expect(pathResult).toContain(`M ${x - distance / 2}, ${y + baseSize}`);\n    });\n  });\n\n  describe(\"minus\", () => {\n    it(\"draws a path for a minus at the correct location\", () => {\n      const pathResult = PathHelpers.minus(0, 0, 1);\n      const baseSize = 1.1 * size;\n      const lineHeight = baseSize - baseSize * 0.3;\n      expect(pathResult).toContain(`M ${x - baseSize}, ${y + lineHeight / 2}`);\n    });\n  });\n\n  describe(\"star\", () => {\n    it(\"draws a path for a star at the correct location\", () => {\n      const pathResult = PathHelpers.star(0, 0, 1);\n      const angle = Math.PI / 5;\n      const baseSize = 1.35 * size;\n      expect(pathResult).toContain(`M ${baseSize * Math.sin(angle) + x}`);\n      expect(pathResult).toContain(`${baseSize * Math.cos(angle) + y}`);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/point-path-helpers.ts",
    "content": "/* eslint no-magic-numbers: [\"error\", { \"ignore\": [0, 1, 2, 2.5, 3] }]*/\n\nimport * as Helpers from \"./helpers\";\n\nexport function circle(x: number, y: number, size: number) {\n  return `M ${x}, ${y}\n      m ${-size}, 0\n      a ${size}, ${size} 0 1,0 ${size * 2},0\n      a ${size}, ${size} 0 1,0 ${-size * 2},0`;\n}\n\nexport function square(x: number, y: number, size: number) {\n  const baseSize = 0.87 * size; // eslint-disable-line no-magic-numbers\n  const x0 = x - baseSize;\n  const y1 = y + baseSize;\n  const distance = x + baseSize - x0;\n  return `M ${x0}, ${y1}\n      h${distance}\n      v-${distance}\n      h-${distance}\n      z`;\n}\n\nexport function diamond(x: number, y: number, size: number) {\n  const baseSize = 0.87 * size; // eslint-disable-line no-magic-numbers\n  const length = Math.sqrt(2 * (baseSize * baseSize));\n  return `M ${x}, ${y + length}\n      l ${length}, -${length}\n      l -${length}, -${length}\n      l -${length}, ${length}\n      l ${length}, ${length}\n      z`;\n}\n\nexport function triangleDown(x: number, y: number, size: number) {\n  const height = (size / 2) * Math.sqrt(3);\n  const x0 = x - size;\n  const x1 = x + size;\n  const y0 = y - size;\n  const y1 = y + height;\n  return `M ${x0}, ${y0}\n      L ${x1}, ${y0}\n      L ${x}, ${y1}\n      z`;\n}\n\nexport function triangleUp(x: number, y: number, size: number) {\n  const height = (size / 2) * Math.sqrt(3);\n  const x0 = x - size;\n  const x1 = x + size;\n  const y0 = y - height;\n  const y1 = y + size;\n  return `M ${x0}, ${y1}\n      L ${x1}, ${y1}\n      L ${x}, ${y0}\n      z`;\n}\n\nexport function plus(x: number, y: number, size: number) {\n  const baseSize = 1.1 * size; // eslint-disable-line no-magic-numbers\n  const distance = baseSize / 1.5; // eslint-disable-line no-magic-numbers\n  return `\n      M ${x - distance / 2}, ${y + baseSize}\n      v-${distance}\n      h-${distance}\n      v-${distance}\n      h${distance}\n      v-${distance}\n      h${distance}\n      v${distance}\n      h${distance}\n      v${distance}\n      h-${distance}\n      v${distance}\n      z`;\n}\n\nexport function cross(x: number, y: number, size: number) {\n  const baseSize = 0.8 * size; // eslint-disable-line no-magic-numbers\n  const distance = baseSize / 1.5; // eslint-disable-line no-magic-numbers\n  return `\n      M ${x - distance / 2}, ${y + baseSize + distance}\n      v-${distance * 2}\n      h-${distance}\n      v-${distance}\n      h${distance}\n      v-${distance}\n      h${distance}\n      v${distance}\n      h${distance}\n      v${distance}\n      h-${distance}\n      v${distance * 2}\n      z`;\n}\n\nexport function minus(x: number, y: number, size: number) {\n  const baseSize = 1.1 * size; // eslint-disable-line no-magic-numbers\n  const lineHeight = baseSize - baseSize * 0.3; // eslint-disable-line no-magic-numbers\n  const x0 = x - baseSize;\n  const y1 = y + lineHeight / 2;\n  const distance = x + baseSize - x0;\n  return `M ${x0}, ${y1}\n      h${distance}\n      v-${lineHeight}\n      h-${distance}\n      z`;\n}\n\nexport function star(x: number, y: number, size: number) {\n  const baseSize = 1.35 * size; // eslint-disable-line no-magic-numbers\n  const angle = Math.PI / 5; // eslint-disable-line no-magic-numbers\n  // eslint-disable-next-line no-magic-numbers\n  const starCoords = Helpers.range(10).map((index) => {\n    const length = index % 2 === 0 ? baseSize : baseSize / 2;\n    return `${length * Math.sin(angle * (index + 1)) + x},\n        ${length * Math.cos(angle * (index + 1)) + y}`;\n  });\n  return `M ${starCoords.join(\"L\")} z`;\n}\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/scale.test.ts",
    "content": "import * as d3Scale from \"victory-vendor/d3-scale\";\n\nimport * as Scale from \"./scale\";\n\ndescribe(\"victory-util/scale\", () => {\n  describe(\"getBaseScale\", () => {\n    it(\"returns a scale from `getScaleFromProps` when string props are provided\", () => {\n      const props = { scale: \"log\" };\n      const baseScale = Scale.getBaseScale(props, \"x\");\n      expect(baseScale).toBeInstanceOf(Function);\n      expect(baseScale.base).toBeInstanceOf(Function);\n    });\n\n    it(\"returns a scale from `getScaleFromProps` when a d3 scale is provided\", () => {\n      const props = { scale: d3Scale.scaleLog() };\n      const baseScale = Scale.getBaseScale(props, \"x\");\n      expect(baseScale).toBeInstanceOf(Function);\n      expect(baseScale.base).toBeInstanceOf(Function);\n    });\n\n    it(\"returns a default scale when data is provided\", () => {\n      const props = { data: [{ x: 0, y: 1 }] };\n      const baseScale = Scale.getBaseScale(props, \"x\");\n      expect(baseScale).toBeInstanceOf(Function);\n      expect(baseScale.domain).toBeInstanceOf(Function);\n    });\n\n    it(\"returns a default scale when nothing is provided\", () => {\n      const baseScale = Scale.getBaseScale({}, \"x\");\n      expect(baseScale).toBeInstanceOf(Function);\n      expect(baseScale.domain).toBeInstanceOf(Function);\n    });\n  });\n\n  describe(\"getScaleFromProps\", () => {\n    it(\"returns a scale when a single scale is provided in props\", () => {\n      const props = { scale: \"log\" };\n      const propsScale = Scale.getScaleFromProps(props, \"x\")!;\n      expect(propsScale).toBeInstanceOf(Function);\n      expect(propsScale.base).toBeInstanceOf(Function);\n    });\n\n    it(\"returns a scale when a scale object contains a scale for an axis\", () => {\n      const props = { scale: { x: \"log\" } };\n      const propsScale = Scale.getScaleFromProps(props, \"x\")!;\n      expect(propsScale).toBeInstanceOf(Function);\n      expect(propsScale.base).toBeInstanceOf(Function);\n    });\n\n    it(\"returns undefined when a scale object does not contain a scale for an axis\", () => {\n      const props = { scale: { y: \"log\" } };\n      const propsScale = Scale.getScaleFromProps(props, \"x\");\n      expect(propsScale).toBeUndefined();\n    });\n\n    it(\"returns undefined when an invalid scale is provided in props\", () => {\n      const props = { scale: \"foo\" };\n      const propsScale = Scale.getScaleFromProps(props, \"x\");\n      expect(propsScale).toBeUndefined();\n    });\n\n    it(\"returns undefined when no scale prop is provided\", () => {\n      const propsScale = Scale.getScaleFromProps({}, \"x\");\n      expect(propsScale).toBeUndefined();\n    });\n  });\n\n  describe(\"getScaleType\", () => {\n    it(\"returns 'log' for log scales\", () => {\n      const props = { scale: { x: d3Scale.scaleLog() } };\n      const scaleType = Scale.getScaleType(props, \"x\");\n      expect(scaleType).toEqual(\"log\");\n    });\n\n    it(\"returns a string value given a string prop\", () => {\n      const props = { scale: { x: \"linear\" } };\n      const scaleType = Scale.getScaleType(props, \"x\");\n      expect(scaleType).toEqual(\"linear\");\n    });\n\n    it(\"uses data to distinguish between time and linear scales\", () => {\n      const props = { scale: { x: d3Scale.scaleLinear() } };\n      const scaleType = Scale.getScaleType(props, \"x\");\n      expect(scaleType).toEqual(\"linear\");\n    });\n\n    it(\"returns 'linear' when no scale is set\", () => {\n      const props = {};\n      const scaleType = Scale.getScaleType(props, \"x\");\n      expect(scaleType).toEqual(\"linear\");\n    });\n\n    it(\"returns 'time' when no scale is set, and data contains dates\", () => {\n      const props = {\n        x: \"x\",\n        y: \"y\",\n        data: [{ x: new Date(\"2016-01-13\"), y: 1 }],\n      };\n      const scaleType = Scale.getScaleType(props, \"x\");\n      expect(scaleType).toEqual(\"time\");\n    });\n  });\n\n  describe(\"getType\", () => {\n    it(\"returns undefined on unknown function type\", () => {\n      // TODO: For some reason this test file doesn't respect the eslint override for this rule.\n\n      const scaleType = Scale.getType(() => {});\n      expect(scaleType).toBeUndefined();\n    });\n\n    it(\"returns a string value given a string prop\", () => {\n      const scaleType = Scale.getType(\"linear\");\n      expect(scaleType).toEqual(\"linear\");\n    });\n\n    it(\"returns 'log' for log scales\", () => {\n      const scaleType = Scale.getType(d3Scale.scaleLog());\n      expect(scaleType).toEqual(\"log\");\n    });\n\n    it(\"matches 'quantile'\", () => {\n      const scaleType = Scale.getType(d3Scale.scaleQuantile());\n      expect(scaleType).toEqual(\"quantile\");\n    });\n\n    it(\"returns undefined for scaleLinear\", () => {\n      const scaleType = Scale.getType(d3Scale.scaleLinear());\n      expect(scaleType).toBeUndefined();\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/scale.ts",
    "content": "import isPlainObject from \"lodash/isPlainObject\";\nimport * as Helpers from \"./helpers\";\nimport * as Collection from \"./collection\";\nimport * as d3Scale from \"victory-vendor/d3-scale\";\nimport { D3Scale, ScaleName } from \"../types/prop-types\";\n\nconst supportedScaleStrings = [\"linear\", \"time\", \"log\", \"sqrt\"] as const;\n\ntype D3ScaleMethods = Pick<\n  typeof d3Scale,\n  \"scaleLinear\" | \"scaleTime\" | \"scaleLog\" | \"scaleSqrt\"\n>;\n\n// Private Functions\n\nfunction toNewName(scale: ScaleName): keyof D3ScaleMethods {\n  // d3 scale changed the naming scheme for scale from \"linear\" -> \"scaleLinear\" etc.\n  const capitalize = (s) => s && s[0].toUpperCase() + s.slice(1);\n  return `scale${capitalize(scale)}` as keyof D3ScaleMethods;\n}\n\nexport function validScale(\n  scale: string | D3Scale,\n): scale is ScaleName | D3Scale {\n  if (typeof scale === \"function\") {\n    return (\n      Helpers.isFunction(scale.copy) &&\n      Helpers.isFunction(scale.domain) &&\n      Helpers.isFunction(scale.range)\n    );\n  } else if (typeof scale === \"string\") {\n    return (supportedScaleStrings as ReadonlyArray<string>).includes(scale);\n  }\n  return false;\n}\n\nfunction isScaleDefined(props, axis: \"x\" | \"y\") {\n  if (!props.scale) {\n    return false;\n  } else if (props.scale.x || props.scale.y) {\n    return !!props.scale[axis];\n  }\n  return true;\n}\n\nfunction getScaleTypeFromProps(props, axis: \"x\" | \"y\"): string | undefined {\n  if (!isScaleDefined(props, axis)) {\n    return undefined;\n  }\n  const scale = props.scale[axis] || props.scale;\n  return typeof scale === \"string\" ? scale : getType(scale);\n}\n\nfunction getScaleFromDomain(props, axis: \"x\" | \"y\"): ScaleName | undefined {\n  let domain;\n  if (props.domain && props.domain[axis]) {\n    domain = props.domain[axis];\n  } else if (props.domain && Array.isArray(props.domain)) {\n    domain = props.domain;\n  }\n  if (!domain) {\n    return undefined;\n  }\n  return Collection.containsDates(domain) ? \"time\" : \"linear\";\n}\n\nfunction getScaleTypeFromData(props, axis): ScaleName {\n  if (!props.data) {\n    return \"linear\";\n  }\n  const accessor = Helpers.createAccessor(props[axis]);\n  const axisData = props.data.map((datum) => {\n    const processedData = isPlainObject(accessor(datum))\n      ? accessor(datum)[axis]\n      : accessor(datum);\n    return processedData !== undefined ? processedData : datum[axis];\n  });\n  return Collection.containsDates(axisData) ? \"time\" : \"linear\";\n}\n\n// Exported Functions\n\nexport function getScaleFromName(name: ScaleName | string): D3Scale {\n  if (validScale(name)) {\n    const methodName = toNewName(name as ScaleName);\n    // @ts-expect-error scaleTime is not directly compatible with our D3Scale definition\n    return d3Scale[methodName]();\n  }\n  return d3Scale.scaleLinear();\n}\n\nexport function getBaseScale(props, axis: \"x\" | \"y\") {\n  const scale = getScaleFromProps(props, axis);\n  if (scale) {\n    return typeof scale === \"string\" ? getScaleFromName(scale) : scale;\n  }\n  const defaultScale =\n    getScaleFromDomain(props, axis) || getScaleTypeFromData(props, axis);\n  return getScaleFromName(defaultScale);\n}\n\nexport function getDefaultScale() {\n  return d3Scale.scaleLinear();\n}\n\nexport function getScaleFromProps(props, axis): D3Scale | undefined {\n  if (!isScaleDefined(props, axis)) {\n    return undefined;\n  }\n  const scale = props.scale[axis] || props.scale;\n  if (validScale(scale)) {\n    return Helpers.isFunction(scale) ? scale : getScaleFromName(scale);\n  }\n  return undefined;\n}\n\nexport function getScaleType(props, axis): string {\n  // if the scale was not given in props, it will be set to linear or time depending on data\n  return (\n    getScaleTypeFromProps(props, axis) || getScaleTypeFromData(props, axis)\n  );\n}\n\n// Ordered type inference off of function fields.\n// **Note**: Brittle because reliant on d3 internals.\nconst DUCK_TYPES = [\n  { name: \"quantile\", method: \"quantiles\" },\n  { name: \"log\", method: \"base\" },\n  // TODO(2214): Re-evaluate (1) duck typing approach, and (2) if duck typing,\n  //   do we need a different approach? (Multiple keys? Stringifying functions?)\n  // https://github.com/FormidableLabs/victory/issues/2214\n  // Below are matches that don't seem to otherwise occur in Victory code base.\n  // { name: \"ordinal\", method: \"unknown\" },\n  // { name: \"pow-sqrt\", method: \"exponent\" },\n  // { name: \"quantize-threshold\", method: \"invertExtent\" }\n];\n\nexport function getType(scale) {\n  if (typeof scale === \"string\") {\n    return scale;\n  }\n\n  const scaleType = DUCK_TYPES.filter((type) => {\n    return scale[type.method] !== undefined;\n  })[0];\n\n  return scaleType ? scaleType.name : undefined;\n}\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/selection.test.ts",
    "content": "import * as d3Scale from \"victory-vendor/d3-scale\";\n\nimport * as Selection from \"./selection\";\n\ndescribe(\"helpers/selection\", () => {\n  describe(\"getBounds\", () => {\n    it(\"returns min / max bounds\", () => {\n      const x1 = 10;\n      const x2 = 5;\n      const y1 = 0;\n      const y2 = 1;\n      const scale = { x: d3Scale.scaleLinear(), y: d3Scale.scaleLinear() };\n      const props = { x1, x2, y1, y2, scale };\n      const bounds = Selection.getBounds(props);\n      expect(bounds).toEqual({ x: [x2, x1], y: [y1, y2] });\n    });\n  });\n\n  describe(\"getDomainCoordinates\", () => {\n    it(\"returns coordinates corresponding to domain min max\", () => {\n      const scale = {\n        x: d3Scale.scaleLinear(),\n        y: d3Scale.scaleLinear(),\n      };\n      const coords = Selection.getDomainCoordinates({ scale });\n      expect(coords).toEqual({ x: [0, 1], y: [0, 1] });\n    });\n  });\n\n  describe(\"getDataCoordinates\", () => {\n    it(\"returns coordinates corresponding to point x, y\", () => {\n      const scale = {\n        x: d3Scale.scaleLinear(),\n        y: d3Scale.scaleLinear(),\n      };\n      const coords = Selection.getDataCoordinates({}, scale, 1, 1);\n      expect(coords).toEqual({ x: 1, y: 1 });\n    });\n    it(\"returns polar coordinates corresponding to point x, y\", () => {\n      const scale = {\n        x: d3Scale.scaleLinear().range([0, Math.PI * 2]),\n        y: d3Scale.scaleLinear(),\n      };\n      const x = Math.PI;\n      const y = 0;\n      const coords = Selection.getDataCoordinates({ polar: true }, scale, x, y);\n      expect(coords).toEqual({ x: 0, y: Math.PI });\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/selection.ts",
    "content": "import React from \"react\";\nimport * as Collection from \"./collection\";\nimport { VictoryCommonProps } from \"./common-props\";\n\nimport type { DomainPropType, ScaleXYPropType } from \"../types/prop-types\";\n\n// Private Functions\n\nfunction transformTarget(\n  target: number,\n  matrix: DOMMatrix,\n  dimension: \"x\" | \"y\",\n) {\n  const { a, d, e, f } = matrix;\n  return dimension === \"y\" ? d * target + f : a * target + e;\n}\n\nfunction getTransformationMatrix(svg: SVGGraphicsElement): DOMMatrix {\n  return svg.getScreenCTM()!.inverse();\n}\n\ninterface ReactNativeTouchEvent extends Event {\n  identifier?: number;\n  locationX: number;\n  locationY: number;\n}\nfunction isNativeTouchEvent(\n  nativeEvent: Event | undefined,\n): nativeEvent is ReactNativeTouchEvent {\n  return !!(\n    nativeEvent &&\n    (nativeEvent as ReactNativeTouchEvent).identifier !== undefined\n  );\n}\nfunction isReactTouchEvent(evt: React.SyntheticEvent): evt is React.TouchEvent {\n  return (\n    (evt as React.TouchEvent).changedTouches &&\n    (evt as React.TouchEvent).changedTouches.length > 0\n  );\n}\n\n// Exported Functions\n\nexport function getParentSVG(\n  evt: Pick<React.SyntheticEvent, \"target\"> &\n    Partial<Pick<React.SyntheticEvent, \"nativeEvent\">>,\n): SVGElement {\n  if (isNativeTouchEvent(evt.nativeEvent)) {\n    // @ts-expect-error Seems like a superfluous check.\n    return undefined;\n  }\n  const getParent = (target) => {\n    if (target.nodeName === \"svg\") {\n      return target;\n    }\n    return target.parentNode ? getParent(target.parentNode) : target;\n  };\n  return getParent(evt.target);\n}\n\nexport function getSVGEventCoordinates(\n  evt: React.SyntheticEvent,\n  svg?: SVGElement,\n): SVGCoordinateType {\n  if (isNativeTouchEvent(evt.nativeEvent)) {\n    // react-native override. relies on the RN.View being the _exact_ same size as its child SVG.\n    // this should be fine: the svg is the only child of View and the View shirks to its children\n    return {\n      x: evt.nativeEvent.locationX,\n      y: evt.nativeEvent.locationY,\n    };\n  }\n  const location = isReactTouchEvent(evt)\n    ? evt.changedTouches[0]\n    : (evt as React.MouseEvent);\n  const matrix = getTransformationMatrix(\n    (svg as SVGGraphicsElement) || getParentSVG(location),\n  );\n  return {\n    x: transformTarget(location.clientX, matrix, \"x\"),\n    y: transformTarget(location.clientY, matrix, \"y\"),\n  };\n}\n\nexport function getDomainCoordinates(\n  props: Pick<VictoryCommonProps, \"scale\" | \"horizontal\">,\n  domain?: DomainPropType,\n) {\n  const { horizontal } = props;\n  const scale = props.scale as ScaleXYPropType;\n  // FIXME: add support for DomainTuple: [number, number]\n  const domainObj: any = domain || {\n    x: scale.x.domain(),\n    y: scale.y.domain(),\n  };\n  return {\n    x: horizontal\n      ? [scale.y(domainObj.y[0]), scale.y(domainObj.y[1])]\n      : [scale.x(domainObj.x[0]), scale.x(domainObj.x[1])],\n    y: horizontal\n      ? [scale.x(domainObj.x[0]), scale.x(domainObj.x[1])]\n      : [scale.y(domainObj.y[0]), scale.y(domainObj.y[1])],\n  };\n}\n\n// eslint-disable-next-line max-params\nexport function getDataCoordinates(\n  props: any,\n  scale: ScaleXYPropType,\n  x: number,\n  y: number,\n): SVGCoordinateType {\n  const { polar, horizontal } = props;\n  if (!polar) {\n    return {\n      x: horizontal ? scale.x.invert(y) : scale.x.invert(x),\n      y: horizontal ? scale.y.invert(x) : scale.y.invert(y),\n    };\n  }\n  const origin = props.origin || { x: 0, y: 0 };\n  const baseX = x - origin.x;\n  const baseY = y - origin.y;\n  const radius = Math.abs(baseX * Math.sqrt(1 + Math.pow(-baseY / baseX, 2)));\n  const angle = (-Math.atan2(baseY, baseX) + Math.PI * 2) % (Math.PI * 2);\n  return {\n    x: scale.x.invert(angle),\n    y: scale.y.invert(radius),\n  };\n}\n\nexport function getBounds(props: ComputedCommonProps): SVGCoordinateBounds {\n  const { x1, x2, y1, y2, scale } = props;\n  const point1 = getDataCoordinates(props, scale, x1, y1);\n  const point2 = getDataCoordinates(props, scale, x2, y2);\n  const makeBound = (a: number, b: number) => {\n    return [\n      Collection.getMinValue([a, b]) as number,\n      Collection.getMaxValue([a, b]) as number,\n    ] as const;\n  };\n  return {\n    x: makeBound(point1.x, point2.x),\n    y: makeBound(point1.y, point2.y),\n  };\n}\n\nexport type SVGCoordinateType = { x: number; y: number };\nexport type SVGCoordinateBounds = {\n  x: readonly [number, number];\n  y: readonly [number, number];\n};\n\ntype ComputedCommonProps = {\n  scale: ScaleXYPropType;\n  x1: number;\n  x2: number;\n  y1: number;\n  y2: number;\n  horizontal?: boolean;\n};\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/style.test.ts",
    "content": "import * as Style from \"./style\";\n\ndescribe(\"toTransformString\", () => {\n  it(\"returns an empty string if no transform definitions are given\", () => {\n    expect(Style.toTransformString({})).toEqual(\"\");\n  });\n\n  it(\"returns a string with two transform instructions when an object is given\", () => {\n    expect(\n      Style.toTransformString({\n        rotate: [45, 0, 1],\n        skewY: [65],\n      }),\n    ).toEqual(\"rotate(45,0,1) skewY(65)\");\n  });\n\n  it(\"returns a string with two transform instructions when two objects are given\", () => {\n    expect(\n      Style.toTransformString({ rotate: [45, 0, 1] }, { skewY: [65] }),\n    ).toEqual(\"rotate(45,0,1) skewY(65)\");\n  });\n\n  it(\"returns at least the subsequent transforms if the first is undefined\", () => {\n    expect(Style.toTransformString(undefined, { skewY: [65] })).toEqual(\n      \"skewY(65)\",\n    );\n  });\n});\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/style.ts",
    "content": "import {\n  VictoryTheme,\n  VictoryThemeDefinition,\n} from \"../victory-theme/victory-theme\";\n\n/**\n * Given an object with CSS/SVG transform definitions, return the string value\n * for use with the `transform` CSS property or SVG attribute. Note that we\n * can't always guarantee the order will match the author's intended order, so\n * authors should only use the object notation if they know that their transform\n * is commutative or that there is only one.\n * @param {Object} obj An object of transform definitions.\n * @returns {String} The generated transform string.\n */\nexport const toTransformString = function (obj, ...more) {\n  if (more.length > 0) {\n    return more\n      .reduce((memo, currentObj) => {\n        return [memo, toTransformString(currentObj)].join(\" \");\n      }, toTransformString(obj))\n      .trim();\n  }\n  if (obj === undefined || obj === null || typeof obj === \"string\") {\n    return obj;\n  }\n  const transforms = [] as string[];\n  for (const key in obj) {\n    if (obj.hasOwnProperty(key)) {\n      const value = obj[key];\n      transforms.push(`${key}(${value})`);\n    }\n  }\n  return transforms.join(\" \").trim();\n};\n\n/**\n * Given the name of a color scale, getColorScale will return an array\n * of 5 hex string values in that color scale. If no 'name' parameter\n * is given, it will return the Victory default grayscale.\n * @param {String} name The name of the color scale to return (optional).\n * @param {Object} theme The theme object to retrieve the color scale from (optional).\n * @returns {Array} An array of 5 hex string values composing a color scale.\n */\nexport function getColorScale(\n  name?: string,\n  theme: VictoryThemeDefinition = VictoryTheme.material,\n) {\n  const {\n    palette: {\n      grayscale = [\"#cccccc\", \"#969696\", \"#636363\", \"#252525\"],\n      qualitative = [],\n      heatmap = [],\n      warm = [],\n      cool = [],\n      red = [],\n      blue = [],\n      green = [],\n    } = {},\n  } = theme;\n\n  const scales: Record<string, string[]> = {\n    grayscale,\n    qualitative,\n    heatmap,\n    warm,\n    cool,\n    red,\n    blue,\n    green,\n  };\n\n  const selectedScale =\n    name && scales[name]?.length ? scales[name] : scales.grayscale;\n\n  return selectedScale;\n}\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/textsize.test.ts",
    "content": "import * as TextSize from \"./textsize\";\n\nconst approximate = (text, style?) =>\n  TextSize._approximateTextSizeInternal.impl(text, style, true);\n\nconst testString = \"ABC\";\n\ndescribe(\"victory-util/textsize\", () => {\n  describe(\"convertLengthToPixels\", () => {\n    it(\"translate pixels as number of pixels\", () => {\n      expect(TextSize.convertLengthToPixels(\"20px\")).toEqual(20);\n    });\n    it(\"translate absolute measurement length units to particular number of pixels\", () => {\n      expect(TextSize.convertLengthToPixels(\"10pt\")).toEqual(13.3);\n    });\n    it(\"translate relative measurement length units to particular number of pixels\", () => {\n      expect(TextSize.convertLengthToPixels(\"1.5em\", 16)).toEqual(24);\n    });\n  });\n\n  describe(\"approximateWidth\", () => {\n    it(\"return zero width when no style\", () => {\n      expect(approximate(testString).width).toEqual(0);\n    });\n    it(\"return correct width with signed angle\", () => {\n      expect(\n        approximate(testString, {\n          angle: -45,\n          fontSize: 14,\n        }).width.toFixed(2),\n      ).toEqual(\"31.71\");\n    });\n    it(\"return correct width with pixel fontsize\", () => {\n      expect(\n        approximate(testString, {\n          fontSize: \"14px\",\n        }).width.toFixed(2),\n      ).toEqual(\"28.74\");\n    });\n    it(\"return appropriate width with defined fontSize\", () => {\n      expect(\n        approximate(testString, {\n          fontSize: 12,\n        }).width.toFixed(2),\n      ).toEqual(\"24.64\");\n    });\n    it(\"consider font\", () => {\n      expect(\n        approximate(testString, {\n          fontSize: 16,\n        }).width.toFixed(2),\n      ).toEqual(\"32.85\");\n    });\n    it(\"consider letterSpacing\", () => {\n      expect(\n        approximate(testString, {\n          fontSize: 12,\n          letterSpacing: \"1px\",\n        }).width.toFixed(2),\n      ).toEqual(\"26.64\");\n    });\n    it(\"consider angle\", () => {\n      expect(\n        approximate(testString, {\n          fontSize: 12,\n          angle: 30,\n        }).width.toFixed(2),\n      ).toEqual(\"28.24\");\n    });\n    it(\"not consider lineHeight without angle\", () => {\n      expect(\n        approximate(testString, {\n          fontSize: 12,\n          lineHeight: 2,\n        }).width.toFixed(2),\n      ).toEqual(\"24.64\");\n    });\n    it(\"consider lineHeight with angle\", () => {\n      expect(\n        approximate(testString, {\n          fontSize: 12,\n          lineHeight: 2,\n          angle: 30,\n        }).width.toFixed(2),\n      ).toEqual(\"35.14\");\n    });\n    it(\"return width of widest string in text\", () => {\n      expect(\n        approximate(\"ABC\\nDEFGH\\nIJK\", {\n          fontSize: 12,\n        }).width.toFixed(2),\n      ).toEqual(\"41.94\");\n    });\n\n    it(\"returns width of widest string in array if array has an empty string\", () => {\n      expect(\n        approximate([\"06-14-20\", \"\"], {\n          fontSize: 12,\n        }).width.toFixed(2),\n      ).toEqual(\"47.93\");\n    });\n  });\n\n  describe(\"approximateHeight\", () => {\n    it(\"return zero width when no style\", () => {\n      expect(approximate(testString).height).toEqual(0);\n    });\n    it(\"return correct height with signed angle\", () => {\n      expect(\n        approximate(testString, {\n          angle: -45,\n          fontSize: 14,\n        }).height.toFixed(2),\n      ).toEqual(\"33.29\");\n    });\n    it(\"return correct height with pixel fontsize\", () => {\n      expect(\n        approximate(testString, {\n          fontSize: \"14px\",\n        }).height.toFixed(2),\n      ).toEqual(\"16.90\");\n    });\n    it(\"return appropriate height with expected precision\", () => {\n      expect(\n        approximate(testString, {\n          fontSize: 12,\n        }).height.toFixed(2),\n      ).toEqual(\"14.49\");\n    });\n    it(\"consider font\", () => {\n      expect(\n        approximate(testString, {\n          fontSize: 16,\n        }).height.toFixed(2),\n      ).toEqual(\"19.32\");\n    });\n    it(\"consider angle\", () => {\n      expect(\n        approximate(testString, {\n          fontSize: 12,\n          angle: 30,\n        }).height.toFixed(2),\n      ).toEqual(\"25.48\");\n    });\n    it(\"not consider letterSpacing without angle\", () => {\n      expect(\n        approximate(testString, {\n          fontSize: 12,\n          letterSpacing: \"1px\",\n        }).height.toFixed(2),\n      ).toEqual(\"14.49\");\n    });\n    it(\"consider letterSpacing with angle\", () => {\n      expect(\n        approximate(testString, {\n          fontSize: 12,\n          angle: 30,\n          letterSpacing: \"1px\",\n        }).height.toFixed(2),\n      ).toEqual(\"26.53\");\n    });\n    it(\"consider lineHeight\", () => {\n      expect(\n        approximate(testString, {\n          fontSize: 12,\n          lineHeight: 2,\n        }).height.toFixed(2),\n      ).toEqual(\"28.98\");\n    });\n    it(\"consider multiLines text\", () => {\n      expect(\n        approximate(`ABC\\n${\"DBCDEFG\"}\\n123`, {\n          fontSize: 12,\n        }).height.toFixed(2),\n      ).toEqual(\"43.47\");\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/textsize.ts",
    "content": "// http://www.pearsonified.com/2012/01/characters-per-line.php\n/* eslint-disable no-magic-numbers */\nimport defaults from \"lodash/defaults\";\nimport memoize from \"lodash/memoize\";\n\n// Based on measuring specific character widths\n// as in the following example https://bl.ocks.org/tophtucker/62f93a4658387bb61e4510c37e2e97cf\n// For new fonts: pull gist, open index.html locally, add font files (if not generic), enter font name in `font-family` input\n// prettier-ignore\nconst fonts = {\n  \"American Typewriter\": {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.25,0.4203125,0.3296875,0.6,0.6375,0.8015625,0.8203125,0.1875,0.45625,0.45625,0.6375,0.5,0.2734375,0.309375,0.2734375,0.4390625,0.6375,0.6375,0.6375,0.6375,0.6375,0.6375,0.6375,0.6375,0.6375,0.6375,0.2734375,0.2734375,0.5,0.5,0.5,0.6,0.6921875,0.7640625,0.6921875,0.6375,0.728125,0.6734375,0.6203125,0.7109375,0.784375,0.3828125,0.6421875,0.7859375,0.6375,0.9484375,0.7640625,0.65625,0.6375,0.65625,0.7296875,0.6203125,0.6375,0.7109375,0.740625,0.940625,0.784375,0.7578125,0.6203125,0.4375,0.5,0.4375,0.5,0.5,0.4921875,0.5734375,0.5890625,0.5109375,0.6,0.528125,0.43125,0.5578125,0.6375,0.3109375,0.40625,0.6234375,0.309375,0.928125,0.6375,0.546875,0.6,0.58125,0.4921875,0.4921875,0.4,0.6203125,0.625,0.825,0.6375,0.640625,0.528125,0.5,0.5,0.5,0.6671875],\n    avg: 0.5793421052631578\n  },\n  Arial: {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.278125,0.278125,0.35625,0.55625,0.55625,0.890625,0.6671875,0.1921875,0.334375,0.334375,0.390625,0.584375,0.278125,0.334375,0.278125,0.278125,0.55625,0.55625,0.55625,0.55625,0.55625,0.55625,0.55625,0.55625,0.55625,0.55625,0.278125,0.278125,0.584375,0.584375,0.584375,0.55625,1.015625,0.6703125,0.6671875,0.7234375,0.7234375,0.6671875,0.6109375,0.778125,0.7234375,0.278125,0.5,0.6671875,0.55625,0.834375,0.7234375,0.778125,0.6671875,0.778125,0.7234375,0.6671875,0.6109375,0.7234375,0.6671875,0.9453125,0.6671875,0.6671875,0.6109375,0.278125,0.278125,0.278125,0.4703125,0.584375,0.334375,0.55625,0.55625,0.5,0.55625,0.55625,0.3125,0.55625,0.55625,0.2234375,0.2703125,0.5,0.2234375,0.834375,0.55625,0.55625,0.55625,0.55625,0.346875,0.5,0.278125,0.55625,0.5,0.7234375,0.5,0.5,0.5,0.334375,0.2609375,0.334375,0.584375],\n    avg: 0.528733552631579\n  },\n  \"Arial Black\": {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.33125,0.334375,0.5,0.6609375,0.6671875,1,0.890625,0.278125,0.390625,0.390625,0.55625,0.6609375,0.334375,0.334375,0.334375,0.28125,0.6671875,0.6671875,0.6671875,0.6671875,0.6671875,0.6671875,0.6671875,0.6671875,0.6671875,0.6671875,0.334375,0.334375,0.6609375,0.6609375,0.6609375,0.6109375,0.7453125,0.78125,0.778125,0.778125,0.778125,0.7234375,0.6671875,0.834375,0.834375,0.390625,0.6671875,0.834375,0.6671875,0.9453125,0.834375,0.834375,0.7234375,0.834375,0.78125,0.7234375,0.7234375,0.834375,0.7796875,1.003125,0.78125,0.78125,0.7234375,0.390625,0.28125,0.390625,0.6609375,0.5125,0.334375,0.6671875,0.6671875,0.6671875,0.6671875,0.6671875,0.41875,0.6671875,0.6671875,0.334375,0.384375,0.6671875,0.334375,1,0.6671875,0.6671875,0.6671875,0.6671875,0.4703125,0.6109375,0.4453125,0.6671875,0.6140625,0.946875,0.6671875,0.615625,0.55625,0.390625,0.278125,0.390625,0.6609375],\n    avg: 0.6213157894736842\n  },\n  Baskerville: {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.25,0.25,0.40625,0.6671875,0.490625,0.875,0.7015625,0.178125,0.2453125,0.246875,0.4171875,0.6671875,0.25,0.3125,0.25,0.521875,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.25,0.25,0.6671875,0.6671875,0.6671875,0.396875,0.9171875,0.684375,0.615625,0.71875,0.7609375,0.625,0.553125,0.771875,0.803125,0.3546875,0.515625,0.78125,0.6046875,0.928125,0.75,0.8234375,0.5625,0.96875,0.7296875,0.5421875,0.6984375,0.771875,0.7296875,0.9484375,0.771875,0.678125,0.6359375,0.3640625,0.521875,0.3640625,0.46875,0.5125,0.334375,0.46875,0.521875,0.428125,0.521875,0.4375,0.3890625,0.4765625,0.53125,0.25,0.359375,0.4640625,0.240625,0.803125,0.53125,0.5,0.521875,0.521875,0.365625,0.334375,0.2921875,0.521875,0.4640625,0.678125,0.4796875,0.465625,0.428125,0.4796875,0.5109375,0.4796875,0.6671875],\n    avg: 0.5323519736842108\n  },\n  Courier: {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.5984375,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6078125,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.61875,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.615625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6140625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625],\n    avg: 0.6020559210526316\n  },\n  \"Courier New\": {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.5984375,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625],\n    avg: 0.6015296052631579\n  },\n  cursive: {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.1921875,0.24375,0.40625,0.5671875,0.3984375,0.721875,0.909375,0.2328125,0.434375,0.365625,0.4734375,0.5578125,0.19375,0.3484375,0.19375,0.7734375,0.503125,0.4171875,0.5453125,0.45,0.6046875,0.4703125,0.5984375,0.55625,0.503125,0.5546875,0.20625,0.2,0.5625,0.5546875,0.546875,0.403125,0.70625,0.734375,0.7078125,0.64375,0.85,0.753125,0.75,0.6484375,1.0765625,0.44375,0.5359375,0.8359375,0.653125,1.0109375,1.1515625,0.6796875,0.6984375,1.0625,0.8234375,0.5125,0.9234375,0.8546875,0.70625,0.9109375,0.7421875,0.715625,0.6015625,0.4640625,0.3359375,0.4109375,0.5421875,0.5421875,0.4328125,0.5125,0.5,0.3859375,0.7375,0.359375,0.75625,0.540625,0.5328125,0.3203125,0.5296875,0.5015625,0.484375,0.7890625,0.5640625,0.4203125,0.703125,0.471875,0.4734375,0.35,0.4125,0.5640625,0.471875,0.6484375,0.5296875,0.575,0.4140625,0.415625,0.20625,0.3796875,0.5421875],\n    avg: 0.5604440789473684\n  },\n  fantasy: {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.215625,0.2625,0.3265625,0.6109375,0.534375,0.7625,0.7828125,0.2,0.4359375,0.4359375,0.3765625,0.5109375,0.2796875,0.4609375,0.2796875,0.5296875,0.6640625,0.253125,0.521875,0.4765625,0.6640625,0.490625,0.528125,0.5546875,0.496875,0.5421875,0.2796875,0.2796875,0.5625,0.4609375,0.5625,0.4828125,0.609375,0.740625,0.7234375,0.740625,0.8265625,0.7234375,0.6171875,0.7359375,0.765625,0.240625,0.5453125,0.715625,0.6078125,0.8640625,0.653125,0.9125,0.6484375,0.946875,0.6921875,0.653125,0.6953125,0.8015625,0.58125,0.784375,0.671875,0.6265625,0.690625,0.4359375,0.5296875,0.4359375,0.53125,0.5,0.2875,0.5375,0.603125,0.4984375,0.60625,0.53125,0.434375,0.6421875,0.56875,0.209375,0.4671875,0.5484375,0.2203125,0.709375,0.55,0.5984375,0.6140625,0.5765625,0.40625,0.4734375,0.3734375,0.559375,0.4421875,0.6421875,0.4890625,0.578125,0.4484375,0.2546875,0.2203125,0.2546875,0.55],\n    avg: 0.536496710526316\n  },\n  Geneva: {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.3328125,0.3046875,0.5,0.6671875,0.6671875,0.90625,0.728125,0.3046875,0.446875,0.446875,0.5078125,0.6671875,0.3046875,0.3796875,0.3046875,0.5390625,0.6671875,0.6671875,0.6671875,0.6671875,0.6671875,0.6671875,0.6671875,0.6671875,0.6671875,0.6671875,0.3046875,0.3046875,0.6671875,0.6671875,0.6671875,0.56875,0.871875,0.728125,0.6375,0.6515625,0.7015625,0.5765625,0.5546875,0.675,0.690625,0.2421875,0.4921875,0.6640625,0.584375,0.7890625,0.709375,0.7359375,0.584375,0.78125,0.60625,0.60625,0.640625,0.6671875,0.728125,0.946875,0.6109375,0.6109375,0.5765625,0.446875,0.5390625,0.446875,0.6671875,0.6671875,0.5921875,0.5546875,0.6109375,0.546875,0.603125,0.5765625,0.390625,0.6109375,0.584375,0.2359375,0.334375,0.5390625,0.2359375,0.8953125,0.584375,0.60625,0.603125,0.603125,0.3875,0.509375,0.44375,0.584375,0.565625,0.78125,0.53125,0.571875,0.5546875,0.4515625,0.246875,0.4515625,0.6671875],\n    avg: 0.5762664473684211\n  },\n  Georgia: {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.2421875,0.33125,0.4125,0.64375,0.6109375,0.81875,0.7109375,0.215625,0.375,0.375,0.4734375,0.64375,0.2703125,0.375,0.2703125,0.46875,0.6140625,0.4296875,0.559375,0.553125,0.565625,0.5296875,0.5671875,0.503125,0.596875,0.5671875,0.3125,0.3125,0.64375,0.64375,0.64375,0.4796875,0.9296875,0.715625,0.6546875,0.6421875,0.75,0.6546875,0.6,0.7265625,0.815625,0.390625,0.51875,0.7203125,0.6046875,0.928125,0.7671875,0.7453125,0.6109375,0.7453125,0.7234375,0.5625,0.61875,0.7578125,0.70625,0.99375,0.7125,0.6640625,0.6015625,0.375,0.46875,0.375,0.64375,0.65,0.5,0.5046875,0.56875,0.4546875,0.575,0.484375,0.39375,0.509375,0.5828125,0.29375,0.3671875,0.546875,0.2875,0.88125,0.5921875,0.5390625,0.571875,0.5640625,0.4109375,0.4328125,0.3453125,0.5765625,0.5203125,0.75625,0.50625,0.5171875,0.4453125,0.43125,0.375,0.43125,0.64375],\n    avg: 0.5551809210526316\n  },\n  \"Gill Sans\": {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.2765625,0.271875,0.3546875,0.584375,0.5421875,0.6765625,0.625,0.1890625,0.3234375,0.3234375,0.4171875,0.584375,0.2203125,0.3234375,0.2203125,0.28125,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.2203125,0.2296875,0.584375,0.584375,0.584375,0.334375,1.0109375,0.6671875,0.5640625,0.709375,0.75,0.5,0.4703125,0.740625,0.7296875,0.25,0.3125,0.65625,0.490625,0.78125,0.78125,0.8234375,0.5109375,0.8234375,0.6046875,0.459375,0.6046875,0.709375,0.6046875,1.0421875,0.709375,0.6046875,0.646875,0.334375,0.28125,0.334375,0.4703125,0.5828125,0.334375,0.428125,0.5,0.4390625,0.5109375,0.4796875,0.296875,0.428125,0.5,0.2203125,0.2265625,0.5,0.2203125,0.771875,0.5,0.553125,0.5,0.5,0.3984375,0.3859375,0.334375,0.5,0.4390625,0.7203125,0.5,0.4390625,0.4171875,0.334375,0.2609375,0.334375,0.584375],\n    avg: 0.4933717105263159\n  },\n  Helvetica: {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.2796875,0.2765625,0.3546875,0.5546875,0.5546875,0.8890625,0.665625,0.190625,0.3328125,0.3328125,0.3890625,0.5828125,0.2765625,0.3328125,0.2765625,0.3015625,0.5546875,0.5546875,0.5546875,0.5546875,0.5546875,0.5546875,0.5546875,0.5546875,0.5546875,0.5546875,0.2765625,0.2765625,0.584375,0.5828125,0.584375,0.5546875,1.0140625,0.665625,0.665625,0.721875,0.721875,0.665625,0.609375,0.7765625,0.721875,0.2765625,0.5,0.665625,0.5546875,0.8328125,0.721875,0.7765625,0.665625,0.7765625,0.721875,0.665625,0.609375,0.721875,0.665625,0.94375,0.665625,0.665625,0.609375,0.2765625,0.3546875,0.2765625,0.4765625,0.5546875,0.3328125,0.5546875,0.5546875,0.5,0.5546875,0.5546875,0.2765625,0.5546875,0.5546875,0.221875,0.240625,0.5,0.221875,0.8328125,0.5546875,0.5546875,0.5546875,0.5546875,0.3328125,0.5,0.2765625,0.5546875,0.5,0.721875,0.5,0.5,0.5,0.3546875,0.259375,0.353125,0.5890625],\n    avg: 0.5279276315789471\n  },\n  \"Helvetica Neue\": {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.278125,0.259375,0.4265625,0.55625,0.55625,1,0.6453125,0.278125,0.2703125,0.26875,0.353125,0.6,0.278125,0.3890625,0.278125,0.36875,0.55625,0.55625,0.55625,0.55625,0.55625,0.55625,0.55625,0.55625,0.55625,0.55625,0.278125,0.278125,0.6,0.6,0.6,0.55625,0.8,0.6625,0.6859375,0.7234375,0.7046875,0.6125,0.575,0.759375,0.7234375,0.259375,0.5203125,0.6703125,0.55625,0.871875,0.7234375,0.7609375,0.6484375,0.7609375,0.6859375,0.6484375,0.575,0.7234375,0.6140625,0.9265625,0.6125,0.6484375,0.6125,0.259375,0.36875,0.259375,0.6,0.5,0.25625,0.5375,0.59375,0.5375,0.59375,0.5375,0.2984375,0.575,0.55625,0.2234375,0.2375,0.5203125,0.2234375,0.853125,0.55625,0.575,0.59375,0.59375,0.334375,0.5,0.315625,0.55625,0.5,0.759375,0.51875,0.5,0.48125,0.334375,0.2234375,0.334375,0.6],\n    avg: 0.5279440789473684\n  },\n  \"Hoefler Text\": {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.2359375,0.2234375,0.3921875,0.7125,0.49375,0.8859375,0.771875,0.2125,0.3078125,0.309375,0.375,0.4234375,0.234375,0.3125,0.234375,0.3,0.5828125,0.365625,0.434375,0.3921875,0.5234375,0.3984375,0.5125,0.4328125,0.46875,0.5125,0.234375,0.234375,0.515625,0.4234375,0.515625,0.340625,0.7609375,0.7359375,0.6359375,0.721875,0.8125,0.6375,0.5875,0.8078125,0.853125,0.4296875,0.503125,0.78125,0.609375,0.9609375,0.8515625,0.8140625,0.6125,0.8140625,0.71875,0.49375,0.7125,0.76875,0.771875,1.125,0.7765625,0.7734375,0.65625,0.321875,0.3078125,0.321875,0.3546875,0.5,0.3375,0.446875,0.5359375,0.45,0.5296875,0.4546875,0.425,0.4921875,0.54375,0.2671875,0.240625,0.5390625,0.25,0.815625,0.5375,0.5234375,0.5390625,0.5421875,0.365625,0.36875,0.35625,0.5171875,0.5015625,0.75,0.5,0.509375,0.44375,0.2421875,0.14375,0.2421875,0.35],\n    avg: 0.5116447368421051\n  },\n  \"Inter\": {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.2796875,0.2890625,0.4671875,0.634375,0.6421875,0.9828125,0.6453125,0.3,0.365625,0.365625,0.5015625,0.6625,0.2890625,0.4609375,0.2890625,0.3609375,0.63125,0.4078125,0.6109375,0.61875,0.646875,0.59375,0.6203125,0.5671875,0.61875,0.6203125,0.2890625,0.303125,0.6625,0.6625,0.6625,0.5125,0.9671875,0.690625,0.6546875,0.73125,0.721875,0.6015625,0.590625,0.746875,0.74375,0.26875,0.571875,0.671875,0.565625,0.9046875,0.7546875,0.765625,0.6390625,0.765625,0.64375,0.6421875,0.646875,0.7453125,0.690625,0.9859375,0.6828125,0.6796875,0.6296875,0.365625,0.3609375,0.365625,0.471875,0.45625,0.3234375,0.5625,0.6125,0.571875,0.6125,0.584375,0.3703125,0.6140625,0.5921875,0.2421875,0.2548828125,0.55,0.2421875,0.8765625,0.5921875,0.6,0.6125,0.6125,0.3765625,0.528125,0.328125,0.5921875,0.5625,0.81875,0.546875,0.5625,0.553125,0.4265625,0.3328125,0.4265625,0.6625],\n    avg: 0.5624362664473683\n  },\n  \"Montserrat\": {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.2625,0.2609375,0.3734375,0.696875,0.615625,0.8296875,0.6703125,0.203125,0.3296875,0.3296875,0.3875,0.575,0.2125,0.3828125,0.2125,0.3953125,0.6625,0.3625,0.56875,0.5640625,0.6625,0.5671875,0.609375,0.5890625,0.6390625,0.609375,0.2125,0.2125,0.575,0.575,0.575,0.5671875,1.034375,0.7171875,0.7546875,0.7203125,0.8265625,0.6703125,0.634375,0.7734375,0.8140625,0.303125,0.5078125,0.7125,0.5890625,0.95625,0.8140625,0.8390625,0.71875,0.8390625,0.7234375,0.615625,0.575,0.7921875,0.6984375,1.1125,0.65625,0.6359375,0.6515625,0.31875,0.396875,0.31875,0.5765625,0.5,0.6,0.590625,0.678125,0.5640625,0.678125,0.6046875,0.375,0.6875,0.678125,0.2703125,0.365625,0.6015625,0.2703125,1.0625,0.678125,0.628125,0.678125,0.678125,0.4015625,0.4890625,0.40625,0.6734375,0.5421875,0.8796875,0.534375,0.5671875,0.5125,0.334375,0.2953125,0.334375,0.575],\n    avg: 0.571792763157895\n  },\n  monospace: {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.5984375,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6078125,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.61875,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.615625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6140625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625,0.6015625],\n    avg: 0.6020559210526316\n  },\n  Overpass: {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.2296875,0.2765625,0.4203125,0.68125,0.584375,0.8515625,0.7015625,0.2203125,0.3453125,0.3453125,0.53125,0.63125,0.2234375,0.3953125,0.2234375,0.509375,0.65,0.4046875,0.6171875,0.60625,0.6484375,0.60625,0.6015625,0.5375,0.615625,0.6015625,0.2234375,0.2234375,0.63125,0.63125,0.63125,0.5015625,0.8203125,0.696875,0.6671875,0.65,0.6859375,0.6015625,0.559375,0.690625,0.7078125,0.2953125,0.565625,0.678125,0.58125,0.8046875,0.7109375,0.740625,0.6421875,0.740625,0.6765625,0.6046875,0.590625,0.696875,0.6640625,0.853125,0.65,0.6671875,0.6625,0.3734375,0.509375,0.3734375,0.63125,0.5125,0.4,0.5328125,0.5625,0.51875,0.5625,0.546875,0.3359375,0.5625,0.565625,0.25625,0.3203125,0.55,0.265625,0.85,0.565625,0.5671875,0.5625,0.5625,0.4046875,0.4765625,0.3796875,0.565625,0.521875,0.7265625,0.53125,0.5390625,0.5125,0.3671875,0.275,0.3671875,0.63125],\n    avg: 0.5430756578947369\n  },\n  Palatino: {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.25,0.278125,0.371875,0.60625,0.5,0.840625,0.778125,0.209375,0.334375,0.334375,0.390625,0.60625,0.2578125,0.334375,0.25,0.60625,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.25,0.25,0.60625,0.60625,0.60625,0.4453125,0.7484375,0.778125,0.6109375,0.709375,0.775,0.6109375,0.55625,0.7640625,0.8328125,0.3375,0.346875,0.7265625,0.6109375,0.946875,0.83125,0.7875,0.6046875,0.7875,0.66875,0.525,0.6140625,0.778125,0.7234375,1,0.6671875,0.6671875,0.6671875,0.334375,0.60625,0.334375,0.60625,0.5,0.334375,0.5,0.565625,0.4453125,0.6109375,0.4796875,0.340625,0.55625,0.5828125,0.2921875,0.2671875,0.5640625,0.2921875,0.8828125,0.5828125,0.546875,0.6015625,0.5609375,0.3953125,0.425,0.3265625,0.603125,0.565625,0.834375,0.5171875,0.55625,0.5,0.334375,0.60625,0.334375,0.60625],\n    avg: 0.5408552631578947\n  },\n  \"RedHatText\": {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.2328125,0.2203125,0.35625,0.6890625,0.55,0.7390625,0.6703125,0.2140625,0.4015625,0.4015625,0.4546875,0.53125,0.2203125,0.45625,0.2203125,0.515625,0.6609375,0.3078125,0.5484375,0.5875,0.61875,0.5703125,0.6203125,0.559375,0.6140625,0.6203125,0.2203125,0.2234375,0.465625,0.534375,0.465625,0.5125,0.7671875,0.6609375,0.6703125,0.7265625,0.728125,0.6203125,0.6109375,0.8,0.73125,0.253125,0.6,0.6125,0.6078125,0.8625,0.7390625,0.8109375,0.6546875,0.809375,0.6484375,0.6234375,0.6171875,0.7125,0.6609375,0.8984375,0.6546875,0.646875,0.60625,0.3625,0.5203125,0.3625,0.540625,0.4609375,0.5234375,0.5265625,0.584375,0.509375,0.5828125,0.5578125,0.3703125,0.5828125,0.553125,0.2234375,0.24375,0.4890625,0.2234375,0.8453125,0.553125,0.58125,0.584375,0.5828125,0.353125,0.453125,0.378125,0.553125,0.5015625,0.6984375,0.4875,0.4984375,0.459375,0.3953125,0.2921875,0.3953125,0.58125],\n    avg: 0.5341940789473685\n  },\n  \"sans-serif\": {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.278125,0.278125,0.35625,0.55625,0.55625,0.890625,0.6671875,0.1921875,0.334375,0.334375,0.390625,0.584375,0.278125,0.334375,0.278125,0.303125,0.55625,0.55625,0.55625,0.55625,0.55625,0.55625,0.55625,0.55625,0.55625,0.55625,0.278125,0.278125,0.5859375,0.584375,0.5859375,0.55625,1.015625,0.6671875,0.6671875,0.7234375,0.7234375,0.6671875,0.6109375,0.778125,0.7234375,0.278125,0.5,0.6671875,0.55625,0.834375,0.7234375,0.778125,0.6671875,0.778125,0.7234375,0.6671875,0.6109375,0.7234375,0.6671875,0.9453125,0.6671875,0.6671875,0.6109375,0.278125,0.35625,0.278125,0.478125,0.55625,0.334375,0.55625,0.55625,0.5,0.55625,0.55625,0.278125,0.55625,0.55625,0.2234375,0.2421875,0.5,0.2234375,0.834375,0.55625,0.55625,0.55625,0.55625,0.334375,0.5,0.278125,0.55625,0.5,0.7234375,0.5,0.5,0.5,0.35625,0.2609375,0.3546875,0.590625],\n    avg: 0.5293256578947368\n  },\n  Seravek: {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.215625,0.296875,0.4171875,0.6734375,0.4953125,0.9125,0.740625,0.2421875,0.3375,0.3375,0.409375,0.60625,0.2609375,0.35625,0.25625,0.41875,0.5921875,0.3515625,0.475,0.4875,0.5375,0.509375,0.5484375,0.4546875,0.5421875,0.5484375,0.25625,0.2546875,0.5875,0.6171875,0.5875,0.4578125,0.8140625,0.6765625,0.5703125,0.6109375,0.684375,0.5109375,0.4953125,0.678125,0.6859375,0.2625,0.2625,0.5859375,0.4734375,0.846875,0.709375,0.740625,0.509375,0.740625,0.584375,0.5015625,0.528125,0.675,0.5953125,0.9453125,0.596875,0.540625,0.540625,0.359375,0.4203125,0.359375,0.5109375,0.421875,0.4046875,0.5015625,0.5421875,0.446875,0.5453125,0.484375,0.38125,0.5140625,0.5546875,0.240625,0.2640625,0.490625,0.2765625,0.8625,0.5546875,0.546875,0.5453125,0.5453125,0.3625,0.41875,0.3890625,0.5453125,0.4703125,0.7546875,0.4921875,0.4609375,0.453125,0.4015625,0.2640625,0.4015625,0.58125],\n    avg: 0.5044078947368421\n  },\n  serif: {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.2484375,0.334375,0.409375,0.5,0.5,0.834375,0.778125,0.18125,0.334375,0.334375,0.5,0.5640625,0.25,0.334375,0.25,0.278125,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.278125,0.278125,0.5640625,0.5640625,0.5640625,0.4453125,0.921875,0.7234375,0.6671875,0.6671875,0.7234375,0.6109375,0.55625,0.7234375,0.7234375,0.334375,0.390625,0.7234375,0.6109375,0.890625,0.7234375,0.7234375,0.55625,0.7234375,0.6671875,0.55625,0.6109375,0.7234375,0.7234375,0.9453125,0.7234375,0.7234375,0.6109375,0.334375,0.340625,0.334375,0.4703125,0.5,0.3453125,0.4453125,0.5,0.4453125,0.5,0.4453125,0.3828125,0.5,0.5,0.278125,0.3359375,0.5,0.278125,0.778125,0.5,0.5,0.5,0.5,0.3375,0.390625,0.2796875,0.5,0.5,0.7234375,0.5,0.5,0.4453125,0.48125,0.2015625,0.48125,0.5421875],\n    avg: 0.5126315789473684\n  },\n  Tahoma: {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.3109375,0.3328125,0.4015625,0.728125,0.546875,0.9765625,0.70625,0.2109375,0.3828125,0.3828125,0.546875,0.728125,0.303125,0.3640625,0.303125,0.3953125,0.546875,0.546875,0.546875,0.546875,0.546875,0.546875,0.546875,0.546875,0.546875,0.546875,0.3546875,0.3546875,0.728125,0.728125,0.728125,0.475,0.909375,0.6109375,0.590625,0.6015625,0.6796875,0.5625,0.521875,0.66875,0.6765625,0.3734375,0.4171875,0.6046875,0.4984375,0.771875,0.66875,0.7078125,0.5515625,0.7078125,0.6375,0.5578125,0.5875,0.65625,0.60625,0.903125,0.58125,0.5890625,0.559375,0.3828125,0.39375,0.3828125,0.728125,0.5625,0.546875,0.525,0.553125,0.4625,0.553125,0.5265625,0.3546875,0.553125,0.5578125,0.2296875,0.328125,0.51875,0.2296875,0.840625,0.5578125,0.54375,0.553125,0.553125,0.3609375,0.446875,0.3359375,0.5578125,0.4984375,0.7421875,0.4953125,0.4984375,0.4453125,0.48125,0.3828125,0.48125,0.728125],\n    avg: 0.5384374999999998\n  },\n  \"Times New Roman\": {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.2484375,0.334375,0.409375,0.5,0.5,0.834375,0.778125,0.18125,0.334375,0.334375,0.5,0.5640625,0.25,0.334375,0.25,0.28125,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.278125,0.278125,0.5640625,0.5640625,0.5640625,0.4453125,0.921875,0.7234375,0.6671875,0.6671875,0.7234375,0.6109375,0.55625,0.7234375,0.7234375,0.334375,0.390625,0.73125,0.6109375,0.890625,0.7375,0.7234375,0.55625,0.7234375,0.6765625,0.55625,0.6109375,0.7234375,0.7234375,0.9453125,0.7234375,0.7234375,0.6109375,0.334375,0.28125,0.334375,0.4703125,0.51875,0.334375,0.4453125,0.503125,0.4453125,0.503125,0.4453125,0.4359375,0.5,0.5,0.278125,0.35625,0.50625,0.278125,0.778125,0.5,0.5,0.5046875,0.5,0.340625,0.390625,0.2796875,0.5,0.5,0.7234375,0.5,0.5,0.4453125,0.48125,0.2015625,0.48125,0.5421875],\n    avg: 0.5134375\n  },\n  \"Trebuchet MS\": {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.3015625,0.3671875,0.325,0.53125,0.525,0.6015625,0.70625,0.1609375,0.3671875,0.3671875,0.3671875,0.525,0.3671875,0.3671875,0.3671875,0.525,0.525,0.525,0.525,0.525,0.525,0.525,0.525,0.525,0.525,0.525,0.3671875,0.3671875,0.525,0.525,0.525,0.3671875,0.771875,0.590625,0.5671875,0.5984375,0.6140625,0.5359375,0.525,0.6765625,0.6546875,0.2796875,0.4765625,0.5765625,0.5078125,0.7109375,0.6390625,0.675,0.5578125,0.7421875,0.5828125,0.48125,0.58125,0.6484375,0.5875,0.853125,0.5578125,0.5703125,0.5515625,0.3671875,0.3578125,0.3671875,0.525,0.53125,0.525,0.5265625,0.5578125,0.4953125,0.5578125,0.546875,0.375,0.503125,0.546875,0.2859375,0.3671875,0.5046875,0.2953125,0.83125,0.546875,0.5375,0.5578125,0.5578125,0.3890625,0.40625,0.396875,0.546875,0.490625,0.7453125,0.5015625,0.49375,0.475,0.3671875,0.525,0.3671875,0.525],\n    avg: 0.5085197368421052\n  },\n  Verdana: {\n    widths: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.35,0.39375,0.459375,0.81875,0.6359375,1.0765625,0.759375,0.26875,0.4546875,0.4546875,0.6359375,0.81875,0.3640625,0.4546875,0.3640625,0.4703125,0.6359375,0.6359375,0.6359375,0.6359375,0.6359375,0.6359375,0.6359375,0.6359375,0.6359375,0.6359375,0.4546875,0.4546875,0.81875,0.81875,0.81875,0.546875,1,0.684375,0.6859375,0.6984375,0.771875,0.6328125,0.575,0.7765625,0.7515625,0.421875,0.4546875,0.69375,0.5578125,0.84375,0.7484375,0.7875,0.603125,0.7875,0.7,0.684375,0.6171875,0.7328125,0.684375,0.9890625,0.6859375,0.615625,0.6859375,0.4546875,0.46875,0.4546875,0.81875,0.6421875,0.6359375,0.6015625,0.6234375,0.521875,0.6234375,0.596875,0.384375,0.6234375,0.6328125,0.275,0.3765625,0.5921875,0.275,0.9734375,0.6328125,0.6078125,0.6234375,0.6234375,0.43125,0.521875,0.3953125,0.6328125,0.5921875,0.81875,0.5921875,0.5921875,0.5265625,0.6359375,0.4546875,0.6359375,0.81875],\n    avg: 0.6171875000000003\n  }\n}\n\n// https://developer.mozilla.org/en/docs/Web/CSS/length\n// Absolute sizes in pixels for obsolete measurement units.\nconst absoluteMeasurementUnitsToPixels = {\n  mm: 3.8,\n  sm: 38,\n  pt: 1.33,\n  pc: 16,\n  in: 96,\n  px: 1,\n};\nconst relativeMeasurementUnitsCoef = {\n  em: 1,\n  ex: 0.5,\n};\n\nconst coefficients = {\n  heightOverlapCoef: 1.05, // Coefficient for height value to prevent overlap.\n  lineCapitalCoef: 1.15, // Coefficient for height value. Reserve space for capital chars.\n};\nconst defaultStyle = {\n  lineHeight: 1,\n  letterSpacing: \"0px\",\n  fontSize: 0,\n  angle: 0,\n  fontFamily: \"\",\n};\n\nconst _degreeToRadian = (angle) => (angle * Math.PI) / 180;\n\nconst _getFontData = (fontFamily) => {\n  const possibleFonts = fontFamily.split(\",\").map((f) => f.replace(/'|\"/g, \"\"));\n  const fontMatch = possibleFonts.find((f) => fonts[f]) || \"Helvetica\";\n  return fonts[fontMatch];\n};\n\nconst _splitToLines = (text: string | string[]) => {\n  return Array.isArray(text) ? text : text.toString().split(/\\r\\n|\\r|\\n/g);\n};\n\nconst _getSizeWithRotate = (axisSize, dependentSize, angle) => {\n  const angleInRadian = _degreeToRadian(angle);\n  return (\n    Math.abs(Math.cos(angleInRadian) * axisSize) +\n    Math.abs(Math.sin(angleInRadian) * dependentSize)\n  );\n};\n\n/**\n * Convert length-type parameters from specific measurement units to pixels\n * @param  {string} length Css length string value.\n * @param  {number} fontSize Current text font-size.\n * @returns {number} Approximate Css length in pixels.\n */\nexport const convertLengthToPixels = (\n  length: string,\n  fontSize?: number,\n): number => {\n  const attribute = length.match(/[a-zA-Z%]+/)?.[0];\n  const value = Number(length.match(/[0-9.,]+/));\n  let result;\n  if (!attribute) {\n    result = value || 0;\n  } else if (absoluteMeasurementUnitsToPixels.hasOwnProperty(attribute)) {\n    result = value * absoluteMeasurementUnitsToPixels[attribute];\n  } else if (relativeMeasurementUnitsCoef.hasOwnProperty(attribute)) {\n    result =\n      (fontSize ? value * fontSize : value * defaultStyle.fontSize) *\n      relativeMeasurementUnitsCoef[attribute];\n  } else {\n    result = value;\n  }\n  return result;\n};\n\nconst _prepareParams = (inputStyle, index) => {\n  const lineStyle = Array.isArray(inputStyle) ? inputStyle[index] : inputStyle;\n  const style = defaults({}, lineStyle, defaultStyle);\n  return Object.assign({}, style, {\n    fontFamily: style.fontFamily,\n    letterSpacing:\n      typeof style.letterSpacing === \"number\"\n        ? style.letterSpacing\n        : convertLengthToPixels(String(style.letterSpacing), style.fontSize),\n    fontSize:\n      typeof style.fontSize === \"number\"\n        ? style.fontSize\n        : convertLengthToPixels(String(style.fontSize)),\n  });\n};\n\nconst _approximateTextWidthInternal = (text: string | string[], style) => {\n  if (text === undefined || text === \"\" || text === null) {\n    return 0;\n  }\n\n  const widths = _splitToLines(text).map((line, index) => {\n    const len = line.toString().length;\n    const { fontSize, letterSpacing, fontFamily } = _prepareParams(\n      style,\n      index,\n    );\n    const fontData = _getFontData(fontFamily);\n    const width =\n      line\n        .toString()\n        .split(\"\")\n        .map((c) => {\n          return c.charCodeAt(0) < fontData.widths.length\n            ? fontData.widths[c.charCodeAt(0)]\n            : fontData.avg;\n        })\n        .reduce((cur, acc) => acc + cur, 0) * fontSize;\n    return width + letterSpacing * Math.max(len - 1, 0);\n  });\n  return Math.max(...widths);\n};\n\nconst _approximateTextHeightInternal = (text: string | string[], style) => {\n  if (text === undefined || text === \"\" || text === null) {\n    return 0;\n  }\n  return _splitToLines(text).reduce((total, line, index) => {\n    const lineStyle = _prepareParams(style, index);\n    const containsCaps = line.toString().match(/[(A-Z)(0-9)]/);\n    const height = containsCaps\n      ? lineStyle.fontSize * coefficients.lineCapitalCoef\n      : lineStyle.fontSize;\n    return total + lineStyle.lineHeight * height;\n  }, 0);\n};\n\nconst _approximateDimensionsInternal = (\n  text: string | string[],\n  style?: TextSizeStyleInterface,\n) => {\n  const angle = Array.isArray(style)\n    ? style[0] && style[0].angle\n    : style && style.angle;\n  const height = _approximateTextHeightInternal(text, style);\n  const width = _approximateTextWidthInternal(text, style);\n  const widthWithRotate = angle\n    ? _getSizeWithRotate(width, height, angle)\n    : width;\n  const heightWithRotate = angle\n    ? _getSizeWithRotate(height, width, angle)\n    : height;\n  return {\n    width: widthWithRotate,\n    height: heightWithRotate * coefficients.heightOverlapCoef,\n  };\n};\n\nconst _getMeasurementContainer = memoize(() => {\n  const element = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n  element.setAttribute(\"xlink\", \"http://www.w3.org/1999/xlink\");\n  element.setAttribute(\"width\", \"300\");\n  element.setAttribute(\"height\", \"300\");\n  element.setAttribute(\"viewBox\", \"0 0 300 300\");\n  element.setAttribute(\"aria-hidden\", \"true\");\n\n  const containerElement = document.createElementNS(\n    \"http://www.w3.org/2000/svg\",\n    \"text\",\n  );\n  element.appendChild(containerElement);\n\n  element.style.position = \"fixed\";\n  element.style.top = \"-9999px\";\n  element.style.left = \"-9999px\";\n\n  document.body.appendChild(element);\n\n  return containerElement;\n});\n\nconst styleToKeyComponent = (style) => {\n  if (!style) {\n    return \"null\";\n  }\n\n  return `${style.angle}:${style.fontFamily}:${style.fontSize}:${style.letterSpacing}:${style.lineHeight}`;\n};\n\nconst _measureDimensionsInternal = memoize(\n  (text: string | string[], style?: TextSizeStyleInterface) => {\n    let containerElement = _getMeasurementContainer();\n    if (!containerElement.isConnected) {\n      _getMeasurementContainer.cache.clear?.();\n      containerElement = _getMeasurementContainer();\n    }\n\n    const lines = _splitToLines(text);\n    let heightAcc = 0;\n    for (const [i, line] of lines.entries()) {\n      const textElement = document.createElementNS(\n        \"http://www.w3.org/2000/svg\",\n        \"tspan\",\n      );\n      const params = _prepareParams(style, i);\n      textElement.style.fontFamily = params.fontFamily;\n      textElement.style.fontSize = `${params.fontSize}px`;\n      textElement.style.lineHeight = params.lineHeight;\n      textElement.style.fontFamily = params.fontFamily;\n      textElement.style.letterSpacing = params.letterSpacing;\n      textElement.textContent = line;\n      textElement.setAttribute(\"x\", \"0\");\n      textElement.setAttribute(\"y\", `${heightAcc}`);\n      containerElement.appendChild(textElement);\n\n      heightAcc +=\n        params.lineHeight * textElement.getBoundingClientRect().height;\n    }\n\n    const { width } = containerElement.getBoundingClientRect();\n\n    containerElement.innerHTML = \"\";\n\n    return {\n      width: style?.angle\n        ? _getSizeWithRotate(width, heightAcc, style?.angle)\n        : width,\n      height: style?.angle\n        ? _getSizeWithRotate(heightAcc, width, style?.angle)\n        : heightAcc,\n    };\n  },\n  (text, style) => {\n    const totalText = Array.isArray(text) ? text.join() : text;\n    const totalStyle = Array.isArray(style)\n      ? style.map(styleToKeyComponent).join()\n      : styleToKeyComponent(style);\n    return `${totalText}::${totalStyle}`;\n  },\n);\n\nexport interface TextSizeStyleInterface {\n  angle?: number;\n  fontFamily?: string;\n  fontSize?: number | string;\n  letterSpacing?: string;\n  lineHeight?: number;\n}\n\n// Stubbable implementation.\nexport const _approximateTextSizeInternal = {\n  impl: (\n    text: string | string[],\n    style?: TextSizeStyleInterface,\n    __debugForceApproximate = false,\n  ) => {\n    // Attempt to first measure the element in DOM. If there is no DOM, fallback\n    // to the less accurate approximation algorithm.\n    const isClient =\n      typeof window !== \"undefined\" &&\n      typeof window.document !== \"undefined\" &&\n      typeof window.document.createElement !== \"undefined\";\n\n    if (!isClient || __debugForceApproximate) {\n      return _approximateDimensionsInternal(text, style);\n    }\n\n    return _measureDimensionsInternal(text, style);\n  },\n};\n\n/**\n * Predict text size by font params.\n * @param {string|string[]} text Content for width calculation.\n * @param {Object} style Text styles, ,fontFamily, fontSize, etc.\n * @param {string} style.fontFamily Text fontFamily.\n * @param {(number|string)} style.fontSize Text fontSize.\n * @param {number} style.angle Text rotate angle.\n * @param {string} style.letterSpacing Text letterSpacing(space between letters).\n * @param {number} style.lineHeight Line height coefficient.\n * @returns {number} Approximate text label height.\n */\nexport const approximateTextSize = (\n  text: string | string[],\n  style?: TextSizeStyleInterface,\n): { width: number; height: number } =>\n  _approximateTextSizeInternal.impl(text, style);\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/timer-context.ts",
    "content": "import React from \"react\";\nimport Timer from \"./timer\";\n\n/**\n * The React context object consumers may use to access or override the global\n * timer.\n */\nconst TimerContext = React.createContext({\n  transitionTimer: new Timer(),\n  animationTimer: new Timer(),\n});\nTimerContext.displayName = \"TimerContext\";\n\nexport default TimerContext;\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/timer.ts",
    "content": "import { timer, now, Timer as D3Timer } from \"victory-vendor/d3-timer\";\n\ntype TimerCallback = (elapsed: number, duration: number) => void;\n\nexport default class Timer {\n  private shouldAnimate: boolean;\n  private readonly subscribers: Array<{\n    callback: TimerCallback;\n    startTime: number;\n    duration: number;\n  }>;\n  private activeSubscriptions: number;\n  private timer: D3Timer | null;\n\n  constructor() {\n    this.shouldAnimate = true;\n    this.subscribers = [];\n    this.timer = null;\n    this.activeSubscriptions = 0;\n  }\n\n  bypassAnimation() {\n    this.shouldAnimate = false;\n  }\n\n  resumeAnimation() {\n    this.shouldAnimate = true;\n  }\n\n  loop = () => {\n    this.subscribers.forEach((s) => {\n      s.callback(now() - s.startTime, s.duration);\n    });\n  };\n\n  start() {\n    if (!this.timer) {\n      this.timer = timer(this.loop);\n    }\n  }\n\n  stop() {\n    if (this.timer) {\n      this.timer.stop();\n      this.timer = null;\n    }\n  }\n\n  subscribe(callback: TimerCallback, duration: number) {\n    const subscriptionID = this.subscribers.push({\n      startTime: now(),\n      callback,\n      duration: this.shouldAnimate ? duration : 0,\n    });\n    this.activeSubscriptions++;\n    this.start();\n    return subscriptionID;\n  }\n\n  unsubscribe(id) {\n    if (id !== null && this.subscribers[id - 1]) {\n      delete this.subscribers[id - 1];\n      this.activeSubscriptions--;\n    }\n    if (this.activeSubscriptions === 0) {\n      this.stop();\n    }\n  }\n}\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/transitions.test.ts",
    "content": "import React from \"react\";\n\nimport * as Transitions from \"./transitions\";\n\ndescribe(\"getInitialTransitionState\", () => {\n  const makeChild = (data) => {\n    return React.createElement(\"div\", { data });\n  };\n\n  it(\"returns a 'falsey' transition object if children are not given\", () => {\n    const result = Transitions.getInitialTransitionState(null, null);\n    expect(result).toEqual({\n      childrenTransitions: [],\n      nodesWillExit: false,\n      nodesWillEnter: false,\n      nodesShouldEnter: false,\n    });\n  });\n\n  it(\"it returns childTransitions entering and exiting false for identical data\", () => {\n    const child = makeChild([\n      { x: 1, y: 1 },\n      { x: 2, y: 3 },\n    ]);\n    const result = Transitions.getInitialTransitionState(child, child);\n    expect(result).toEqual({\n      childrenTransitions: [{ entering: false, exiting: false }],\n      nodesWillExit: false,\n      nodesWillEnter: false,\n      nodesShouldEnter: false,\n    });\n  });\n\n  it(\"it returns childTransitions with exiting data\", () => {\n    const child1 = makeChild([\n      { x: 1, y: 1 },\n      { x: 2, y: 3 },\n    ]);\n    const child2 = makeChild([{ x: 1, y: 1 }]);\n    const result = Transitions.getInitialTransitionState(child1, child2);\n    expect(result).toEqual({\n      childrenTransitions: [{ entering: false, exiting: { 1: true } }],\n      nodesWillExit: true,\n      nodesWillEnter: false,\n      nodesShouldEnter: false,\n    });\n  });\n\n  it(\"it returns childTransitions with entering data\", () => {\n    const child1 = makeChild([{ x: 1, y: 1 }]);\n    const child2 = makeChild([\n      { x: 1, y: 1 },\n      { x: 2, y: 3 },\n    ]);\n    const result = Transitions.getInitialTransitionState(child1, child2);\n    expect(result).toEqual({\n      childrenTransitions: [{ entering: { 1: true }, exiting: false }],\n      nodesWillExit: false,\n      nodesWillEnter: true,\n      nodesShouldEnter: false,\n    });\n  });\n});\n\ndescribe(\"getTransitionPropsFactory\", () => {\n  const toZero = jest.fn().mockImplementation(() => ({ y: 0 }));\n  const makeChild = (data) => {\n    return {\n      type: {\n        defaultTransitions: {\n          onExit: { duration: 1, before: toZero },\n          onEnter: { duration: 2, before: toZero },\n        },\n      },\n      props: { data, animate: { duration: 0 } },\n    };\n  };\n\n  const callback = jest.fn();\n\n  it(\"returns a function that describes data exiting\", () => {\n    const exitingState = {\n      childrenTransitions: [{ entering: false, exiting: { 1: true } }],\n      nodesWillExit: true,\n      nodesWillEnter: false,\n      nodesShouldEnter: false,\n      nodesShouldLoad: true,\n      nodesDoneLoad: true,\n    };\n    const result = Transitions.getTransitionPropsFactory(\n      {},\n      exitingState,\n      callback,\n    );\n    const child = makeChild([\n      { x: 1, y: 1 },\n      { x: 2, y: 3 },\n    ]);\n    const calledResult = result(child, 0);\n    expect(result).toBeInstanceOf(Function);\n    expect(Object.keys(calledResult)).toEqual(\n      expect.arrayContaining([\"animate\", \"data\"]),\n    );\n    expect(calledResult.data).toEqual([\n      { x: 1, y: 1 },\n      { x: 2, y: 0 },\n    ]);\n    expect(calledResult.animate!.duration).toEqual(\n      child.type.defaultTransitions.onExit.duration,\n    );\n  });\n\n  it(\"returns a function that describes data entering\", () => {\n    const enteringState = {\n      childrenTransitions: [{ entering: { 1: true }, exiting: false }],\n      nodesWillExit: false,\n      nodesWillEnter: true,\n      nodesShouldEnter: false,\n      nodesShouldLoad: true,\n      nodesDoneLoad: true,\n    };\n    const result = Transitions.getTransitionPropsFactory(\n      {},\n      enteringState,\n      callback,\n    );\n    const child = makeChild([\n      { x: 1, y: 1 },\n      { x: 2, y: 3 },\n    ]);\n    const calledResult = result(child, 0);\n    expect(result).toBeInstanceOf(Function);\n    expect(calledResult).toBeInstanceOf(Object);\n    expect(calledResult).toBeInstanceOf(Object);\n    expect(Object.keys(calledResult)).toEqual(\n      expect.arrayContaining([\"animate\", \"data\"]),\n    );\n\n    expect(calledResult.data).toEqual([\n      { x: 1, y: 1 },\n      { x: 2, y: 0 },\n    ]);\n  });\n});\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/transitions.ts",
    "content": "import React from \"react\";\nimport defaults from \"lodash/defaults\";\nimport identity from \"lodash/identity\";\n\nimport { AnimatePropTypeInterface } from \"../types/prop-types\";\n\nfunction getDatumKey(datum, idx) {\n  return (datum.key || idx).toString();\n}\n\nfunction getKeyedData(data) {\n  return data.reduce((keyedData, datum, idx) => {\n    const key = getDatumKey(datum, idx);\n    keyedData[key] = datum;\n    return keyedData;\n  }, {});\n}\n\nfunction getKeyedDataDifference(a, b) {\n  let hasDifference = false;\n  const difference = Object.keys(a).reduce((_difference, key) => {\n    if (!(key in b)) {\n      hasDifference = true;\n      _difference[key] = true;\n    }\n    return _difference;\n  }, {});\n  return hasDifference && difference;\n}\n\n/**\n * Calculate which data-points exist in oldData and not nextData -\n * these are the `exiting` data-points.  Also calculate which\n * data-points exist in nextData and not oldData - these are the\n * `entering` data-points.\n *\n * @param  {Array} oldData   this.props.data Array\n * @param  {Array} nextData  this.props.data Array\n *\n * @return {Object}          Object with `entering` and `exiting` properties.\n *                           entering[datum.key] will be true if the data is\n *                           entering, and similarly for `exiting`.\n */\nfunction getNodeTransitions(oldData, nextData) {\n  const oldDataKeyed = oldData && getKeyedData(oldData);\n  const nextDataKeyed = nextData && getKeyedData(nextData);\n\n  return {\n    entering:\n      oldDataKeyed && getKeyedDataDifference(nextDataKeyed, oldDataKeyed),\n    exiting:\n      nextDataKeyed && getKeyedDataDifference(oldDataKeyed, nextDataKeyed),\n  };\n}\n\nfunction getChildData(child) {\n  if (child.type && child.type.getData) {\n    return child.type.getData(child.props);\n  }\n  return (child.props && child.props.data) || false;\n}\n\n/**\n * If a parent component has animation enabled, calculate the transitions\n * for any data of any child component that supports data transitions.\n * Data transitions are defined as any two datasets where data nodes exist\n * in the first set and not the second, in the second and not the first,\n * or both.\n *\n * @param  {Children}  oldChildren   this.props.children from old props\n * @param  {Children}  nextChildren  this.props.children from next props\n *\n * @return {Object}                  Object with the following properties:\n *                                    - nodesWillExit\n *                                    - nodesWillEnter\n *                                    - childrenTransitions\n *                                    - nodesShouldEnter\n */\nexport function getInitialTransitionState(oldChildren, nextChildren) {\n  let nodesWillExit = false;\n  let nodesWillEnter = false;\n\n  const getTransition = (oldChild, newChild) => {\n    if (!newChild || oldChild.type !== newChild.type) {\n      return {};\n    }\n    const { entering, exiting } =\n      getNodeTransitions(getChildData(oldChild), getChildData(newChild)) || {};\n\n    nodesWillExit = nodesWillExit || !!exiting;\n    nodesWillEnter = nodesWillEnter || !!entering;\n\n    return { entering: entering || false, exiting: exiting || false };\n  };\n\n  const getTransitionsFromChildren = (old, next) => {\n    return old.map((child, idx) => {\n      if (child && child.props && child.props.children && next[idx]) {\n        return getTransitionsFromChildren(\n          React.Children.toArray(old[idx].props.children),\n          React.Children.toArray(next[idx].props.children),\n        );\n      }\n      // get Transition entering and exiting nodes\n      return getTransition(child, next[idx]);\n    });\n  };\n\n  const childrenTransitions = getTransitionsFromChildren(\n    React.Children.toArray(oldChildren),\n    React.Children.toArray(nextChildren),\n  );\n  return {\n    nodesWillExit,\n    nodesWillEnter,\n    childrenTransitions,\n    // TODO: This may need to be refactored for the following situation.\n    //       The component receives new props, and the data provided\n    //       is a perfect match for the previous data and domain except\n    //       for new nodes. In this case, we wouldn't want a delay before\n    //       the new nodes appear.\n    nodesShouldEnter: false,\n  };\n}\n\ntype TransitionProps = {\n  data;\n  animate?: AnimatePropTypeInterface;\n  clipWidth?: number;\n};\n\nfunction getInitialChildProps(animate, data): TransitionProps {\n  const after =\n    animate.onEnter && animate.onEnter.after ? animate.onEnter.after : identity;\n  return {\n    data: data.map((datum, idx) =>\n      Object.assign({}, datum, after(datum, idx, data)),\n    ),\n  };\n}\n\n// eslint-disable-next-line max-params\nfunction getChildBeforeLoad(animate, child, data, cb): TransitionProps {\n  const newAnimate = Object.assign({}, animate, { onEnd: cb });\n\n  if (newAnimate && newAnimate.onLoad && !newAnimate.onLoad.duration) {\n    return { animate: newAnimate, data };\n  }\n  const before =\n    newAnimate.onLoad && newAnimate.onLoad.before\n      ? newAnimate.onLoad.before\n      : identity;\n  // If nodes need to exit, transform them with the provided onLoad.before function.\n  const newData = data.map((datum, idx) => {\n    return Object.assign({}, datum, before(datum, idx, data));\n  });\n\n  return { animate: newAnimate, data: newData, clipWidth: 0 };\n}\n\nfunction getChildOnLoad(animate, data, cb): TransitionProps {\n  const newAnimate = Object.assign({}, animate, { onEnd: cb });\n  let newData = data;\n\n  if (newAnimate && newAnimate.onLoad && !newAnimate.onLoad.duration) {\n    return { animate, data };\n  }\n  const after =\n    animate.onLoad && animate.onLoad.after ? animate.onLoad.after : identity;\n  // If nodes need to exit, transform them with the provided onLoad.after function.\n  newData = data.map((datum, idx) => {\n    return Object.assign({}, datum, after(datum, idx, data));\n  });\n\n  return { animate: newAnimate, data: newData };\n}\n\n// eslint-disable-next-line max-params\nfunction getChildPropsOnExit(\n  animate,\n  child,\n  data,\n  exitingNodes,\n  cb,\n): TransitionProps {\n  // Whether or not _this_ child has exiting nodes, we want the exit-\n  // transition for all children to have the same duration, delay, etc.\n  const onExit = animate && animate.onExit;\n  const newAnimate = Object.assign({}, animate, onExit);\n  let newData = data;\n\n  if (exitingNodes) {\n    // After the exit transition occurs, trigger the animations for\n    // nodes that are neither exiting nor entering.\n    animate.onEnd = cb;\n    const before =\n      animate.onExit && animate.onExit.before\n        ? animate.onExit.before\n        : identity;\n    // If nodes need to exit, transform them with the provided onExit.before function.\n    newData = data.map((datum, idx) => {\n      const key = (datum.key || idx).toString();\n      return exitingNodes[key]\n        ? Object.assign({}, datum, before(datum, idx, data))\n        : datum;\n    });\n  }\n\n  return { animate: newAnimate, data: newData };\n}\n\n// eslint-disable-next-line max-params\nfunction getChildPropsBeforeEnter(\n  animate,\n  child,\n  data,\n  enteringNodes,\n  cb,\n): TransitionProps {\n  let newAnimate = animate;\n  let newData = data;\n  if (enteringNodes) {\n    // Perform a normal animation here, except - when it finishes - trigger\n    // the transition for entering nodes.\n    newAnimate = Object.assign({}, animate, { onEnd: cb });\n    const before =\n      animate.onEnter && animate.onEnter.before\n        ? animate.onEnter.before\n        : identity;\n    // We want the entering nodes to be included in the transition target\n    // domain.  However, we may not want these nodes to be displayed initially,\n    // so perform the `onEnter.before` transformation on each node.\n    newData = data.map((datum, idx) => {\n      const key = (datum.key || idx).toString();\n      return enteringNodes[key]\n        ? Object.assign({}, datum, before(datum, idx, data))\n        : datum;\n    });\n  }\n\n  return { animate: newAnimate, data: newData };\n}\n\n// eslint-disable-next-line max-params\nfunction getChildPropsOnEnter(\n  animate,\n  data,\n  enteringNodes,\n  cb,\n): TransitionProps {\n  // Whether or not _this_ child has entering nodes, we want the entering-\n  // transition for all children to have the same duration, delay, etc.\n  const onEnter = animate && animate.onEnter;\n  const newAnimate = Object.assign({}, animate, onEnter);\n  let newData = data;\n\n  if (enteringNodes) {\n    // Old nodes have been transitioned to their new values, and the\n    // domain should encompass the nodes that will now enter. So perform\n    // the `onEnter.after` transformation on each node.\n    newAnimate.onEnd = cb;\n    const after =\n      newAnimate.onEnter && newAnimate.onEnter.after\n        ? newAnimate.onEnter.after\n        : identity;\n    newData = data.map((datum, idx) => {\n      const key = getDatumKey(datum, idx);\n      return enteringNodes[key]\n        ? Object.assign({}, datum, after(datum, idx, data))\n        : datum;\n    });\n  }\n  return { animate: newAnimate, data: newData };\n}\n\n/**\n * getTransitionPropsFactory - putting the Java in JavaScript.  This will return a\n * function that returns prop transformations for a child, given that child's props\n * and its index in the parent's children array.\n *\n * In particular, this will include an `animate` object that is set appropriately\n * so that each child will be synchronized for each stage of a transition\n * animation.  It will also include a transformed `data` object, where each datum\n * is transformed by `animate.onExit` and `animate.onEnter` `before` and `after`\n * functions.\n *\n * @param  {Object}  props       `this.props` for the parent component.\n * @param  {Object} state        `this.state` for the parent component.\n * @param  {Function} setState    Function that, when called, will `this.setState` on\n *                                 the parent component with the provided object.\n *\n * @return {Function}              Child-prop transformation function.\n */\nexport function getTransitionPropsFactory(props, state, setState) {\n  const nodesWillExit = state && state.nodesWillExit;\n  const nodesWillEnter = state && state.nodesWillEnter;\n  const nodesShouldEnter = state && state.nodesShouldEnter;\n  const nodesShouldLoad = state && state.nodesShouldLoad;\n  const nodesDoneLoad = state && state.nodesDoneLoad;\n  const childrenTransitions = (state && state.childrenTransitions) || [];\n  const transitionDurations = {\n    enter:\n      props.animate && props.animate.onEnter && props.animate.onEnter.duration,\n    exit:\n      props.animate && props.animate.onExit && props.animate.onExit.duration,\n    load:\n      props.animate && props.animate.onLoad && props.animate.onLoad.duration,\n    move: props.animate && props.animate.duration,\n  };\n\n  const onLoad = (child, data, animate) => {\n    if (nodesShouldLoad) {\n      return getChildOnLoad(animate, data, () => {\n        setState({ nodesShouldLoad: false, nodesDoneLoad: true });\n      });\n    }\n\n    return getChildBeforeLoad(animate, child, data, () => {\n      setState({ nodesDoneLoad: true });\n    });\n  };\n\n  // eslint-disable-next-line max-params\n  const onExit = (nodes, child, data, animate) => {\n    return getChildPropsOnExit(animate, child, data, nodes, () => {\n      setState({ nodesWillExit: false });\n    });\n  };\n\n  // eslint-disable-next-line max-params\n  const onEnter = (nodes, child, data, animate) => {\n    if (nodesShouldEnter) {\n      return getChildPropsOnEnter(animate, data, nodes, () => {\n        setState({ nodesWillEnter: false });\n      });\n    }\n\n    return getChildPropsBeforeEnter(animate, child, data, nodes, () => {\n      setState({ nodesShouldEnter: true });\n    });\n  };\n\n  const getChildTransitionDuration = function (child, type) {\n    const animate = child.props.animate;\n    if (!child.type) {\n      return {};\n    }\n    const defaultTransitions =\n      child.props && child.props.polar\n        ? child.type.defaultPolarTransitions || child.type.defaultTransitions\n        : child.type.defaultTransitions;\n    if (defaultTransitions) {\n      const animationDuration = animate[type] && animate[type].duration;\n      return animationDuration !== undefined\n        ? animationDuration\n        : defaultTransitions[type] && defaultTransitions[type].duration;\n    }\n    return {};\n  };\n\n  return function getTransitionProps(child, index): TransitionProps {\n    const data = getChildData(child) || [];\n    const animate: AnimatePropTypeInterface = defaults(\n      {},\n      props.animate,\n      child.props.animate,\n    );\n    const defaultTransitions = child.props.polar\n      ? child.type.defaultPolarTransitions || child.type.defaultTransitions\n      : child.type.defaultTransitions;\n\n    animate.onExit = defaults(\n      {},\n      animate.onExit,\n      defaultTransitions && defaultTransitions.onExit,\n    );\n    animate.onEnter = defaults(\n      {},\n      animate.onEnter,\n      defaultTransitions && defaultTransitions.onEnter,\n    );\n    animate.onLoad = defaults(\n      {},\n      animate.onLoad,\n      defaultTransitions && defaultTransitions.onLoad,\n    );\n\n    const childTransitions =\n      childrenTransitions[index] || childrenTransitions[0];\n    if (!nodesDoneLoad) {\n      // should do onLoad animation\n      const load =\n        transitionDurations.load !== undefined\n          ? transitionDurations.load\n          : getChildTransitionDuration(child, \"onLoad\");\n      const animation = { duration: load };\n      return onLoad(child, data, Object.assign({}, animate, animation));\n    } else if (nodesWillExit) {\n      const exitingNodes = childTransitions && childTransitions.exiting;\n      const exit =\n        transitionDurations.exit !== undefined\n          ? transitionDurations.exit\n          : getChildTransitionDuration(child, \"onExit\");\n      // if nodesWillExit, but this child has no exiting nodes, set a delay instead of a duration\n      const animation = exitingNodes ? { duration: exit } : { delay: exit };\n      return onExit(\n        exitingNodes,\n        child,\n        data,\n        Object.assign({}, animate, animation),\n      );\n    } else if (nodesWillEnter) {\n      const enteringNodes = childTransitions && childTransitions.entering;\n      const enter =\n        transitionDurations.enter !== undefined\n          ? transitionDurations.enter\n          : getChildTransitionDuration(child, \"onEnter\");\n      const move =\n        transitionDurations.move !== undefined\n          ? transitionDurations.move\n          : child.props.animate && child.props.animate.duration;\n      const animation = {\n        duration: nodesShouldEnter && enteringNodes ? enter : move,\n      };\n      return onEnter(\n        enteringNodes,\n        child,\n        data,\n        Object.assign({}, animate, animation),\n      );\n    } else if (!state && animate && animate.onExit) {\n      // This is the initial render, and nodes may enter when props change. Because\n      // animation interpolation is determined by old- and next- props, data may need\n      // to be augmented with certain properties.\n      //\n      // For example, it may be desired that exiting nodes go from `opacity: 1` to\n      // `opacity: 0`. Without setting this on a per-datum basis, the interpolation\n      // might go from `opacity: undefined` to `opacity: 0`, which would result in\n      // interpolated `opacity: NaN` values.\n      //\n      return getInitialChildProps(animate, data);\n    }\n    return { animate, data };\n  };\n}\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/type-helpers.ts",
    "content": "import {\n  ForAxes,\n  AxisType,\n  Tuple,\n  Datum,\n  DatumValue,\n} from \"../types/prop-types\";\n\nexport function hasValueForAxis<T = unknown>(\n  value: unknown | ForAxes<T>,\n  axis: AxisType,\n): value is ForAxes<T> {\n  if (typeof value === \"object\" && value !== null) {\n    return axis in value;\n  }\n  return false;\n}\n\nexport function isTuple<T = unknown>(value: unknown): value is Tuple<T> {\n  return Array.isArray(value) && value.length === 2;\n}\n\nexport function getValueForAxis<T = unknown>(\n  value: T | ForAxes<T> | undefined,\n  axis: AxisType,\n): T | undefined {\n  if (hasValueForAxis<T>(value, axis)) {\n    return value[axis] as T;\n  }\n  return value;\n}\n\nexport function isDate(value: unknown): value is Date {\n  return value instanceof Date;\n}\n\nexport function isKeyValueObject(\n  datum: Datum,\n): datum is { [key: string]: DatumValue } {\n  return (\n    typeof datum === \"object\" &&\n    !Array.isArray(datum) &&\n    !(datum instanceof Date)\n  );\n}\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/user-props.ts",
    "content": "import * as React from \"react\";\nimport { evaluateProp } from \"./helpers\";\n\n/*\n  USER_PROPS_SAFELIST is to contain any string deemed safe for user props.\n  The startsWidth array will contain the start of any accepted user-prop that\n  starts with these characters.\n  The exactMatch will contain a list of exact prop names that are accepted.\n*/\nconst USER_PROPS_SAFELIST = {\n  startsWith: [\"data-\", \"aria-\"] as const,\n  exactMatch: [] as string[],\n};\n\n// Normally we'd use Template Literal Types, but we're avoiding it to maximize TS compatibility with TS < 4.1\ntype SafeAttribute = string; // `data-${string}` | `aria-${string}`;\n\n/**\n * doesPropStartWith: Function that takes a prop's key and runs it against all\n * options in the USER_PROPS_SAFELIST and checks to see if it starts with any\n * of those options.\n * @param {string} key: prop key to be tested against whitelist\n * @returns {Boolean}: returns true if the key starts with an option or false if\n * otherwise\n */\nconst doesPropStartWith = (key: string): key is SafeAttribute => {\n  let startsWith = false;\n\n  USER_PROPS_SAFELIST.startsWith.forEach((starterString) => {\n    const regex = new RegExp(`\\\\b(${starterString})(\\\\w|-)+`, \"g\");\n    if (regex.test(key)) startsWith = true;\n  });\n\n  return startsWith;\n};\n\n/**\n * isExactMatch: checks to see if the given key matches any of the 'exactMatch'\n * items in the whitelist\n * @param {String} key: prop key to be tested against the whitelist-exact match\n * array.\n * @returns {Boolean}: return true if whitelist contains that key, otherwise\n * returns false.\n */\nconst isExactMatch = (key: string): key is SafeAttribute =>\n  USER_PROPS_SAFELIST.exactMatch.includes(key);\n\n/**\n * testIfSafeProp: tests prop's key against both startsWith and exactMatch values\n * @param {String} key: prop key to be tested against the whitelist\n * @returns {Boolean}: returns true if found in whitelist, otherwise returns false\n */\nconst testIfSafeProp = (key: string): key is SafeAttribute => {\n  if (doesPropStartWith(key) || isExactMatch(key)) return true;\n  return false;\n};\n\n/**\n * Asserts that value is not null or undefined, throwing an error if it is.\n * @param value The value to assert\n * @param message The error message to throw\n */\nexport function assert<T>(\n  value: T,\n  message?: string,\n): asserts value is NonNullable<T> {\n  if (value === undefined || value === null) {\n    throw new Error(message);\n  }\n}\n\n/**\n * getSafeUserProps - function that takes in a props object and removes any\n * key-value entries that do not match filter strings in the USER_PROPS_SAFELIST\n * object.\n *\n * @param {Object} props: props to be filtered against USER_PROPS_SAFELIST\n * @returns {Object}: object containing remaining acceptable props\n */\nexport const getSafeUserProps = <T>(\n  props: T extends Record<string, any> ? T : never,\n): Record<SafeAttribute, string> => {\n  const propsToFilter = { ...props };\n  return Object.fromEntries(\n    Object.entries(propsToFilter)\n      .filter(([key]) => testIfSafeProp(key))\n      .map(([key, value]) => {\n        return [key, evaluateProp(value, props)];\n      }),\n  );\n};\n\n/**\n * Wraps a component and adds safe user props\n *\n * @param {ReactElement} component: parent component\n * @param {Object} props: props to be filtered\n * @returns {ReactElement} modified component\n */\nexport const withSafeUserProps = (component: React.ReactElement, props) => {\n  return React.cloneElement(component, getSafeUserProps(props));\n};\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/wrapper.test.tsx",
    "content": "/* eslint-disable react/no-multi-comp */\nimport React from \"react\";\n\nimport * as Wrapper from \"./wrapper\";\n\nconst MockVictoryAxis = (props) => <div {...props} />;\nMockVictoryAxis.role = \"axis\";\n\nconst MockVictoryLine = (props) => <div {...props} />;\nMockVictoryLine.role = \"line\";\n\ndescribe(\"helpers/wrapper\", () => {\n  describe(\"getDomain\", () => {\n    const victoryLine = <MockVictoryLine domain={[0, 3]} />;\n    const xAxis = <MockVictoryAxis dependentAxis={false} />;\n    const yAxis = <MockVictoryAxis dependentAxis />;\n    const childComponents = [victoryLine, xAxis, yAxis];\n\n    it(\"calculates a domain from props\", () => {\n      const props = { domain: { x: [1, 2], y: [2, 3] } };\n      const domainResultX = Wrapper.getDomain(props, \"x\", childComponents);\n      expect(domainResultX).toEqual([1, 2]);\n    });\n\n    it(\"calculates a domain from child components\", () => {\n      const props = { children: childComponents };\n      const domainResultX = Wrapper.getDomain(props, \"x\", childComponents);\n      expect(domainResultX).toEqual(victoryLine.props.domain);\n    });\n  });\n\n  describe(\"getStringsFromData\", () => {\n    it(\"returns an array of strings from a data prop\", () => {\n      const props = {\n        data: [\n          { x: \"one\", y: 1 },\n          { x: \"red\", y: 2 },\n          { x: \"cat\", y: 3 },\n        ],\n      };\n      const childComponents = [<MockVictoryLine key={0} {...props} />];\n      const dataStrings = Wrapper.getStringsFromData(childComponents).x;\n      expect(dataStrings).toEqual([\"one\", \"red\", \"cat\"]);\n    });\n\n    it(\"returns an array of strings from array-type data\", () => {\n      const props = {\n        data: [\n          [\"one\", 1],\n          [\"red\", 2],\n          [\"cat\", 3],\n        ],\n        x: 0,\n        y: 1,\n      };\n      const childComponents = [<MockVictoryLine key={0} {...props} />];\n      const dataStrings = Wrapper.getStringsFromData(childComponents).x;\n      expect(dataStrings).toEqual([\"one\", \"red\", \"cat\"]);\n    });\n\n    it(\"only returns strings, if data is mixed\", () => {\n      const props = {\n        data: [\n          { x: 1, y: 1 },\n          { x: \"three\", y: 3 },\n        ],\n      };\n      const childComponents = [<MockVictoryLine key={0} {...props} />];\n      expect(Wrapper.getStringsFromData(childComponents).x).toEqual([\"three\"]);\n    });\n\n    it(\"returns an empty array when no strings are present\", () => {\n      const props = {\n        data: [\n          { x: 1, y: 1 },\n          { x: 3, y: 3 },\n        ],\n      };\n      const childComponents = [<MockVictoryLine key={0} {...props} />];\n      expect(Wrapper.getStringsFromData(childComponents).x).toEqual([]);\n    });\n\n    it(\"returns an empty array when no children are given\", () => {\n      expect(Wrapper.getStringsFromData([])).toEqual({ x: [], y: [] });\n    });\n  });\n\n  describe(\"getStringsFromCategories\", () => {\n    it(\"gets string from all options\", () => {\n      expect(Wrapper.getStringsFromChildrenCategories([], \"x\")).toEqual([]);\n      expect(\n        Wrapper.getStringsFromChildrenCategories(\n          [<MockVictoryLine categories={[\"one\", \"two\", \"three\"]} key=\"1\" />],\n          \"x\",\n        ),\n      ).toEqual([\"one\", \"two\", \"three\"]);\n      expect(\n        Wrapper.getStringsFromChildrenCategories(\n          [<MockVictoryLine categories={[\"one\", \"two\", \"three\"]} key=\"1\" />],\n          \"y\",\n        ),\n      ).toEqual([\"one\", \"two\", \"three\"]);\n      expect(\n        Wrapper.getStringsFromChildrenCategories(\n          [\n            <MockVictoryLine\n              categories={{ x: [\"one\", \"two\", \"three\"] }}\n              key=\"1\"\n            />,\n          ],\n          \"x\",\n        ),\n      ).toEqual([\"one\", \"two\", \"three\"]);\n      expect(\n        Wrapper.getStringsFromChildrenCategories(\n          [\n            <MockVictoryLine\n              categories={{ x: [\"one\", \"two\", \"three\"] }}\n              key=\"1\"\n            />,\n            <MockVictoryLine\n              categories={{ x: [\"four\", \"five\", \"six\"] }}\n              key=\"2\"\n            />,\n          ],\n          \"x\",\n        ),\n      ).toEqual([\"one\", \"two\", \"three\", \"four\", \"five\", \"six\"]);\n      expect(\n        Wrapper.getStringsFromChildrenCategories(\n          [\n            <MockVictoryLine\n              categories={{ y: [\"one\", \"two\", \"three\"] }}\n              key=\"1\"\n            />,\n          ],\n          \"x\",\n        ),\n      ).toEqual([]);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-core/src/victory-util/wrapper.tsx",
    "content": "import React from \"react\";\nimport defaults from \"lodash/defaults\";\nimport uniq from \"lodash/uniq\";\nimport groupBy from \"lodash/groupBy\";\nimport uniqBy from \"lodash/uniqBy\";\n\nimport * as Axis from \"./axis\";\nimport * as Style from \"./style\";\nimport * as Data from \"./data\";\nimport * as Domain from \"./domain\";\nimport * as Events from \"./events\";\nimport * as Collection from \"./collection\";\nimport * as Helpers from \"./helpers\";\nimport * as Scale from \"./scale\";\nimport * as Log from \"./log\";\n\nexport function addBinsToParentPropsIfHistogram({\n  children,\n  props,\n  childComponents,\n  parentProps,\n}) {\n  const someChildrenAreHistograms = children.some((child) => {\n    return child.type && child.type.role === \"histogram\";\n  });\n\n  const allChildrenAreHistograms =\n    someChildrenAreHistograms &&\n    children.length &&\n    children.every((child) => {\n      return child.type && child.type.role === \"histogram\";\n    });\n\n  if (someChildrenAreHistograms && !allChildrenAreHistograms) {\n    Log.warn(\n      \"VictoryHistogram only supports being stacked with other VictoryHistogram components. Check to make sure that you are only passing VictoryHistogram components to VictoryStack\",\n    );\n  }\n\n  // if we are stacking histograms, we need to generate explicit bins\n  // or else each histogram may end up having different bins\n  if (!allChildrenAreHistograms) {\n    return parentProps;\n  }\n\n  let childBins = props.bins || childComponents[0].props.bins;\n\n  // if we have explicit bins then we don't need to calculate them\n  if (!Array.isArray(childBins)) {\n    const combinedData = children.reduce((memo, child) => {\n      const xAccessor = Helpers.createAccessor(child.props.x || \"x\");\n      return memo.concat(\n        child.props.data.map((datum) => ({ x: xAccessor(datum) })),\n      );\n    }, []);\n\n    // use the same function to generate bins as VictoryHistogram but with\n    // the combined data from above, then get explicit bins from that\n    const getFormattedHistogramData = children[0].type.getFormattedData;\n    childBins = getFormattedHistogramData({\n      data: combinedData,\n      bins: childBins,\n    }).reduce(\n      (memo, { x0, x1 }, index) =>\n        index === 0 ? memo.concat([x0, x1]) : memo.concat(x1),\n      [],\n    );\n  }\n\n  return { ...parentProps, bins: childBins };\n}\n\nexport function getDataFromChildren(props, childComponents) {\n  const { polar, startAngle, endAngle, categories, minDomain, maxDomain } =\n    props;\n  let parentProps = {\n    polar,\n    startAngle,\n    endAngle,\n    categories,\n    minDomain,\n    maxDomain,\n  };\n  let stack = 0;\n  const children = childComponents\n    ? childComponents.slice(0)\n    : React.Children.toArray(props.children);\n\n  parentProps = addBinsToParentPropsIfHistogram({\n    children,\n    props,\n    childComponents,\n    parentProps,\n  });\n\n  const iteratee = (child, childName, parent) => {\n    const childProps = Object.assign({}, child.props, parentProps);\n    let childData;\n    let childElement = child;\n    if (!Data.isDataComponent(child)) {\n      return null;\n    } else if (child.type && Helpers.isFunction(child.type.getData)) {\n      childElement = parent ? React.cloneElement(child, parent.props) : child;\n      childData = childElement.type.getData(childProps);\n    } else {\n      childData = Data.getData(childProps);\n    }\n    stack += 1;\n    return childData.map((datum, index) =>\n      Object.assign({ _stack: stack, _group: index }, datum),\n    );\n  };\n\n  const stacked = children.filter(\n    (c) => c.type && c.type.role === \"stack\",\n  ).length;\n  const combine = (memo, val) => memo.concat(uniqBy(val, \"_group\"));\n  const datasets = Helpers.reduceChildren(\n    children,\n    iteratee,\n    props,\n    [],\n    combine,\n  );\n  const group = stacked ? \"_group\" : \"_stack\";\n  return Object.values(groupBy(datasets, group));\n}\n\nexport function getData(props, childComponents) {\n  if (props.data) {\n    return Data.getData(props);\n  }\n  return getDataFromChildren(\n    props,\n    childComponents || React.Children.toArray(props.children),\n  );\n}\n\nexport function getWidth(props, groupLength?, seriesLength?) {\n  const { datasets, horizontal } = props;\n  const range = horizontal\n    ? Helpers.getRange(props, \"y\")\n    : Helpers.getRange(props, \"x\");\n  const extent = Math.abs(range[1] - range[0]);\n  const seriesLengthValue =\n    seriesLength !== undefined\n      ? seriesLength\n      : (Array.isArray(datasets[0]) && datasets[0].length) || 1;\n  const groupLengthValue = groupLength || datasets.length;\n  const bars = groupLengthValue * seriesLengthValue;\n  const barRatio = 0.5;\n  return Math.round((barRatio * extent) / bars);\n}\n\nexport function getDefaultDomainPadding(props, axis, childComponents) {\n  if (props.polar || axis !== \"x\") {\n    return undefined;\n  }\n  const groupComponent = childComponents.filter((child) => {\n    return child.type && child.type.role && child.type.role === \"group\";\n  });\n\n  if (groupComponent.length < 1) {\n    return undefined;\n  }\n  const { offset, children } = groupComponent[0].props;\n  if (!offset) {\n    return undefined;\n  }\n\n  const firstChild = Array.isArray(children) && children[0];\n  if (!firstChild) {\n    return undefined;\n  }\n  let barWidth = firstChild.props.barWidth;\n  let dataLength = (firstChild.props.data && firstChild.props.data.length) || 1;\n  if (firstChild && firstChild.type.role === \"stack\") {\n    const nestedChild =\n      firstChild.props.children && firstChild.props.children[0];\n    if (!nestedChild) {\n      return undefined;\n    }\n    barWidth = nestedChild.props.barWidth;\n    dataLength = firstChild.props.children.length;\n  }\n  const width = barWidth || getWidth(props, children.length, dataLength);\n  return {\n    x:\n      (width * children.length) / 2 +\n      (offset - width * ((children.length - 1) / 2)),\n  };\n}\n\nexport function getDomainFromChildren(props, axis, childComponents) {\n  const children = childComponents\n    ? childComponents.slice(0)\n    : React.Children.toArray(props.children);\n  const parentData = props.data ? Data.getData(props) : undefined;\n  const {\n    polar,\n    startAngle,\n    endAngle,\n    categories,\n    minDomain,\n    maxDomain,\n    horizontal,\n  } = props;\n  const baseParentProps = {\n    horizontal,\n    polar,\n    startAngle,\n    endAngle,\n    minDomain,\n    maxDomain,\n    categories,\n  };\n  const parentProps = parentData\n    ? Object.assign(baseParentProps, { data: parentData })\n    : baseParentProps;\n\n  const iteratee = (child) => {\n    const sharedProps = Object.assign({}, child.props, parentProps);\n    if (!Domain.isDomainComponent(child)) {\n      return null;\n    } else if (child.type && Helpers.isFunction(child.type.getDomain)) {\n      return child.props && child.type.getDomain(sharedProps, axis);\n    }\n    return Domain.getDomain(sharedProps, axis);\n  };\n\n  const childDomains = Helpers.reduceChildren(children, iteratee, props);\n  const min =\n    childDomains.length === 0 ? 0 : Collection.getMinValue(childDomains);\n  const max =\n    childDomains.length === 0 ? 1 : Collection.getMaxValue(childDomains);\n  return [min, max];\n}\n\nexport function getDomain(props, axis, childComponents) {\n  const children = childComponents || React.Children.toArray(props.children);\n\n  const propsDomain = Domain.getDomainFromProps(props, axis);\n  const domainPadding = getDefaultDomainPadding(props, axis, children);\n  let domain;\n\n  if (propsDomain) {\n    domain = propsDomain;\n  } else {\n    const minDomain = Domain.getMinFromProps(props, axis);\n    const maxDomain = Domain.getMaxFromProps(props, axis);\n    const dataset = (props.data || props.y) && Data.getData(props);\n    const dataDomain = dataset\n      ? Domain.getDomainFromData(props, axis, dataset)!\n      : [];\n    const childDomain = getDomainFromChildren(props, axis, children);\n    const min =\n      minDomain || Collection.getMinValue([...dataDomain, ...childDomain]);\n    const max =\n      maxDomain || Collection.getMaxValue([...dataDomain, ...childDomain]);\n    domain = Domain.getDomainFromMinMax(min, max);\n  }\n  return Domain.formatDomain(\n    domain,\n    Object.assign({ domainPadding }, props),\n    axis,\n  );\n}\n\nexport function getScale(props, axis, childComponents?) {\n  if (props.data) {\n    return Scale.getBaseScale(props, axis);\n  }\n  const children = childComponents\n    ? childComponents.slice(0)\n    : React.Children.toArray(props.children);\n  const iteratee = (child) => {\n    const sharedProps = Object.assign({}, child.props, {\n      horizontal: props.horizontal,\n    });\n    return Scale.getScaleType(sharedProps, axis);\n  };\n  const childScale: string[] = uniq(\n    Helpers.reduceChildren(children, iteratee, props),\n  );\n\n  // default to linear scale if more than one uniq scale type is given by children\n  return childScale.length > 1\n    ? Scale.getScaleFromName(\"linear\")\n    : Scale.getScaleFromName(childScale[0]);\n}\n\nexport function getAllEvents(props) {\n  const components = [\"groupComponent\", \"containerComponent\", \"labelComponent\"];\n  const componentEvents = Events.getComponentEvents(props, components);\n  let events = props.events;\n  if (Array.isArray(componentEvents)) {\n    events = Array.isArray(props.events)\n      ? componentEvents.concat(...props.events)\n      : componentEvents;\n  }\n  return events || [];\n}\n\n// eslint-disable-next-line max-params\nexport function getColor(calculatedProps, child, index, theme) {\n  // check for styles first\n  const { style } = calculatedProps;\n  let { colorScale, color } = calculatedProps;\n  if (style && style.data && style.data.fill) {\n    return style.data.fill;\n  }\n  colorScale =\n    child.props && child.props.colorScale ? child.props.colorScale : colorScale;\n  color = child.props && child.props.color ? child.props.color : color;\n  if (!colorScale && !color) {\n    return undefined;\n  }\n  const colors = Array.isArray(colorScale)\n    ? colorScale\n    : Style.getColorScale(colorScale, theme);\n  return color || colors[index % colors.length];\n}\n\nexport function getStyle(theme, style, role) {\n  const defaultStyle =\n    theme && theme[role] && theme[role].style ? theme[role].style : {};\n  return Helpers.getStyles(style, defaultStyle);\n}\n\n// eslint-disable-next-line max-params\nexport function getChildStyle(child, index, calculatedProps, theme) {\n  const { style, role } = calculatedProps;\n  const childStyle = child.props.style || {};\n  if (Array.isArray(childStyle)) {\n    return childStyle;\n  }\n  const childRole = child.type && child.type.role;\n  const defaultFill =\n    childRole === \"stack\"\n      ? undefined\n      : getColor(calculatedProps, child, index, theme);\n  const defaultColor =\n    childRole === \"line\"\n      ? { fill: \"none\", stroke: defaultFill }\n      : { fill: defaultFill };\n  const dataWidth =\n    role === \"stack\" ? {} : { width: getWidth(calculatedProps) };\n  const dataStyle = defaults(\n    {},\n    childStyle.data,\n    Object.assign({}, dataWidth, style.data, defaultColor),\n  );\n  const labelsStyle = defaults({}, childStyle.labels, style.labels);\n  return {\n    ...childStyle,\n    parent: style.parent,\n    data: dataStyle,\n    labels: labelsStyle,\n  };\n}\n\nexport function getStringsFromChildrenCategories(childComponents, axis) {\n  const iteratee = (child) => {\n    if (!Domain.isDomainComponent(child)) {\n      return null;\n    }\n    const childProps = child.props || {};\n    return Data.getStringsFromCategories(childProps, axis);\n  };\n  return Helpers.reduceChildren(childComponents.slice(0), iteratee);\n}\n\nexport function getStringsFromData(childComponents) {\n  const iteratee = (child) => {\n    const childProps = child.props || {};\n    let data;\n    if (!Data.isDataComponent(child)) {\n      return null;\n    } else if (child.type && Helpers.isFunction(child.type.getData)) {\n      data = child.type.getData(childProps);\n    } else {\n      data = Data.getData(childProps);\n    }\n    return data.map((d) => ({ x: d.xName, y: d.yName }));\n  };\n\n  const initialMemo = { x: [] as number[], y: [] as number[] };\n  const combine = (\n    memo: typeof initialMemo,\n    datum: NonNullable<ReturnType<typeof iteratee>>,\n  ) => {\n    const x = Array.isArray(datum)\n      ? datum.map((d) => d.x).filter(Boolean)\n      : datum.x;\n    const y = Array.isArray(datum)\n      ? datum.map((d) => d.y).filter(Boolean)\n      : datum.y;\n    return {\n      x: x !== undefined ? memo.x.concat(x) : memo.x,\n      y: y !== undefined ? memo.y.concat(y) : memo.y,\n    };\n  };\n  return Helpers.reduceChildren(\n    childComponents.slice(0),\n    iteratee,\n    {},\n    initialMemo,\n    combine,\n  );\n}\n\nexport function getCategoryAndAxisStringsFromChildren(\n  props,\n  axis,\n  childComponents,\n) {\n  const categories = Data.getStringsFromCategories(props, axis);\n  const axisComponent = Axis.getAxisComponent(childComponents, axis);\n  const axisStrings = axisComponent\n    ? Data.getStringsFromAxes(axisComponent.props, axis)\n    : [];\n  const categoryStrings = categories.length\n    ? categories\n    : getStringsFromChildrenCategories(childComponents, axis);\n  return uniq([...categoryStrings, ...axisStrings].flat());\n}\n\nexport function getStringsFromChildren(props, childComponents) {\n  const children = childComponents || React.Children.toArray(props.children);\n\n  const xStrings = getCategoryAndAxisStringsFromChildren(props, \"x\", children);\n  const yStrings = getCategoryAndAxisStringsFromChildren(props, \"y\", children);\n\n  const dataStrings = getStringsFromData(children);\n\n  return {\n    x: uniq([...xStrings, ...dataStrings.x].flat()),\n    y: uniq([...yStrings, ...dataStrings.y].flat()),\n  };\n}\n\nexport function getCategories(props, childComponents, allStrings?) {\n  const xPropCategories =\n    props.categories && Data.getStringsFromCategories(props, \"x\");\n  const yPropCategories =\n    props.categories && Data.getStringsFromCategories(props, \"y\");\n  const fallbackRequired = !xPropCategories || !yPropCategories;\n\n  const fallbackProps = fallbackRequired\n    ? allStrings || getStringsFromChildren(props, childComponents)\n    : {};\n\n  const xCategories = xPropCategories || fallbackProps.x;\n  const yCategories = yPropCategories || fallbackProps.y;\n\n  return {\n    x: xCategories.length > 0 ? xCategories : undefined,\n    y: yCategories.length > 0 ? yCategories : undefined,\n  };\n}\n"
  },
  {
    "path": "packages/victory-core/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-core/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-create-container/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-create-container/CHANGELOG.md",
    "content": "# victory-create-container\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n### Patch Changes\n\n- Remove deprecated babel-plugin-lodash plugin ([#2965](https://github.com/FormidableLabs/victory/pull/2965))\n\n## 37.3.2\n\n## 37.3.1\n\n### Patch Changes\n\n- update createContainer types to be backwards compatibile ([#2933](https://github.com/FormidableLabs/victory/pull/2933))\n\n## 37.3.0\n\n## 37.2.0\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Refactor containers and portal to function components ([#2799](https://github.com/FormidableLabs/victory/pull/2799))\n\n* Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n## 37.0.1\n\n### Patch Changes\n\n- Fix the signature of class static functions in components ([#2840](https://github.com/FormidableLabs/victory/pull/2840))\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n### Patch Changes\n\n- Replace lodash keys with native code ([#2811](https://github.com/FormidableLabs/victory/pull/2811))\n\n* Replace lodash array utils with native code ([#2810](https://github.com/FormidableLabs/victory/pull/2810))\n\n- Replace lodash isFunction with native code ([#2802](https://github.com/FormidableLabs/victory/pull/2802))\n\n## 36.9.1\n\n## 36.9.0\n\n## 36.8.6\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n## 36.8.4\n\n## 36.8.3\n\n### Patch Changes\n\n- Migrate victory-create-container to TypeScript ([#2731](https://github.com/FormidableLabs/victory/pull/2731))\n\n* Refactor param reassignments ([#2724](https://github.com/FormidableLabs/victory/pull/2724))\n\n## 36.8.2\n\n## 36.8.1\n\n## 36.8.0\n\n## 36.7.0\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- Updated dependencies [[`c5b4f660c`](https://github.com/FormidableLabs/victory/commit/c5b4f660cb91d8d1979d216b846a44f0c5030ec1)]:\n  - victory-zoom-container@36.6.8\n  - victory-brush-container@36.6.8\n  - victory-core@36.6.8\n  - victory-cursor-container@36.6.8\n  - victory-selection-container@36.6.8\n  - victory-voronoi-container@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-brush-container@36.6.7\n  - victory-core@36.6.7\n  - victory-cursor-container@36.6.7\n  - victory-selection-container@36.6.7\n  - victory-voronoi-container@36.6.7\n  - victory-zoom-container@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Updated dependencies [[`6c6764f73`](https://github.com/FormidableLabs/victory/commit/6c6764f734b9655170c75798b7fe1c6d9e63f2a5)]:\n  - victory-brush-container@36.6.6\n  - victory-cursor-container@36.6.6\n  - victory-selection-container@36.6.6\n  - victory-voronoi-container@36.6.6\n  - victory-zoom-container@36.6.6\n  - victory-core@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416), [`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-zoom-container@36.6.5\n  - victory-core@36.6.5\n  - victory-brush-container@36.6.5\n  - victory-cursor-container@36.6.5\n  - victory-selection-container@36.6.5\n  - victory-voronoi-container@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Added explicit `any` type defs (fixes [#2358](https://github.com/FormidableLabs/victory/issues/2358)) ([`57ed0fe30`](https://github.com/FormidableLabs/victory/commit/57ed0fe304dbc8753da1126a02d44de8004e96aa))\n\n* Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n* Updated dependencies [[`57ed0fe30`](https://github.com/FormidableLabs/victory/commit/57ed0fe304dbc8753da1126a02d44de8004e96aa), [`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-selection-container@36.6.4\n  - victory-voronoi-container@36.6.4\n  - victory-zoom-container@36.6.4\n  - victory-core@36.6.4\n  - victory-brush-container@36.6.4\n  - victory-cursor-container@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-brush-container@36.6.3\n  - victory-core@36.6.3\n  - victory-cursor-container@36.6.3\n  - victory-selection-container@36.6.3\n  - victory-voronoi-container@36.6.3\n  - victory-zoom-container@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies [[`877c16923`](https://github.com/FormidableLabs/victory/commit/877c169230c24ab02f570a21dca10a2dce0dcf4e)]:\n  - victory-cursor-container@36.6.2\n  - victory-brush-container@36.6.2\n  - victory-core@36.6.2\n  - victory-selection-container@36.6.2\n  - victory-voronoi-container@36.6.2\n  - victory-zoom-container@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- Updated dependencies [[`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-core@36.6.1\n  - victory-cursor-container@36.6.1\n  - victory-brush-container@36.6.1\n  - victory-selection-container@36.6.1\n  - victory-voronoi-container@36.6.1\n  - victory-zoom-container@36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Update source code with minor lint-based improvements (see [#2236](https://github.com/FormidableLabs/victory/issues/2236)). ([#2403](https://github.com/FormidableLabs/victory/pull/2403))\n\n- Updated dependencies [[`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`f7bf134e5`](https://github.com/FormidableLabs/victory/commit/f7bf134e58bc1660c28f83f0eede3b19048d2656), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-core@36.6.0\n  - victory-brush-container@36.6.0\n  - victory-cursor-container@36.6.0\n  - victory-selection-container@36.6.0\n  - victory-voronoi-container@36.6.0\n  - victory-zoom-container@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-create-container/README.md",
    "content": "# createContainer\n\n`victory-create-container@^30.0.0` exports `createContainer`, `combineContainerMixins` and `makeCreateContainerFunction`\n\nTo view documentation for `createContainer` please see https://commerce.nearform.com/open-source/victory/docs/create-container\n\nTo suggest an addition or correction to this documentation please see https://github.com/FormidableLabs/victory/blob/main/docs/src/content/docs/create-container.md\n"
  },
  {
    "path": "packages/victory-create-container/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-create-container/package.json",
    "content": "{\n  \"name\": \"victory-create-container\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Container Helper for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"lodash\": \"^4.17.19\",\n    \"victory-brush-container\": \"37.3.6\",\n    \"victory-core\": \"37.3.6\",\n    \"victory-cursor-container\": \"37.3.6\",\n    \"victory-selection-container\": \"37.3.6\",\n    \"victory-voronoi-container\": \"37.3.6\",\n    \"victory-zoom-container\": \"37.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-brush-container:build:lib:esm\",\n        \"../victory-core:build:lib:esm\",\n        \"../victory-cursor-container:build:lib:esm\",\n        \"../victory-selection-container:build:lib:esm\",\n        \"../victory-voronoi-container:build:lib:esm\",\n        \"../victory-zoom-container:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-brush-container:build:lib:cjs\",\n        \"../victory-core:build:lib:cjs\",\n        \"../victory-cursor-container:build:lib:cjs\",\n        \"../victory-selection-container:build:lib:cjs\",\n        \"../victory-voronoi-container:build:lib:cjs\",\n        \"../victory-zoom-container:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-brush-container:build:lib:esm\",\n        \"../victory-core:build:lib:esm\",\n        \"../victory-cursor-container:build:lib:esm\",\n        \"../victory-selection-container:build:lib:esm\",\n        \"../victory-voronoi-container:build:lib:esm\",\n        \"../victory-zoom-container:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-brush-container:build:lib:esm\",\n        \"../victory-core:build:lib:esm\",\n        \"../victory-cursor-container:build:lib:esm\",\n        \"../victory-selection-container:build:lib:esm\",\n        \"../victory-voronoi-container:build:lib:esm\",\n        \"../victory-zoom-container:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-brush-container:types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-cursor-container:types:create\",\n        \"../victory-selection-container:types:create\",\n        \"../victory-voronoi-container:types:create\",\n        \"../victory-zoom-container:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-brush-container:types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-cursor-container:types:create\",\n        \"../victory-selection-container:types:create\",\n        \"../victory-voronoi-container:types:create\",\n        \"../victory-zoom-container:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-brush-container:types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-cursor-container:types:create\",\n        \"../victory-selection-container:types:create\",\n        \"../victory-voronoi-container:types:create\",\n        \"../victory-zoom-container:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-brush-container:types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-cursor-container:types:create\",\n        \"../victory-selection-container:types:create\",\n        \"../victory-voronoi-container:types:create\",\n        \"../victory-zoom-container:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-brush-container:build\",\n        \"../victory-core:build\",\n        \"../victory-cursor-container:build\",\n        \"../victory-selection-container:build\",\n        \"../victory-voronoi-container:build\",\n        \"../victory-zoom-container:build\",\n        \"../victory-vendor:build\",\n        \"../victory-voronoi:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-create-container/src/create-container.tsx",
    "content": "import React from \"react\";\nimport forOwn from \"lodash/forOwn\";\nimport groupBy from \"lodash/groupBy\";\nimport isEmpty from \"lodash/isEmpty\";\nimport toPairs from \"lodash/toPairs\";\n\nimport {\n  VictoryZoomContainer,\n  useVictoryZoomContainer,\n} from \"victory-zoom-container\";\n\nimport {\n  VictorySelectionContainer,\n  useVictorySelectionContainer,\n} from \"victory-selection-container\";\n\nimport { VictoryContainer, VictoryContainerProps } from \"victory-core\";\n\nimport {\n  VictoryVoronoiContainer,\n  useVictoryVoronoiContainer,\n} from \"victory-voronoi-container\";\n\nimport {\n  VictoryCursorContainer,\n  useVictoryCursorContainer,\n} from \"victory-cursor-container\";\n\nimport {\n  VictoryBrushContainer,\n  useVictoryBrushContainer,\n} from \"victory-brush-container\";\n\nfunction ensureArray<T>(thing: T): [] | T | T[] {\n  if (!thing) {\n    return [];\n  } else if (!Array.isArray(thing)) {\n    return [thing];\n  }\n  return thing;\n}\n\nconst combineEventHandlers = (eventHandlersArray: any[]) => {\n  // takes an array of event handler objects and produces one eventHandlers object\n  // creates a custom combinedHandler() for events with multiple conflicting handlers\n  return eventHandlersArray.reduce((localHandlers, finalHandlers) => {\n    forOwn(localHandlers, (localHandler, eventName) => {\n      const existingHandler = finalHandlers[eventName];\n      if (existingHandler) {\n        // create new handler for event that concats the existing handler's mutations with new ones\n        finalHandlers[eventName] = function combinedHandler(...params) {\n          // named for debug clarity\n          // sometimes handlers return undefined; use empty array instead, for concat()\n          const existingMutations = ensureArray(existingHandler(...params));\n          const localMutations = ensureArray(localHandler(...params));\n          return existingMutations.concat(localMutations);\n        };\n      } else {\n        finalHandlers[eventName] = localHandler;\n      }\n    });\n    return finalHandlers;\n  });\n};\n\nconst combineDefaultEvents = (defaultEvents: any[]) => {\n  // takes a defaultEvents array and returns one equal or lesser length,\n  // by combining any events that have the same target\n  const eventsByTarget = groupBy(defaultEvents, \"target\");\n  const events = toPairs(eventsByTarget).map(([target, eventsArray]) => {\n    const newEventsArray = eventsArray.filter(Boolean);\n    return isEmpty(newEventsArray)\n      ? null\n      : {\n          target,\n          eventHandlers: combineEventHandlers(\n            eventsArray.map((event) => event.eventHandlers),\n          ),\n          // note: does not currently handle eventKey or childName\n        };\n  });\n  return events.filter(Boolean);\n};\n\nexport type ContainerType =\n  | \"zoom\"\n  | \"selection\"\n  | \"brush\"\n  | \"cursor\"\n  | \"voronoi\";\n\n/**\n * Container hooks are used to provide the container logic to the container components through props and a modified children object\n * - These hooks contain shared logic for both web and Victory Native containers.\n * - In this utility, we call multiple of these hooks with the props returned by the previous to combine the container logic.\n */\nconst CONTAINER_HOOKS = {\n  zoom: useVictoryZoomContainer,\n  selection: useVictorySelectionContainer,\n  brush: useVictoryBrushContainer,\n  cursor: useVictoryCursorContainer,\n  voronoi: useVictoryVoronoiContainer,\n};\n\n/**\n * Container hooks are wrappers that return a VictoryContainer with the props provided by their respective hooks, and the modified children.\n * - These containers are specific to the web. Victory Native has its own container components.\n * - For this utility, we only need the container components to extract the defaultEvents.\n */\nconst CONTAINER_COMPONENTS_WEB = {\n  zoom: VictoryZoomContainer,\n  selection: VictorySelectionContainer,\n  brush: VictoryBrushContainer,\n  cursor: VictoryCursorContainer,\n  voronoi: VictoryVoronoiContainer,\n};\n\ntype ContainerComponents = Record<\n  ContainerType,\n  React.ComponentType<any> & {\n    defaultEvents: (props: any) => any[];\n  }\n>;\n\nexport function makeCreateContainerFunction<\n  TContainerComponents extends ContainerComponents,\n>(\n  containerComponents: TContainerComponents,\n  VictoryContainerBase: typeof VictoryContainer,\n) {\n  type ContainerProps<T extends ContainerType> = React.ComponentProps<\n    TContainerComponents[T]\n  >;\n\n  // Helper type to support backwards compatibility with old types\n  type CombinedContainerProps<A, B> = A extends ContainerType\n    ? B extends ContainerType\n      ? ContainerProps<A> & ContainerProps<B> // New style: infer from container types\n      : A & B // Old style: expect props as generic types\n    : A & B;\n\n  return function combineContainers<\n    TContainerA extends ContainerType | VictoryContainerProps,\n    TContainerB extends ContainerType | VictoryContainerProps,\n  >(\n    containerA: TContainerA extends ContainerType ? TContainerA : ContainerType,\n    containerB: TContainerB extends ContainerType ? TContainerB : ContainerType,\n  ) {\n    const ContainerA = containerComponents[containerA as ContainerType];\n    const ContainerB = containerComponents[containerB as ContainerType];\n    const useContainerA = CONTAINER_HOOKS[containerA as ContainerType];\n    const useContainerB = CONTAINER_HOOKS[containerB as ContainerType];\n\n    const CombinedContainer = (\n      props: CombinedContainerProps<TContainerA, TContainerB>,\n    ) => {\n      const { children: childrenA, props: propsA } = useContainerA(props);\n      const { children: combinedChildren, props: combinedProps } =\n        useContainerB({\n          ...propsA,\n          children: childrenA,\n        });\n\n      return (\n        <VictoryContainerBase {...combinedProps}>\n          {combinedChildren}\n        </VictoryContainerBase>\n      );\n    };\n\n    CombinedContainer.displayName = `Victory${containerA}${containerB}Container`;\n    CombinedContainer.role = \"container\";\n    CombinedContainer.defaultEvents = (\n      props: CombinedContainerProps<TContainerA, TContainerB>,\n    ) =>\n      combineDefaultEvents([\n        ...ContainerA.defaultEvents(props),\n        ...ContainerB.defaultEvents(props),\n      ]);\n\n    return CombinedContainer;\n  };\n}\n\nexport const createContainer = makeCreateContainerFunction(\n  CONTAINER_COMPONENTS_WEB,\n  VictoryContainer,\n);\n"
  },
  {
    "path": "packages/victory-create-container/src/index.ts",
    "content": "export * from \"./create-container\";\n"
  },
  {
    "path": "packages/victory-create-container/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-create-container/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-cursor-container/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-cursor-container/CHANGELOG.md",
    "content": "# victory-cursor-container\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n### Patch Changes\n\n- Fix regression in cursor rendering caused by #2999 ([#3001](https://github.com/FormidableLabs/victory/pull/3001))\n\n## 37.3.3\n\n### Patch Changes\n\n- Remove deprecated babel-plugin-lodash plugin ([#2965](https://github.com/FormidableLabs/victory/pull/2965))\n\n* Improve types in victory-core helpers ([#2999](https://github.com/FormidableLabs/victory/pull/2999))\n\n## 37.3.2\n\n## 37.3.1\n\n## 37.3.0\n\n## 37.2.0\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Refactor containers and portal to function components ([#2799](https://github.com/FormidableLabs/victory/pull/2799))\n\n* Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n## 37.0.1\n\n### Patch Changes\n\n- Fix the signature of class static functions in components ([#2840](https://github.com/FormidableLabs/victory/pull/2840))\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n### Patch Changes\n\n- Replace lodash array utils with native code ([#2810](https://github.com/FormidableLabs/victory/pull/2810))\n\n* Replace lodash values and mapValues with native code ([#2808](https://github.com/FormidableLabs/victory/pull/2808))\n\n- Replace lodash isFunction with native code ([#2802](https://github.com/FormidableLabs/victory/pull/2802))\n\n## 36.9.1\n\n### Patch Changes\n\n- Fix victory-native component prop types ([#2785](https://github.com/FormidableLabs/victory/pull/2785))\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n## 36.8.4\n\n## 36.8.3\n\n## 36.8.2\n\n## 36.8.1\n\n## 36.8.0\n\n## 36.7.0\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Improved the exported types (fixes [#2451](https://github.com/FormidableLabs/victory/issues/2451)) ([#2452](https://github.com/FormidableLabs/victory/pull/2452))\n\n- Updated dependencies []:\n  - victory-core@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-core@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n- Updated dependencies [[`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-core@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-core@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Fixed broken import (fixes [#2426](https://github.com/FormidableLabs/victory/issues/2426)) ([#2427](https://github.com/FormidableLabs/victory/pull/2427))\n\n- Updated dependencies []:\n  - victory-core@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- - Removed Template Literal Types to increase TS compatibility (fixes [#2418](https://github.com/FormidableLabs/victory/issues/2418)) ([#2420](https://github.com/FormidableLabs/victory/pull/2420))\n  - Improved type for `VictoryLabelProps[\"textAnchor\"]` (fixes [#2361](https://github.com/FormidableLabs/victory/issues/2361))\n  - Fixed exported types for `VictoryAxis`, `VictoryBoxPlot`, `VictoryErrorBar`, and `VictoryScatter` (fixes [#2411](https://github.com/FormidableLabs/victory/issues/2411))\n  - Migrate `victory-cursor-container` to TS (fixes [#2402](https://github.com/FormidableLabs/victory/issues/2402))\n- Updated dependencies [[`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-core@36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Update source code with minor lint-based improvements (see [#2236](https://github.com/FormidableLabs/victory/issues/2236)). ([#2403](https://github.com/FormidableLabs/victory/pull/2403))\n\n- Updated dependencies [[`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-core@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-cursor-container/README.md",
    "content": "# VictoryCursorContainer\n\n`victory-cursor-container@^30.0.0` exports `VictoryCursorContainer`, `cursorContainerMixin` and `CursorHelpers`\n\nTo view documentation for `VictoryCursorContainer` please see https://commerce.nearform.com/open-source/victory/docs/victory-cursor-container\n\nTo suggest an addition or correction to this documentation please see https://github.com/FormidableLabs/victory/blob/main/docs/src/content/docs/victory-cursor-container.md\n"
  },
  {
    "path": "packages/victory-cursor-container/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-cursor-container/package.json",
    "content": "{\n  \"name\": \"victory-cursor-container\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Interactive Cursor Component for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"lodash\": \"^4.17.19\",\n    \"victory-core\": \"37.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:build\",\n        \"../victory-vendor:build\",\n        \"../victory-voronoi:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-cursor-container/src/cursor-helpers.tsx",
    "content": "import { Helpers, Selection, SVGCoordinateType } from \"victory-core\";\nimport throttle from \"lodash/throttle\";\n\nconst ON_MOUSE_MOVE_THROTTLE_MS = 16;\n\nclass CursorHelpersClass {\n  getDimension(props) {\n    const { horizontal, cursorDimension } = props;\n    if (!horizontal || !cursorDimension) {\n      return cursorDimension;\n    }\n    return cursorDimension === \"x\" ? \"y\" : \"x\";\n  }\n\n  withinBounds(point, bounds) {\n    const { x1, x2, y1, y2 } = Helpers.mapValues(bounds, Number);\n    const { x, y } = Helpers.mapValues(point, Number);\n    return (\n      x >= Math.min(x1, x2) &&\n      x <= Math.max(x1, x2) &&\n      y >= Math.min(y1, y2) &&\n      y <= Math.max(y1, y2)\n    );\n  }\n\n  private handleMouseMove = (evt, targetProps) => {\n    const { onCursorChange, domain } = targetProps;\n    const cursorDimension = this.getDimension(targetProps);\n    const parentSVG = targetProps.parentSVG || Selection.getParentSVG(evt);\n    const cursorSVGPosition = Selection.getSVGEventCoordinates(evt, parentSVG);\n    let cursorValue: SVGCoordinateType | null = Selection.getDataCoordinates(\n      targetProps,\n      targetProps.scale,\n      cursorSVGPosition.x,\n      cursorSVGPosition.y,\n    );\n\n    const inBounds = this.withinBounds(cursorValue, {\n      x1: domain.x[0],\n      x2: domain.x[1],\n      y1: domain.y[0],\n      y2: domain.y[1],\n    });\n\n    if (!inBounds) {\n      cursorValue = null;\n    }\n\n    if (Helpers.isFunction(onCursorChange)) {\n      if (cursorValue) {\n        const value = cursorDimension\n          ? cursorValue[cursorDimension]\n          : cursorValue;\n        onCursorChange(value, targetProps);\n      } else if (cursorValue !== targetProps.cursorValue) {\n        onCursorChange(targetProps.defaultCursorValue || null, targetProps);\n      }\n    }\n\n    return [\n      {\n        target: \"parent\",\n        eventKey: \"parent\",\n        mutation: () => ({ cursorValue, parentSVG }),\n      },\n    ];\n  };\n\n  onMouseMove = throttle(this.handleMouseMove, ON_MOUSE_MOVE_THROTTLE_MS, {\n    leading: true,\n    trailing: false,\n  });\n\n  onMouseLeave = this.handleMouseMove;\n\n  onTouchEnd = (evt, targetProps) => {\n    const { onCursorChange } = targetProps;\n\n    if (Helpers.isFunction(targetProps.onCursorChange)) {\n      onCursorChange(null, targetProps);\n    }\n\n    return [\n      {\n        target: \"parent\",\n        eventKey: \"parent\",\n        mutation: () => ({ cursorValue: null }),\n      },\n    ];\n  };\n}\n\nexport const CursorHelpers = new CursorHelpersClass();\n\n/* {\n  ...CursorHelpers,\n  onMouseMove: throttle(\n    CursorHelpers.onMouseMove.bind(CursorHelpers),\n    ON_MOUSE_MOVE_THROTTLE_MS,\n    {\n      leading: true,\n      trailing: false,\n    },\n  ),\n  onMouseLeave: CursorHelpers.onMouseMove.bind(CursorHelpers),\n  onTouchEnd: CursorHelpers.onTouchEnd.bind(CursorHelpers),\n};\n\n\n   */\n"
  },
  {
    "path": "packages/victory-cursor-container/src/index.tsx",
    "content": "export * from \"./cursor-helpers\";\nexport * from \"./victory-cursor-container\";\n"
  },
  {
    "path": "packages/victory-cursor-container/src/victory-cursor-container.tsx",
    "content": "import React from \"react\";\nimport {\n  Helpers,\n  VictoryContainerProps,\n  CoordinatesPropType,\n  VictoryLabelProps,\n  ValueOrAccessor,\n  VictoryLabel,\n  LineSegment,\n  VictoryContainer,\n  VictoryEventHandler,\n  DomainTuple,\n  PaddingProps,\n} from \"victory-core\";\nimport defaults from \"lodash/defaults\";\nimport isObject from \"lodash/isObject\";\nimport { CursorHelpers } from \"./cursor-helpers\";\n\nexport type CursorCoordinatesPropType = CoordinatesPropType | number;\n\nexport interface VictoryCursorContainerProps extends VictoryContainerProps {\n  cursorComponent?: React.ReactElement;\n  cursorDimension?: \"x\" | \"y\";\n  cursorLabel?: ValueOrAccessor<VictoryLabelProps[\"text\"]>;\n  cursorLabelComponent?: React.ReactElement;\n  cursorLabelOffset?: CursorCoordinatesPropType;\n  defaultCursorValue?: CursorCoordinatesPropType;\n  disable?: boolean;\n  horizontal?: boolean;\n  padding?: PaddingProps;\n  onCursorChange?: (\n    value: CursorCoordinatesPropType,\n    props: VictoryCursorContainerProps,\n  ) => void;\n}\n\ninterface VictoryCursorContainerMutatedProps\n  extends VictoryCursorContainerProps {\n  cursorValue: CoordinatesPropType | null;\n  domain: { x: DomainTuple; y: DomainTuple };\n}\n\nexport const VICTORY_CURSOR_CONTAINER_DEFAULT_PROPS = {\n  cursorLabelComponent: <VictoryLabel />,\n  cursorLabelOffset: {\n    x: 5,\n    y: -10,\n  },\n  cursorComponent: <LineSegment />,\n};\n\nexport const useVictoryCursorContainer = (\n  initialProps: VictoryCursorContainerProps,\n) => {\n  const props = {\n    ...VICTORY_CURSOR_CONTAINER_DEFAULT_PROPS,\n    ...(initialProps as VictoryCursorContainerMutatedProps),\n  };\n  const { children } = props;\n\n  const getCursorPosition = () => {\n    const { cursorValue, defaultCursorValue, domain, cursorDimension } = props;\n    if (cursorValue) {\n      return cursorValue;\n    }\n\n    if (typeof defaultCursorValue === \"number\") {\n      return {\n        x: ((domain.x[0] as number) + (domain.x[1] as number)) / 2,\n        y: ((domain.y[0] as number) + (domain.y[1] as number)) / 2,\n        ...(cursorDimension ? { [cursorDimension]: defaultCursorValue } : {}),\n      };\n    }\n\n    return defaultCursorValue;\n  };\n\n  const getCursorLabelOffset = () => {\n    const { cursorLabelOffset } = props;\n\n    if (typeof cursorLabelOffset === \"number\") {\n      return {\n        x: cursorLabelOffset,\n        y: cursorLabelOffset,\n      };\n    }\n\n    return cursorLabelOffset;\n  };\n\n  const getPadding = () => {\n    if (props.padding === undefined) {\n      const child = Array.isArray(props.children)\n        ? props.children.find((c: any) => {\n            return isObject(c.props) && c.props.padding !== undefined;\n          })\n        : props.children;\n      return Helpers.getPadding(child?.props?.padding);\n    }\n    return Helpers.getPadding(props.padding);\n  };\n\n  const getCursorElements = () => {\n    const {\n      scale,\n      cursorLabelComponent,\n      cursorLabel,\n      cursorComponent,\n      width,\n      height,\n      name,\n      horizontal,\n      theme,\n    } = props;\n    const cursorDimension = CursorHelpers.getDimension(props);\n    const cursorValue = getCursorPosition();\n    const cursorLabelOffset = getCursorLabelOffset();\n\n    if (!cursorValue) {\n      return [];\n    }\n\n    const newElements: React.ReactElement[] = [];\n    const padding = getPadding();\n    const cursorCoordinates =\n      scale &&\n      \"x\" in scale &&\n      \"y\" in scale &&\n      typeof scale.y === \"function\" &&\n      typeof scale.x === \"function\"\n        ? {\n            x: horizontal ? scale.y(cursorValue.y) : scale.x(cursorValue.x),\n            y: horizontal ? scale.x(cursorValue.x) : scale.y(cursorValue.y),\n          }\n        : {\n            x: cursorValue.x,\n            y: cursorValue.y,\n          };\n    if (cursorLabel) {\n      let labelProps = defaults({ active: true }, cursorLabelComponent.props, {\n        x: cursorCoordinates.x + cursorLabelOffset.x,\n        y: cursorCoordinates.y + cursorLabelOffset.y,\n        datum: cursorValue,\n        active: true,\n        key: `${name}-cursor-label`,\n      });\n      if (Helpers.isTooltip(cursorLabelComponent)) {\n        const tooltipTheme = (theme && theme.tooltip) || {};\n        labelProps = defaults({}, labelProps, tooltipTheme);\n      }\n      newElements.push(\n        React.cloneElement(\n          cursorLabelComponent,\n          defaults({}, labelProps, {\n            text: Helpers.evaluateProp(cursorLabel, labelProps),\n          }),\n        ),\n      );\n    }\n\n    const cursorStyle = Object.assign(\n      { stroke: \"black\" },\n      cursorComponent.props.style,\n    );\n    if (cursorDimension === \"x\" || cursorDimension === undefined) {\n      newElements.push(\n        React.cloneElement(cursorComponent, {\n          key: `${name}-x-cursor`,\n          x1: cursorCoordinates.x,\n          x2: cursorCoordinates.x,\n          y1: padding.top,\n          y2: (typeof height === \"number\" ? height : 0) - padding.bottom,\n          style: cursorStyle,\n        }),\n      );\n    }\n    if (cursorDimension === \"y\" || cursorDimension === undefined) {\n      newElements.push(\n        React.cloneElement(cursorComponent, {\n          key: `${name}-y-cursor`,\n          x1: padding.left,\n          x2: (typeof width === \"number\" ? width : 0) - padding.right,\n          y1: cursorCoordinates.y,\n          y2: cursorCoordinates.y,\n          style: cursorStyle,\n        }),\n      );\n    }\n    return newElements;\n  };\n\n  return {\n    props,\n    children: [\n      ...React.Children.toArray(children),\n      ...getCursorElements(),\n    ] as React.ReactElement[],\n  };\n};\n\nexport const VictoryCursorContainer = (\n  initialProps: VictoryCursorContainerProps,\n) => {\n  const { props, children } = useVictoryCursorContainer(initialProps);\n  return <VictoryContainer {...props}>{children}</VictoryContainer>;\n};\n\nVictoryCursorContainer.role = \"container\";\n\nVictoryCursorContainer.defaultEvents = (\n  initialProps: VictoryCursorContainerProps,\n) => {\n  const props = { ...VICTORY_CURSOR_CONTAINER_DEFAULT_PROPS, ...initialProps };\n  const createEventHandler =\n    (handler: VictoryEventHandler, disabled?: boolean): VictoryEventHandler =>\n    // eslint-disable-next-line max-params\n    (event, targetProps, eventKey, context) =>\n      disabled || props.disable\n        ? {}\n        : handler(event, { ...props, ...targetProps }, eventKey, context);\n\n  return [\n    {\n      target: \"parent\",\n      eventHandlers: {\n        onMouseLeave: createEventHandler(CursorHelpers.onMouseLeave),\n        onMouseMove: createEventHandler(CursorHelpers.onMouseMove),\n        onTouchMove: createEventHandler(CursorHelpers.onMouseMove),\n      },\n    },\n  ];\n};\n"
  },
  {
    "path": "packages/victory-cursor-container/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-cursor-container/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-errorbar/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-errorbar/CHANGELOG.md",
    "content": "# victory-errorbar\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n### Patch Changes\n\n- Remove deprecated babel-plugin-lodash plugin ([#2965](https://github.com/FormidableLabs/victory/pull/2965))\n\n## 37.3.2\n\n## 37.3.1\n\n### Patch Changes\n\n- Remove duplicate types from interfaces ([#2940](https://github.com/FormidableLabs/victory/pull/2940))\n\n## 37.3.0\n\n## 37.2.0\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n### Patch Changes\n\n- Ensure undefined props do not overwrite defaults ([#2852](https://github.com/FormidableLabs/victory/pull/2852))\n\n## 37.0.1\n\n### Patch Changes\n\n- Fix the signature of class static functions in components ([#2840](https://github.com/FormidableLabs/victory/pull/2840))\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n### Patch Changes\n\n- Replace lodash isNil and isNan with native code ([#2800](https://github.com/FormidableLabs/victory/pull/2800))\n\n* Replace lodash isFunction with native code ([#2802](https://github.com/FormidableLabs/victory/pull/2802))\n\n## 36.9.1\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n### Patch Changes\n\n- Migrate victory-native to TypeScript ([#2739](https://github.com/FormidableLabs/victory/pull/2739))\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n* Replace instances of lodash.range with equivalent native code ([#2760](https://github.com/FormidableLabs/victory/pull/2760))\n\n## 36.8.4\n\n## 36.8.3\n\n### Patch Changes\n\n- Refactor param reassignments ([#2724](https://github.com/FormidableLabs/victory/pull/2724))\n\n## 36.8.2\n\n## 36.8.1\n\n## 36.8.0\n\n### Patch Changes\n\n- Remove usage of defaultProps from components ([#2679](https://github.com/FormidableLabs/victory/pull/2679))\n\n## 36.7.0\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-core@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n- Updated dependencies [[`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-core@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-core@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- - Removed Template Literal Types to increase TS compatibility (fixes [#2418](https://github.com/FormidableLabs/victory/issues/2418)) ([#2420](https://github.com/FormidableLabs/victory/pull/2420))\n  - Improved type for `VictoryLabelProps[\"textAnchor\"]` (fixes [#2361](https://github.com/FormidableLabs/victory/issues/2361))\n  - Fixed exported types for `VictoryAxis`, `VictoryBoxPlot`, `VictoryErrorBar`, and `VictoryScatter` (fixes [#2411](https://github.com/FormidableLabs/victory/issues/2411))\n  - Migrate `victory-cursor-container` to TS (fixes [#2402](https://github.com/FormidableLabs/victory/issues/2402))\n- Updated dependencies [[`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-core@36.6.1\n\n## 36.6.0\n\n### Minor Changes\n\n- Migration of victory-errorbar to TypeScript ([#2395](https://github.com/FormidableLabs/victory/pull/2395))\n\n### Patch Changes\n\n- Update source code with minor lint-based improvements (see [#2236](https://github.com/FormidableLabs/victory/issues/2236)). ([#2403](https://github.com/FormidableLabs/victory/pull/2403))\n\n- Updated dependencies [[`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-core@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-errorbar/README.md",
    "content": "# VictoryErrorBar\n\n`victory-errorbar@^30.0.0` exports `VictoryErrorBar` and `ErrorBar` components\n\nTo view documentation for `VictoryErrorBar` please see https://commerce.nearform.com/open-source/victory/docs/victory-error-bar\n\nTo suggest an addition or correction to this documentation please see https://github.com/FormidableLabs/victory/blob/main/docs/src/content/docs/victory-errorbar.md\n"
  },
  {
    "path": "packages/victory-errorbar/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-errorbar/package.json",
    "content": "{\n  \"name\": \"victory-errorbar\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Error Bar Component for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"lodash\": \"^4.17.19\",\n    \"victory-core\": \"37.3.6\"\n  },\n  \"devDependencies\": {\n    \"victory-vendor\": \"*\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:build\",\n        \"../victory-vendor:build\",\n        \"../victory-voronoi:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-errorbar/src/error-bar.test.tsx",
    "content": "import { render } from \"@testing-library/react\";\nimport forEach from \"lodash/forEach\";\nimport omit from \"lodash/omit\";\nimport React from \"react\";\nimport * as d3Scale from \"victory-vendor/d3-scale\";\n\nimport { ErrorBar } from \"./error-bar\";\n\ndescribe(\"victory-primitives/error-bar\", () => {\n  const baseProps = {\n    x: 4,\n    y: 5,\n    errorX: [1, 3],\n    errorY: [0.2, 2],\n    scale: {\n      x: d3Scale.scaleLinear(),\n      y: d3Scale.scaleLinear(),\n    },\n    borderWidth: 20,\n  };\n\n  const compareLineCoordinates = (line, coordinates) => {\n    forEach(coordinates, (coordinateValue, coordinateName) => {\n      expect(parseFloat(line.getAttribute(coordinateName))).toEqual(\n        parseFloat(coordinateValue),\n      );\n    });\n  };\n\n  it(\"should render eight lines\", () => {\n    const { container } = render(<ErrorBar {...baseProps} />, {\n      wrapper: \"svg\" as any,\n    });\n    const lines = container.querySelectorAll(\"line\");\n\n    const expectedCoordinates = [\n      // Right Border (positiveErrorX, positiveErrorX, y - borderWidth, y + borderWidth)\n      { x1: 1, x2: 1, y1: -15, y2: 25 },\n      // Left Border(negativeErrorX, negativeErrorX, y - borderWidth, y + borderWidth)\n      { x1: 3, x2: 3, y1: -15, y2: 25 },\n      // Bottom Border(x - borderWidth, x + borderWidth, negativeErrorY, negativeErrorY)\n      { x1: -16, x2: 24, y1: 0.2, y2: 0.2 },\n      // Top Border(x - borderWidth, x + borderWidth, positiveErrorY, positiveErrorY)\n      { x1: -16, x2: 24, y1: 2, y2: 2 },\n      // Right Cross(x, positiveErrorX, y, y)\n      { x1: 4, x2: 1, y1: 5, y2: 5 },\n      // Left Cross(x, negativeErrorX, y, y)\n      { x1: 4, x2: 3, y1: 5, y2: 5 },\n      // Bottom Cross(x, x, y, negativeErrorY)\n      { x1: 4, x2: 4, y1: 5, y2: 0.2 },\n      // Bottom Cross(x, x, y, positiveErrorY)\n      { x1: 4, x2: 4, y1: 5, y2: 2 },\n    ];\n\n    expect(lines).toHaveLength(8);\n    lines.forEach((line, i) => {\n      compareLineCoordinates(line, expectedCoordinates[i]);\n    });\n  });\n\n  it(\"should render four lines when only x error type is supplied\", () => {\n    const xErrorProps = omit(baseProps, [\"errorY\"]);\n\n    const { container } = render(<ErrorBar {...xErrorProps} />, {\n      wrapper: \"svg\" as any,\n    });\n    const lines = container.querySelectorAll(\"line\");\n\n    const expectedCoordinates = [\n      // Right Border (positiveErrorX, positiveErrorX, y - borderWidth, y + borderWidth)\n      { x1: 1, x2: 1, y1: -15, y2: 25 },\n      // Left Border(negativeErrorX, negativeErrorX, y - borderWidth, y + borderWidth)\n      { x1: 3, x2: 3, y1: -15, y2: 25 },\n      // Right Cross(x, positiveErrorX, y, y)\n      { x1: 4, x2: 1, y1: 5, y2: 5 },\n      // Left Cross(x, negativeErrorX, y, y)\n      { x1: 4, x2: 3, y1: 5, y2: 5 },\n    ];\n\n    expect(lines.length).toEqual(4);\n    lines.forEach((line, i) => {\n      compareLineCoordinates(line, expectedCoordinates[i]);\n    });\n  });\n\n  it(\"should render four lines when only y error type is supplied\", () => {\n    const yErrorProps = omit(baseProps, [\"errorX\"]);\n\n    const { container } = render(<ErrorBar {...yErrorProps} />, {\n      wrapper: \"svg\" as any,\n    });\n    const lines = container.querySelectorAll(\"line\");\n\n    const expectedCoordinates = [\n      // Bottom Border(x - borderWidth, x + borderWidth, negativeErrorY, negativeErrorY)\n      { x1: -16, x2: 24, y1: 0.2, y2: 0.2 },\n      // Top Border(x - borderWidth, x + borderWidth, positiveErrorY, positiveErrorY)\n      { x1: -16, x2: 24, y1: 2, y2: 2 },\n      // Bottom Cross(x, x, y, negativeErrorY)\n      { x1: 4, x2: 4, y1: 5, y2: 0.2 },\n      // Bottom Cross(x, x, y, positiveErrorY)\n      { x1: 4, x2: 4, y1: 5, y2: 2 },\n    ];\n\n    expect(lines.length).toEqual(4);\n    lines.forEach((line, i) => {\n      compareLineCoordinates(line, expectedCoordinates[i]);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-errorbar/src/error-bar.tsx",
    "content": "import React from \"react\";\nimport defaults from \"lodash/defaults\";\n\nimport {\n  Helpers,\n  Line,\n  UserProps,\n  VictoryCommonPrimitiveProps,\n  EventsMixinClass,\n} from \"victory-core\";\n\nconst renderBorder = (props, error, type) => {\n  const vertical = type === \"right\" || type === \"left\";\n  return React.cloneElement(props.lineComponent, {\n    ...props.events,\n    role: props.role,\n    shapeRendering: props.shapeRendering,\n    className: props.className,\n    style: props.style,\n    transform: props.transform,\n    key: `${props.id}-border-${type}`,\n    x1: vertical ? error[type] : props.x - props.borderWidth,\n    x2: vertical ? error[type] : props.x + props.borderWidth,\n    y1: vertical ? props.y - props.borderWidth : error[type],\n    y2: vertical ? props.y + props.borderWidth : error[type],\n    \"data-type\": `border-${type}`,\n  });\n};\n\nconst renderCross = (props, error, type) => {\n  const vertical = type === \"top\" || type === \"bottom\";\n  return React.cloneElement(props.lineComponent, {\n    ...props.events,\n    role: props.role,\n    shapeRendering: props.shapeRendering,\n    className: props.className,\n    style: props.style,\n    transform: props.transform,\n    key: `${props.id}-cross-${type}`,\n    x1: props.x,\n    x2: vertical ? props.x : error[type],\n    y1: props.y,\n    y2: vertical ? error[type] : props.y,\n    \"data-type\": `cross-${type}`,\n  });\n};\n\nconst calculateError = (props) => {\n  const { errorX, errorY } = props;\n  const settings = {\n    right: { error: errorX, errorIndex: 0 },\n    left: { error: errorX, errorIndex: 1 },\n    top: { error: errorY, errorIndex: 1 },\n    bottom: { error: errorY, errorIndex: 0 },\n  };\n\n  const getError = (direction) => {\n    const { error, errorIndex } = settings[direction];\n    return error ? error[errorIndex] : undefined;\n  };\n\n  const result = [\"right\", \"left\", \"top\", \"bottom\"].reduce((memo, dir) => {\n    memo[dir] = getError(dir);\n    return memo;\n  }, {});\n  return result;\n};\n\nconst evaluateProps = (props) => {\n  /**\n   * Potential evaluated props are:\n   * `ariaLabel`\n   * `id`\n   * `style`\n   * `tabIndex`\n   */\n  const ariaLabel = Helpers.evaluateProp(props.ariaLabel, props);\n  const id = Helpers.evaluateProp(props.id, props);\n  const style = Helpers.evaluateStyle(\n    Object.assign({ stroke: \"black\" }, props.style),\n    props,\n  );\n  const tabIndex = Helpers.evaluateProp(props.tabIndex, props);\n\n  return Object.assign({}, props, { ariaLabel, id, style, tabIndex });\n};\n\nexport interface ErrorBarProps extends VictoryCommonPrimitiveProps {\n  borderWidth?: number;\n  datum?: any;\n  errorX?: number | any[] | boolean;\n  errorY?: number | any[] | boolean;\n  groupComponent?: React.ReactElement;\n  lineComponent?: React.ReactElement;\n  x?: number;\n  y?: number;\n}\n\n// ErrorProps for calculateError\nexport interface ErrorProps {\n  right?: { error: any; errorIndex: number };\n  left?: { error: any; errorIndex: number };\n  bottom?: { error: any; errorIndex: number };\n  top?: { error: any; errorIndex: number };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface ErrorBar extends EventsMixinClass<ErrorBarProps> {}\n\nconst defaultProps = {\n  groupComponent: <g />,\n  lineComponent: <Line />,\n  role: \"presentation\",\n  shapeRendering: \"auto\",\n};\n\nexport const ErrorBar = (\n  initialProps: ErrorBarProps & typeof ErrorBar.default,\n) => {\n  const props = evaluateProps(defaults({}, initialProps, defaultProps));\n  const { groupComponent } = props;\n  const userProps = UserProps.getSafeUserProps(props);\n  const { tabIndex, ariaLabel } = props;\n  const error: ErrorProps = calculateError(props);\n  const children = [\n    error.right ? renderBorder(props, error, \"right\") : null,\n    error.left ? renderBorder(props, error, \"left\") : null,\n    error.bottom ? renderBorder(props, error, \"bottom\") : null,\n    error.top ? renderBorder(props, error, \"top\") : null,\n    error.right ? renderCross(props, error, \"right\") : null,\n    error.left ? renderCross(props, error, \"left\") : null,\n    error.bottom ? renderCross(props, error, \"bottom\") : null,\n    error.top ? renderCross(props, error, \"top\") : null,\n  ].filter(Boolean);\n  return React.cloneElement(\n    groupComponent,\n    { tabIndex, \"aria-label\": ariaLabel, ...userProps },\n    children,\n  );\n};\n"
  },
  {
    "path": "packages/victory-errorbar/src/helper-methods.tsx",
    "content": "import assign from \"lodash/assign\";\nimport defaults from \"lodash/defaults\";\nimport {\n  Helpers,\n  LabelHelpers,\n  Scale,\n  Domain,\n  Data,\n  Collection,\n} from \"victory-core\";\n\nconst getErrors = (props, datum, axis) => {\n  /**\n   * check if it is asymmetric error or symmetric error, asymmetric error should be an array\n   * and the first value is the positive error, the second is the negative error\n   * @param  {Boolean} isArray(errorX)\n   * @return {String or Array}\n   */\n\n  const errorNames = { x: \"_errorX\", y: \"_errorY\" };\n  const errors = datum[errorNames[axis]];\n  if (errors === 0) {\n    return false;\n  }\n\n  const scale = props.scale[axis];\n  return Array.isArray(errors)\n    ? [\n        errors[0] === 0 ? false : scale(errors[0] + datum[`_${axis}`]),\n        errors[1] === 0 ? false : scale(datum[`_${axis}`] - errors[1]),\n      ]\n    : [scale(errors + datum[`_${axis}`]), scale(datum[`_${axis}`] - errors)];\n};\n\nexport const getData = (props) => {\n  const accessorTypes = [\"x\", \"y\", \"errorX\", \"errorY\"];\n  if (props.data) {\n    return Data.formatData(props.data, props, accessorTypes);\n  }\n  const generatedData =\n    props.errorX || props.errorY ? Data.generateData(props) : [];\n  return Data.formatData(generatedData, props, accessorTypes);\n};\n\nconst getDomainFromData = (props, axis) => {\n  const minDomain = Domain.getMinFromProps(props, axis);\n  const maxDomain = Domain.getMaxFromProps(props, axis);\n  const dataset = getData(props);\n  if (dataset.length < 1) {\n    return minDomain !== undefined && maxDomain !== undefined\n      ? Domain.getDomainFromMinMax(minDomain, maxDomain)\n      : undefined;\n  }\n  const error = axis === \"x\" ? \"_errorX\" : \"_errorY\";\n  const reduceErrorData = (type) => {\n    const baseCondition = type === \"min\" ? Infinity : -Infinity;\n    const errorIndex = type === \"min\" ? 1 : 0;\n    const sign = type === \"min\" ? -1 : 1;\n    return dataset.reduce((memo, datum) => {\n      const currentError = Array.isArray(datum[error])\n        ? datum[error][errorIndex]\n        : datum[error];\n      const current = datum[`_${axis}`] + sign * (currentError || 0);\n      return (memo < current && type === \"min\") ||\n        (memo > current && type === \"max\")\n        ? memo\n        : current;\n    }, baseCondition);\n  };\n\n  const min = minDomain !== undefined ? minDomain : reduceErrorData(\"min\");\n  const max = maxDomain !== undefined ? maxDomain : reduceErrorData(\"max\");\n  return Domain.getDomainFromMinMax(min, max);\n};\n\nexport const getDomain = (props, axis) => {\n  return Domain.createDomainFunction(getDomainFromData)(props, axis);\n};\n\n// This method will edit or remove errorbar data points that fall outside of the desired domain\nconst formatDataFromDomain = (datum, domain) => {\n  const minDomainX = Collection.getMinValue(domain.x);\n  const maxDomainX = Collection.getMaxValue(domain.x);\n  const minDomainY = Collection.getMinValue(domain.y);\n  const maxDomainY = Collection.getMaxValue(domain.y);\n  let { _x, _y } = datum;\n\n  // if either x or y center point is outside of the domain, null the entire data point\n  if (_x < minDomainX || _x > maxDomainX || _y < minDomainY || _y > maxDomainY)\n    _x = _y = null;\n\n  return Object.assign({}, datum, { _x, _y });\n};\n\nconst getCalculatedValues = (props) => {\n  const defaultStyles = Helpers.getDefaultStyles(props, \"errorbar\");\n  const style = Helpers.getStyles(props.style, defaultStyles) || {};\n  const data = getData(props);\n  const range = {\n    x: Helpers.getRange(props, \"x\"),\n    y: Helpers.getRange(props, \"y\"),\n  };\n  const domain = {\n    x: getDomain(props, \"x\"),\n    y: getDomain(props, \"y\"),\n  };\n  const scale = {\n    x: Scale.getBaseScale(props, \"x\")\n      .domain(domain.x)\n      .range(props.horizontal ? range.y : range.x),\n    y: Scale.getBaseScale(props, \"y\")\n      .domain(domain.y)\n      .range(props.horizontal ? range.x : range.y),\n  };\n  const origin = props.polar\n    ? props.origin || Helpers.getPolarOrigin(props)\n    : undefined;\n  return { domain, data, scale, style, origin };\n};\n\nconst getLabelProps = (dataProps, text, style) => {\n  const {\n    x,\n    y,\n    index,\n    scale,\n    errorY,\n    errorX,\n    horizontal,\n    labelComponent,\n    theme,\n    disableInlineStyles,\n  } = dataProps;\n  const getError = (type = \"x\") => {\n    const baseError = type === \"y\" ? errorY : errorX;\n    const error =\n      baseError && Array.isArray(baseError) ? baseError[0] : baseError;\n    return error || dataProps[type];\n  };\n  const labelStyle = style.labels || {};\n  const padding = labelStyle.padding || 0;\n  const textAnchor = horizontal ? \"start\" : \"middle\";\n  const verticalAnchor = horizontal ? \"middle\" : \"end\";\n  const labelProps = {\n    style: labelStyle,\n    y: horizontal ? y : getError(\"y\"),\n    x: horizontal ? getError(\"x\") : x,\n    dy: horizontal ? 0 : -padding,\n    dx: horizontal ? padding : 0,\n    text,\n    index,\n    scale,\n    datum: dataProps.datum,\n    data: dataProps.data,\n    textAnchor: labelStyle.textAnchor || textAnchor,\n    verticalAnchor: labelStyle.verticalAnchor || verticalAnchor,\n    angle: labelStyle.angle,\n    horizontal,\n    disableInlineStyles,\n  };\n\n  if (!Helpers.isTooltip(labelComponent)) {\n    return labelProps;\n  }\n  const tooltipTheme = (theme && theme.tooltip) || {};\n  return defaults({}, labelProps, Helpers.omit(tooltipTheme, [\"style\"]));\n};\n\nexport const getBaseProps = (initialProps, fallbackProps) => {\n  const modifiedProps = Helpers.modifyProps(\n    initialProps,\n    fallbackProps,\n    \"errorbar\",\n  );\n  const props = Object.assign(\n    {},\n    modifiedProps,\n    getCalculatedValues(modifiedProps),\n  );\n  const {\n    borderWidth,\n    data,\n    domain,\n    events,\n    groupComponent,\n    height,\n    horizontal,\n    labels,\n    name,\n    origin,\n    padding,\n    polar,\n    scale,\n    sharedEvents,\n    standalone,\n    style,\n    theme,\n    width,\n    disableInlineStyles,\n  } = props;\n  const initialChildProps = {\n    parent: {\n      data,\n      domain,\n      height,\n      horizontal,\n      name,\n      origin,\n      padding,\n      polar,\n      scale,\n      standalone,\n      style: style.parent,\n      theme,\n      width,\n    },\n  };\n  const DEFAULT_BORDER_WIDTH = 8;\n\n  return data.reduce((childProps, datum, index) => {\n    const eventKey = !Helpers.isNil(datum.eventKey) ? datum.eventKey : index;\n    const { x, y } = Helpers.scalePoint(assign({}, props, { scale }), datum);\n    const formattedDatum = formatDataFromDomain(datum, domain);\n    const errorX = getErrors(props, formattedDatum, \"x\");\n    const errorY = getErrors(props, formattedDatum, \"y\");\n    const dataProps = {\n      borderWidth: borderWidth ? borderWidth : DEFAULT_BORDER_WIDTH,\n      data,\n      datum: formattedDatum,\n      errorX: horizontal ? errorY : errorX,\n      errorY: horizontal ? errorX : errorY,\n      groupComponent,\n      horizontal,\n      index,\n      scale,\n      style: disableInlineStyles ? {} : style.data,\n      x,\n      y,\n      disableInlineStyles,\n    };\n\n    childProps[eventKey] = {\n      data: dataProps,\n    };\n    const text = LabelHelpers.getText(props, datum, index);\n    if (\n      (text !== undefined && text !== null) ||\n      (labels && (events || sharedEvents))\n    ) {\n      childProps[eventKey].labels = getLabelProps(\n        Object.assign({}, props, dataProps),\n        text,\n        style,\n      );\n    }\n\n    return childProps;\n  }, initialChildProps);\n};\n"
  },
  {
    "path": "packages/victory-errorbar/src/index.ts",
    "content": "export * from \"./victory-errorbar\";\nexport * from \"./error-bar\";\n"
  },
  {
    "path": "packages/victory-errorbar/src/victory-errorbar.tsx",
    "content": "import React from \"react\";\nimport {\n  Helpers,\n  VictoryLabel,\n  addEvents,\n  VictoryContainer,\n  VictoryTheme,\n  DefaultTransitions,\n  UserProps,\n  EventPropTypeInterface,\n  StringOrNumberOrCallback,\n  StringOrNumberOrList,\n  VictoryDatableProps,\n  VictoryCommonProps,\n  VictoryMultiLabelableProps,\n  VictoryStyleInterface,\n  EventsMixinClass,\n} from \"victory-core\";\nimport { ErrorBar } from \"./error-bar\";\nimport { getBaseProps, getDomain, getData } from \"./helper-methods\";\n\nconst fallbackProps = {\n  width: 450,\n  height: 300,\n  padding: 50,\n};\n\nconst defaultData = [\n  { x: 1, y: 1, errorX: 0.1, errorY: 0.1 },\n  { x: 2, y: 2, errorX: 0.2, errorY: 0.2 },\n  { x: 3, y: 3, errorX: 0.3, errorY: 0.3 },\n  { x: 4, y: 4, errorX: 0.4, errorY: 0.4 },\n];\n\nexport type VictoryErrorBarTTargetType = \"data\" | \"labels\" | \"parent\";\nexport type ErrorType =\n  | StringOrNumberOrList\n  | ((...args: any[]) => StringOrNumberOrList);\n\nexport interface VictoryErrorBarProps\n  extends Omit<VictoryCommonProps, \"polar\">,\n    VictoryDatableProps,\n    VictoryMultiLabelableProps {\n  borderWidth?: number;\n  errorX?: ErrorType;\n  errorY?: ErrorType;\n  events?: EventPropTypeInterface<\n    VictoryErrorBarTTargetType,\n    StringOrNumberOrCallback\n  >[];\n  style?: VictoryStyleInterface;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface VictoryErrorBarBase extends EventsMixinClass<VictoryErrorBarProps> {}\n\nclass VictoryErrorBarBase extends React.Component<VictoryErrorBarProps> {\n  static animationWhitelist = [\n    \"data\",\n    \"domain\",\n    \"height\",\n    \"padding\",\n    \"samples\",\n    \"style\",\n    \"width\",\n    \"errorX\",\n    \"errorY\",\n    \"borderWidth\",\n  ];\n\n  static displayName = \"VictoryErrorBar\";\n  static role = \"errorbar\";\n  static defaultTransitions = DefaultTransitions.discreteTransitions();\n\n  static defaultProps: VictoryErrorBarProps = {\n    containerComponent: <VictoryContainer />,\n    data: defaultData,\n    dataComponent: <ErrorBar />,\n    labelComponent: <VictoryLabel />,\n    groupComponent: <g role=\"presentation\" />,\n    samples: 50,\n    sortOrder: \"ascending\",\n    standalone: true,\n    theme: VictoryTheme.grayscale,\n  };\n\n  static getDomain(props, axis) {\n    return getDomain(props, axis);\n  }\n  static getData(props) {\n    return getData(props);\n  }\n  static getBaseProps(props) {\n    return getBaseProps(props, fallbackProps);\n  }\n  static expectedComponents = [\n    \"dataComponent\",\n    \"labelComponent\",\n    \"groupComponent\",\n    \"containerComponent\",\n  ];\n\n  // Overridden in native versions\n  shouldAnimate() {\n    return !!this.props.animate;\n  }\n\n  render(): React.ReactElement {\n    const { animationWhitelist, role } = VictoryErrorBar;\n    const props = Helpers.modifyProps(this.props, fallbackProps, role);\n\n    if (this.shouldAnimate()) {\n      return this.animateComponent(props, animationWhitelist);\n    }\n\n    const children = this.renderData(props);\n\n    const component = props.standalone\n      ? this.renderContainer(props.containerComponent, children)\n      : children;\n\n    return UserProps.withSafeUserProps(component, props);\n  }\n}\n\nexport const VictoryErrorBar = addEvents(VictoryErrorBarBase);\n"
  },
  {
    "path": "packages/victory-errorbar/src/victory-errorbars.test.tsx",
    "content": "import React from \"react\";\nimport { fireEvent, render, screen } from \"@testing-library/react\";\nimport { fromJS } from \"immutable\";\nimport { Helpers } from \"victory-core\";\nimport * as d3Scale from \"victory-vendor/d3-scale\";\n\nimport { ErrorBar } from \"./error-bar\";\nimport { VictoryErrorBar } from \"./victory-errorbar\";\n\nconst defaultProps = {\n  dataComponent: (\n    <ErrorBar\n      data-testid=\"error-bar\"\n      data-x={(props) => props.datum._x}\n      data-y={(props) => props.datum._y}\n    />\n  ),\n};\n\nconst getCoordinatesForLineWithType = (node, type) => {\n  const line = node.querySelector(`line[data-type=\"${type}\"]`);\n  return [\"x1\", \"x2\", \"y1\", \"y2\"].map((attr) =>\n    parseFloat(line.getAttribute(attr)),\n  );\n};\n\ndescribe(\"components/victory-errorbar\", () => {\n  describe(\"default component rendering\", () => {\n    it(\"accepts user props\", () => {\n      render(\n        <VictoryErrorBar data-testid=\"victory-errorbar\" aria-label=\"Chart\" />,\n      );\n\n      expect(screen.getByTestId(\"victory-errorbar\")).toBeDefined();\n      expect(screen.getByLabelText(\"Chart\")).toBeDefined();\n    });\n\n    it(\"renders an svg with the correct width and height\", () => {\n      const { container } = render(<VictoryErrorBar />);\n      const svg = container.querySelector(\"svg\");\n      expect(svg!.style.width).toEqual(\"100%\");\n      expect(svg!.style.height).toEqual(\"100%\");\n    });\n\n    it(\"renders an svg with the correct viewBox\", () => {\n      const { container } = render(<VictoryErrorBar />);\n      const svg = container.querySelector(\"svg\");\n      const viewBoxValue = `0 0 ${450} ${300}`;\n      expect(svg!.getAttribute(\"viewBox\")).toEqual(viewBoxValue);\n    });\n\n    it(\"renders 4 errors\", () => {\n      render(<VictoryErrorBar {...defaultProps} />);\n      const errorbars = screen.getAllByTestId(\"error-bar\");\n      expect(errorbars.length).toEqual(4);\n    });\n  });\n\n  it(\"does not render data with null x or y values\", () => {\n    const data = [\n      { x: 15, y: 35, errorX: 1, errorY: 3 },\n      { x: null, y: 42, errorX: 3, errorY: 2 },\n      { x: 25, y: null, errorX: 5, errorY: 5 },\n    ];\n    render(<VictoryErrorBar data={data} {...defaultProps} />);\n    expect(screen.getAllByTestId(\"error-bar\")).toHaveLength(1);\n  });\n\n  const immutableRenderDataTest = {\n    createData: (x) => fromJS(x),\n    testLabel: \"with immutable data\",\n  };\n  const renderDataTest = {\n    createData: (x) => x,\n    testLabel: \"with js data\",\n  };\n\n  [renderDataTest, immutableRenderDataTest].forEach(\n    ({ createData, testLabel }) => {\n      describe(`symmetric error, rendering data ${testLabel}`, () => {\n        it(\"renders injected errors for {x, y}\", () => {\n          const data = createData(\n            Helpers.range(10).map((i) => ({\n              x: i,\n              y: i,\n              errorX: 0.1,\n              errorY: 0.2,\n            })),\n          );\n          render(<VictoryErrorBar data={data} {...defaultProps} />);\n\n          const errors = screen.getAllByTestId(\"error-bar\");\n          expect(errors).toHaveLength(10);\n        });\n\n        it(\"renders errors for {x, y}\", () => {\n          const data = createData(\n            Helpers.range(10).map((i) => ({\n              x: i,\n              y: i,\n              errorX: 0.1,\n              errorY: 0.2,\n            })),\n          );\n          render(<VictoryErrorBar data={data} {...defaultProps} />);\n          const errors = screen.getAllByTestId(\"error-bar\");\n          expect(errors.length).toEqual(10);\n        });\n\n        it(\"sorts data by sortKey getAttribute\", () => {\n          const data = createData(\n            Helpers.range(5)\n              .map((i) => ({ x: i, y: i, errorX: 0.1, errorY: 0.2 }))\n              .reverse(),\n          );\n          render(<VictoryErrorBar data={data} sortKey=\"x\" {...defaultProps} />);\n          const xValues = screen\n            .getAllByTestId(\"error-bar\")\n            .map((node) => parseInt(node.getAttribute(\"data-x\")!));\n          expect(xValues).toEqual([0, 1, 2, 3, 4]);\n        });\n\n        it(\"reversed sorted data with the sortOrder getAttribute\", () => {\n          const data = createData(\n            Helpers.range(5)\n              .map((i) => ({ x: i, y: i, errorX: 0.1, errorY: 0.2 }))\n              .reverse(),\n          );\n          render(\n            <VictoryErrorBar\n              data={data}\n              sortKey=\"x\"\n              sortOrder=\"descending\"\n              {...defaultProps}\n            />,\n          );\n          const yValues = screen\n            .getAllByTestId(\"error-bar\")\n            .map((node) => parseInt(node.getAttribute(\"data-y\")!));\n          expect(yValues).toEqual([4, 3, 2, 1, 0]);\n        });\n\n        it(\"renders errors with error bars, check total svg lines\", () => {\n          const svgDimensions = { width: 350, height: 200, padding: 75 };\n          const { container } = render(\n            <VictoryErrorBar\n              data={createData([\n                { x: 0, y: 0, errorX: 0.1, errorY: 0.2 },\n                { x: 2, y: 3, errorX: 0.1, errorY: 0.2 },\n                { x: 5, y: 5, errorX: 0.1, errorY: 0.2 },\n              ])}\n              {...svgDimensions}\n            />,\n          );\n          expect(container.querySelectorAll(\"line\")).toHaveLength(24);\n        });\n\n        it(\"should check right border of error bars positions\", () => {\n          const svgDimensions = { width: 350, height: 200, padding: 75 };\n          const borderWidth = 10;\n          const data = [\n            { x: 0, y: 0, errorX: 0.1, errorY: 0.2 },\n            { x: 2, y: 3, errorX: 0.1, errorY: 0.2 },\n            { x: 5, y: 5, errorX: 0.1, errorY: 0.2 },\n          ];\n          render(\n            <VictoryErrorBar\n              data={createData(data)}\n              borderWidth={borderWidth}\n              name=\"error\"\n              {...svgDimensions}\n              {...defaultProps}\n            />,\n          );\n\n          const xScale = d3Scale\n            .scaleLinear()\n            .domain([-0.1, 5.1])\n            .range([\n              svgDimensions.padding,\n              svgDimensions.width - svgDimensions.padding,\n            ]);\n\n          const yScale = d3Scale\n            .scaleLinear()\n            .domain([-0.2, 5.2])\n            .range([\n              svgDimensions.height - svgDimensions.padding,\n              svgDimensions.padding,\n            ]);\n\n          const bars = screen.getAllByTestId(\"error-bar\");\n          bars.forEach((node, i) => {\n            const errorX = xScale(data[i].x + data[i].errorX);\n            const xScaleMax = xScale.range()[1];\n            const positiveErrorX = errorX >= xScaleMax ? xScaleMax : errorX;\n\n            const [x1, x2, y1, y2] = getCoordinatesForLineWithType(\n              node,\n              \"border-right\",\n            );\n            expect(x1).toEqual(positiveErrorX);\n            expect(x2).toEqual(positiveErrorX);\n            expect(y1).toEqual(yScale(data[i].y) - borderWidth);\n            expect(y2).toEqual(yScale(data[i].y) + borderWidth);\n          });\n        });\n\n        it(\"should check left border of error bars positions\", () => {\n          const svgDimensions = { width: 350, height: 200, padding: 75 };\n          const borderWidth = 10;\n          const data = [\n            { x: 0, y: 0, errorX: 0.1, errorY: 0.2 },\n            { x: 2, y: 3, errorX: 0.1, errorY: 0.2 },\n            { x: 5, y: 5, errorX: 0.1, errorY: 0.2 },\n          ];\n          render(\n            <VictoryErrorBar\n              data={createData(data)}\n              borderWidth={borderWidth}\n              {...svgDimensions}\n              {...defaultProps}\n            />,\n          );\n\n          const xScale = d3Scale\n            .scaleLinear()\n            .domain([-0.1, 5.1])\n            .range([\n              svgDimensions.padding,\n              svgDimensions.width - svgDimensions.padding,\n            ]);\n\n          const yScale = d3Scale\n            .scaleLinear()\n            .domain([-0.2, 5.2])\n            .range([\n              svgDimensions.height - svgDimensions.padding,\n              svgDimensions.padding,\n            ]);\n\n          const bars = screen.getAllByTestId(\"error-bar\");\n          bars.forEach((node, i) => {\n            const errorX = xScale(data[i].x - data[i].errorX);\n            const xScaleMin = xScale.range()[0];\n            const negativeErrorX = errorX <= xScaleMin ? xScaleMin : errorX;\n\n            const [x1, x2, y1, y2] = getCoordinatesForLineWithType(\n              node,\n              \"border-left\",\n            );\n            expect(x1).toEqual(negativeErrorX);\n            expect(x2).toEqual(negativeErrorX);\n            expect(y1).toEqual(yScale(data[i].y) - borderWidth);\n            expect(y2).toEqual(yScale(data[i].y) + borderWidth);\n          });\n        });\n\n        it(\"should check bottom border of error bars positions\", () => {\n          const svgDimensions = { width: 350, height: 200, padding: 75 };\n          const borderWidth = 10;\n          const data = [\n            { x: 0, y: 0, errorX: 0.1, errorY: 0.2 },\n            { x: 2, y: 3, errorX: 0.1, errorY: 0.2 },\n            { x: 5, y: 5, errorX: 0.1, errorY: 0.2 },\n          ];\n          render(\n            <VictoryErrorBar\n              data={createData(data)}\n              borderWidth={borderWidth}\n              {...svgDimensions}\n              {...defaultProps}\n            />,\n          );\n\n          const xScale = d3Scale\n            .scaleLinear()\n            .domain([-0.1, 5.1])\n            .range([\n              svgDimensions.padding,\n              svgDimensions.width - svgDimensions.padding,\n            ]);\n\n          const yScale = d3Scale\n            .scaleLinear()\n            .domain([-0.2, 5.2])\n            .range([\n              svgDimensions.height - svgDimensions.padding,\n              svgDimensions.padding,\n            ]);\n\n          const bars = screen.getAllByTestId(\"error-bar\");\n          bars.forEach((node, i) => {\n            const errorY = yScale(data[i].y + data[i].errorY);\n            const yScaleMin = yScale.range()[1];\n            const negativeErrorY = errorY <= yScaleMin ? yScaleMin : errorY;\n\n            const [x1, x2, y1, y2] = getCoordinatesForLineWithType(\n              node,\n              \"border-bottom\",\n            );\n\n            expect(x1).toEqual(xScale(data[i].x) - borderWidth);\n            expect(x2).toEqual(xScale(data[i].x) + borderWidth);\n            expect(y1).toEqual(negativeErrorY);\n            expect(y2).toEqual(negativeErrorY);\n          });\n        });\n\n        it(\"should check top border of error bars positions\", () => {\n          const svgDimensions = { width: 350, height: 200, padding: 75 };\n          const borderWidth = 10;\n          const data = [\n            { x: 0, y: 0, errorX: 0.1, errorY: 0.2 },\n            { x: 2, y: 3, errorX: 0.1, errorY: 0.2 },\n            { x: 5, y: 5, errorX: 0.1, errorY: 0.2 },\n          ];\n          render(\n            <VictoryErrorBar\n              data={createData(data)}\n              borderWidth={borderWidth}\n              {...svgDimensions}\n              {...defaultProps}\n            />,\n          );\n\n          const xScale = d3Scale\n            .scaleLinear()\n            .domain([-0.1, 5.1])\n            .range([\n              svgDimensions.padding,\n              svgDimensions.width - svgDimensions.padding,\n            ]);\n\n          const yScale = d3Scale\n            .scaleLinear()\n            .domain([-0.2, 5.2])\n            .range([\n              svgDimensions.height - svgDimensions.padding,\n              svgDimensions.padding,\n            ]);\n\n          const bars = screen.getAllByTestId(\"error-bar\");\n          expect(bars).toHaveLength(3);\n          bars.forEach((node, i) => {\n            const errorY = yScale(data[i].y - data[i].errorY);\n            const yScaleMax = yScale.range()[0];\n            const positiveErrorY = errorY >= yScaleMax ? yScaleMax : errorY;\n\n            const [x1, x2, y1, y2] = getCoordinatesForLineWithType(\n              node,\n              \"border-top\",\n            );\n\n            expect(x1).toEqual(xScale(data[i].x) - borderWidth);\n            expect(x2).toEqual(xScale(data[i].x) + borderWidth);\n            expect(y1).toEqual(positiveErrorY);\n            expect(y2).toEqual(positiveErrorY);\n          });\n        });\n\n        it(\"should check top cross line of error bars positions\", () => {\n          const svgDimensions = { width: 350, height: 200, padding: 75 };\n          const data = [\n            { x: 0, y: 0, errorX: 0.1, errorY: 0.2 },\n            { x: 2, y: 3, errorX: 0.1, errorY: 0.2 },\n            { x: 5, y: 5, errorX: 0.1, errorY: 0.2 },\n          ];\n          render(\n            <VictoryErrorBar\n              data={createData(data)}\n              {...svgDimensions}\n              {...defaultProps}\n            />,\n          );\n\n          const xScale = d3Scale\n            .scaleLinear()\n            .domain([-0.1, 5.1])\n            .range([\n              svgDimensions.padding,\n              svgDimensions.width - svgDimensions.padding,\n            ]);\n\n          const yScale = d3Scale\n            .scaleLinear()\n            .domain([-0.2, 5.2])\n            .range([\n              svgDimensions.height - svgDimensions.padding,\n              svgDimensions.padding,\n            ]);\n\n          const bars = screen.getAllByTestId(\"error-bar\");\n          expect(bars).toHaveLength(3);\n          bars.forEach((node, i) => {\n            const errorY = yScale(data[i].y - data[i].errorY);\n            const yScaleMax = yScale.range()[0];\n            const positiveErrorY = errorY >= yScaleMax ? yScaleMax : errorY;\n\n            const [x1, x2, y1, y2] = getCoordinatesForLineWithType(\n              node,\n              \"cross-top\",\n            );\n\n            expect(x1).toEqual(xScale(data[i].x));\n            expect(x2).toEqual(xScale(data[i].x));\n            expect(y1).toEqual(yScale(data[i].y));\n            expect(y2).toEqual(positiveErrorY);\n          });\n        });\n\n        it(\"should check bottom cross line of error bars positions\", () => {\n          const svgDimensions = { width: 350, height: 200, padding: 75 };\n          const data = [\n            { x: 0, y: 0, errorX: 0.1, errorY: 0.2 },\n            { x: 2, y: 3, errorX: 0.1, errorY: 0.2 },\n            { x: 5, y: 5, errorX: 0.1, errorY: 0.2 },\n          ];\n          render(\n            <VictoryErrorBar\n              data={createData(data)}\n              {...svgDimensions}\n              {...defaultProps}\n            />,\n          );\n\n          const xScale = d3Scale\n            .scaleLinear()\n            .domain([-0.1, 5.1])\n            .range([\n              svgDimensions.padding,\n              svgDimensions.width - svgDimensions.padding,\n            ]);\n\n          const yScale = d3Scale\n            .scaleLinear()\n            .domain([-0.2, 5.2])\n            .range([\n              svgDimensions.height - svgDimensions.padding,\n              svgDimensions.padding,\n            ]);\n\n          const bars = screen.getAllByTestId(\"error-bar\");\n          expect(bars).toHaveLength(3);\n          bars.forEach((node, i) => {\n            const errorY = yScale(data[i].y + data[i].errorY);\n            const yScaleMin = yScale.range()[1];\n            const negativeErrorY = errorY <= yScaleMin ? yScaleMin : errorY;\n\n            const [x1, x2, y1, y2] = getCoordinatesForLineWithType(\n              node,\n              \"cross-bottom\",\n            );\n\n            expect(x1).toEqual(xScale(data[i].x));\n            expect(x2).toEqual(xScale(data[i].x));\n            expect(y1).toEqual(yScale(data[i].y));\n            expect(y2).toEqual(negativeErrorY);\n          });\n        });\n\n        it(\"should check left cross line of error bars positions\", () => {\n          const svgDimensions = { width: 350, height: 200, padding: 75 };\n          const data = [\n            { x: 0, y: 0, errorX: 0.1, errorY: 0.2 },\n            { x: 2, y: 3, errorX: 0.1, errorY: 0.2 },\n            { x: 5, y: 5, errorX: 0.1, errorY: 0.2 },\n          ];\n          render(\n            <VictoryErrorBar\n              data={createData(data)}\n              {...svgDimensions}\n              {...defaultProps}\n            />,\n          );\n\n          const xScale = d3Scale\n            .scaleLinear()\n            .domain([-0.1, 5.1])\n            .range([\n              svgDimensions.padding,\n              svgDimensions.width - svgDimensions.padding,\n            ]);\n\n          const yScale = d3Scale\n            .scaleLinear()\n            .domain([-0.2, 5.2])\n            .range([\n              svgDimensions.height - svgDimensions.padding,\n              svgDimensions.padding,\n            ]);\n\n          const bars = screen.getAllByTestId(\"error-bar\");\n          expect(bars).toHaveLength(3);\n          bars.forEach((node, i) => {\n            const errorX = xScale(data[i].x - data[i].errorX);\n            const xScaleMin = xScale.range()[0];\n            const negativeErrorX = errorX <= xScaleMin ? xScaleMin : errorX;\n\n            const [x1, x2, y1, y2] = getCoordinatesForLineWithType(\n              node,\n              \"cross-left\",\n            );\n\n            expect(x1).toEqual(xScale(data[i].x));\n            expect(x2).toEqual(negativeErrorX);\n            expect(y1).toEqual(yScale(data[i].y));\n            expect(y2).toEqual(yScale(data[i].y));\n          });\n        });\n\n        it(\"should check right cross line of error bars positions\", () => {\n          const svgDimensions = { width: 350, height: 200, padding: 75 };\n          const data = [\n            { x: 0, y: 0, errorX: 0.1, errorY: 0.2 },\n            { x: 2, y: 3, errorX: 0.1, errorY: 0.2 },\n            { x: 5, y: 5, errorX: 0.1, errorY: 0.2 },\n          ];\n          render(\n            <VictoryErrorBar\n              data={createData(data)}\n              {...svgDimensions}\n              {...defaultProps}\n            />,\n          );\n\n          const xScale = d3Scale\n            .scaleLinear()\n            .domain([-0.1, 5.1])\n            .range([\n              svgDimensions.padding,\n              svgDimensions.width - svgDimensions.padding,\n            ]);\n\n          const yScale = d3Scale\n            .scaleLinear()\n            .domain([-0.2, 5.2])\n            .range([\n              svgDimensions.height - svgDimensions.padding,\n              svgDimensions.padding,\n            ]);\n\n          const bars = screen.getAllByTestId(\"error-bar\");\n          expect(bars).toHaveLength(3);\n          bars.forEach((node, i) => {\n            const errorX = xScale(data[i].errorX + data[i].x);\n            const xScaleMax = xScale.range()[1];\n            const positiveErrorX = errorX >= xScaleMax ? xScaleMax : errorX;\n\n            const [x1, x2, y1, y2] = getCoordinatesForLineWithType(\n              node,\n              \"cross-right\",\n            );\n            expect(x1).toEqual(xScale(data[i].x));\n            expect(x2).toEqual(positiveErrorX);\n            expect(y1).toEqual(yScale(data[i].y));\n            expect(y2).toEqual(yScale(data[i].y));\n          });\n        });\n      });\n\n      describe(`asymmetric error, rendering data ${testLabel}`, () => {\n        it(\"renders injected errors for {x, y}\", () => {\n          const data = createData(\n            Helpers.range(10).map((i) => ({\n              x: i,\n              y: i,\n              errorX: [0.1, 0.2],\n              errorY: [0.2, 0.5],\n            })),\n          );\n          render(<VictoryErrorBar data={data} {...defaultProps} />);\n\n          const errors = screen.getAllByTestId(\"error-bar\");\n          expect(errors).toHaveLength(10);\n        });\n\n        it(\"renders errors for {x, y}\", () => {\n          const data = createData(\n            Helpers.range(10).map((i) => ({\n              x: i,\n              y: i,\n              errorX: [0.1, 0.2],\n              errorY: [0.2, 1],\n            })),\n          );\n          render(<VictoryErrorBar data={data} {...defaultProps} />);\n          const errors = screen.getAllByTestId(\"error-bar\");\n          expect(errors).toHaveLength(10);\n        });\n\n        it(\"renders errors with error bars, check total svg lines\", () => {\n          const svgDimensions = { width: 350, height: 200, padding: 75 };\n          const { container } = render(\n            <VictoryErrorBar\n              data={createData([\n                { x: 0, y: 0, errorX: [0.1, 0.5], errorY: [0.2, 0.3] },\n                { x: 2, y: 3, errorX: [0.1, 0.5], errorY: [0.2, 0.4] },\n                { x: 5, y: 5, errorX: [0.1, 0.5], errorY: [0.2, 0.1] },\n              ])}\n              {...svgDimensions}\n            />,\n          );\n          expect(container.querySelectorAll(\"line\")).toHaveLength(24);\n        });\n\n        it(\"should check right border of error bars positions\", () => {\n          const svgDimensions = { width: 350, height: 200, padding: 75 };\n          const borderWidth = 10;\n          const data = [\n            { x: 0, y: 0, errorX: [0.1, 0.3], errorY: [0.2, 0.5] },\n            { x: 2, y: 3, errorX: [0.1, 0.2], errorY: [0.2, 0.3] },\n            { x: 5, y: 5, errorX: [0.1, 0.6], errorY: [0.2, 0.1] },\n          ];\n          render(\n            <VictoryErrorBar\n              data={createData(data)}\n              borderWidth={borderWidth}\n              {...svgDimensions}\n              {...defaultProps}\n            />,\n          );\n\n          const xScale = d3Scale\n            .scaleLinear()\n            .domain([-0.3, 5.1])\n            .range([\n              svgDimensions.padding,\n              svgDimensions.width - svgDimensions.padding,\n            ]);\n\n          const yScale = d3Scale\n            .scaleLinear()\n            .domain([-0.5, 5.2])\n            .range([\n              svgDimensions.height - svgDimensions.padding,\n              svgDimensions.padding,\n            ]);\n\n          const bars = screen.getAllByTestId(\"error-bar\");\n          expect(bars).toHaveLength(3);\n          bars.forEach((node, i) => {\n            const errorX = xScale(data[i].x + data[i].errorX[0]);\n            const xScaleMax = xScale.range()[1];\n            const positiveErrorX = errorX >= xScaleMax ? xScaleMax : errorX;\n\n            const [x1, x2, y1, y2] = getCoordinatesForLineWithType(\n              node,\n              \"border-right\",\n            );\n\n            expect(x1).toEqual(positiveErrorX);\n            expect(x2).toEqual(positiveErrorX);\n            expect(y1).toEqual(yScale(data[i].y) - borderWidth);\n            expect(y2).toEqual(yScale(data[i].y) + borderWidth);\n          });\n        });\n\n        it(\"should check left border of error bars positions\", () => {\n          const svgDimensions = { width: 350, height: 200, padding: 75 };\n          const borderWidth = 10;\n          const data = [\n            { x: 0, y: 0, errorX: [0.1, 0.3], errorY: [0.2, 0.5] },\n            { x: 2, y: 3, errorX: [0.1, 0.2], errorY: [0.2, 0.3] },\n            { x: 5, y: 5, errorX: [0.1, 0.6], errorY: [0.2, 0.1] },\n          ];\n          render(\n            <VictoryErrorBar\n              data={createData(data)}\n              borderWidth={borderWidth}\n              {...svgDimensions}\n              {...defaultProps}\n            />,\n          );\n\n          const xScale = d3Scale\n            .scaleLinear()\n            .domain([-0.3, 5.1])\n            .range([\n              svgDimensions.padding,\n              svgDimensions.width - svgDimensions.padding,\n            ]);\n\n          const yScale = d3Scale\n            .scaleLinear()\n            .domain([-0.5, 5.2])\n            .range([\n              svgDimensions.height - svgDimensions.padding,\n              svgDimensions.padding,\n            ]);\n\n          const bars = screen.getAllByTestId(\"error-bar\");\n          expect(bars).toHaveLength(3);\n          bars.forEach((node, i) => {\n            const errorX = xScale(data[i].x - data[i].errorX[1]);\n            const xScaleMin = xScale.range()[0];\n            const negativeErrorX = errorX <= xScaleMin ? xScaleMin : errorX;\n\n            const [x1, x2, y1, y2] = getCoordinatesForLineWithType(\n              node,\n              \"border-left\",\n            );\n\n            expect(x1).toEqual(negativeErrorX);\n            expect(x2).toEqual(negativeErrorX);\n            expect(y1).toEqual(yScale(data[i].y) - borderWidth);\n            expect(y2).toEqual(yScale(data[i].y) + borderWidth);\n          });\n        });\n\n        it(\"should check bottom border of error bars positions\", () => {\n          const svgDimensions = { width: 350, height: 200, padding: 75 };\n          const borderWidth = 10;\n          const data = [\n            { x: 0, y: 0, errorX: [0.1, 0.3], errorY: [0.2, 0.5] },\n            { x: 2, y: 3, errorX: [0.1, 0.2], errorY: [0.2, 0.3] },\n            { x: 5, y: 5, errorX: [0.1, 0.6], errorY: [0.2, 0.1] },\n          ];\n          render(\n            <VictoryErrorBar\n              data={createData(data)}\n              borderWidth={borderWidth}\n              {...svgDimensions}\n              {...defaultProps}\n            />,\n          );\n\n          const xScale = d3Scale\n            .scaleLinear()\n            .domain([-0.3, 5.1])\n            .range([\n              svgDimensions.padding,\n              svgDimensions.width - svgDimensions.padding,\n            ]);\n\n          const yScale = d3Scale\n            .scaleLinear()\n            .domain([-0.5, 5.2])\n            .range([\n              svgDimensions.height - svgDimensions.padding,\n              svgDimensions.padding,\n            ]);\n\n          const bars = screen.getAllByTestId(\"error-bar\");\n          expect(bars).toHaveLength(3);\n          bars.forEach((node, i) => {\n            const errorY = yScale(data[i].y + data[i].errorY[0]);\n            const yScaleMin = yScale.range()[1];\n            const negativeErrorY = errorY <= yScaleMin ? yScaleMin : errorY;\n\n            const [x1, x2, y1, y2] = getCoordinatesForLineWithType(\n              node,\n              \"border-bottom\",\n            );\n\n            expect(x1).toEqual(xScale(data[i].x) - borderWidth);\n            expect(x2).toEqual(xScale(data[i].x) + borderWidth);\n            expect(y1).toEqual(negativeErrorY);\n            expect(y2).toEqual(negativeErrorY);\n          });\n        });\n\n        it(\"should check top border of error bars positions\", () => {\n          const svgDimensions = { width: 350, height: 200, padding: 75 };\n          const borderWidth = 10;\n          const data = [\n            { x: 0, y: 0, errorX: [0.1, 0.3], errorY: [0.2, 0.5] },\n            { x: 2, y: 3, errorX: [0.1, 0.2], errorY: [0.2, 0.3] },\n            { x: 5, y: 5, errorX: [0.1, 0.6], errorY: [0.2, 0.1] },\n          ];\n          render(\n            <VictoryErrorBar\n              data={createData(data)}\n              borderWidth={borderWidth}\n              {...svgDimensions}\n              {...defaultProps}\n            />,\n          );\n\n          const xScale = d3Scale\n            .scaleLinear()\n            .domain([-0.3, 5.1])\n            .range([\n              svgDimensions.padding,\n              svgDimensions.width - svgDimensions.padding,\n            ]);\n\n          const yScale = d3Scale\n            .scaleLinear()\n            .domain([-0.5, 5.2])\n            .range([\n              svgDimensions.height - svgDimensions.padding,\n              svgDimensions.padding,\n            ]);\n\n          const bars = screen.getAllByTestId(\"error-bar\");\n          expect(bars).toHaveLength(3);\n          bars.forEach((node, i) => {\n            const errorY = yScale(data[i].y - data[i].errorY[1]);\n            const yScaleMax = yScale.range()[0];\n            const positiveErrorY = errorY >= yScaleMax ? yScaleMax : errorY;\n\n            const [x1, x2, y1, y2] = getCoordinatesForLineWithType(\n              node,\n              \"border-top\",\n            );\n\n            expect(x1).toEqual(xScale(data[i].x) - borderWidth);\n            expect(x2).toEqual(xScale(data[i].x) + borderWidth);\n            expect(y1).toEqual(positiveErrorY);\n            expect(y2).toEqual(positiveErrorY);\n          });\n        });\n\n        it(\"should check top cross line of error bars positions\", () => {\n          const svgDimensions = { width: 350, height: 200, padding: 75 };\n          const data = [\n            { x: 0, y: 0, errorX: [0.1, 0.3], errorY: [0.2, 0.5] },\n            { x: 2, y: 3, errorX: [0.1, 0.2], errorY: [0.2, 0.3] },\n            { x: 5, y: 5, errorX: [0.1, 0.6], errorY: [0.2, 0.1] },\n          ];\n          render(\n            <VictoryErrorBar\n              data={createData(data)}\n              {...svgDimensions}\n              {...defaultProps}\n            />,\n          );\n\n          const xScale = d3Scale\n            .scaleLinear()\n            .domain([-0.3, 5.1])\n            .range([\n              svgDimensions.padding,\n              svgDimensions.width - svgDimensions.padding,\n            ]);\n\n          const yScale = d3Scale\n            .scaleLinear()\n            .domain([-0.5, 5.2])\n            .range([\n              svgDimensions.height - svgDimensions.padding,\n              svgDimensions.padding,\n            ]);\n\n          const bars = screen.getAllByTestId(\"error-bar\");\n          expect(bars).toHaveLength(3);\n          bars.forEach((node, i) => {\n            const errorY = yScale(data[i].y - data[i].errorY[1]);\n            const yScaleMax = yScale.range()[0];\n            const positiveErrorY = errorY >= yScaleMax ? yScaleMax : errorY;\n\n            const [x1, x2, y1, y2] = getCoordinatesForLineWithType(\n              node,\n              \"cross-top\",\n            );\n\n            expect(x1).toEqual(xScale(data[i].x));\n            expect(x2).toEqual(xScale(data[i].x));\n            expect(y1).toEqual(yScale(data[i].y));\n            expect(y2).toEqual(positiveErrorY);\n          });\n        });\n\n        it(\"should check bottom cross line of error bars positions\", () => {\n          const svgDimensions = { width: 350, height: 200, padding: 75 };\n          const data = [\n            { x: 0, y: 0, errorX: [0.1, 0.3], errorY: [0.2, 0.5] },\n            { x: 2, y: 3, errorX: [0.1, 0.2], errorY: [0.2, 0.3] },\n            { x: 5, y: 5, errorX: [0.1, 0.6], errorY: [0.2, 0.1] },\n          ];\n          render(\n            <VictoryErrorBar\n              data={createData(data)}\n              {...svgDimensions}\n              {...defaultProps}\n            />,\n          );\n\n          const xScale = d3Scale\n            .scaleLinear()\n            .domain([-0.3, 5.1])\n            .range([\n              svgDimensions.padding,\n              svgDimensions.width - svgDimensions.padding,\n            ]);\n\n          const yScale = d3Scale\n            .scaleLinear()\n            .domain([-0.5, 5.2])\n            .range([\n              svgDimensions.height - svgDimensions.padding,\n              svgDimensions.padding,\n            ]);\n\n          const bars = screen.getAllByTestId(\"error-bar\");\n          expect(bars).toHaveLength(3);\n          bars.forEach((node, i) => {\n            const errorY = yScale(data[i].y + data[i].errorY[0]);\n            const yScaleMin = yScale.range()[1];\n            const negativeErrorY = errorY <= yScaleMin ? yScaleMin : errorY;\n\n            const [x1, x2, y1, y2] = getCoordinatesForLineWithType(\n              node,\n              \"cross-bottom\",\n            );\n\n            expect(x1).toEqual(xScale(data[i].x));\n            expect(x2).toEqual(xScale(data[i].x));\n            expect(y1).toEqual(yScale(data[i].y));\n            expect(y2).toEqual(negativeErrorY);\n          });\n        });\n\n        it(\"should check left cross line of error bars positions\", () => {\n          const svgDimensions = { width: 350, height: 200, padding: 75 };\n          const data = [\n            { x: 0, y: 0, errorX: [0.1, 0.3], errorY: [0.2, 0.5] },\n            { x: 2, y: 3, errorX: [0.1, 0.2], errorY: [0.2, 0.3] },\n            { x: 5, y: 5, errorX: [0.1, 0.6], errorY: [0.2, 0.1] },\n          ];\n          render(\n            <VictoryErrorBar\n              data={createData(data)}\n              {...svgDimensions}\n              {...defaultProps}\n            />,\n          );\n\n          const xScale = d3Scale\n            .scaleLinear()\n            .domain([-0.3, 5.1])\n            .range([\n              svgDimensions.padding,\n              svgDimensions.width - svgDimensions.padding,\n            ]);\n\n          const yScale = d3Scale\n            .scaleLinear()\n            .domain([-0.5, 5.2])\n            .range([\n              svgDimensions.height - svgDimensions.padding,\n              svgDimensions.padding,\n            ]);\n\n          const bars = screen.getAllByTestId(\"error-bar\");\n          expect(bars).toHaveLength(3);\n          bars.forEach((node, i) => {\n            const errorX = xScale(data[i].x - data[i].errorX[1]);\n            const xScaleMin = xScale.range()[0];\n            const negativeErrorX = errorX <= xScaleMin ? xScaleMin : errorX;\n\n            const [x1, x2, y1, y2] = getCoordinatesForLineWithType(\n              node,\n              \"cross-left\",\n            );\n\n            expect(x1).toEqual(xScale(data[i].x));\n            expect(x2).toEqual(negativeErrorX);\n            expect(y1).toEqual(yScale(data[i].y));\n            expect(y2).toEqual(yScale(data[i].y));\n          });\n        });\n\n        it(\"should check right cross line of error bars positions\", () => {\n          const svgDimensions = { width: 350, height: 200, padding: 75 };\n          const data = [\n            { x: 0, y: 0, errorX: [0.1, 0.3], errorY: [0.2, 0.5] },\n            { x: 2, y: 3, errorX: [0.1, 0.2], errorY: [0.2, 0.3] },\n            { x: 5, y: 5, errorX: [0.1, 0.6], errorY: [0.2, 0.1] },\n          ];\n          render(\n            <VictoryErrorBar\n              data={createData(data)}\n              {...svgDimensions}\n              {...defaultProps}\n            />,\n          );\n\n          const xScale = d3Scale\n            .scaleLinear()\n            .domain([-0.3, 5.1])\n            .range([\n              svgDimensions.padding,\n              svgDimensions.width - svgDimensions.padding,\n            ]);\n\n          const yScale = d3Scale\n            .scaleLinear()\n            .domain([-0.5, 5.2])\n            .range([\n              svgDimensions.height - svgDimensions.padding,\n              svgDimensions.padding,\n            ]);\n\n          const bars = screen.getAllByTestId(\"error-bar\");\n          expect(bars).toHaveLength(3);\n          bars.forEach((node, i) => {\n            const errorX = xScale(data[i].x + data[i].errorX[0]);\n            const xScaleMax = xScale.range()[1];\n            const positiveErrorX = errorX >= xScaleMax ? xScaleMax : errorX;\n\n            const [x1, x2, y1, y2] = getCoordinatesForLineWithType(\n              node,\n              \"cross-right\",\n            );\n\n            expect(x1).toEqual(xScale(data[i].x));\n            expect(x2).toEqual(positiveErrorX);\n            expect(y1).toEqual(yScale(data[i].y));\n            expect(y2).toEqual(yScale(data[i].y));\n          });\n        });\n      });\n    },\n  );\n\n  describe(\"event handling\", () => {\n    it(\"attaches an event to the parent svg\", () => {\n      const clickHandler = jest.fn();\n      const { container } = render(\n        <VictoryErrorBar\n          events={[\n            {\n              target: \"parent\",\n              eventHandlers: { onClick: clickHandler },\n            },\n          ]}\n        />,\n      );\n      const svg = container.querySelector(\"svg\");\n      if (svg) fireEvent.click(svg);\n      expect(clickHandler).toBeCalled();\n    });\n\n    it(\"attaches an event to data, click border lines\", () => {\n      const clickHandler = jest.fn();\n      render(\n        <VictoryErrorBar\n          events={[\n            {\n              target: \"data\",\n              eventHandlers: { onClick: clickHandler },\n            },\n          ]}\n          {...defaultProps}\n        />,\n      );\n      const bars = screen.getAllByTestId(\"error-bar\");\n      bars.forEach((node) => {\n        // click the border line\n        fireEvent.click(node.querySelectorAll(\"line\")[3]);\n\n        expect(clickHandler).toBeCalled();\n      });\n    });\n\n    it(\"attaches an event to data, click cross lines\", () => {\n      const clickHandler = jest.fn();\n      render(\n        <VictoryErrorBar\n          events={[\n            {\n              target: \"data\",\n              eventHandlers: { onClick: clickHandler },\n            },\n          ]}\n          {...defaultProps}\n        />,\n      );\n      const bars = screen.getAllByTestId(\"error-bar\");\n      bars.forEach((node) => {\n        // click the cross line\n        fireEvent.click(node.querySelectorAll(\"line\")[7]);\n        expect(clickHandler).toBeCalled();\n      });\n    });\n\n    describe(\"accessibility\", () => {\n      it(\"adds an aria label-label and tabIndex to Error Bar primitive\", () => {\n        const data = [\n          { x: 35, y: 50, error: 0.2 },\n          { x: 10, y: 43, error: 0.15 },\n          { x: 45, y: 65, error: 0.5 },\n        ];\n        const { container } = render(\n          <VictoryErrorBar\n            data={data}\n            dataComponent={\n              <ErrorBar\n                data-testid=\"error-bar\"\n                ariaLabel={({ datum }) => `error bar chart, x ${datum.x}`}\n                tabIndex={({ index }) => index + 2}\n              />\n            }\n          />,\n        );\n\n        expect(container.querySelectorAll(\"g\")).toHaveLength(4);\n        expect(screen.getAllByTestId(\"error-bar\")).toHaveLength(3);\n\n        screen.getAllByTestId(\"error-bar\").forEach((g, i) => {\n          expect(g.getAttribute(\"aria-label\")).toEqual(\n            `error bar chart, x ${data[i].x}`,\n          );\n          expect(parseInt(g.getAttribute(\"tabindex\")!, 10)).toEqual(i + 2);\n        });\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-errorbar/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-errorbar/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-group/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-group/CHANGELOG.md",
    "content": "# victory-group\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n### Patch Changes\n\n- Remove deprecated babel-plugin-lodash plugin ([#2965](https://github.com/FormidableLabs/victory/pull/2965))\n\n* Improve types in victory-core helpers ([#2999](https://github.com/FormidableLabs/victory/pull/2999))\n\n## 37.3.2\n\n## 37.3.1\n\n### Patch Changes\n\n- Remove duplicate types from interfaces ([#2940](https://github.com/FormidableLabs/victory/pull/2940))\n\n## 37.3.0\n\n## 37.2.0\n\n### Minor Changes\n\n- Minor updates for clean theme ([#2909](https://github.com/FormidableLabs/victory/pull/2909))\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n### Patch Changes\n\n- Ensure undefined props do not overwrite defaults ([#2852](https://github.com/FormidableLabs/victory/pull/2852))\n\n## 37.0.1\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n## 36.9.1\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n## 36.8.4\n\n## 36.8.3\n\n## 36.8.2\n\n### Patch Changes\n\n- Fix victory-group animation ([#2717](https://github.com/FormidableLabs/victory/pull/2717))\n\n## 36.8.1\n\n## 36.8.0\n\n### Patch Changes\n\n- Remove usage of defaultProps from components ([#2679](https://github.com/FormidableLabs/victory/pull/2679))\n\n## 36.7.0\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.8\n  - victory-shared-events@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.7\n  - victory-shared-events@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.6\n  - victory-shared-events@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-core@36.6.5\n  - victory-shared-events@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n- Updated dependencies [[`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-core@36.6.4\n  - victory-shared-events@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-core@36.6.3\n  - victory-shared-events@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.2\n  - victory-shared-events@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- - Migrate `victory-group` to TypeScript ([#2422](https://github.com/FormidableLabs/victory/pull/2422))\n\n- Updated dependencies [[`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-core@36.6.1\n  - victory-shared-events@36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Updated dependencies [[`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-core@36.6.0\n  - victory-shared-events@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-group/README.md",
    "content": "# VictoryGroup\n\n`victory-group@^30.0.0` exports `VictoryGroup`\n\nTo view documentation for `VictoryGroup` please see https://commerce.nearform.com/open-source/victory/docs/victory-group\n\nTo suggest an addition or correction to this documentation please see https://github.com/FormidableLabs/victory/blob/main/docs/src/content/docs/victory-group.md\n"
  },
  {
    "path": "packages/victory-group/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-group/package.json",
    "content": "{\n  \"name\": \"victory-group\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Group Layout Component for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Lauren Eastridge\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"lodash\": \"^4.17.19\",\n    \"react-fast-compare\": \"^3.2.0\",\n    \"victory-core\": \"37.3.6\",\n    \"victory-shared-events\": \"37.3.6\"\n  },\n  \"devDependencies\": {\n    \"victory-bar\": \"*\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\",\n        \"../victory-shared-events:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:cjs\",\n        \"../victory-shared-events:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\",\n        \"../victory-shared-events:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\",\n        \"../victory-shared-events:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-shared-events:types:create\",\n        \"../victory-bar:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-shared-events:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-shared-events:types:create\",\n        \"../victory-bar:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-shared-events:types:create\",\n        \"../victory-bar:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:build\",\n        \"../victory-shared-events:build\",\n        \"../victory-bar:build\",\n        \"../victory-vendor:build\",\n        \"../victory-voronoi:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-group/src/helper-methods.tsx",
    "content": "import React from \"react\";\nimport { Data, Helpers, Scale, Wrapper } from \"victory-core\";\nimport isEqual from \"react-fast-compare\";\n\nconst fallbackProps = {\n  width: 450,\n  height: 300,\n  padding: 50,\n  offset: 0,\n};\n\nexport function getCalculatedProps(initialProps, childComponents) {\n  const role = \"group\";\n  const props = Helpers.modifyProps(initialProps, fallbackProps, role);\n  const style = Wrapper.getStyle(props.theme, props.style, role);\n  const { offset, colorScale, color, polar, horizontal } = props;\n  const categories =\n    props.categories || Wrapper.getCategories(props, childComponents, null);\n  const datasets = props.datasets || Wrapper.getDataFromChildren(props, null);\n  const domain = {\n    x: Wrapper.getDomain(\n      Object.assign({}, props, { categories }),\n      \"x\",\n      childComponents,\n    ),\n    y: Wrapper.getDomain(\n      Object.assign({}, props, { categories }),\n      \"y\",\n      childComponents,\n    ),\n  };\n  const range = props.range || {\n    x: Helpers.getRange(props, \"x\"),\n    y: Helpers.getRange(props, \"y\"),\n  };\n  const baseScale = {\n    x: Scale.getScaleFromProps(props, \"x\") || Wrapper.getScale(props, \"x\"),\n    y: Scale.getScaleFromProps(props, \"y\") || Wrapper.getScale(props, \"y\"),\n  };\n  const scale = {\n    x: baseScale.x.domain(domain.x).range(props.horizontal ? range.y : range.x),\n    y: baseScale.y.domain(domain.y).range(props.horizontal ? range.x : range.y),\n  };\n\n  const origin = polar ? props.origin : Helpers.getPolarOrigin(props);\n  const padding = Helpers.getPadding(props.padding);\n  return {\n    datasets,\n    categories,\n    range,\n    domain,\n    horizontal,\n    scale,\n    style,\n    colorScale,\n    color,\n    offset,\n    origin,\n    padding,\n  };\n}\n\n// We need to remove sharedEvents in order to memoize the calculated data\n// With shared events, the props change on every event, and every value is re-calculated\nconst withoutSharedEvents = (props) => {\n  const { children } = props;\n  const modifiedChildren = React.Children.toArray(children).map(\n    (child: Record<string, any> | any) => {\n      return {\n        ...child,\n        props: Helpers.omit(child.props, [\"sharedEvents\"]),\n      };\n    },\n  );\n  props.children = modifiedChildren;\n  return props;\n};\n\nexport function useMemoizedProps(initialProps) {\n  const modifiedProps = withoutSharedEvents(initialProps);\n  const [props, setProps] = React.useState(modifiedProps);\n\n  // React.memo uses shallow equality to compare objects. This way props\n  // will only be re-calculated when they change.\n  React.useEffect(() => {\n    if (!isEqual(modifiedProps, props)) {\n      setProps(modifiedProps);\n    }\n  }, [props, setProps, modifiedProps]);\n\n  return React.useMemo(() => {\n    return getCalculatedProps(props, props.children);\n  }, [props]);\n}\n\nfunction pixelsToValue(props, axis, calculatedProps) {\n  if (!props.offset) {\n    return 0;\n  }\n  const currentAxis = Helpers.getCurrentAxis(axis, props.horizontal);\n  const domain = calculatedProps.domain[axis];\n  const range = calculatedProps.range[currentAxis];\n  const domainExtent = Math.max(...domain) - Math.min(...domain);\n  const rangeExtent = Math.max(...range) - Math.min(...range);\n  return (domainExtent / rangeExtent) * props.offset;\n}\n\n// eslint-disable-next-line max-params\nfunction getX0(props, calculatedProps, index, role) {\n  const groupLength =\n    role === \"stack\"\n      ? calculatedProps.datasets[0].length\n      : calculatedProps.datasets.length;\n  const center = (groupLength - 1) / 2;\n  const totalWidth = pixelsToValue(props, \"x\", calculatedProps);\n  return (index - center) * totalWidth;\n}\n\n// eslint-disable-next-line max-params\nfunction getPolarX0(props, calculatedProps, index, role) {\n  const groupLength =\n    role === \"stack\"\n      ? calculatedProps.datasets[0].length\n      : calculatedProps.datasets.length;\n  const center = (groupLength - 1) / 2;\n  const width = getAngularWidth(props, calculatedProps);\n  return (index - center) * width;\n}\n\nfunction getAngularWidth(props, calculatedProps) {\n  const { range } = calculatedProps;\n  const angularRange = Math.abs(range.x[1] - range.x[0]);\n  const r = Math.max(...range.y);\n  return (props.offset / (2 * Math.PI * r)) * angularRange;\n}\n\nfunction getLabels(props, datasets, index) {\n  if (!props.labels) {\n    return undefined;\n  }\n  return Math.floor(datasets.length / 2) === index ? props.labels : undefined;\n}\n\nfunction getChildProps(props, calculatedProps) {\n  const { categories, domain, range, scale, horizontal, origin, padding } =\n    calculatedProps;\n  const { width, height, theme, polar } = props;\n  return {\n    height,\n    width,\n    theme,\n    polar,\n    origin,\n    categories,\n    domain,\n    range,\n    scale,\n    horizontal,\n    padding,\n    standalone: false,\n  };\n}\n\nfunction getColorScale(props, child) {\n  const role = child.type && child.type.role;\n  const colorScaleOptions = child.props.colorScale || props.colorScale;\n  if (role !== \"group\" && role !== \"stack\") {\n    return undefined;\n  }\n  return props.theme && props.theme.group\n    ? colorScaleOptions || props.theme.group.colorScale\n    : colorScaleOptions;\n}\n\nfunction getDataWithOffset(props, defaultDataset = [], offset) {\n  const dataset = props.data || props.y ? Data.getData(props) : defaultDataset;\n  const xOffset = offset || 0;\n  return dataset.map((datum) => {\n    const _x1 =\n      datum._x instanceof Date\n        ? new Date(datum._x.getTime() + xOffset)\n        : datum._x + xOffset;\n\n    return Object.assign({}, datum, { _x1 });\n  });\n}\n\nexport function getChildren(initialProps, childComponents?, calculatedProps?) {\n  const props = Helpers.modifyProps(initialProps, fallbackProps, \"stack\");\n  const children = childComponents || React.Children.toArray(props.children);\n  const newCalculatedProps =\n    calculatedProps || getCalculatedProps(props, children);\n  const { datasets } = newCalculatedProps;\n  const { labelComponent, polar, theme } = props;\n  const childProps = getChildProps(props, newCalculatedProps);\n  const parentName = props.name || \"group\";\n  return children.map((child, index) => {\n    const role = child.type && child.type.role;\n    const xOffset = polar\n      ? getPolarX0(props, newCalculatedProps, index, role)\n      : getX0(props, newCalculatedProps, index, role);\n    const style =\n      role === \"voronoi\" || role === \"tooltip\" || role === \"label\"\n        ? child.props.style\n        : Wrapper.getChildStyle(child, index, newCalculatedProps, theme);\n    const labels = props.labels\n      ? getLabels(props, datasets, index)\n      : child.props.labels;\n    const name = child.props.name || `${parentName}-${role}-${index}`;\n    return React.cloneElement(\n      child,\n      Object.assign(\n        {\n          labels,\n          style,\n          key: `${name}-key-${index}`,\n          name,\n          data: getDataWithOffset(props, datasets[index], xOffset),\n          colorScale: getColorScale(props, child),\n          labelComponent: labelComponent || child.props.labelComponent,\n          xOffset,\n        },\n        childProps,\n      ),\n    );\n  });\n}\n"
  },
  {
    "path": "packages/victory-group/src/index.ts",
    "content": "export * from \"./victory-group\";\n"
  },
  {
    "path": "packages/victory-group/src/victory-group.test.tsx",
    "content": "import { render, screen } from \"@testing-library/react\";\nimport React from \"react\";\nimport { VictoryBar } from \"victory-bar\";\n\nimport { VictoryGroup } from \"./victory-group\";\n\ndescribe(\"components/victory-group\", () => {\n  it(\"has a static role\", () => {\n    expect(VictoryGroup.role).toEqual(\"group\");\n  });\n\n  describe(\"default component rendering\", () => {\n    it(\"renders an svg with the correct width and height\", () => {\n      const { container } = render(\n        <VictoryGroup>\n          <VictoryBar />\n          <VictoryBar />\n        </VictoryGroup>,\n      );\n      const svg = container.querySelector(\"svg\");\n      expect(svg?.style.width).toEqual(\"100%\");\n      expect(svg?.style.height).toEqual(\"100%\");\n    });\n\n    it(\"renders an svg with the correct viewBox\", () => {\n      const { container } = render(\n        <VictoryGroup>\n          <VictoryBar />\n          <VictoryBar />\n        </VictoryGroup>,\n      );\n      const svg = container.querySelector(\"svg\");\n      const viewBoxValue = `0 0 ${450} ${300}`;\n      expect(svg?.getAttribute(\"viewBox\")).toEqual(viewBoxValue);\n    });\n\n    it(\"accepts user props\", () => {\n      render(\n        <VictoryGroup data-testid=\"victory-group\" aria-label=\"Group\">\n          <VictoryBar />\n          <VictoryBar />\n        </VictoryGroup>,\n      );\n\n      expect(screen.getByTestId(\"victory-group\")).toBeDefined();\n      expect(screen.getByLabelText(\"Group\")).toBeDefined();\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-group/src/victory-group.tsx",
    "content": "import defaults from \"lodash/defaults\";\nimport isEmpty from \"lodash/isEmpty\";\nimport React from \"react\";\nimport {\n  EventPropTypeInterface,\n  Helpers,\n  Hooks,\n  StringOrNumberOrCallback,\n  UserProps,\n  VictoryCommonProps,\n  VictoryContainer,\n  VictoryDatableProps,\n  VictoryMultiLabelableProps,\n  VictoryStyleInterface,\n  VictoryTheme,\n  Wrapper,\n  VictoryComponentConfiguration,\n} from \"victory-core\";\nimport { VictorySharedEvents } from \"victory-shared-events\";\nimport { getChildren, useMemoizedProps } from \"./helper-methods\";\nimport isEqual from \"react-fast-compare\";\n\nconst fallbackProps = {\n  width: 450,\n  height: 300,\n  padding: 50,\n  offset: 0,\n};\n\nexport type VictoryGroupTTargetType = \"data\" | \"labels\" | \"parent\";\nexport interface VictoryGroupProps\n  extends VictoryCommonProps,\n    VictoryDatableProps,\n    VictoryMultiLabelableProps {\n  children?: React.ReactNode;\n  color?: string;\n  events?: EventPropTypeInterface<\n    VictoryGroupTTargetType,\n    StringOrNumberOrCallback\n  >[];\n  eventKey?: StringOrNumberOrCallback;\n  offset?: number;\n  style?: VictoryStyleInterface;\n  displayName?: string;\n}\n\nconst defaultProps = {\n  containerComponent: <VictoryContainer />,\n  groupComponent: <g />,\n  samples: 50,\n  standalone: true,\n  theme: VictoryTheme.grayscale,\n};\n\nconst VictoryGroupBase: React.FC<VictoryGroupProps> = (initialProps) => {\n  const role = VictoryGroup?.role;\n  const { getAnimationProps, setAnimationState, getProps } =\n    Hooks.useAnimationState();\n  const propsWithDefaults = React.useMemo(\n    () => defaults({}, initialProps, defaultProps),\n    [initialProps],\n  );\n  const props = getProps(propsWithDefaults);\n\n  const modifiedProps = Helpers.modifyProps(props, fallbackProps, role);\n  const {\n    eventKey,\n    containerComponent,\n    standalone,\n    groupComponent,\n    externalEventMutations,\n    width,\n    height,\n    theme,\n    polar,\n    horizontal,\n    name,\n  } = modifiedProps;\n\n  const childComponents = React.Children.toArray(modifiedProps.children);\n  const calculatedProps = useMemoizedProps(modifiedProps);\n  const { domain, scale, style, origin } = calculatedProps;\n\n  const newChildren = React.useMemo(() => {\n    const children = getChildren(props, childComponents, calculatedProps);\n    return children.map((child, index) => {\n      const childProps = Object.assign(\n        { animate: getAnimationProps(props, child, index) },\n        child.props,\n      );\n      return React.cloneElement(child, childProps);\n    });\n  }, [props, childComponents, calculatedProps, getAnimationProps]);\n\n  const containerProps = React.useMemo(() => {\n    if (standalone) {\n      return {\n        domain,\n        scale,\n        width,\n        height,\n        standalone,\n        theme,\n        style: style.parent,\n        horizontal,\n        polar,\n        origin,\n        name,\n      };\n    }\n    return {};\n  }, [\n    standalone,\n    domain,\n    scale,\n    width,\n    height,\n    theme,\n    style,\n    horizontal,\n    polar,\n    origin,\n    name,\n  ]);\n\n  const userProps = React.useMemo(\n    () => UserProps.getSafeUserProps(propsWithDefaults),\n    [propsWithDefaults],\n  );\n\n  const container = React.useMemo(() => {\n    if (standalone) {\n      const defaultContainerProps = defaults(\n        {},\n        containerComponent.props,\n        containerProps,\n        userProps,\n      );\n      return React.cloneElement(containerComponent, defaultContainerProps);\n    }\n\n    return React.cloneElement(groupComponent, userProps);\n  }, [\n    groupComponent,\n    standalone,\n    containerComponent,\n    containerProps,\n    userProps,\n  ]);\n\n  const events = React.useMemo(() => {\n    return Wrapper.getAllEvents(props);\n  }, [props]);\n\n  const previousProps = Hooks.usePreviousProps(propsWithDefaults);\n\n  React.useEffect(() => {\n    // This is called before dismount to keep state in sync\n    return () => {\n      if (propsWithDefaults.animate) {\n        setAnimationState(previousProps, props);\n      }\n    };\n  }, [setAnimationState, previousProps, propsWithDefaults, props]);\n\n  if (!isEmpty(events)) {\n    return (\n      <VictorySharedEvents\n        container={container}\n        eventKey={eventKey}\n        events={events}\n        externalEventMutations={externalEventMutations}\n      >\n        {newChildren}\n      </VictorySharedEvents>\n    );\n  }\n  return React.cloneElement(container, container.props, newChildren);\n};\n\nconst componentConfig: VictoryComponentConfiguration<VictoryGroupProps> = {\n  role: \"group\",\n  expectedComponents: [\n    \"groupComponent\",\n    \"containerComponent\",\n    \"labelComponent\",\n  ],\n  getChildren,\n};\n\nexport const VictoryGroup = Object.assign(\n  React.memo(VictoryGroupBase, isEqual),\n  componentConfig,\n);\nVictoryGroup.displayName = \"VictoryGroup\";\n"
  },
  {
    "path": "packages/victory-group/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-group/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-histogram/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-histogram/CHANGELOG.md",
    "content": "# victory-histogram\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n## 37.3.2\n\n## 37.3.1\n\n### Patch Changes\n\n- Remove duplicate types from interfaces ([#2940](https://github.com/FormidableLabs/victory/pull/2940))\n\n## 37.3.0\n\n## 37.2.0\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n## 37.0.1\n\n### Patch Changes\n\n- Fix the signature of class static functions in components ([#2840](https://github.com/FormidableLabs/victory/pull/2840))\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n### Patch Changes\n\n- Replace lodash isNil and isNan with native code ([#2800](https://github.com/FormidableLabs/victory/pull/2800))\n\n* Replace lodash isFunction with native code ([#2802](https://github.com/FormidableLabs/victory/pull/2802))\n\n## 36.9.1\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n* Replace instances of lodash.range with equivalent native code ([#2760](https://github.com/FormidableLabs/victory/pull/2760))\n\n## 36.8.4\n\n## 36.8.3\n\n### Patch Changes\n\n- Migrate victory-histogram to TypeScript ([#2719](https://github.com/FormidableLabs/victory/pull/2719))\n\n## 36.8.2\n\n## 36.8.1\n\n## 36.8.0\n\n## 36.7.0\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-bar@36.6.8\n  - victory-core@36.6.8\n  - victory-vendor@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-bar@36.6.7\n  - victory-core@36.6.7\n  - victory-vendor@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-bar@36.6.6\n  - victory-core@36.6.6\n  - victory-vendor@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416), [`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-core@36.6.5\n  - victory-vendor@36.6.5\n  - victory-bar@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n- Updated dependencies [[`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-core@36.6.4\n  - victory-bar@36.6.4\n  - victory-vendor@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-bar@36.6.3\n  - victory-core@36.6.3\n  - victory-vendor@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-bar@36.6.2\n  - victory-core@36.6.2\n  - victory-vendor@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- Updated dependencies [[`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-core@36.6.1\n  - victory-bar@36.6.1\n  - victory-vendor@36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Updated dependencies [[`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-core@36.6.0\n  - victory-bar@36.6.0\n  - victory-vendor@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-histogram/README.md",
    "content": "# VictoryHistogram\n"
  },
  {
    "path": "packages/victory-histogram/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-histogram/package.json",
    "content": "{\n  \"name\": \"victory-histogram\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Histogram Component for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"lodash\": \"^4.17.19\",\n    \"react-fast-compare\": \"^3.2.0\",\n    \"victory-bar\": \"37.3.6\",\n    \"victory-core\": \"37.3.6\",\n    \"victory-vendor\": \"37.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-bar:build:lib:esm\",\n        \"../victory-core:build:lib:esm\",\n        \"../victory-vendor:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-bar:build:lib:cjs\",\n        \"../victory-core:build:lib:cjs\",\n        \"../victory-vendor:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-bar:build:lib:esm\",\n        \"../victory-core:build:lib:esm\",\n        \"../victory-vendor:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-bar:build:lib:esm\",\n        \"../victory-core:build:lib:esm\",\n        \"../victory-vendor:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-bar:types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-bar:types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-vendor:build\",\n        \"../victory-bar:types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-vendor:build\",\n        \"../victory-bar:types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-bar:build\",\n        \"../victory-core:build\",\n        \"../victory-vendor:build\",\n        \"../victory-voronoi:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-histogram/src/helper-methods.ts",
    "content": "import { Helpers, LabelHelpers, Data, Domain, Scale } from \"victory-core\";\nimport { getBarPosition } from \"victory-bar\";\nimport isEqual from \"react-fast-compare\";\nimport * as d3Array from \"victory-vendor/d3-array\";\nimport * as d3Scale from \"victory-vendor/d3-scale\";\nimport { VictoryHistogramProps } from \"./victory-histogram\";\n\nconst cacheLastValue = (func) => {\n  let called = false;\n  let lastArgs;\n  let lastReturnVal;\n\n  return (...args) => {\n    if (called && isEqual(lastArgs, args)) {\n      return lastReturnVal;\n    }\n\n    const value = func(...args);\n\n    called = true;\n    lastReturnVal = value;\n    lastArgs = args;\n\n    return value;\n  };\n};\n\nconst dataOrBinsContainDates = ({\n  data,\n  bins,\n  x,\n}: Pick<VictoryHistogramProps, \"data\" | \"x\" | \"bins\">) => {\n  const xAccessor = Helpers.createAccessor(x || \"x\");\n  const dataIsDates =\n    data?.some((datum) => xAccessor(datum) instanceof Date) || false;\n  const binsHasDates =\n    Array.isArray(bins) && bins.some((bin) => bin instanceof Date);\n\n  return dataIsDates || binsHasDates;\n};\n\nconst getBinningFunc = ({ data, x, bins, dataOrBinsContainsDates }) => {\n  const xAccessor = Helpers.createAccessor(x || \"x\");\n  const bin = d3Array.bin().value(xAccessor);\n\n  const niceScale = (\n    (dataOrBinsContainsDates\n      ? d3Scale.scaleTime()\n      : d3Scale.scaleLinear()) as any\n  )\n    .domain(d3Array.extent(data, xAccessor))\n    .nice();\n\n  if (Array.isArray(bins)) {\n    bin.domain([bins[0], bins[bins.length - 1]]);\n    bin.thresholds(bins.slice(1, bins.length - 1));\n\n    return bin;\n  }\n\n  if (Number.isInteger(bins)) {\n    bin.domain(niceScale.domain());\n    bin.thresholds(bins);\n\n    return bin;\n  }\n\n  if (dataOrBinsContainsDates) {\n    bin.domain(niceScale.domain());\n    bin.thresholds(niceScale.ticks());\n    return bin as unknown as d3Array.HistogramGeneratorDate<Date, Date>;\n  }\n\n  bin.domain(niceScale.domain());\n\n  return bin;\n};\n\nexport const getFormattedData = cacheLastValue(\n  ({\n    data = [],\n    x,\n    bins,\n  }: Pick<VictoryHistogramProps, \"data\" | \"x\" | \"bins\">) => {\n    if ((!data || !data.length) && !Array.isArray(bins)) {\n      return [];\n    }\n    const dataOrBinsContainsDates = dataOrBinsContainDates({ data, bins, x });\n    const binFunc = getBinningFunc({ data, x, bins, dataOrBinsContainsDates });\n    const foo = binFunc(data);\n    const binnedData = [...foo].filter(({ x0, x1 }) => {\n      if (x0 instanceof Date && x1 instanceof Date) {\n        return new Date(x0).getTime() !== new Date(x1).getTime();\n      }\n\n      return x0 !== x1;\n    });\n\n    const formattedData = binnedData.map((bin) => {\n      const x0 = dataOrBinsContainsDates\n        ? new Date(bin.x0 as Date)\n        : bin.x0 || 0;\n      const x1 = dataOrBinsContainsDates\n        ? new Date(bin.x1 as Date)\n        : bin.x1 || 0;\n\n      return {\n        x0,\n        x1,\n        x: dataOrBinsContainsDates\n          ? new Date(((x0 as Date).getTime() + (x1 as Date).getTime()) / 2)\n          : ((x0 as number) + (x1 as number)) / 2,\n        y: bin.length,\n        binnedData: [...bin],\n      };\n    });\n\n    return formattedData;\n  },\n);\n\nexport const getData = (props: VictoryHistogramProps) => {\n  const { bins, data, x } = props;\n  const dataIsPreformatted = data?.some(({ _y }) => !Helpers.isNil(_y));\n\n  const formattedData = dataIsPreformatted\n    ? data\n    : getFormattedData({ data, x, bins });\n  return Data.getData({ ...props, data: formattedData, x: \"x\" });\n};\n\nexport const getDomain = (props: VictoryHistogramProps, axis: \"x\" | \"y\") => {\n  const data = getData(props);\n\n  if (!data.length) {\n    return [0, 1];\n  }\n\n  if (axis === \"x\") {\n    const firstBin = data[0];\n    const lastBin = data[data.length - 1];\n\n    return Domain.getDomainWithZero(\n      { ...props, data: [{ x: firstBin.x0 }, { x: lastBin.x1 }], x: \"x\" },\n      \"x\",\n    );\n  }\n\n  return props.data?.length\n    ? Domain.getDomainWithZero({ ...props, data }, \"y\")\n    : [0, 1];\n};\n\nconst getCalculatedValues = (props) => {\n  const defaultStyles = Helpers.getDefaultStyles(props, \"histogram\");\n  const style = Helpers.getStyles(props.style, defaultStyles);\n\n  const range = props.range || {\n    x: Helpers.getRange(props, \"x\"),\n    y: Helpers.getRange(props, \"y\"),\n  };\n\n  const domain = {\n    x: getDomain(props, \"x\"),\n    y: getDomain(props, \"y\"),\n  };\n\n  let data = getData(props);\n  data = Data.formatDataFromDomain(data, domain, 0);\n\n  const scale = {\n    x: Scale.getBaseScale(props, \"x\")\n      .domain(domain.x)\n      .range(props.horizontal ? range.y : range.x),\n    y: Scale.getBaseScale(props, \"y\")\n      .domain(domain.y)\n      .range(props.horizontal ? range.x : range.y),\n  };\n\n  return { style, data, scale, domain };\n};\n\nexport const getBaseProps = (initialProps, fallbackProps) => {\n  const modifiedProps = Helpers.modifyProps(\n    initialProps,\n    fallbackProps,\n    \"histogram\",\n  );\n  const props = Object.assign(\n    {},\n    modifiedProps,\n    getCalculatedValues(modifiedProps),\n  );\n\n  const {\n    binSpacing,\n    cornerRadius,\n    data,\n    domain,\n    events,\n    height,\n    horizontal,\n    padding,\n    scale,\n    sharedEvents,\n    standalone,\n    style,\n    theme,\n    width,\n    labels,\n    name,\n    getPath,\n    disableInlineStyles,\n  } = props;\n  const initialChildProps = {\n    parent: {\n      horizontal,\n      domain,\n      scale,\n      width,\n      height,\n      data,\n      standalone,\n      name,\n      theme,\n      padding,\n      style: style.parent,\n    },\n  };\n\n  const getDistance = (datum) => {\n    const current = scale.x(datum.x0);\n    const next = scale.x(datum.x1);\n    return Math.abs(next - current);\n  };\n\n  const getBarWidth = (datum) => {\n    if (binSpacing) {\n      return getDistance(datum) - binSpacing;\n    }\n\n    return getDistance(datum);\n  };\n\n  return data.reduce((childProps, datum, index) => {\n    const eventKey = !Helpers.isNil(datum.eventKey) ? datum.eventKey : index;\n\n    const { x, y, y0, x0 } = getBarPosition(props, datum);\n    const barWidth = getBarWidth(datum);\n\n    const dataProps = {\n      alignment: \"middle\",\n      barWidth,\n      cornerRadius,\n      data,\n      datum,\n      horizontal,\n      index,\n      scale,\n      style: disableInlineStyles ? {} : style.data,\n      width,\n      height,\n      x,\n      y,\n      y0,\n      x0,\n      getPath,\n      disableInlineStyles,\n    };\n\n    childProps[eventKey] = {\n      data: dataProps,\n    };\n\n    const text = LabelHelpers.getText(props, datum, index);\n    if (\n      (text !== undefined && text !== null) ||\n      (labels && (events || sharedEvents))\n    ) {\n      childProps[eventKey].labels = LabelHelpers.getProps(props, index);\n    }\n\n    return childProps;\n  }, initialChildProps);\n};\n"
  },
  {
    "path": "packages/victory-histogram/src/index.ts",
    "content": "export * from \"./victory-histogram\";\n"
  },
  {
    "path": "packages/victory-histogram/src/victory-histogram.test.tsx",
    "content": "import React from \"react\";\nimport { render, screen, fireEvent } from \"@testing-library/react\";\nimport { Helpers } from \"victory-core\";\n\nimport { isBar, getBarHeight } from \"../../../test/helpers\";\nimport { VictoryHistogram } from \"./victory-histogram\";\n\ndescribe(\"components/victory-histogram\", () => {\n  const DATA_COMPONENT_ID = \"data-component-id\";\n  const DataComponent = () => <div data-testid={DATA_COMPONENT_ID} />;\n\n  describe(\"default component rendering\", () => {\n    it(\"accepts user props\", () => {\n      render(\n        <VictoryHistogram data-testid=\"victory-histogram\" aria-label=\"Chart\" />,\n      );\n\n      const svgNode = screen.getByTestId(\"victory-histogram\");\n      expect(svgNode.getAttribute(\"aria-label\")).toEqual(\"Chart\");\n    });\n\n    it(\"renders an svg with the correct width and height\", () => {\n      const { container } = render(<VictoryHistogram />);\n      const svg = container.querySelector(\"svg\");\n      expect(svg?.getAttribute(\"style\")).toContain(\"width: 100%; height: 100%\");\n    });\n\n    it(\"renders an svg with the correct viewBox\", () => {\n      const { container } = render(<VictoryHistogram />);\n      const svg = container.querySelector(\"svg\");\n      const viewBoxValue = `0 0 ${450} ${300}`;\n      expect(svg?.getAttribute(\"viewBox\")).toEqual(viewBoxValue);\n    });\n\n    it(\"renders 0 bars\", () => {\n      const { container } = render(<VictoryHistogram />);\n      const bars = container.querySelectorAll(\"path\");\n      expect(bars).toHaveLength(0);\n    });\n\n    it(\"renders 4 bars\", () => {\n      const { container } = render(\n        <VictoryHistogram bins={[0, 10, 40, 50, 100]} />,\n      );\n      const bars = container.querySelectorAll(\"path\");\n      expect(bars).toHaveLength(4);\n    });\n\n    it(\"renders each bar as a rectangle\", () => {\n      const { container } = render(<VictoryHistogram bins={[0, 10, 40, 50]} />);\n      const barCommandStrings = Array.from(\n        container.querySelectorAll(\"path\"),\n      ).map((bar) => bar.getAttribute(\"d\"));\n\n      barCommandStrings.forEach((commandString) => {\n        expect(isBar(commandString)).toBeTruthy();\n      });\n    });\n  });\n\n  describe(\"rendering data\", () => {\n    it(\"renders bars for {x} shaped data (default)\", () => {\n      const data = Helpers.range(5).map((i) => ({ x: i }));\n      const { container } = render(<VictoryHistogram data={data} />);\n      const bars = container.querySelectorAll(\"path\");\n      expect(bars.length).toEqual(4);\n    });\n\n    it(\"renders bars for deeply-nested data\", () => {\n      const data = Helpers.range(5).map((i) => ({ a: { b: [{ x: i }] } }));\n      const { container } = render(\n        <VictoryHistogram data={data} x=\"a.b[0].x\" />,\n      );\n      const bars = container.querySelectorAll(\"path\");\n      expect(bars.length).toEqual(4);\n    });\n\n    it(\"renders 2 bars of equal height\", () => {\n      const data = [{ x: 2 }, { x: 3 }];\n      const { container } = render(\n        <VictoryHistogram data={data} bins={[2, 2.5, 3]} />,\n      );\n      const bars = Array.from(container.querySelectorAll(\"path\"));\n      const [height1, height2] = bars.map((bar) =>\n        getBarHeight(bar.getAttribute(\"d\")),\n      );\n\n      expect(bars).toHaveLength(2);\n      expect(height1).toEqual(height2);\n      expect(height1).toBeGreaterThan(0);\n    });\n\n    it(\"renders bars values with null accessor\", () => {\n      const data = Helpers.range(10);\n      render(\n        <VictoryHistogram\n          data={data}\n          // @ts-expect-error \"'null' is not assignable to 'x'\"\n          x={null}\n          y={null}\n          dataComponent={<DataComponent />}\n        />,\n      );\n      const bars = screen.getAllByTestId(DATA_COMPONENT_ID);\n      expect(bars.length).toBeGreaterThan(0);\n    });\n\n    it(\"renders bars with appropriate relative heights\", () => {\n      const { container } = render(\n        <VictoryHistogram\n          data={[{ x: 1 }, { x: 2 }, { x: 2 }, { x: 3 }, { x: 3 }, { x: 3 }]}\n          bins={[1, 2, 3, 4]}\n        />,\n      );\n      const bars = Array.from(container.querySelectorAll(\"path\"));\n      const [height1, height2, height3] = bars.map((bar) =>\n        getBarHeight(bar.getAttribute(\"d\")),\n      );\n\n      expect(height2 / 2).toBeCloseTo(height1);\n      expect((height3 * 2) / 3).toBeCloseTo(height2);\n    });\n  });\n\n  describe(\"event handling\", () => {\n    const clickHandler = jest.fn();\n\n    beforeEach(() => {\n      clickHandler.mockReset();\n    });\n\n    it(\"attaches an event to the parent svg\", () => {\n      const { container } = render(\n        <VictoryHistogram\n          events={[\n            {\n              target: \"parent\",\n              eventHandlers: { onClick: clickHandler },\n            },\n          ]}\n        />,\n      );\n      const svg = container.querySelector(\"svg\");\n      fireEvent.click(svg!);\n\n      expect(clickHandler).toHaveBeenCalled();\n      // the first argument is the standard event object\n      const contextualArg = clickHandler.mock.calls[0][1];\n      expect(contextualArg.key).toEqual(\"histogram-parent-parent\");\n    });\n\n    it(\"attaches an event to data\", () => {\n      const { container } = render(\n        <VictoryHistogram\n          data={[{ x: 1 }, { x: 1 }, { x: 2 }]}\n          bins={[1, 2, 3]}\n          events={[\n            {\n              target: \"data\",\n              eventHandlers: { onClick: clickHandler },\n            },\n          ]}\n        />,\n      );\n\n      const data = container.querySelectorAll(\"path\");\n      expect(data).toHaveLength(2);\n\n      data.forEach((node, index) => {\n        clickHandler.mockReset();\n        fireEvent.click(node);\n        expect(clickHandler).toHaveBeenCalled();\n        const contextualObject = clickHandler.mock.calls[0][1];\n        expect(contextualObject.key).toEqual(`histogram-data-${index}`);\n      });\n    });\n\n    it(\"attaches an event to a label\", () => {\n      const data = [{ x: 0 }, { x: 1 }, { x: 2 }];\n      render(\n        <VictoryHistogram\n          data={data}\n          bins={[0, 1, 2, 3]}\n          events={[\n            {\n              target: \"labels\",\n              eventHandlers: { onClick: clickHandler },\n            },\n          ]}\n          labels={({ datum }) => `Label: ${datum.x}`}\n        />,\n      );\n\n      data.forEach((datum) => {\n        clickHandler.mockReset();\n        const label = screen.getByText(`Label: ${datum.x + 0.5}`);\n        fireEvent.click(label);\n        expect(clickHandler).toHaveBeenCalled();\n      });\n    });\n  });\n\n  describe(\"accessibility\", () => {\n    it(\"adds an aria role to each bar in the series\", () => {\n      const data = Helpers.range(5).map((x) => ({ x }));\n      const { container } = render(<VictoryHistogram data={data} />);\n\n      container.querySelectorAll(\"path\").forEach((bar) => {\n        expect(bar.getAttribute(\"role\")).toEqual(\"presentation\");\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-histogram/src/victory-histogram.tsx",
    "content": "import React from \"react\";\nimport { Bar } from \"victory-bar\";\nimport {\n  Helpers,\n  VictoryLabel,\n  VictoryContainer,\n  VictoryTheme,\n  addEvents,\n  UserProps,\n  EventPropTypeInterface,\n  NumberOrCallback,\n  StringOrNumberOrCallback,\n  VictoryCommonProps,\n  VictoryDatableProps,\n  VictoryMultiLabelableProps,\n  VictoryStyleInterface,\n  EventsMixinClass,\n} from \"victory-core\";\nimport {\n  getBaseProps,\n  getData,\n  getDomain,\n  getFormattedData,\n} from \"./helper-methods\";\n\nexport type VictoryHistogramTargetType = \"data\" | \"labels\" | \"parent\";\n\nexport interface VictoryHistogramProps\n  extends Omit<VictoryCommonProps, \"polar\">,\n    Omit<VictoryDatableProps, \"y\" | \"y0\">,\n    VictoryMultiLabelableProps {\n  binSpacing?: number;\n  bins?: number | number[] | Date[];\n  cornerRadius?:\n    | NumberOrCallback\n    | {\n        top?: NumberOrCallback;\n        topLeft?: NumberOrCallback;\n        topRight?: NumberOrCallback;\n        bottom?: NumberOrCallback;\n        bottomLeft?: NumberOrCallback;\n        bottomRight?: NumberOrCallback;\n      };\n  events?: EventPropTypeInterface<\n    VictoryHistogramTargetType,\n    number | string | number[] | string[]\n  >[];\n  eventKey?: StringOrNumberOrCallback;\n  style?: VictoryStyleInterface;\n}\n\nconst fallbackProps: Partial<VictoryHistogramProps> = {\n  width: 450,\n  height: 300,\n  padding: 50,\n};\n\nconst defaultData = [];\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface VictoryHistogramBase\n  extends EventsMixinClass<VictoryHistogramProps> {}\n\n/**\n * Draw SVG histogram charts with React. VictoryHistogram is a composable component, so it doesn't include axes\n * Check out VictoryChart for complete histogram charts and more.\n */\nclass VictoryHistogramBase extends React.Component<VictoryHistogramProps> {\n  static animationWhitelist = [\n    \"data\",\n    \"domain\",\n    \"height\",\n    \"padding\",\n    \"style\",\n    \"width\",\n  ];\n\n  static displayName = \"VictoryHistogram\";\n\n  static role = \"histogram\";\n\n  static defaultTransitions = {\n    onLoad: {\n      duration: 2000,\n      before: () => ({ _y: 0, _y1: 0, _y0: 0 }),\n      after: (datum) => ({ _y: datum._y, _y1: datum._y1, _y0: datum._y0 }),\n    },\n    onExit: {\n      duration: 500,\n      before: () => ({ _y: 0, yOffset: 0 }),\n    },\n    onEnter: {\n      duration: 500,\n      before: () => ({ _y: 0, _y1: 0, _y0: 0 }),\n      after: (datum) => ({ _y: datum._y, _y1: datum._y1, _y0: datum._y0 }),\n    },\n  };\n\n  static getFormattedData(...args: any) {\n    return getFormattedData(...args);\n  }\n\n  static defaultProps: VictoryHistogramProps = {\n    containerComponent: <VictoryContainer />,\n    data: defaultData,\n    dataComponent: <Bar />,\n    groupComponent: <g role=\"presentation\" />,\n    labelComponent: <VictoryLabel />,\n    samples: 50,\n    sortOrder: \"ascending\",\n    standalone: true,\n    theme: VictoryTheme.grayscale,\n  };\n\n  static getDomain(props, axis) {\n    return getDomain(props, axis);\n  }\n  static getData(props) {\n    return getData(props);\n  }\n  static getBaseProps(props: VictoryHistogramProps) {\n    return getBaseProps(props, fallbackProps);\n  }\n  static expectedComponents: Partial<keyof VictoryHistogramProps>[] = [\n    \"dataComponent\",\n    \"labelComponent\",\n    \"groupComponent\",\n    \"containerComponent\",\n  ];\n\n  // Overridden in native versions\n  shouldAnimate() {\n    return !!this.props.animate;\n  }\n\n  render(): React.ReactElement {\n    const { animationWhitelist, role } = VictoryHistogramBase;\n    const props = Helpers.modifyProps(this.props, fallbackProps, role);\n\n    if (this.shouldAnimate()) {\n      return this.animateComponent(props, animationWhitelist);\n    }\n\n    const children = this.renderData(props);\n\n    const component = props.standalone\n      ? this.renderContainer(props.containerComponent, children)\n      : children;\n\n    return UserProps.withSafeUserProps(component, props);\n  }\n}\n\nexport const VictoryHistogram = addEvents(VictoryHistogramBase);\n"
  },
  {
    "path": "packages/victory-histogram/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-histogram/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-legend/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-legend/CHANGELOG.md",
    "content": "# victory-legend\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n### Patch Changes\n\n- Remove deprecated babel-plugin-lodash plugin ([#2965](https://github.com/FormidableLabs/victory/pull/2965))\n\n* Improve types in victory-core helpers ([#2999](https://github.com/FormidableLabs/victory/pull/2999))\n\n## 37.3.2\n\n## 37.3.1\n\n## 37.3.0\n\n## 37.2.0\n\n### Minor Changes\n\n- Minor updates for clean theme ([#2909](https://github.com/FormidableLabs/victory/pull/2909))\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n## 37.0.1\n\n### Patch Changes\n\n- Fix the signature of class static functions in components ([#2840](https://github.com/FormidableLabs/victory/pull/2840))\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n### Patch Changes\n\n- Replace lodash keys with native code ([#2811](https://github.com/FormidableLabs/victory/pull/2811))\n\n* Replace lodash sum with native code ([#2831](https://github.com/FormidableLabs/victory/pull/2831))\n\n- Replace lodash isNil and isNan with native code ([#2800](https://github.com/FormidableLabs/victory/pull/2800))\n\n* Replace lodash isFunction with native code ([#2802](https://github.com/FormidableLabs/victory/pull/2802))\n\n## 36.9.1\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n## 36.8.4\n\n## 36.8.3\n\n### Patch Changes\n\n- Refactor param reassignments ([#2724](https://github.com/FormidableLabs/victory/pull/2724))\n\n## 36.8.2\n\n### Patch Changes\n\n- Migrate victory-legend to TypeScript ([#2712](https://github.com/FormidableLabs/victory/pull/2712))\n\n## 36.8.1\n\n## 36.8.0\n\n### Patch Changes\n\n- Add missing size property to TS definitions ([#2523](https://github.com/FormidableLabs/victory/pull/2523))\n\n## 36.7.0\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-core@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n- Updated dependencies [[`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-core@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-core@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- Updated dependencies [[`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-core@36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Update source code with minor lint-based improvements (see [#2236](https://github.com/FormidableLabs/victory/issues/2236)). ([#2403](https://github.com/FormidableLabs/victory/pull/2403))\n\n- Updated dependencies [[`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-core@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-legend/README.md",
    "content": "# VictoryLegend\n\n`victory-legend@^30.0.0` exports `VictoryLegend`\n\nTo view documentation for `VictoryLegend` please see https://commerce.nearform.com/open-source/victory/docs/victory-legend\n\nTo suggest an addition or correction to this documentation please see https://github.com/FormidableLabs/victory/blob/main/docs/src/content/docs/victory-legend.md\n"
  },
  {
    "path": "packages/victory-legend/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-legend/package.json",
    "content": "{\n  \"name\": \"victory-legend\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Legend Component for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"lodash\": \"^4.17.19\",\n    \"victory-core\": \"37.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:build\",\n        \"../victory-vendor:build\",\n        \"../victory-voronoi:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-legend/src/helper-methods.ts",
    "content": "import defaults from \"lodash/defaults\";\nimport groupBy from \"lodash/groupBy\";\nimport range from \"lodash/range\";\nimport { Helpers, Style, TextSize } from \"victory-core\";\nimport { VictoryLegendProps } from \"./victory-legend\";\n\nconst getColorScale = (props) => {\n  const { colorScale, theme } = props;\n  return typeof colorScale === \"string\"\n    ? Style.getColorScale(colorScale, theme)\n    : colorScale || [];\n};\n\nconst getLabelStyles = (props) => {\n  const { data, style } = props;\n  return data.map((datum, index) => {\n    const baseLabelStyles = defaults({}, datum.labels, style.labels);\n    return Helpers.evaluateStyle(baseLabelStyles, { datum, index, data });\n  });\n};\n\nconst getStyles = (props, styleObject: VictoryLegendProps[\"style\"] = {}) => {\n  const style = props.style || {};\n  const parentStyleProps = { height: \"100%\", width: \"100%\" };\n  return {\n    parent: defaults(style.parent, styleObject.parent, parentStyleProps),\n    data: defaults({}, style.data, styleObject.data),\n    labels: defaults({}, style.labels, styleObject.labels),\n    border: defaults({}, style.border, styleObject.border),\n    title: defaults({}, style.title, styleObject.title),\n  };\n};\n\nconst getCalculatedValues = (props) => {\n  const { orientation, theme } = props;\n  const defaultStyles =\n    theme && theme.legend && theme.legend.style ? theme.legend.style : {};\n  const style = getStyles(props, defaultStyles);\n  const colorScale = getColorScale(props);\n  const isHorizontal = orientation === \"horizontal\";\n  const borderPadding = Helpers.getPadding(props.borderPadding);\n  return Object.assign({}, props, {\n    style,\n    isHorizontal,\n    colorScale,\n    borderPadding,\n  });\n};\n\nconst getColumn = (props, index) => {\n  const { itemsPerRow, isHorizontal } = props;\n  if (!itemsPerRow) {\n    return isHorizontal ? index : 0;\n  }\n  return isHorizontal ? index % itemsPerRow : Math.floor(index / itemsPerRow);\n};\n\nconst getRow = (props, index) => {\n  const { itemsPerRow, isHorizontal } = props;\n  if (!itemsPerRow) {\n    return isHorizontal ? 0 : index;\n  }\n  return isHorizontal ? Math.floor(index / itemsPerRow) : index % itemsPerRow;\n};\n\nconst groupData = (props) => {\n  const { data } = props;\n  const style = (props.style && props.style.data) || {};\n  const labelStyles = getLabelStyles(props);\n  return data.map((datum, index) => {\n    const symbol = datum.symbol || {};\n    const { fontSize } = labelStyles[index];\n    // eslint-disable-next-line no-magic-numbers\n    const size = symbol.size || style.size || fontSize / 2.5;\n    const symbolSpacer = props.symbolSpacer || Math.max(size, fontSize);\n    return {\n      ...datum,\n      size,\n      symbolSpacer,\n      fontSize,\n      textSize: TextSize.approximateTextSize(datum.name, labelStyles[index]),\n      column: getColumn(props, index),\n      row: getRow(props, index),\n    };\n  });\n};\n\nconst getColumnWidths = (props, data) => {\n  const gutter = props.gutter || {};\n  const gutterWidth =\n    typeof gutter === \"object\"\n      ? (gutter.left || 0) + (gutter.right || 0)\n      : gutter || 0;\n  const dataByColumn = groupBy(data, \"column\");\n  const columns = Object.keys(dataByColumn);\n  return columns.reduce<number[]>((memo, curr, index) => {\n    const lengths = dataByColumn[curr].map((d) => {\n      return d.textSize.width + d.size + d.symbolSpacer + gutterWidth;\n    });\n    memo[index] = Math.max(...lengths);\n    return memo;\n  }, []);\n};\n\nconst getRowHeights = (props, data) => {\n  const gutter = props.rowGutter || {};\n  const gutterHeight =\n    typeof gutter === \"object\"\n      ? (gutter.top || 0) + (gutter.bottom || 0)\n      : gutter || 0;\n  const dataByRow = groupBy(data, \"row\");\n  return Object.keys(dataByRow).reduce<number[]>((memo, curr, index) => {\n    const rows = dataByRow[curr];\n    const lengths = rows.map((d) => {\n      return d.textSize.height + d.symbolSpacer + gutterHeight;\n    });\n    memo[index] = Math.max(...lengths);\n    return memo;\n  }, []);\n};\n\nconst getTitleDimensions = (props) => {\n  const style = (props.style && props.style.title) || {};\n  const textSize = TextSize.approximateTextSize(props.title, style);\n  const padding = style.padding || 0;\n  return {\n    height: textSize.height + 2 * padding || 0,\n    width: textSize.width + 2 * padding || 0,\n  };\n};\n\nconst getOffset = (datum, rowHeights, columnWidths) => {\n  const { column, row } = datum;\n  return {\n    x: range(column).reduce((memo, curr) => memo + columnWidths[curr], 0),\n    y: range(row).reduce((memo, curr) => memo + rowHeights[curr], 0),\n  };\n};\n\nconst getAnchors = (titleOrientation, centerTitle) => {\n  const standardAnchors = {\n    textAnchor: titleOrientation === \"right\" ? \"end\" : \"start\",\n    verticalAnchor: titleOrientation === \"bottom\" ? \"end\" : \"start\",\n  };\n  if (centerTitle) {\n    const horizontal =\n      titleOrientation === \"top\" || titleOrientation === \"bottom\";\n    return {\n      textAnchor: horizontal ? \"middle\" : standardAnchors.textAnchor,\n      verticalAnchor: horizontal ? standardAnchors.verticalAnchor : \"middle\",\n    };\n  }\n  return standardAnchors;\n};\n\nconst getTitleStyle = (props) => {\n  const { titleOrientation, centerTitle, titleComponent } = props;\n  const baseStyle = (props.style && props.style.title) || {};\n  const componentStyle =\n    (titleComponent.props && titleComponent.props.style) || {};\n  const anchors = getAnchors(titleOrientation, centerTitle);\n  return Array.isArray(componentStyle)\n    ? componentStyle.map((obj) => defaults({}, obj, baseStyle, anchors))\n    : defaults({}, componentStyle, baseStyle, anchors);\n};\n\nconst getTitleProps = (props, borderProps) => {\n  const { title, titleOrientation, centerTitle, borderPadding } = props;\n  const { height, width } = borderProps;\n  const style = getTitleStyle(props);\n  const padding = Array.isArray(style) ? style[0].padding : style.padding;\n  const horizontal =\n    titleOrientation === \"top\" || titleOrientation === \"bottom\";\n  const xOrientation = titleOrientation === \"bottom\" ? \"bottom\" : \"top\";\n  const yOrientation = titleOrientation === \"right\" ? \"right\" : \"left\";\n  const standardPadding = {\n    x: centerTitle ? width / 2 : borderPadding[xOrientation] + (padding || 0),\n    y: centerTitle ? height / 2 : borderPadding[yOrientation] + (padding || 0),\n  };\n  const getPadding = () => {\n    return borderPadding[titleOrientation] + (padding || 0);\n  };\n  const xOffset = horizontal ? standardPadding.x : getPadding();\n  const yOffset = horizontal ? getPadding() : standardPadding.y;\n\n  return {\n    x:\n      titleOrientation === \"right\"\n        ? props.x + width - xOffset\n        : props.x + xOffset,\n    y:\n      titleOrientation === \"bottom\"\n        ? props.y + height - yOffset\n        : props.y + yOffset,\n    style,\n    text: title,\n  };\n};\n\nconst getBorderProps = (props, contentHeight, contentWidth) => {\n  const { x, y, borderPadding, style } = props;\n  const height =\n    (contentHeight || 0) + borderPadding.top + borderPadding.bottom;\n  const width = (contentWidth || 0) + borderPadding.left + borderPadding.right;\n  return {\n    x,\n    y,\n    height,\n    width,\n    style: Object.assign({ fill: \"none\" }, style.border),\n  };\n};\n\nexport const getDimensions = (initialProps, fallbackProps) => {\n  const modifiedProps = Helpers.modifyProps(\n    initialProps,\n    fallbackProps,\n    \"legend\",\n  );\n  const props = Object.assign(\n    {},\n    modifiedProps,\n    getCalculatedValues(modifiedProps),\n  );\n  const { title, titleOrientation } = props;\n  const groupedData = groupData(props);\n  const columnWidths = getColumnWidths(props, groupedData);\n  const rowHeights = getRowHeights(props, groupedData);\n  const titleDimensions = title\n    ? getTitleDimensions(props)\n    : { height: 0, width: 0 };\n\n  return {\n    height:\n      titleOrientation === \"left\" || titleOrientation === \"right\"\n        ? Math.max(sum(rowHeights), titleDimensions.height)\n        : sum(rowHeights) + titleDimensions.height,\n    width:\n      titleOrientation === \"left\" || titleOrientation === \"right\"\n        ? sum(columnWidths) + titleDimensions.width\n        : Math.max(sum(columnWidths), titleDimensions.width),\n  };\n};\n\nexport const getBaseProps = (initialProps, fallbackProps) => {\n  const modifiedProps = Helpers.modifyProps(\n    initialProps,\n    fallbackProps,\n    \"legend\",\n  );\n  const props = Object.assign(\n    {},\n    modifiedProps,\n    getCalculatedValues(modifiedProps),\n  );\n  const {\n    data,\n    standalone,\n    theme,\n    padding,\n    style,\n    colorScale,\n    gutter,\n    rowGutter,\n    borderPadding,\n    title,\n    titleOrientation,\n    name,\n    x = 0,\n    y = 0,\n  } = props;\n  const groupedData = groupData(props);\n  const columnWidths = getColumnWidths(props, groupedData);\n  const rowHeights = getRowHeights(props, groupedData);\n  const labelStyles = getLabelStyles(props);\n  const titleDimensions = title\n    ? getTitleDimensions(props)\n    : { height: 0, width: 0 };\n  const titleOffset = {\n    x: titleOrientation === \"left\" ? titleDimensions.width : 0,\n    y: titleOrientation === \"top\" ? titleDimensions.height : 0,\n  };\n  const gutterOffset = {\n    x: gutter && typeof gutter === \"object\" ? gutter.left || 0 : 0,\n    y: rowGutter && typeof rowGutter === \"object\" ? rowGutter.top || 0 : 0,\n  };\n  const { height, width } = getDimensions(props, fallbackProps);\n  const borderProps = getBorderProps(props, height, width);\n  const titleProps = getTitleProps(props, borderProps);\n  const initialChildProps = {\n    parent: {\n      data,\n      standalone,\n      theme,\n      padding,\n      name,\n      height: props.height,\n      width: props.width,\n      style: style.parent,\n    },\n    all: { border: borderProps, title: titleProps },\n  };\n  return groupedData.reduce((childProps, datum, i) => {\n    const color = colorScale[i % colorScale.length];\n    const dataStyle = defaults({}, datum.symbol, style.data, { fill: color });\n    const eventKey = !Helpers.isNil(datum.eventKey) ? datum.eventKey : i;\n    const offset = getOffset(datum, rowHeights, columnWidths);\n    const originY = y + borderPadding.top + datum.symbolSpacer;\n    const originX = x + borderPadding.left + datum.symbolSpacer;\n    const dataProps = {\n      index: i,\n      data,\n      datum,\n      symbol: dataStyle.type || dataStyle.symbol || \"circle\",\n      size: datum.size,\n      style: dataStyle,\n      y: originY + offset.y + titleOffset.y + gutterOffset.y,\n      x: originX + offset.x + titleOffset.x + gutterOffset.x,\n    };\n\n    const labelProps = {\n      datum,\n      data,\n      text: datum.name,\n      style: labelStyles[i],\n      y: dataProps.y,\n      x: dataProps.x + datum.symbolSpacer + datum.size / 2,\n    };\n    childProps[eventKey] = { data: dataProps, labels: labelProps };\n\n    return childProps;\n  }, initialChildProps);\n};\n\n/**\n * Computes the sum of the values in `array`.\n * @param {Array} array The array to iterate over.\n * @returns {number} Returns the sum.\n */\nfunction sum(array: number[]) {\n  if (array && array.length) {\n    let value = 0;\n    for (let i = 0; i < array.length; i++) {\n      value += array[i];\n    }\n    return value;\n  }\n  return 0;\n}\n"
  },
  {
    "path": "packages/victory-legend/src/index.ts",
    "content": "export * from \"./victory-legend\";\n"
  },
  {
    "path": "packages/victory-legend/src/victory-legend.test.tsx",
    "content": "import React from \"react\";\nimport { render, screen } from \"@testing-library/react\";\n\nimport { isCircle, isTriangle } from \"../../../test/helpers\";\nimport { VictoryLegend } from \"./victory-legend\";\n\ndescribe(\"components/victory-legend\", () => {\n  const initialData = [\n    {\n      name: \"Series 1\",\n      symbol: {\n        type: \"circle\",\n      },\n    },\n    {\n      name: \"Series 2\",\n      labels: {\n        fill: \"red\",\n      },\n      symbol: {\n        type: \"triangleUp\",\n        fill: \"blue\",\n      },\n    },\n  ];\n\n  it(\"renders provided data correctly\", () => {\n    const { container } = render(<VictoryLegend data={initialData} />);\n    const legendLabels = container.querySelectorAll(\"text\");\n\n    expect(legendLabels).toHaveLength(initialData.length);\n  });\n\n  it(\"has expected horizontal label position\", () => {\n    const { container } = render(\n      <VictoryLegend data={initialData} orientation=\"horizontal\" />,\n    );\n\n    const [label1, label2] = container.querySelectorAll(\"text\");\n\n    expect(label1.getAttribute(\"y\")).toEqual(label2.getAttribute(\"y\"));\n  });\n\n  it(\"has expected vertical symbol position\", () => {\n    const { container } = render(\n      <VictoryLegend data={initialData} orientation=\"vertical\" />,\n    );\n\n    const [label1, label2] = container.querySelectorAll(\"text\");\n\n    expect(label1.getAttribute(\"x\")).toEqual(label2.getAttribute(\"x\"));\n  });\n\n  describe(\"symbols\", () => {\n    const legendData = [\n      {\n        name: \"Series 1\",\n        labels: {\n          fontSize: 10,\n        },\n        symbol: {\n          type: \"circle\",\n          fill: \"red\",\n        },\n      },\n      {\n        name: \"Long Series Name\",\n        labels: {\n          fontSize: 12,\n        },\n        symbol: {\n          type: \"triangleUp\",\n          fill: \"blue\",\n        },\n      },\n    ];\n\n    it(\"has expected symbols length\", () => {\n      const { container } = render(<VictoryLegend data={legendData} />);\n      const symbols = container.querySelectorAll(\"path\");\n      expect(symbols).toHaveLength(2);\n    });\n\n    it(\"has expected symbol colors\", () => {\n      const { container } = render(<VictoryLegend data={legendData} />);\n      const symbols = container.querySelectorAll(\"path\");\n\n      symbols.forEach((symbol, index) => {\n        const style = symbol.getAttribute(\"style\");\n        expect(style).toContain(legendData[index].symbol.fill);\n      });\n    });\n\n    it(\"has expected symbol type\", () => {\n      const { container } = render(<VictoryLegend data={legendData} />);\n      const [circleSymbol, triangleSymbol] = Array.from(\n        container.querySelectorAll(\"path\"),\n      ).map((symbol) => symbol.getAttribute(\"d\"));\n\n      expect(isCircle(circleSymbol)).toBeTruthy();\n      expect(isTriangle(triangleSymbol)).toBeTruthy();\n    });\n  });\n\n  describe(\"legend style prop\", () => {\n    const legendData = [\n      {\n        name: \"Thing 1\",\n      },\n      {\n        name: \"Thing 2\",\n      },\n    ];\n\n    const styleObject = {\n      data: {\n        type: \"triangleUp\",\n        fill: \"green\",\n      },\n      labels: {\n        fontSize: 16,\n      },\n    };\n\n    it(\"has expected symbol type\", () => {\n      const { container } = render(\n        <VictoryLegend data={legendData} style={styleObject} />,\n      );\n\n      container.querySelectorAll(\"path\").forEach((symbol) => {\n        const svgPath = symbol.getAttribute(\"d\");\n        expect(isTriangle(svgPath)).toBeTruthy();\n      });\n    });\n\n    it(\"has expected symbol colors\", () => {\n      const { container } = render(\n        <VictoryLegend data={legendData} style={styleObject} />,\n      );\n\n      container.querySelectorAll(\"path\").forEach((item) => {\n        expect(item.getAttribute(\"style\")).toContain(styleObject.data.fill);\n      });\n    });\n\n    it(\"has expected label colors\", () => {\n      render(<VictoryLegend data={legendData} style={styleObject} />);\n\n      legendData.forEach(({ name }) => {\n        const label = screen.getByText(name);\n        expect(label.getAttribute(\"style\")).toContain(\"#252525\");\n      });\n    });\n  });\n\n  describe(\"itemsPerRow\", () => {\n    const legendData = [\n      {\n        name: \"Thing 1\",\n      },\n      {\n        name: \"Thing 2\",\n      },\n      {\n        name: \"Thing 3\",\n      },\n      {\n        name: \"Thing 4\",\n      },\n      {\n        name: \"Thing 5\",\n      },\n      {\n        name: \"Thing 6\",\n      },\n    ];\n\n    const splitArrayAtIndex = (array, index) => {\n      const half1 = array.slice(0, index);\n      const half2 = array.slice(index, array.length);\n      return [half1, half2];\n    };\n\n    it(\"aligns items in columns\", () => {\n      const { container } = render(\n        <VictoryLegend data={legendData} itemsPerRow={3} />,\n      );\n      const labels = Array.from(container.querySelectorAll(\"text\"));\n\n      expect(labels).toHaveLength(6);\n\n      const [column1, column2] = splitArrayAtIndex(labels, 3);\n\n      // items line up between columns\n      column1.forEach((item, index) => {\n        const correspondingColumnItemY = column2[index].getAttribute(\"y\");\n        expect(item.getAttribute(\"y\")).toEqual(correspondingColumnItemY);\n      });\n    });\n\n    it(\"aligns items in rows\", () => {\n      const { container } = render(\n        <VictoryLegend\n          data={legendData}\n          itemsPerRow={3}\n          orientation=\"horizontal\"\n        />,\n      );\n\n      const labels = Array.from(container.querySelectorAll(\"text\"));\n\n      expect(labels).toHaveLength(6);\n\n      const rows = splitArrayAtIndex(labels, 3);\n\n      // each row is on the same y axis\n      rows.forEach((row) => {\n        const rowYValue = row[0].getAttribute(\"y\");\n        const allInSameRow = row.every(\n          (item) => item.getAttribute(\"y\") === rowYValue,\n        );\n        expect(allInSameRow).toBeTruthy();\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-legend/src/victory-legend.tsx",
    "content": "import React from \"react\";\nimport { getBaseProps, getDimensions } from \"./helper-methods\";\nimport {\n  addEvents,\n  Helpers,\n  VictoryLabel,\n  VictoryContainer,\n  VictoryTheme,\n  Point,\n  Border,\n  BlockProps,\n  ColorScalePropType,\n  EventPropTypeInterface,\n  OrientationTypes,\n  PaddingProps,\n  StringOrNumberOrCallback,\n  VictoryCommonProps,\n  VictoryDatableProps,\n  VictorySingleLabelableProps,\n  VictoryStyleInterface,\n  VictoryLabelStyleObject,\n  EventsMixinClass,\n} from \"victory-core\";\n\nexport type VictoryLegendTTargetType = \"data\" | \"labels\" | \"parent\";\n\nexport type VictoryLegendOrientationType = \"horizontal\" | \"vertical\";\n\nexport interface VictoryLegendProps\n  extends VictoryCommonProps,\n    VictoryDatableProps,\n    VictorySingleLabelableProps {\n  borderComponent?: React.ReactElement;\n  borderPadding?: PaddingProps;\n  centerTitle?: boolean;\n  colorScale?: ColorScalePropType;\n  dataComponent?: React.ReactElement;\n  eventKey?: StringOrNumberOrCallback | string[];\n  events?: EventPropTypeInterface<\n    VictoryLegendTTargetType,\n    StringOrNumberOrCallback\n  >[];\n  gutter?: number | { left: number; right: number };\n  itemsPerRow?: number;\n  orientation?: VictoryLegendOrientationType;\n  rowGutter?: number | Omit<BlockProps, \"left\" | \"right\">;\n  style?: VictoryStyleInterface & {\n    title?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n  };\n  symbolSpacer?: number;\n  title?: string | string[];\n  titleComponent?: React.ReactElement;\n  titleOrientation?: OrientationTypes;\n}\n\nconst fallbackProps = {\n  orientation: \"vertical\",\n  titleOrientation: \"top\",\n  width: 450,\n  height: 300,\n  x: 0,\n  y: 0,\n};\n\nconst defaultLegendData = [{ name: \"Series 1\" }, { name: \"Series 2\" }];\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface VictoryLegendBase extends EventsMixinClass<VictoryLegendProps> {}\n\nclass VictoryLegendBase extends React.Component<VictoryLegendProps> {\n  static displayName = \"VictoryLegend\";\n\n  static role = \"legend\";\n\n  static defaultProps = {\n    borderComponent: <Border />,\n    data: defaultLegendData,\n    containerComponent: <VictoryContainer />,\n    dataComponent: <Point />,\n    groupComponent: <g />,\n    labelComponent: <VictoryLabel />,\n    standalone: true,\n    theme: VictoryTheme.grayscale,\n    titleComponent: <VictoryLabel />,\n  };\n\n  static getBaseProps(props: VictoryLegendProps) {\n    return getBaseProps(props, fallbackProps);\n  }\n\n  static getDimensions(props: VictoryLegendProps) {\n    return getDimensions(props, fallbackProps);\n  }\n\n  static expectedComponents = [\n    \"borderComponent\",\n    \"containerComponent\",\n    \"dataComponent\",\n    \"groupComponent\",\n    \"labelComponent\",\n    \"titleComponent\",\n  ];\n\n  renderChildren(props: VictoryLegendProps) {\n    const { dataComponent, labelComponent, title } = props;\n\n    const children: React.ReactElement[] = [];\n\n    if (props.borderComponent) {\n      const borderProps = this.getComponentProps(\n        props.borderComponent,\n        \"border\",\n        \"all\",\n      );\n      const borderComponent = React.cloneElement(\n        props.borderComponent,\n        borderProps,\n      );\n\n      children.push(borderComponent);\n    }\n\n    if (dataComponent) {\n      const dataComponents = this.dataKeys\n        .map((_dataKey, index) => {\n          if (_dataKey === \"all\") {\n            return undefined;\n          }\n          const dataProps = this.getComponentProps(\n            dataComponent,\n            \"data\",\n            index,\n          );\n          return React.cloneElement(dataComponent, dataProps);\n        })\n        .filter(\n          (comp: React.ReactElement | undefined): comp is React.ReactElement =>\n            comp !== undefined,\n        );\n\n      children.push(...dataComponents);\n    }\n\n    if (title && props.titleComponent) {\n      const titleProps = this.getComponentProps(title, \"title\", \"all\");\n      const titleComponent = React.cloneElement(\n        props.titleComponent,\n        titleProps,\n      );\n\n      children.push(titleComponent);\n    }\n\n    if (labelComponent) {\n      const labelComponents = this.dataKeys\n        .map((_dataKey, index) => {\n          if (_dataKey === \"all\") {\n            return undefined;\n          }\n          const labelProps = this.getComponentProps(\n            labelComponent,\n            \"labels\",\n            index,\n          );\n          if (\n            (labelProps as any).text !== undefined &&\n            (labelProps as any).text !== null\n          ) {\n            return React.cloneElement(labelComponent, labelProps);\n          }\n          return undefined;\n        })\n        .filter(\n          (comp: React.ReactElement | undefined): comp is React.ReactElement =>\n            comp !== undefined,\n        );\n\n      children.push(...labelComponents);\n    }\n\n    return children;\n  }\n\n  render(): React.ReactElement {\n    // @ts-expect-error Property 'role' does not exist on type 'Function'.\n    // Ref: https://github.com/microsoft/TypeScript/issues/32452\n    const { role } = this.constructor;\n    const props = Helpers.modifyProps(this.props, fallbackProps, role);\n    const children = this.renderChildren(props);\n    return props.standalone\n      ? this.renderContainer(props.containerComponent, children)\n      : React.cloneElement(props.groupComponent, {}, children);\n  }\n}\n\nexport const VictoryLegend = addEvents(VictoryLegendBase);\n"
  },
  {
    "path": "packages/victory-legend/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-legend/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-line/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-line/CHANGELOG.md",
    "content": "# victory-line\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n### Patch Changes\n\n- Remove deprecated babel-plugin-lodash plugin ([#2965](https://github.com/FormidableLabs/victory/pull/2965))\n\n## 37.3.2\n\n## 37.3.1\n\n### Patch Changes\n\n- Remove duplicate types from interfaces ([#2940](https://github.com/FormidableLabs/victory/pull/2940))\n\n## 37.3.0\n\n## 37.2.0\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n### Patch Changes\n\n- Ensure undefined props do not overwrite defaults ([#2852](https://github.com/FormidableLabs/victory/pull/2852))\n\n## 37.0.1\n\n### Patch Changes\n\n- Fix the signature of class static functions in components ([#2840](https://github.com/FormidableLabs/victory/pull/2840))\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n### Patch Changes\n\n- Replace lodash isNil and isNan with native code ([#2800](https://github.com/FormidableLabs/victory/pull/2800))\n\n* Replace lodash isFunction with native code ([#2802](https://github.com/FormidableLabs/victory/pull/2802))\n\n## 36.9.1\n\n### Patch Changes\n\n- Fix victory-native component prop types ([#2785](https://github.com/FormidableLabs/victory/pull/2785))\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n* Replace instances of lodash.range with equivalent native code ([#2760](https://github.com/FormidableLabs/victory/pull/2760))\n\n## 36.8.4\n\n## 36.8.3\n\n## 36.8.2\n\n## 36.8.1\n\n## 36.8.0\n\n### Minor Changes\n\n- Remove v37 experimental code ([#2697](https://github.com/FormidableLabs/victory/pull/2697))\n\n### Patch Changes\n\n- Remove usage of defaultProps from components ([#2679](https://github.com/FormidableLabs/victory/pull/2679))\n\n## 36.7.0\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n* Set VictoryLine to default to \"pointer-events: stroke\" so that events fire properly when lines overlap (fixes [#2468](https://github.com/FormidableLabs/victory/issues/2468)) ([#2530](https://github.com/FormidableLabs/victory/pull/2530))\n\n## 36.6.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.8\n  - victory-vendor@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Type improvement: `VictoryLineProps.animate` can be an object (fixes [#2463](https://github.com/FormidableLabs/victory/issues/2463)) ([`3f476632f`](https://github.com/FormidableLabs/victory/commit/3f476632fcd41c31cb69fcfae74d1bbaaa78103d))\n\n- Updated dependencies []:\n  - victory-core@36.6.7\n  - victory-vendor@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.6\n  - victory-vendor@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416), [`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-core@36.6.5\n  - victory-vendor@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n- Updated dependencies [[`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-core@36.6.4\n  - victory-vendor@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-core@36.6.3\n  - victory-vendor@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.2\n  - victory-vendor@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- Updated dependencies [[`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-core@36.6.1\n  - victory-vendor@36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Update source code with minor lint-based improvements (see [#2236](https://github.com/FormidableLabs/victory/issues/2236)). ([#2403](https://github.com/FormidableLabs/victory/pull/2403))\n\n- Updated dependencies [[`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-core@36.6.0\n  - victory-vendor@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-line/README.md",
    "content": "# VictoryLine\n\n`victory-line@^30.0.0` exports `VictoryLine` and `Curve` components\n\nTo view documentation for `VictoryLine` please see https://commerce.nearform.com/open-source/victory/docs/victory-line\n\nTo suggest an addition or correction to this documentation please see https://github.com/FormidableLabs/victory/blob/main/docs/src/content/docs/victory-line.md\n"
  },
  {
    "path": "packages/victory-line/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-line/package.json",
    "content": "{\n  \"name\": \"victory-line\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Line Component for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"lodash\": \"^4.17.19\",\n    \"victory-core\": \"37.3.6\",\n    \"victory-vendor\": \"37.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"devDependencies\": {\n    \"victory-chart\": \"*\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\",\n        \"../victory-vendor:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:cjs\",\n        \"../victory-vendor:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\",\n        \"../victory-vendor:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\",\n        \"../victory-vendor:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-chart:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-vendor:build\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-chart:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-vendor:build\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-chart:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:build\",\n        \"../victory-vendor:build\",\n        \"../victory-chart:build\",\n        \"../victory-voronoi:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-line/src/curve.test.tsx",
    "content": "import React from \"react\";\nimport * as d3Scale from \"victory-vendor/d3-scale\";\nimport { render } from \"@testing-library/react\";\n\nimport { SVGWrapper } from \"../../../test/helpers\";\nimport { Curve } from \"./curve\";\n\ndescribe(\"victory-primitives/curve\", () => {\n  const baseProps = {\n    data: [\n      { _x1: 1, x1: 1, _y1: 4, y1: 4, eventKey: 0 },\n      { _x1: 2, x1: 2, _y1: 5, y1: 5, eventKey: 1 },\n      { _x1: 3, x1: 3, _y1: 7, y1: 7, eventKey: 2 },\n      { _x1: 4, x1: 4, _y1: 10, y1: 10, eventKey: 3 },\n      { _x1: 5, x1: 5, _y1: 15, y1: 15, eventKey: 4 },\n    ],\n    scale: {\n      x: d3Scale.scaleLinear(),\n      y: d3Scale.scaleLinear(),\n    },\n    interpolation: \"basis\",\n  };\n\n  it(\"should render a single curve for consecutive data\", () => {\n    const { container } = render(<Curve {...baseProps} />, {\n      wrapper: SVGWrapper,\n    });\n    expect(container.querySelector(\"path\")).toMatchInlineSnapshot(`\n      <path\n        d=\"M1,4L1.1666666666666667,4.166666666666667C1.3333333333333333,4.333333333333333,1.6666666666666667,4.666666666666667,2,5.166666666666667C2.3333333333333335,5.666666666666667,2.6666666666666665,6.333333333333333,3,7.166666666666667C3.3333333333333335,8,3.6666666666666665,9,4,10.333333333333334C4.333333333333333,11.666666666666666,4.666666666666667,13.333333333333334,4.833333333333333,14.166666666666666L5,15\"\n        role=\"presentation\"\n        shape-rendering=\"auto\"\n        style=\"fill: none; stroke: black; pointer-events: stroke;\"\n      />\n    `);\n  });\n});\n"
  },
  {
    "path": "packages/victory-line/src/curve.tsx",
    "content": "/* eslint no-magic-numbers: [\"error\", { \"ignore\": [-1, 0, 1, 2] }]*/\nimport React from \"react\";\nimport defaults from \"lodash/defaults\";\n\nimport {\n  Helpers,\n  Path,\n  LineHelpers,\n  UserProps,\n  StringOrCallback,\n  NumberOrCallback,\n  VictoryCommonPrimitiveProps,\n} from \"victory-core\";\n\nconst evaluateProps = (props) => {\n  /**\n   * Potential evaluated props are:\n   * `ariaLabel`\n   * `id`\n   * `style`\n   * `tabIndex`\n   */\n  const ariaLabel = Helpers.evaluateProp(props.ariaLabel, props);\n  const id = Helpers.evaluateProp(props.id, props);\n  const style = Helpers.evaluateStyle(\n    Object.assign(\n      { fill: \"none\", stroke: \"black\", pointerEvents: \"stroke\" },\n      props.style,\n    ),\n    props,\n  );\n  const tabIndex = Helpers.evaluateProp(props.tabIndex, props);\n\n  return Object.assign({}, props, { ariaLabel, id, style, tabIndex });\n};\n\nconst defaultProps = {\n  pathComponent: <Path />,\n  role: \"presentation\",\n  shapeRendering: \"auto\",\n};\n\nexport const Curve: React.FC<CurveProps> = (initialProps) => {\n  const props = evaluateProps(defaults({}, initialProps, defaultProps));\n  const userProps = UserProps.getSafeUserProps(props);\n  const { polar, origin } = props;\n  const lineFunction = LineHelpers.getLineFunction(props);\n  const defaultTransform =\n    polar && origin ? `translate(${origin.x}, ${origin.y})` : undefined;\n  const d = lineFunction(props.data);\n\n  return React.cloneElement(props.pathComponent!, {\n    ...props.events,\n    ...userProps,\n    \"aria-label\": props.ariaLabel,\n    d,\n    style: props.style,\n    transform: props.transform || defaultTransform,\n    className: props.className,\n    role: props.role,\n    shapeRendering: props.shapeRendering,\n    clipPath: props.clipPath,\n    tabIndex: props.tabIndex,\n  });\n};\n\nexport interface CurveProps extends VictoryCommonPrimitiveProps {\n  ariaLabel?: StringOrCallback;\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n  interpolation?: string | Function;\n  openCurve?: boolean;\n  pathComponent?: React.ReactElement;\n  tabIndex?: NumberOrCallback;\n}\n"
  },
  {
    "path": "packages/victory-line/src/helper-methods.ts",
    "content": "import { Helpers, LabelHelpers, Data, Domain, Scale } from \"victory-core\";\n\nconst getCalculatedValues = (props) => {\n  let data = Data.getData(props);\n\n  if (data.length < 2) {\n    data = [];\n  }\n\n  const range = {\n    x: Helpers.getRange(props, \"x\"),\n    y: Helpers.getRange(props, \"y\"),\n  };\n  const domain = {\n    x: Domain.getDomain(props, \"x\"),\n    y: Domain.getDomain(props, \"y\"),\n  };\n  const scale = {\n    x: Scale.getBaseScale(props, \"x\")\n      .domain(domain.x)\n      .range(props.horizontal ? range.y : range.x),\n    y: Scale.getBaseScale(props, \"y\")\n      .domain(domain.y)\n      .range(props.horizontal ? range.x : range.y),\n  };\n  const origin = props.polar\n    ? props.origin || Helpers.getPolarOrigin(props)\n    : undefined;\n  const defaultStyles = Helpers.getDefaultStyles(props, \"line\");\n  const style = Helpers.getStyles(props.style, defaultStyles);\n\n  return { domain, data, scale, style, origin };\n};\n\nexport const getBaseProps = (initialProps, fallbackProps) => {\n  const modifiedProps = Helpers.modifyProps(\n    initialProps,\n    fallbackProps,\n    \"line\",\n  );\n  const props = Object.assign(\n    {},\n    modifiedProps,\n    getCalculatedValues(modifiedProps),\n  );\n  const {\n    data,\n    domain,\n    events,\n    groupComponent,\n    height,\n    horizontal,\n    interpolation,\n    origin,\n    padding,\n    polar,\n    scale,\n    sharedEvents,\n    standalone,\n    style,\n    theme,\n    width,\n    labels,\n    name,\n    disableInlineStyles,\n  } = props;\n  const initialChildProps = {\n    parent: {\n      style: style.parent,\n      scale,\n      data,\n      height,\n      width,\n      name,\n      domain,\n      standalone,\n      polar,\n      origin,\n      padding,\n      horizontal,\n    },\n    all: {\n      data: {\n        horizontal,\n        polar,\n        origin,\n        scale,\n        data,\n        interpolation,\n        groupComponent,\n        style: disableInlineStyles ? {} : style.data,\n        theme,\n        disableInlineStyles,\n      },\n    },\n  };\n  return data.reduce((childProps, datum, index) => {\n    const text = LabelHelpers.getText(props, datum, index);\n    if (\n      (text !== undefined && text !== null) ||\n      (labels && (events || sharedEvents))\n    ) {\n      const eventKey = !Helpers.isNil(datum.eventKey) ? datum.eventKey : index;\n      childProps[eventKey] = { labels: LabelHelpers.getProps(props, index) };\n    }\n    return childProps;\n  }, initialChildProps);\n};\n"
  },
  {
    "path": "packages/victory-line/src/index.ts",
    "content": "export * from \"./victory-line\";\nexport * from \"./curve\";\n"
  },
  {
    "path": "packages/victory-line/src/victory-line.test.tsx",
    "content": "import { fireEvent, render, screen } from \"@testing-library/react\";\nimport random from \"lodash/random\";\nimport React from \"react\";\nimport { VictoryChart } from \"victory-chart\";\nimport { Helpers } from \"victory-core\";\nimport { curveCatmullRom } from \"victory-vendor/d3-shape\";\n\nimport { calculateD3Path } from \"../../../test/helpers\";\nimport { Curve } from \"./curve\";\nimport { VictoryLine, VictoryLineProps } from \"./victory-line\";\n\ndescribe(\"components/victory-line\", () => {\n  describe(\"default component rendering\", () => {\n    it(\"attaches safe user props to the container component\", () => {\n      render(\n        <VictoryLine\n          data-testid=\"victory-line\"\n          aria-label=\"Chart\"\n          unsafe-prop=\"test\"\n        />,\n      );\n\n      const container = screen.getByTestId(\"victory-line\");\n      expect(screen.getByLabelText(\"Chart\")).toBeDefined();\n      expect(container).not.toHaveAttribute(\"unsafe-prop\");\n      expect(container.nodeName).toEqual(\"svg\");\n    });\n\n    it(\"attaches safe user props to the group component if the component is rendered inside a VictoryChart\", () => {\n      render(\n        <VictoryLine\n          data-testid=\"victory-line\"\n          aria-label=\"Chart\"\n          unsafe-prop=\"test\"\n        />,\n        { wrapper: VictoryChart },\n      );\n\n      const container = screen.getByTestId(\"victory-line\");\n      expect(screen.getByLabelText(\"Chart\")).toBeDefined();\n      expect(container).not.toHaveAttribute(\"unsafe-prop\");\n      expect(container.tagName).toEqual(\"g\");\n    });\n\n    it(\"renders an svg with the correct viewBox\", () => {\n      const { container } = render(<VictoryLine />);\n      const viewBoxValue = `0 0 ${450} ${300}`;\n      expect(container.querySelector(\"svg\")!.getAttribute(\"viewBox\")).toEqual(\n        viewBoxValue,\n      );\n    });\n  });\n\n  describe(\"rendering with data\", () => {\n    it(\"renders one dataComponent for the line\", () => {\n      const data = [\n        { x: 1, y: 1 },\n        { x: 2, y: 4 },\n        { x: 3, y: 5 },\n        { x: 4, y: 2 },\n        { x: 5, y: 3 },\n        { x: 6, y: 4 },\n        { x: 7, y: 6 },\n      ];\n\n      render(\n        <VictoryLine\n          data={data}\n          dataComponent={<Curve data-testid=\"line\" />}\n        />,\n      );\n\n      expect(screen.getByTestId(\"line\")).toBeDefined();\n    });\n\n    it(\"renders the correct d3Shape path\", () => {\n      const props: VictoryLineProps = {\n        interpolation: \"linear\",\n        scale: \"linear\",\n        padding: 50,\n        width: 400,\n        height: 300,\n        data: [\n          { x: 0, y: 0 },\n          { x: 1, y: 1 },\n          { x: 2, y: 2 },\n        ],\n      };\n\n      const { container } = render(<VictoryLine {...props} />);\n\n      expect(container.querySelector(\"path\")!.getAttribute(\"d\")).toEqual(\n        calculateD3Path(props, \"line\", 0),\n      );\n    });\n\n    it(\"renders the correct d3Shape path with custom interpolation string property\", () => {\n      const props: VictoryLineProps = {\n        interpolation: \"catmullRom\",\n        scale: \"linear\",\n        padding: 50,\n        width: 400,\n        height: 300,\n        data: [\n          { x: 0, y: 0 },\n          { x: 1, y: 1 },\n          { x: 2, y: 2 },\n        ],\n      };\n\n      const { container } = render(<VictoryLine {...props} />);\n\n      expect(container.querySelector(\"path\")!.getAttribute(\"d\")).toEqual(\n        calculateD3Path(props, \"line\", 0),\n      );\n    });\n\n    it(\"renders the correct d3Shape path with custom interpolation function\", () => {\n      const props: VictoryLineProps = {\n        interpolation: curveCatmullRom,\n        scale: \"linear\",\n        padding: 50,\n        width: 400,\n        height: 300,\n        data: [\n          { x: 0, y: 0 },\n          { x: 1, y: 1 },\n          { x: 2, y: 2 },\n        ],\n      };\n\n      const { container } = render(<VictoryLine {...props} />);\n\n      expect(container.querySelector(\"path\")!.getAttribute(\"d\")).toEqual(\n        calculateD3Path(props, \"line\", 0),\n      );\n    });\n  });\n\n  describe(\"rendering with accessors\", () => {\n    it(\"renders array-type data\", () => {\n      const data = [\n        [1, 2],\n        [3, 4],\n      ];\n      const { container } = render(<VictoryLine data={data} />);\n      const lines = container.querySelectorAll(\"path\");\n      expect(lines).toHaveLength(1);\n    });\n\n    it(\"renders deeply nested data\", () => {\n      const data = [\n        { a: { b: [{ x: 1, y: 2 }] } },\n        { a: { b: [{ x: 3, y: 4 }] } },\n      ];\n      const { container } = render(\n        <VictoryLine data={data} x={\"a.b[0].x\"} y={\"a.b.0.y\"} />,\n      );\n      const lines = container.querySelectorAll(\"path\");\n      expect(lines).toHaveLength(1);\n    });\n\n    it(\"renders data ordered by x-value, by default\", () => {\n      const data = [{ t: 0 /* x: 10, y: 1*/ }, { t: 1 /* x:  9, y: 1*/ }];\n\n      const { container } = render(\n        <VictoryLine\n          data={data}\n          x={({ t }) => 10 - t}\n          y={() => 1}\n          dataComponent={\n            <Curve data-json={(props) => JSON.stringify(props.data)} />\n          }\n        />,\n      );\n\n      const line = container.querySelector(\"path\");\n      const renderedData = JSON.parse(line!.getAttribute(\"data-json\") || \"\");\n\n      expect(renderedData[0].t).toEqual(1);\n      expect(renderedData[1].t).toEqual(0);\n    });\n\n    it(\"renders data ordered by value of sortKey, if given\", () => {\n      const data = [{ t: 0 /* x: 10, y: 1*/ }, { t: 1 /* x:  9, y: 1*/ }];\n      const { container } = render(\n        <VictoryLine\n          data={data}\n          sortKey=\"t\"\n          x={({ t }) => 10 - t}\n          y={() => 1}\n          dataComponent={\n            <Curve data-json={(props) => JSON.stringify(props.data)} />\n          }\n        />,\n      );\n\n      const line = container.querySelector(\"path\");\n      const renderedData = JSON.parse(line!.getAttribute(\"data-json\")!).map(\n        ({ t }) => t,\n      );\n\n      expect(renderedData).toEqual([0, 1]);\n    });\n  });\n\n  describe(\"event handling\", () => {\n    it(\"attaches an event to the parent svg\", () => {\n      const clickHandler = jest.fn();\n      render(\n        <VictoryLine\n          data-testid=\"container\"\n          events={[\n            {\n              target: \"parent\",\n              eventHandlers: { onClick: clickHandler },\n            },\n          ]}\n        />,\n      );\n      const svg = screen.getByTestId(\"container\");\n      fireEvent.click(svg);\n\n      expect(clickHandler).toHaveBeenCalled();\n    });\n\n    it(\"attaches an event to data\", () => {\n      const clickHandler = jest.fn();\n      render(\n        <VictoryLine\n          dataComponent={<Curve data-testid=\"line\" />}\n          events={[\n            {\n              target: \"data\",\n              eventHandlers: { onClick: clickHandler },\n            },\n          ]}\n        />,\n      );\n\n      const line = screen.getByTestId(\"line\");\n\n      fireEvent.click(line);\n\n      expect(clickHandler).toHaveBeenCalled();\n    });\n\n    it(\"attaches an event to a label\", () => {\n      const clickHandler = jest.fn();\n      render(\n        <VictoryLine\n          data={[\n            { x: 1, y: 1 },\n            { x: 2, y: 2 },\n          ]}\n          labels={({ datum }) => datum.x}\n          events={[\n            {\n              target: \"labels\",\n              eventHandlers: { onClick: clickHandler },\n            },\n          ]}\n        />,\n      );\n      const label = screen.getByText(\"1\");\n\n      fireEvent.click(label);\n\n      expect(clickHandler).toHaveBeenCalled();\n    });\n  });\n\n  describe(\"accessibility\", () => {\n    it(\"adds an aria role to a line segment\", () => {\n      const { container } = render(<VictoryLine />);\n\n      expect(container.querySelector(\"path\")!.getAttribute(\"role\")).toEqual(\n        \"presentation\",\n      );\n    });\n\n    it(\"adds an aria role to each line segment\", () => {\n      const data = [\n        { x: 1, y: 1 },\n        { x: 2, y: 3 },\n        { x: 3, y: 5 },\n        { x: 4, y: 2 },\n        { x: 5, y: null },\n        { x: 6, y: null },\n        { x: 7, y: 6 },\n        { x: 8, y: 7 },\n        { x: 9, y: 8 },\n        { x: 10, y: 12 },\n      ];\n      const { container } = render(<VictoryLine data={data} />);\n\n      container.querySelectorAll(\"path\").forEach((p) => {\n        expect(p.getAttribute(\"role\")).toEqual(\"presentation\");\n      });\n    });\n\n    it(\"adds aria-label and tabIndex to Curve primitive\", () => {\n      const ariaTestData = Helpers.range(4).map((x) => ({\n        x,\n        y: random(1, 7),\n      }));\n      const { container } = render(\n        <VictoryLine\n          data={ariaTestData}\n          dataComponent={\n            <Curve\n              ariaLabel={({ data }) =>\n                `data point ${data![2].x + 1}'s x value is ${data![2].x}`\n              }\n              tabIndex={3}\n            />\n          }\n        />,\n      );\n      const path = container.querySelector(\"path\");\n\n      expect(path?.getAttribute(\"aria-label\")).toEqual(\n        `data point 3's x value is 2`,\n      );\n\n      expect(parseInt(path!.getAttribute(\"tabindex\")!)).toEqual(3);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-line/src/victory-line.tsx",
    "content": "import React from \"react\";\nimport { getBaseProps } from \"./helper-methods\";\nimport { Curve } from \"./curve\";\nimport {\n  Helpers,\n  VictoryLabel,\n  addEvents,\n  VictoryContainer,\n  VictoryTheme,\n  DefaultTransitions,\n  VictoryClipContainer,\n  Data,\n  Domain,\n  UserProps,\n  EventPropTypeInterface,\n  InterpolationPropType,\n  StringOrNumberOrCallback,\n  VictoryCommonProps,\n  VictoryDatableProps,\n  VictoryMultiLabelableProps,\n  VictoryStyleInterface,\n  EventsMixinClass,\n} from \"victory-core\";\n\nconst fallbackProps = {\n  width: 450,\n  height: 300,\n  padding: 50,\n  interpolation: \"linear\",\n};\n\nconst options = {\n  components: [\n    { name: \"parent\", index: \"parent\" },\n    { name: \"data\", index: \"all\" },\n    { name: \"labels\" },\n  ],\n};\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface VictoryLineBase extends EventsMixinClass<VictoryLineProps> {}\n\nclass VictoryLineBase extends React.Component<VictoryLineProps> {\n  constructor(props) {\n    super(props);\n  }\n\n  static animationWhitelist = [\n    \"data\",\n    \"domain\",\n    \"height\",\n    \"padding\",\n    \"samples\",\n    \"style\",\n    \"width\",\n  ];\n\n  static displayName = \"VictoryLine\";\n  static role = \"line\";\n  static defaultTransitions = DefaultTransitions.continuousTransitions();\n  static defaultPolarTransitions =\n    DefaultTransitions.continuousPolarTransitions();\n  static continuous = true;\n\n  static defaultProps: VictoryLineProps = {\n    containerComponent: <VictoryContainer />,\n    dataComponent: <Curve />,\n    labelComponent: <VictoryLabel renderInPortal />,\n    groupComponent: <VictoryClipContainer />,\n    samples: 50,\n    sortKey: \"x\",\n    sortOrder: \"ascending\",\n    standalone: true,\n    theme: VictoryTheme.grayscale,\n  };\n\n  static getDomain = Domain.getDomain;\n  static getData = Data.getData;\n  static getBaseProps(props) {\n    return getBaseProps(props, fallbackProps);\n  }\n  static expectedComponents = [\n    \"dataComponent\",\n    \"labelComponent\",\n    \"groupComponent\",\n    \"containerComponent\",\n  ];\n\n  // Overridden in native versions\n  shouldAnimate() {\n    return !!this.props.animate;\n  }\n\n  render() {\n    const { animationWhitelist, role } = VictoryLineBase;\n    const props = Helpers.modifyProps(this.props, fallbackProps, role);\n\n    if (this.shouldAnimate()) {\n      return this.animateComponent(props, animationWhitelist);\n    }\n\n    const children = this.renderContinuousData(props);\n\n    const component = props.standalone\n      ? this.renderContainer(props.containerComponent, children)\n      : children;\n\n    return UserProps.withSafeUserProps(component, props);\n  }\n}\nexport const VictoryLine = addEvents(VictoryLineBase, options);\n\nexport type VictoryLineTTargetType = \"data\" | \"labels\" | \"parent\";\n\nexport interface VictoryLineProps\n  extends VictoryCommonProps,\n    VictoryDatableProps,\n    VictoryMultiLabelableProps {\n  events?: EventPropTypeInterface<VictoryLineTTargetType, number | string>[];\n  eventKey?: StringOrNumberOrCallback | string[];\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n  interpolation?: InterpolationPropType | Function;\n  style?: VictoryStyleInterface;\n}\n"
  },
  {
    "path": "packages/victory-line/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-line/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-native/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-native/CHANGELOG.md",
    "content": "# victory-native\n\n## 37.3.6\n\n### Patch Changes\n\n- Fixes clipping/loss of interactivity bug in victory-zoom-container ([#3026](https://github.com/FormidableLabs/victory/pull/3026))\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n### Patch Changes\n\n- Remove deprecated babel-plugin-lodash plugin ([#2965](https://github.com/FormidableLabs/victory/pull/2965))\n\n## 37.3.2\n\n## 37.3.1\n\n## 37.3.0\n\n## 37.2.0\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Refactor containers and portal to function components ([#2799](https://github.com/FormidableLabs/victory/pull/2799))\n\n* Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n### Patch Changes\n\n- Ensure undefined props do not overwrite defaults ([#2852](https://github.com/FormidableLabs/victory/pull/2852))\n\n## 37.0.1\n\n### Patch Changes\n\n- Fix the signature of class static functions in components ([#2840](https://github.com/FormidableLabs/victory/pull/2840))\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n### Patch Changes\n\n- Replace lodash isFunction with native code ([#2802](https://github.com/FormidableLabs/victory/pull/2802))\n\n## 36.9.1\n\n### Patch Changes\n\n- Fix victory-native component prop types ([#2785](https://github.com/FormidableLabs/victory/pull/2785))\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n### Patch Changes\n\n- Migrate victory-native to TypeScript ([#2739](https://github.com/FormidableLabs/victory/pull/2739))\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n* Use legacy npm dist-tag to avoid conflicts with victory-native-xl ([#2764](https://github.com/FormidableLabs/victory/pull/2764))\n\n## 36.8.4\n\n## 36.8.3\n\n## 36.8.2\n\n### Patch Changes\n\n- Assign merged props to a const instead of modifying initialProps ([#2718](https://github.com/FormidableLabs/victory/pull/2718))\n\n## 36.8.1\n\n## 36.8.0\n\n### Patch Changes\n\n- Remove usage of defaultProps from components ([#2679](https://github.com/FormidableLabs/victory/pull/2679))\n\n## 36.7.0\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- Added `react` as a `peerDependency` (fixes [#2478](https://github.com/FormidableLabs/victory/issues/2478)) ([#2479](https://github.com/FormidableLabs/victory/pull/2479))\n\n- Updated dependencies [[`c5b4f660c`](https://github.com/FormidableLabs/victory/commit/c5b4f660cb91d8d1979d216b846a44f0c5030ec1), [`1da86d186`](https://github.com/FormidableLabs/victory/commit/1da86d18615bf75db35cfc55cc8e3d5c0b5772b6)]:\n  - victory-zoom-container@36.6.8\n  - victory-stack@36.6.8\n  - victory@36.6.8\n  - victory-area@36.6.8\n  - victory-axis@36.6.8\n  - victory-bar@36.6.8\n  - victory-box-plot@36.6.8\n  - victory-brush-container@36.6.8\n  - victory-brush-line@36.6.8\n  - victory-candlestick@36.6.8\n  - victory-chart@36.6.8\n  - victory-core@36.6.8\n  - victory-create-container@36.6.8\n  - victory-cursor-container@36.6.8\n  - victory-errorbar@36.6.8\n  - victory-group@36.6.8\n  - victory-histogram@36.6.8\n  - victory-legend@36.6.8\n  - victory-line@36.6.8\n  - victory-pie@36.6.8\n  - victory-polar-axis@36.6.8\n  - victory-scatter@36.6.8\n  - victory-selection-container@36.6.8\n  - victory-shared-events@36.6.8\n  - victory-tooltip@36.6.8\n  - victory-voronoi@36.6.8\n  - victory-voronoi-container@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies [[`3f476632f`](https://github.com/FormidableLabs/victory/commit/3f476632fcd41c31cb69fcfae74d1bbaaa78103d)]:\n  - victory-line@36.6.7\n  - victory@36.6.7\n  - victory-area@36.6.7\n  - victory-axis@36.6.7\n  - victory-bar@36.6.7\n  - victory-box-plot@36.6.7\n  - victory-brush-container@36.6.7\n  - victory-brush-line@36.6.7\n  - victory-candlestick@36.6.7\n  - victory-chart@36.6.7\n  - victory-core@36.6.7\n  - victory-create-container@36.6.7\n  - victory-cursor-container@36.6.7\n  - victory-errorbar@36.6.7\n  - victory-group@36.6.7\n  - victory-histogram@36.6.7\n  - victory-legend@36.6.7\n  - victory-pie@36.6.7\n  - victory-polar-axis@36.6.7\n  - victory-scatter@36.6.7\n  - victory-selection-container@36.6.7\n  - victory-shared-events@36.6.7\n  - victory-stack@36.6.7\n  - victory-tooltip@36.6.7\n  - victory-voronoi@36.6.7\n  - victory-voronoi-container@36.6.7\n  - victory-zoom-container@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Updated dependencies [[`6c6764f73`](https://github.com/FormidableLabs/victory/commit/6c6764f734b9655170c75798b7fe1c6d9e63f2a5)]:\n  - victory-brush-container@36.6.6\n  - victory-cursor-container@36.6.6\n  - victory-selection-container@36.6.6\n  - victory-voronoi-container@36.6.6\n  - victory-zoom-container@36.6.6\n  - victory@36.6.6\n  - victory-area@36.6.6\n  - victory-axis@36.6.6\n  - victory-bar@36.6.6\n  - victory-box-plot@36.6.6\n  - victory-brush-line@36.6.6\n  - victory-candlestick@36.6.6\n  - victory-chart@36.6.6\n  - victory-core@36.6.6\n  - victory-create-container@36.6.6\n  - victory-errorbar@36.6.6\n  - victory-group@36.6.6\n  - victory-histogram@36.6.6\n  - victory-legend@36.6.6\n  - victory-line@36.6.6\n  - victory-pie@36.6.6\n  - victory-polar-axis@36.6.6\n  - victory-scatter@36.6.6\n  - victory-shared-events@36.6.6\n  - victory-stack@36.6.6\n  - victory-tooltip@36.6.6\n  - victory-voronoi@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416), [`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-zoom-container@36.6.5\n  - victory-core@36.6.5\n  - victory@36.6.5\n  - victory-area@36.6.5\n  - victory-axis@36.6.5\n  - victory-bar@36.6.5\n  - victory-box-plot@36.6.5\n  - victory-brush-container@36.6.5\n  - victory-brush-line@36.6.5\n  - victory-candlestick@36.6.5\n  - victory-chart@36.6.5\n  - victory-create-container@36.6.5\n  - victory-cursor-container@36.6.5\n  - victory-errorbar@36.6.5\n  - victory-group@36.6.5\n  - victory-histogram@36.6.5\n  - victory-legend@36.6.5\n  - victory-line@36.6.5\n  - victory-pie@36.6.5\n  - victory-polar-axis@36.6.5\n  - victory-scatter@36.6.5\n  - victory-selection-container@36.6.5\n  - victory-shared-events@36.6.5\n  - victory-stack@36.6.5\n  - victory-tooltip@36.6.5\n  - victory-voronoi@36.6.5\n  - victory-voronoi-container@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n- Updated dependencies [[`57ed0fe30`](https://github.com/FormidableLabs/victory/commit/57ed0fe304dbc8753da1126a02d44de8004e96aa), [`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory@36.6.4\n  - victory-create-container@36.6.4\n  - victory-selection-container@36.6.4\n  - victory-voronoi-container@36.6.4\n  - victory-zoom-container@36.6.4\n  - victory-core@36.6.4\n  - victory-area@36.6.4\n  - victory-axis@36.6.4\n  - victory-bar@36.6.4\n  - victory-box-plot@36.6.4\n  - victory-brush-container@36.6.4\n  - victory-brush-line@36.6.4\n  - victory-candlestick@36.6.4\n  - victory-chart@36.6.4\n  - victory-cursor-container@36.6.4\n  - victory-errorbar@36.6.4\n  - victory-group@36.6.4\n  - victory-histogram@36.6.4\n  - victory-legend@36.6.4\n  - victory-line@36.6.4\n  - victory-pie@36.6.4\n  - victory-polar-axis@36.6.4\n  - victory-scatter@36.6.4\n  - victory-shared-events@36.6.4\n  - victory-stack@36.6.4\n  - victory-tooltip@36.6.4\n  - victory-voronoi@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory@36.6.3\n  - victory-area@36.6.3\n  - victory-axis@36.6.3\n  - victory-bar@36.6.3\n  - victory-box-plot@36.6.3\n  - victory-brush-container@36.6.3\n  - victory-brush-line@36.6.3\n  - victory-candlestick@36.6.3\n  - victory-chart@36.6.3\n  - victory-core@36.6.3\n  - victory-create-container@36.6.3\n  - victory-cursor-container@36.6.3\n  - victory-errorbar@36.6.3\n  - victory-group@36.6.3\n  - victory-histogram@36.6.3\n  - victory-legend@36.6.3\n  - victory-line@36.6.3\n  - victory-pie@36.6.3\n  - victory-polar-axis@36.6.3\n  - victory-scatter@36.6.3\n  - victory-selection-container@36.6.3\n  - victory-shared-events@36.6.3\n  - victory-stack@36.6.3\n  - victory-tooltip@36.6.3\n  - victory-voronoi@36.6.3\n  - victory-voronoi-container@36.6.3\n  - victory-zoom-container@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies [[`877c16923`](https://github.com/FormidableLabs/victory/commit/877c169230c24ab02f570a21dca10a2dce0dcf4e)]:\n  - victory-cursor-container@36.6.2\n  - victory@36.6.2\n  - victory-area@36.6.2\n  - victory-axis@36.6.2\n  - victory-bar@36.6.2\n  - victory-box-plot@36.6.2\n  - victory-brush-container@36.6.2\n  - victory-brush-line@36.6.2\n  - victory-candlestick@36.6.2\n  - victory-chart@36.6.2\n  - victory-core@36.6.2\n  - victory-create-container@36.6.2\n  - victory-errorbar@36.6.2\n  - victory-group@36.6.2\n  - victory-histogram@36.6.2\n  - victory-legend@36.6.2\n  - victory-line@36.6.2\n  - victory-pie@36.6.2\n  - victory-polar-axis@36.6.2\n  - victory-scatter@36.6.2\n  - victory-selection-container@36.6.2\n  - victory-shared-events@36.6.2\n  - victory-stack@36.6.2\n  - victory-tooltip@36.6.2\n  - victory-voronoi@36.6.2\n  - victory-voronoi-container@36.6.2\n  - victory-zoom-container@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- Updated dependencies [[`f7d50fa38`](https://github.com/FormidableLabs/victory/commit/f7d50fa381998c068a8b91af9818a6bc726b0dcd), [`f7d50fa38`](https://github.com/FormidableLabs/victory/commit/f7d50fa381998c068a8b91af9818a6bc726b0dcd), [`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-group@36.6.1\n  - victory-stack@36.6.1\n  - victory-core@36.6.1\n  - victory-axis@36.6.1\n  - victory-errorbar@36.6.1\n  - victory-scatter@36.6.1\n  - victory-cursor-container@36.6.1\n  - victory@36.6.1\n  - victory-area@36.6.1\n  - victory-bar@36.6.1\n  - victory-box-plot@36.6.1\n  - victory-brush-container@36.6.1\n  - victory-brush-line@36.6.1\n  - victory-candlestick@36.6.1\n  - victory-chart@36.6.1\n  - victory-create-container@36.6.1\n  - victory-histogram@36.6.1\n  - victory-legend@36.6.1\n  - victory-line@36.6.1\n  - victory-pie@36.6.1\n  - victory-polar-axis@36.6.1\n  - victory-selection-container@36.6.1\n  - victory-shared-events@36.6.1\n  - victory-tooltip@36.6.1\n  - victory-voronoi@36.6.1\n  - victory-voronoi-container@36.6.1\n  - victory-zoom-container@36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Updated dependencies [[`0c827edb4`](https://github.com/FormidableLabs/victory/commit/0c827edb4daf6fa61ee2a561df27ddf89ccc649f), [`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`f7bf134e5`](https://github.com/FormidableLabs/victory/commit/f7bf134e58bc1660c28f83f0eede3b19048d2656), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-box-plot@36.6.0\n  - victory-core@36.6.0\n  - victory-errorbar@36.6.0\n  - victory-brush-container@36.6.0\n  - victory-brush-line@36.6.0\n  - victory-area@36.6.0\n  - victory-axis@36.6.0\n  - victory-bar@36.6.0\n  - victory-candlestick@36.6.0\n  - victory-create-container@36.6.0\n  - victory-cursor-container@36.6.0\n  - victory-legend@36.6.0\n  - victory-line@36.6.0\n  - victory-pie@36.6.0\n  - victory-polar-axis@36.6.0\n  - victory-scatter@36.6.0\n  - victory-selection-container@36.6.0\n  - victory-shared-events@36.6.0\n  - victory-stack@36.6.0\n  - victory-tooltip@36.6.0\n  - victory-voronoi@36.6.0\n  - victory-voronoi-container@36.6.0\n  - victory-zoom-container@36.6.0\n  - victory@36.6.0\n  - victory-chart@36.6.0\n  - victory-group@36.6.0\n  - victory-histogram@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-native/README.md",
    "content": "# Victory Native\n\n[![Maintenance Status][maintenance-image]](#maintenance-status)\n\n### Usage\n\nInstall victory-native:\n```sh\n$ npm install victory-native@legacy --save\n```\n\nInstall react-native-svg:\n```sh\n$ npm install react-native-svg --save\n```\n\nLink react-native:\n```sh\n$ react-native link react-native-svg\n```\n**`victory-native@^33.0.0` requires `react-native-svg@^9.0.0` and `react-native@~0.60.0`**\n\n**Please see [Peer Dependencies and Version Requirements](#peer-dependencies-and-version-requirements) for requirements for previous versions of `victory-native`**\n\n\nImport charts from `victory-native`. For example,\n\n```jsx\nimport React, { Component } from \"react\";\n\nimport { VictoryBar } from \"victory-native\";\n\nclass App extends Component {\n  render() {\n    return (\n      <VictoryBar />\n    );\n  }\n}\n\nexport default App;\n```\n\n### Peer Dependencies and Version Requirements\n\n**Note:** `victory-native` requires the following peer dependencies:\n- `react-native-svg`\n- `react`\n- `react-native`\n\n**Note:** `react-native-svg` has strict version requirements for both `react` and `react-native`. Please match versions to those required by `react-native-svg`. See the up-to-date requirements on the [react-native-svg Readme][react-native-svg-readme].\nWe encourage you to use the latest version of `react-native-svg` possible for your project, as `victory-native` issues are frequently solved by `react-native-svg` bugfixes.\n\n- `victory-native@^33.0.0` requires `react-native-svg@^9.0.0` and `react-native@~0.60.0`\n* `victory-native@^30.0.0` requires `react-native-svg@6.1.x`  or `react-native-svg@^6.5.0`and above\n* `victory-native@^0.16.2` requires `react-native-svg@6.1.x` or `react-native-svg@^6.5.0`\n* ~~`victory-native@~0.16.0` requires `react-native-svg@6.0.0`~~ No longer supported\n* ~~`victory-native@~0.15.0` requires `react-native-svg@^5.0.0`~~ No longer supported\n\n### Local Development and Demo\n\nIf you'd like to contribute to `victory-native`, you can use the local demo app to test your changes on the iOS simulator. The demo app uses [Expo](https://expo.dev/) to streamline this dev experience.\n\nTo open the demo app, just fire up the expo app.\n\n```sh\n# Install victory and its dependencies\n$ git clone https://github.com/FormidableLabs/victory\n$ cd victory\n$ pnpm install\n$ pnpm run build --watch\n# In a new terminal, open up the React Native demo app\n$ cd victory/demo/rn\n$ pnpm install\n$ pnpm start\n```\n\nOnce Expo has fired up, it should open a web browser window where you can find instructions to open the demo application (either on a simulator or a physical device using the Expo Go app).\n\nChanges to the Victory and Victory Native source code will be reflected in the demo app.\n\n### Documentation\n\nSee the docs and examples on [the Victory website](https://commerce.nearform.com/open-source/victory/docs/native/).\n\n## Contributor Covenant Code of Conduct\n\nPlease review our [Code of Conduct][code] before contributing.\n\n\n### Maintenance Status\n\n**Active:** Formidable is actively working on this project, and we expect to continue for work for the foreseeable future. Bug reports, feature requests and pull requests are welcome.\n\n\n[code]: https://github.com/FormidableLabs/.github/blob/master/CODE_OF_CONDUCT.md\n[react-native-svg-readme]: https://github.com/react-native-community/react-native-svg#notice\n[maintenance-image]: https://img.shields.io/badge/maintenance-active-green.svg\n"
  },
  {
    "path": "packages/victory-native/package.json",
    "content": "{\n  \"name\": \"victory-native\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Native Port for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"React Native\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"source\": \"src/index.ts\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"files\": [\n    \"src\",\n    \"lib\",\n    \"index.js\"\n  ],\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"hoist-non-react-statics\": \"^3.3.2\",\n    \"lodash\": \"^4.17.21\",\n    \"react-fast-compare\": \"^3.2.0\",\n    \"victory\": \"^37.3.6\",\n    \"victory-area\": \"^37.3.6\",\n    \"victory-axis\": \"^37.3.6\",\n    \"victory-bar\": \"^37.3.6\",\n    \"victory-box-plot\": \"^37.3.6\",\n    \"victory-brush-container\": \"^37.3.6\",\n    \"victory-brush-line\": \"^37.3.6\",\n    \"victory-candlestick\": \"^37.3.6\",\n    \"victory-chart\": \"^37.3.6\",\n    \"victory-core\": \"^37.3.6\",\n    \"victory-create-container\": \"^37.3.6\",\n    \"victory-cursor-container\": \"^37.3.6\",\n    \"victory-errorbar\": \"^37.3.6\",\n    \"victory-group\": \"^37.3.6\",\n    \"victory-histogram\": \"^37.3.6\",\n    \"victory-legend\": \"^37.3.6\",\n    \"victory-line\": \"^37.3.6\",\n    \"victory-pie\": \"^37.3.6\",\n    \"victory-polar-axis\": \"^37.3.6\",\n    \"victory-scatter\": \"^37.3.6\",\n    \"victory-selection-container\": \"^37.3.6\",\n    \"victory-shared-events\": \"^37.3.6\",\n    \"victory-stack\": \"^37.3.6\",\n    \"victory-tooltip\": \"^37.3.6\",\n    \"victory-voronoi\": \"^37.3.6\",\n    \"victory-voronoi-container\": \"^37.3.6\",\n    \"victory-zoom-container\": \"^37.3.6\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \">=7.18.9\",\n    \"react-native\": \">=0.65.1\",\n    \"react-native-gesture-handler\": \">=1.10.3\",\n    \"react-native-svg\": \">=12.4.3\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true,\n    \"tag\": \"legacy\"\n  },\n  \"scripts\": {\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"format\": \"wireit\",\n    \"format:fix\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory:build:lib:cjs\",\n        \"../victory-area:build:lib:cjs\",\n        \"../victory-axis:build:lib:cjs\",\n        \"../victory-bar:build:lib:cjs\",\n        \"../victory-box-plot:build:lib:cjs\",\n        \"../victory-brush-container:build:lib:cjs\",\n        \"../victory-brush-line:build:lib:cjs\",\n        \"../victory-candlestick:build:lib:cjs\",\n        \"../victory-chart:build:lib:cjs\",\n        \"../victory-core:build:lib:cjs\",\n        \"../victory-create-container:build:lib:cjs\",\n        \"../victory-cursor-container:build:lib:cjs\",\n        \"../victory-errorbar:build:lib:cjs\",\n        \"../victory-group:build:lib:cjs\",\n        \"../victory-histogram:build:lib:cjs\",\n        \"../victory-legend:build:lib:cjs\",\n        \"../victory-line:build:lib:cjs\",\n        \"../victory-pie:build:lib:cjs\",\n        \"../victory-polar-axis:build:lib:cjs\",\n        \"../victory-scatter:build:lib:cjs\",\n        \"../victory-selection-container:build:lib:cjs\",\n        \"../victory-shared-events:build:lib:cjs\",\n        \"../victory-stack:build:lib:cjs\",\n        \"../victory-tooltip:build:lib:cjs\",\n        \"../victory-voronoi:build:lib:cjs\",\n        \"../victory-voronoi-container:build:lib:cjs\",\n        \"../victory-zoom-container:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"echo victory-native has no esm build\",\n      \"files\": [],\n      \"output\": []\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory:types:create\",\n        \"../victory-area:types:create\",\n        \"../victory-axis:types:create\",\n        \"../victory-bar:types:create\",\n        \"../victory-box-plot:types:create\",\n        \"../victory-brush-container:types:create\",\n        \"../victory-brush-line:types:create\",\n        \"../victory-candlestick:types:create\",\n        \"../victory-chart:types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-create-container:types:create\",\n        \"../victory-cursor-container:types:create\",\n        \"../victory-errorbar:types:create\",\n        \"../victory-group:types:create\",\n        \"../victory-histogram:types:create\",\n        \"../victory-legend:types:create\",\n        \"../victory-line:types:create\",\n        \"../victory-pie:types:create\",\n        \"../victory-polar-axis:types:create\",\n        \"../victory-scatter:types:create\",\n        \"../victory-selection-container:types:create\",\n        \"../victory-shared-events:types:create\",\n        \"../victory-stack:types:create\",\n        \"../victory-tooltip:types:create\",\n        \"../victory-voronoi:types:create\",\n        \"../victory-voronoi-container:types:create\",\n        \"../victory-zoom-container:types:create\",\n        \"../victory-vendor:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory:types:create\",\n        \"../victory-area:types:create\",\n        \"../victory-axis:types:create\",\n        \"../victory-bar:types:create\",\n        \"../victory-box-plot:types:create\",\n        \"../victory-brush-container:types:create\",\n        \"../victory-brush-line:types:create\",\n        \"../victory-candlestick:types:create\",\n        \"../victory-chart:types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-create-container:types:create\",\n        \"../victory-cursor-container:types:create\",\n        \"../victory-errorbar:types:create\",\n        \"../victory-group:types:create\",\n        \"../victory-histogram:types:create\",\n        \"../victory-legend:types:create\",\n        \"../victory-line:types:create\",\n        \"../victory-pie:types:create\",\n        \"../victory-polar-axis:types:create\",\n        \"../victory-scatter:types:create\",\n        \"../victory-selection-container:types:create\",\n        \"../victory-shared-events:types:create\",\n        \"../victory-stack:types:create\",\n        \"../victory-tooltip:types:create\",\n        \"../victory-voronoi:types:create\",\n        \"../victory-voronoi-container:types:create\",\n        \"../victory-zoom-container:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory:types:create\",\n        \"../victory-area:types:create\",\n        \"../victory-axis:types:create\",\n        \"../victory-bar:types:create\",\n        \"../victory-box-plot:types:create\",\n        \"../victory-brush-container:types:create\",\n        \"../victory-brush-line:types:create\",\n        \"../victory-candlestick:types:create\",\n        \"../victory-chart:types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-create-container:types:create\",\n        \"../victory-cursor-container:types:create\",\n        \"../victory-errorbar:types:create\",\n        \"../victory-group:types:create\",\n        \"../victory-histogram:types:create\",\n        \"../victory-legend:types:create\",\n        \"../victory-line:types:create\",\n        \"../victory-pie:types:create\",\n        \"../victory-polar-axis:types:create\",\n        \"../victory-scatter:types:create\",\n        \"../victory-selection-container:types:create\",\n        \"../victory-shared-events:types:create\",\n        \"../victory-stack:types:create\",\n        \"../victory-tooltip:types:create\",\n        \"../victory-voronoi:types:create\",\n        \"../victory-voronoi-container:types:create\",\n        \"../victory-zoom-container:types:create\",\n        \"../victory-vendor:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory:types:create\",\n        \"../victory-area:types:create\",\n        \"../victory-axis:types:create\",\n        \"../victory-bar:types:create\",\n        \"../victory-box-plot:types:create\",\n        \"../victory-brush-container:types:create\",\n        \"../victory-brush-line:types:create\",\n        \"../victory-candlestick:types:create\",\n        \"../victory-chart:types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-create-container:types:create\",\n        \"../victory-cursor-container:types:create\",\n        \"../victory-errorbar:types:create\",\n        \"../victory-group:types:create\",\n        \"../victory-histogram:types:create\",\n        \"../victory-legend:types:create\",\n        \"../victory-line:types:create\",\n        \"../victory-pie:types:create\",\n        \"../victory-polar-axis:types:create\",\n        \"../victory-scatter:types:create\",\n        \"../victory-selection-container:types:create\",\n        \"../victory-shared-events:types:create\",\n        \"../victory-stack:types:create\",\n        \"../victory-tooltip:types:create\",\n        \"../victory-voronoi:types:create\",\n        \"../victory-voronoi-container:types:create\",\n        \"../victory-zoom-container:types:create\",\n        \"../victory-vendor:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"echo \\\"victory-native (legacy) has no tests\\\"\",\n      \"files\": [],\n      \"output\": []\n    }\n  }\n}\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-area.tsx",
    "content": "import React from \"react\";\nimport { Dimensions } from \"react-native\";\nimport {\n  VictoryArea as VictoryAreaBase,\n  VictoryAreaProps,\n} from \"victory-area/es\";\n\nimport { VictoryLabel } from \"./victory-label\";\nimport { VictoryContainer } from \"./victory-container\";\nimport { VictoryClipContainer } from \"./victory-clip-container\";\nimport { Area } from \"./victory-primitives/area\";\nimport { wrapCoreComponent } from \"../helpers/wrap-core-component\";\n\nexport const VictoryArea = wrapCoreComponent<VictoryAreaProps>({\n  Component: VictoryAreaBase,\n  defaultProps: {\n    ...VictoryAreaBase.defaultProps,\n    dataComponent: <Area />,\n    labelComponent: <VictoryLabel />,\n    containerComponent: <VictoryContainer />,\n    groupComponent: <VictoryClipContainer />,\n    width: Dimensions.get(\"window\").width,\n  },\n});\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-axis.tsx",
    "content": "import React from \"react\";\nimport { Dimensions } from \"react-native\";\nimport { G } from \"react-native-svg\";\nimport {\n  VictoryAxis as VictoryAxisBase,\n  VictoryAxisProps,\n} from \"victory-axis/es\";\nimport { VictoryLabel } from \"./victory-label\";\nimport { VictoryContainer } from \"./victory-container\";\nimport { LineSegment } from \"./victory-primitives/line-segment\";\nimport { wrapCoreComponent } from \"../helpers/wrap-core-component\";\n\nexport const VictoryAxis = wrapCoreComponent<VictoryAxisProps>({\n  Component: VictoryAxisBase,\n  defaultProps: {\n    ...VictoryAxisBase.defaultProps,\n    axisComponent: <LineSegment />,\n    axisLabelComponent: <VictoryLabel />,\n    tickLabelComponent: <VictoryLabel />,\n    tickComponent: <LineSegment />,\n    gridComponent: <LineSegment />,\n    containerComponent: <VictoryContainer />,\n    groupComponent: <G />,\n    width: Dimensions.get(\"window\").width,\n  },\n});\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-bar.tsx",
    "content": "import React from \"react\";\nimport { Dimensions } from \"react-native\";\nimport { G } from \"react-native-svg\";\nimport { VictoryLabel } from \"./victory-label\";\nimport { VictoryContainer } from \"./victory-container\";\nimport { Bar } from \"./victory-primitives/bar\";\nimport { VictoryBar as VictoryBarBase, VictoryBarProps } from \"victory-bar/es\";\nimport { wrapCoreComponent } from \"../helpers/wrap-core-component\";\n\nexport const VictoryBar = wrapCoreComponent<VictoryBarProps>({\n  Component: VictoryBarBase,\n  defaultProps: {\n    ...VictoryBarBase.defaultProps,\n    dataComponent: <Bar />,\n    labelComponent: <VictoryLabel />,\n    containerComponent: <VictoryContainer />,\n    groupComponent: <G />,\n    width: Dimensions.get(\"window\").width,\n  },\n});\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-boxplot.tsx",
    "content": "import React from \"react\";\nimport { Dimensions } from \"react-native\";\nimport { G } from \"react-native-svg\";\nimport {\n  VictoryBoxPlot as VictoryBoxPlotBase,\n  VictoryBoxPlotProps,\n} from \"victory-box-plot/es\";\nimport { VictoryLabel } from \"./victory-label\";\nimport { VictoryContainer } from \"./victory-container\";\nimport { Border } from \"./victory-primitives/border\";\nimport { Whisker } from \"./victory-primitives/whisker\";\nimport { LineSegment } from \"./victory-primitives/line-segment\";\nimport { wrapCoreComponent } from \"../helpers/wrap-core-component\";\n\nexport const VictoryBoxPlot = wrapCoreComponent<VictoryBoxPlotProps>({\n  Component: VictoryBoxPlotBase,\n  defaultProps: {\n    ...VictoryBoxPlotBase.defaultProps,\n    maxComponent: <Whisker />,\n    maxLabelComponent: <VictoryLabel />,\n    medianComponent: <LineSegment />,\n    medianLabelComponent: <VictoryLabel />,\n    minComponent: <Whisker />,\n    minLabelComponent: <VictoryLabel />,\n    q1Component: <Border />,\n    q1LabelComponent: <VictoryLabel />,\n    q3Component: <Border />,\n    q3LabelComponent: <VictoryLabel />,\n    containerComponent: <VictoryContainer />,\n    groupComponent: <G />,\n    width: Dimensions.get(\"window\").width,\n  },\n});\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-brush-container.tsx",
    "content": "/* eslint-disable react/no-multi-comp */\nimport React from \"react\";\nimport { Rect } from \"react-native-svg\";\nimport { VictoryEventHandler } from \"victory-core\";\nimport {\n  BrushHelpers,\n  VictoryBrushContainerProps,\n  useVictoryBrushContainer,\n  VICTORY_BRUSH_CONTAINER_DEFAULT_PROPS,\n} from \"victory-brush-container\";\nimport { VictoryContainer } from \"./victory-container\";\nimport NativeHelpers from \"../helpers/native-helpers\";\n\nexport interface VictoryBrushContainerNativeProps\n  extends VictoryBrushContainerProps {\n  disableContainerEvents?: boolean;\n  onTouchStart?: VictoryEventHandler;\n  onTouchEnd?: VictoryEventHandler;\n}\n\n// ensure the selection component get native styles\nconst RectWithStyle = ({\n  style = {},\n  ...otherProps\n}: {\n  style?: Record<string, any>;\n}) => <Rect {...otherProps} {...NativeHelpers.getStyle(style)} />;\n\nexport const VictoryBrushContainer = (\n  initialProps: VictoryBrushContainerNativeProps,\n) => {\n  const { props, children } = useVictoryBrushContainer({\n    ...initialProps,\n    brushComponent: initialProps.brushComponent ?? <RectWithStyle />,\n    handleComponent: initialProps.handleComponent ?? <RectWithStyle />,\n  });\n  return <VictoryContainer {...props}>{children}</VictoryContainer>;\n};\n\nVictoryBrushContainer.role = \"container\";\n\nVictoryBrushContainer.defaultEvents = (\n  initialProps: VictoryBrushContainerNativeProps,\n) => {\n  const props = { ...VICTORY_BRUSH_CONTAINER_DEFAULT_PROPS, ...initialProps };\n  const createEventHandler =\n    (handler: VictoryEventHandler, cancel: boolean): VictoryEventHandler =>\n    // eslint-disable-next-line max-params\n    (event, targetProps, eventKey, context) => {\n      if (props.disable) {\n        return {};\n      }\n\n      if (cancel) {\n        BrushHelpers.onGlobalMouseMove.cancel();\n      }\n\n      return handler(event, { ...props, ...targetProps }, eventKey, context);\n    };\n\n  return [\n    {\n      target: \"parent\",\n      eventHandlers: {\n        onTouchStart: createEventHandler(BrushHelpers.onMouseDown, true),\n        onTouchMove: createEventHandler(BrushHelpers.onGlobalMouseMove, false),\n        onTouchEnd: createEventHandler(BrushHelpers.onGlobalMouseUp, true),\n      },\n    },\n  ];\n};\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-brush-line.tsx",
    "content": "import React from \"react\";\nimport { PanResponder } from \"react-native\";\nimport { G, Rect } from \"react-native-svg\";\nimport get from \"lodash/get\";\nimport { VictoryEventHandler } from \"victory-core\";\nimport {\n  VictoryBrushLine as VictoryBrushLineBase,\n  VictoryBrushLineProps,\n} from \"victory-brush-line/es\";\n\nimport { LineSegment } from \"./victory-primitives/line-segment\";\nimport NativeHelpers from \"../helpers/native-helpers\"; // ensure the selection component get native styles\nimport { wrapCoreComponent } from \"../helpers/wrap-core-component\";\n\nexport interface VictoryNativeBrushLineProps extends VictoryBrushLineProps {\n  onTouchStart?: VictoryEventHandler;\n  onTouchEnd?: VictoryEventHandler;\n}\n\nconst RectWithStyle = ({\n  style = {},\n  ...otherProps\n}: {\n  style?: Record<string, any>;\n}) => <Rect {...otherProps} {...NativeHelpers.getStyle(style)} />;\n\nconst yes = () => true;\nconst no = () => false;\n\nconst vblDefaultEvents = VictoryBrushLineBase.defaultEvents;\n\nclass VictoryNativeBrushLine<\n  TProps extends VictoryNativeBrushLineProps,\n> extends VictoryBrushLineBase<TProps> {\n  static displayName = \"VictoryNativeBrushLine\";\n\n  defaultEvents = function (props) {\n    if (props.disable) return undefined;\n    // refer to web victory brush line to see the events we're aliasing here\n    // we're just remapping the existing default events to their mobile equivalent handlers\n    const existingEventHandlers = vblDefaultEvents(props)?.[0].eventHandlers;\n    return [\n      {\n        target: props.type,\n        eventHandlers: {\n          onTouchStart: existingEventHandlers?.onMouseDown,\n          onTouchMove: existingEventHandlers?.onMouseMove,\n          onTouchEnd: existingEventHandlers?.onMouseUp,\n        },\n      },\n    ];\n  };\n\n  panResponder: any;\n\n  constructor(props: TProps) {\n    super(props);\n    this.panResponder = this.getResponder();\n  }\n\n  // mimics victory-container responders, except for comment below\n  getResponder() {\n    let shouldBlockNativeResponder = no;\n    if (\n      this.props &&\n      (this.props.allowDrag || this.props.allowDraw || this.props.allowResize)\n    ) {\n      shouldBlockNativeResponder = yes;\n    }\n    return PanResponder.create({\n      onStartShouldSetPanResponder: yes,\n      onStartShouldSetPanResponderCapture: no,\n      onMoveShouldSetPanResponder: yes,\n      onMoveShouldSetPanResponderCapture: yes,\n      onShouldBlockNativeResponder: shouldBlockNativeResponder,\n      // prevent parent responder (the VictoryContainer) from stealing touches\n      onPanResponderTerminationRequest: no,\n      onPanResponderGrant: this.handleResponderGrant.bind(this),\n      onPanResponderMove: this.handleResponderMove.bind(this),\n      onPanResponderRelease: this.handleResponderEnd.bind(this),\n      onPanResponderTerminate: this.handleResponderEnd.bind(this),\n    });\n  }\n\n  callOptionalEventCallback(eventName, evt) {\n    const callback = get(this.props.events, eventName);\n    if (callback) {\n      evt.persist(); // RN nativeEvent is reused. see https://fb.me/react-event-pooling\n      (callback as any)(evt, this.props, \"__unknownEventKey__\", eventName);\n    }\n  }\n\n  handleResponderGrant(evt) {\n    if (this.props.onTouchStart) {\n      this.props.onTouchStart(evt);\n    }\n    this.callOptionalEventCallback(\"onTouchStart\", evt);\n  }\n\n  handleResponderMove(evt) {\n    const { touches } = evt.nativeEvent;\n    if (touches && touches.length === 2) {\n      this.callOptionalEventCallback(\"onTouchPinch\", evt);\n    } else {\n      this.callOptionalEventCallback(\"onTouchMove\", evt);\n    }\n  }\n\n  handleResponderEnd(evt) {\n    if (this.props.onTouchEnd) {\n      this.props.onTouchEnd(evt);\n    }\n    this.callOptionalEventCallback(\"onTouchEnd\", evt);\n  }\n\n  render(): React.ReactElement {\n    return (\n      <G {...this.props.events} {...this.panResponder.panHandlers}>\n        {this.renderLine(this.props)}\n        {this.renderBrushArea(this.props)}\n        {this.renderBrush(this.props)}\n        {this.renderHandles(this.props)}\n      </G>\n    );\n  }\n}\n\nexport const VictoryBrushLine = wrapCoreComponent<VictoryNativeBrushLineProps>({\n  Component: VictoryNativeBrushLine,\n  defaultProps: {\n    ...VictoryNativeBrushLine.defaultProps,\n    brushComponent: <RectWithStyle />,\n    brushAreaComponent: <RectWithStyle />,\n    handleComponent: <RectWithStyle />,\n    groupComponent: <G />,\n    lineComponent: <LineSegment />,\n  },\n});\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-candlestick.tsx",
    "content": "import React from \"react\";\nimport { Dimensions } from \"react-native\";\nimport { G } from \"react-native-svg\";\nimport { VictoryLabel } from \"./victory-label\";\nimport { VictoryContainer } from \"./victory-container\";\nimport { Candle } from \"./victory-primitives/candle\";\nimport {\n  VictoryCandlestick as VictoryCandlestickBase,\n  VictoryCandlestickProps,\n} from \"victory-candlestick/es\";\nimport { wrapCoreComponent } from \"../helpers/wrap-core-component\";\n\nexport const VictoryCandlestick = wrapCoreComponent<VictoryCandlestickProps>({\n  Component: VictoryCandlestickBase,\n  defaultProps: {\n    ...VictoryCandlestickBase.defaultProps,\n    dataComponent: <Candle />,\n    labelComponent: <VictoryLabel />,\n    containerComponent: <VictoryContainer />,\n    groupComponent: <G />,\n    width: Dimensions.get(\"window\").width,\n  },\n});\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-chart.tsx",
    "content": "import React from \"react\";\nimport { Dimensions } from \"react-native\";\nimport { G } from \"react-native-svg\";\nimport {\n  VictoryChart as VictoryChartBase,\n  VictoryChartProps,\n} from \"victory-chart/es\";\nimport { Background } from \"./victory-primitives/background\";\nimport { VictoryAxis } from \"./victory-axis\";\nimport { VictoryPolarAxis } from \"./victory-polar-axis\";\nimport { VictoryContainer } from \"./victory-container\";\nimport { wrapCoreComponent } from \"../helpers/wrap-core-component\";\n\nexport const VictoryChart = wrapCoreComponent<VictoryChartProps>({\n  Component: VictoryChartBase,\n  defaultProps: {\n    backgroundComponent: <Background />,\n    containerComponent: <VictoryContainer />,\n    groupComponent: <G />,\n    defaultAxes: {\n      independent: <VictoryAxis />,\n      dependent: <VictoryAxis dependentAxis />,\n    },\n    defaultPolarAxes: {\n      independent: <VictoryPolarAxis />,\n      dependent: <VictoryPolarAxis dependentAxis />,\n    },\n    prependDefaultAxes: true,\n    width: Dimensions.get(\"window\").width,\n  },\n});\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-clip-container.tsx",
    "content": "import React from \"react\";\nimport { G } from \"react-native-svg\";\nimport { Circle } from \"./victory-primitives/circle\";\nimport { Rect } from \"./victory-primitives/rect\";\nimport { ClipPath } from \"./victory-primitives/clip-path\";\nimport { VictoryClipContainer as VictoryClipContainerBase } from \"victory-core/es\";\nimport uniqueId from \"lodash/uniqueId\";\n\nexport class VictoryClipContainer extends VictoryClipContainerBase {\n  static defaultProps = {\n    ...VictoryClipContainerBase.defaultProps,\n    groupComponent: <G />,\n    rectComponent: <Rect />,\n    clipPathComponent: <ClipPath />,\n    circleComponent: <Circle />,\n  };\n\n  // There seems to be a caching issue with clip paths.\n  // This is required to make clip paths update when animating\n  componentDidUpdate() {\n    this.clipId = uniqueId(\"victory-clip-\");\n  }\n}\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-container.tsx",
    "content": "import React, { RefObject } from \"react\";\nimport Svg, { Rect } from \"react-native-svg\";\nimport get from \"lodash/get\";\nimport { View, PanResponder } from \"react-native\";\nimport {\n  VictoryContainerProps,\n  VictoryEventHandler,\n  mergeRefs,\n  useVictoryContainer,\n  PortalProvider,\n  PortalOutlet,\n} from \"victory-core/es\";\nimport NativeHelpers from \"../helpers/native-helpers\";\nimport { Portal } from \"./victory-portal/portal\";\n\nconst yes = () => true;\nconst no = () => false;\n\nexport interface VictoryContainerNativeProps extends VictoryContainerProps {\n  disableContainerEvents?: boolean;\n  onTouchStart?: VictoryEventHandler;\n  onTouchEnd?: VictoryEventHandler;\n}\n\nexport const VictoryContainer = (initialProps: VictoryContainerNativeProps) => {\n  const props = useVictoryContainer<VictoryContainerNativeProps>(initialProps);\n  const {\n    title,\n    desc,\n    width,\n    height,\n    dimensions,\n    children,\n    style,\n    ouiaId,\n    ouiaSafe,\n    ouiaType,\n    ariaLabelledBy,\n    ariaDescribedBy,\n    portalZIndex,\n    viewBox,\n    preserveAspectRatio,\n    userProps,\n    containerRef,\n    events,\n    onTouchStart,\n    onTouchEnd,\n    localContainerRef,\n    disableContainerEvents,\n  } = props;\n\n  const callOptionalEventCallback = (eventName, event) => {\n    const callback = get(events, eventName);\n    if (callback) {\n      event.persist(); // RN nativeEvent is reused. see https://fb.me/react-event-pooling\n      callback(event, props, \"__unknownEventKey__\", eventName);\n    }\n  };\n\n  const handleResponderGrant = (event) => {\n    if (onTouchStart) {\n      onTouchStart(event);\n    }\n    callOptionalEventCallback(\"onTouchStart\", event);\n  };\n\n  const handleResponderMove = (event) => {\n    const { touches } = event.nativeEvent;\n    if (touches && touches.length === 2) {\n      callOptionalEventCallback(\"onTouchPinch\", event);\n    } else {\n      callOptionalEventCallback(\"onTouchMove\", event);\n    }\n  };\n\n  const handleResponderEnd = (event) => {\n    if (onTouchEnd) {\n      onTouchEnd(event);\n    }\n    callOptionalEventCallback(\"onTouchEnd\", event);\n  };\n\n  const getResponder = () => {\n    let shouldBlockNativeResponder = no;\n    const {\n      allowDrag,\n      allowDraw,\n      allowResize,\n      allowSelection,\n      allowPan,\n      allowZoom,\n    } = props as any;\n\n    if (\n      allowDrag ||\n      allowDraw ||\n      allowResize ||\n      allowSelection ||\n      allowPan ||\n      allowZoom\n    ) {\n      shouldBlockNativeResponder = yes;\n    }\n\n    return PanResponder.create({\n      onStartShouldSetPanResponder: yes,\n      onStartShouldSetPanResponderCapture: no,\n      onMoveShouldSetPanResponder: yes,\n      onMoveShouldSetPanResponderCapture: yes,\n      onShouldBlockNativeResponder: shouldBlockNativeResponder,\n      onPanResponderTerminationRequest: yes,\n      onPanResponderGrant: handleResponderGrant, // User has started a touch move\n      onPanResponderMove: handleResponderMove, // Active touch or touches have moved\n      onPanResponderRelease: handleResponderEnd, // The user has released all touches\n      onPanResponderTerminate: handleResponderEnd, // Another component has become the responder\n    });\n  };\n\n  const panResponder = getResponder();\n  const handlers = disableContainerEvents ? {} : panResponder.panHandlers;\n\n  const baseStyle = NativeHelpers.getStyle(style, [\"width\", \"height\"]);\n\n  return (\n    <View\n      {...handlers}\n      style={{ ...baseStyle, position: \"relative\" }}\n      pointerEvents=\"box-none\"\n      data-ouia-component-id={ouiaId}\n      data-ouia-component-type={ouiaType}\n      data-ouia-safe={ouiaSafe}\n      ref={mergeRefs<View>([\n        localContainerRef as unknown as RefObject<View>,\n        containerRef as unknown as RefObject<View>,\n      ])}\n    >\n      <Svg\n        width={width}\n        height={height}\n        aria-labelledby={ariaLabelledBy}\n        aria-describedby={ariaDescribedBy}\n        viewBox={viewBox}\n        preserveAspectRatio={preserveAspectRatio}\n        // @ts-expect-error - style prop does not seem to be recognized by react-native-svg\n        // preserved during refactor for compatibility, if it ever worked\n        style={dimensions}\n        accessible={ariaLabelledBy && title ? true : undefined}\n        accessibilityLabel={ariaLabelledBy && title ? title : undefined}\n        accessibilityHint={ariaDescribedBy && desc ? desc : undefined}\n        {...events}\n        {...userProps}\n      >\n        {/* The following Rect is a temporary solution until the following RNSVG issue is resolved https://github.com/react-native-svg/react-native-svg/issues/1488 */}\n        <Rect x={0} y={0} width={width} height={height} fill=\"none\" />\n        {title ? <title id=\"title\">{title}</title> : null}\n        {desc ? <desc id=\"desc\">{desc}</desc> : null}\n        <PortalProvider>\n          {children}\n          <View\n            style={{\n              zIndex: portalZIndex,\n              position: \"absolute\",\n              top: 0,\n              left: 0,\n            }}\n            pointerEvents=\"box-none\"\n          >\n            <PortalOutlet\n              as={<Portal />}\n              width={width}\n              height={height}\n              viewBox={viewBox}\n              style={{ ...dimensions, overflow: \"visible\" }}\n            />\n          </View>\n        </PortalProvider>\n      </Svg>\n    </View>\n  );\n};\n\nVictoryContainer.role = \"container\";\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-cursor-container.tsx",
    "content": "import React from \"react\";\nimport { VictoryEventHandler } from \"victory-core\";\nimport {\n  useVictoryCursorContainer,\n  CursorHelpers,\n  VICTORY_CURSOR_CONTAINER_DEFAULT_PROPS,\n  VictoryCursorContainerProps,\n} from \"victory-cursor-container\";\nimport { VictoryLabel } from \"./victory-label\";\nimport { VictoryContainer } from \"./victory-container\";\nimport { LineSegment } from \"./victory-primitives/line-segment\";\n\nexport interface VictoryCursorContainerNativeProps\n  extends VictoryCursorContainerProps {\n  disableContainerEvents?: boolean;\n  onTouchStart?: VictoryEventHandler;\n  onTouchEnd?: VictoryEventHandler;\n}\n\nexport const VictoryCursorContainer = (\n  initialProps: VictoryCursorContainerNativeProps,\n) => {\n  const { props, children } = useVictoryCursorContainer({\n    ...initialProps,\n    cursorLabelComponent: initialProps.cursorLabelComponent ?? <VictoryLabel />,\n    cursorComponent: initialProps.cursorComponent ?? <LineSegment />,\n  });\n  return <VictoryContainer {...props}>{children}</VictoryContainer>;\n};\n\nVictoryCursorContainer.role = \"container\";\n\nVictoryCursorContainer.defaultEvents = (\n  initialProps: VictoryCursorContainerNativeProps,\n) => {\n  const props = { ...VICTORY_CURSOR_CONTAINER_DEFAULT_PROPS, ...initialProps };\n  const createEventHandler =\n    (handler: VictoryEventHandler, disabled?: boolean): VictoryEventHandler =>\n    // eslint-disable-next-line max-params\n    (event, targetProps, eventKey, context) =>\n      disabled || props.disable\n        ? {}\n        : handler(event, { ...props, ...targetProps }, eventKey, context);\n\n  return [\n    {\n      target: \"parent\",\n      eventHandlers: {\n        onTouchStart: createEventHandler(CursorHelpers.onMouseMove),\n        onTouchMove: createEventHandler(CursorHelpers.onMouseMove),\n        onTouchEnd: createEventHandler(CursorHelpers.onTouchEnd),\n      },\n    },\n  ];\n};\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-errorbar.tsx",
    "content": "import React from \"react\";\nimport { Dimensions } from \"react-native\";\nimport { G } from \"react-native-svg\";\nimport {\n  VictoryErrorBar as VictoryErrorBarBase,\n  VictoryErrorBarProps,\n} from \"victory-errorbar/es\";\nimport { VictoryContainer } from \"./victory-container\";\nimport { ErrorBar } from \"./victory-primitives/error-bar\";\nimport { wrapCoreComponent } from \"../helpers/wrap-core-component\";\n\nexport const VictoryErrorBar = wrapCoreComponent<VictoryErrorBarProps>({\n  Component: VictoryErrorBarBase,\n  defaultProps: {\n    ...VictoryErrorBarBase.defaultProps,\n    dataComponent: <ErrorBar />,\n    containerComponent: <VictoryContainer />,\n    groupComponent: <G />,\n    width: Dimensions.get(\"window\").width,\n  },\n});\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-group.tsx",
    "content": "import React from \"react\";\nimport { Dimensions } from \"react-native\";\nimport { G } from \"react-native-svg\";\nimport {\n  VictoryGroup as VictoryGroupBase,\n  VictoryGroupProps,\n} from \"victory-group/es\";\nimport { VictoryContainer } from \"./victory-container\";\nimport { wrapCoreComponent } from \"../helpers/wrap-core-component\";\n\nexport const VictoryGroup = wrapCoreComponent<VictoryGroupProps>({\n  Component: VictoryGroupBase,\n  defaultProps: {\n    containerComponent: <VictoryContainer />,\n    groupComponent: <G />,\n    width: Dimensions.get(\"window\").width,\n  },\n});\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-histogram.tsx",
    "content": "import React from \"react\";\nimport { Dimensions } from \"react-native\";\nimport { G } from \"react-native-svg\";\nimport { VictoryLabel } from \"./victory-label\";\nimport { VictoryContainer } from \"./victory-container\";\nimport { Bar } from \"./victory-primitives/bar\";\nimport {\n  VictoryHistogram as VictoryHistogramBase,\n  VictoryHistogramProps,\n} from \"victory-histogram/es\";\nimport { wrapCoreComponent } from \"../helpers/wrap-core-component\";\n\nexport const VictoryHistogram = wrapCoreComponent<VictoryHistogramProps>({\n  Component: VictoryHistogramBase,\n  defaultProps: {\n    ...VictoryHistogramBase.defaultProps,\n    dataComponent: <Bar />,\n    labelComponent: <VictoryLabel />,\n    containerComponent: <VictoryContainer />,\n    groupComponent: <G />,\n    width: Dimensions.get(\"window\").width,\n  },\n});\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-label.tsx",
    "content": "import React from \"react\";\nimport {\n  VictoryLabel as VictoryLabelBase,\n  VictoryLabelProps,\n} from \"victory-core/es\";\nimport { G } from \"react-native-svg\";\nimport { Text } from \"./victory-primitives/text\";\nimport { TSpan } from \"./victory-primitives/tspan\";\nimport { Rect } from \"./victory-primitives/rect\";\n\nexport const VictoryLabel = (props: VictoryLabelProps) => (\n  <VictoryLabelBase\n    textComponent={<Text />}\n    tspanComponent={<TSpan />}\n    backgroundComponent={<Rect />}\n    groupComponent={<G />}\n    {...props}\n  />\n);\n\nVictoryLabel.role = VictoryLabelBase.role;\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-legend.tsx",
    "content": "import React from \"react\";\nimport { G } from \"react-native-svg\";\nimport {\n  VictoryLegend as VictoryLegendBase,\n  VictoryLegendProps,\n} from \"victory-legend/es\";\nimport { Dimensions } from \"react-native\";\nimport { VictoryLabel } from \"./victory-label\";\nimport { VictoryContainer } from \"./victory-container\";\nimport { Point } from \"./victory-primitives/point\";\nimport { Border } from \"./victory-primitives/border\";\nimport { wrapCoreComponent } from \"../helpers/wrap-core-component\";\n\nexport const VictoryLegend = wrapCoreComponent<VictoryLegendProps>({\n  Component: VictoryLegendBase,\n  defaultProps: {\n    ...VictoryLegendBase.defaultProps,\n    borderComponent: <Border />,\n    containerComponent: <VictoryContainer />,\n    dataComponent: <Point />,\n    groupComponent: <G />,\n    labelComponent: <VictoryLabel />,\n    titleComponent: <VictoryLabel />,\n    width: Dimensions.get(\"window\").width,\n  },\n});\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-line.tsx",
    "content": "import React from \"react\";\nimport { Dimensions } from \"react-native\";\nimport {\n  VictoryLine as VictoryLineBase,\n  VictoryLineProps,\n} from \"victory-line/es\";\nimport { VictoryLabel } from \"./victory-label\";\nimport { VictoryContainer } from \"./victory-container\";\nimport { VictoryClipContainer } from \"./victory-clip-container\";\nimport { Curve } from \"./victory-primitives/curve\";\nimport { wrapCoreComponent } from \"../helpers/wrap-core-component\";\n\nexport const VictoryLine = wrapCoreComponent<VictoryLineProps>({\n  Component: VictoryLineBase,\n  defaultProps: {\n    ...VictoryLineBase.defaultProps,\n    dataComponent: <Curve />,\n    labelComponent: <VictoryLabel />,\n    containerComponent: <VictoryContainer />,\n    groupComponent: <VictoryClipContainer />,\n    width: Dimensions.get(\"window\").width,\n  },\n});\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-pie.tsx",
    "content": "import React from \"react\";\nimport { Dimensions } from \"react-native\";\nimport { G } from \"react-native-svg\";\nimport { VictoryPie as VictoryPieBase, VictoryPieProps } from \"victory-pie/es\";\nimport { VictoryLabel } from \"./victory-label\";\nimport { VictoryContainer } from \"./victory-container\";\nimport { Slice } from \"./victory-primitives/slice\";\nimport { wrapCoreComponent } from \"../helpers/wrap-core-component\";\n\nexport const VictoryPie = wrapCoreComponent<VictoryPieProps>({\n  Component: VictoryPieBase,\n  defaultProps: {\n    ...VictoryPieBase.defaultProps,\n    dataComponent: <Slice />,\n    labelComponent: <VictoryLabel />,\n    containerComponent: <VictoryContainer />,\n    groupComponent: <G />,\n    height: Dimensions.get(\"window\").width,\n    width: Dimensions.get(\"window\").width,\n  },\n});\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-polar-axis.tsx",
    "content": "import React from \"react\";\nimport { Dimensions } from \"react-native\";\nimport { G } from \"react-native-svg\";\nimport {\n  VictoryPolarAxis as VictoryPolarAxisBase,\n  VictoryPolarAxisProps,\n} from \"victory-polar-axis/es\";\nimport { VictoryLabel } from \"./victory-label\";\nimport { VictoryContainer } from \"./victory-container\";\nimport { Arc } from \"./victory-primitives/arc\";\nimport { LineSegment } from \"./victory-primitives/line-segment\";\nimport { wrapCoreComponent } from \"../helpers/wrap-core-component\";\n\nexport const VictoryPolarAxis = wrapCoreComponent<VictoryPolarAxisProps>({\n  Component: VictoryPolarAxisBase,\n  defaultProps: {\n    ...VictoryPolarAxisBase.defaultProps,\n    axisComponent: <LineSegment />,\n    axisLabelComponent: <VictoryLabel />,\n    circularAxisComponent: <Arc type=\"axis\" />,\n    circularGridComponent: <Arc type=\"grid\" />,\n    tickLabelComponent: <VictoryLabel />,\n    tickComponent: <LineSegment />,\n    gridComponent: <LineSegment />,\n    containerComponent: <VictoryContainer />,\n    groupComponent: <G />,\n    width: Dimensions.get(\"window\").width,\n  },\n});\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-portal/portal.tsx",
    "content": "import React, { LegacyRef } from \"react\";\nimport { ViewStyle } from \"react-native\";\nimport Svg from \"react-native-svg\";\nimport { PortalProps } from \"victory-core/es\";\n\nexport const Portal = React.forwardRef<SVGSVGElement, PortalProps>(\n  (props, ref) => {\n    const { style, ...rest } = props;\n    return (\n      <Svg style={style as ViewStyle} ref={ref as LegacyRef<Svg>} {...rest} />\n    );\n  },\n);\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-portal/victory-portal.tsx",
    "content": "import React from \"react\";\nimport { G } from \"react-native-svg\";\nimport {\n  VictoryPortal as VictoryPortalBase,\n  VictoryPortalProps,\n} from \"victory-core/es\";\n\nexport const VictoryPortal = (initialProps: VictoryPortalProps) => {\n  return (\n    <VictoryPortalBase\n      {...initialProps}\n      groupComponent={initialProps.groupComponent ?? <G />}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-primitives/arc.tsx",
    "content": "import React from \"react\";\nimport { Path } from \"./path\";\nimport { Arc as ArcBase, ArcProps } from \"victory-core\";\n\nexport const Arc = (props: ArcProps) => (\n  <ArcBase pathComponent={<Path />} {...props} />\n);\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-primitives/area.tsx",
    "content": "import React from \"react\";\nimport { Path } from \"./path\";\nimport { G } from \"react-native-svg\";\nimport { Area as AreaBase, AreaProps } from \"victory-area/es\";\n\nexport const Area = (props: AreaProps) => (\n  <AreaBase pathComponent={<Path />} groupComponent={<G />} {...props} />\n);\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-primitives/background.tsx",
    "content": "import React from \"react\";\nimport { Rect } from \"./rect\";\nimport { Circle } from \"./circle\";\nimport { Background as BackgroundBase, BackgroundProps } from \"victory-core/es\";\n\nexport const Background = (props: BackgroundProps) => (\n  <BackgroundBase\n    circleComponent={<Circle />}\n    rectComponent={<Rect />}\n    {...props}\n  />\n);\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-primitives/bar.tsx",
    "content": "import React from \"react\";\nimport { Path } from \"./path\";\nimport { Bar as BarBase, BarProps } from \"victory-bar/es\";\n\nexport const Bar = (props: BarProps) => (\n  <BarBase pathComponent={<Path />} {...props} />\n);\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-primitives/border.tsx",
    "content": "import React from \"react\";\nimport { Rect } from \"./rect\";\nimport { Border as BorderBase, BorderProps } from \"victory-core/es\";\n\nexport const Border = (props: BorderProps) => (\n  <BorderBase rectComponent={<Rect />} {...props} />\n);\n\nexport const Box = Border;\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-primitives/candle.tsx",
    "content": "import React from \"react\";\nimport { Line } from \"./line\";\nimport { Rect } from \"./rect\";\nimport { G } from \"react-native-svg\";\nimport { Candle as CandleBase, CandleProps } from \"victory-candlestick/es\";\n\nexport const Candle = (props: CandleProps) => (\n  <CandleBase\n    lineComponent={<Line />}\n    rectComponent={<Rect />}\n    groupComponent={<G />}\n    {...props}\n  />\n);\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-primitives/circle.tsx",
    "content": "import React from \"react\";\nimport { Circle as CircleBase, CircleProps } from \"react-native-svg\";\nimport { useGetNativeStyle } from \"../../helpers/native-helpers\";\nimport { VictoryNativePrimitiveShapeProps } from \"./types\";\n\nexport type VictoryNativeCircleProps = CircleProps &\n  VictoryNativePrimitiveShapeProps;\n\nexport const Circle = (props: VictoryNativeCircleProps) => {\n  const { \"aria-label\": accessibilityLabel, desc, style, ...rest } = props;\n  const nativeStyle = useGetNativeStyle(style);\n  return (\n    <CircleBase\n      vectorEffect=\"non-scaling-stroke\"\n      // @ts-expect-error Accessibility props are not supported in the version of react-native-svg being used\n      // https://github.com/FormidableLabs/victory/issues/2744\n      accessible={accessibilityLabel || undefined}\n      accessibilityLabel={accessibilityLabel}\n      accessibilityHint={accessibilityLabel && desc ? desc : undefined}\n      {...rest}\n      {...nativeStyle}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-primitives/clip-path.tsx",
    "content": "import React from \"react\";\nimport {\n  Defs,\n  ClipPath as ClipPathBase,\n  G,\n  ClipPathProps,\n} from \"react-native-svg\";\n\nexport interface VictoryNativeClipPathProps extends ClipPathProps {\n  clipId?: string;\n}\n\nexport const ClipPath = (props: VictoryNativeClipPathProps) => {\n  const { children, clipId } = props;\n  // Wrap in G not to cause exceptions in old react-native-svg\n  // https://github.com/FormidableLabs/victory-native/issues/432#issuecomment-475927581\n  return (\n    <G>\n      <Defs>\n        <ClipPathBase id={clipId}>{children}</ClipPathBase>\n      </Defs>\n    </G>\n  );\n};\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-primitives/curve.tsx",
    "content": "import React from \"react\";\nimport { Path } from \"./path\";\nimport { Curve as CurveBase, CurveProps } from \"victory-line/es\";\n\nexport const Curve = (props: CurveProps) => (\n  <CurveBase pathComponent={<Path />} {...props} />\n);\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-primitives/error-bar.tsx",
    "content": "import React from \"react\";\nimport { Line } from \"./line\";\nimport { G } from \"react-native-svg\";\nimport { ErrorBar as ErrorBarBase, ErrorBarProps } from \"victory-errorbar/es\";\n\nexport const ErrorBar = (props: ErrorBarProps) => (\n  <ErrorBarBase lineComponent={<Line />} groupComponent={<G />} {...props} />\n);\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-primitives/flyout.tsx",
    "content": "import React from \"react\";\nimport { Path } from \"./path\";\nimport { Flyout as FlyoutBase, FlyoutProps } from \"victory-tooltip/es\";\n\nexport const Flyout = (props: FlyoutProps) => (\n  <FlyoutBase pathComponent={<Path />} {...props} />\n);\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-primitives/line-segment.tsx",
    "content": "import React from \"react\";\nimport { Line } from \"./line\";\nimport {\n  LineSegment as LineSegmentBase,\n  LineSegmentProps,\n} from \"victory-core/es\";\n\nexport const LineSegment = (props: LineSegmentProps) => (\n  <LineSegmentBase lineComponent={<Line />} {...props} />\n);\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-primitives/line.tsx",
    "content": "import React from \"react\";\nimport { Line as LineBase, LineProps } from \"react-native-svg\";\nimport { useGetNativeStyle } from \"../../helpers/native-helpers\";\nimport { VictoryNativePrimitiveShapeProps } from \"./types\";\n\nexport type VictoryNativeLineProps = LineProps &\n  VictoryNativePrimitiveShapeProps;\n\nexport const Line = (props: VictoryNativeLineProps) => {\n  const { \"aria-label\": accessibilityLabel, desc, style, ...rest } = props;\n  const nativeStyle = useGetNativeStyle(style);\n\n  return (\n    <LineBase\n      vectorEffect=\"non-scaling-stroke\"\n      // @ts-expect-error Accessibility props are not supported in the version of react-native-svg being used\n      // https://github.com/FormidableLabs/victory/issues/2744\n      accessible={accessibilityLabel || undefined}\n      accessibilityLabel={accessibilityLabel}\n      accessibilityHint={accessibilityLabel && desc ? desc : undefined}\n      {...rest}\n      {...nativeStyle}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-primitives/path.tsx",
    "content": "import React from \"react\";\nimport { Path as PathBase, PathProps } from \"react-native-svg\";\nimport { useGetNativeStyle } from \"../../helpers/native-helpers\";\nimport { VictoryNativePrimitiveShapeProps } from \"./types\";\n\nexport type VictoryNativePathProps = PathProps &\n  VictoryNativePrimitiveShapeProps;\n\nexport const Path = (props: VictoryNativePathProps) => {\n  const { \"aria-label\": accessibilityLabel, desc, style, ...rest } = props;\n  const nativeStyle = useGetNativeStyle(style);\n  return (\n    <PathBase\n      // @ts-expect-error Accessibility props are not supported in the version of react-native-svg being used\n      // https://github.com/FormidableLabs/victory/issues/2744\n      accessible={accessibilityLabel || undefined}\n      accessibilityLabel={accessibilityLabel}\n      accessibilityHint={accessibilityLabel && desc ? desc : undefined}\n      {...rest}\n      {...nativeStyle}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-primitives/point.tsx",
    "content": "import React from \"react\";\nimport { Path } from \"./path\";\nimport { Point as PointBase, PointProps } from \"victory-core/es\";\n\nexport const Point = (props: PointProps) => (\n  <PointBase pathComponent={<Path />} {...props} />\n);\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-primitives/rect.tsx",
    "content": "import React from \"react\";\nimport { Rect as RectBase, RectProps } from \"react-native-svg\";\nimport { useGetNativeStyle } from \"../../helpers/native-helpers\";\nimport { VictoryNativePrimitiveShapeProps } from \"./types\";\n\nexport type VictoryNativeRectProps = RectProps &\n  VictoryNativePrimitiveShapeProps;\n\nexport const Rect = (props: VictoryNativeRectProps) => {\n  const { \"aria-label\": accessibilityLabel, desc, style, ...rest } = props;\n  const nativeStyle = useGetNativeStyle(style);\n  return (\n    <RectBase\n      vectorEffect=\"non-scaling-stroke\"\n      // @ts-expect-error Accessibility props are not supported in the version of react-native-svg being used\n      // https://github.com/FormidableLabs/victory/issues/2744\n      accessible={accessibilityLabel || undefined}\n      accessibilityLabel={accessibilityLabel}\n      accessibilityHint={accessibilityLabel && desc ? desc : undefined}\n      {...rest}\n      {...nativeStyle}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-primitives/slice.tsx",
    "content": "import React from \"react\";\nimport { Path } from \"./path\";\nimport { Slice as SliceBase, SliceProps } from \"victory-pie/es\";\n\nexport const Slice = (props: SliceProps) => (\n  <SliceBase pathComponent={<Path />} {...props} />\n);\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-primitives/text.tsx",
    "content": "import React from \"react\";\nimport { Text as TextBase, TextProps } from \"react-native-svg\";\nimport { useGetNativeStyle } from \"../../helpers/native-helpers\";\nimport { VictoryNativePrimitiveShapeProps } from \"./types\";\n\nexport interface VictoryNativeTextProps\n  extends TextProps,\n    VictoryNativePrimitiveShapeProps {\n  direction?: \"inherit\" | \"rtl\" | \"ltr\";\n}\n\nexport const Text = (props: VictoryNativeTextProps) => {\n  const {\n    \"aria-label\": accessibilityLabel,\n    children,\n    desc,\n    style,\n    ...rest\n  } = props;\n  const nativeStyle = useGetNativeStyle(style);\n  return (\n    <TextBase\n      // @ts-expect-error Accessibility props are not supported in the version of react-native-svg being used\n      // https://github.com/FormidableLabs/victory/issues/2744\n      accessible={accessibilityLabel || undefined}\n      accessibilityLabel={accessibilityLabel}\n      accessibilityHint={accessibilityLabel && desc ? desc : undefined}\n      {...rest}\n      {...nativeStyle}\n    >\n      {children}\n    </TextBase>\n  );\n};\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-primitives/tspan.tsx",
    "content": "import React from \"react\";\nimport { TSpan as TSpanBase, TSpanProps } from \"react-native-svg\";\nimport { useGetNativeStyle } from \"../../helpers/native-helpers\";\nimport { VictoryNativePrimitiveShapeProps } from \"./types\";\n\nexport type VictoryNativeTSpanProps = TSpanProps &\n  VictoryNativePrimitiveShapeProps;\n\nexport const TSpan = (props: VictoryNativeTSpanProps) => {\n  const { style, ...rest } = props;\n  const nativeStyle = useGetNativeStyle(style);\n  return <TSpanBase {...rest} {...nativeStyle} />;\n};\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-primitives/types.ts",
    "content": "import { VictoryPrimitiveShapeProps } from \"victory-core/es\";\n\nexport interface VictoryNativePrimitiveShapeProps\n  extends Pick<\n    VictoryPrimitiveShapeProps,\n    \"className\" | \"events\" | \"role\" | \"shapeRendering\" | \"desc\" | \"style\"\n  > {\n  \"aria-label\"?: string;\n}\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-primitives/voronoi.tsx",
    "content": "import React from \"react\";\nimport { Path } from \"./path\";\nimport { ClipPath } from \"./clip-path\";\nimport { Circle } from \"./circle\";\nimport { G } from \"react-native-svg\";\nimport { Voronoi as VoronoiBase, VoronoiProps } from \"victory-voronoi/es\";\n\nexport const Voronoi = (props: VoronoiProps) => (\n  <VoronoiBase\n    pathComponent={<Path />}\n    groupComponent={<G />}\n    clipPathComponent={<ClipPath />}\n    circleComponent={<Circle />}\n    {...props}\n  />\n);\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-primitives/whisker.tsx",
    "content": "import React from \"react\";\nimport { Line } from \"./line\";\nimport { G } from \"react-native-svg\";\nimport { Whisker as WhiskerBase, WhiskerProps } from \"victory-core/es\";\n\nexport const Whisker = (props: WhiskerProps) => (\n  <WhiskerBase lineComponent={<Line />} groupComponent={<G />} {...props} />\n);\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-scatter.tsx",
    "content": "import React from \"react\";\nimport { Dimensions } from \"react-native\";\nimport { G } from \"react-native-svg\";\nimport {\n  VictoryScatter as VictoryScatterBase,\n  VictoryScatterProps,\n} from \"victory-scatter/es\";\nimport { VictoryLabel } from \"./victory-label\";\nimport { VictoryContainer } from \"./victory-container\";\nimport { Point } from \"./victory-primitives/point\";\nimport { wrapCoreComponent } from \"../helpers/wrap-core-component\";\n\nexport const VictoryScatter = wrapCoreComponent<VictoryScatterProps>({\n  Component: VictoryScatterBase,\n  defaultProps: {\n    ...VictoryScatterBase.defaultProps,\n    dataComponent: <Point />,\n    labelComponent: <VictoryLabel />,\n    containerComponent: <VictoryContainer />,\n    groupComponent: <G />,\n    width: Dimensions.get(\"window\").width,\n  },\n});\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-selection-container.tsx",
    "content": "/* eslint-disable react/no-multi-comp */\nimport React from \"react\";\nimport { Rect } from \"react-native-svg\";\nimport { VictoryEventHandler } from \"victory-core\";\nimport {\n  SelectionHelpers,\n  VictorySelectionContainerProps,\n  VICTORY_SELECTION_CONTAINER_DEFAULT_PROPS,\n  useVictorySelectionContainer,\n} from \"victory-selection-container\";\nimport { VictoryContainer } from \"./victory-container\";\nimport NativeHelpers from \"../helpers/native-helpers\";\n\nexport interface VictorySelectionContainerNativeProps\n  extends VictorySelectionContainerProps {\n  disableContainerEvents?: boolean;\n  onTouchStart?: VictoryEventHandler;\n  onTouchEnd?: VictoryEventHandler;\n}\n\n// ensure the selection component get native styles\nconst DefaultSelectionComponent = ({\n  style = {},\n  ...otherProps\n}: {\n  style?: Record<string, any>;\n}) => <Rect {...otherProps} {...NativeHelpers.getStyle(style)} />;\n\nexport const VictorySelectionContainer = (\n  initialProps: VictorySelectionContainerNativeProps,\n) => {\n  const { props, children } = useVictorySelectionContainer({\n    ...initialProps,\n    // @ts-expect-error TODO: standalone is not a valid prop for VictoryContainer, figure out why this is here\n    standalone: initialProps.standalone ?? true,\n    selectionComponent: initialProps.selectionComponent ?? (\n      <DefaultSelectionComponent />\n    ),\n  });\n  return <VictoryContainer {...props}>{children}</VictoryContainer>;\n};\n\nVictorySelectionContainer.role = \"container\";\n\nVictorySelectionContainer.defaultEvents = (\n  initialProps: VictorySelectionContainerNativeProps,\n) => {\n  const props = {\n    ...VICTORY_SELECTION_CONTAINER_DEFAULT_PROPS,\n    ...initialProps,\n  };\n  const createEventHandler =\n    (handler: VictoryEventHandler, cancel: boolean): VictoryEventHandler =>\n    // eslint-disable-next-line max-params\n    (event, targetProps, eventKey, context) => {\n      if (props.disable) {\n        return {};\n      }\n\n      if (cancel) {\n        SelectionHelpers.onMouseMove.cancel();\n      }\n\n      return handler(event, { ...props, ...targetProps }, eventKey, context);\n    };\n\n  return [\n    {\n      target: \"parent\",\n      eventHandlers: {\n        onTouchStart: createEventHandler(SelectionHelpers.onMouseMove, true),\n        onTouchMove: createEventHandler(SelectionHelpers.onMouseMove, false),\n        onTouchEnd: createEventHandler(SelectionHelpers.onMouseUp, true),\n      },\n    },\n  ];\n};\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-stack.tsx",
    "content": "import React from \"react\";\nimport { Dimensions } from \"react-native\";\nimport { G } from \"react-native-svg\";\nimport {\n  VictoryStack as VictoryStackBase,\n  VictoryStackProps,\n} from \"victory-stack/es\";\nimport { VictoryContainer } from \"./victory-container\";\nimport { wrapCoreComponent } from \"../helpers/wrap-core-component\";\n\nexport const VictoryStack = wrapCoreComponent<VictoryStackProps>({\n  Component: VictoryStackBase,\n  defaultProps: {\n    containerComponent: <VictoryContainer />,\n    groupComponent: <G />,\n    width: Dimensions.get(\"window\").width,\n  },\n});\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-tooltip.tsx",
    "content": "import React from \"react\";\nimport { G } from \"react-native-svg\";\nimport { VictoryTooltip as VictoryTooltipBase } from \"victory-tooltip/es\";\nimport { VictoryLabel } from \"./victory-label\";\nimport { VictoryPortal } from \"./victory-portal/victory-portal\";\nimport { Flyout } from \"./victory-primitives/flyout\";\n\nexport class VictoryTooltip extends VictoryTooltipBase {\n  static defaultProps = {\n    ...VictoryTooltipBase.defaultProps,\n    labelComponent: <VictoryLabel />,\n    flyoutComponent: <Flyout />,\n    groupComponent: <G />,\n  };\n\n  static defaultEvents() {\n    return [\n      {\n        target: \"data\",\n        eventHandlers: {\n          onPressIn: (targetProps) => {\n            return [\n              {\n                target: \"labels\",\n                mutation: () => ({ active: true }),\n              },\n              {\n                target: \"data\",\n                mutation: () =>\n                  targetProps.activateData\n                    ? { active: true }\n                    : { active: undefined },\n              },\n            ];\n          },\n          onPressOut: () => {\n            return [\n              {\n                target: \"labels\",\n                mutation: () => ({ active: undefined }),\n              },\n              {\n                target: \"data\",\n                mutation: () => ({ active: undefined }),\n              },\n            ];\n          },\n        },\n      },\n    ];\n  }\n\n  renderTooltip(props) {\n    const evaluatedProps = this.getEvaluatedProps(props);\n    const {\n      flyoutComponent,\n      labelComponent,\n      groupComponent,\n      active,\n      renderInPortal,\n    } = evaluatedProps;\n    if (!active) {\n      return renderInPortal ? (\n        <VictoryPortal>\n          <G />\n        </VictoryPortal>\n      ) : (\n        <G />\n      );\n    }\n\n    const calculatedValues = this.getCalculatedValues(evaluatedProps);\n    const children = [\n      React.cloneElement(\n        flyoutComponent!,\n        this.getFlyoutProps(evaluatedProps, calculatedValues),\n      ),\n      React.cloneElement(\n        labelComponent!,\n        this.getLabelProps(evaluatedProps, calculatedValues),\n      ),\n    ];\n    const tooltip = React.cloneElement(\n      groupComponent!,\n      { role: \"presentation\" },\n      children,\n    );\n    return renderInPortal ? <VictoryPortal>{tooltip}</VictoryPortal> : tooltip;\n  }\n}\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-voronoi-container.tsx",
    "content": "import React from \"react\";\nimport { VictoryEventHandler } from \"victory-core\";\nimport {\n  VictoryVoronoiContainerProps,\n  VoronoiHelpers,\n  useVictoryVoronoiContainer,\n  VICTORY_VORONOI_CONTAINER_DEFAULT_PROPS,\n} from \"victory-voronoi-container\";\nimport { VictoryContainer } from \"./victory-container\";\nimport { VictoryTooltip } from \"./victory-tooltip\";\n\nexport interface VictoryVoronoiContainerNativeProps\n  extends VictoryVoronoiContainerProps {\n  disableContainerEvents?: boolean;\n  onTouchStart?: VictoryEventHandler;\n  onTouchEnd?: VictoryEventHandler;\n}\n\nconst DEFAULT_VORONOI_PADDING = 5;\n\nexport const VictoryVoronoiContainer = (\n  initialProps: VictoryVoronoiContainerNativeProps,\n) => {\n  const { props, children } = useVictoryVoronoiContainer({\n    ...initialProps,\n    activateData: initialProps.activateData ?? true,\n    activateLabels: initialProps.activateLabels ?? true,\n    labelComponent: initialProps.labelComponent ?? <VictoryTooltip />,\n    voronoiPadding: initialProps.voronoiPadding ?? DEFAULT_VORONOI_PADDING,\n  });\n  return <VictoryContainer {...props}>{children}</VictoryContainer>;\n};\n\nVictoryVoronoiContainer.role = \"container\";\n\nVictoryVoronoiContainer.defaultEvents = (\n  initialProps: VictoryVoronoiContainerNativeProps,\n) => {\n  const props = { ...VICTORY_VORONOI_CONTAINER_DEFAULT_PROPS, ...initialProps };\n  const createEventHandler =\n    (handler: VictoryEventHandler, disabled?: boolean): VictoryEventHandler =>\n    // eslint-disable-next-line max-params\n    (event, targetProps, eventKey, context) =>\n      disabled || props.disable\n        ? {}\n        : handler(event, { ...props, ...targetProps }, eventKey, context);\n\n  return [\n    {\n      target: \"parent\",\n      eventHandlers: {\n        onTouchStart: createEventHandler(VoronoiHelpers.onMouseMove),\n        onTouchMove: createEventHandler(VoronoiHelpers.onMouseMove),\n        onTouchEnd: createEventHandler(VoronoiHelpers.onMouseLeave),\n      },\n    },\n    {\n      target: \"data\",\n      eventHandlers: props.disable\n        ? {}\n        : {\n            onTouchStart: () => null,\n            onTouchMove: () => null,\n            onTouchEnd: () => null,\n          },\n    },\n  ];\n};\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-voronoi.tsx",
    "content": "import React from \"react\";\nimport { Dimensions } from \"react-native\";\nimport { G } from \"react-native-svg\";\nimport {\n  VictoryVoronoi as VictoryVoronoiBase,\n  VictoryVoronoiProps,\n} from \"victory-voronoi/es\";\nimport { VictoryLabel } from \"./victory-label\";\nimport { VictoryContainer } from \"./victory-container\";\nimport { Voronoi } from \"./victory-primitives/voronoi\";\nimport { wrapCoreComponent } from \"../helpers/wrap-core-component\";\n\nexport const VictoryVoronoi = wrapCoreComponent<VictoryVoronoiProps>({\n  Component: VictoryVoronoiBase,\n  defaultProps: {\n    ...VictoryVoronoiBase.defaultProps,\n    dataComponent: <Voronoi />,\n    labelComponent: <VictoryLabel />,\n    containerComponent: <VictoryContainer />,\n    groupComponent: <G />,\n    width: Dimensions.get(\"window\").width,\n  },\n});\n"
  },
  {
    "path": "packages/victory-native/src/components/victory-zoom-container.tsx",
    "content": "import React from \"react\";\nimport { VictoryContainer } from \"./victory-container\";\nimport { VictoryClipContainer } from \"./victory-clip-container\";\nimport { VictoryEventHandler } from \"victory-core\";\nimport {\n  VictoryZoomContainerProps,\n  useVictoryZoomContainer,\n  VICTORY_ZOOM_CONTAINER_DEFAULT_PROPS,\n} from \"victory-zoom-container\";\nimport NativeZoomHelpers from \"../helpers/native-zoom-helpers\";\n\nexport interface VictoryZoomContainerNativeProps\n  extends VictoryZoomContainerProps {\n  disableContainerEvents?: boolean;\n  onTouchStart?: VictoryEventHandler;\n  onTouchEnd?: VictoryEventHandler;\n}\n\nexport const VictoryZoomContainer = (\n  initialProps: VictoryZoomContainerNativeProps,\n) => {\n  const { props, children } = useVictoryZoomContainer({\n    ...initialProps,\n    clipContainerComponent: initialProps.clipContainerComponent ?? (\n      <VictoryClipContainer />\n    ),\n  });\n\n  return <VictoryContainer {...props}>{children}</VictoryContainer>;\n};\n\nVictoryZoomContainer.role = \"container\";\n\nVictoryZoomContainer.defaultEvents = (\n  initialProps: VictoryZoomContainerNativeProps,\n) => {\n  const props = { ...VICTORY_ZOOM_CONTAINER_DEFAULT_PROPS, ...initialProps };\n  const createEventHandler =\n    (handler: VictoryEventHandler, disabled?: boolean): VictoryEventHandler =>\n    // eslint-disable-next-line max-params\n    (event, targetProps, eventKey, context) =>\n      disabled || props.disable\n        ? {}\n        : handler(event, { ...props, ...targetProps }, eventKey, context);\n\n  return [\n    {\n      target: \"parent\",\n      eventHandlers: {\n        onTouchStart: createEventHandler(NativeZoomHelpers.onTouchStart),\n        onTouchMove: createEventHandler(NativeZoomHelpers.onTouchMove),\n        onTouchEnd: createEventHandler(NativeZoomHelpers.onTouchEnd),\n        onTouchPinch: createEventHandler(NativeZoomHelpers.onTouchPinch),\n      },\n    },\n  ];\n};\n"
  },
  {
    "path": "packages/victory-native/src/helpers/create-container.ts",
    "content": "import { makeCreateContainerFunction } from \"victory-create-container\";\nimport { VictoryContainer } from \"../components/victory-container\";\nimport { VictoryZoomContainer } from \"../components/victory-zoom-container\";\nimport { VictoryVoronoiContainer } from \"../components/victory-voronoi-container\";\nimport { VictorySelectionContainer } from \"../components/victory-selection-container\";\nimport { VictoryBrushContainer } from \"../components/victory-brush-container\";\nimport { VictoryCursorContainer } from \"../components/victory-cursor-container\";\n\nexport const createContainer = makeCreateContainerFunction(\n  {\n    zoom: VictoryZoomContainer,\n    voronoi: VictoryVoronoiContainer,\n    selection: VictorySelectionContainer,\n    brush: VictoryBrushContainer,\n    cursor: VictoryCursorContainer,\n  },\n  VictoryContainer,\n);\n\nexport default createContainer;\n"
  },
  {
    "path": "packages/victory-native/src/helpers/native-helpers.test.ts",
    "content": "import NativeHelpers from \"./native-helpers\";\n\ndescribe(\"getStyle\", () => {\n  it(\"should return undefined if not called with any arguments\", () => {\n    expect(NativeHelpers.getStyle()).toEqual(undefined);\n  });\n\n  it(\"removes all unsupported props and leaves others, including stroke props\", () => {\n    expect(\n      NativeHelpers.getStyle({\n        fill: \"black\",\n        stroke: \"grey\",\n        pointerEvents: \"auto\",\n        x: 0,\n        y: 0,\n        _x: 0,\n        _y: 0,\n        userSelect: \"none\",\n        strokeWidth: 1,\n        strokeOpacity: 1,\n        strokeDasharray: 1,\n        strokeDashoffset: 1,\n        strokeLinecap: 1,\n        strokeLinejoin: 1,\n      }),\n    ).toEqual({\n      fill: \"black\",\n      stroke: \"grey\",\n      strokeWidth: 1,\n      strokeOpacity: 1,\n      strokeDasharray: 1,\n      strokeDashoffset: 1,\n      strokeLinecap: 1,\n      strokeLinejoin: 1,\n    });\n  });\n\n  it(\"removes all unsupported and stroke props when stroke is transparent\", () => {\n    expect(\n      NativeHelpers.getStyle({\n        stroke: \"transparent\",\n        fill: \"black\",\n        pointerEvents: \"auto\",\n        x: 0,\n        y: 0,\n        _x: 0,\n        _y: 0,\n        userSelect: \"none\",\n        strokeWidth: 1,\n        strokeOpacity: 1,\n        strokeDasharray: 1,\n        strokeDashoffset: 1,\n        strokeLinecap: 1,\n        strokeLinejoin: 1,\n      }),\n    ).toEqual({ fill: \"black\" });\n  });\n\n  it(\"removes all unsupported and stroke props when stroke is 'none'\", () => {\n    expect(\n      NativeHelpers.getStyle({\n        stroke: \"none\",\n        fill: \"black\",\n        pointerEvents: \"auto\",\n        x: 0,\n        y: 0,\n        _x: 0,\n        _y: 0,\n        userSelect: \"none\",\n        strokeWidth: 1,\n        strokeOpacity: 1,\n        strokeDasharray: 1,\n        strokeDashoffset: 1,\n        strokeLinecap: 1,\n        strokeLinejoin: 1,\n      }),\n    ).toEqual({ fill: \"black\" });\n  });\n\n  it(\"removes extra properties if given\", () => {\n    expect(\n      NativeHelpers.getStyle({ width: 100, height: 100, depth: 100 }, [\n        \"width\",\n        \"depth\",\n      ]),\n    ).toEqual({ height: 100 });\n  });\n});\n"
  },
  {
    "path": "packages/victory-native/src/helpers/native-helpers.ts",
    "content": "import * as React from \"react\";\n/**\n * creates an object with some keys excluded\n * replacement for lodash.omit for performance. does not mimick the entire lodash.omit api\n * @param {Object} originalObject: created object will be based on this object\n * @param {Array<String>} keys: an array of keys to omit from the new object\n * @returns {Object} new object with same properties as originalObject\n */\nexport const omit = (originalObject, keys: string[] = []) => {\n  // code based on babel's _objectWithoutProperties\n  const newObject = {};\n  for (const key in originalObject) {\n    if (keys.indexOf(key) >= 0) {\n      continue;\n    }\n    if (!Object.prototype.hasOwnProperty.call(originalObject, key)) {\n      continue;\n    }\n    newObject[key] = originalObject[key];\n  }\n  return newObject;\n};\n\nconst unsupportedProps = [\"pointerEvents\", \"x\", \"y\", \"_x\", \"_y\", \"userSelect\"];\nconst unsupportedAndStrokeProps = [\n  \"stroke\",\n  \"strokeWidth\",\n  \"strokeOpacity\",\n  \"strokeDasharray\",\n  \"strokeDashoffset\",\n  \"strokeLinecap\",\n  \"strokeLinejoin\",\n  ...unsupportedProps,\n];\n\nconst getStyle = (\n  style?: Record<string, any>,\n  extraOmitProperties?: string[],\n) => {\n  if (!style) {\n    return undefined;\n  }\n  // TODO: more style fixes for Native?\n  const omitProperties =\n    style.stroke === \"none\" || style.stroke === \"transparent\"\n      ? unsupportedAndStrokeProps\n      : unsupportedProps;\n  return extraOmitProperties\n    ? omit(style, [...omitProperties, ...extraOmitProperties])\n    : omit(style, omitProperties);\n};\n\nexport default {\n  getStyle,\n};\n\nexport const useGetNativeStyle = (\n  style: Record<string, any>,\n  extraOmitProperties?: string[],\n) => {\n  return React.useMemo(\n    () => getStyle(style, extraOmitProperties),\n    [style, extraOmitProperties],\n  );\n};\n"
  },
  {
    "path": "packages/victory-native/src/helpers/native-zoom-helpers.ts",
    "content": "import defaults from \"lodash/defaults\";\nimport throttle from \"lodash/throttle\";\nimport { Dimensions } from \"react-native\";\nimport isEqual from \"react-fast-compare\";\nimport { Collection, Helpers as CoreHelpers } from \"victory-core\";\nimport { RawZoomHelpers } from \"victory-zoom-container\";\n\nconst hypotenuse = (x, y) => Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));\n\nconst screenSize = hypotenuse(\n  Dimensions.get(\"window\").width,\n  Dimensions.get(\"window\").height,\n);\n\nconst Helpers = {\n  ...RawZoomHelpers,\n  onTouchEnd() {\n    return [\n      {\n        target: \"parent\",\n        mutation: () => {\n          return { panning: false, originalPinchDistance: null };\n        },\n      },\n    ];\n  },\n\n  // eslint-disable-next-line max-params\n  onTouchPinch(evt, targetProps, eventKey, ctx) {\n    const { onZoomDomainChange, zoomDimension, domain, zoomDomain } =\n      targetProps;\n    const { touches } = evt.nativeEvent;\n    if (!targetProps.allowZoom) {\n      return {};\n    }\n    const originalDomain = this.getDomain(targetProps);\n    const lastDomain = defaults(\n      {},\n      targetProps.currentDomain || zoomDomain || originalDomain,\n      domain,\n    );\n    const { x, y } = lastDomain;\n    const currentDomain = {\n      x:\n        zoomDimension === \"y\"\n          ? lastDomain.x\n          : this.scaleNative(x, evt, targetProps, \"x\"),\n      y:\n        zoomDimension === \"x\"\n          ? lastDomain.y\n          : this.scaleNative(y, evt, targetProps, \"y\"),\n    };\n    const resumeAnimation = this.handleAnimation(ctx);\n    const pinchDistance = this.getPinchDistance(touches);\n    const originalPinchDistance =\n      targetProps.originalPinchDistance || pinchDistance;\n\n    const zoomActive =\n      pinchDistance !== originalPinchDistance ||\n      // if zoomActive is already set AND user hasn't zoommed out all the way\n      (targetProps.zoomActive && !isEqual(originalDomain, lastDomain));\n\n    if (CoreHelpers.isFunction(onZoomDomainChange)) {\n      onZoomDomainChange(currentDomain);\n    }\n    return [\n      {\n        target: \"parent\",\n        callback: resumeAnimation,\n        mutation: () => {\n          return {\n            domain: currentDomain,\n            currentDomain,\n            originalDomain,\n            cachedZoomDomain: zoomDomain,\n            parentControlledProps: [\"domain\"],\n            panning: false,\n            originalPinchDistance,\n            zoomActive,\n          };\n        },\n      },\n    ];\n  },\n  getPinchDistance([a, b]) {\n    return hypotenuse(b.locationX - a.locationX, b.locationY - a.locationY);\n  },\n\n  getScaleFactorNative(evt, props) {\n    const { touches } = evt.nativeEvent;\n    const originalPinchDistance = props.originalPinchDistance || 0;\n    const currentPinchDistance = this.getPinchDistance(touches);\n    const scaledPinchChange =\n      (currentPinchDistance - originalPinchDistance) / screenSize;\n    return 1 - scaledPinchChange;\n  },\n\n  // eslint-disable-next-line max-params\n  scaleNative(currentDomain, evt, props, axis) {\n    const [from, to] = currentDomain;\n    const range = Math.abs(to - from);\n    const minimumZoom = props.minimumZoom && props.minimumZoom[axis];\n    const factor = this.getScaleFactorNative(evt, props);\n    if (minimumZoom && range <= minimumZoom && factor < 1) {\n      return currentDomain;\n    }\n    const [fromBound, toBound] = this.getDomain(props)[axis];\n    const percent = this.getScalePercent(evt, props, axis);\n    const point = factor * from + percent * (factor * range);\n    const minDomain = this.getMinimumDomain(point, props, axis);\n    const [newMin, newMax] = this.getScaledDomain(\n      currentDomain,\n      factor,\n      percent,\n    );\n    const newDomain = [\n      newMin > fromBound && newMin < toBound ? newMin : fromBound,\n      newMax < toBound && newMax > fromBound ? newMax : toBound,\n    ];\n    const domain =\n      Math.abs(minDomain[1] - minDomain[0]) >\n      Math.abs(newDomain[1] - newDomain[0])\n        ? minDomain\n        : newDomain;\n    return Collection.containsDates([fromBound, toBound])\n      ? [new Date(domain[0]), new Date(domain[1])]\n      : domain;\n  },\n};\n\nconst makeThrottledHandler = (handler) => {\n  // eslint-disable-next-line no-magic-numbers\n  const throttledHandler = throttle(handler, 16, { leading: true });\n  return (evt, ...otherParams) => {\n    evt.persist(); // ensure that the react native event is persisted!\n    return throttledHandler(evt, ...otherParams);\n  };\n};\n\nexport { Helpers, makeThrottledHandler };\n\nexport default {\n  onTouchStart: Helpers.onMouseDown.bind(Helpers),\n  onTouchEnd: Helpers.onTouchEnd.bind(Helpers),\n  onTouchMove: makeThrottledHandler(Helpers.onMouseMove.bind(Helpers)),\n  onTouchPinch: makeThrottledHandler(Helpers.onTouchPinch.bind(Helpers)),\n};\n"
  },
  {
    "path": "packages/victory-native/src/helpers/wrap-core-component.tsx",
    "content": "import React from \"react\";\nimport defaults from \"lodash/defaults\";\nimport hoistNonReactStatics from \"hoist-non-react-statics\";\n\n/**\n * Wrap a core component, pass props through.\n */\nexport function wrapCoreComponent<TProps extends object>({\n  Component,\n  defaultProps,\n}: {\n  Component: React.ComponentType<TProps>;\n  defaultProps: TProps;\n}) {\n  const WrappedComponent = (props: TProps) => {\n    const propsWithDefaults = defaults({}, props, defaultProps);\n    return <Component {...propsWithDefaults} />;\n  };\n\n  hoistNonReactStatics(WrappedComponent, Component);\n\n  return WrappedComponent;\n}\n"
  },
  {
    "path": "packages/victory-native/src/index.ts",
    "content": "export {\n  VictoryAnimation,\n  VictoryTheme,\n  VictoryTransition,\n  addEvents,\n  Collection,\n  Data,\n  DefaultTransitions,\n  Domain,\n  Events,\n  Helpers,\n  Log,\n  Scale,\n  Style,\n  TextSize,\n  Transitions,\n  Selection,\n  LabelHelpers,\n  Axis,\n  Wrapper,\n} from \"victory-core\";\n\nexport { VictorySharedEvents } from \"victory-shared-events\";\n\nexport * from \"./components/victory-primitives/circle\";\nexport * from \"./components/victory-primitives/line\";\nexport * from \"./components/victory-primitives/path\";\nexport * from \"./components/victory-primitives/rect\";\nexport * from \"./components/victory-primitives/text\";\nexport * from \"./components/victory-primitives/tspan\";\nexport * from \"./components/victory-primitives/arc\";\nexport * from \"./components/victory-primitives/area\";\nexport * from \"./components/victory-primitives/background\";\nexport * from \"./components/victory-primitives/bar\";\nexport * from \"./components/victory-primitives/border\";\nexport * from \"./components/victory-primitives/candle\";\nexport * from \"./components/victory-primitives/clip-path\";\nexport * from \"./components/victory-primitives/curve\";\nexport * from \"./components/victory-primitives/error-bar\";\nexport * from \"./components/victory-primitives/line-segment\";\nexport * from \"./components/victory-primitives/point\";\nexport * from \"./components/victory-primitives/slice\";\nexport * from \"./components/victory-primitives/voronoi\";\nexport * from \"./components/victory-primitives/flyout\";\nexport * from \"./components/victory-primitives/whisker\";\n\nexport * from \"./components/victory-tooltip\";\nexport * from \"./components/victory-portal/victory-portal\";\nexport * from \"./components/victory-portal/portal\";\nexport * from \"./components/victory-area\";\nexport * from \"./components/victory-axis\";\nexport * from \"./components/victory-polar-axis\";\nexport * from \"./components/victory-bar\";\nexport * from \"./components/victory-brush-line\";\nexport * from \"./components/victory-boxplot\";\nexport * from \"./components/victory-group\";\nexport * from \"./components/victory-line\";\nexport * from \"./components/victory-histogram\";\nexport * from \"./components/victory-scatter\";\nexport * from \"./components/victory-stack\";\nexport * from \"./components/victory-chart\";\nexport * from \"./components/victory-errorbar\";\nexport * from \"./components/victory-candlestick\";\nexport * from \"./components/victory-voronoi\";\nexport * from \"./components/victory-pie\";\nexport * from \"./components/victory-container\";\nexport * from \"./components/victory-clip-container\";\nexport * from \"./components/victory-label\";\nexport * from \"./components/victory-legend\";\n\nexport * from \"./components/victory-zoom-container\";\nexport * from \"./components/victory-voronoi-container\";\nexport * from \"./components/victory-selection-container\";\nexport * from \"./components/victory-cursor-container\";\nexport * from \"./components/victory-brush-container\";\n\nexport { default as NativeHelpers } from \"./helpers/native-helpers\";\nexport { default as NativeZoomHelpers } from \"./helpers/native-zoom-helpers\";\nexport { createContainer } from \"./helpers/create-container\";\n"
  },
  {
    "path": "packages/victory-native/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\", \"jest-native-setup.tsx\"]\n}\n"
  },
  {
    "path": "packages/victory-native/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\", \"jest-native-setup.tsx\"]\n}\n"
  },
  {
    "path": "packages/victory-pie/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-pie/CHANGELOG.md",
    "content": "# victory-pie\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n### Patch Changes\n\n- Remove deprecated babel-plugin-lodash plugin ([#2965](https://github.com/FormidableLabs/victory/pull/2965))\n\n* Improve types in victory-core helpers ([#2999](https://github.com/FormidableLabs/victory/pull/2999))\n\n## 37.3.2\n\n## 37.3.1\n\n### Patch Changes\n\n- Added logic to sort pie chart slices by categories prop ([#2934](https://github.com/FormidableLabs/victory/pull/2934))\n\n* Remove duplicate types from interfaces ([#2940](https://github.com/FormidableLabs/victory/pull/2940))\n\n## 37.3.0\n\n## 37.2.0\n\n### Minor Changes\n\n- Minor updates for clean theme ([#2909](https://github.com/FormidableLabs/victory/pull/2909))\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n### Patch Changes\n\n- Ensure undefined props do not overwrite defaults ([#2852](https://github.com/FormidableLabs/victory/pull/2852))\n\n## 37.0.1\n\n### Patch Changes\n\n- Fix the signature of class static functions in components ([#2840](https://github.com/FormidableLabs/victory/pull/2840))\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n### Patch Changes\n\n- Replace lodash isNil and isNan with native code ([#2800](https://github.com/FormidableLabs/victory/pull/2800))\n\n* Replace lodash isFunction with native code ([#2802](https://github.com/FormidableLabs/victory/pull/2802))\n\n## 36.9.1\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n* Replace instances of lodash.range with equivalent native code ([#2760](https://github.com/FormidableLabs/victory/pull/2760))\n\n## 36.8.4\n\n## 36.8.3\n\n### Patch Changes\n\n- Migrate victory-pie to TypeScript ([#2740](https://github.com/FormidableLabs/victory/pull/2740))\n\n## 36.8.2\n\n## 36.8.1\n\n## 36.8.0\n\n### Patch Changes\n\n- Remove usage of defaultProps from components ([#2679](https://github.com/FormidableLabs/victory/pull/2679))\n\n## 36.7.0\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.8\n  - victory-vendor@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.7\n  - victory-vendor@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.6\n  - victory-vendor@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416), [`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-core@36.6.5\n  - victory-vendor@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n- Updated dependencies [[`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-core@36.6.4\n  - victory-vendor@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-core@36.6.3\n  - victory-vendor@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.2\n  - victory-vendor@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- Updated dependencies [[`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-core@36.6.1\n  - victory-vendor@36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Update source code with minor lint-based improvements (see [#2236](https://github.com/FormidableLabs/victory/issues/2236)). ([#2403](https://github.com/FormidableLabs/victory/pull/2403))\n\n- Updated dependencies [[`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-core@36.6.0\n  - victory-vendor@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-pie/README.md",
    "content": "# VictoryPie\n\n`victory-pie@^30.0.0` exports `VictoryPie` and `Slice` components\n\nTo view documentation for `VictoryPie` please see https://commerce.nearform.com/open-source/victory/docs/victory-pie\n\nTo suggest an addition or correction to this documentation please see https://github.com/FormidableLabs/victory/blob/main/docs/src/content/docs/victory-pie.md\n"
  },
  {
    "path": "packages/victory-pie/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-pie/package.json",
    "content": "{\n  \"name\": \"victory-pie\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Pie Component for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"lodash\": \"^4.17.19\",\n    \"victory-core\": \"37.3.6\",\n    \"victory-vendor\": \"37.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\",\n        \"../victory-vendor:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:cjs\",\n        \"../victory-vendor:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\",\n        \"../victory-vendor:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\",\n        \"../victory-vendor:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-vendor:build\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-vendor:build\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:build\",\n        \"../victory-vendor:build\",\n        \"../victory-voronoi:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-pie/src/helper-methods.ts",
    "content": "/* eslint no-magic-numbers: [\"error\", { \"ignore\": [-1, 0, 1, 2, 45, 90, 135, 180, 225, 270, 315, 360] }]*/\nimport defaults from \"lodash/defaults\";\nimport isPlainObject from \"lodash/isPlainObject\";\nimport * as d3Shape from \"victory-vendor/d3-shape\";\n\nimport { Helpers, Data, Style } from \"victory-core\";\nimport { VictoryPieProps } from \"./victory-pie\";\n\nconst checkForValidText = (text) => {\n  if (text === undefined || text === null || Helpers.isFunction(text)) {\n    return text;\n  }\n  return `${text}`;\n};\n\nconst getColor = (style, colors, index) => {\n  if (style && style.data && style.data.fill) {\n    return style.data.fill;\n  }\n  return colors && colors[index % colors.length];\n};\n\nconst getRadius = (props, padding) => {\n  if (typeof props.radius === \"number\") {\n    return props.radius;\n  }\n  return (\n    Math.min(\n      props.width - padding.left - padding.right,\n      props.height - padding.top - padding.bottom,\n    ) / 2\n  );\n};\n\nconst getOrigin = (props, padding) => {\n  const { width, height } = props;\n  const origin = isPlainObject(props.origin) ? props.origin : {};\n  return {\n    x:\n      origin.x !== undefined\n        ? origin.x\n        : (padding.left - padding.right + width) / 2,\n    y:\n      origin.y !== undefined\n        ? origin.y\n        : (padding.top - padding.bottom + height) / 2,\n  };\n};\n\nconst getSlices = (props, data) => {\n  const padAngle = Helpers.isFunction(props.padAngle) ? 0 : props.padAngle;\n  const layoutFunction = d3Shape\n    .pie()\n    .sort(null)\n    .startAngle(Helpers.degreesToRadians(props.startAngle))\n    .endAngle(Helpers.degreesToRadians(props.endAngle))\n    .padAngle(Helpers.degreesToRadians(padAngle))\n    .value((datum: any) => {\n      return datum._y;\n    });\n  return layoutFunction(data);\n};\n\nconst getCategoriesFromProps = (props: VictoryPieProps) =>\n  Array.isArray(props.categories)\n    ? props.categories\n    : ((props?.categories as { x: string[] })?.x ?? []);\n\n/**\n * Sorts data by props.categories or props.categories.x. If all of the data keys aren't\n * included in categories, any remaining data will be appended to the data array.\n * If extraneous categories are included in the categories prop, the will be ignored and\n * have no effect on the rendered component.\n */\nconst getDataSortedByCategories = (props: VictoryPieProps, data) => {\n  const sorted: string[] = [];\n  getCategoriesFromProps(props).forEach((category) => {\n    const idx = data.findIndex(({ x }) => x === category);\n    if (idx >= 0) {\n      const datum = data.splice(idx, 1)[0];\n      sorted.push(datum);\n    }\n  });\n  return [...sorted, ...data];\n};\n\nconst getCalculatedValues = (props) => {\n  const { colorScale, theme } = props;\n  const styleObject = Helpers.getDefaultStyles(props, \"pie\");\n  const style = Helpers.getStyles(props.style, styleObject);\n  const colors = Array.isArray(colorScale)\n    ? colorScale\n    : Style.getColorScale(colorScale, theme);\n  const padding = Helpers.getPadding(props.padding);\n  const defaultRadius = getRadius(props, padding);\n  const origin = getOrigin(props, padding);\n  const data = getDataSortedByCategories(props, Data.getData(props));\n  const slices = getSlices(props, data);\n  return Object.assign({}, props, {\n    style,\n    colors,\n    padding,\n    defaultRadius,\n    data,\n    slices,\n    origin,\n  });\n};\n\nconst getSliceStyle = (index, calculatedValues) => {\n  const { style, colors } = calculatedValues;\n  const fill = getColor(style, colors, index);\n  return Object.assign({ fill }, style.data);\n};\n\nconst getLabelText = (props, datum, index) => {\n  let text;\n  if (datum.label) {\n    text = datum.label;\n  } else if (Array.isArray(props.labels)) {\n    text = props.labels[index];\n  } else {\n    text = Helpers.isFunction(props.labels)\n      ? props.labels\n      : datum.xName || datum._x;\n  }\n  return checkForValidText(text);\n};\n\nconst getLabelArc = (labelRadius) => {\n  return d3Shape.arc().outerRadius(labelRadius).innerRadius(labelRadius);\n};\n\nconst getCalculatedLabelRadius = (radius, labelRadius, style) => {\n  const padding = (style && style.padding) || 0;\n  return labelRadius || radius + padding;\n};\n\nconst getLabelPosition = (arc, slice, position) => {\n  const construct = {\n    startAngle: position === \"startAngle\" ? slice.startAngle : slice.endAngle,\n    endAngle: position === \"endAngle\" ? slice.endAngle : slice.startAngle,\n  };\n  const clonedArc = Object.assign({}, slice, construct);\n  return arc.centroid(clonedArc);\n};\n\nconst getLabelOrientation = (degree, labelPlacement) => {\n  if (labelPlacement === \"perpendicular\") {\n    return degree > 90 && degree < 270 ? \"bottom\" : \"top\";\n  } else if (labelPlacement === \"parallel\") {\n    return degree >= 0 && degree <= 180 ? \"right\" : \"left\";\n  }\n  if (degree < 45 || degree > 315) {\n    return \"top\";\n  } else if (degree >= 45 && degree < 135) {\n    return \"right\";\n  } else if (degree >= 135 && degree < 225) {\n    return \"bottom\";\n  }\n  return \"left\";\n};\n\nconst getTextAnchor = (orientation) => {\n  if (orientation === \"top\" || orientation === \"bottom\") {\n    return \"middle\";\n  }\n  return orientation === \"right\" ? \"start\" : \"end\";\n};\n\nconst getVerticalAnchor = (orientation) => {\n  if (orientation === \"left\" || orientation === \"right\") {\n    return \"middle\";\n  }\n  return orientation === \"bottom\" ? \"start\" : \"end\";\n};\n\nconst getBaseLabelAngle = (slice, labelPosition, labelStyle) => {\n  let baseAngle = 0;\n  if (labelPosition.angle !== undefined) {\n    baseAngle = labelStyle.angle;\n  } else if (labelPosition === \"centroid\") {\n    baseAngle = Helpers.radiansToDegrees(\n      (slice.startAngle + slice.endAngle) / 2,\n    );\n  } else {\n    baseAngle =\n      labelPosition === \"startAngle\"\n        ? Helpers.radiansToDegrees(slice.startAngle)\n        : Helpers.radiansToDegrees(slice.endAngle);\n  }\n  const positiveAngle = baseAngle < 0 ? 360 - baseAngle : baseAngle;\n  return positiveAngle % 360;\n};\n\nconst getLabelAngle = (baseAngle, labelPlacement) => {\n  if (labelPlacement === \"vertical\") {\n    return 0;\n  }\n  if (labelPlacement === \"parallel\") {\n    return baseAngle > 180 && baseAngle < 360 ? baseAngle + 90 : baseAngle - 90;\n  }\n  return baseAngle > 90 && baseAngle < 270 ? baseAngle - 180 : baseAngle;\n};\n\nconst getLabelProps = (text, dataProps, calculatedValues) => {\n  const { index, datum, data, slice, labelComponent, theme } = dataProps;\n  const { style, defaultRadius, origin, width, height } = calculatedValues;\n  const labelRadius = Helpers.evaluateProp(\n    calculatedValues.labelRadius,\n    Object.assign({ text }, dataProps),\n  );\n  const labelPosition =\n    Helpers.evaluateProp(\n      calculatedValues.labelPosition,\n      Object.assign({ text }, dataProps),\n    ) || \"centroid\";\n  const labelPlacement =\n    Helpers.evaluateProp(\n      calculatedValues.labelPlacement,\n      Object.assign({ text }, dataProps),\n    ) || \"vertical\";\n  const labelStyle = Object.assign({ padding: 0 }, style.labels);\n  const evaluatedStyle = Helpers.evaluateStyle(\n    labelStyle,\n    Object.assign({ labelRadius, text }, dataProps),\n  );\n  const calculatedLabelRadius = getCalculatedLabelRadius(\n    defaultRadius,\n    labelRadius,\n    evaluatedStyle,\n  );\n  const labelArc = getLabelArc(calculatedLabelRadius);\n  const position = getLabelPosition(labelArc, slice, labelPosition);\n  const baseAngle = getBaseLabelAngle(slice, labelPosition, labelStyle);\n  const labelAngle = getLabelAngle(baseAngle, labelPlacement);\n  const orientation = getLabelOrientation(baseAngle, labelPlacement);\n  const textAnchor = labelStyle.textAnchor || getTextAnchor(orientation);\n  const verticalAnchor =\n    labelStyle.verticalAnchor || getVerticalAnchor(orientation);\n\n  const labelProps = {\n    width,\n    height,\n    index,\n    datum,\n    data,\n    slice,\n    orientation,\n    text,\n    style: labelStyle,\n    x: Math.round(position[0]) + origin.x,\n    y: Math.round(position[1]) + origin.y,\n    textAnchor,\n    verticalAnchor,\n    angle: labelAngle,\n    calculatedLabelRadius,\n  };\n\n  if (!Helpers.isTooltip(labelComponent)) {\n    return labelProps;\n  }\n  const tooltipTheme = (theme && theme.tooltip) || {};\n  return defaults({}, labelProps, Helpers.omit(tooltipTheme, [\"style\"]));\n};\n\nexport const getXOffsetMultiplayerByAngle = (angle) =>\n  Math.cos(angle - Helpers.degreesToRadians(90));\nexport const getYOffsetMultiplayerByAngle = (angle) =>\n  Math.sin(angle - Helpers.degreesToRadians(90));\nexport const getXOffset = (offset, angle) =>\n  offset * getXOffsetMultiplayerByAngle(angle);\nexport const getYOffset = (offset, angle) =>\n  offset * getYOffsetMultiplayerByAngle(angle);\nexport const getAverage = (array) =>\n  array.reduce((acc, cur) => acc + cur, 0) / array.length;\n\nexport const getLabelIndicatorPropsForLineSegment = (\n  props,\n  calculatedValues,\n  labelProps,\n) => {\n  const {\n    innerRadius,\n    radius,\n    slice: { startAngle, endAngle },\n    labelIndicatorInnerOffset,\n    labelIndicatorOuterOffset,\n    index,\n  } = props;\n\n  const { height, width } = calculatedValues;\n  const { calculatedLabelRadius } = labelProps;\n  // calculation\n  const middleRadius = getAverage([innerRadius, radius]);\n  const midAngle = getAverage([endAngle, startAngle]);\n  const centerX = width / 2;\n  const centerY = height / 2;\n  const innerOffset = middleRadius + labelIndicatorInnerOffset;\n  const outerOffset = calculatedLabelRadius - labelIndicatorOuterOffset;\n\n  const x1 = centerX + getXOffset(innerOffset, midAngle);\n  const y1 = centerY + getYOffset(innerOffset, midAngle);\n\n  const x2 = centerX + getXOffset(outerOffset, midAngle);\n  const y2 = centerY + getYOffset(outerOffset, midAngle);\n\n  const labelIndicatorProps = {\n    x1,\n    y1,\n    x2,\n    y2,\n    index,\n  };\n  return defaults({}, labelIndicatorProps);\n};\n\nexport const getBaseProps = (initialProps, fallbackProps) => {\n  const props = Helpers.modifyProps(initialProps, fallbackProps, \"pie\");\n  const calculatedValues = getCalculatedValues(props);\n  const {\n    slices,\n    style,\n    data,\n    origin,\n    defaultRadius,\n    labels,\n    events,\n    sharedEvents,\n    height,\n    width,\n    standalone,\n    name,\n    innerRadius,\n    cornerRadius,\n    padAngle,\n    disableInlineStyles,\n    labelIndicator,\n  } = calculatedValues;\n  const radius = props.radius || defaultRadius;\n  const initialChildProps = {\n    parent: { standalone, height, width, slices, name, style: style.parent },\n  };\n\n  return slices.reduce((childProps, slice, index) => {\n    const datum = defaults({}, data[index], {\n      startAngle: Helpers.radiansToDegrees(slice.startAngle),\n      endAngle: Helpers.radiansToDegrees(slice.endAngle),\n      padAngle: Helpers.radiansToDegrees(slice.padAngle),\n    });\n    const eventKey = !Helpers.isNil(datum.eventKey) ? datum.eventKey : index;\n    const dataProps = {\n      index,\n      slice,\n      datum,\n      data,\n      origin,\n      innerRadius,\n      radius,\n      cornerRadius,\n      padAngle,\n      style: disableInlineStyles ? {} : getSliceStyle(index, calculatedValues),\n      disableInlineStyles,\n    };\n    childProps[eventKey] = {\n      data: dataProps,\n    };\n    const text = getLabelText(props, datum, index);\n    if (\n      (text !== undefined && text !== null) ||\n      (labels && (events || sharedEvents))\n    ) {\n      const evaluatedText = Helpers.evaluateProp(text, dataProps);\n      childProps[eventKey].labels = getLabelProps(\n        evaluatedText,\n        Object.assign({}, props, dataProps),\n        calculatedValues,\n      );\n      if (labelIndicator) {\n        const labelProps = childProps[eventKey].labels;\n        if (labelProps.calculatedLabelRadius > radius) {\n          childProps[eventKey].labelIndicators =\n            getLabelIndicatorPropsForLineSegment(\n              Object.assign({}, props, dataProps),\n              calculatedValues,\n              labelProps,\n            );\n        }\n      }\n    }\n    return childProps;\n  }, initialChildProps);\n};\n"
  },
  {
    "path": "packages/victory-pie/src/index.ts",
    "content": "export * from \"./victory-pie\";\nexport * from \"./slice\";\n"
  },
  {
    "path": "packages/victory-pie/src/slice.test.tsx",
    "content": "import { render } from \"@testing-library/react\";\nimport React from \"react\";\nimport { SVGWrapper } from \"../../../test/helpers\";\nimport { Slice } from \".\";\n\ndescribe(\"victory-primitives/slice\", () => {\n  describe(\"rendering\", () => {\n    it(\"renders a path with attribute `d` equal to the result of `props.pathFunction` called with `props.slice`\", () => {\n      const EXPECTED_D_ATTR = \"M1,1\";\n      const slice = { x: 1, y: 1 };\n      const pathFunction = (sli) => {\n        // The path function is called with `props.slice`\n        expect(sli).toEqual(slice);\n\n        return EXPECTED_D_ATTR;\n      };\n\n      const { container } = render(\n        // @ts-expect-error there is a prop mismatch here between the slice definition and the prop\n        <Slice pathFunction={pathFunction} slice={slice} />,\n        { wrapper: SVGWrapper },\n      );\n\n      expect(container.querySelector(\"path\")).toMatchInlineSnapshot(`\n        <path\n          d=\"M1,1\"\n          role=\"presentation\"\n          shape-rendering=\"auto\"\n        />\n      `);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-pie/src/slice.tsx",
    "content": "import React from \"react\";\nimport {\n  Helpers,\n  Path,\n  NumberOrCallback,\n  SliceNumberOrCallback,\n  StringOrCallback,\n  VictoryCommonProps,\n  VictoryStyleInterface,\n} from \"victory-core\";\nimport defaults from \"lodash/defaults\";\nimport * as d3Shape from \"victory-vendor/d3-shape\";\n\nexport type VictorySliceLabelPositionType =\n  | \"startAngle\"\n  | \"centroid\"\n  | \"endAngle\";\nexport type VictorySliceLabelPlacementType =\n  | \"vertical\"\n  | \"parallel\"\n  | \"perpendicular\";\nexport type VictorySliceTTargetType = \"data\" | \"labels\" | \"parent\";\n\nexport interface SliceProps extends VictoryCommonProps {\n  ariaLabel?: StringOrCallback;\n  cornerRadius?: SliceNumberOrCallback<SliceProps, \"cornerRadius\">;\n  datum?: any;\n  innerRadius?: NumberOrCallback;\n  padAngle?: SliceNumberOrCallback<SliceProps, \"padAngle\">;\n  pathComponent?: React.ReactElement;\n  pathFunction?: (props: SliceProps) => string;\n  radius?: SliceNumberOrCallback<SliceProps, \"radius\">;\n  slice?: {\n    startAngle?: number;\n    endAngle?: number;\n    padAngle?: number;\n    data?: any[];\n  };\n  sliceEndAngle?: SliceNumberOrCallback<SliceProps, \"sliceEndAngle\">;\n  sliceStartAngle?: SliceNumberOrCallback<SliceProps, \"sliceStartAngle\">;\n  style?: VictoryStyleInterface;\n  tabIndex?: NumberOrCallback;\n  role?: string;\n  shapeRendering?: string;\n}\n\nconst getPath = (props) => {\n  const { slice, radius, innerRadius, cornerRadius } = props;\n  if (Helpers.isFunction(props.pathFunction)) {\n    return props.pathFunction(slice);\n  }\n  const padAngle = Helpers.degreesToRadians(props.padAngle);\n  const startAngle = Helpers.degreesToRadians(props.sliceStartAngle);\n  const endAngle = Helpers.degreesToRadians(props.sliceEndAngle);\n  const pathFunction = d3Shape\n    .arc()\n    .cornerRadius(cornerRadius)\n    .outerRadius(radius)\n    .innerRadius(innerRadius || 0);\n  return pathFunction(defaults({ startAngle, endAngle, padAngle }, slice));\n};\n\nconst evaluateProps = (props) => {\n  /**\n   * * Potential evaluated props of following must be evaluated in this order:\n   * 1) `style`\n   * 2) `radius`\n   * 3) `innerRadius`\n   *\n   * Everything else does not have to be evaluated in a particular order:\n   * `ariaLabel`\n   * `id`\n   * `cornerRadius`\n   * `padAngle`\n   * `sliceStartAngle`\n   * `sliceEndAngle`\n   * `tabIndex`\n   */\n  const style = Helpers.evaluateStyle(props.style, props);\n  const radius = Helpers.evaluateProp(\n    props.radius,\n    Object.assign({}, props, { style }),\n  );\n  const innerRadius = Helpers.evaluateProp(\n    props.innerRadius,\n    Object.assign({}, props, { style, radius }),\n  );\n\n  const ariaLabel = Helpers.evaluateProp(props.ariaLabel, props);\n  const id = Helpers.evaluateProp(props.id, props);\n  const cornerRadius = Helpers.evaluateProp(props.cornerRadius, props);\n  const padAngle = Helpers.evaluateProp(props.padAngle, props);\n  const sliceStartAngle = Helpers.evaluateProp(props.sliceStartAngle, props);\n  const sliceEndAngle = Helpers.evaluateProp(props.sliceEndAngle, props);\n  const tabIndex = Helpers.evaluateProp(props.tabIndex, props);\n\n  return Object.assign({}, props, {\n    ariaLabel,\n    style,\n    radius,\n    innerRadius,\n    id,\n    cornerRadius,\n    padAngle,\n    sliceStartAngle,\n    sliceEndAngle,\n    tabIndex,\n  });\n};\n\nconst defaultProps: SliceProps = {\n  pathComponent: <Path />,\n  role: \"presentation\",\n  shapeRendering: \"auto\",\n};\n\nexport const Slice = (initialProps: SliceProps) => {\n  const props = evaluateProps(defaults({}, initialProps, defaultProps));\n  const defaultTransform = props.origin\n    ? `translate(${props.origin.x}, ${props.origin.y})`\n    : undefined;\n\n  return React.cloneElement(props.pathComponent, {\n    ...props.events,\n    \"aria-label\": props.ariaLabel,\n    d: getPath(props),\n    style: props.style,\n    transform: props.transform || defaultTransform,\n    className: props.className,\n    role: props.role,\n    shapeRendering: props.shapeRendering,\n    clipPath: props.clipPath,\n    tabIndex: props.tabIndex,\n  });\n};\n"
  },
  {
    "path": "packages/victory-pie/src/victory-pie.test.tsx",
    "content": "import React from \"react\";\nimport { render, screen, fireEvent } from \"@testing-library/react\";\nimport { Helpers, Style } from \"victory-core\";\nimport {\n  isCircularSector,\n  getSvgCoordinatesAngleFromCartesianYAxis,\n  getSliceArcStart,\n  parseSvgPathCommands,\n  getDistanceFromOrigin,\n  getSliceArcEnd,\n} from \"../../../test/helpers\";\nimport { VictoryPie } from \"./victory-pie\";\nimport { Slice } from \"./slice\";\n\nconst pizzaSliceInnerText = \"Pizza Slice\";\nconst PizzaSlice = ({ datum }: { datum?: { x: number } }) => (\n  <p data-testid={`pizza-slice-${datum?.x}`} data-xvalue={datum?.x}>\n    {pizzaSliceInnerText}\n  </p>\n);\n\ndescribe(\"components/victory-pie\", () => {\n  const labeledData = [\n    { x: \"Cats\", y: 35 },\n    { x: \"Dogs\", y: 40 },\n    { x: \"Birds\", y: 55 },\n  ];\n\n  describe(\"default component rendering\", () => {\n    it(\"accepts user props\", () => {\n      render(<VictoryPie data-testid=\"victory-pie\" aria-label=\"Chart\" />);\n\n      const svgNode = screen.getByTestId(\"victory-pie\");\n\n      expect(svgNode).toHaveAttribute(\"aria-label\", \"Chart\");\n    });\n\n    it(\"renders an svg with the correct width and height\", () => {\n      const { container } = render(<VictoryPie />);\n      const svg = container.querySelector(\"svg\");\n\n      expect(svg?.getAttribute(\"style\")).toContain(\"width: 100%; height: 100%\");\n    });\n\n    it(\"renders an svg with the correct viewBox\", () => {\n      const { container } = render(<VictoryPie />);\n      const svg = container.querySelector(\"svg\");\n      expect(svg?.getAttribute(\"viewBox\")).toEqual(\"0 0 400 400\");\n    });\n\n    it(\"renders 5 slices\", () => {\n      const { container } = render(<VictoryPie />);\n\n      const slices = container.querySelectorAll(\"path\");\n      expect(slices).toHaveLength(5);\n    });\n\n    it(\"renders each slice as a circular sector\", () => {\n      const { container } = render(<VictoryPie />);\n      const slices = container.querySelectorAll(\"path\");\n      slices.forEach((slice) => {\n        const sliceCommandString = slice.getAttribute(\"d\");\n        expect(isCircularSector(sliceCommandString)).toBeTruthy();\n      });\n    });\n\n    it(\"renders 5 slice labels\", () => {\n      const { container } = render(<VictoryPie />);\n\n      const labels = container.querySelectorAll(\"text\");\n\n      expect(labels).toHaveLength(5);\n    });\n\n    it(\"renders 0 slice labels for empty label array\", () => {\n      const { container } = render(<VictoryPie labels={[]} />);\n\n      const labels = container.querySelectorAll(\"text\");\n\n      expect(labels).toHaveLength(0);\n    });\n\n    it(\"renders 0 slice labels for label function returning undefined\", () => {\n      // @ts-expect-error \"undefined\" is not assignable to \"string\"\n      const { container } = render(<VictoryPie labels={() => undefined} />);\n\n      const labels = container.querySelectorAll(\"text\");\n\n      expect(labels).toHaveLength(0);\n    });\n  });\n\n  describe(\"rendering data\", () => {\n    it(\"renders dataComponents for {x, y} shaped data (default)\", () => {\n      const data = Helpers.range(5).map((i) => ({ x: i, y: i }));\n      render(<VictoryPie data={data} dataComponent={<PizzaSlice />} />);\n      const pizzaSlices = screen.getAllByText(pizzaSliceInnerText);\n      expect(pizzaSlices).toHaveLength(5);\n    });\n\n    it(\"renders points for {x, y} shaped data (default)\", () => {\n      const data = Helpers.range(5).map((i) => ({ x: i, y: i }));\n      const { container } = render(<VictoryPie data={data} />);\n      const slices = container.querySelectorAll(\"path\");\n      expect(slices).toHaveLength(5);\n    });\n\n    it(\"renders points for array-shaped data\", () => {\n      const data = Helpers.range(6).map((i) => [i, i]);\n      const { container } = render(<VictoryPie data={data} x={0} y={1} />);\n      const slices = container.querySelectorAll(\"path\");\n\n      expect(slices).toHaveLength(6);\n    });\n\n    it(\"renders points for deeply-nested data\", () => {\n      const data = Helpers.range(7).map((i) => ({\n        a: { b: [{ x: i, y: i }] },\n      }));\n      const { container } = render(\n        <VictoryPie data={data} x=\"a.b[0].x\" y=\"a.b[0].y\" />,\n      );\n      const slices = container.querySelectorAll(\"path\");\n\n      expect(slices).toHaveLength(7);\n    });\n\n    it(\"renders data values with null accessor\", () => {\n      const data = Helpers.range(8);\n      const { container } = render(\n        // @ts-expect-error \"'null' is not assignable to 'x'\"\n        <VictoryPie data={data} x={null} y={null} />,\n      );\n      const slices = container.querySelectorAll(\"path\");\n\n      expect(slices).toHaveLength(8);\n    });\n\n    it(\"renders data values in their given order\", () => {\n      const data = Helpers.range(9).map((i) => ({ x: i, y: i }));\n\n      render(<VictoryPie data={data} dataComponent={<PizzaSlice />} />);\n      const xValues = Array.from(screen.getAllByText(pizzaSliceInnerText)).map(\n        (slice) => {\n          return parseInt(slice.getAttribute(\"data-xvalue\") || \"\");\n        },\n      );\n\n      const xValuesFromGivenData = data.map(({ x }) => x);\n\n      expect(xValues).toEqual(xValuesFromGivenData);\n    });\n\n    it(\"renders data values sorted by categories prop\", () => {\n      const { container } = render(\n        <VictoryPie categories={{ x: [\"E\", \"A\", \"D\", \"C\", \"B\"] }} />,\n      );\n\n      const xValues = Array.from(\n        container.querySelectorAll(\"text[id^=pie-labels] > tspan\"),\n      ).map((slice) => slice.textContent);\n\n      expect(xValues).toEqual([\"E\", \"A\", \"D\", \"C\", \"B\"]);\n    });\n\n    it(\"renders data values sorted by categories prop, appending any data keys missing from categories and ignoring any categories values that are not valid data keys\", () => {\n      const { container } = render(\n        <VictoryPie categories={{ x: [\"E\", \"C\", \"B\", \"Z\"] }} />,\n      );\n\n      const xValues = Array.from(\n        container.querySelectorAll(\"text[id^=pie-labels] > tspan\"),\n      ).map((slice) => slice.textContent);\n\n      expect(xValues).toEqual([\"E\", \"C\", \"B\", \"A\", \"D\"]);\n    });\n\n    it(\"renders data values sorted by sortKey prop\", () => {\n      const data = Helpers.range(9)\n        .map((i) => ({ x: i, y: i }))\n        .reverse();\n\n      render(\n        <VictoryPie data={data} sortKey=\"x\" dataComponent={<PizzaSlice />} />,\n      );\n      const xValues = Array.from(screen.getAllByText(pizzaSliceInnerText)).map(\n        (slice) => {\n          return parseInt(slice.getAttribute(\"data-xvalue\") || \"\");\n        },\n      );\n\n      const xValuesFromDataAscending = data\n        .map(({ x }) => x)\n        .sort((a, b) => a - b);\n\n      expect(xValues).toEqual(xValuesFromDataAscending);\n    });\n\n    it(\"renders data values sorted by sortKey prop and sortOrder\", () => {\n      const data = Helpers.range(9).map((i) => ({ x: i, y: i }));\n\n      render(\n        <VictoryPie\n          data={data}\n          sortKey=\"x\"\n          sortOrder={\"descending\"}\n          dataComponent={<PizzaSlice />}\n        />,\n      );\n      const xValues = Array.from(screen.getAllByText(pizzaSliceInnerText)).map(\n        (slice) => {\n          return parseInt(slice.getAttribute(\"data-xvalue\") || \"\");\n        },\n      );\n\n      const xValuesFromDataDescending = data\n        .map(({ x }) => x)\n        .sort((a, b) => b - a);\n\n      expect(xValues).toEqual(xValuesFromDataDescending);\n    });\n\n    it(\"does not render data with null x or y values\", () => {\n      const data = [\n        { x: 1, y: 2 },\n        { x: null, y: 4 },\n        { x: 5, y: null },\n      ];\n      const { container } = render(<VictoryPie data={data} />);\n      const slices = container.querySelectorAll(\"path\");\n      expect(slices).toHaveLength(1);\n    });\n  });\n\n  describe(\"the `startAngle` prop\", () => {\n    it(\"determines the counter clockwise angle relative to a cartesian Y axis of a vector extending from the origin to the _first drawn coordinate_ of the first slice \", () => {\n      [0, 90, 180, 270].map((angle) => {\n        const { container } = render(<VictoryPie startAngle={angle} />);\n\n        const [firstSlice] = container.querySelectorAll(\"path\");\n        const sliceCommandString = firstSlice.getAttribute(\"d\");\n        const coordinates = getSliceArcStart(sliceCommandString);\n        const renderedAngle =\n          getSvgCoordinatesAngleFromCartesianYAxis(coordinates);\n\n        // There is a small degree of inprecision due to how D3 renders the paths\n        expect(renderedAngle).toBeCloseTo(angle);\n      });\n    });\n  });\n\n  describe(\"the `innerRadius` prop\", () => {\n    it(\"renders the slices as annular sections\", () => {\n      const { container } = render(<VictoryPie innerRadius={70} />);\n\n      const slices = container.querySelectorAll(\"path\");\n      slices.forEach((slice) => {\n        const commands = parseSvgPathCommands(slice.getAttribute(\"d\"));\n        const startOfInnerArc = {\n          x: commands[2].args[0],\n          y: commands[2].args[1],\n        };\n        const endOfInnerArc = {\n          x: commands[3].args[5],\n          y: commands[3].args[6],\n        };\n\n        expect(getDistanceFromOrigin(startOfInnerArc)).toBeCloseTo(\n          getDistanceFromOrigin(endOfInnerArc),\n        );\n      });\n    });\n\n    it(\"determines the distance in pixels between the origin & the inner edge of the sections\", () => {\n      const INNER_RADIUS = 70;\n      const { container } = render(<VictoryPie innerRadius={INNER_RADIUS} />);\n\n      const slices = container.querySelectorAll(\"path\");\n      slices.forEach((slice) => {\n        const commands = parseSvgPathCommands(slice.getAttribute(\"d\"));\n        const startOfInnerArc = {\n          x: commands[2].args[0],\n          y: commands[2].args[1],\n        };\n\n        const innerRadius = getDistanceFromOrigin(startOfInnerArc);\n\n        expect(innerRadius).toBeCloseTo(INNER_RADIUS);\n      });\n    });\n  });\n\n  describe(\"`startAngle` in conjunction with `endAngle`\", () => {\n    it(\"renders a portion of a chart from `startAngle` to `endAngle`\", () => {\n      const { container } = render(\n        <VictoryPie startAngle={-90} endAngle={90} />,\n      );\n\n      const slices = container.querySelectorAll(\"path\");\n      const firstSlice = slices[0];\n      const lastSlice = slices[slices.length - 1];\n      const arcStart = getSliceArcStart(firstSlice.getAttribute(\"d\"));\n      const arcEnd = getSliceArcEnd(lastSlice.getAttribute(\"d\"));\n\n      expect(getSvgCoordinatesAngleFromCartesianYAxis(arcStart)).toBeCloseTo(\n        270,\n      );\n      expect(getSvgCoordinatesAngleFromCartesianYAxis(arcEnd)).toBeCloseTo(90);\n    });\n  });\n\n  describe(\"the `width` prop\", () => {\n    it(\"determines the width of the containing viewBox\", () => {\n      const width = 200;\n      const { container } = render(<VictoryPie width={width} />);\n      const svg = container.querySelector(\"svg\");\n      expect(svg?.getAttribute(\"viewBox\")).toEqual(`0 0 ${width} 400`);\n    });\n  });\n\n  describe(\"the `height` prop\", () => {\n    it(\"determines the height of the containing viewBox\", () => {\n      const height = 200;\n      const { container } = render(<VictoryPie height={height} />);\n      const svg = container.querySelector(\"svg\");\n      expect(svg?.getAttribute(\"viewBox\")).toEqual(`0 0 400 ${height}`);\n    });\n  });\n\n  describe(\"the `colorScale` prop\", () => {\n    describe(\"if provided an array of CSS colors\", () => {\n      it(\"renders each slice with the next color in the array, reiterating through colors as necessary\", () => {\n        const data = Helpers.range(5);\n        const colorScale = [\"#fffff\", \"#eeeee\", \"#ddddd\"];\n        const { container } = render(\n          <VictoryPie data={data} colorScale={colorScale} />,\n        );\n\n        const slices = container.querySelectorAll(\"path\");\n        expect(slices).toHaveLength(5);\n        slices.forEach((slice, index) => {\n          expect(slice.getAttribute(\"style\")).toContain(\n            colorScale[index % colorScale.length],\n          );\n        });\n      });\n    });\n\n    describe(\"if provided a string\", () => {\n      describe(\"and the string is a valid victory color scale\", () => {\n        it(\"renders the chart using the given color scale\", () => {\n          const VALID_VICTORY_COLOR_SCALE_NAMES = [\n            \"grayscale\",\n            \"qualitative\",\n            \"heatmap\",\n            \"warm\",\n            \"cool\",\n            \"red\",\n            \"green\",\n            \"blue\",\n          ];\n\n          VALID_VICTORY_COLOR_SCALE_NAMES.map((colorScaleName) => {\n            const colorScale = Style.getColorScale(colorScaleName);\n            const data = Helpers.range(colorScale.length + 1);\n            const { container } = render(\n              <VictoryPie colorScale={colorScale} data={data} />,\n            );\n\n            Array.from(container.querySelectorAll(\"path\")).map(\n              (slice, index) => {\n                const expectedColorScheme =\n                  colorScale[index % colorScale.length];\n                expect(slice.getAttribute(\"style\")).toContain(\n                  expectedColorScheme,\n                );\n              },\n            );\n          });\n        });\n      });\n    });\n  });\n\n  describe(\"event handling\", () => {\n    const clickHandler = jest.fn();\n\n    beforeEach(() => {\n      clickHandler.mockReset();\n    });\n\n    it(\"attaches an event to the parent svg\", () => {\n      const { container } = render(\n        <VictoryPie\n          events={[\n            {\n              target: \"parent\",\n              eventHandlers: { onClick: clickHandler },\n            },\n          ]}\n        />,\n      );\n      const svg = container.querySelector(\"svg\");\n      fireEvent.click(svg!);\n      expect(clickHandler).toBeCalled();\n\n      const contextualArg = clickHandler.mock.calls[0][1];\n      // the first argument is the standard event object\n      expect(contextualArg.key).toEqual(\"pie-parent-parent\");\n    });\n\n    it(\"attaches an event to data\", () => {\n      const { container } = render(\n        <VictoryPie\n          events={[\n            {\n              target: \"data\",\n              eventHandlers: { onClick: clickHandler },\n            },\n          ]}\n        />,\n      );\n\n      const slices = container.querySelectorAll(\"path\");\n      slices.forEach((slice, index) => {\n        fireEvent.click(slice);\n\n        const contextualArg = clickHandler.mock.calls[index][1];\n        expect(contextualArg.key).toEqual(`pie-data-${index}`);\n      });\n    });\n\n    it(\"attaches an event to label\", () => {\n      render(\n        <VictoryPie\n          data={labeledData}\n          events={[\n            {\n              target: \"labels\",\n              eventHandlers: { onClick: clickHandler },\n            },\n          ]}\n        />,\n      );\n\n      labeledData.forEach((dataPoint, index) => {\n        const label = screen.getByText(dataPoint.x);\n        fireEvent.click(label);\n\n        const contextualArg = clickHandler.mock.calls[index][1];\n        expect(contextualArg.slice.data._y).toEqual(dataPoint.y);\n      });\n    });\n  });\n\n  describe(\"accessbility\", () => {\n    it(\"adds aria-label and tabIndex to Slice primitive\", () => {\n      const { container } = render(\n        <VictoryPie\n          data={labeledData}\n          dataComponent={\n            <Slice\n              ariaLabel={({ datum }) => `${datum.x}`}\n              tabIndex={({ index }) => Number(index) + 5}\n            />\n          }\n        />,\n      );\n\n      const slices = container.querySelectorAll(\"path\");\n\n      expect(slices).toHaveLength(labeledData.length);\n\n      slices.forEach((slice, index) => {\n        expect(slice.getAttribute(\"aria-label\")).toEqual(labeledData[index].x);\n        expect(slice.getAttribute(\"tabindex\")).toEqual(`${index + 5}`);\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-pie/src/victory-pie.tsx",
    "content": "import React from \"react\";\nimport {\n  addEvents,\n  Helpers,\n  Data,\n  LineSegment,\n  VictoryContainer,\n  VictoryLabel,\n  VictoryTheme,\n  UserProps,\n  EventPropTypeInterface,\n  NumberOrCallback,\n  SliceNumberOrCallback,\n  StringOrNumberOrCallback,\n  VictoryCommonProps,\n  VictoryMultiLabelableProps,\n  VictoryStyleInterface,\n  EventsMixinClass,\n  VictoryDatableProps,\n} from \"victory-core\";\nimport { getBaseProps } from \"./helper-methods\";\nimport {\n  Slice,\n  SliceProps,\n  VictorySliceTTargetType,\n  VictorySliceLabelPlacementType,\n  VictorySliceLabelPositionType,\n} from \"./slice\";\n\nexport interface VictoryPieProps\n  extends Omit<VictoryCommonProps, \"polar\">,\n    VictoryDatableProps,\n    VictoryMultiLabelableProps {\n  cornerRadius?: SliceNumberOrCallback<SliceProps, \"cornerRadius\">;\n  endAngle?: number;\n  events?: EventPropTypeInterface<\n    VictorySliceTTargetType,\n    StringOrNumberOrCallback | string[] | number[]\n  >[];\n  eventKey?: StringOrNumberOrCallback;\n  innerRadius?: NumberOrCallback;\n  labelIndicator?: boolean | React.ReactElement;\n  labelIndicatorInnerOffset?: number;\n  labelIndicatorOuterOffset?: number;\n  labelPlacement?:\n    | VictorySliceLabelPlacementType\n    | ((props: SliceProps) => VictorySliceLabelPlacementType);\n  labelPosition?:\n    | VictorySliceLabelPositionType\n    | ((props: SliceProps) => VictorySliceLabelPositionType);\n\n  labelIndicatorComponent?: React.ReactElement;\n  labelRadius?: number | ((props: SliceProps) => number);\n  padAngle?: NumberOrCallback;\n  radius?: NumberOrCallback;\n  startAngle?: number;\n  style?: VictoryStyleInterface;\n}\n\nconst fallbackProps = {\n  endAngle: 360,\n  height: 400,\n  innerRadius: 0,\n  cornerRadius: 0,\n  padAngle: 0,\n  padding: 30,\n  width: 400,\n  startAngle: 0,\n  colorScale: [\n    \"#ffffff\",\n    \"#f0f0f0\",\n    \"#d9d9d9\",\n    \"#bdbdbd\",\n    \"#969696\",\n    \"#737373\",\n    \"#525252\",\n    \"#252525\",\n    \"#000000\",\n  ],\n  labelPosition: \"centroid\",\n  labelIndicatorInnerOffset: 15,\n  labelIndicatorOuterOffset: 5,\n};\n\nconst datumHasXandY = (datum) => {\n  return !Helpers.isNil(datum._x) && !Helpers.isNil(datum._y);\n};\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface VictoryPieBase extends EventsMixinClass<VictoryPieProps> {}\n\nclass VictoryPieBase extends React.Component<VictoryPieProps> {\n  static animationWhitelist: (keyof VictoryPieProps)[] = [\n    \"data\",\n    \"endAngle\",\n    \"height\",\n    \"innerRadius\",\n    \"cornerRadius\",\n    \"padAngle\",\n    \"padding\",\n    \"colorScale\",\n    \"startAngle\",\n    \"style\",\n    \"width\",\n  ];\n\n  static displayName = \"VictoryPie\";\n\n  static role = \"pie\";\n\n  static defaultTransitions = {\n    onExit: {\n      duration: 500,\n      before: () => ({ _y: 0, label: \" \" }),\n    },\n    onEnter: {\n      duration: 500,\n      before: () => ({ _y: 0, label: \" \" }),\n      after: (datum) => ({\n        y_: datum._y,\n        label: datum.label,\n      }),\n    },\n  };\n\n  static defaultProps: VictoryPieProps = {\n    data: [\n      { x: \"A\", y: 1 },\n      { x: \"B\", y: 2 },\n      { x: \"C\", y: 3 },\n      { x: \"D\", y: 1 },\n      { x: \"E\", y: 2 },\n    ],\n    standalone: true,\n    dataComponent: <Slice />,\n    labelComponent: <VictoryLabel />,\n    containerComponent: <VictoryContainer />,\n    groupComponent: <g />,\n    sortOrder: \"ascending\",\n    theme: VictoryTheme.grayscale,\n  };\n\n  static getBaseProps(props: VictoryPieProps) {\n    return getBaseProps(props, fallbackProps);\n  }\n  static getData = Data.getData;\n  static expectedComponents: (keyof VictoryPieProps)[] = [\n    \"dataComponent\",\n    \"labelComponent\",\n    \"groupComponent\",\n    \"containerComponent\",\n    \"labelIndicatorComponent\",\n  ];\n\n  // Overridden in victory-native\n  shouldAnimate() {\n    return Boolean(this.props.animate);\n  }\n\n  renderComponents(props: VictoryPieProps, shouldRenderDatum = datumHasXandY) {\n    const {\n      dataComponent,\n      labelComponent,\n      groupComponent,\n      labelIndicator,\n      labelPosition,\n    } = props;\n\n    if (!groupComponent) {\n      throw new Error(\"VictoryPie expects a groupComponent prop\");\n    }\n\n    const showIndicator = labelIndicator && labelPosition === \"centroid\";\n\n    const children: React.ReactElement[] = [];\n\n    if (dataComponent) {\n      const dataComponents = this.dataKeys.reduce<React.ReactElement[]>(\n        (validDataComponents, _dataKey, index) => {\n          const dataProps = this.getComponentProps(\n            dataComponent,\n            \"data\",\n            index,\n          );\n          if (shouldRenderDatum((dataProps as any).datum)) {\n            validDataComponents.push(\n              React.cloneElement(dataComponent, dataProps),\n            );\n          }\n          return validDataComponents;\n        },\n        [],\n      );\n\n      children.push(...dataComponents);\n    }\n\n    if (labelComponent) {\n      const labelComponents = this.dataKeys\n        .map((_dataKey, index) => {\n          const labelProps = this.getComponentProps(\n            labelComponent,\n            \"labels\",\n            index,\n          );\n          if (\n            (labelProps as any).text !== undefined &&\n            (labelProps as any).text !== null\n          ) {\n            return React.cloneElement(labelComponent, labelProps);\n          }\n          return undefined;\n        })\n        .filter(\n          (comp: React.ReactElement | undefined): comp is React.ReactElement =>\n            comp !== undefined,\n        );\n\n      children.push(...labelComponents);\n    }\n\n    if (showIndicator && labelIndicator) {\n      let labelIndicatorComponent: React.ReactElement = <LineSegment />;\n\n      if (typeof labelIndicator === \"object\") {\n        // pass user provided react component\n        labelIndicatorComponent = labelIndicator;\n      }\n\n      const labelIndicatorComponents = this.dataKeys.map((_dataKey, index) => {\n        const labelIndicatorProps = this.getComponentProps(\n          labelIndicatorComponent,\n          \"labelIndicators\",\n          index,\n        );\n        return React.cloneElement(labelIndicatorComponent, labelIndicatorProps);\n      });\n\n      children.push(...labelIndicatorComponents);\n    }\n\n    return this.renderContainer(groupComponent, children);\n  }\n\n  render(): React.ReactElement {\n    const { animationWhitelist, role } = VictoryPie;\n    const props = Helpers.modifyProps(this.props, fallbackProps, role);\n\n    if (this.shouldAnimate()) {\n      return this.animateComponent(props, animationWhitelist);\n    }\n\n    const children = this.renderComponents(props);\n\n    const component = props.standalone\n      ? this.renderContainer(props.containerComponent, children)\n      : children;\n\n    return UserProps.withSafeUserProps(component, props);\n  }\n}\n\nexport const VictoryPie = addEvents(VictoryPieBase);\n"
  },
  {
    "path": "packages/victory-pie/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-pie/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-polar-axis/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-polar-axis/CHANGELOG.md",
    "content": "# victory-polar-axis\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n### Patch Changes\n\n- Remove deprecated babel-plugin-lodash plugin ([#2965](https://github.com/FormidableLabs/victory/pull/2965))\n\n* Improve types in victory-core helpers ([#2999](https://github.com/FormidableLabs/victory/pull/2999))\n\n## 37.3.2\n\n## 37.3.1\n\n### Patch Changes\n\n- Remove duplicate types from interfaces ([#2940](https://github.com/FormidableLabs/victory/pull/2940))\n\n## 37.3.0\n\n## 37.2.0\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n## 37.0.1\n\n### Patch Changes\n\n- Fix the signature of class static functions in components ([#2840](https://github.com/FormidableLabs/victory/pull/2840))\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n## 36.9.1\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n### Patch Changes\n\n- Migrate victory-native to TypeScript ([#2739](https://github.com/FormidableLabs/victory/pull/2739))\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n## 36.8.4\n\n## 36.8.3\n\n### Patch Changes\n\n- Refactor param reassignments ([#2724](https://github.com/FormidableLabs/victory/pull/2724))\n\n## 36.8.2\n\n### Patch Changes\n\n- Migrate polar axis to typescript ([#2713](https://github.com/FormidableLabs/victory/pull/2713))\n\n## 36.8.1\n\n## 36.8.0\n\n## 36.7.0\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-core@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n- Updated dependencies [[`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-core@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-core@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- Updated dependencies [[`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-core@36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Update source code with minor lint-based improvements (see [#2236](https://github.com/FormidableLabs/victory/issues/2236)). ([#2403](https://github.com/FormidableLabs/victory/pull/2403))\n\n- Updated dependencies [[`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-core@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-polar-axis/README.md",
    "content": "# VictoryPolarAxis\n\n`victory-polar-axis@^30.0.0` exports `VictoryPolarAxis`\n\nTo view documentation for `VictoryPolarAxis` please see https://commerce.nearform.com/open-source/victory/docs/victory-polar-axis\n\nTo suggest an addition or correction to this documentation please see https://github.com/FormidableLabs/victory/blob/main/docs/src/content/docs/victory-polar-axis.md\n"
  },
  {
    "path": "packages/victory-polar-axis/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-polar-axis/package.json",
    "content": "{\n  \"name\": \"victory-polar-axis\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Polar Axis Component for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"lodash\": \"^4.17.19\",\n    \"victory-core\": \"37.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:build\",\n        \"../victory-vendor:build\",\n        \"../victory-voronoi:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-polar-axis/src/helper-methods.ts",
    "content": "import defaults from \"lodash/defaults\";\nimport uniqBy from \"lodash/uniqBy\";\nimport { Helpers, LabelHelpers, Scale, Axis } from \"victory-core\";\nimport { VictoryPolarAxisProps } from \"./types\";\n\nconst getPosition = (r: number, angle: number, axis?: string) => {\n  return axis === \"x\" ? r * Math.cos(angle) : -r * Math.sin(angle);\n};\n\nconst getAxisType = (props: VictoryPolarAxisProps) => {\n  const typicalType = props.dependentAxis ? \"radial\" : \"angular\";\n  const invertedType = typicalType === \"angular\" ? \"radial\" : \"angular\";\n  return props.horizontal ? invertedType : typicalType;\n};\n\nconst filterTicks = (ticks, scale) => {\n  const compareTicks = (t) => scale(t) % (2 * Math.PI);\n  return uniqBy(ticks, compareTicks);\n};\n\nconst getEvaluatedStyles = (style, props) => {\n  return {\n    tickStyle: Helpers.evaluateStyle(style.ticks, props),\n    labelStyle: Helpers.evaluateStyle(style.tickLabels, props),\n    gridStyle: Helpers.evaluateStyle(style.grid, props),\n  };\n};\n\nconst getStyleObject = (props: VictoryPolarAxisProps) => {\n  const { theme = {}, dependentAxis } = props;\n  const generalAxisStyle =\n    (theme.polarAxis && theme.polarAxis.style) ||\n    (theme.axis && theme.axis.style);\n  const polarAxisType = dependentAxis\n    ? \"polarDependentAxis\"\n    : \"polarIndependentAxis\";\n  const standardAxisType = dependentAxis ? \"dependentAxis\" : \"independentAxis\";\n  const specificAxisStyle =\n    theme?.[polarAxisType]?.style || theme?.[standardAxisType]?.style;\n\n  const mergeStyles = () => {\n    const styleNamespaces = [\n      \"axis\",\n      \"axisLabel\",\n      \"grid\",\n      \"parent\",\n      \"tickLabels\",\n      \"ticks\",\n    ];\n    return styleNamespaces.reduce((memo, curr) => {\n      memo[curr] = defaults(\n        {},\n        specificAxisStyle?.[curr],\n        generalAxisStyle?.[curr],\n      );\n      return memo;\n    }, {});\n  };\n\n  return generalAxisStyle && specificAxisStyle\n    ? mergeStyles()\n    : specificAxisStyle || generalAxisStyle;\n};\n\nconst getRadius = (props: VictoryPolarAxisProps) => {\n  const { left, right, top, bottom } = Helpers.getPadding(props.padding);\n  const { width, height } = props;\n\n  if (width === undefined || height === undefined) {\n    throw new Error(\n      \"VictoryPolarAxis: width and height properties are required for standalone axes.\",\n    );\n  }\n\n  return Math.min(width - left - right, height - top - bottom) / 2;\n};\n\nconst getRange = (props: VictoryPolarAxisProps, axis) => {\n  // Return the range from props if one is given.\n  if (props.range && props.range[axis]) {\n    return props.range[axis];\n  } else if (props.range && Array.isArray(props.range)) {\n    return props.range;\n  }\n  const axisType = getAxisType(props);\n  if (axisType === \"angular\") {\n    const startAngle = Helpers.degreesToRadians(props.startAngle);\n    const endAngle = Helpers.degreesToRadians(props.endAngle);\n    return [startAngle, endAngle];\n  }\n  const radius = getRadius(props);\n  return [props.innerRadius || 0, radius];\n};\n\nexport const getScale = (props: VictoryPolarAxisProps) => {\n  const axis = Axis.getAxis(props);\n  const scale = Scale.getBaseScale(props, axis);\n  const domain = Axis.getDomain(props, axis) || scale.domain();\n  const range = getRange(props, axis);\n  scale.range(range);\n  scale.domain(domain);\n  return scale;\n};\n\nexport const getStyles = (\n  props: VictoryPolarAxisProps,\n  styleObject: VictoryPolarAxisProps[\"style\"] = {},\n) => {\n  if (props.disableInlineStyles) {\n    return {};\n  }\n  const style = props.style || {};\n  const parentStyleProps = { height: \"auto\", width: \"100%\" };\n  return {\n    parent: defaults(parentStyleProps, style.parent, styleObject.parent),\n    axis: defaults({}, style.axis, styleObject.axis),\n    axisLabel: defaults({}, style.axisLabel, styleObject.axisLabel),\n    grid: defaults({}, style.grid, styleObject.grid),\n    ticks: defaults({}, style.ticks, styleObject.ticks),\n    tickLabels: defaults({}, style.tickLabels, styleObject.tickLabels),\n  };\n};\n\nconst getAxisAngle = (props: {\n  axisAngle?: number;\n  dependentAxis?: boolean;\n  startAngle?: number;\n}) => {\n  const { axisAngle, startAngle, dependentAxis } = props;\n  const axis = Axis.getAxis(props);\n  const axisValue = Axis.getAxisValue(props, axis);\n  if (axisValue === undefined || !dependentAxis) {\n    return axisAngle === undefined ? startAngle : axisAngle;\n  }\n  return Helpers.radiansToDegrees(axisValue);\n};\n\nconst getTickProps = (\n  props: VictoryPolarAxisProps,\n  calculatedValues: {\n    axisType: string;\n    radius: number;\n    scale: any;\n    style: any;\n    stringTicks: any;\n    ticks: any;\n    tickFormat: any;\n    origin: { x: number; y: number };\n  },\n  tickValue,\n  index,\n  // eslint-disable-next-line max-params\n) => {\n  const {\n    axisType,\n    radius,\n    scale,\n    style,\n    stringTicks,\n    ticks,\n    tickFormat,\n    origin,\n  } = calculatedValues;\n  const text = tickFormat(tickValue, index, ticks);\n  const tick = stringTicks ? stringTicks[index] : tickValue;\n  const { tickStyle } = getEvaluatedStyles(style, {\n    tick,\n    tickValue,\n    index,\n    ticks,\n    stringTicks,\n    radius,\n    scale,\n    axisType,\n    text,\n  });\n  const axisAngle = axisType === \"radial\" ? getAxisAngle(props) : undefined;\n  const tickPadding = tickStyle.padding || tickStyle.size || 0;\n  const padAngle = Helpers.degreesToRadians(90 - axisAngle);\n  const tickAngle =\n    axisType === \"angular\"\n      ? scale(tickValue)\n      : Helpers.degreesToRadians(-1 * axisAngle);\n  const tickRadius = axisType === \"angular\" ? radius : scale(tickValue);\n\n  return axisType === \"angular\"\n    ? {\n        index,\n        datum: tick,\n        style: tickStyle,\n        x1: getPosition(tickRadius, tickAngle, \"x\") + origin.x,\n        y1: getPosition(tickRadius, tickAngle, \"y\") + origin.y,\n        x2: getPosition(tickRadius + tickPadding, tickAngle, \"x\") + origin.x,\n        y2: getPosition(tickRadius + tickPadding, tickAngle, \"y\") + origin.y,\n      }\n    : {\n        index,\n        datum: tick,\n        style: tickStyle,\n        x1:\n          tickRadius * Math.cos(tickAngle) +\n          Math.cos(padAngle) * tickPadding +\n          origin.x,\n        x2:\n          tickRadius * Math.cos(tickAngle) -\n          Math.cos(padAngle) * tickPadding +\n          origin.x,\n        y1:\n          tickRadius * Math.sin(tickAngle) +\n          Math.sin(padAngle) * tickPadding +\n          origin.y,\n        y2:\n          tickRadius * Math.sin(tickAngle) -\n          Math.sin(padAngle) * tickPadding +\n          origin.y,\n      };\n};\n\nconst getTickLabelProps = (\n  props: VictoryPolarAxisProps,\n  calculatedValues: {\n    axisType: string;\n    radius: number;\n    tickFormat: any;\n    style: any;\n    scale: any;\n    ticks: any;\n    stringTicks: any;\n    origin: { x: number; y: number };\n  },\n  tickValue,\n  index,\n  // eslint-disable-next-line max-params\n) => {\n  const {\n    axisType,\n    radius,\n    tickFormat,\n    style,\n    scale,\n    ticks,\n    stringTicks,\n    origin,\n  } = calculatedValues;\n  const text = tickFormat(tickValue, index, ticks);\n  const tick = stringTicks ? stringTicks[index] : tickValue;\n  const { labelStyle } = getEvaluatedStyles(style, {\n    text,\n    tick,\n    tickValue,\n    index,\n    ticks,\n    stringTicks,\n    radius,\n    scale,\n    axisType,\n  });\n  const { tickLabelComponent } = props;\n  const labelPlacement = tickLabelComponent?.props.labelPlacement\n    ? tickLabelComponent.props.labelPlacement\n    : props.labelPlacement;\n  const tickPadding = labelStyle.padding || 0;\n  const angularPadding = 0; // TODO: do some geometry\n  const axisAngle = axisType === \"radial\" ? getAxisAngle(props) : undefined;\n  const labelAngle =\n    axisType === \"angular\"\n      ? Helpers.radiansToDegrees(scale(tickValue))\n      : axisAngle + angularPadding;\n  const textAngle =\n    labelStyle.angle === undefined\n      ? LabelHelpers.getPolarAngle(\n          Object.assign({}, props, { labelPlacement }),\n          labelAngle,\n        )\n      : labelStyle.angle;\n  const labelRadius =\n    axisType === \"angular\" ? radius + tickPadding : scale(tickValue);\n  const textAnchor =\n    labelStyle.textAnchor ||\n    LabelHelpers.getPolarTextAnchor(\n      Object.assign({}, props, { labelPlacement }),\n      labelAngle,\n    );\n  return {\n    index,\n    datum: tick,\n    style: labelStyle,\n    angle: textAngle,\n    textAnchor,\n    text,\n    x: labelRadius * Math.cos(Helpers.degreesToRadians(labelAngle)) + origin.x,\n    y: -labelRadius * Math.sin(Helpers.degreesToRadians(labelAngle)) + origin.y,\n  };\n};\n\nconst getGridProps = (\n  props: VictoryPolarAxisProps,\n  calculatedValues: {\n    axisType: string;\n    radius: number;\n    style: any;\n    scale: any;\n    stringTicks: any;\n    ticks: any;\n    tickFormat: any;\n    origin: { x: number; y: number };\n  },\n  tickValue,\n  index,\n  // eslint-disable-next-line max-params\n) => {\n  const {\n    axisType,\n    radius,\n    style,\n    scale,\n    stringTicks,\n    ticks,\n    tickFormat,\n    origin,\n  } = calculatedValues;\n  const text = tickFormat(tickValue, index, ticks);\n  const { startAngle, endAngle, innerRadius = 0 } = props;\n  const tick = stringTicks ? stringTicks[index] : tickValue;\n  const { gridStyle } = getEvaluatedStyles(style, {\n    tick,\n    tickValue,\n    index,\n    ticks,\n    stringTicks,\n    radius,\n    scale,\n    axisType,\n    text,\n  });\n  const angle = scale(tickValue);\n  return axisType === \"angular\"\n    ? {\n        index,\n        datum: tick,\n        style: gridStyle,\n        x1: getPosition(radius, angle, \"x\") + origin.x,\n        y1: getPosition(radius, angle, \"y\") + origin.y,\n        x2: getPosition(innerRadius, angle, \"x\") + origin.x,\n        y2: getPosition(innerRadius, angle, \"y\") + origin.y,\n      }\n    : {\n        style: gridStyle,\n        index,\n        datum: tick,\n        cx: origin.x,\n        cy: origin.y,\n        r: scale(tickValue),\n        startAngle,\n        endAngle,\n      };\n};\n\nconst getAxisLabelProps = (\n  props: VictoryPolarAxisProps,\n  calculatedValues: {\n    axisType: string;\n    radius: number;\n    style: any;\n    origin: { x: number; y: number };\n  },\n) => {\n  const { axisType, radius, style, origin } = calculatedValues;\n  const { axisLabelComponent } = props;\n  if (axisType !== \"radial\") {\n    return {};\n  }\n  const labelPlacement = axisLabelComponent?.props.labelPlacement\n    ? axisLabelComponent.props.labelPlacement\n    : props.labelPlacement;\n  const labelStyle = (style && style.axisLabel) || {};\n  const axisAngle = axisType === \"radial\" ? getAxisAngle(props) : undefined;\n  const textAngle =\n    labelStyle.angle === undefined\n      ? LabelHelpers.getPolarAngle(\n          Object.assign({}, props, { labelPlacement }),\n          axisAngle,\n        )\n      : labelStyle.angle;\n  const labelRadius = radius + (labelStyle.padding || 0);\n  const textAnchor =\n    labelStyle.textAnchor ||\n    LabelHelpers.getPolarTextAnchor(\n      Object.assign({}, props, { labelPlacement }),\n      axisAngle,\n    );\n  const verticalAnchor =\n    labelStyle.verticalAnchor ||\n    LabelHelpers.getPolarVerticalAnchor(\n      Object.assign({}, props, { labelPlacement }),\n      axisAngle,\n    );\n  return {\n    style: labelStyle,\n    angle: textAngle,\n    textAnchor,\n    verticalAnchor,\n    text: props.label,\n    x:\n      getPosition(labelRadius, Helpers.degreesToRadians(axisAngle), \"x\") +\n      origin.x,\n    y:\n      getPosition(labelRadius, Helpers.degreesToRadians(axisAngle), \"y\") +\n      origin.y,\n  };\n};\n\nconst getAxisProps = (modifiedProps, calculatedValues) => {\n  const { style, axisType, radius, origin } = calculatedValues;\n  const { startAngle, endAngle, innerRadius = 0 } = modifiedProps;\n  const axisAngle =\n    axisType === \"radial\"\n      ? Helpers.degreesToRadians(getAxisAngle(modifiedProps))\n      : undefined;\n  return axisType === \"radial\"\n    ? {\n        style: style.axis,\n        x1: getPosition(innerRadius, axisAngle, \"x\") + origin.x,\n        x2: getPosition(radius, axisAngle, \"x\") + origin.x,\n        y1: getPosition(innerRadius, axisAngle, \"y\") + origin.y,\n        y2: getPosition(radius, axisAngle, \"y\") + origin.y,\n      }\n    : {\n        style: style.axis,\n        cx: origin.x,\n        cy: origin.y,\n        r: radius,\n        startAngle,\n        endAngle,\n      };\n};\n\nconst getCalculatedValues = (initialProps: VictoryPolarAxisProps) => {\n  const props = Object.assign({ polar: true }, initialProps);\n  const defaultStyles = getStyleObject(props);\n  const style = getStyles(props, defaultStyles);\n  const padding = Helpers.getPadding(props.padding);\n  const axis = Axis.getAxis(props);\n  const axisType = getAxisType(props);\n  const stringTicks = Axis.stringTicks(props) ? props.tickValues : undefined;\n  const domain = Axis.getDomain(props, axis);\n  const range = getRange(props, axis);\n  const scale = getScale(props);\n  const initialTicks = Axis.getTicks(props, scale);\n  const ticks =\n    axisType === \"angular\" ? filterTicks(initialTicks, scale) : initialTicks;\n  const tickFormat = Axis.getTickFormat(props, scale);\n  const radius = getRadius(props);\n\n  // @ts-expect-error props is not typed but contains width and height\n  const origin = Helpers.getPolarOrigin(props);\n\n  return {\n    axis,\n    style,\n    padding,\n    stringTicks,\n    axisType,\n    scale,\n    ticks,\n    tickFormat,\n    domain,\n    range,\n    radius,\n    origin,\n  };\n};\n\nexport const getBaseProps = (\n  initialProps: VictoryPolarAxisProps,\n  fallbackProps,\n) => {\n  const props = Axis.modifyProps(initialProps, fallbackProps);\n  const calculatedValues = getCalculatedValues(props);\n  const { style, scale, ticks, domain } = calculatedValues;\n  const { width, height, standalone, theme, name } = props;\n  const axisProps = getAxisProps(props, calculatedValues);\n  const axisLabelProps = getAxisLabelProps(props, calculatedValues);\n  const initialChildProps = {\n    parent: {\n      style: style.parent,\n      ticks,\n      scale,\n      width,\n      height,\n      domain,\n      standalone,\n      theme,\n      name,\n    },\n  };\n\n  return ticks.reduce((childProps, tick, index) => {\n    childProps[index] = {\n      axis: axisProps,\n      axisLabel: axisLabelProps,\n      ticks: getTickProps(props, calculatedValues, tick, index),\n      tickLabels: getTickLabelProps(props, calculatedValues, tick, index),\n      grid: getGridProps(props, calculatedValues, tick, index),\n    };\n\n    return childProps;\n  }, initialChildProps);\n};\n"
  },
  {
    "path": "packages/victory-polar-axis/src/index.ts",
    "content": "export * from \"./types\";\nexport * from \"./victory-polar-axis\";\n"
  },
  {
    "path": "packages/victory-polar-axis/src/types.ts",
    "content": "import React from \"react\";\n\nimport {\n  EventPropTypeInterface,\n  LabelOrientationType,\n  VictoryAxisCommonProps,\n  VictoryCommonProps,\n  VictorySingleLabelableProps,\n} from \"victory-core\";\n\nexport type VictoryPolarAxisTTargetType =\n  | \"axis\"\n  | \"axisLabel\"\n  | \"grid\"\n  | \"ticks\"\n  | \"tickLabels\";\n\nexport interface VictoryPolarAxisProps\n  extends VictoryAxisCommonProps,\n    VictoryCommonProps,\n    VictorySingleLabelableProps {\n  axisAngle?: number;\n  circularAxisComponent?: React.ReactElement;\n  circularGridComponent?: React.ReactElement;\n  endAngle?: number;\n  events?: EventPropTypeInterface<\n    VictoryPolarAxisTTargetType,\n    string | number\n  >[];\n  innerRadius?: number;\n  labelOrientation?: LabelOrientationType;\n  labelPlacement?: LabelOrientationType;\n  startAngle?: number;\n}\n"
  },
  {
    "path": "packages/victory-polar-axis/src/victory-polar-axis.tsx",
    "content": "import React from \"react\";\nimport isEmpty from \"lodash/isEmpty\";\nimport {\n  VictoryLabel,\n  VictoryContainer,\n  VictoryTheme,\n  LineSegment,\n  addEvents,\n  Arc,\n  Axis,\n  EventsMixinClass,\n} from \"victory-core\";\nimport { getScale, getStyles, getBaseProps } from \"./helper-methods\";\nimport { VictoryPolarAxisProps } from \"./types\";\n\nconst fallbackProps: Partial<VictoryPolarAxisProps> = {\n  width: 450,\n  height: 300,\n  padding: 50,\n};\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface VictoryPolarAxisBase\n  extends EventsMixinClass<VictoryPolarAxisProps> {}\n\nclass VictoryPolarAxisBase extends React.Component<VictoryPolarAxisProps> {\n  static animationWhitelist = [\n    \"style\",\n    \"domain\",\n    \"range\",\n    \"tickCount\",\n    \"tickValues\",\n    \"padding\",\n    \"width\",\n    \"height\",\n  ];\n\n  static displayName = \"VictoryAxis\";\n\n  static role = \"axis\";\n\n  static defaultTransitions = {\n    onExit: {\n      duration: 500,\n    },\n    onEnter: {\n      duration: 500,\n    },\n  };\n\n  static defaultProps: VictoryPolarAxisProps = {\n    axisComponent: <LineSegment />,\n    axisLabelComponent: <VictoryLabel />,\n    circularAxisComponent: <Arc />,\n    circularGridComponent: <Arc />,\n    containerComponent: <VictoryContainer />,\n    endAngle: 360,\n    gridComponent: <LineSegment />,\n    groupComponent: <g role=\"presentation\" />,\n    labelPlacement: \"parallel\",\n    startAngle: 0,\n    standalone: true,\n    theme: VictoryTheme.grayscale,\n    tickComponent: <LineSegment />,\n    tickLabelComponent: <VictoryLabel />,\n  };\n\n  static getDomain = Axis.getDomain;\n  static getAxis = Axis.getAxis;\n  static getScale(props) {\n    return getScale(props);\n  }\n  static getStyles(props) {\n    return getStyles(props, fallbackProps.style);\n  }\n  static getBaseProps(props) {\n    return getBaseProps(props, fallbackProps);\n  }\n  static expectedComponents = [\n    \"axisComponent\",\n    \"circularAxisComponent\",\n    \"groupComponent\",\n    \"containerComponent\",\n    \"tickComponent\",\n    \"tickLabelComponent\",\n    \"gridComponent\",\n    \"circularGridComponent\",\n  ];\n\n  renderAxisLine(props: VictoryPolarAxisProps) {\n    const { dependentAxis } = props;\n    const axisComponent = dependentAxis\n      ? props.axisComponent\n      : props.circularAxisComponent;\n    const axisProps = this.getComponentProps(axisComponent, \"axis\", 0);\n    return React.cloneElement(axisComponent!, axisProps);\n  }\n\n  renderLabel(props: VictoryPolarAxisProps) {\n    const { axisLabelComponent, dependentAxis, label } = props;\n    if (!label || !dependentAxis) {\n      return null;\n    }\n    const axisLabelProps = this.getComponentProps(\n      axisLabelComponent,\n      \"axisLabel\",\n      0,\n    );\n    return React.cloneElement(axisLabelComponent!, axisLabelProps);\n  }\n\n  renderAxis(props: VictoryPolarAxisProps) {\n    const { tickComponent, tickLabelComponent, name } = props;\n    const shouldRender = (componentProps) => {\n      const { style = {}, events = {} } = componentProps;\n      const visible =\n        style.stroke !== \"transparent\" &&\n        style.stroke !== \"none\" &&\n        style.strokeWidth !== 0;\n      return visible || !isEmpty(events);\n    };\n    const axisType = props.dependentAxis ? \"radial\" : \"angular\";\n    const gridComponent =\n      axisType === \"radial\" ? props.circularGridComponent : props.gridComponent;\n    const tickComponents = this.dataKeys\n      .map((key, index) => {\n        const tickProps = Object.assign(\n          { key: `${name}-tick-${key}` },\n          this.getComponentProps(tickComponent, \"ticks\", index),\n        );\n        const TickComponent = React.cloneElement(tickComponent!, tickProps);\n        return shouldRender(TickComponent.props) ? TickComponent : undefined;\n      })\n      .filter(Boolean);\n\n    const gridComponents = this.dataKeys\n      .map((key, index) => {\n        const gridProps = Object.assign(\n          { key: `${name}-grid-${key}` },\n          this.getComponentProps(gridComponent, \"grid\", index),\n        );\n        const GridComponent = React.cloneElement(gridComponent!, gridProps);\n        return shouldRender(GridComponent.props) ? GridComponent : undefined;\n      })\n      .filter(Boolean);\n\n    const tickLabelComponents = this.dataKeys.map((key, index) => {\n      const tickLabelProps = Object.assign(\n        { key: `${name}-tick-${key}` },\n        this.getComponentProps(tickLabelComponent, \"tickLabels\", index),\n      );\n      return React.cloneElement(tickLabelComponent!, tickLabelProps);\n    });\n    const axis = this.renderAxisLine(props);\n    const axisLabel = this.renderLabel(props);\n    const children = [\n      axis,\n      axisLabel,\n      ...tickComponents,\n      ...gridComponents,\n      ...tickLabelComponents,\n    ];\n    return this.renderGroup(props, children);\n  }\n\n  // Overridden in victory-native\n  renderGroup(props: VictoryPolarAxisProps, children: React.ReactNode) {\n    const { groupComponent } = props;\n    return React.cloneElement(groupComponent!, {}, children);\n  }\n\n  shouldAnimate() {\n    return !!this.props.animate;\n  }\n\n  render(): React.ReactElement {\n    const { animationWhitelist } = VictoryPolarAxis;\n    const props = Axis.modifyProps(this.props, fallbackProps);\n\n    if (this.shouldAnimate()) {\n      return this.animateComponent(props, animationWhitelist);\n    }\n    const children = this.renderAxis(props);\n    return props.standalone\n      ? this.renderContainer(props.containerComponent, children)\n      : children;\n  }\n}\n\nconst options = {\n  components: [\n    { name: \"axis\", index: 0 },\n    { name: \"axisLabel\", index: 0 },\n    { name: \"grid\" },\n    { name: \"parent\", index: \"parent\" },\n    { name: \"ticks\" },\n    { name: \"tickLabels\" },\n  ],\n};\n\nexport const VictoryPolarAxis = addEvents(VictoryPolarAxisBase, options);\n"
  },
  {
    "path": "packages/victory-polar-axis/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-polar-axis/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-scatter/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-scatter/CHANGELOG.md",
    "content": "# victory-scatter\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n### Patch Changes\n\n- Improve types in victory-core helpers ([#2999](https://github.com/FormidableLabs/victory/pull/2999))\n\n## 37.3.2\n\n## 37.3.1\n\n## 37.3.0\n\n## 37.2.0\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n## 37.0.1\n\n### Patch Changes\n\n- Fix the signature of class static functions in components ([#2840](https://github.com/FormidableLabs/victory/pull/2840))\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n### Patch Changes\n\n- Replace lodash array utils with native code ([#2810](https://github.com/FormidableLabs/victory/pull/2810))\n\n* Replace lodash values and mapValues with native code ([#2808](https://github.com/FormidableLabs/victory/pull/2808))\n\n- Replace lodash isNil and isNan with native code ([#2800](https://github.com/FormidableLabs/victory/pull/2800))\n\n* Replace lodash isFunction with native code ([#2802](https://github.com/FormidableLabs/victory/pull/2802))\n\n## 36.9.1\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n### Patch Changes\n\n- Migrate victory-native to TypeScript ([#2739](https://github.com/FormidableLabs/victory/pull/2739))\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n* Replace instances of lodash.range with equivalent native code ([#2760](https://github.com/FormidableLabs/victory/pull/2760))\n\n## 36.8.4\n\n## 36.8.3\n\n## 36.8.2\n\n## 36.8.1\n\n## 36.8.0\n\n## 36.7.0\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-core@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n- Updated dependencies [[`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-core@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-core@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- - Removed Template Literal Types to increase TS compatibility (fixes [#2418](https://github.com/FormidableLabs/victory/issues/2418)) ([#2420](https://github.com/FormidableLabs/victory/pull/2420))\n  - Improved type for `VictoryLabelProps[\"textAnchor\"]` (fixes [#2361](https://github.com/FormidableLabs/victory/issues/2361))\n  - Fixed exported types for `VictoryAxis`, `VictoryBoxPlot`, `VictoryErrorBar`, and `VictoryScatter` (fixes [#2411](https://github.com/FormidableLabs/victory/issues/2411))\n  - Migrate `victory-cursor-container` to TS (fixes [#2402](https://github.com/FormidableLabs/victory/issues/2402))\n- Updated dependencies [[`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-core@36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Update source code with minor lint-based improvements (see [#2236](https://github.com/FormidableLabs/victory/issues/2236)). ([#2403](https://github.com/FormidableLabs/victory/pull/2403))\n\n- Updated dependencies [[`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-core@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-scatter/README.md",
    "content": "# VictoryScatter\n\n`victory-scatter@^30.0.0` exports `VictoryScatter`\n\nTo view documentation for `VictoryScatter` please see https://commerce.nearform.com/open-source/victory/docs/victory-scatter\n\nTo suggest an addition or correction to this documentation please see https://github.com/FormidableLabs/victory/blob/main/docs/src/content/docs/victory-scatter.md\n"
  },
  {
    "path": "packages/victory-scatter/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-scatter/package.json",
    "content": "{\n  \"name\": \"victory-scatter\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Scatter Component for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"lodash\": \"^4.17.19\",\n    \"victory-core\": \"37.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:build\",\n        \"../victory-vendor:build\",\n        \"../victory-voronoi:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-scatter/src/helper-methods.test.tsx",
    "content": "import * as Helpers from \"./helper-methods\";\n\ndescribe(\"victory-scatter/helper-methods\", () => {\n  describe(\"getSize\", () => {\n    beforeEach(() => {\n      jest.spyOn(Helpers, \"getBubbleSize\");\n    });\n\n    afterEach(() => {\n      jest.clearAllMocks();\n    });\n\n    const data = [\n      { x: 1, y: 2, z: 1, t: 4 },\n      { x: 2, y: 3, z: 1, t: 2 },\n    ];\n    const datum = data[0];\n    it(\"returns a size attribute from data\", () => {\n      const point = { size: 3, ...datum };\n      const sizeResult = Helpers.getSize(point, {});\n      expect(Helpers.getBubbleSize).not.toHaveBeenCalled();\n      expect(sizeResult).toEqual(3);\n    });\n\n    it(\"returns 1 if the size attribute is less than one\", () => {\n      const point = { size: -2, ...datum };\n      const sizeResult = Helpers.getSize(point, {});\n      expect(Helpers.getBubbleSize).not.toHaveBeenCalled();\n      expect(sizeResult).toEqual(1);\n    });\n\n    it(\"returns size from props, if no size is set on data\", () => {\n      const sizeResult = Helpers.getSize(datum, { data, size: 2 });\n      expect(Helpers.getBubbleSize).not.toHaveBeenCalled();\n      expect(sizeResult).toEqual(2);\n    });\n\n    it(\"calculates a bubbleSize if a bubbleProperty is specified, and size is not set\", () => {\n      const sizeResult = Helpers.getSize(datum, { data, z: \"t\" });\n      expect(sizeResult).toEqual(5);\n    });\n  });\n\n  describe(\"getBubbleSize\", () => {\n    it(\"determines the size of a point\", () => {\n      const data = [\n        { x: 1, y: 2, z: 5 },\n        { x: 2, y: 3, z: 1 },\n      ];\n      const props = { data, z: \"z\" };\n      const sizeResult = Helpers.getBubbleSize(data[0], props);\n      expect(sizeResult).toEqual(5);\n    });\n  });\n\n  describe(\"getSymbol\", () => {\n    const data = { symbol: \"star\" };\n    const props = { symbol: \"plus\" };\n    it(\"returns 'circle' for bubble plots\", () => {\n      const symbolResult = Helpers.getSymbol(\n        {},\n        { ...props, bubbleProperty: \"z\" },\n      );\n      expect(symbolResult).toEqual(\"circle\");\n    });\n\n    it(\"returns a symbol from data if one is given\", () => {\n      const symbolResult = Helpers.getSymbol(data, props);\n      expect(symbolResult).toEqual(\"star\");\n    });\n\n    it(\"returns a symbol from props if no symbol is found on data\", () => {\n      const symbolResult = Helpers.getSymbol({}, props);\n      expect(symbolResult).toEqual(\"plus\");\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-scatter/src/helper-methods.tsx",
    "content": "import { Helpers, LabelHelpers, Data, Domain, Scale } from \"victory-core\";\n\nexport const getSymbol = (data, props) => {\n  if (props.bubbleProperty) {\n    return \"circle\";\n  }\n  return data.symbol || props.symbol;\n};\n\nexport const getBubbleSize = (datum, props) => {\n  const { data, z, maxBubbleSize, minBubbleSize } = props;\n  const zData = data.map((point) => point[z]);\n  const zMin = Math.min(...zData);\n  const zMax = Math.max(...zData);\n  const getMaxRadius = () => {\n    const minPadding = Math.min(\n      ...Object.values(Helpers.getPadding(props.padding)),\n    );\n    return Math.max(minPadding, 5); // eslint-disable-line no-magic-numbers\n  };\n  const maxRadius = maxBubbleSize || getMaxRadius();\n  const minRadius = minBubbleSize || maxRadius * 0.1; // eslint-disable-line no-magic-numbers\n  if (zMax === zMin) {\n    return Math.max(minRadius, 1);\n  }\n  const maxArea = Math.PI * Math.pow(maxRadius, 2);\n  const minArea = Math.PI * Math.pow(minRadius, 2);\n  const pointArea = ((datum[z] - zMin) / (zMax - zMin)) * maxArea;\n  const area = Math.max(pointArea, minArea);\n  const radius = Math.sqrt(area / Math.PI);\n  return Math.max(radius, 1);\n};\n\nexport const getSize = (datum, props) => {\n  const { size, z } = props;\n  if (datum.size) {\n    return typeof datum.size === \"function\"\n      ? datum.size\n      : Math.max(datum.size, 1);\n  } else if (typeof props.size === \"function\") {\n    return size;\n  } else if (datum[z]) {\n    return getBubbleSize(datum, props);\n  }\n  return Math.max(size || 0, 1);\n};\n\nconst getCalculatedValues = (props) => {\n  const defaultStyles = Helpers.getDefaultStyles(props, \"scatter\");\n  const style = Helpers.getStyles(props.style, defaultStyles);\n  const range = {\n    x: Helpers.getRange(props, \"x\"),\n    y: Helpers.getRange(props, \"y\"),\n  };\n  const domain = {\n    x: Domain.getDomain(props, \"x\"),\n    y: Domain.getDomain(props, \"y\"),\n  };\n  const scale = {\n    x: Scale.getBaseScale(props, \"x\")\n      .domain(domain.x)\n      .range(props.horizontal ? range.y : range.x),\n    y: Scale.getBaseScale(props, \"y\")\n      .domain(domain.y)\n      .range(props.horizontal ? range.x : range.y),\n  };\n  const origin = props.polar\n    ? props.origin || Helpers.getPolarOrigin(props)\n    : undefined;\n  const z = props.bubbleProperty || \"z\";\n\n  let data = Data.getData(props);\n  data = Data.formatDataFromDomain(data, domain);\n\n  return { domain, data, scale, style, origin, z };\n};\n\nexport const getBaseProps = (initialProps, fallbackProps) => {\n  const modifiedProps = Helpers.modifyProps(\n    initialProps,\n    fallbackProps,\n    \"scatter\",\n  );\n  const props = Object.assign(\n    {},\n    modifiedProps,\n    getCalculatedValues(modifiedProps),\n  );\n  const {\n    data,\n    domain,\n    events,\n    height,\n    origin,\n    padding,\n    polar,\n    scale,\n    name,\n    sharedEvents,\n    standalone,\n    style,\n    theme,\n    width,\n    labels,\n    horizontal,\n    disableInlineStyles,\n  } = props;\n  const initialChildProps = {\n    parent: {\n      style: style.parent,\n      scale,\n      domain,\n      data,\n      height,\n      width,\n      standalone,\n      theme,\n      origin,\n      polar,\n      padding,\n      name,\n      horizontal,\n    },\n  };\n\n  return data.reduce((childProps, datum, index) => {\n    const eventKey = !Helpers.isNil(datum.eventKey) ? datum.eventKey : index;\n    const { x, y } = Helpers.scalePoint(props, datum);\n    const dataProps = {\n      x,\n      y,\n      datum,\n      data,\n      index,\n      scale,\n      polar,\n      origin,\n      horizontal,\n      size: getSize(datum, props),\n      symbol: getSymbol(datum, props),\n      style: disableInlineStyles ? {} : style.data,\n      disableInlineStyles,\n    };\n\n    childProps[eventKey] = { data: dataProps };\n    const text = LabelHelpers.getText(props, datum, index);\n    if (\n      (text !== undefined && text !== null) ||\n      (labels && (events || sharedEvents))\n    ) {\n      childProps[eventKey].labels = LabelHelpers.getProps(props, index);\n    }\n\n    return childProps;\n  }, initialChildProps);\n};\n"
  },
  {
    "path": "packages/victory-scatter/src/index.ts",
    "content": "export * from \"./victory-scatter\";\n"
  },
  {
    "path": "packages/victory-scatter/src/victory-scatter.test.tsx",
    "content": "import { fireEvent, render, screen } from \"@testing-library/react\";\nimport React from \"react\";\nimport { Helpers, Point, VictoryLabel } from \"victory-core\";\nimport {\n  convertSvgCoordinatesToCartesian,\n  getSvgPointCoordinates,\n  isCircle,\n} from \"../../../test/helpers\";\nimport { VictoryScatter } from \"./victory-scatter\";\n\ndescribe(\"components/victory-scatter\", () => {\n  describe(\"default component rendering\", () => {\n    it(\"accepts safe user props\", () => {\n      render(\n        <VictoryScatter\n          data-testid=\"victory-scatter\"\n          aria-label=\"Chart\"\n          unsafe-prop=\"test\"\n        />,\n      );\n\n      const container = screen.getByTestId(\"victory-scatter\");\n      expect(screen.getByLabelText(\"Chart\")).toBeDefined();\n      expect(container).not.toHaveAttribute(\"unsafe-prop\");\n      expect(container.nodeName).toBe(\"svg\");\n    });\n\n    it(\"renders an svg with the correct width and height\", () => {\n      const { container } = render(<VictoryScatter />);\n      const svg = container.querySelector(\"svg\");\n      expect(svg?.style.width).toEqual(\"100%\");\n      expect(svg?.style.height).toEqual(\"100%\");\n    });\n\n    it(\"renders an svg with the correct viewBox\", () => {\n      const { container } = render(<VictoryScatter />);\n      const svg = container.querySelector(\"svg\");\n      const viewBoxValue = `0 0 ${450} ${300}`;\n      expect(svg).toHaveAttribute(\"viewBox\", viewBoxValue);\n    });\n\n    it(\"renders 51 points\", () => {\n      const { container } = render(<VictoryScatter />);\n      const points = container.querySelectorAll(\"path\");\n      expect(points).toHaveLength(51);\n    });\n\n    it(\"renders each point as a circle\", () => {\n      const { container } = render(<VictoryScatter />);\n      const points = container.querySelectorAll(\"path\");\n      expect(points).not.toHaveLength(0);\n      points.forEach((point) => {\n        expect(isCircle(point.getAttribute(\"d\"))).toBeTruthy();\n      });\n    });\n  });\n\n  describe(\"rendering data\", () => {\n    it(\"renders injected points for {x, y} shaped data (default)\", () => {\n      const data = Helpers.range(10).map((i) => ({ x: i, y: i }));\n      render(\n        <VictoryScatter\n          data={data}\n          dataComponent={<Point data-testid=\"point\" />}\n        />,\n      );\n\n      const points = screen.getAllByTestId(\"point\");\n      expect(points).toHaveLength(10);\n    });\n\n    it(\"renders points for {x, y} shaped data (default)\", () => {\n      const data = Helpers.range(10).map((i) => ({ x: i, y: i }));\n      const { container } = render(<VictoryScatter data={data} />);\n      const points = container.querySelectorAll(\"path\");\n      expect(points).toHaveLength(10);\n    });\n\n    it(\"renders points for array-shaped data\", () => {\n      const data = Helpers.range(4).map((i) => [i, i]);\n      const { container } = render(<VictoryScatter data={data} x={0} y={1} />);\n      const points = container.querySelectorAll(\"path\");\n      expect(points).toHaveLength(4);\n    });\n\n    it(\"renders points for deeply-nested data\", () => {\n      const data = Helpers.range(4).map((i) => ({\n        a: { b: [{ x: i, y: i }] },\n      }));\n      const { container } = render(\n        <VictoryScatter data={data} x=\"a.b[0].x\" y=\"a.b[0].y\" />,\n      );\n      const points = container.querySelectorAll(\"path\");\n      expect(points).toHaveLength(4);\n    });\n\n    it(\"renders data values with null accessor\", () => {\n      const data = Helpers.range(30);\n      const { container } = render(\n        // @ts-expect-error \"'null' is not assignable to 'x'\"\n        <VictoryScatter data={data} x={null} y={null} />,\n      );\n      const points = container.querySelectorAll(\"path\");\n      expect(points).toHaveLength(30);\n    });\n\n    it(\"renders points in the correct positions\", () => {\n      const svgDimensions = { width: 350, height: 200, padding: 75 };\n      const { container } = render(\n        <VictoryScatter\n          data={[\n            { x: 0, y: 0 },\n            { x: 2, y: 3 },\n            { x: 5, y: 5 },\n          ]}\n          {...svgDimensions}\n        />,\n      );\n      const domain = { x: [0, 5], y: [0, 5] };\n\n      const points = container.querySelectorAll(\"path\");\n      const svgCoordinates = Array.from(points).map(getSvgPointCoordinates);\n      const coordinates = svgCoordinates.map((coord) => {\n        return convertSvgCoordinatesToCartesian(coord, svgDimensions, domain);\n      });\n\n      expect(coordinates).toEqual([\n        [0, 0],\n        [2, 3],\n        [5, 5],\n      ]);\n    });\n\n    it(\"does not render data with null x or y values\", () => {\n      const data = [\n        { x: 1, y: 2 },\n        { x: null, y: 4 },\n        { x: 5, y: null },\n      ];\n      const { container } = render(<VictoryScatter data={data} />);\n      expect(container.querySelectorAll(\"path\")).toHaveLength(1);\n    });\n  });\n\n  describe(\"event handling\", () => {\n    let clickHandler;\n\n    beforeEach(() => {\n      clickHandler = jest.fn();\n    });\n\n    afterEach(() => {\n      clickHandler.mockClear();\n    });\n\n    it(\"attaches an event to the parent svg\", () => {\n      const { container } = render(\n        <VictoryScatter\n          events={[\n            {\n              target: \"parent\",\n              eventHandlers: { onClick: clickHandler },\n            },\n          ]}\n        />,\n      );\n      const svg = container.querySelector(\"svg\");\n      fireEvent.click(svg!);\n      expect(clickHandler).toBeCalled();\n      // the first argument is the standard evt object\n      expect(Object.keys(clickHandler.mock.calls[0][1])).toEqual(\n        expect.arrayContaining([\"data\", \"scale\", \"width\", \"height\", \"style\"]),\n      );\n    });\n\n    it(\"attaches an event to data\", () => {\n      const { container } = render(\n        <VictoryScatter\n          events={[\n            {\n              target: \"data\",\n              eventHandlers: { onClick: clickHandler },\n            },\n          ]}\n        />,\n      );\n      const Data = container.querySelectorAll(\"path\");\n      expect(Data).not.toHaveLength(0);\n      Data.forEach((node, index) => {\n        fireEvent.click(node);\n        expect(clickHandler).toHaveBeenCalled();\n        expect(`${clickHandler.mock.calls[index][2]}`).toEqual(`${index}`);\n      });\n    });\n\n    it(\"attaches an event to a label\", () => {\n      const data = [\n        { eventKey: 0, _x: 0, _y: 0, x: 0, y: 0, label: \"0\" },\n        { eventKey: 1, _x: 1, _y: 1, x: 1, y: 1, label: \"1\" },\n        { eventKey: 2, _x: 2, _y: 2, x: 2, y: 2, label: \"2\" },\n      ];\n      render(\n        <VictoryScatter\n          data={data}\n          labelComponent={<VictoryLabel data-testid=\"label\" />}\n          events={[\n            {\n              target: \"labels\",\n              eventHandlers: { onClick: clickHandler },\n            },\n          ]}\n        />,\n      );\n      const Labels = screen.getAllByTestId(\"label\");\n      Labels.forEach((node, index) => {\n        fireEvent.click(node);\n        expect(clickHandler).toHaveBeenCalled();\n        // the first argument is the standard evt object\n        expect(clickHandler.mock.calls[index][1].datum).toEqual(data[index]);\n        expect(`${clickHandler.mock.calls[index][2]}`).toEqual(`${index}`);\n      });\n    });\n  });\n\n  describe(\"accessibility\", () => {\n    it(\"adds an aria role to each point in the series\", () => {\n      const data = Helpers.range(5).map((y, x) => ({ x, y }));\n      render(<VictoryScatter data={data} />);\n\n      expect(screen.getAllByRole(\"presentation\")).toHaveLength(5);\n    });\n\n    it(\"adds an aria-label and tabIndex to Point primitive\", () => {\n      const data = Helpers.range(2, 7).map((x) => ({ x, y: x + 2 }));\n      render(\n        <VictoryScatter\n          data={data}\n          dataComponent={\n            <Point\n              data-testid=\"point\"\n              ariaLabel={({ datum }) =>\n                `scatter point x: ${datum.x}, y:${datum.y}`\n              }\n              tabIndex={({ index }) => Number(index) + 10}\n            />\n          }\n        />,\n      );\n      const points = screen.getAllByTestId(\"point\");\n      expect(points).toHaveLength(5);\n      points.forEach((p, i) => {\n        expect(p.getAttribute(\"aria-label\")).toEqual(\n          `scatter point x: ${data[i].x}, y:${data[i].y}`,\n        );\n        expect(parseInt(p.getAttribute(\"tabindex\")!, 10)).toEqual(i + 10);\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-scatter/src/victory-scatter.tsx",
    "content": "import React from \"react\";\nimport {\n  Helpers,\n  VictoryLabel,\n  addEvents,\n  VictoryContainer,\n  VictoryTheme,\n  DefaultTransitions,\n  Data,\n  Domain,\n  Point,\n  UserProps,\n  EventPropTypeInterface,\n  ScatterSymbolType,\n  StringOrNumberOrCallback,\n  EventsMixinClass,\n  VictoryCommonProps,\n  VictoryDatableProps,\n  VictoryMultiLabelableProps,\n  VictoryStyleInterface,\n} from \"victory-core\";\nimport { getBaseProps } from \"./helper-methods\";\n\nconst fallbackProps = {\n  width: 450,\n  height: 300,\n  padding: 50,\n  size: 3,\n  symbol: \"circle\",\n};\n\nexport type VictoryScatterTTargetType = \"data\" | \"labels\" | \"parent\";\n\nexport interface VictoryScatterProps\n  extends VictoryCommonProps,\n    VictoryDatableProps,\n    VictoryMultiLabelableProps {\n  bubbleProperty?: string;\n  children?: React.ReactElement | React.ReactElement[];\n  events?: EventPropTypeInterface<\n    VictoryScatterTTargetType,\n    StringOrNumberOrCallback\n  >[];\n  eventKey?: StringOrNumberOrCallback;\n  maxBubbleSize?: number;\n  minBubbleSize?: number;\n  size?: number | { (data: any): number };\n  style?: VictoryStyleInterface;\n  symbol?: ScatterSymbolType | { (data: any): ScatterSymbolType };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface VictoryScatterBase extends EventsMixinClass<VictoryScatterProps> {}\n\n/**\n * Draw area charts with React. VictoryArea is a composable component, so it doesn't include axes.\n * Add VictoryArea as a child of VictoryChart for a complete chart.\n */\nclass VictoryScatterBase extends React.Component<VictoryScatterProps> {\n  static animationWhitelist = [\n    \"data\",\n    \"domain\",\n    \"height\",\n    \"maxBubbleSize\",\n    \"padding\",\n    \"samples\",\n    \"size\",\n    \"style\",\n    \"width\",\n  ];\n\n  static displayName = \"VictoryScatter\";\n  static role = \"scatter\";\n  static defaultTransitions = DefaultTransitions.discreteTransitions();\n\n  static defaultProps: VictoryScatterProps = {\n    containerComponent: <VictoryContainer />,\n    dataComponent: <Point />,\n    labelComponent: <VictoryLabel />,\n    groupComponent: <g />,\n    samples: 50,\n    sortOrder: \"ascending\",\n    standalone: true,\n    theme: VictoryTheme.grayscale,\n  };\n\n  static getDomain = Domain.getDomain;\n  static getData = Data.getData;\n  static getBaseProps(props) {\n    return getBaseProps(props, fallbackProps);\n  }\n  static expectedComponents = [\n    \"dataComponent\",\n    \"labelComponent\",\n    \"groupComponent\",\n    \"containerComponent\",\n  ];\n\n  // Overridden in native versions\n  shouldAnimate() {\n    return !!this.props.animate;\n  }\n\n  render(): React.ReactElement {\n    const { animationWhitelist, role } = VictoryScatter;\n    const props = Helpers.modifyProps(this.props, fallbackProps, role);\n\n    if (this.shouldAnimate()) {\n      return this.animateComponent(props, animationWhitelist);\n    }\n\n    const children = this.renderData(props);\n\n    const component = props.standalone\n      ? this.renderContainer(props.containerComponent, children)\n      : children;\n\n    return UserProps.withSafeUserProps(component, props);\n  }\n}\n\nexport const VictoryScatter = addEvents(VictoryScatterBase);\n"
  },
  {
    "path": "packages/victory-scatter/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-scatter/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-selection-container/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-selection-container/CHANGELOG.md",
    "content": "# victory-selection-container\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n### Patch Changes\n\n- Remove deprecated babel-plugin-lodash plugin ([#2965](https://github.com/FormidableLabs/victory/pull/2965))\n\n## 37.3.2\n\n## 37.3.1\n\n## 37.3.0\n\n## 37.2.0\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Refactor containers and portal to function components ([#2799](https://github.com/FormidableLabs/victory/pull/2799))\n\n* Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n## 37.0.1\n\n### Patch Changes\n\n- Fix the signature of class static functions in components ([#2840](https://github.com/FormidableLabs/victory/pull/2840))\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n### Patch Changes\n\n- Replace lodash keys with native code ([#2811](https://github.com/FormidableLabs/victory/pull/2811))\n\n* Replace lodash array utils with native code ([#2810](https://github.com/FormidableLabs/victory/pull/2810))\n\n- Replace lodash isFunction with native code ([#2802](https://github.com/FormidableLabs/victory/pull/2802))\n\n## 36.9.1\n\n### Patch Changes\n\n- Fix victory-native component prop types ([#2785](https://github.com/FormidableLabs/victory/pull/2785))\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n## 36.8.4\n\n## 36.8.3\n\n### Patch Changes\n\n- Refactor param reassignments ([#2724](https://github.com/FormidableLabs/victory/pull/2724))\n\n## 36.8.2\n\n### Patch Changes\n\n- Migrated victory-selection-container to TypeScript ([#2706](https://github.com/FormidableLabs/victory/pull/2706))\n\n## 36.8.1\n\n## 36.8.0\n\n## 36.7.0\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Improved the exported types (fixes [#2451](https://github.com/FormidableLabs/victory/issues/2451)) ([#2452](https://github.com/FormidableLabs/victory/pull/2452))\n\n- Updated dependencies []:\n  - victory-core@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-core@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Added explicit `any` type defs (fixes [#2358](https://github.com/FormidableLabs/victory/issues/2358)) ([`57ed0fe30`](https://github.com/FormidableLabs/victory/commit/57ed0fe304dbc8753da1126a02d44de8004e96aa))\n\n* Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n* Updated dependencies [[`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-core@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-core@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- Updated dependencies [[`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-core@36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Update source code with minor lint-based improvements (see [#2236](https://github.com/FormidableLabs/victory/issues/2236)). ([#2403](https://github.com/FormidableLabs/victory/pull/2403))\n\n- Updated dependencies [[`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-core@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-selection-container/README.md",
    "content": "# VictorySelectionContainer\n\n`victory-selection-container@^30.0.0` exports `VictorySelectionContainer`, `selectionContainerMixin` and `SelectionHelpers`\n\nTo view documentation for `VictorySelectionContainer` please see https://commerce.nearform.com/open-source/victory/docs/victory-selection-container\n\nTo suggest an addition or correction to this documentation please see https://github.com/FormidableLabs/victory/blob/main/docs/src/content/docs/victory-selection-container.md\n"
  },
  {
    "path": "packages/victory-selection-container/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-selection-container/package.json",
    "content": "{\n  \"name\": \"victory-selection-container\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Interactive Selection Component for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"lodash\": \"^4.17.19\",\n    \"victory-core\": \"37.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"devDependencies\": {\n    \"victory-bar\": \"*\",\n    \"victory-vendor\": \"*\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-bar:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-bar:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-bar:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:build\",\n        \"../victory-bar:build\",\n        \"../victory-vendor:build\",\n        \"../victory-voronoi:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-selection-container/src/index.ts",
    "content": "export * from \"./victory-selection-container\";\nexport * from \"./selection-helpers\";\n"
  },
  {
    "path": "packages/victory-selection-container/src/selection-helpers.test.tsx",
    "content": "import React from \"react\";\nimport { VictoryBar } from \"victory-bar\";\nimport * as d3Scale from \"victory-vendor/d3-scale\";\n\nimport { SelectionHelpers } from \"./selection-helpers\";\n\nconst scale = { x: d3Scale.scaleLinear(), y: d3Scale.scaleLinear() };\n\ndescribe(\"helpers/selection\", () => {\n  describe(\"getDatasets\", () => {\n    it(\"returns data from props\", () => {\n      const data = [\n        { x: 1, y: 3 },\n        { x: 2, y: 5 },\n      ];\n      const props = { data };\n      const dataset = SelectionHelpers.getDatasets(props);\n      expect(dataset).toEqual([{ data }]);\n    });\n\n    it(\"returns data from children\", () => {\n      const data = [\n        { eventKey: 0, x: 1, y: 3 },\n        { eventKey: 1, x: 2, y: 5 },\n      ];\n      const expectedReturn = [\n        { eventKey: 0, x: 1, _x: 1, y: 3, _y: 3 },\n        { eventKey: 1, x: 2, _x: 2, y: 5, _y: 5 },\n      ];\n      const name = \"points\";\n      const children = [React.createElement(VictoryBar, { name, data })];\n      const props = { children };\n      const dataset = SelectionHelpers.getDatasets(props);\n      expect(dataset).toEqual([{ childName: name, data: expectedReturn }]);\n    });\n  });\n\n  describe(\"filterDatasets\", () => {\n    it(\"returns null when no datasets are within bounds\", () => {\n      const datasets = [\n        {\n          childName: \"a\",\n          data: [\n            { eventKey: 0, _x: 1, _y: 3 },\n            { eventKey: 1, _x: 2, _y: 5 },\n          ],\n        },\n      ];\n      const props = { scale, x1: 0, y1: 0, x2: 0.5, y2: 0.5 };\n      const filteredData = SelectionHelpers.filterDatasets(props, datasets);\n      expect(filteredData).toBeNull();\n    });\n\n    it(\"returns data points within bounds\", () => {\n      const data = [\n        { eventKey: 0, _x: 0, _y: 0 },\n        { eventKey: 1, _x: 2, _y: 5 },\n      ];\n      const childName = \"a\";\n      const datasets = [{ childName, data }];\n      const props = { scale, x1: 0, y1: 0, x2: 0.5, y2: 0.5 };\n      const filteredData = SelectionHelpers.filterDatasets(props, datasets);\n      const expected = { eventKey: [0], data: [data[0]] };\n      expect(filteredData).toEqual([Object.assign({ childName }, expected)]);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-selection-container/src/selection-helpers.tsx",
    "content": "import { Selection, Data, Helpers, Datum } from \"victory-core\";\nimport defaults from \"lodash/defaults\";\nimport throttle from \"lodash/throttle\";\nimport React from \"react\";\n\nconst ON_MOUSE_MOVE_THROTTLE_MS = 16;\n\nclass SelectionHelpersClass {\n  getDimension(props) {\n    const { horizontal, selectionDimension } = props;\n    if (!horizontal || !selectionDimension) {\n      return selectionDimension;\n    }\n    return selectionDimension === \"x\" ? \"y\" : \"x\";\n  }\n\n  getDatasets(props) {\n    if (props.data) {\n      return [{ data: props.data }];\n    }\n\n    const getData = (childProps) => {\n      const data = Data.getData(childProps);\n      return Array.isArray(data) && data.length > 0 ? data : undefined;\n    };\n\n    const iteratee = (child, childName, parent) => {\n      const blacklist = props.selectionBlacklist || [];\n      let childElement;\n      if (!Data.isDataComponent(child) || blacklist.includes(childName)) {\n        return null;\n      } else if (child.type && Helpers.isFunction(child.type.getData)) {\n        childElement = parent ? React.cloneElement(child, parent.props) : child;\n        const childData =\n          childElement.props && childElement.type.getData(childElement.props);\n        return childData ? { childName, data: childData } : null;\n      }\n      const childData = getData(childElement.props);\n      return childData ? { childName, data: childData } : null;\n    };\n    return Helpers.reduceChildren(\n      React.Children.toArray(props.children),\n      iteratee,\n      props,\n    );\n  }\n\n  filterDatasets(props, datasets) {\n    const filtered = datasets.reduce((memo, dataset) => {\n      const selectedData = this.getSelectedData(props, dataset.data);\n      return selectedData\n        ? memo.concat({\n            childName: dataset.childName,\n            eventKey: selectedData.eventKey,\n            data: selectedData.data,\n          })\n        : memo;\n    }, []);\n    return filtered.length ? filtered : null;\n  }\n\n  getSelectedData(props, dataset) {\n    const { x1, y1, x2, y2 } = props;\n    const withinBounds = (d) => {\n      const scaledPoint = Helpers.scalePoint(props, d);\n      return (\n        scaledPoint.x >= Math.min(x1, x2) &&\n        scaledPoint.x <= Math.max(x1, x2) &&\n        scaledPoint.y >= Math.min(y1, y2) &&\n        scaledPoint.y <= Math.max(y1, y2)\n      );\n    };\n    const eventKey: number[] = [];\n    const data: Datum[] = [];\n    let count = 0;\n    for (let index = 0, len = dataset.length; index < len; index++) {\n      const datum = dataset[index];\n      if (withinBounds(datum)) {\n        data[count] = datum;\n        eventKey[count] = datum.eventKey === undefined ? index : datum.eventKey;\n        count++;\n      }\n    }\n    return count > 0 ? { eventKey, data } : null;\n  }\n\n  onMouseDown = (evt, targetProps) => {\n    evt.preventDefault();\n    const { activateSelectedData, allowSelection, polar, selectedData } =\n      targetProps;\n    if (!allowSelection) {\n      return {};\n    }\n    const dimension = this.getDimension(targetProps);\n    const parentSVG = targetProps.parentSVG || Selection.getParentSVG(evt);\n    const { x, y } = Selection.getSVGEventCoordinates(evt, parentSVG);\n    const x1 =\n      polar || dimension !== \"y\"\n        ? x\n        : Selection.getDomainCoordinates(targetProps).x[0];\n    const y1 =\n      polar || dimension !== \"x\"\n        ? y\n        : Selection.getDomainCoordinates(targetProps).y[0];\n    const x2 =\n      polar || dimension !== \"y\"\n        ? x\n        : Selection.getDomainCoordinates(targetProps).x[1];\n    const y2 =\n      polar || dimension !== \"x\"\n        ? y\n        : Selection.getDomainCoordinates(targetProps).y[1];\n\n    const mutatedProps = { x1, y1, select: true, x2, y2, parentSVG };\n    if (selectedData && Helpers.isFunction(targetProps.onSelectionCleared)) {\n      targetProps.onSelectionCleared(defaults({}, mutatedProps, targetProps));\n    }\n    const parentMutation = [{ target: \"parent\", mutation: () => mutatedProps }];\n    const dataMutation =\n      selectedData && activateSelectedData\n        ? selectedData.map((d) => {\n            return {\n              childName: d.childName,\n              eventKey: d.eventKey,\n              target: \"data\",\n              mutation: () => null,\n            };\n          })\n        : [];\n\n    return parentMutation.concat(...dataMutation);\n  };\n\n  private handleMouseMove = (evt, targetProps) => {\n    const { allowSelection, select, polar } = targetProps;\n    const dimension = this.getDimension(targetProps);\n    if (!allowSelection || !select) {\n      return null;\n    }\n    const parentSVG = targetProps.parentSVG || Selection.getParentSVG(evt);\n    const { x, y } = Selection.getSVGEventCoordinates(evt, parentSVG);\n    const x2 =\n      polar || dimension !== \"y\"\n        ? x\n        : Selection.getDomainCoordinates(targetProps).x[1];\n    const y2 =\n      polar || dimension !== \"x\"\n        ? y\n        : Selection.getDomainCoordinates(targetProps).y[1];\n    return {\n      target: \"parent\",\n      mutation: () => {\n        return { x2, y2, parentSVG };\n      },\n    };\n  };\n\n  onMouseMove = throttle(this.handleMouseMove, ON_MOUSE_MOVE_THROTTLE_MS, {\n    leading: true,\n    trailing: false,\n  });\n\n  onMouseUp = (evt, targetProps) => {\n    const { activateSelectedData, allowSelection, x2, y2 } = targetProps;\n    if (!allowSelection) {\n      return null;\n    }\n    if (!x2 || !y2) {\n      return [\n        {\n          target: \"parent\",\n          mutation: () => {\n            return { select: false, x1: null, x2: null, y1: null, y2: null };\n          },\n        },\n      ];\n    }\n    const datasets = this.getDatasets(targetProps);\n    const bounds = Selection.getBounds(targetProps);\n    const selectedData = this.filterDatasets(targetProps, datasets);\n    const mutatedProps = {\n      selectedData,\n      datasets,\n      select: false,\n      x1: null,\n      x2: null,\n      y1: null,\n      y2: null,\n    };\n    const callbackMutation =\n      selectedData && Helpers.isFunction(targetProps.onSelection)\n        ? targetProps.onSelection(\n            selectedData,\n            bounds,\n            defaults({}, mutatedProps, targetProps),\n          )\n        : {};\n    const parentMutation = [\n      {\n        target: \"parent\",\n        mutation: () => mutatedProps,\n      },\n    ];\n\n    const dataMutation =\n      selectedData && activateSelectedData\n        ? selectedData.map((d) => {\n            return {\n              childName: d.childName,\n              eventKey: d.eventKey,\n              target: \"data\",\n              mutation: () => {\n                return Object.assign({ active: true }, callbackMutation);\n              },\n            };\n          })\n        : [];\n\n    return parentMutation.concat(dataMutation);\n  };\n}\n\nexport const SelectionHelpers = new SelectionHelpersClass();\n"
  },
  {
    "path": "packages/victory-selection-container/src/victory-selection-container.tsx",
    "content": "import React from \"react\";\nimport {\n  Datum,\n  Rect,\n  VictoryContainer,\n  VictoryContainerProps,\n  VictoryEventHandler,\n} from \"victory-core\";\nimport { SelectionHelpers } from \"./selection-helpers\";\n\nexport interface VictorySelectionContainerProps extends VictoryContainerProps {\n  activateSelectedData?: boolean;\n  allowSelection?: boolean;\n  disable?: boolean;\n  onSelection?: (\n    points: {\n      childName?: string | string[];\n      eventKey?: string | number;\n      data?: Datum[];\n    }[],\n    bounds: {\n      x: number | Date;\n      y: number | Date;\n    }[],\n    props: VictorySelectionContainerProps,\n  ) => void;\n  horizontal?: boolean;\n  onSelectionCleared?: (props: VictorySelectionContainerProps) => void;\n  selectionBlacklist?: string[];\n  selectionComponent?: React.ReactElement;\n  selectionDimension?: \"x\" | \"y\";\n  selectionStyle?: React.CSSProperties;\n}\n\nexport const VICTORY_SELECTION_CONTAINER_DEFAULT_PROPS = {\n  activateSelectedData: true,\n  allowSelection: true,\n  selectionComponent: <Rect />,\n  selectionStyle: {\n    stroke: \"transparent\",\n    fill: \"black\",\n    fillOpacity: 0.1,\n  },\n};\n\ninterface VictorySelectionContainerMutatedProps\n  extends VictorySelectionContainerProps {\n  x1: number;\n  x2: number;\n  y1: number;\n  y2: number;\n}\n\nexport const useVictorySelectionContainer = (\n  initialProps: VictorySelectionContainerProps,\n) => {\n  const props = {\n    ...VICTORY_SELECTION_CONTAINER_DEFAULT_PROPS,\n    ...(initialProps as VictorySelectionContainerMutatedProps),\n  };\n\n  const { x1, x2, y1, y2, selectionStyle, selectionComponent, children, name } =\n    props;\n  const width = Math.abs(x2 - x1) || 1;\n  const height = Math.abs(y2 - y1) || 1;\n  const x = Math.min(x1, x2);\n  const y = Math.min(y1, y2);\n\n  const shouldRenderRect = y1 && y2 && x1 && x2;\n\n  return {\n    props,\n    children: [\n      children,\n      shouldRenderRect &&\n        React.cloneElement(selectionComponent, {\n          key: `${name}-selection`,\n          x,\n          y,\n          width,\n          height,\n          style: selectionStyle,\n        }),\n    ] as React.ReactElement[],\n  };\n};\n\nexport const VictorySelectionContainer = (\n  initialProps: VictorySelectionContainerProps,\n) => {\n  const { props, children } = useVictorySelectionContainer(initialProps);\n  return <VictoryContainer {...props}>{children}</VictoryContainer>;\n};\n\nVictorySelectionContainer.role = \"container\";\n\nVictorySelectionContainer.defaultEvents = (\n  initialProps: VictorySelectionContainerProps,\n) => {\n  const props = {\n    ...VICTORY_SELECTION_CONTAINER_DEFAULT_PROPS,\n    ...initialProps,\n  };\n  const createEventHandler =\n    (handler: VictoryEventHandler, disabled?: boolean): VictoryEventHandler =>\n    // eslint-disable-next-line max-params\n    (event, targetProps, eventKey, context) =>\n      disabled || props.disable\n        ? {}\n        : handler(event, { ...props, ...targetProps }, eventKey, context);\n\n  return [\n    {\n      target: \"parent\",\n      eventHandlers: {\n        onMouseDown: createEventHandler(SelectionHelpers.onMouseDown),\n        onTouchStart: createEventHandler(SelectionHelpers.onMouseDown),\n        onMouseMove: createEventHandler(SelectionHelpers.onMouseMove),\n        onTouchMove: createEventHandler(SelectionHelpers.onMouseMove),\n        onMouseUp: createEventHandler(SelectionHelpers.onMouseUp),\n        onTouchEnd: createEventHandler(SelectionHelpers.onMouseUp),\n      },\n    },\n  ];\n};\n"
  },
  {
    "path": "packages/victory-selection-container/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-selection-container/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-shared-events/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-shared-events/CHANGELOG.md",
    "content": "# victory-shared-events\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n### Patch Changes\n\n- Remove deprecated babel-plugin-lodash plugin ([#2965](https://github.com/FormidableLabs/victory/pull/2965))\n\n## 37.3.2\n\n## 37.3.1\n\n## 37.3.0\n\n## 37.2.0\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n## 37.0.1\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n### Patch Changes\n\n- Replace lodash keys with native code ([#2811](https://github.com/FormidableLabs/victory/pull/2811))\n\n* Replace lodash difference with native code ([#2828](https://github.com/FormidableLabs/victory/pull/2828))\n\n- Replace lodash isFunction with native code ([#2802](https://github.com/FormidableLabs/victory/pull/2802))\n\n## 36.9.1\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n## 36.8.4\n\n### Patch Changes\n\n- Fix VictorySharedEvents defaultProps ([#2752](https://github.com/FormidableLabs/victory/pull/2752))\n\n## 36.8.3\n\n### Patch Changes\n\n- Refactor param reassignments ([#2724](https://github.com/FormidableLabs/victory/pull/2724))\n\n* Migrate victory-shared-events to TypeScript ([#2733](https://github.com/FormidableLabs/victory/pull/2733))\n\n## 36.8.2\n\n## 36.8.1\n\n## 36.8.0\n\n## 36.7.0\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-core@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n- Updated dependencies [[`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-core@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-core@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- Updated dependencies [[`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-core@36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Update source code with minor lint-based improvements (see [#2236](https://github.com/FormidableLabs/victory/issues/2236)). ([#2403](https://github.com/FormidableLabs/victory/pull/2403))\n\n- Updated dependencies [[`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-core@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-shared-events/README.md",
    "content": "# VictorySharedEvents\n\n`victory-shared-events@^30.0.0` exports `VictorySharedEvents`\n\nTo view documentation for `VictorySharedEvents` please see https://commerce.nearform.com/open-source/victory/docs/victory-shared-events\n\nTo suggest an addition or correction to this documentation please see https://github.com/FormidableLabs/victory/blob/main/docs/src/content/docs/victory-shared-events.md\n"
  },
  {
    "path": "packages/victory-shared-events/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-shared-events/package.json",
    "content": "{\n  \"name\": \"victory-shared-events\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Shared Event Helper for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"json-stringify-safe\": \"^5.0.1\",\n    \"lodash\": \"^4.17.19\",\n    \"react-fast-compare\": \"^3.2.0\",\n    \"victory-core\": \"37.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:build\",\n        \"../victory-vendor:build\",\n        \"../victory-voronoi:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-shared-events/src/index.ts",
    "content": "export * from \"./victory-shared-events\";\n"
  },
  {
    "path": "packages/victory-shared-events/src/victory-shared-events.tsx",
    "content": "import React from \"react\";\nimport defaults from \"lodash/defaults\";\nimport isEmpty from \"lodash/isEmpty\";\nimport fromPairs from \"lodash/fromPairs\";\nimport isEqual from \"react-fast-compare\";\nimport stringify from \"json-stringify-safe\";\n\nimport {\n  Collection,\n  EventCallbackInterface,\n  EventMixinCalculatedValues,\n  EventPropTypeInterface,\n  Events,\n  Helpers,\n  StringOrNumberOrCallback,\n  TimerContext,\n} from \"victory-core\";\n\nexport type VictorySharedEventsProps = {\n  children?: React.ReactElement | React.ReactElement[];\n  container?: React.ReactElement;\n  groupComponent?: React.ReactElement;\n  events?: EventPropTypeInterface<string, StringOrNumberOrCallback>[];\n  eventKey?: StringOrNumberOrCallback;\n  externalEventMutations?: EventCallbackInterface<\n    string | string[],\n    string | number | (string | number)[]\n  >[];\n};\n\n// DISCLAIMER:\n// This file is not currently tested, and it is first on the list of files\n// to refactor in our current refactoring effort. Please do not make changes\n// to this file without manual testing and/or refactoring and adding tests.\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface VictorySharedEvents extends EventMixinCalculatedValues {}\n\nexport class VictorySharedEvents extends React.Component<VictorySharedEventsProps> {\n  static displayName = \"VictorySharedEvents\";\n  static role = \"shared-event-wrapper\";\n  static contextType = TimerContext;\n  static defaultProps = {\n    groupComponent: <g />,\n  };\n\n  getScopedEvents;\n  getEventState;\n  baseProps;\n  sharedEventsCache;\n  globalEvents;\n  prevGlobalEventKeys;\n  boundGlobalEvents;\n\n  constructor(props: VictorySharedEventsProps) {\n    super(props);\n\n    this.getScopedEvents = Events.getScopedEvents.bind(this);\n    this.getEventState = Events.getEventState.bind(this);\n    this.state = this.state || {};\n    this.sharedEventsCache = {};\n    this.globalEvents = {};\n    this.prevGlobalEventKeys = [];\n    this.boundGlobalEvents = {};\n    this.baseProps = this.getBaseProps(props);\n  }\n\n  shouldComponentUpdate(nextProps) {\n    if (!isEqual(this.props, nextProps)) {\n      this.baseProps = this.getBaseProps(nextProps);\n      const externalMutations = this.getExternalMutations(\n        nextProps,\n        this.baseProps,\n      );\n      this.applyExternalMutations(nextProps, externalMutations);\n    }\n    return true;\n  }\n\n  componentDidMount() {\n    const globalEventKeys = Object.keys(this.globalEvents);\n    globalEventKeys.forEach((key) => this.addGlobalListener(key));\n    this.prevGlobalEventKeys = globalEventKeys;\n  }\n\n  componentDidUpdate() {\n    const globalEventKeys = Object.keys(this.globalEvents);\n    const removedGlobalEventKeys = Collection.difference(\n      this.prevGlobalEventKeys,\n      globalEventKeys,\n    );\n    removedGlobalEventKeys.forEach((key) => this.removeGlobalListener(key));\n    const addedGlobalEventKeys = Collection.difference(\n      globalEventKeys,\n      this.prevGlobalEventKeys,\n    );\n    addedGlobalEventKeys.forEach((key) => this.addGlobalListener(key));\n    this.prevGlobalEventKeys = globalEventKeys;\n  }\n\n  componentWillUnmount() {\n    this.prevGlobalEventKeys.forEach((key) => this.removeGlobalListener(key));\n  }\n\n  addGlobalListener(key) {\n    const boundListener = (event) => {\n      const listener = this.globalEvents[key];\n      return listener && listener(Events.emulateReactEvent(event));\n    };\n    this.boundGlobalEvents[key] = boundListener;\n    window.addEventListener(\n      Events.getGlobalEventNameFromKey(key),\n      boundListener,\n    );\n  }\n\n  removeGlobalListener(key) {\n    window.removeEventListener(\n      Events.getGlobalEventNameFromKey(key),\n      this.boundGlobalEvents[key],\n    );\n  }\n\n  getAllEvents(props) {\n    const components = [\"container\", \"groupComponent\"];\n    const componentEvents = Events.getComponentEvents(props, components);\n    if (Array.isArray(componentEvents)) {\n      return Array.isArray(props.events)\n        ? componentEvents.concat(...props.events)\n        : componentEvents;\n    }\n    return props.events;\n  }\n\n  applyExternalMutations(props, externalMutations) {\n    if (!isEmpty(externalMutations)) {\n      const callbacks = props.externalEventMutations.reduce(\n        (memo, mutation) =>\n          Helpers.isFunction(mutation.callback)\n            ? memo.concat(mutation.callback)\n            : memo,\n        [],\n      );\n      const compiledCallbacks = callbacks.length\n        ? () => {\n            callbacks.forEach((c) => c());\n          }\n        : undefined;\n      this.setState(externalMutations, compiledCallbacks);\n    }\n  }\n\n  getExternalMutations(props, baseProps) {\n    return !isEmpty(props.externalEventMutations)\n      ? Events.getExternalMutationsWithChildren(\n          props.externalEventMutations,\n          baseProps,\n          this.state,\n          Object.keys(baseProps),\n        )\n      : undefined;\n  }\n\n  cacheSharedEvents(name, sharedEvents, cacheValues) {\n    this.sharedEventsCache[name] = [sharedEvents, cacheValues];\n  }\n\n  getCachedSharedEvents(name, cacheValues) {\n    const [sharedEvents, prevCacheValues] = this.sharedEventsCache[name] || [];\n\n    if (sharedEvents && isEqual(cacheValues, prevCacheValues)) {\n      return sharedEvents;\n    }\n\n    return undefined;\n  }\n\n  getBaseProps(props) {\n    const { container } = props;\n    const children = React.Children.toArray(this.props.children);\n    const childBaseProps = this.getBasePropsFromChildren(children);\n    const parentBaseProps = container ? container.props : {};\n    return Object.assign({}, childBaseProps, { parent: parentBaseProps });\n  }\n\n  getBasePropsFromChildren(childComponents) {\n    const iteratee = (child, childName) => {\n      if (child.type && Helpers.isFunction(child.type.getBaseProps)) {\n        const baseProps = child.props && child.type.getBaseProps(child.props);\n        return baseProps ? [[childName, baseProps]] : null;\n      }\n      return null;\n    };\n\n    const baseProps = Helpers.reduceChildren(childComponents, iteratee);\n    return fromPairs(baseProps);\n  }\n\n  getNewChildren(props, baseProps) {\n    const { events, eventKey } = props;\n\n    const alterChildren = (children, childNames) => {\n      return children.reduce((memo, child, index) => {\n        if (child.props.children) {\n          const newChildren = React.Children.toArray(child.props.children);\n          const names = childNames.slice(index, index + newChildren.length);\n          const results = React.cloneElement(\n            child,\n            child.props,\n            alterChildren(newChildren, names),\n          );\n          return memo.concat(results);\n        } else if (\n          childNames[index] !== \"parent\" &&\n          child.type &&\n          Helpers.isFunction(child.type.getBaseProps)\n        ) {\n          const name = child.props.name || childNames[index];\n          const childEvents =\n            Array.isArray(events) &&\n            events.filter((event) => {\n              if (event.target === \"parent\") {\n                return false;\n              }\n              return Array.isArray(event.childName)\n                ? event.childName.indexOf(name) > -1\n                : event.childName === name || event.childName === \"all\";\n            });\n\n          const sharedEventsCacheValues = [\n            name,\n            baseProps,\n            childEvents,\n            stringify(this.state[name]),\n          ];\n\n          const sharedEvents = this.getCachedSharedEvents(\n            name,\n            sharedEventsCacheValues,\n          ) || {\n            events: childEvents,\n            // partially apply child name and baseProps,\n            getEvents: (evts, target) =>\n              this.getScopedEvents(evts, target, name, baseProps),\n            // partially apply child name\n            getEventState: (key, target) =>\n              this.getEventState(key, target, name),\n          };\n\n          this.cacheSharedEvents(name, sharedEvents, sharedEventsCacheValues);\n\n          return memo.concat(\n            React.cloneElement(\n              child,\n              Object.assign(\n                { key: `events-${name}`, sharedEvents, eventKey, name },\n                child.props,\n              ),\n            ),\n          );\n        }\n        return memo.concat(child);\n      }, []);\n    };\n    const childNames = Object.keys(baseProps);\n    const childComponents = React.Children.toArray(props.children);\n    return alterChildren(childComponents, childNames);\n  }\n\n  getContainer(props, baseProps, events) {\n    const children = this.getNewChildren(props, baseProps);\n    const parents = Array.isArray(events)\n      ? events.filter((event) => event.target === \"parent\")\n      : [];\n\n    const sharedEvents =\n      parents.length > 0\n        ? {\n            events: parents,\n            // partially apply childName (null) and baseProps,\n            getEvents: (evts, target) =>\n              this.getScopedEvents(evts, target, null, baseProps),\n            getEventState: this.getEventState,\n          }\n        : null;\n    const container = props.container || props.groupComponent;\n    const role = container.type && container.type.role;\n    const containerProps = container.props || {};\n    const boundGetEvents = Events.getEvents.bind(this);\n    const parentEvents =\n      sharedEvents && boundGetEvents({ sharedEvents }, \"parent\");\n    const parentProps = defaults(\n      {},\n      this.getEventState(\"parent\", \"parent\"),\n      containerProps,\n      baseProps.parent,\n      { children },\n    );\n    const containerEvents = defaults(\n      {},\n      Events.getPartialEvents(parentEvents, \"parent\", parentProps),\n      containerProps.events,\n    );\n    this.globalEvents = Events.getGlobalEvents(containerEvents);\n    const localEvents = Events.omitGlobalEvents(containerEvents);\n    return role === \"container\"\n      ? React.cloneElement(\n          container,\n          Object.assign({}, parentProps, { events: localEvents }),\n        )\n      : React.cloneElement(container, localEvents, children);\n  }\n\n  render(): React.ReactElement {\n    const events = this.getAllEvents(this.props);\n    if (events) {\n      return this.getContainer(this.props, this.baseProps, events);\n    }\n    return React.cloneElement(this.props.container as React.ReactElement, {\n      children: this.props.children,\n    });\n  }\n}\n"
  },
  {
    "path": "packages/victory-shared-events/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-shared-events/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-stack/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-stack/CHANGELOG.md",
    "content": "# victory-stack\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n### Patch Changes\n\n- Remove deprecated babel-plugin-lodash plugin ([#2965](https://github.com/FormidableLabs/victory/pull/2965))\n\n* Improve types in victory-core helpers ([#2999](https://github.com/FormidableLabs/victory/pull/2999))\n\n## 37.3.2\n\n## 37.3.1\n\n### Patch Changes\n\n- Remove duplicate types from interfaces ([#2940](https://github.com/FormidableLabs/victory/pull/2940))\n\n## 37.3.0\n\n## 37.2.0\n\n### Minor Changes\n\n- Minor updates for clean theme ([#2909](https://github.com/FormidableLabs/victory/pull/2909))\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n### Patch Changes\n\n- Fix bug when one child of a Stack has a date axis and all null values for the other axis ([#2888](https://github.com/FormidableLabs/victory/pull/2888))\n\n## 37.0.2\n\n### Patch Changes\n\n- Ensure undefined props do not overwrite defaults ([#2852](https://github.com/FormidableLabs/victory/pull/2852))\n\n## 37.0.1\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n### Patch Changes\n\n- Replace lodash keys with native code ([#2811](https://github.com/FormidableLabs/victory/pull/2811))\n\n## 36.9.1\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n## 36.8.4\n\n## 36.8.3\n\n### Patch Changes\n\n- Refactor param reassignments ([#2724](https://github.com/FormidableLabs/victory/pull/2724))\n\n## 36.8.2\n\n### Patch Changes\n\n- Assign merged props to a const instead of modifying initialProps ([#2718](https://github.com/FormidableLabs/victory/pull/2718))\n\n## 36.8.1\n\n## 36.8.0\n\n### Patch Changes\n\n- Remove usage of defaultProps from components ([#2679](https://github.com/FormidableLabs/victory/pull/2679))\n\n## 36.7.0\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- TypeScript: Added strongly-typed props to `VictoryStack` (fixes [#2449](https://github.com/FormidableLabs/victory/issues/2449)) ([#2480](https://github.com/FormidableLabs/victory/pull/2480))\n\n- Updated dependencies []:\n  - victory-core@36.6.8\n  - victory-shared-events@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.7\n  - victory-shared-events@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.6\n  - victory-shared-events@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-core@36.6.5\n  - victory-shared-events@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n- Updated dependencies [[`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-core@36.6.4\n  - victory-shared-events@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-core@36.6.3\n  - victory-shared-events@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.2\n  - victory-shared-events@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- - Migrate `victory-stack` to TypeScript ([#2422](https://github.com/FormidableLabs/victory/pull/2422))\n\n- Updated dependencies [[`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-core@36.6.1\n  - victory-shared-events@36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Update source code with minor lint-based improvements (see [#2236](https://github.com/FormidableLabs/victory/issues/2236)). ([#2403](https://github.com/FormidableLabs/victory/pull/2403))\n\n- Updated dependencies [[`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-core@36.6.0\n  - victory-shared-events@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-stack/README.md",
    "content": "# VictoryStack\n\n`victory-stack@^30.0.0` exports `VictoryStack`\n\nTo view documentation for `VictoryStack` please see https://commerce.nearform.com/open-source/victory/docs/victory-stack\n\nTo suggest an addition or correction to this documentation please see https://github.com/FormidableLabs/victory/blob/main/docs/src/content/docs/victory-stack.md\n"
  },
  {
    "path": "packages/victory-stack/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-stack/package.json",
    "content": "{\n  \"name\": \"victory-stack\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Stack Layout Component for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"lodash\": \"^4.17.19\",\n    \"react-fast-compare\": \"^3.2.0\",\n    \"victory-core\": \"37.3.6\",\n    \"victory-shared-events\": \"37.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"devDependencies\": {\n    \"victory-area\": \"*\",\n    \"victory-bar\": \"*\",\n    \"victory-histogram\": \"*\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\",\n        \"../victory-shared-events:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:cjs\",\n        \"../victory-shared-events:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\",\n        \"../victory-shared-events:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\",\n        \"../victory-shared-events:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-shared-events:types:create\",\n        \"../victory-area:types:create\",\n        \"../victory-bar:types:create\",\n        \"../victory-histogram:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-shared-events:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-shared-events:types:create\",\n        \"../victory-area:types:create\",\n        \"../victory-bar:types:create\",\n        \"../victory-histogram:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-shared-events:types:create\",\n        \"../victory-area:types:create\",\n        \"../victory-bar:types:create\",\n        \"../victory-histogram:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:build\",\n        \"../victory-shared-events:build\",\n        \"../victory-area:build\",\n        \"../victory-bar:build\",\n        \"../victory-histogram:build\",\n        \"../victory-vendor:build\",\n        \"../victory-voronoi:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-stack/src/helper-methods.tsx",
    "content": "import orderBy from \"lodash/orderBy\";\nimport React from \"react\";\nimport { Helpers, Scale, Wrapper } from \"victory-core\";\nimport isEqual from \"react-fast-compare\";\n\nconst fallbackProps = {\n  width: 450,\n  height: 300,\n  padding: 50,\n};\n\n// Assumes data in `datasets` is sorted by `Data.getData`.\nfunction fillData(props, datasets) {\n  const { fillInMissingData } = props;\n  const xMap = datasets.reduce((prev, dataset) => {\n    dataset.forEach((datum) => {\n      prev[datum._x instanceof Date ? datum._x.getTime() : datum._x] = true;\n    });\n    return prev;\n  }, {});\n  const xKeys = Object.keys(xMap).map((k) => Number(k));\n  const xArr = orderBy(xKeys);\n\n  return datasets.map((dataset) => {\n    let indexOffset = 0;\n    const isDate = dataset[0] && dataset[0]._x instanceof Date;\n    const filledInData = xArr.map((x: number | Date, index) => {\n      let parsedX: number | Date = Number(x);\n      const datum = dataset[index - indexOffset];\n\n      if (datum) {\n        const x1 = isDate ? datum._x.getTime() : datum._x;\n        if (x1 === parsedX) {\n          return datum;\n        }\n        indexOffset++;\n        const y = fillInMissingData ? 0 : null;\n        parsedX = isDate ? new Date(parsedX) : parsedX;\n        return { x: parsedX, y, _x: parsedX, _y: y };\n      }\n      const y = fillInMissingData ? 0 : null;\n      parsedX = isDate ? new Date(parsedX) : parsedX;\n      return { x: parsedX, y, _x: parsedX, _y: y };\n    });\n\n    return filledInData;\n  });\n}\n\nfunction getY0(datum, index, datasets) {\n  if (datum.y0) {\n    return datum.y0;\n  }\n  const y = datum._y;\n  const group = datum._group;\n  const firstDatasetBaseline = datasets[0].map((d) => d.y0);\n\n  const previousDatasets = datasets.slice(0, index);\n  const previousPoints = previousDatasets.reduce((prev, dataset) => {\n    return prev.concat(\n      dataset\n        .filter((previousDatum) =>\n          datum._x instanceof Date\n            ? previousDatum._x.getTime() === datum._x.getTime()\n            : previousDatum._x === datum._x,\n        )\n        .map((previousDatum) => previousDatum._y || 0),\n    );\n  }, []);\n\n  const y0 =\n    previousPoints.length &&\n    previousPoints.reduce((memo, value) => {\n      const sameSign = (y < 0 && value < 0) || (y >= 0 && value >= 0);\n      return sameSign ? Number(value) + memo : memo;\n    }, firstDatasetBaseline[group] || 0);\n  return previousPoints.some((point) => point instanceof Date)\n    ? new Date(y0)\n    : y0;\n}\n\n/* eslint-disable no-nested-ternary */\nfunction addLayoutData(props, datasets, index) {\n  const xOffset = props.xOffset || 0;\n  return datasets[index].map((datum) => {\n    const yOffset = getY0(datum, index, datasets) || 0;\n    return Object.assign({}, datum, {\n      _y0: !(datum._y instanceof Date)\n        ? yOffset\n        : yOffset\n          ? new Date(yOffset)\n          : datum._y,\n      _y1:\n        datum._y === null\n          ? null\n          : datum._y instanceof Date\n            ? new Date(Number(datum._y) + Number(yOffset))\n            : datum._y + yOffset,\n      _x1:\n        datum._x === null\n          ? null\n          : datum._x instanceof Date\n            ? new Date(Number(datum._x) + Number(xOffset))\n            : datum._x + xOffset,\n    });\n  });\n}\n/* eslint-enable no-nested-ternary */\n\nfunction stackData(props, childComponents) {\n  const dataFromChildren = Wrapper.getDataFromChildren(props, childComponents);\n  const filledDatasets = fillData(props, dataFromChildren);\n  const filteredNullChild = filledDatasets.map((dataset) =>\n    dataset.filter((datum) => datum._x !== null && datum._y !== null),\n  );\n  return filteredNullChild.map((d, i) =>\n    addLayoutData(props, filledDatasets, i),\n  );\n}\n\nexport function getCalculatedProps(initialProps, childComponents) {\n  const children =\n    childComponents || React.Children.toArray(initialProps.children);\n  const role = \"stack\";\n  const props = Helpers.modifyProps(initialProps, fallbackProps, role);\n  const style = Wrapper.getStyle(props.theme, props.style, role);\n  const categories = props.categories || Wrapper.getCategories(props, children);\n  const datasets = props.datasets || stackData(props, children);\n  const clonedChildren = children.map((c, i) => {\n    return React.cloneElement(c, { data: datasets[i] });\n  });\n  const domain = {\n    x: Wrapper.getDomain(\n      Object.assign({}, props, { categories }),\n      \"x\",\n      clonedChildren,\n    ),\n    y: Wrapper.getDomain(\n      Object.assign({}, props, { categories }),\n      \"y\",\n      clonedChildren,\n    ),\n  };\n  const range = props.range || {\n    x: Helpers.getRange(props, \"x\"),\n    y: Helpers.getRange(props, \"y\"),\n  };\n  const baseScale = {\n    x: Scale.getScaleFromProps(props, \"x\") || Wrapper.getScale(props, \"x\"),\n    y: Scale.getScaleFromProps(props, \"y\") || Wrapper.getScale(props, \"y\"),\n  };\n  const scale = {\n    x: baseScale.x.domain(domain.x).range(props.horizontal ? range.y : range.x),\n    y: baseScale.y.domain(domain.y).range(props.horizontal ? range.x : range.y),\n  };\n  const { colorScale, horizontal } = props;\n  return {\n    datasets,\n    categories,\n    range,\n    domain,\n    horizontal,\n    scale,\n    style,\n    colorScale,\n    role,\n  };\n}\n\n// We need to remove sharedEvents in order to memoize the calculated data\n// With shared events, the props change on every event, and every value is re-calculated\nconst withoutSharedEvents = (props) => {\n  const { children } = props;\n  const modifiedChildren = React.Children.toArray(children).map((_child) => {\n    const child = _child as React.ReactElement;\n    return {\n      ...child,\n      props: Helpers.omit(child.props, [\"sharedEvents\"]),\n    };\n  });\n  props.children = modifiedChildren;\n  return props;\n};\n\nexport function useMemoizedProps(initialProps) {\n  const modifiedProps = withoutSharedEvents(initialProps);\n  const [props, setProps] = React.useState(modifiedProps);\n\n  // React.memo uses shallow equality to compare objects. This way props\n  // will only be re-calculated when they change.\n  React.useEffect(() => {\n    if (!isEqual(modifiedProps, props)) {\n      setProps(modifiedProps);\n    }\n  }, [props, setProps, modifiedProps]);\n\n  return React.useMemo(() => {\n    return getCalculatedProps(props, props.children);\n  }, [props]);\n}\n\nfunction getLabels(props, datasets, index) {\n  if (!props.labels) {\n    return undefined;\n  }\n  return datasets.length === index + 1 ? props.labels : undefined;\n}\n\nexport function getChildProps(props, calculatedProps) {\n  const { categories, domain, range, scale, horizontal } = calculatedProps;\n  return {\n    height: props.height,\n    width: props.width,\n    padding: Helpers.getPadding(props.padding),\n    standalone: false,\n    theme: props.theme,\n    categories,\n    domain,\n    range,\n    scale,\n    horizontal,\n  };\n}\n\nfunction getColorScale(props, child) {\n  const role = child.type && child.type.role;\n  const colorScaleOptions = child.props.colorScale || props.colorScale;\n  if (role !== \"group\" && role !== \"stack\") {\n    return undefined;\n  }\n  return props.theme\n    ? colorScaleOptions || props.theme.props.colorScale\n    : colorScaleOptions;\n}\n\nexport function getChildren(initialProps, childComponents, calculatedProps) {\n  const props = Helpers.modifyProps(initialProps, fallbackProps, \"stack\");\n  const children = childComponents || React.Children.toArray(props.children);\n  const newCalculatedProps =\n    calculatedProps || getCalculatedProps(props, children);\n  const { datasets } = newCalculatedProps;\n  const childProps = getChildProps(props, newCalculatedProps);\n  const parentName = props.name || \"stack\";\n  const { theme } = props;\n  return children.map((child, index) => {\n    const role = child.type && child.type.role;\n    const data = datasets[index];\n    const style = Wrapper.getChildStyle(\n      child,\n      index,\n      newCalculatedProps,\n      theme,\n    );\n    const labels = props.labels\n      ? getLabels(props, datasets, index)\n      : child.props.labels;\n    const name = child.props.name || `${parentName}-${role}-${index}`;\n    return React.cloneElement(\n      child,\n      Object.assign(\n        {\n          key: `${name}-key-${index}`,\n          labels,\n          name,\n          domainPadding: child.props.domainPadding || props.domainPadding,\n          theme: props.theme,\n          labelComponent: props.labelComponent || child.props.labelComponent,\n          style,\n          colorScale: getColorScale(props, child),\n          data,\n          polar: props.polar,\n        },\n        childProps,\n      ),\n    );\n  });\n}\n"
  },
  {
    "path": "packages/victory-stack/src/index.ts",
    "content": "export * from \"./victory-stack\";\n"
  },
  {
    "path": "packages/victory-stack/src/victory-stack.test.tsx",
    "content": "/* eslint-disable no-console */\n\nimport { render } from \"@testing-library/react\";\nimport React from \"react\";\nimport { VictoryBar } from \"victory-bar\";\nimport { VictoryHistogram } from \"victory-histogram\";\nimport { VictoryArea } from \"victory-area\";\n\nimport { VictoryStack } from \"./victory-stack\";\n\ndescribe(\"components/victory-stack\", () => {\n  describe(\"default component rendering\", () => {\n    it(\"renders an svg with the correct width and height\", () => {\n      const { container } = render(\n        <VictoryStack>\n          <VictoryBar />\n          <VictoryBar />\n        </VictoryStack>,\n      );\n      const svg = container.querySelector(\"svg\")!;\n      expect(svg.style.width).toEqual(\"100%\");\n      expect(svg.style.height).toEqual(\"100%\");\n    });\n\n    it(\"renders an svg with the correct viewBox\", () => {\n      const { container } = render(\n        <VictoryStack>\n          <VictoryBar />\n          <VictoryBar />\n        </VictoryStack>,\n      );\n      const svg = container.querySelector(\"svg\")!;\n      const viewBoxValue = `0 0 ${450} ${300}`;\n      expect(svg.getAttribute(\"viewBox\")).toEqual(viewBoxValue);\n    });\n\n    it(\"accepts user props\", () => {\n      const { container } = render(\n        <VictoryStack data-testid=\"victory-stack\" aria-label=\"Stack\">\n          <VictoryBar />\n          <VictoryBar />\n        </VictoryStack>,\n      );\n\n      const svgNode = container.querySelector(\"svg\")!;\n      expect(svgNode.getAttribute(\"data-testid\")).toEqual(\"victory-stack\");\n      expect(svgNode.getAttribute(\"aria-label\")).toEqual(\"Stack\");\n    });\n  });\n\n  describe(\"children data\", () => {\n    it(\"should be able to handle all null values when using dates\", () => {\n      const { container } = render(\n        <VictoryStack data-testid=\"victory-stack\" aria-label=\"Stack\">\n          <VictoryArea data={[{ x: new Date(2006, 1, 1), y: null }]} />\n          <VictoryArea data={[{ x: new Date(2006, 1, 1), y: 2 }]} />\n        </VictoryStack>,\n      );\n\n      const svgNode = container.querySelector(\"svg\")!;\n      expect(svgNode.getAttribute(\"data-testid\")).toEqual(\"victory-stack\");\n      expect(svgNode.getAttribute(\"aria-label\")).toEqual(\"Stack\");\n    });\n  });\n\n  describe(\"warnings\", () => {\n    beforeEach(() => {\n      jest.spyOn(console, \"warn\").mockImplementation(() => {});\n    });\n\n    afterEach(() => {\n      jest.clearAllMocks();\n    });\n\n    it(\"should warn when histogram children are mixed with non-histogram children\", () => {\n      render(\n        <VictoryStack>\n          <VictoryHistogram />\n          <VictoryBar />\n        </VictoryStack>,\n      );\n\n      expect(console.warn).toHaveBeenCalledWith(\n        \"VictoryHistogram only supports being stacked with other VictoryHistogram components. Check to make sure that you are only passing VictoryHistogram components to VictoryStack\",\n      );\n    });\n\n    it(\"should not warn when only histogram children are passed\", () => {\n      render(\n        <VictoryStack>\n          <VictoryHistogram />\n          <VictoryHistogram />\n        </VictoryStack>,\n      );\n\n      expect(console.warn).not.toHaveBeenCalled();\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-stack/src/victory-stack.tsx",
    "content": "import React from \"react\";\nimport defaults from \"lodash/defaults\";\nimport isEmpty from \"lodash/isEmpty\";\n\nimport {\n  CategoryPropType,\n  DomainPropType,\n  EventPropTypeInterface,\n  StringOrNumberOrCallback,\n  VictoryCommonProps,\n  VictoryMultiLabelableProps,\n  VictoryStyleInterface,\n  Helpers,\n  Hooks,\n  UserProps,\n  VictoryComponentConfiguration,\n  VictoryContainer,\n  VictoryTheme,\n  Wrapper,\n} from \"victory-core\";\n\nimport { VictorySharedEvents } from \"victory-shared-events\";\nimport { getChildren, useMemoizedProps } from \"./helper-methods\";\nimport isEqual from \"react-fast-compare\";\n\nconst fallbackProps = {\n  width: 450,\n  height: 300,\n  padding: 50,\n};\n\nexport type VictoryStackTTargetType = \"data\" | \"labels\" | \"parent\";\nexport interface VictoryStackProps\n  extends VictoryCommonProps,\n    VictoryMultiLabelableProps {\n  bins?: number | number[] | Date[];\n  categories?: CategoryPropType;\n  children?: React.ReactNode | React.ReactNode[];\n  domain?: DomainPropType;\n  events?: EventPropTypeInterface<\n    VictoryStackTTargetType,\n    StringOrNumberOrCallback\n  >[];\n  eventKey?: StringOrNumberOrCallback;\n  fillInMissingData?: boolean;\n  style?: VictoryStyleInterface;\n  xOffset?: number;\n}\n\nconst defaultProps = {\n  containerComponent: <VictoryContainer />,\n  groupComponent: <g />,\n  standalone: true,\n  theme: VictoryTheme.grayscale,\n  fillInMissingData: true,\n};\n\nconst VictoryStackBase = (initialProps: VictoryStackProps) => {\n  const { role } = VictoryStack;\n  const propsWithDefaults = React.useMemo(\n    () => defaults({}, initialProps, defaultProps),\n    [initialProps],\n  );\n  const { setAnimationState, getAnimationProps, getProps } =\n    Hooks.useAnimationState();\n\n  const props = getProps(propsWithDefaults);\n\n  const modifiedProps = Helpers.modifyProps(props, fallbackProps, role);\n  const {\n    eventKey,\n    containerComponent,\n    standalone,\n    groupComponent,\n    externalEventMutations,\n    width,\n    height,\n    theme,\n    polar,\n    horizontal,\n    name,\n  } = modifiedProps;\n\n  const childComponents = React.Children.toArray(modifiedProps.children);\n  const calculatedProps = useMemoizedProps(modifiedProps);\n  const { domain, scale, style } = calculatedProps;\n\n  const newChildren = React.useMemo(() => {\n    const children = getChildren(props, childComponents, calculatedProps);\n    const orderedChildren = children.map((child, index) => {\n      const childProps = Object.assign(\n        { animate: getAnimationProps(props, child, index) },\n        child.props,\n      );\n      return React.cloneElement(child, childProps);\n    });\n    /*\n      reverse render order for children of `VictoryStack` so that higher children in the stack\n      are rendered behind lower children. This looks nicer for stacked bars with cornerRadius, and\n      areas with strokes\n    */\n    return orderedChildren.reverse();\n  }, [props, childComponents, calculatedProps, getAnimationProps]);\n\n  const containerProps = React.useMemo(() => {\n    if (standalone) {\n      return {\n        domain,\n        scale,\n        width,\n        height,\n        standalone,\n        theme,\n        style: style.parent,\n        horizontal,\n        polar,\n        name,\n      };\n    }\n    return {};\n  }, [\n    standalone,\n    domain,\n    scale,\n    width,\n    height,\n    theme,\n    style,\n    horizontal,\n    polar,\n    name,\n  ]);\n  const userProps = React.useMemo(\n    () => UserProps.getSafeUserProps(propsWithDefaults),\n    [propsWithDefaults],\n  );\n\n  const container = React.useMemo(() => {\n    if (standalone) {\n      const defaultContainerProps = defaults(\n        {},\n        containerComponent.props,\n        containerProps,\n        userProps,\n      );\n      return React.cloneElement(containerComponent, defaultContainerProps);\n    }\n    return React.cloneElement(groupComponent, userProps);\n  }, [\n    groupComponent,\n    standalone,\n    containerComponent,\n    containerProps,\n    userProps,\n  ]);\n\n  const events = React.useMemo(() => {\n    return Wrapper.getAllEvents(props);\n  }, [props]);\n\n  const previousProps = Hooks.usePreviousProps(propsWithDefaults);\n\n  React.useEffect(() => {\n    // This is called before dismount to keep state in sync\n    return () => {\n      if (propsWithDefaults.animate) {\n        setAnimationState(previousProps, propsWithDefaults);\n      }\n    };\n  }, [setAnimationState, previousProps, propsWithDefaults]);\n\n  if (!isEmpty(events)) {\n    return (\n      <VictorySharedEvents\n        container={container}\n        eventKey={eventKey}\n        events={events}\n        externalEventMutations={externalEventMutations}\n      >\n        {newChildren}\n      </VictorySharedEvents>\n    );\n  }\n\n  return React.cloneElement(container, container.props, newChildren);\n};\n\nconst componentConfig: VictoryComponentConfiguration<VictoryStackProps> = {\n  role: \"stack\",\n  expectedComponents: [\n    \"groupComponent\",\n    \"containerComponent\",\n    \"labelComponent\",\n  ],\n  getChildren,\n};\n\nexport const VictoryStack = Object.assign(\n  React.memo(VictoryStackBase, isEqual),\n  componentConfig,\n);\nVictoryStack.displayName = \"VictoryStack\";\n"
  },
  {
    "path": "packages/victory-stack/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-stack/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-tooltip/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-tooltip/CHANGELOG.md",
    "content": "# victory-tooltip\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n### Patch Changes\n\n- Remove deprecated babel-plugin-lodash plugin ([#2965](https://github.com/FormidableLabs/victory/pull/2965))\n\n* Improve types in victory-core helpers ([#2999](https://github.com/FormidableLabs/victory/pull/2999))\n\n## 37.3.2\n\n## 37.3.1\n\n## 37.3.0\n\n## 37.2.0\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Refactor containers and portal to function components ([#2799](https://github.com/FormidableLabs/victory/pull/2799))\n\n* Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n### Patch Changes\n\n- Ensure undefined props do not overwrite defaults ([#2852](https://github.com/FormidableLabs/victory/pull/2852))\n\n## 37.0.1\n\n### Patch Changes\n\n- Fix the signature of class static functions in components ([#2840](https://github.com/FormidableLabs/victory/pull/2840))\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n## 36.9.1\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n### Patch Changes\n\n- Migrate victory-native to TypeScript ([#2739](https://github.com/FormidableLabs/victory/pull/2739))\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n## 36.8.4\n\n## 36.8.3\n\n### Patch Changes\n\n- Migrate victory-tooltip to typescript ([#2725](https://github.com/FormidableLabs/victory/pull/2725))\n\n## 36.8.2\n\n## 36.8.1\n\n## 36.8.0\n\n### Patch Changes\n\n- Remove usage of defaultProps from components ([#2679](https://github.com/FormidableLabs/victory/pull/2679))\n\n## 36.7.0\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-core@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n- Updated dependencies [[`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-core@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-core@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- Updated dependencies [[`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-core@36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Update source code with minor lint-based improvements (see [#2236](https://github.com/FormidableLabs/victory/issues/2236)). ([#2403](https://github.com/FormidableLabs/victory/pull/2403))\n\n- Updated dependencies [[`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-core@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-tooltip/README.md",
    "content": "# VictoryTooltip\n\n`victory-tooltip@^30.0.0` exports `VictoryTooltip` and `Flyout` components\n\nTo view documentation for `VictoryTooltip` please see https://commerce.nearform.com/open-source/victory/docs/victory-tooltip\n\nTo suggest an addition or correction to this documentation please see https://github.com/FormidableLabs/victory/blob/main/docs/src/content/docs/victory-tooltip.md\n"
  },
  {
    "path": "packages/victory-tooltip/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-tooltip/package.json",
    "content": "{\n  \"name\": \"victory-tooltip\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Tooltip Component for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"lodash\": \"^4.17.19\",\n    \"victory-core\": \"37.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:build\",\n        \"../victory-vendor:build\",\n        \"../victory-voronoi:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-tooltip/src/flyout.test.tsx",
    "content": "import React from \"react\";\nimport { render } from \"@testing-library/react\";\n\nimport { SVGWrapper } from \"../../../test/helpers\";\nimport { Flyout } from \"./flyout\";\n\ndescribe(\"victory-primitives/flyout\", () => {\n  const baseProps = {\n    x: 100,\n    y: 100,\n    dx: 0,\n    dy: 0,\n    width: 50,\n    height: 50,\n    cornerRadius: 5,\n    pointerLength: 10,\n    pointerWidth: 10,\n  };\n  describe(\"rendering\", () => {\n    it(\"renders a flyout path\", () => {\n      const { container } = render(<Flyout {...baseProps} />, {\n        wrapper: SVGWrapper,\n      });\n      const path = container.querySelector(\"path\");\n\n      // Make sure the path is rendered:\n      expect(path).toMatchInlineSnapshot(`\n        <path\n          d=\"M -5, -25\n            L 5, -25\n            L 5, -25\n            L 20, -25\n            A 5 5 0 0 1 25, -20\n            L 25, 20\n            A 5 5 0 0 1 20, 25\n            L -20, 25\n            A 5 5 0 0 1 -25, 20\n            L -25, -20\n            A 5 5 0 0 1 -20, -25\n            z\"\n          role=\"presentation\"\n          shape-rendering=\"auto\"\n        />\n      `);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-tooltip/src/flyout.tsx",
    "content": "import React from \"react\";\nimport defaults from \"lodash/defaults\";\n\nimport {\n  Helpers,\n  Path,\n  UserProps,\n  VictoryCommonProps,\n  OrientationTypes,\n  VictoryStyleObject,\n  StringOrNumberOrCallback,\n} from \"victory-core\";\n\nexport interface FlyoutProps extends VictoryCommonProps {\n  active?: boolean;\n  center?: {\n    x: number;\n    y: number;\n  };\n  className?: string;\n  clipPath?: string;\n  cornerRadius?: number;\n  data?: any[];\n  datum?: object;\n  dx?: number;\n  dy?: number;\n  events?: object;\n  id?: StringOrNumberOrCallback;\n  index?: number;\n  orientation?: OrientationTypes;\n  pathComponent?: React.ReactElement;\n  pointerLength?: number;\n  pointerWidth?: number;\n  role?: string;\n  shapeRendering?: string;\n  style?: VictoryStyleObject;\n  transform?: string;\n  x?: number;\n  y?: number;\n}\n\ninterface FlyoutPathProps {\n  center: {\n    x: number;\n    y: number;\n  };\n  cornerRadius: number;\n  dx?: number;\n  dy?: number;\n  height: number;\n  orientation: OrientationTypes;\n  pointerLength: number;\n  pointerWidth: number;\n  width: number;\n  x: number;\n  y: number;\n}\n\nconst getVerticalPath = (props: FlyoutPathProps) => {\n  const { pointerWidth, cornerRadius, orientation, width, height, center } =\n    props;\n  const sign = orientation === \"bottom\" ? 1 : -1;\n  const x = props.x + (props.dx || 0);\n  const y = props.y + (props.dy || 0);\n  const centerX = center.x;\n  const centerY = center.y;\n  const pointerEdge = centerY + sign * (height / 2);\n  const oppositeEdge = centerY - sign * (height / 2);\n  const rightEdge = centerX + width / 2;\n  const leftEdge = centerX - width / 2;\n  const pointerLength = sign * (y - pointerEdge) < 0 ? 0 : props.pointerLength;\n  const direction = orientation === \"bottom\" ? \"0 0 0\" : \"0 0 1\";\n  const arc = `${cornerRadius} ${cornerRadius} ${direction}`;\n  return `M ${centerX - pointerWidth / 2}, ${pointerEdge}\n    L ${pointerLength ? x : centerX + pointerWidth / 2}, ${\n      pointerLength ? y : pointerEdge\n    }\n    L ${centerX + pointerWidth / 2}, ${pointerEdge}\n    L ${rightEdge - cornerRadius}, ${pointerEdge}\n    A ${arc} ${rightEdge}, ${pointerEdge - sign * cornerRadius}\n    L ${rightEdge}, ${oppositeEdge + sign * cornerRadius}\n    A ${arc} ${rightEdge - cornerRadius}, ${oppositeEdge}\n    L ${leftEdge + cornerRadius}, ${oppositeEdge}\n    A ${arc} ${leftEdge}, ${oppositeEdge + sign * cornerRadius}\n    L ${leftEdge}, ${pointerEdge - sign * cornerRadius}\n    A ${arc} ${leftEdge + cornerRadius}, ${pointerEdge}\n    z`;\n};\n\nconst getHorizontalPath = (props: FlyoutPathProps) => {\n  const { pointerWidth, cornerRadius, orientation, width, height, center } =\n    props;\n  const sign = orientation === \"left\" ? 1 : -1;\n  const x = props.x + (props.dx || 0);\n  const y = props.y + (props.dy || 0);\n  const centerX = center.x;\n  const centerY = center.y;\n  const pointerEdge = centerX - sign * (width / 2);\n  const oppositeEdge = centerX + sign * (width / 2);\n  const bottomEdge = centerY + height / 2;\n  const topEdge = centerY - height / 2;\n  const pointerLength = sign * (x - pointerEdge) > 0 ? 0 : props.pointerLength;\n  const direction = orientation === \"left\" ? \"0 0 0\" : \"0 0 1\";\n  const arc = `${cornerRadius} ${cornerRadius} ${direction}`;\n  return `M ${pointerEdge}, ${centerY - pointerWidth / 2}\n    L ${pointerLength ? x : pointerEdge}, ${\n      pointerLength ? y : centerY + pointerWidth / 2\n    }\n    L ${pointerEdge}, ${centerY + pointerWidth / 2}\n    L ${pointerEdge}, ${bottomEdge - cornerRadius}\n    A ${arc} ${pointerEdge + sign * cornerRadius}, ${bottomEdge}\n    L ${oppositeEdge - sign * cornerRadius}, ${bottomEdge}\n    A ${arc} ${oppositeEdge}, ${bottomEdge - cornerRadius}\n    L ${oppositeEdge}, ${topEdge + cornerRadius}\n    A ${arc} ${oppositeEdge - sign * cornerRadius}, ${topEdge}\n    L ${pointerEdge + sign * cornerRadius}, ${topEdge}\n    A ${arc} ${pointerEdge}, ${topEdge + cornerRadius}\n    z`;\n};\n\nconst getFlyoutPath = (props: FlyoutPathProps) => {\n  const orientation = props.orientation || \"top\";\n  return orientation === \"left\" || orientation === \"right\"\n    ? getHorizontalPath(props)\n    : getVerticalPath(props);\n};\n\nconst evaluateProps = (props: FlyoutProps) => {\n  /**\n   * Potential evaluated props are:\n   * `id`\n   * `style`\n   */\n  const id = Helpers.evaluateProp(props.id, props);\n  const style = Helpers.evaluateStyle(props.style, props);\n\n  return { ...props, id, style };\n};\n\nconst defaultProps = {\n  pathComponent: <Path />,\n  role: \"presentation\",\n  shapeRendering: \"auto\",\n};\n\nexport const Flyout: React.FC<FlyoutProps> = (initialProps) => {\n  const props = evaluateProps(defaults({}, initialProps, defaultProps));\n  const userProps = UserProps.getSafeUserProps(props);\n\n  // check for required props for this subcomponent\n  // they should be passed in from the wrapper\n  UserProps.assert(props.height, \"Flyout props[height] is undefined\");\n  UserProps.assert(props.width, \"Flyout props[width] is undefined\");\n  UserProps.assert(props.x, \"Flyout props[x] is undefined\");\n  UserProps.assert(props.y, \"Flyout props[y] is undefined\");\n\n  const flyoutPathProps: FlyoutPathProps = {\n    center: props.center || { x: 0, y: 0 },\n    cornerRadius: props.cornerRadius || 0,\n    dx: props.dx,\n    dy: props.dy,\n    height: props.height,\n    orientation: props.orientation || \"top\",\n    pointerLength: props.pointerLength || 0,\n    pointerWidth: props.pointerWidth || 0,\n    width: props.width,\n    x: props.x,\n    y: props.y,\n  };\n\n  return React.cloneElement(props.pathComponent!, {\n    ...props.events,\n    ...userProps,\n    style: props.style,\n    d: getFlyoutPath(flyoutPathProps),\n    className: props.className,\n    shapeRendering: props.shapeRendering,\n    role: props.role,\n    transform: props.transform,\n    clipPath: props.clipPath,\n  });\n};\n"
  },
  {
    "path": "packages/victory-tooltip/src/index.ts",
    "content": "export * from \"./victory-tooltip\";\nexport * from \"./flyout\";\n"
  },
  {
    "path": "packages/victory-tooltip/src/victory-tooltip.test.tsx",
    "content": "import React from \"react\";\nimport { fireEvent, screen, render } from \"@testing-library/react\";\nimport { VictoryContainer, VictoryLabel } from \"victory-core\";\n\nimport { Flyout } from \"./flyout\";\nimport { VictoryTooltip } from \"./victory-tooltip\";\n\ndescribe(\"components/victory-tooltip\", () => {\n  const flyoutId = \"flyout-1\";\n  const labelId = \"label-1\";\n\n  const baseProps = {\n    x: 0,\n    y: 0,\n    datum: { some: \"object\" },\n    index: 3,\n    active: true,\n    text: \"such text, wow\",\n    flyoutComponent: <Flyout data-testid={flyoutId} />,\n    labelComponent: <VictoryLabel data-testid={labelId} />,\n  };\n\n  it(\"renders nothing when not active\", () => {\n    render(<VictoryTooltip {...baseProps} active={false} />, {\n      wrapper: VictoryContainer as React.JSXElementConstructor<{\n        children: React.ReactNode;\n      }>,\n    });\n    const output = screen.queryByTestId(labelId);\n    expect(output).not.toBeInTheDocument();\n  });\n\n  it(\"renders the expected text\", () => {\n    render(<VictoryTooltip {...baseProps} />, {\n      wrapper: VictoryContainer as React.JSXElementConstructor<{\n        children: React.ReactNode;\n      }>,\n    });\n    const output = screen.getByTestId(labelId);\n    expect(output).toBeInTheDocument();\n    expect(output).toBeVisible();\n    expect(output).toHaveTextContent(baseProps.text);\n  });\n\n  it(\"renders a flyout and a label\", () => {\n    render(<VictoryTooltip {...baseProps} />, {\n      wrapper: VictoryContainer as React.JSXElementConstructor<{\n        children: React.ReactNode;\n      }>,\n    });\n    const label = screen.getByTestId(labelId);\n    const flyout = screen.getByTestId(flyoutId);\n    expect(label).toBeInTheDocument();\n    expect(flyout).toBeInTheDocument();\n  });\n\n  describe(\"event handling\", () => {\n    it(\"attaches an to the flyout object\", () => {\n      const clickHandler = jest.fn();\n      render(\n        <VictoryTooltip {...baseProps} events={{ onClick: clickHandler }} />,\n        {\n          wrapper: VictoryContainer as React.JSXElementConstructor<{\n            children: React.ReactNode;\n          }>,\n        },\n      );\n      fireEvent.click(screen.getByTestId(flyoutId));\n      expect(clickHandler).toBeCalled();\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-tooltip/src/victory-tooltip.tsx",
    "content": "import React from \"react\";\nimport {\n  TextSize,\n  Helpers,\n  LabelHelpers,\n  VictoryLabel,\n  VictoryTheme,\n  VictoryPortal,\n  VictoryLabelableProps,\n  VictoryLabelProps,\n  VictoryLabelStyleObject,\n  NumberOrCallback,\n  PaddingOrCallback,\n  VictoryStyleObject,\n  OrientationTypes,\n  VictoryThemeDefinition,\n} from \"victory-core\";\n\nimport defaults from \"lodash/defaults\";\nimport uniqueId from \"lodash/uniqueId\";\nimport isPlainObject from \"lodash/isPlainObject\";\nimport orderBy from \"lodash/orderBy\";\n\nimport { Flyout } from \"./flyout\";\n\nconst fallbackProps = {\n  cornerRadius: 5,\n  pointerLength: 10,\n  pointerWidth: 10,\n};\n\nexport interface VictoryTooltipProps\n  extends VictoryLabelableProps,\n    VictoryLabelProps {\n  activateData?: boolean;\n  active?: boolean;\n  activePoints?: any[];\n  angle?: number;\n  center?: { x?: number; y?: number };\n  centerOffset?: {\n    x?: NumberOrCallback;\n    y?: NumberOrCallback;\n  };\n  constrainToVisibleArea?: boolean;\n  cornerRadius?: NumberOrCallback;\n  events?: any;\n  height?: number;\n  horizontal?: boolean;\n  flyoutComponent?: React.ReactElement;\n  flyoutHeight?: NumberOrCallback;\n  flyoutPadding?: PaddingOrCallback;\n  flyoutStyle?: VictoryStyleObject;\n  flyoutWidth?: NumberOrCallback;\n  id?: number | string;\n  index?: number | string;\n  orientation?: OrientationTypes | ((...args: any[]) => OrientationTypes);\n  pointerLength?: NumberOrCallback;\n  pointerOrientation?:\n    | OrientationTypes\n    | ((...args: any[]) => OrientationTypes);\n  pointerWidth?: NumberOrCallback;\n  style?:\n    | (VictoryLabelStyleObject & {\n        angle?: number;\n      })\n    | VictoryLabelStyleObject[];\n  theme?: VictoryThemeDefinition;\n  width?: number;\n}\n\ntype InternalEvaluatedProps = VictoryTooltipProps & {\n  centerOffset: { x: number; y: number };\n  cornerRadius?: number;\n  dx?: string | number;\n  dy?: string | number;\n  flyoutHeight: number;\n  flyoutPadding: {\n    top: number;\n    bottom: number;\n    left: number;\n    right: number;\n  };\n  flyoutWidth: number;\n  orientation: OrientationTypes;\n  pointerLength?: number;\n  pointerWidth?: number;\n  // TODO: This is a hack to get around the fact that the type of\n  // style is used in akward ways in the functions\n  style: any;\n  text: string | string[];\n};\n\ntype EventHandlers = Record<\n  string,\n  (props?: any) => {\n    target: string;\n    mutation: () => { active?: boolean | undefined };\n  }[]\n>;\n\nexport class VictoryTooltip extends React.Component<VictoryTooltipProps> {\n  static displayName = \"VictoryTooltip\";\n  static role = \"tooltip\";\n\n  static defaultProps = {\n    active: false,\n    renderInPortal: true,\n    labelComponent: <VictoryLabel />,\n    flyoutComponent: <Flyout />,\n    groupComponent: <g />,\n  };\n\n  static defaultEvents(props: VictoryTooltipProps): {\n    target: string;\n    eventHandlers: EventHandlers;\n  }[] {\n    const activate = props.activateData\n      ? [\n          { target: \"labels\", mutation: () => ({ active: true }) },\n          { target: \"data\", mutation: () => ({ active: true }) },\n        ]\n      : [{ target: \"labels\", mutation: () => ({ active: true }) }];\n    const deactivate = props.activateData\n      ? [\n          { target: \"labels\", mutation: () => ({ active: undefined }) },\n          { target: \"data\", mutation: () => ({ active: undefined }) },\n        ]\n      : [{ target: \"labels\", mutation: () => ({ active: undefined }) }];\n    return [\n      {\n        target: \"data\",\n        eventHandlers: {\n          onMouseOver: () => activate,\n          onFocus: () => activate,\n          onTouchStart: () => activate,\n          onMouseOut: () => deactivate,\n          onBlur: () => deactivate,\n          onTouchEnd: () => deactivate,\n        },\n      },\n    ];\n  }\n\n  id: string | number;\n\n  constructor(props: VictoryTooltipProps) {\n    super(props);\n    this.id = props.id === undefined ? uniqueId(\"tooltip-\") : props.id;\n  }\n\n  getDefaultOrientation(props: VictoryTooltipProps): OrientationTypes {\n    const { datum, horizontal, polar } = props;\n    if (!polar) {\n      const positive = horizontal ? \"right\" : \"top\";\n      const negative = horizontal ? \"left\" : \"bottom\";\n      return datum && datum.y < 0 ? negative : positive;\n    }\n    return this.getPolarOrientation(props);\n  }\n\n  getPolarOrientation(props: VictoryTooltipProps): OrientationTypes {\n    const degrees = LabelHelpers.getDegrees(props, props.datum);\n    const placement = props.labelPlacement || \"vertical\";\n    if (placement === \"vertical\") {\n      return this.getVerticalOrientations(degrees);\n    } else if (placement === \"parallel\") {\n      return degrees < 90 || degrees > 270 ? \"right\" : \"left\";\n    }\n    return degrees > 180 ? \"bottom\" : \"top\";\n  }\n\n  getVerticalOrientations(degrees: number): OrientationTypes {\n    // eslint-disable-next-line no-magic-numbers\n    if (degrees < 45 || degrees > 315) {\n      return \"right\";\n      // eslint-disable-next-line no-magic-numbers\n    } else if (degrees >= 45 && degrees <= 135) {\n      return \"top\";\n      // eslint-disable-next-line no-magic-numbers\n    } else if (degrees > 135 && degrees < 225) {\n      return \"left\";\n    }\n    return \"bottom\";\n  }\n\n  getStyles(props) {\n    const theme = props.theme || VictoryTheme.grayscale;\n    const defaultLabelStyles =\n      theme && theme.tooltip && theme.tooltip.style ? theme.tooltip.style : {};\n    const baseLabelStyle = Array.isArray(props.style)\n      ? props.style.map((s) => defaults({}, s, defaultLabelStyles))\n      : defaults({}, props.style, defaultLabelStyles);\n    const defaultFlyoutStyles =\n      theme && theme.tooltip && theme.tooltip.flyoutStyle\n        ? theme.tooltip.flyoutStyle\n        : {};\n    const baseFlyoutStyle = props.flyoutStyle\n      ? defaults({}, props.flyoutStyle, defaultFlyoutStyles)\n      : defaultFlyoutStyles;\n    const style = Array.isArray(baseLabelStyle)\n      ? baseLabelStyle.map((s) => Helpers.evaluateStyle(s, props))\n      : Helpers.evaluateStyle(baseLabelStyle, props);\n    const flyoutStyle = Helpers.evaluateStyle(\n      baseFlyoutStyle,\n      Object.assign({}, props, { style }),\n    );\n    return { style, flyoutStyle };\n  }\n\n  getEvaluatedProps(props: VictoryTooltipProps): InternalEvaluatedProps {\n    const { cornerRadius, centerOffset, dx, dy } = props;\n\n    const active = Helpers.evaluateProp(props.active, props);\n\n    let text = Helpers.evaluateProp(\n      props.text,\n      Object.assign({}, props, { active }),\n    );\n    if (text === undefined || text === null) {\n      text = \"\";\n    }\n    if (typeof text === \"number\") {\n      text = text.toString();\n    }\n\n    const { style, flyoutStyle } = this.getStyles(\n      Object.assign({}, props, { active, text }),\n    );\n    const orientation =\n      Helpers.evaluateProp(\n        props.orientation,\n        Object.assign({}, props, { active, text, style, flyoutStyle }),\n      ) || this.getDefaultOrientation(props);\n\n    const padding =\n      Helpers.evaluateProp(\n        props.flyoutPadding,\n        Object.assign({}, props, {\n          active,\n          text,\n          style,\n          flyoutStyle,\n          orientation,\n        }),\n      ) || this.getLabelPadding(style);\n\n    const flyoutPadding = Helpers.getPadding(padding);\n\n    const pointerWidth = Helpers.evaluateProp(\n      props.pointerWidth,\n      Object.assign({}, props, {\n        active,\n        text,\n        style,\n        flyoutStyle,\n        orientation,\n      }),\n    );\n\n    const pointerLength = Helpers.evaluateProp(\n      props.pointerLength,\n      Object.assign({}, props, {\n        active,\n        text,\n        style,\n        flyoutStyle,\n        orientation,\n      }),\n    );\n    const labelSize = TextSize.approximateTextSize(text, style);\n\n    const { flyoutHeight, flyoutWidth } = this.getDimensions(\n      Object.assign({}, props, {\n        style,\n        flyoutStyle,\n        active,\n        text,\n        orientation,\n        flyoutPadding,\n        pointerWidth,\n        pointerLength,\n      }),\n      labelSize,\n    );\n\n    const evaluatedProps = Object.assign({}, props, {\n      active,\n      text,\n      style,\n      flyoutStyle,\n      orientation,\n      flyoutHeight,\n      flyoutWidth,\n      flyoutPadding,\n      pointerWidth,\n      pointerLength,\n    });\n\n    const offsetX =\n      isPlainObject(centerOffset) && centerOffset?.x !== undefined\n        ? Helpers.evaluateProp(centerOffset.x, evaluatedProps)\n        : 0;\n\n    const offsetY =\n      isPlainObject(centerOffset) && centerOffset?.y !== undefined\n        ? Helpers.evaluateProp(centerOffset.y, evaluatedProps)\n        : 0;\n\n    return {\n      ...evaluatedProps,\n      centerOffset: { x: offsetX, y: offsetY },\n      dx: dx !== undefined ? Helpers.evaluateProp(dx, evaluatedProps) : 0,\n      dy: dy !== undefined ? Helpers.evaluateProp(dy, evaluatedProps) : 0,\n      cornerRadius: Helpers.evaluateProp(cornerRadius, evaluatedProps),\n    };\n  }\n\n  getCalculatedValues(props: InternalEvaluatedProps): {\n    style: any;\n    flyoutStyle?: VictoryStyleObject;\n    labelSize: { width: number; height: number };\n    flyoutDimensions: { height: number; width: number };\n    flyoutCenter: { x: number; y: number };\n    transform?: string;\n  } {\n    const { style, text, flyoutStyle, flyoutHeight, flyoutWidth } = props;\n    const labelSize = TextSize.approximateTextSize(text, style);\n    const flyoutDimensions = { height: flyoutHeight, width: flyoutWidth };\n    const flyoutCenter = this.getFlyoutCenter(props, flyoutDimensions);\n    const transform = this.getTransform(props);\n    return {\n      style,\n      flyoutStyle,\n      labelSize,\n      flyoutDimensions,\n      flyoutCenter,\n      transform,\n    };\n  }\n\n  getTransform(props): string | undefined {\n    const { x, y, style } = props;\n    const labelStyle = style || {};\n    const angle =\n      labelStyle.angle || props.angle || this.getDefaultAngle(props);\n    return angle ? `rotate(${angle} ${x} ${y})` : undefined;\n  }\n\n  getDefaultAngle(props): number {\n    const { polar, labelPlacement, orientation, datum } = props;\n    if (!polar || !labelPlacement || labelPlacement === \"vertical\") {\n      return 0;\n    }\n    const degrees = LabelHelpers.getDegrees(props, datum);\n    const sign = (degrees > 90 && degrees < 180) || degrees > 270 ? 1 : -1;\n    const labelRotation = labelPlacement === \"perpendicular\" ? 0 : 90;\n\n    let angle = 0;\n    if (degrees === 0 || degrees === 180) {\n      angle = orientation === \"top\" && degrees === 180 ? 270 : 90;\n    } else if (degrees > 0 && degrees < 180) {\n      angle = 90 - degrees;\n    } else if (degrees > 180 && degrees < 360) {\n      angle = 270 - degrees;\n    }\n    return angle + sign * labelRotation;\n  }\n\n  constrainTooltip(center, props, dimensions) {\n    const { x, y } = center;\n    const { width, height } = dimensions;\n    const extent = {\n      x: [0, props.width],\n      y: [0, props.height],\n    };\n    const flyoutExtent = {\n      x: [x - width / 2, x + width / 2],\n      y: [y - height / 2, y + height / 2],\n    };\n    const adjustments = {\n      x: [\n        flyoutExtent.x[0] < extent.x[0] ? extent.x[0] - flyoutExtent.x[0] : 0,\n        flyoutExtent.x[1] > extent.x[1] ? flyoutExtent.x[1] - extent.x[1] : 0,\n      ],\n      y: [\n        flyoutExtent.y[0] < extent.y[0] ? extent.y[0] - flyoutExtent.y[0] : 0,\n        flyoutExtent.y[1] > extent.y[1] ? flyoutExtent.y[1] - extent.y[1] : 0,\n      ],\n    };\n    return {\n      x: Math.round(x + adjustments.x[0] - adjustments.x[1]),\n      y: Math.round(y + adjustments.y[0] - adjustments.y[1]),\n    };\n  }\n\n  getFlyoutCenter(props, dimensions) {\n    const {\n      x,\n      y,\n      dx,\n      dy,\n      pointerLength,\n      orientation,\n      constrainToVisibleArea,\n      centerOffset,\n    } = props;\n    const { height, width } = dimensions;\n    const xSign = orientation === \"left\" ? -1 : 1;\n    const ySign = orientation === \"bottom\" ? -1 : 1;\n    const flyoutCenter = {\n      x:\n        orientation === \"left\" || orientation === \"right\"\n          ? x + xSign * (pointerLength + width / 2 + xSign * dx)\n          : x + dx,\n      y:\n        orientation === \"top\" || orientation === \"bottom\"\n          ? y - ySign * (pointerLength + height / 2 - ySign * dy)\n          : y + dy,\n    };\n\n    const center = {\n      x:\n        isPlainObject(props.center) && props.center.x !== undefined\n          ? props.center.x\n          : flyoutCenter.x,\n      y:\n        isPlainObject(props.center) && props.center.y !== undefined\n          ? props.center.y\n          : flyoutCenter.y,\n    };\n\n    const centerWithOffset = {\n      x: center.x + centerOffset.x,\n      y: center.y + centerOffset.y,\n    };\n\n    return constrainToVisibleArea\n      ? this.constrainTooltip(centerWithOffset, props, dimensions)\n      : centerWithOffset;\n  }\n\n  getLabelPadding(style) {\n    if (!style) {\n      return 0;\n    }\n    const paddings = Array.isArray(style)\n      ? style.map((s) => s.padding)\n      : [style.padding];\n    return Math.max(...paddings, 0);\n  }\n\n  getDimensions(props, labelSize) {\n    const {\n      orientation,\n      pointerLength,\n      pointerWidth,\n      flyoutHeight,\n      flyoutWidth,\n      flyoutPadding,\n    } = props;\n    const cornerRadius = Helpers.evaluateProp(props.cornerRadius, props);\n\n    const getHeight = () => {\n      const calculatedHeight =\n        labelSize.height + flyoutPadding.top + flyoutPadding.bottom;\n\n      const minHeight =\n        orientation === \"top\" || orientation === \"bottom\"\n          ? 2 * cornerRadius\n          : 2 * cornerRadius + pointerWidth;\n      return Math.max(minHeight, calculatedHeight);\n    };\n\n    const getWidth = () => {\n      const calculatedWidth =\n        labelSize.width + flyoutPadding.left + flyoutPadding.right;\n\n      const minWidth =\n        orientation === \"left\" || orientation === \"right\"\n          ? 2 * cornerRadius + pointerLength\n          : 2 * cornerRadius;\n      return Math.max(minWidth, calculatedWidth);\n    };\n\n    return {\n      flyoutHeight: flyoutHeight\n        ? Helpers.evaluateProp(flyoutHeight, props)\n        : getHeight(),\n      flyoutWidth: flyoutWidth\n        ? Helpers.evaluateProp(flyoutWidth, props)\n        : getWidth(),\n    };\n  }\n\n  getLabelProps(props: InternalEvaluatedProps, calculatedValues) {\n    const { flyoutCenter, style, labelSize, dy = 0, dx = 0 } = calculatedValues;\n    const { text, datum, activePoints, labelComponent, index, flyoutPadding } =\n      props;\n    const textAnchor =\n      (Array.isArray(style) && style.length\n        ? style[0].textAnchor\n        : style.textAnchor) || \"middle\";\n    const getLabelX = () => {\n      if (!textAnchor || textAnchor === \"middle\") {\n        return flyoutCenter.x;\n      }\n      const sign = textAnchor === \"end\" ? -1 : 1;\n      return flyoutCenter.x - sign * (labelSize.width / 2);\n    };\n    return defaults({}, labelComponent!.props, {\n      key: `${this.id}-label-${index}`,\n      text,\n      datum,\n      activePoints,\n      textAnchor,\n      dy,\n      dx,\n      style,\n      x: getLabelX() + (flyoutPadding.left - flyoutPadding.right) / 2,\n      y: flyoutCenter.y + (flyoutPadding.top - flyoutPadding.bottom) / 2,\n      verticalAnchor: \"middle\",\n      angle: style.angle,\n    });\n  }\n\n  getPointerOrientation(\n    point: { x: number; y: number },\n    center: { x: number; y: number },\n    flyoutDimensions: { height: number; width: number },\n  ): string {\n    const edges = {\n      bottom: center.y + flyoutDimensions.height / 2,\n      top: center.y - flyoutDimensions.height / 2,\n      left: center.x - flyoutDimensions.width / 2,\n      right: center.x + flyoutDimensions.width / 2,\n    };\n\n    const gaps = [\n      { side: \"top\", val: edges.top > point.y ? edges.top - point.y : -1 },\n      {\n        side: \"bottom\",\n        val: edges.bottom < point.y ? point.y - edges.bottom : -1,\n      },\n      {\n        side: \"right\",\n        val: edges.right < point.x ? point.x - edges.right : -1,\n      },\n      { side: \"left\", val: edges.left > point.x ? edges.left - point.x : -1 },\n    ];\n\n    return orderBy(gaps, \"val\", \"desc\")[0].side;\n  }\n\n  getFlyoutProps(props: InternalEvaluatedProps, calculatedValues) {\n    const { flyoutDimensions, flyoutStyle, flyoutCenter } = calculatedValues;\n    const {\n      x,\n      y,\n      dx,\n      dy,\n      datum,\n      activePoints,\n      index,\n      pointerLength,\n      pointerWidth,\n      cornerRadius,\n      events,\n      flyoutComponent,\n    } = props;\n    const pointerOrientation = Helpers.evaluateProp(\n      props.pointerOrientation,\n      props,\n    );\n    return defaults({}, flyoutComponent!.props, {\n      x,\n      y,\n      dx,\n      dy,\n      datum,\n      activePoints,\n      index,\n      pointerLength,\n      pointerWidth,\n      cornerRadius,\n      events,\n      orientation:\n        pointerOrientation ||\n        this.getPointerOrientation(\n          { x: x!, y: y! },\n          flyoutCenter,\n          flyoutDimensions,\n        ),\n      key: `${this.id}-tooltip-${index}`,\n      width: flyoutDimensions.width,\n      height: flyoutDimensions.height,\n      style: flyoutStyle,\n      center: flyoutCenter,\n    });\n  }\n\n  // Overridden in victory-core-native\n  renderTooltip(props: VictoryTooltipProps): React.ReactElement | null {\n    const active = Helpers.evaluateProp(props.active, props);\n    const { renderInPortal } = props;\n    if (!active) {\n      return null;\n    }\n    const evaluatedProps = this.getEvaluatedProps(props);\n    const { flyoutComponent, labelComponent, groupComponent } = evaluatedProps;\n    const calculatedValues = this.getCalculatedValues(evaluatedProps);\n    const children = [\n      React.cloneElement(\n        flyoutComponent!,\n        this.getFlyoutProps(evaluatedProps, calculatedValues),\n      ),\n      React.cloneElement(\n        labelComponent!,\n        this.getLabelProps(evaluatedProps, calculatedValues),\n      ),\n    ];\n    const tooltip = React.cloneElement(\n      groupComponent!,\n      { role: \"presentation\", transform: calculatedValues.transform },\n      children,\n    );\n    return renderInPortal ? <VictoryPortal>{tooltip}</VictoryPortal> : tooltip;\n  }\n\n  render(): React.ReactElement | null {\n    const props = Helpers.modifyProps(this.props, fallbackProps, \"tooltip\");\n    return this.renderTooltip(props);\n  }\n}\n"
  },
  {
    "path": "packages/victory-tooltip/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-tooltip/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-vendor/.babelrc.js",
    "content": "/**\n * Transform d3 ESM libraries to vendored CommonJS libraries\n *\n * This produces `lib-vendor/d3-<package name>/src` files that have\n * internally consistent references to other d3 packages. It is only meant\n * to be used for the CommonJS import path.\n */\nconst path = require(\"path\");\n\nmodule.exports = {\n  only: [\"node_modules/*/src/**/*.js\"],\n  plugins: [\n    [\n      \"@babel/transform-modules-commonjs\",\n      {\n        strict: false,\n        allowTopLevelThis: true,\n      },\n    ],\n    [\n      \"module-resolver\",\n      {\n        // Convert all imports for _other_ d3 dependencies to the relative\n        // path in our vendor package.\n        resolvePath(sourcePath, currentFile) {\n          const d3pattern = /^(?<pkg>(d3-[^\\/]+|internmap))(?<path>.*)/;\n          const match = d3pattern.exec(sourcePath);\n          if (match) {\n            // We're assuming a common shape of d3 packages:\n            // - Only top level imports \"d3-<whatever>\"\n            // - With no path components (like \"d3-<whatever>/path/to.js\")\n            if (match.groups.path) {\n              throw new Error(\n                `Unable to process ${sourcePath} import in ${currentFile}`,\n              );\n            }\n\n            // Get Vendor package path.\n            const vendorPkg = `lib-vendor/${match.groups.pkg}/src/index.js`;\n\n            // Derive relative path to vendor lib to have a file like move from:\n            // - 'node_modules/d3-interpolate/src/rgb.js'\n            // - 'lib-vendor/d3-interpolate/src/rgb.js'\n            // and have an import transform like:\n            // - `d3-color`\n            // - `../../d3-color`\n            const currentFileVendor = currentFile.replace(\n              /^node_modules/,\n              \"lib-vendor\",\n            );\n            const relPathToPkg = path\n              .relative(path.dirname(currentFileVendor), vendorPkg)\n              .replace(/\\\\/g, \"/\");\n\n            return relPathToPkg;\n          }\n\n          return sourcePath;\n        },\n      },\n    ],\n  ],\n};\n"
  },
  {
    "path": "packages/victory-vendor/.gitignore",
    "content": "/lib-vendor\n/d3-*\n/internmap.js\n"
  },
  {
    "path": "packages/victory-vendor/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/lib-vendor\n!/src\n!/d3-*\n!/internmap.js\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-vendor/CHANGELOG.md",
    "content": "# victory-vendor\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n## 37.3.2\n\n## 37.3.1\n\n## 37.3.0\n\n## 37.2.0\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n## 37.0.2\n\n## 37.0.1\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n## 36.9.1\n\n## 36.9.0\n\n## 36.8.6\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n## 36.8.4\n\n## 36.8.3\n\n## 36.8.2\n\n## 36.8.1\n\n## 36.8.0\n\n## 36.7.0\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n## 36.6.7\n\n## 36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Export types directly from d3-\\* (fixes [#2439](https://github.com/FormidableLabs/victory/issues/2439)) ([#2440](https://github.com/FormidableLabs/victory/pull/2440))\n\n## 36.6.4\n\n### Patch Changes\n\n- Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n## 36.6.2\n\n## 36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Update source code with minor lint-based improvements (see [#2236](https://github.com/FormidableLabs/victory/issues/2236)). ([#2403](https://github.com/FormidableLabs/victory/pull/2403))\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-vendor/README.md",
    "content": "# VictoryVendor\n\nVendored dependencies for Victory.\n\n## Background\n\nD3 has released most of its libraries as ESM-only. This means that consumers in Node.js applications can no longer just `require()` anything with a d3 transitive dependency, including much of Victory.\n\nTo help provide an easy path to folks still using CommonJS in their Node.js applications that consume Victory, we now provide this package to vendor in various d3-related packages.\n\n## Packages\n\nWe presently provide the following top-level libraries:\n<!-- cat packages/victory-vendor/package.json | egrep '\"d3-' | egrep -o 'd3-[^\"]*'| sor t-->\n\n- d3-ease\n- d3-interpolate\n- d3-scale\n- d3-shape\n- d3-timer\n\nThis is the total list of top and transitive libraries we vendor:\n<!-- ls packages/victory-vendor/lib-vendor | sort -->\n\n- d3-array\n- d3-color\n- d3-ease\n- d3-format\n- d3-interpolate\n- d3-path\n- d3-scale\n- d3-shape\n- d3-time\n- d3-time-format\n- d3-timer\n- internmap\n\nNote that this does _not_ include the following D3 libraries that still support CommonJS:\n\n- d3-voronoi\n\n## How it works\n\nWe provide two alternate paths and behaviors -- for ESM and CommonJS\n\n### ESM\n\nIf you do a Node.js import like:\n\n```js\nimport { interpolate } from \"victory-vendor/d3-interpolate\";\n```\n\nunder the hood it's going to just re-export and pass you through to `node_modules/d3-interpolate`, the **real** ESM library from D3.\n\n### CommonJS\n\nIf you do a Node.js import like:\n\n```js\nconst { interpolate } = require(\"victory-vendor/d3-interpolate\");\n```\n\nunder the hood it's going to will go to an alternate path that contains the transpiled version of the underlying d3 library to be found at `victory-vendor/lib-vendor/d3-interpolate/**/*.js`. This futher has internally consistent import references to other `victory-vendor/lib-vendor/<pkg-name>` paths.\n\nNote that for some tooling (like Jest) that doesn't play well with `package.json:exports` routing to this CommonJS path, we **also** output a root file in the form of `victory-vendor/d3-interpolate.js`.\n\n## Licenses\n\nThis project is released under the MIT license, but the vendor'ed in libraries include other licenses (e.g. ISC) that we enumerate in our `package.json:license` field.\n"
  },
  {
    "path": "packages/victory-vendor/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-vendor/package.json",
    "content": "{\n  \"name\": \"victory-vendor\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Vendored dependencies for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT AND ISC\",\n  \"exports\": {\n    \"./package.json\": \"./package.json\",\n    \"./d3-*\": {\n      \"types\": \"./d3-*.d.ts\",\n      \"import\": \"./es/d3-*.js\",\n      \"default\": \"./lib/d3-*.js\"\n    }\n  },\n  \"dependencies\": {\n    \"@types/d3-array\": \"^3.0.3\",\n    \"@types/d3-ease\": \"^3.0.0\",\n    \"@types/d3-interpolate\": \"^3.0.1\",\n    \"@types/d3-scale\": \"^4.0.2\",\n    \"@types/d3-shape\": \"^3.1.0\",\n    \"@types/d3-time\": \"^3.0.0\",\n    \"@types/d3-timer\": \"^3.0.0\",\n    \"d3-array\": \"^3.1.6\",\n    \"d3-ease\": \"^3.0.1\",\n    \"d3-interpolate\": \"^3.0.1\",\n    \"d3-scale\": \"^4.0.2\",\n    \"d3-shape\": \"^3.1.0\",\n    \"d3-time\": \"^3.0.0\",\n    \"d3-timer\": \"^3.0.1\"\n  },\n  \"devDependencies\": {\n    \"d3-color\": \"^3.1.0\",\n    \"d3-format\": \"^3.1.0\",\n    \"d3-path\": \"^3.0.1\",\n    \"d3-time-format\": \"^4.1.0\",\n    \"d3-voronoi\": \"^1.1.4\",\n    \"internmap\": \"^2.0.3\",\n    \"execa\": \"^6.1.0\",\n    \"rimraf\": \"^3.0.2\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"build\": {\n      \"command\": \"node ./scripts/build.js\",\n      \"files\": [\n        \".babelrc.js\",\n        \"scripts/build.js\",\n        \"node_modules/**\"\n      ],\n      \"output\": [\n        \"es/**\",\n        \"lib/**\",\n        \"lib-vendor/**\",\n        \"d3-*\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"dependencies\": [\n        \"build\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"dependencies\": [\n        \"build\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"dependencies\": [\n        \"build\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"dependencies\": [\n        \"build\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"echo \\\"No types to check here\\\"\",\n      \"files\": [],\n      \"output\": []\n    },\n    \"types:create\": {\n      \"dependencies\": [\n        \"build\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint scripts\",\n      \"files\": [\n        \"scripts/**\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix scripts\",\n      \"files\": [\n        \"scripts/**\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"echo victory-vendor has no tests\",\n      \"files\": [],\n      \"output\": []\n    }\n  }\n}\n"
  },
  {
    "path": "packages/victory-vendor/scripts/build.js",
    "content": "/* global __dirname:false */\n/**\n * Build d3 vendor libraries from `node_modules`.\n *\n * **Note - transitive dependencies**: Because pnpm lacks a `nohoist` option,\n * if you have a `d3-*` dependency that has a transitive dependency on another\n * module (e.g., `d3-interpolate` depends on `d3-color`) you need to add a\n * compatible version to `package.json:devDependencies` here to make sure we\n * get the library in our `node_modules` and appropriately build it.\n */\nconst fs = require(\"fs\").promises;\nconst path = require(\"path\");\nconst { promisify } = require(\"util\");\n\nconst rimraf = require(\"rimraf\");\nconst rimrafP = promisify(rimraf);\n\nconst vendorPkg = require(\"../package.json\");\nconst VENDOR_PKGS = new Set(Object.keys(vendorPkg.dependencies));\n\nconst { log, error } = console;\n\n// Templates.\nconst getEsmIndex = (pkg) => `\n// \\`victory-vendor/${pkg.name}\\` (ESM)\n// See upstream license: ${pkg.repository.url.replace(\n  /\\.git$/,\n  \"\",\n)}/blob/main/LICENSE\n//\n// Our ESM package uses the underlying installed dependencies of \\`node_modules/${\n  pkg.name\n}\\`\nexport * from \"${pkg.name}\";\n`;\n\nconst getCjsIndex = (pkg) => `\n// \\`victory-vendor/${pkg.name}\\` (CommonJS)\n// See upstream license: ${pkg.repository.url.replace(\n  /\\.git$/,\n  \"\",\n)}/blob/main/LICENSE\n//\n// Our CommonJS package relies on transpiled vendor files in \\`lib-vendor/${\n  pkg.name\n}\\`\nmodule.exports = require(\"../lib-vendor/${pkg.name}/src/index.js\");\n`;\n\nconst getCjsRootIndex = (pkg) => `\n// \\`victory-vendor/${pkg.name}\\` (CommonJS)\n// See upstream license: ${pkg.repository.url.replace(\n  /\\.git$/,\n  \"\",\n)}/blob/main/LICENSE\n//\n// This file only exists for tooling that doesn't work yet with package.json:exports\n// by proxying through the CommonJS version.\nmodule.exports = require(\"./lib/${pkg.name}\");\n`;\n\nconst getTypeDefinitionFile = (pkg) => `\n// \\`victory-vendor/${pkg.name}\\` (TypeScript)\n//\n// Export the type definitions for this package:\nexport * from \"${pkg.name}\";\n`;\n\n// Main.\nconst main = async () => {\n  // Lazy ESM imports.\n  const { execa } = await import(\"execa\");\n\n  // Get d3-related packages we want to vendor.\n  const pkgs = (\n    await fs.readdir(path.resolve(__dirname, \"../node_modules/\"))\n  ).filter((name) => /^(d3-|internmap)/.test(name));\n\n  // Safety check: we assume that **all** are flattened to root level of this\n  // package, and want to make sure there are no nested dependencies.\n  for (const pkgName of pkgs) {\n    const pkgModsPath = path.resolve(\n      __dirname,\n      `../node_modules/git${pkgName}/node_modules`,\n    );\n    const stat = await fs.lstat(pkgModsPath).catch(() => null);\n    if (stat) {\n      throw new Error(`Found nested modules: ${pkgModsPath}`);\n    }\n  }\n\n  // Clean out and ensure base library paths exist\n  const EsmBasePath = path.resolve(__dirname, `../es`);\n  const CjsBasePath = path.resolve(__dirname, `../lib`);\n  const VendorBasePath = path.resolve(__dirname, `../lib-vendor`);\n  const baseDirs = [EsmBasePath, CjsBasePath, VendorBasePath];\n  const cleanGlobs = [].concat(baseDirs, path.resolve(__dirname, \"../d3-*\"));\n\n  log(\"Cleaning old vendor directories.\");\n  await Promise.all(cleanGlobs.map((glob) => rimrafP(glob)));\n  log(\"Creating empty vendor directories.\");\n  await Promise.all(\n    baseDirs.map((libPath) => fs.mkdir(libPath, { recursive: true })),\n  );\n\n  // Transpile.\n  log(\"Transpiling vendor sources.\");\n  await execa(\n    \"pnpm\",\n    [\n      \"babel\",\n      \"--config-file\",\n      path.resolve(__dirname, \"../.babelrc.js\"),\n      \"-d\",\n      path.resolve(__dirname, \"../lib-vendor\"),\n      path.resolve(__dirname, \"../node_modules\"),\n    ],\n    {\n      stdio: \"inherit\",\n    },\n  );\n\n  // Iterate and generate index files.\n  log(\"Copying licenses and generating indexes.\");\n  for (const pkgName of pkgs) {\n    log(`- ${pkgName}`);\n\n    const pkgBase = path.resolve(__dirname, `../node_modules/${pkgName}`);\n    const pkgPath = path.join(pkgBase, `package.json`);\n    const pkg = await fs\n      .readFile(pkgPath)\n      .then((buf) => JSON.parse(buf.toString()));\n    const libVendorPath = path.resolve(__dirname, `../lib-vendor/${pkgName}`);\n\n    // Create library indexes and copy licenses to `lib-vendor.\n    await Promise.all([\n      fs.writeFile(path.join(EsmBasePath, `${pkgName}.js`), getEsmIndex(pkg)),\n      fs.writeFile(path.join(CjsBasePath, `${pkgName}.js`), getCjsIndex(pkg)),\n      fs.copyFile(\n        path.join(pkgBase, \"LICENSE\"),\n        path.join(libVendorPath, \"LICENSE\"),\n      ),\n      // Root hack file for non package.json:exports systems\n      VENDOR_PKGS.has(pkgName) &&\n        fs.writeFile(\n          path.resolve(__dirname, `../${pkgName}.js`),\n          getCjsRootIndex(pkg),\n        ),\n      // Generate TypeScript definitions\n      VENDOR_PKGS.has(pkgName) &&\n        fs.writeFile(\n          path.resolve(__dirname, `../${pkgName}.d.ts`),\n          getTypeDefinitionFile(pkg),\n        ),\n    ]);\n  }\n};\n\nif (require.main === module) {\n  main()\n    // eslint-disable-next-line promise/always-return\n    .then(() => {\n      log(\"Build finished.\");\n    })\n    .catch((err) => {\n      error(err);\n      process.exit(-1);\n    });\n}\n"
  },
  {
    "path": "packages/victory-vendor/tests/d3-array.test.ts",
    "content": "/*\n * This test verifies that these modules and types are exported correctly\n */\n\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport {\n  // @ts-expect-error Make sure invalid imports fail:\n  INVALID_TYPE,\n  Adder,\n  Bin,\n  Bisector,\n  bin,\n  bisect,\n  bisectCenter,\n  bisectLeft,\n  bisectRight,\n  bisector,\n  count,\n} from \"victory-vendor/d3-array\";\n\ndescribe(\"d3-array\", () => {\n  it(\"exports valid functions\", () => {\n    expect(bin).toBeInstanceOf(Function);\n    expect(bisect).toBeInstanceOf(Function);\n  });\n});\n"
  },
  {
    "path": "packages/victory-vendor/tests/d3-ease.test.ts",
    "content": "/*\n * This test verifies that these modules and types are exported correctly\n */\n\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport {\n  // @ts-expect-error Make sure invalid imports fail:\n  INVALID_TYPE,\n  BackEasingFactory,\n  ElasticEasingFactory,\n  easeBackIn,\n  easeBackInOut,\n  easeBackOut,\n  easeBounceIn,\n  easeBounceInOut,\n  easeBounceOut,\n  easeCircle,\n  easeCircleOut,\n  easeLinear,\n} from \"victory-vendor/d3-ease\";\n\ndescribe(\"d3-ease\", () => {\n  it(\"exports valid functions\", () => {\n    expect(easeLinear).toBeInstanceOf(Function);\n  });\n});\n"
  },
  {
    "path": "packages/victory-vendor/tests/d3-interpolate.test.ts",
    "content": "/*\n * This test verifies that these modules and types are exported correctly\n */\n\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport {\n  // @ts-expect-error Make sure invalid imports fail:\n  INVALID_TYPE,\n  interpolate,\n  NumberArray,\n} from \"victory-vendor/d3-interpolate\";\n\ndescribe(\"d3-interpolate\", () => {\n  it(\"exports valid functions\", () => {\n    expect(interpolate).toBeInstanceOf(Function);\n  });\n});\n"
  },
  {
    "path": "packages/victory-vendor/tests/d3-scale.test.ts",
    "content": "/* eslint-disable @typescript-eslint/no-unused-vars */\nimport {\n  // @ts-expect-error Make sure invalid imports fail:\n  INVALID_TYPE,\n  InterpolatorFactory,\n  NumberValue,\n  ScaleBand,\n  ScaleContinuousNumeric,\n  ScaleDiverging,\n  ScaleIdentity,\n  ScaleLinear,\n  ScaleLogarithmic,\n  ScaleOrdinal,\n  ScalePoint,\n  ScalePower,\n  ScaleQuantile,\n  ScaleQuantize,\n  ScaleRadial,\n  ScaleSequential,\n  ScaleSequentialBase,\n  ScaleSequentialQuantile,\n  ScaleSymLog,\n  ScaleThreshold,\n  ScaleTime,\n  UnknownReturnType,\n  scaleBand,\n  scaleDiverging,\n  scaleDivergingLog,\n  scaleDivergingPow,\n  scaleDivergingSqrt,\n  scaleDivergingSymlog,\n  scaleIdentity,\n  scaleImplicit,\n  scaleLinear,\n  scaleLog,\n  scaleOrdinal,\n  scalePoint,\n  scalePow,\n  scaleQuantile,\n  scaleQuantize,\n  scaleRadial,\n  scaleSequential,\n  scaleSequentialLog,\n  scaleSequentialPow,\n  scaleSequentialQuantile,\n  scaleSequentialSqrt,\n  scaleSequentialSymlog,\n  scaleSqrt,\n  scaleSymlog,\n  scaleThreshold,\n  scaleTime,\n  scaleUtc,\n  tickFormat,\n} from \"victory-vendor/d3-scale\";\n\ndescribe(\"d3-scale\", () => {\n  it(\"exports valid functions\", () => {\n    expect(scaleLinear).toBeInstanceOf(Function);\n    expect(scaleLog).toBeInstanceOf(Function);\n    expect(scalePow).toBeInstanceOf(Function);\n    expect(scaleSqrt).toBeInstanceOf(Function);\n  });\n});\n"
  },
  {
    "path": "packages/victory-vendor/tests/d3-shape.test.ts",
    "content": "/*\n * This test verifies that these modules and types are exported correctly\n */\n\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport {\n  // @ts-expect-error Make sure invalid imports fail:\n  INVALID_TYPE,\n  Arc,\n  Area,\n  arc,\n  area,\n} from \"victory-vendor/d3-shape\";\n\ndescribe(\"d3-shape\", () => {\n  it(\"exports valid functions\", () => {\n    expect(arc).toBeInstanceOf(Function);\n    expect(area).toBeInstanceOf(Function);\n  });\n});\n"
  },
  {
    "path": "packages/victory-vendor/tests/d3-time.test.ts",
    "content": "/*\n * This test verifies that these modules and types are exported correctly\n */\n\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport {\n  // @ts-expect-error Make sure invalid imports fail:\n  INVALID_TYPE,\n  CountableTimeInterval,\n  TimeInterval,\n  timeDay,\n  timeInterval,\n} from \"victory-vendor/d3-time\";\n\ndescribe(\"d3-time\", () => {\n  it(\"exports valid functions\", () => {\n    expect(timeDay).toBeInstanceOf(Function);\n    expect(timeInterval).toBeInstanceOf(Function);\n  });\n});\n"
  },
  {
    "path": "packages/victory-vendor/tests/d3-timer.test.ts",
    "content": "/*\n * This test verifies that these modules and types are exported correctly\n */\n\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport {\n  // @ts-expect-error Make sure invalid imports fail:\n  INVALID_TYPE,\n  now,\n  Timer,\n  timer,\n  timerFlush,\n  timeout,\n  interval,\n} from \"victory-vendor/d3-timer\";\n\ndescribe(\"d3-timer\", () => {\n  it(\"exports valid functions\", () => {\n    expect(timer).toBeInstanceOf(Function);\n    expect(now).toBeInstanceOf(Function);\n  });\n});\n"
  },
  {
    "path": "packages/victory-vendor/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-voronoi/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-voronoi/CHANGELOG.md",
    "content": "# victory-voronoi\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n### Patch Changes\n\n- Remove deprecated babel-plugin-lodash plugin ([#2965](https://github.com/FormidableLabs/victory/pull/2965))\n\n## 37.3.2\n\n## 37.3.1\n\n## 37.3.0\n\n## 37.2.0\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n### Patch Changes\n\n- Ensure undefined props do not overwrite defaults ([#2852](https://github.com/FormidableLabs/victory/pull/2852))\n\n## 37.0.1\n\n### Patch Changes\n\n- Fix the signature of class static functions in components ([#2840](https://github.com/FormidableLabs/victory/pull/2840))\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n### Patch Changes\n\n- Replace lodash keys with native code ([#2811](https://github.com/FormidableLabs/victory/pull/2811))\n\n* Replace lodash array utils with native code ([#2810](https://github.com/FormidableLabs/victory/pull/2810))\n\n- Replace lodash isNil and isNan with native code ([#2800](https://github.com/FormidableLabs/victory/pull/2800))\n\n* Replace lodash isFunction with native code ([#2802](https://github.com/FormidableLabs/victory/pull/2802))\n\n## 36.9.1\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n* Replace instances of lodash.range with equivalent native code ([#2760](https://github.com/FormidableLabs/victory/pull/2760))\n\n## 36.8.4\n\n## 36.8.3\n\n### Patch Changes\n\n- Migrate victory-voronoi to TypeScript ([#2726](https://github.com/FormidableLabs/victory/pull/2726))\n\n## 36.8.2\n\n## 36.8.1\n\n## 36.8.0\n\n### Patch Changes\n\n- Remove usage of defaultProps from components ([#2679](https://github.com/FormidableLabs/victory/pull/2679))\n\n## 36.7.0\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-core@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n- Updated dependencies [[`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-core@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-core@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- Updated dependencies [[`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-core@36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Update source code with minor lint-based improvements (see [#2236](https://github.com/FormidableLabs/victory/issues/2236)). ([#2403](https://github.com/FormidableLabs/victory/pull/2403))\n\n- Updated dependencies [[`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-core@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-voronoi/README.md",
    "content": "# VictoryVoronoi\n\n`victory-voronoi@^30.0.0` exports `VictoryVoronoi` and `Voronoi` components\n\nTo view documentation for `VictoryVoronoi` please see https://commerce.nearform.com/open-source/victory/docs/victory-voronoi\n\nTo suggest an addition or correction to this documentation please see https://github.com/FormidableLabs/victory/blob/main/docs/src/content/docs/victory-voronoi.md\n"
  },
  {
    "path": "packages/victory-voronoi/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-voronoi/package.json",
    "content": "{\n  \"name\": \"victory-voronoi\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Voronoi Component for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"d3-voronoi\": \"^1.1.4\",\n    \"lodash\": \"^4.17.19\",\n    \"victory-core\": \"37.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:build\",\n        \"../victory-vendor:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-voronoi/src/helper-methods.ts",
    "content": "// victory-vendor note: This module is still CommonJS, so not part of victory-vendor.\nimport { voronoi as d3Voronoi } from \"d3-voronoi\";\nimport { Helpers, LabelHelpers, Scale, Domain, Data } from \"victory-core\";\n\n// Re-export for tests\nexport { d3Voronoi as _internalD3Voronoi };\n\nconst getVoronoi = (props, range, scale) => {\n  const minRange = [Math.min(...range.x), Math.min(...range.y)];\n  const maxRange = [Math.max(...range.x), Math.max(...range.y)];\n  const angleAccessor = (d) => {\n    const x = scale.x(d._x1 !== undefined ? d._x1 : d._x);\n    return -1 * x + Math.PI / 2;\n  };\n  const xAccessor = (d) => {\n    return props.horizontal\n      ? scale.y(d._y1 !== undefined ? d._y1 : d._y)\n      : scale.x(d._x1 !== undefined ? d._x1 : d._x);\n  };\n  const yAccessor = (d) => {\n    return props.horizontal\n      ? scale.x(d._x1 !== undefined ? d._x1 : d._x)\n      : scale.y(d._y1 !== undefined ? d._y1 : d._y);\n  };\n  return d3Voronoi()\n    .x((d) => (props.polar ? angleAccessor(d) : xAccessor(d)))\n    .y((d) => yAccessor(d))\n    .extent([minRange, maxRange]);\n};\n\nconst getCalculatedValues = (props) => {\n  const defaultStyles =\n    props.theme && props.theme.voronoi && props.theme.voronoi.style\n      ? props.theme.voronoi.style\n      : {};\n  const style = Helpers.getStyles(props.style, defaultStyles);\n  const range = {\n    x: Helpers.getRange(props, \"x\"),\n    y: Helpers.getRange(props, \"y\"),\n  };\n  const domain = {\n    x: Domain.getDomain(props, \"x\"),\n    y: Domain.getDomain(props, \"y\"),\n  };\n  const scale = {\n    x: Scale.getBaseScale(props, \"x\")\n      .domain(domain.x)\n      .range(props.horizontal ? range.y : range.x),\n    y: Scale.getBaseScale(props, \"y\")\n      .domain(domain.y)\n      .range(props.horizontal ? range.x : range.y),\n  };\n\n  let data = Data.getData(props);\n  data = Data.formatDataFromDomain(data, domain);\n  // Manually remove data with null _x or _y values.\n  // Otherwise, we hit null error in: d3-voronoi/src/Cell.js\n  data = data.filter((datum) => {\n    if (datum._x === null) {\n      return false;\n    }\n    if (datum._y === null) {\n      return false;\n    }\n\n    return true;\n  });\n\n  const voronoi = getVoronoi(props, range, scale);\n  const polygons = voronoi.polygons(data);\n  const origin = props.polar\n    ? props.origin || Helpers.getPolarOrigin(props)\n    : undefined;\n  return { domain, data, scale, style, polygons, origin };\n};\n\nexport const getBaseProps = (initialProps, fallbackProps) => {\n  const modifiedProps = Helpers.modifyProps(\n    initialProps,\n    fallbackProps,\n    \"scatter\",\n  );\n  const props = Object.assign(\n    {},\n    modifiedProps,\n    getCalculatedValues(modifiedProps),\n  );\n  const {\n    data,\n    domain,\n    events,\n    height,\n    origin,\n    padding,\n    polar,\n    polygons,\n    scale,\n    sharedEvents,\n    standalone,\n    style,\n    theme,\n    width,\n    labels,\n    name,\n  } = props;\n  const initialChildProps = {\n    parent: {\n      style: style.parent,\n      scale,\n      domain,\n      data,\n      standalone,\n      height,\n      width,\n      theme,\n      origin,\n      polar,\n      padding,\n      name,\n    },\n  };\n\n  return data.reduce((childProps, datum, index) => {\n    const polygon = polygons[index]?.filter((value) => value !== \"data\");\n    const eventKey = !Helpers.isNil(datum.eventKey) ? datum.eventKey : index;\n    const { x, y } = Helpers.scalePoint(props, datum);\n    const dataProps = {\n      x,\n      y,\n      datum,\n      data,\n      index,\n      scale,\n      polygon,\n      origin,\n      size: props.size,\n      style: style.data,\n    };\n\n    childProps[eventKey] = { data: dataProps };\n    const text = LabelHelpers.getText(props, datum, index);\n    if (\n      (text !== undefined && text !== null) ||\n      (labels && (events || sharedEvents))\n    ) {\n      childProps[eventKey].labels = LabelHelpers.getProps(props, index);\n    }\n\n    return childProps;\n  }, initialChildProps);\n};\n"
  },
  {
    "path": "packages/victory-voronoi/src/index.ts",
    "content": "export * from \"./victory-voronoi\";\nexport * from \"./voronoi\";\n"
  },
  {
    "path": "packages/victory-voronoi/src/victory-voronoi.test.tsx",
    "content": "import React from \"react\";\nimport random from \"lodash/random\";\nimport { fireEvent, render, screen } from \"@testing-library/react\";\nimport { Helpers } from \"victory-core\";\n\nimport { calculateD3Path } from \"../../../test/helpers\";\nimport { VictoryVoronoi, VictoryVoronoiProps } from \"./victory-voronoi\";\nimport { Voronoi } from \"./voronoi\";\n\ndescribe(\"components/victory-voronoi\", () => {\n  describe(\"default component rendering\", () => {\n    it(\"accepts user props\", () => {\n      const { container } = render(\n        <VictoryVoronoi data-testid=\"victory-voronoi\" aria-label=\"Chart\" />,\n      );\n\n      const svgNode = container.querySelector(\"svg\");\n      expect(svgNode).toHaveAttribute(\"data-testid\", \"victory-voronoi\");\n      expect(svgNode).toHaveAttribute(\"aria-label\", \"Chart\");\n    });\n\n    it(\"renders an svg with the correct width and height\", () => {\n      const { container } = render(<VictoryVoronoi />);\n      const svg = container.querySelector(\"svg\");\n      expect(svg?.style.width).toEqual(\"100%\");\n      expect(svg?.style.height).toEqual(\"100%\");\n    });\n\n    it(\"renders an svg with the correct viewbox\", () => {\n      const { container } = render(<VictoryVoronoi />);\n      const svg = container.querySelector(\"svg\");\n      const viewBoxValue = `0 0 ${450} ${300}`;\n      expect(svg).toHaveAttribute(\"viewBox\", viewBoxValue);\n    });\n  });\n\n  describe(\"component rendering with data\", () => {\n    it(\"renders the correct d3 path\", () => {\n      const props: VictoryVoronoiProps = {\n        width: 400,\n        height: 300,\n        padding: 50,\n        domain: { x: [0, 5], y: [0, 5] },\n        data: [\n          { x: 0, y: 0 },\n          { x: 2, y: 3 },\n          { x: 4, y: 1 },\n        ],\n      };\n      const { container } = render(<VictoryVoronoi {...props} />);\n\n      expect(container.querySelector(\"path\")).toHaveAttribute(\n        \"d\",\n        calculateD3Path(props, \"voronoi\", 0),\n      );\n    });\n\n    it(\"sorts data by sortKey prop\", () => {\n      const data = Helpers.range(5)\n        .map((i) => ({ x: i, y: i }))\n        .reverse();\n      render(\n        <VictoryVoronoi\n          data={data}\n          sortKey=\"x\"\n          dataComponent={\n            <Voronoi data-testid=\"voronoi-1\" data-props-json={JSON.stringify} />\n          }\n        />,\n      );\n\n      const renderedDataProps = screen\n        .getAllByTestId(\"voronoi-1\")\n        .map((node) => JSON.parse(node.getAttribute(\"data-props-json\") || \"\"));\n      expect(renderedDataProps.map((props) => props.datum._x)).toEqual([\n        0, 1, 2, 3, 4,\n      ]);\n    });\n\n    it(\"reverses sorted data with the sortOrder prop\", () => {\n      const data = Helpers.range(5)\n        .map((i) => ({ x: i, y: i }))\n        .reverse();\n      render(\n        <VictoryVoronoi\n          data={data}\n          sortKey=\"x\"\n          sortOrder=\"descending\"\n          dataComponent={\n            <Voronoi data-testid=\"voronoi-1\" data-props-json={JSON.stringify} />\n          }\n        />,\n      );\n\n      const renderedDataProps = screen\n        .getAllByTestId(\"voronoi-1\")\n        .map((node) => JSON.parse(node.getAttribute(\"data-props-json\") || \"\"));\n\n      expect(renderedDataProps.map((props) => props.datum._x)).toEqual([\n        4, 3, 2, 1, 0,\n      ]);\n    });\n\n    it(\"does not render data with null x or y values\", () => {\n      const data = [\n        { x: 1, y: 2 },\n        { x: null, y: 4 },\n        { x: 5, y: null },\n        { x: 1, y: 2 },\n      ];\n      const { container } = render(<VictoryVoronoi data={data} />);\n      const paths = container.querySelectorAll(\"path\");\n      expect(paths).toHaveLength(2);\n    });\n  });\n\n  describe(\"event handling\", () => {\n    it(\"attaches an event to the parent svg\", () => {\n      const clickHandler = jest.fn();\n      const { container } = render(\n        <VictoryVoronoi\n          events={[\n            {\n              target: \"parent\",\n              eventHandlers: { onClick: clickHandler },\n            },\n          ]}\n        />,\n      );\n      const svg = container.querySelector(\"svg\");\n      fireEvent.click(svg!);\n      expect(clickHandler).toBeCalled();\n      // the first argument is the standard evt object\n      expect(Object.keys(clickHandler.mock.calls[0][1])).toEqual(\n        expect.arrayContaining([\"data\", \"scale\", \"width\", \"height\", \"style\"]),\n      );\n    });\n\n    it(\"attaches an event to data\", () => {\n      const clickHandler = jest.fn();\n      const { container } = render(\n        <VictoryVoronoi\n          events={[\n            {\n              target: \"data\",\n              eventHandlers: { onClick: clickHandler },\n            },\n          ]}\n        />,\n      );\n      const data = container.querySelectorAll(\"path\");\n      expect(data).toHaveLength(51);\n      data.forEach((node, index) => {\n        clickHandler.mockClear();\n\n        fireEvent.click(node);\n\n        expect(clickHandler).toBeCalled();\n        // the first argument is the standard evt object\n        const [, evProps, evIndex] = clickHandler.mock.calls[0];\n        expect(evProps).toMatchObject({ id: `voronoi-data-${index}` });\n        expect(evIndex).toEqual(`${index}`);\n      });\n    });\n\n    it(\"attaches an event to a label\", () => {\n      const clickHandler = jest.fn();\n      const { container } = render(\n        <VictoryVoronoi\n          labels={[\"okay\"]}\n          events={[\n            {\n              target: \"labels\",\n              eventHandlers: { onClick: clickHandler },\n            },\n          ]}\n        />,\n      );\n\n      const labels = container.querySelectorAll(\"text\");\n\n      expect(labels).toHaveLength(1);\n\n      labels.forEach((node, index) => {\n        clickHandler.mockClear();\n\n        fireEvent.click(node);\n\n        expect(clickHandler).toBeCalled();\n        // the first argument is the standard evt object\n        const [, evProps, evIndex] = clickHandler.mock.calls[0];\n        expect(evProps).toMatchObject({ text: \"okay\" });\n        expect(evIndex).toEqual(`${index}`);\n      });\n    });\n  });\n\n  describe(\"accessibility\", () => {\n    it(\"adds an aria role to the path area\", () => {\n      const { container } = render(<VictoryVoronoi />);\n      const paths = container.querySelectorAll(\"path\");\n      expect(paths).toHaveLength(51);\n      paths.forEach((p) => {\n        expect(p).toHaveAttribute(\"role\", \"presentation\");\n      });\n    });\n\n    it(\"adds an aria-label and tabindex to Voronoi primitive\", () => {\n      const data = Helpers.range(3, 6).map((x) => ({ x, y: random(5) }));\n      const { container } = render(\n        <VictoryVoronoi\n          data={data}\n          dataComponent={\n            <Voronoi\n              ariaLabel={({ datum }) => `${datum.x}`}\n              tabIndex={({ index }) => Number(index) + 6}\n            />\n          }\n        />,\n      );\n      const paths = container.querySelectorAll(\"path\");\n      expect(paths).toHaveLength(3);\n      paths.forEach((p, i) => {\n        expect(p).toHaveAttribute(\"aria-label\", `${data[i].x}`);\n        expect(p).toHaveAttribute(\"tabindex\", `${i + 6}`);\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "packages/victory-voronoi/src/victory-voronoi.tsx",
    "content": "import React from \"react\";\nimport {\n  Helpers,\n  VictoryLabel,\n  addEvents,\n  VictoryContainer,\n  VictoryTheme,\n  DefaultTransitions,\n  Data,\n  Domain,\n  UserProps,\n  EventPropTypeInterface,\n  EventsMixinClass,\n  VictoryCommonProps,\n  VictoryDatableProps,\n  VictoryLabelableProps,\n  VictoryMultiLabelableProps,\n  VictoryStyleInterface,\n} from \"victory-core\";\nimport { Voronoi } from \"./voronoi\";\nimport { getBaseProps } from \"./helper-methods\";\n\nexport type VictoryVoronoiSortOrderType = \"ascending\" | \"descending\";\n\nexport interface VictoryVoronoiProps\n  extends Omit<VictoryCommonProps, \"polar\">,\n    VictoryDatableProps,\n    VictoryLabelableProps,\n    VictoryMultiLabelableProps {\n  events?: EventPropTypeInterface<\n    string,\n    string | number | (string | number)[]\n  >[];\n  type?: number;\n  sortOrder?: VictoryVoronoiSortOrderType;\n  size?: number | { (data: any): number };\n  style?: VictoryStyleInterface;\n}\n\nconst fallbackProps = {\n  width: 450,\n  height: 300,\n  padding: 50,\n};\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface VictoryVoronoiBase extends EventsMixinClass<VictoryVoronoiProps> {}\n\nclass VictoryVoronoiBase extends React.Component<VictoryVoronoiProps> {\n  static animationWhitelist: (keyof VictoryVoronoiProps)[] = [\n    \"data\",\n    \"domain\",\n    \"height\",\n    \"padding\",\n    \"samples\",\n    \"size\",\n    \"style\",\n    \"width\",\n  ];\n\n  static displayName = \"VictoryVoronoi\";\n  static role = \"voronoi\";\n  static defaultTransitions = DefaultTransitions.discreteTransitions();\n\n  static defaultProps: VictoryVoronoiProps = {\n    containerComponent: <VictoryContainer />,\n    dataComponent: <Voronoi />,\n    labelComponent: <VictoryLabel />,\n    groupComponent: <g role=\"presentation\" />,\n    samples: 50,\n    sortOrder: \"ascending\",\n    standalone: true,\n    theme: VictoryTheme.grayscale,\n  };\n\n  static getDomain = Domain.getDomain;\n  static getData = Data.getData;\n  static getBaseProps(props: VictoryVoronoiProps) {\n    return getBaseProps(props, fallbackProps);\n  }\n  static expectedComponents: (keyof VictoryVoronoiProps)[] = [\n    \"dataComponent\",\n    \"labelComponent\",\n    \"groupComponent\",\n    \"containerComponent\",\n  ];\n\n  // Overridden in native versions\n  shouldAnimate() {\n    return !!this.props.animate;\n  }\n\n  render(): React.ReactElement {\n    const { animationWhitelist, role } = VictoryVoronoi;\n    const props = Helpers.modifyProps(this.props, fallbackProps, role);\n\n    if (this.shouldAnimate()) {\n      return this.animateComponent(props, animationWhitelist);\n    }\n\n    const children = this.renderData(props);\n\n    const component = props.standalone\n      ? this.renderContainer(props.containerComponent, children)\n      : children;\n\n    return UserProps.withSafeUserProps(component, props);\n  }\n}\n\nexport const VictoryVoronoi = addEvents(VictoryVoronoiBase);\n"
  },
  {
    "path": "packages/victory-voronoi/src/voronoi.tsx",
    "content": "import React from \"react\";\nimport defaults from \"lodash/defaults\";\n\nimport {\n  Helpers,\n  ClipPath,\n  Path,\n  Circle,\n  UserProps,\n  VictoryCommonPrimitiveProps,\n} from \"victory-core\";\n\nexport interface VoronoiProps extends VictoryCommonPrimitiveProps {\n  circleComponent?: React.ReactElement;\n  clipId?: number | string;\n  clipPathComponent?: React.ReactElement;\n  datum?: any;\n  groupComponent?: React.ReactElement;\n  pathComponent?: React.ReactElement;\n  polygon?: [];\n  size?: number;\n  x?: number;\n  y?: number;\n}\n\nconst getVoronoiPath = (props: VoronoiProps) => {\n  const { polygon } = props;\n  return Array.isArray(polygon) && polygon.length\n    ? `M ${props.polygon?.join(\"L\")} Z`\n    : \"\";\n};\n\nfunction evaluateProps<T extends VoronoiProps>(props: T) {\n  /**\n   * Potential evaluated props are:\n   * `aria-label`\n   * `id`\n   * `size`\n   * `style`\n   * `tabIndex\n   */\n  const ariaLabel = Helpers.evaluateProp(props.ariaLabel, props);\n  const id = Helpers.evaluateProp(props.id, props);\n  const size = Helpers.evaluateProp(props.size, props);\n  const style = Helpers.evaluateStyle(props.style, props);\n  const tabIndex = Helpers.evaluateProp(props.tabIndex, props);\n  return Object.assign({}, props, { ariaLabel, id, size, style, tabIndex });\n}\n\nconst defaultProps = {\n  pathComponent: <Path />,\n  circleComponent: <Circle />,\n  clipPathComponent: <ClipPath />,\n  groupComponent: <g />,\n  role: \"presentation\",\n  shapeRendering: \"auto\",\n};\n\nexport const Voronoi = (initialProps: VoronoiProps) => {\n  const props = evaluateProps(defaults({}, initialProps, defaultProps));\n  const {\n    ariaLabel,\n    role,\n    shapeRendering,\n    className,\n    events,\n    transform,\n    style,\n    size,\n    tabIndex,\n  } = props;\n\n  const voronoiPath = getVoronoiPath(props);\n  const sharedProps = {\n    \"aria-label\": ariaLabel,\n    className,\n    role,\n    shapeRendering,\n    style,\n    tabIndex,\n    transform,\n    ...events,\n  };\n  const userProps = UserProps.getSafeUserProps(props);\n\n  if (size) {\n    const circle = React.cloneElement(props.circleComponent, {\n      ...sharedProps,\n      key: `${props.id}-circle-clip`,\n      clipPath: `url(#${props.clipId})`,\n      cx: props.x,\n      cy: props.y,\n      r: size,\n    });\n\n    const voronoiClipPath = React.cloneElement(\n      props.clipPathComponent,\n      { key: `${props.id}-voronoi-clip`, clipId: props.clipId },\n      React.cloneElement(props.pathComponent, { d: voronoiPath, className }),\n    );\n\n    return React.cloneElement(props.groupComponent, {}, [\n      voronoiClipPath,\n      circle,\n    ]);\n  }\n\n  return React.cloneElement(props.pathComponent, {\n    ...sharedProps,\n    ...userProps,\n    d: voronoiPath,\n  });\n};\n"
  },
  {
    "path": "packages/victory-voronoi/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-voronoi/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-voronoi-container/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-voronoi-container/CHANGELOG.md",
    "content": "# victory-voronoi-container\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n### Patch Changes\n\n- Remove deprecated babel-plugin-lodash plugin ([#2965](https://github.com/FormidableLabs/victory/pull/2965))\n\n* Improve types in victory-core helpers ([#2999](https://github.com/FormidableLabs/victory/pull/2999))\n\n## 37.3.2\n\n## 37.3.1\n\n## 37.3.0\n\n## 37.2.0\n\n### Patch Changes\n\n- Fix: #2369 `<VictoryVoronoiContainer/>` tooltip breaks when mouse moves quickly between different charts ([#2911](https://github.com/FormidableLabs/victory/pull/2911))\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n## 37.1.0\n\n### Minor Changes\n\n- Refactor containers and portal to function components ([#2799](https://github.com/FormidableLabs/victory/pull/2799))\n\n* Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n## 37.0.1\n\n### Patch Changes\n\n- Fix the signature of class static functions in components ([#2840](https://github.com/FormidableLabs/victory/pull/2840))\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n### Patch Changes\n\n- Replace lodash keys with native code ([#2811](https://github.com/FormidableLabs/victory/pull/2811))\n\n* Replace lodash isString with native equivalent ([#2827](https://github.com/FormidableLabs/victory/pull/2827))\n\n- Replace lodash array utils with native code ([#2810](https://github.com/FormidableLabs/victory/pull/2810))\n\n* Replace lodash isFunction with native code ([#2802](https://github.com/FormidableLabs/victory/pull/2802))\n\n## 36.9.1\n\n### Patch Changes\n\n- Fix victory-native component prop types ([#2785](https://github.com/FormidableLabs/victory/pull/2785))\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n## 36.8.4\n\n## 36.8.3\n\n### Patch Changes\n\n- Migrate victory-voronoi-container to TypeScript ([#2727](https://github.com/FormidableLabs/victory/pull/2727))\n\n* Refactor param reassignments ([#2724](https://github.com/FormidableLabs/victory/pull/2724))\n\n## 36.8.2\n\n## 36.8.1\n\n## 36.8.0\n\n## 36.7.0\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.8\n  - victory-tooltip@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.7\n  - victory-tooltip@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Improved the exported types (fixes [#2451](https://github.com/FormidableLabs/victory/issues/2451)) ([#2452](https://github.com/FormidableLabs/victory/pull/2452))\n\n- Updated dependencies []:\n  - victory-core@36.6.6\n  - victory-tooltip@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-core@36.6.5\n  - victory-tooltip@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Added explicit `any` type defs (fixes [#2358](https://github.com/FormidableLabs/victory/issues/2358)) ([`57ed0fe30`](https://github.com/FormidableLabs/victory/commit/57ed0fe304dbc8753da1126a02d44de8004e96aa))\n\n* Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n* Updated dependencies [[`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-core@36.6.4\n  - victory-tooltip@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-core@36.6.3\n  - victory-tooltip@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.2\n  - victory-tooltip@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- Updated dependencies [[`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-core@36.6.1\n  - victory-tooltip@36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Update source code with minor lint-based improvements (see [#2236](https://github.com/FormidableLabs/victory/issues/2236)). ([#2403](https://github.com/FormidableLabs/victory/pull/2403))\n\n- Updated dependencies [[`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-core@36.6.0\n  - victory-tooltip@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-voronoi-container/README.md",
    "content": "# VictoryVoronoiContainer\n\n`victory-voronoi-container@^30.0.0` exports `VictoryVoronoiContainer`, `voronoiContainerMixin` and `VoronoiHelpers`\n\nTo view documentation for `VictoryVoronoiContainer` please see https://commerce.nearform.com/open-source/victory/docs/victory-voronoi-container\n\nTo suggest an addition or correction to this documentation please see https://github.com/FormidableLabs/victory/blob/main/docs/src/content/docs/victory-voronoi-container.md\n"
  },
  {
    "path": "packages/victory-voronoi-container/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-voronoi-container/package.json",
    "content": "{\n  \"name\": \"victory-voronoi-container\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Interactive Voronoi Mouseover Component for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"delaunay-find\": \"0.0.6\",\n    \"lodash\": \"^4.17.19\",\n    \"react-fast-compare\": \"^3.2.0\",\n    \"victory-core\": \"37.3.6\",\n    \"victory-tooltip\": \"37.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\",\n        \"../victory-tooltip:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:cjs\",\n        \"../victory-tooltip:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\",\n        \"../victory-tooltip:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\",\n        \"../victory-tooltip:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-tooltip:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-tooltip:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-tooltip:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-tooltip:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:build\",\n        \"../victory-tooltip:build\",\n        \"../victory-vendor:build\",\n        \"../victory-voronoi:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-voronoi-container/src/index.ts",
    "content": "export * from \"./victory-voronoi-container\";\nexport * from \"./voronoi-helpers\";\n"
  },
  {
    "path": "packages/victory-voronoi-container/src/victory-voronoi-container.tsx",
    "content": "import React from \"react\";\nimport defaults from \"lodash/defaults\";\nimport pick from \"lodash/pick\";\nimport { VictoryTooltip } from \"victory-tooltip\";\nimport {\n  Helpers,\n  VictoryContainerProps,\n  PaddingProps,\n  VictoryContainer,\n  VictoryEventHandler,\n} from \"victory-core\";\nimport { VoronoiHelpers } from \"./voronoi-helpers\";\n\nexport interface VictoryVoronoiContainerProps extends VictoryContainerProps {\n  activateData?: boolean;\n  activateLabels?: boolean;\n  disable?: boolean;\n  labels?: (point: any, index?: number, points?: any[]) => string;\n  labelComponent?: React.ReactElement;\n  mouseFollowTooltips?: boolean;\n  onActivated?: (points: any[], props: VictoryVoronoiContainerProps) => void;\n  onDeactivated?: (points: any[], props: VictoryVoronoiContainerProps) => void;\n  radius?: number;\n  voronoiBlacklist?: (string | RegExp)[];\n  voronoiDimension?: \"x\" | \"y\";\n  voronoiPadding?: PaddingProps;\n  horizontal?: boolean;\n}\n\ninterface VictoryVoronoiContainerMutatedProps\n  extends VictoryVoronoiContainerProps {\n  mousePosition: { x: number; y: number };\n  activePoints: any[];\n}\n\nexport const VICTORY_VORONOI_CONTAINER_DEFAULT_PROPS = {\n  activateData: true,\n  activateLabels: true,\n  labelComponent: <VictoryTooltip />,\n  voronoiPadding: 5,\n};\n\nconst getPoint = (point) => {\n  const whitelist = [\"_x\", \"_x1\", \"_x0\", \"_y\", \"_y1\", \"_y0\"];\n  return pick(point, whitelist);\n};\n\nexport const useVictoryVoronoiContainer = (\n  initialProps: VictoryVoronoiContainerProps,\n) => {\n  const props = {\n    ...VICTORY_VORONOI_CONTAINER_DEFAULT_PROPS,\n    ...(initialProps as VictoryVoronoiContainerMutatedProps),\n  };\n  const { children } = props;\n\n  const getDimension = () => {\n    const { horizontal, voronoiDimension } = props;\n    if (!horizontal || !voronoiDimension) {\n      return voronoiDimension;\n    }\n    return voronoiDimension === \"x\" ? \"y\" : \"x\";\n  };\n\n  const getLabelPosition = (labelProps, points) => {\n    const { mousePosition, mouseFollowTooltips } = props;\n    const voronoiDimension = getDimension();\n    const point = getPoint(points[0]);\n\n    // @ts-expect-error scale is defined but the types do not reflect that\n    const basePosition = Helpers.scalePoint(props, point);\n\n    let center = mouseFollowTooltips ? mousePosition : undefined;\n    if (!voronoiDimension || points.length < 2) {\n      return {\n        ...basePosition,\n        center: defaults({}, labelProps.center, center),\n      };\n    }\n\n    const x = voronoiDimension === \"y\" ? mousePosition.x : basePosition.x;\n    const y = voronoiDimension === \"x\" ? mousePosition.y : basePosition.y;\n    center = mouseFollowTooltips ? mousePosition : { x, y };\n    return { x, y, center: defaults({}, labelProps.center, center) };\n  };\n\n  const getStyle = (points, type) => {\n    const { labels, labelComponent, theme } = props;\n    const componentProps = labelComponent.props || {};\n    const themeStyles =\n      theme && theme.voronoi && theme.voronoi.style ? theme.voronoi.style : {};\n    const componentStyleArray =\n      type === \"flyout\" ? componentProps.flyoutStyle : componentProps.style;\n    return points.reduce((memo, datum, index) => {\n      const labelProps = defaults({}, componentProps, {\n        datum,\n        active: true,\n      });\n      const text = Helpers.isFunction(labels) ? labels(labelProps) : undefined;\n      const textArray = text !== undefined ? `${text}`.split(\"\\n\") : [];\n      const baseStyle = (datum.style && datum.style[type]) || {};\n      const componentStyle = Array.isArray(componentStyleArray)\n        ? componentStyleArray[index]\n        : componentStyleArray;\n      const style = Helpers.evaluateStyle(\n        defaults({}, componentStyle, baseStyle, themeStyles[type]),\n        labelProps,\n      );\n      const styleArray = textArray.length\n        ? textArray.map(() => style)\n        : [style];\n      return memo.concat(styleArray);\n    }, []);\n  };\n\n  const getDefaultLabelProps = (points) => {\n    const { voronoiDimension, horizontal, mouseFollowTooltips } = props;\n    const point = getPoint(points[0]);\n    const multiPoint = voronoiDimension && points.length > 1;\n    const y = point._y1 !== undefined ? point._y1 : point._y;\n    const defaultHorizontalOrientation = y < 0 ? \"left\" : \"right\";\n    const defaultOrientation = y < 0 ? \"bottom\" : \"top\";\n    const labelOrientation = horizontal\n      ? defaultHorizontalOrientation\n      : defaultOrientation;\n    const orientation = mouseFollowTooltips ? undefined : labelOrientation;\n    return {\n      orientation,\n      pointerLength: multiPoint ? 0 : undefined,\n      constrainToVisibleArea:\n        multiPoint || mouseFollowTooltips ? true : undefined,\n    };\n  };\n\n  const getLabelProps = (points) => {\n    const { labels, scale, labelComponent, theme, width, height } = props;\n    const componentProps = labelComponent.props || {};\n    const text = points.reduce((memo, datum) => {\n      const labelProps = defaults({}, componentProps, {\n        datum,\n        active: true,\n      });\n      const t = Helpers.isFunction(labels) ? labels(labelProps) : null;\n      if (t === null || t === undefined) {\n        return memo;\n      }\n      return memo.concat(`${t}`.split(\"\\n\"));\n    }, []);\n\n    // remove properties from first point to make datum\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    const { childName, eventKey, style, continuous, ...datum } = points[0];\n    const name =\n      props.name === childName ? childName : `${props.name}-${childName}`;\n    const labelProps = defaults(\n      {\n        key: `${name}-${eventKey}-voronoi-tooltip`,\n        id: `${name}-${eventKey}-voronoi-tooltip`,\n        active: true,\n        renderInPortal: false,\n        activePoints: points,\n        datum,\n        scale,\n        theme,\n      },\n      componentProps,\n      {\n        text,\n        width,\n        height,\n        style: getStyle(points, \"labels\"),\n        flyoutStyle: getStyle(points, \"flyout\")[0],\n      },\n      getDefaultLabelProps(points),\n    );\n    const labelPosition = getLabelPosition(labelProps, points);\n\n    return defaults({}, labelPosition, labelProps);\n  };\n\n  const getTooltip = () => {\n    const { labels, activePoints, labelComponent } = props;\n    if (!labels) {\n      return null;\n    }\n    if (Array.isArray(activePoints) && activePoints.length) {\n      const labelProps = getLabelProps(activePoints);\n      const { text } = labelProps;\n      const showLabel = Array.isArray(text)\n        ? text.filter(Boolean).length\n        : text;\n      return showLabel ? React.cloneElement(labelComponent, labelProps) : null;\n    }\n    return null;\n  };\n\n  return {\n    props,\n    children: [\n      ...React.Children.toArray(children),\n      getTooltip(),\n    ] as React.ReactElement[],\n  };\n};\n\nexport const VictoryVoronoiContainer = (\n  initialProps: VictoryVoronoiContainerProps,\n) => {\n  const { props, children } = useVictoryVoronoiContainer(initialProps);\n  return <VictoryContainer {...props}>{children}</VictoryContainer>;\n};\n\nVictoryVoronoiContainer.role = \"container\";\n\nVictoryVoronoiContainer.defaultEvents = (\n  initialProps: VictoryVoronoiContainerProps,\n) => {\n  const props = { ...VICTORY_VORONOI_CONTAINER_DEFAULT_PROPS, ...initialProps };\n  const createEventHandler =\n    (handler: VictoryEventHandler, disabled?: boolean): VictoryEventHandler =>\n    // eslint-disable-next-line max-params\n    (event, targetProps, eventKey, context) =>\n      disabled || props.disable\n        ? {}\n        : handler(event, { ...props, ...targetProps }, eventKey, context);\n\n  return [\n    {\n      target: \"parent\",\n      eventHandlers: {\n        onMouseLeave: createEventHandler(VoronoiHelpers.onMouseLeave),\n        onTouchCancel: createEventHandler(VoronoiHelpers.onMouseLeave),\n        onMouseMove: createEventHandler(VoronoiHelpers.onMouseMove),\n        onTouchMove: createEventHandler(VoronoiHelpers.onMouseMove),\n      },\n    },\n    {\n      target: \"data\",\n      eventHandlers: props.disable\n        ? {}\n        : {\n            onMouseOver: () => null,\n            onMouseOut: () => null,\n            onMouseMove: () => null,\n          },\n    },\n  ];\n};\n"
  },
  {
    "path": "packages/victory-voronoi-container/src/voronoi-helpers.ts",
    "content": "import { Collection, Selection, Data, Helpers } from \"victory-core\";\nimport isEmpty from \"lodash/isEmpty\";\nimport isRegExp from \"lodash/isRegExp\";\nimport throttle from \"lodash/throttle\";\nimport isEqual from \"react-fast-compare\";\nimport Delaunay from \"delaunay-find/lib/index.js\";\nimport React from \"react\";\n\nconst ON_MOUSE_MOVE_THROTTLE_MS = 32;\n\nclass VoronoiHelpersClass {\n  withinBounds(props, point) {\n    const { width, height, polar, origin, scale } = props;\n    const padding = Helpers.getPadding(props.voronoiPadding);\n    const { x, y } = point;\n    if (polar) {\n      const distanceSquared =\n        Math.pow(x - origin.x, 2) + Math.pow(y - origin.y, 2);\n      const radius = Math.max(...scale.y.range());\n      return distanceSquared < Math.pow(radius, 2);\n    }\n    return (\n      x >= padding.left &&\n      x <= width - padding.right &&\n      y >= padding.top &&\n      y <= height - padding.bottom\n    );\n  }\n\n  getDatasets(props) {\n    const minDomain = {\n      x: Collection.getMinValue(props.domain.x),\n      y: Collection.getMinValue(props.domain.y),\n    };\n    const children = React.Children.toArray(props.children);\n    const addMeta = (data, name?, child?) => {\n      const continuous = child && child.type && child.type.continuous;\n      const style = child ? child.props && child.props.style : props.style;\n      return data.map((datum, index) => {\n        const { x, y, y0, x0 } = Helpers.getPoint(datum);\n        const voronoiX = (Number(x) + Number(x0)) / 2;\n        const voronoiY = (Number(y) + Number(y0)) / 2;\n\n        return Object.assign(\n          {\n            _voronoiX: props.voronoiDimension === \"y\" ? minDomain.x : voronoiX,\n            _voronoiY: props.voronoiDimension === \"x\" ? minDomain.y : voronoiY,\n            eventKey: index,\n            childName: name,\n            continuous,\n            style,\n          },\n          datum,\n        );\n      });\n    };\n\n    if (props.data) {\n      return addMeta(props.data);\n    }\n\n    const getData = (childProps) => {\n      const data = Data.getData(childProps);\n      return Array.isArray(data) && data.length > 0 ? data : undefined;\n    };\n\n    const iteratee = (child, childName) => {\n      const childProps = child.props || {};\n      const name = childProps.name || childName;\n      const blacklist = props.voronoiBlacklist || [];\n      const blacklistStr = blacklist.filter(\n        (value) => !!value && typeof value.valueOf() === \"string\",\n      );\n      const blacklistRegExp = blacklist.filter(isRegExp);\n      const isRegExpMatch = blacklistRegExp.some((regExp) => regExp.test(name));\n      if (\n        !Data.isDataComponent(child) ||\n        blacklistStr.includes(name) ||\n        isRegExpMatch\n      ) {\n        return null;\n      }\n      const getChildData =\n        child.type && Helpers.isFunction(child.type.getData)\n          ? child.type.getData\n          : getData;\n      const childData = getChildData(child.props);\n      return childData ? addMeta(childData, name, child) : null;\n    };\n\n    return Helpers.reduceChildren(children, iteratee, props);\n  }\n\n  findPoints(datasets, point) {\n    return datasets.filter((d) => {\n      return point._voronoiX === d._voronoiX && point._voronoiY === d._voronoiY;\n    });\n  }\n\n  withinRadius(point, mousePosition, radius) {\n    if (!point) {\n      return false;\n    }\n    if (!radius) {\n      return true;\n    }\n    const { x, y } = mousePosition;\n    const distanceSquared =\n      Math.pow(x - point[0], 2) + Math.pow(y - point[1], 2);\n    return distanceSquared < Math.pow(radius, 2);\n  }\n\n  getVoronoiPoints(props, mousePosition) {\n    const datasets = this.getDatasets(props);\n    const scaledData = datasets.map((d) => {\n      const { x, y } = Helpers.scalePoint(props, d);\n      return [x, y];\n    });\n    const delaunay = Delaunay.from(scaledData);\n    const index = delaunay.find(mousePosition.x, mousePosition.y);\n    const withinRadius = this.withinRadius(\n      scaledData[index],\n      mousePosition,\n      props.radius,\n    );\n    const points = withinRadius\n      ? this.findPoints(datasets, datasets[index])\n      : [];\n    return { points, index };\n  }\n\n  getActiveMutations(props, point) {\n    const { childName, continuous } = point;\n    const { activateData, activateLabels, labels } = props;\n    if (!activateData && !activateLabels) {\n      return [];\n    }\n    const defaultTarget = activateData ? [\"data\"] : [];\n    const targets =\n      labels && !activateLabels\n        ? defaultTarget\n        : defaultTarget.concat(\"labels\");\n    if (isEmpty(targets)) {\n      return [];\n    }\n    return targets.map((target) => {\n      const eventKey =\n        continuous === true && target === \"data\" ? \"all\" : point.eventKey;\n      return {\n        childName,\n        eventKey,\n        target,\n        mutation: () => ({ active: true }),\n      };\n    });\n  }\n\n  getInactiveMutations(props, point) {\n    const { childName, continuous } = point;\n    const { activateData, activateLabels, labels } = props;\n    if (!activateData && !activateLabels) {\n      return [];\n    }\n    const defaultTarget = activateData ? [\"data\"] : [];\n    const targets =\n      labels && !activateLabels\n        ? defaultTarget\n        : defaultTarget.concat(\"labels\");\n    if (isEmpty(targets)) {\n      return [];\n    }\n    return targets.map((target) => {\n      const eventKey = continuous && target === \"data\" ? \"all\" : point.eventKey;\n      return {\n        childName,\n        eventKey,\n        target,\n        mutation: () => null,\n      };\n    });\n  }\n\n  // eslint-disable-next-line max-params\n  getParentMutation(activePoints, mousePosition?, parentSVG?, vIndex?) {\n    return [\n      {\n        target: \"parent\",\n        eventKey: \"parent\",\n        mutation: () => ({ activePoints, mousePosition, parentSVG, vIndex }),\n      },\n    ];\n  }\n\n  onActivated(props, points) {\n    if (Helpers.isFunction(props.onActivated)) {\n      props.onActivated(points, props);\n    }\n  }\n\n  onDeactivated(props, points) {\n    if (Helpers.isFunction(props.onDeactivated)) {\n      props.onDeactivated(points, props);\n    }\n  }\n\n  onMouseLeave = (evt, targetProps) => {\n    this.onMouseMove.cancel();\n    const activePoints = targetProps.activePoints || [];\n    this.onDeactivated(targetProps, activePoints);\n    const inactiveMutations = activePoints.length\n      ? activePoints.map((point) =>\n          this.getInactiveMutations(targetProps, point),\n        )\n      : [];\n    return this.getParentMutation([]).concat(...inactiveMutations);\n  };\n\n  private handleMouseMove = (evt, targetProps) => {\n    const activePoints = targetProps.activePoints || [];\n    const parentSVG = targetProps.parentSVG || Selection.getParentSVG(evt);\n    const mousePosition = Selection.getSVGEventCoordinates(evt, parentSVG);\n    if (!this.withinBounds(targetProps, mousePosition)) {\n      this.onDeactivated(targetProps, activePoints);\n      const inactiveMutations = activePoints.length\n        ? activePoints.map((point) =>\n            this.getInactiveMutations(targetProps, point),\n          )\n        : [];\n      return this.getParentMutation([], mousePosition, parentSVG).concat(\n        ...inactiveMutations,\n      );\n    }\n    const { points = [], index } = this.getVoronoiPoints(\n      targetProps,\n      mousePosition,\n    );\n    const parentMutations = this.getParentMutation(\n      points,\n      mousePosition,\n      parentSVG,\n      index,\n    );\n    if (activePoints.length && isEqual(points, activePoints)) {\n      return parentMutations;\n    }\n    this.onActivated(targetProps, points);\n    this.onDeactivated(targetProps, activePoints);\n    const activeMutations = points.length\n      ? points.map((point) => this.getActiveMutations(targetProps, point))\n      : [];\n    const inactiveMutations = activePoints.length\n      ? activePoints.map((point) =>\n          this.getInactiveMutations(targetProps, point),\n        )\n      : [];\n    return parentMutations.concat(...inactiveMutations, ...activeMutations);\n  };\n\n  onMouseMove = throttle(this.handleMouseMove, ON_MOUSE_MOVE_THROTTLE_MS, {\n    leading: true,\n    trailing: false,\n  });\n}\n\nexport const VoronoiHelpers = new VoronoiHelpersClass();\n"
  },
  {
    "path": "packages/victory-voronoi-container/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-voronoi-container/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-zoom-container/.npmignore",
    "content": "/*\n!/dist\n!/es\n!/lib\n!/src\n!LICENSE.txt\n!CHANGELOG.md\n!README.md\n!package.json\n*.map\n**/*.test.*\n"
  },
  {
    "path": "packages/victory-zoom-container/CHANGELOG.md",
    "content": "# victory-zoom-container\n\n## 37.3.6\n\n## 37.3.5\n\n## 37.3.4\n\n## 37.3.3\n\n### Patch Changes\n\n- Remove deprecated babel-plugin-lodash plugin ([#2965](https://github.com/FormidableLabs/victory/pull/2965))\n\n## 37.3.2\n\n## 37.3.1\n\n## 37.3.0\n\n## 37.2.0\n\n## 37.1.2\n\n### Patch Changes\n\n- Fix victory-native container styles ([`eae3fe5dd`](https://github.com/FormidableLabs/victory/commit/eae3fe5dde175e68e146576655cb2e8054ad6456))\n\n## 37.1.1\n\n### Patch Changes\n\n- Fix: #2761 zoom out zooming in if cursor outside chart container ([#2893](https://github.com/FormidableLabs/victory/pull/2893))\n\n## 37.1.0\n\n### Minor Changes\n\n- Refactor containers and portal to function components ([#2799](https://github.com/FormidableLabs/victory/pull/2799))\n\n* Pin all internal victory package versions ([#2876](https://github.com/FormidableLabs/victory/pull/2876))\n\n## 37.0.2\n\n## 37.0.1\n\n### Patch Changes\n\n- Fix the signature of class static functions in components ([#2840](https://github.com/FormidableLabs/victory/pull/2840))\n\n## 37.0.0\n\n### Major Changes\n\n- Upgrade babel dependencies and build target to modern browsers ([#2804](https://github.com/FormidableLabs/victory/pull/2804))\n\n## 36.9.2\n\n### Patch Changes\n\n- Replace lodash isFunction with native code ([#2802](https://github.com/FormidableLabs/victory/pull/2802))\n\n## 36.9.1\n\n### Patch Changes\n\n- Fix victory-native component prop types ([#2785](https://github.com/FormidableLabs/victory/pull/2785))\n\n## 36.9.0\n\n### Minor Changes\n\n- Remove prop-types definitions and dependency ([#2758](https://github.com/FormidableLabs/victory/pull/2758))\n\n## 36.8.6\n\n## 36.8.5\n\n### Patch Changes\n\n- Replace instances of lodash.assign with Object.assign ([#2757](https://github.com/FormidableLabs/victory/pull/2757))\n\n## 36.8.4\n\n## 36.8.3\n\n### Patch Changes\n\n- Migrate victory-zoom-container to TypeScript ([#2730](https://github.com/FormidableLabs/victory/pull/2730))\n\n## 36.8.2\n\n## 36.8.1\n\n## 36.8.0\n\n## 36.7.0\n\n## 36.6.12\n\n## 36.6.11\n\n## 36.6.10\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2590](https://github.com/FormidableLabs/victory/pull/2590))\n\n## 36.6.9\n\n### Patch Changes\n\n- Setup NPM Provenance ([#2587](https://github.com/FormidableLabs/victory/pull/2587))\n\n## 36.6.8\n\n### Patch Changes\n\n- Test for Changesets GitHub Actions workflow fix ([#2469](https://github.com/FormidableLabs/victory/pull/2469))\n\n- Updated dependencies []:\n  - victory-core@36.6.8\n\n## 36.6.7\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.7\n\n## 36.6.6\n\n### Patch Changes\n\n- Improved the exported types (fixes [#2451](https://github.com/FormidableLabs/victory/issues/2451)) ([#2452](https://github.com/FormidableLabs/victory/pull/2452))\n\n- Updated dependencies []:\n  - victory-core@36.6.6\n\n## 36.6.5\n\n### Patch Changes\n\n- Added explicit any for certain parameters (fixes [#2439](https://github.com/FormidableLabs/victory/issues/2439)) ([#2440](https://github.com/FormidableLabs/victory/pull/2440))\n\n- Updated dependencies [[`6f4972123`](https://github.com/FormidableLabs/victory/commit/6f49721238332bb5ee879571a45b34a04e44d416)]:\n  - victory-core@36.6.5\n\n## 36.6.4\n\n### Patch Changes\n\n- Added explicit `any` type defs (fixes [#2358](https://github.com/FormidableLabs/victory/issues/2358)) ([`57ed0fe30`](https://github.com/FormidableLabs/victory/commit/57ed0fe304dbc8753da1126a02d44de8004e96aa))\n\n* Allow data accessors to accept any data types (fixes [#2360](https://github.com/FormidableLabs/victory/issues/2360)) ([#2436](https://github.com/FormidableLabs/victory/pull/2436))\n\n* Updated dependencies [[`9a6319cff`](https://github.com/FormidableLabs/victory/commit/9a6319cffbc480711b8c286dcae00575081170f0)]:\n  - victory-core@36.6.4\n\n## 36.6.3\n\n### Patch Changes\n\n- Do not generate \\*.js.map sourcemaps (fixes [#2346](https://github.com/FormidableLabs/victory/issues/2346)) ([#2432](https://github.com/FormidableLabs/victory/pull/2432))\n\n- Updated dependencies [[`4bfc65df5`](https://github.com/FormidableLabs/victory/commit/4bfc65df5a10aa6a10084882ed5c6d0d894dec6f)]:\n  - victory-core@36.6.3\n\n## 36.6.2\n\n### Patch Changes\n\n- Updated dependencies []:\n  - victory-core@36.6.2\n\n## 36.6.1\n\n### Patch Changes\n\n- Updated dependencies [[`d1f281104`](https://github.com/FormidableLabs/victory/commit/d1f281104c7598c43e220dafd57546ab03daeeb5)]:\n  - victory-core@36.6.1\n\n## 36.6.0\n\n### Patch Changes\n\n- Update source code with minor lint-based improvements (see [#2236](https://github.com/FormidableLabs/victory/issues/2236)). ([#2403](https://github.com/FormidableLabs/victory/pull/2403))\n\n- Updated dependencies [[`fed5a5072`](https://github.com/FormidableLabs/victory/commit/fed5a507299b337846eed3d873ec7eb91bc69668), [`a2f48555a`](https://github.com/FormidableLabs/victory/commit/a2f48555adfed15bdb004dc0793f197d90c950a2)]:\n  - victory-core@36.6.0\n\n## 36.5.3 and earlier\n\nChange history for version 36.5.3 and earlier can be found in our root [CHANGELOG.md](https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md).\n"
  },
  {
    "path": "packages/victory-zoom-container/README.md",
    "content": "# VictoryZoomContainer\n\n`victory-zoom-container@^30.0.0` exports `VictoryZoomContainer`, `zoomContainerMixin`, `ZoomHelpers`, and `RawZoomHelpers`\n\nTo view documentation for `VictoryZoomContainer` please see https://commerce.nearform.com/open-source/victory/docs/victory-zoom-container\n\nTo suggest an addition or correction to this documentation please see https://github.com/FormidableLabs/victory/blob/main/docs/src/content/docs/victory-zoom-container.md\n"
  },
  {
    "path": "packages/victory-zoom-container/jest.config.ts",
    "content": "import rootConfig from \"../../test/jest.config\";\n\nexport default {\n  ...rootConfig,\n};\n"
  },
  {
    "path": "packages/victory-zoom-container/package.json",
    "content": "{\n  \"name\": \"victory-zoom-container\",\n  \"version\": \"37.3.6\",\n  \"description\": \"Interactive Zoom Component for Victory\",\n  \"keywords\": [\n    \"data visualization\",\n    \"React\",\n    \"d3\",\n    \"charting\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/FormidableLabs/victory\"\n  },\n  \"homepage\": \"https://commerce.nearform.com/open-source/victory\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"es/index.js\",\n  \"jsnext:main\": \"es/index.js\",\n  \"author\": \"Formidable\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"lodash\": \"^4.17.19\",\n    \"victory-core\": \"37.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \">=16.6.0\"\n  },\n  \"publishConfig\": {\n    \"provenance\": true\n  },\n  \"scripts\": {\n    \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n    \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n    \"build\": \"wireit\",\n    \"build:lib\": \"wireit\",\n    \"build:lib:esm\": \"wireit\",\n    \"build:lib:cjs\": \"wireit\",\n    \"build:dist\": \"wireit\",\n    \"build:dist:dev\": \"wireit\",\n    \"build:dist:min\": \"wireit\",\n    \"check\": \"wireit\",\n    \"types:check\": \"wireit\",\n    \"types:create\": \"wireit\",\n    \"lint\": \"wireit\",\n    \"lint:fix\": \"wireit\",\n    \"jest\": \"wireit\"\n  },\n  \"wireit\": {\n    \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n    \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n    \"build\": {\n      \"dependencies\": [\n        \"build:lib\",\n        \"build:dist\",\n        \"types:create\"\n      ]\n    },\n    \"build:lib\": {\n      \"dependencies\": [\n        \"build:lib:esm\",\n        \"build:lib:cjs\"\n      ]\n    },\n    \"build:lib:esm\": {\n      \"command\": \"nps build:lib:esm\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"es/**/*.js\",\n        \"es/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:lib:cjs\": {\n      \"command\": \"nps build:lib:cjs\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\"\n      ],\n      \"output\": [\n        \"lib/**/*.js\",\n        \"lib/**/*.js.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:cjs\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist\": {\n      \"dependencies\": [\n        \"build:dist:dev\",\n        \"build:dist:min\"\n      ]\n    },\n    \"build:dist:dev\": {\n      \"command\": \"nps build:dist:dev\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\",\n        \"../../config/webpack.config.dev.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.js\",\n        \"!dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"build:dist:min\": {\n      \"command\": \"nps build:dist:min\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../.babelrc.build.js\",\n        \"../../.babelrc.js\",\n        \"../../package-scripts.js\",\n        \"../../config/webpack.config.js\"\n      ],\n      \"output\": [\n        \"dist/victory*.min.js*\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:build:lib:esm\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"check\": {\n      \"dependencies\": [\n        \"types:check\",\n        \"jest\",\n        \"format\",\n        \"lint\"\n      ]\n    },\n    \"types:check\": {\n      \"command\": \"nps types:pkg:check\",\n      \"files\": [\n        \"src/**/*.{ts,tsx}\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.json\"\n      ],\n      \"dependencies\": [\n        \"types:create\",\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"output\": [],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"types:create\": {\n      \"command\": \"nps types:pkg:create\",\n      \"files\": [\n        \"src/**\",\n        \"!src/**/*.test.*\",\n        \"../../tsconfig.base.json\",\n        \"tsconfig.build.json\"\n      ],\n      \"output\": [\n        \"es/**/*.d.ts\",\n        \"es/**/*.d.ts.map\",\n        \"lib/**/*.d.ts\",\n        \"lib/**/*.d.ts.map\"\n      ],\n      \"dependencies\": [\n        \"../victory-core:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint\": {\n      \"command\": \"eslint src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"lint:fix\": {\n      \"command\": \"eslint --fix src\",\n      \"files\": [\n        \"src/**\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:types:create\",\n        \"../victory-vendor:types:create\",\n        \"../victory-voronoi:types:create\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    },\n    \"jest\": {\n      \"command\": \"jest --passWithNoTests\",\n      \"files\": [\n        \"src/**/*.test.*\",\n        \"../../.babelrc.js\",\n        \"../../test/jest-config.js\",\n        \"../../test/jest-setup.ts\"\n      ],\n      \"output\": [],\n      \"dependencies\": [\n        \"../victory-core:build\",\n        \"../victory-vendor:build\",\n        \"../victory-voronoi:build\"\n      ],\n      \"packageLocks\": [\n        \"pnpm-lock.yaml\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/victory-zoom-container/src/index.ts",
    "content": "export * from \"./victory-zoom-container\";\nexport * from \"./zoom-helpers\";\n"
  },
  {
    "path": "packages/victory-zoom-container/src/victory-zoom-container.tsx",
    "content": "import React from \"react\";\nimport { ZoomHelpers } from \"./zoom-helpers\";\nimport {\n  VictoryClipContainer,\n  VictoryContainerProps,\n  DomainTuple,\n  VictoryContainer,\n  Data,\n  VictoryEventHandler,\n} from \"victory-core\";\nimport defaults from \"lodash/defaults\";\n\nconst DEFAULT_DOWNSAMPLE = 150;\n\nexport type ZoomDimensionType = \"x\" | \"y\";\n\nexport type ZoomDomain = {\n  x: DomainTuple;\n  y: DomainTuple;\n};\n\nexport interface VictoryZoomContainerProps extends VictoryContainerProps {\n  allowPan?: boolean;\n  allowZoom?: boolean;\n  clipContainerComponent?: React.ReactElement;\n  disable?: boolean;\n  downsample?: number | boolean;\n  minimumZoom?: { x?: number; y?: number };\n  onZoomDomainChange?: (\n    domain: ZoomDomain,\n    props: VictoryZoomContainerProps,\n  ) => void;\n  zoomDimension?: ZoomDimensionType;\n  zoomDomain?: Partial<ZoomDomain>;\n  horizontal?: boolean;\n}\n\ninterface VictoryZoomContainerMutatedProps extends VictoryZoomContainerProps {\n  domain: ZoomDomain;\n  originalDomain: ZoomDomain;\n  currentDomain: ZoomDomain;\n  cachedZoomDomain: ZoomDomain;\n  scale: any;\n  polar: boolean;\n  origin: { x: number; y: number };\n}\n\nexport const VICTORY_ZOOM_CONTAINER_DEFAULT_PROPS = {\n  clipContainerComponent: <VictoryClipContainer />,\n  allowPan: true,\n  allowZoom: true,\n  zoomActive: false,\n};\n\nexport const useVictoryZoomContainer = (\n  initialProps: VictoryZoomContainerProps,\n) => {\n  const props = {\n    ...VICTORY_ZOOM_CONTAINER_DEFAULT_PROPS,\n    ...(initialProps as VictoryZoomContainerMutatedProps),\n  };\n  const {\n    children,\n    currentDomain,\n    zoomActive,\n    allowZoom,\n    downsample,\n    scale,\n    clipContainerComponent,\n    polar,\n    origin,\n    horizontal,\n  } = props;\n\n  const downsampleZoomData = (child: React.ReactElement, domain) => {\n    const getData = (childProps) => {\n      const { data, x, y } = childProps;\n      const defaultGetData =\n        child.type && typeof (child.type as any).getData === \"function\"\n          ? (child.type as any).getData\n          : () => undefined;\n      // skip costly data formatting if x and y accessors are not present\n      return Array.isArray(data) && !x && !y\n        ? data\n        : defaultGetData(childProps);\n    };\n\n    const data = getData(child.props);\n\n    // return undefined if downsample is not run, then default() will replace with child.props.data\n    if (!downsample || !domain || !data) {\n      return undefined;\n    }\n\n    const maxPoints = downsample === true ? DEFAULT_DOWNSAMPLE : downsample;\n    const dimension = props.zoomDimension || \"x\";\n\n    // important: assumes data is ordered by dimension\n    // get the start and end of the data that is in the current visible domain\n    let startIndex = data.findIndex(\n      (d) => d[dimension] >= domain[dimension][0],\n    );\n    let endIndex = data.findIndex((d) => d[dimension] > domain[dimension][1]);\n    // pick one more point (if available) at each end so that VictoryLine, VictoryArea connect\n    if (startIndex !== 0) {\n      startIndex -= 1;\n    }\n    if (endIndex !== -1) {\n      endIndex += 1;\n    }\n\n    const visibleData = data.slice(startIndex, endIndex);\n\n    return Data.downsample(visibleData, maxPoints, startIndex);\n  };\n\n  const modifiedChildren = (\n    React.Children.toArray(children) as React.ReactElement[]\n  ).map((child) => {\n    const role = (child as any).type && (child as any).type.role;\n    const isDataComponent = Data.isDataComponent(child);\n    const originalDomain = defaults({}, props.originalDomain, props.domain);\n    const zoomDomain = defaults({}, props.zoomDomain, props.domain);\n    const cachedZoomDomain = defaults({}, props.cachedZoomDomain, props.domain);\n\n    let domain: ZoomDomain;\n\n    if (!ZoomHelpers.checkDomainEquality(zoomDomain, cachedZoomDomain)) {\n      // if zoomDomain has been changed, use it\n      domain = zoomDomain;\n    } else if (allowZoom && !zoomActive) {\n      // if user has zoomed all the way out, use the child domain\n      domain = child.props.domain;\n    } else {\n      // default: use currentDomain, set by the event handlers\n      domain = defaults({}, currentDomain, originalDomain);\n    }\n\n    let newDomain = props.polar\n      ? {\n          x: originalDomain.x,\n          y: [0, domain.y[1]],\n        }\n      : domain;\n\n    if (newDomain && props.zoomDimension) {\n      // if zooming is restricted to a dimension, don't squash changes to zoomDomain in other dim\n      newDomain = {\n        ...zoomDomain,\n        [props.zoomDimension]: newDomain[props.zoomDimension],\n      };\n    }\n\n    // don't downsample stacked data\n    const childProps =\n      isDataComponent && role !== \"stack\"\n        ? {\n            domain: newDomain,\n            data: downsampleZoomData(child, newDomain),\n          }\n        : { domain: newDomain };\n\n    const newChild = React.cloneElement(\n      child,\n      defaults(childProps, child.props),\n    );\n\n    // Clip data components\n    if (Data.isDataComponent(newChild)) {\n      const rangeX = horizontal ? scale.y.range() : scale.x.range();\n      const rangeY = horizontal ? scale.x.range() : scale.y.range();\n      const plottableWidth = Math.abs(rangeX[0] - rangeX[1]);\n      const plottableHeight = Math.abs(rangeY[0] - rangeY[1]);\n      const radius = Math.max(...rangeY);\n      const groupComponent = React.cloneElement(clipContainerComponent, {\n        clipWidth: plottableWidth,\n        clipHeight: plottableHeight,\n        translateX: Math.min(...rangeX),\n        translateY: Math.min(...rangeY),\n        polar,\n        origin: polar ? origin : undefined,\n        radius: polar ? radius : undefined,\n        ...clipContainerComponent.props,\n      });\n\n      return React.cloneElement(newChild, {\n        groupComponent,\n      });\n    }\n\n    return newChild;\n  });\n\n  return { props, children: modifiedChildren };\n};\n\nexport const VictoryZoomContainer = (\n  initialProps: VictoryZoomContainerProps,\n) => {\n  const { props, children } = useVictoryZoomContainer(initialProps);\n  return <VictoryContainer {...props}>{children}</VictoryContainer>;\n};\n\nVictoryZoomContainer.role = \"container\";\n\nVictoryZoomContainer.defaultEvents = (\n  initialProps: VictoryZoomContainerProps,\n) => {\n  const props = { ...VICTORY_ZOOM_CONTAINER_DEFAULT_PROPS, ...initialProps };\n  const createEventHandler =\n    (handler: VictoryEventHandler, disabled?: boolean): VictoryEventHandler =>\n    // eslint-disable-next-line max-params\n    (event, targetProps, eventKey, context) =>\n      disabled || props.disable\n        ? {}\n        : handler(event, { ...props, ...targetProps }, eventKey, context);\n\n  return [\n    {\n      target: \"parent\",\n      eventHandlers: {\n        onMouseDown: createEventHandler(ZoomHelpers.onMouseDown),\n        onTouchStart: createEventHandler(ZoomHelpers.onMouseDown),\n        onMouseUp: createEventHandler(ZoomHelpers.onMouseUp),\n        onTouchEnd: createEventHandler(ZoomHelpers.onMouseUp),\n        onMouseLeave: createEventHandler(ZoomHelpers.onMouseLeave),\n        onTouchCancel: createEventHandler(ZoomHelpers.onMouseLeave),\n        onMouseMove: createEventHandler(ZoomHelpers.onMouseMove),\n        onTouchMove: createEventHandler(ZoomHelpers.onMouseMove),\n        onWheel: createEventHandler(ZoomHelpers.onWheel, !props.allowZoom),\n      },\n    },\n  ];\n};\n"
  },
  {
    "path": "packages/victory-zoom-container/src/zoom-helpers.test.ts",
    "content": "import { RawZoomHelpers } from \"./zoom-helpers\";\n\ndescribe(\"RawZoomHelpers.getMinimumDomain\", () => {\n  afterEach(() => {\n    jest.restoreAllMocks();\n  });\n  it(\"should be calculating the minimum domain\", () => {\n    jest.spyOn(RawZoomHelpers, \"getDomain\").mockImplementation(() => ({\n      x: [0, 100],\n    }));\n    expect(\n      RawZoomHelpers.getMinimumDomain(30, { minimumZoom: true }, \"x\"),\n    ).toStrictEqual([29.95, 30.05]);\n  });\n});\n\ndescribe(\"RawZoomHelpers.getScaledDomain\", () => {\n  it(\"should scale the domain correctly with a zoom in factor\", () => {\n    expectToBeCloseToArray(\n      RawZoomHelpers.getScaledDomain([0, 100], 0.9, 0.5),\n      [5, 95],\n    );\n  });\n  it(\"should scale the domain correctly with a zoom out factor\", () => {\n    expectToBeCloseToArray(\n      RawZoomHelpers.getScaledDomain([0, 100], 1.1, 0.5),\n      [-5, 105],\n    );\n  });\n});\n\ndescribe(\"RawZoomHelpers.scale\", () => {\n  afterEach(() => {\n    jest.restoreAllMocks();\n  });\n\n  it(\"should get the correct domain\", () => {\n    jest.spyOn(RawZoomHelpers, \"getDomain\").mockImplementation(() => ({\n      x: [0, 100],\n    }));\n    jest.spyOn(RawZoomHelpers, \"getScalePercent\").mockImplementation(() => 0.5);\n    jest\n      .spyOn(RawZoomHelpers, \"getMinimumDomain\")\n      .mockImplementation(() => [29.955, 30.045]);\n\n    expectToBeCloseToArray(\n      RawZoomHelpers.scale([0, 100], { deltaY: -1 }, {}, \"x\"),\n      [0.166, 99.833],\n    );\n  });\n\n  it(\"should't change the domain when zooming out with max zoom out\", () => {\n    jest.spyOn(RawZoomHelpers, \"getDomain\").mockImplementation(() => ({\n      x: [0, 100],\n    }));\n    jest.spyOn(RawZoomHelpers, \"getScalePercent\").mockImplementation(() => 0.1);\n    jest\n      .spyOn(RawZoomHelpers, \"getMinimumDomain\")\n      .mockImplementation(() => [29.955, 30.045]);\n\n    expectToBeCloseToArray(\n      RawZoomHelpers.scale([0, 100], { deltaY: 1 }, {}, \"x\"),\n      [0, 100],\n    );\n  });\n\n  it(\"should't change the domain when zooming out with max zoom out with the cursor outside the container boundary\", () => {\n    jest.spyOn(RawZoomHelpers, \"getDomain\").mockImplementation(() => ({\n      x: [0, 100],\n    }));\n    jest\n      .spyOn(RawZoomHelpers, \"getScalePercent\")\n      .mockImplementation(() => -0.1);\n    jest\n      .spyOn(RawZoomHelpers, \"getMinimumDomain\")\n      .mockImplementation(() => [29.955, 30.045]);\n\n    expectToBeCloseToArray(\n      RawZoomHelpers.scale([0, 100], { deltaY: 1 }, {}, \"x\"),\n      [0, 100],\n    );\n  });\n});\n\nfunction expectToBeCloseToArray(actual, expected) {\n  expect(actual.length).toBe(expected.length);\n  actual.forEach((x, i) => expect(x).toBeCloseTo(expected[i]));\n}\n"
  },
  {
    "path": "packages/victory-zoom-container/src/zoom-helpers.ts",
    "content": "/* eslint no-magic-numbers: [\"error\", { \"ignore\": [-1, 0, 1, 2, 1000] }]*/\nimport { Children } from \"react\";\nimport defaults from \"lodash/defaults\";\nimport delay from \"lodash/delay\";\nimport throttle from \"lodash/throttle\";\n\nimport { Helpers, Selection, Collection, Wrapper } from \"victory-core\";\n\nexport const RawZoomHelpers = {\n  checkDomainEquality(a, b) {\n    const checkDimension = (dim) => {\n      const val1 = a && a[dim];\n      const val2 = b && b[dim];\n      if (!val1 && !val2) {\n        return true;\n      } else if (!val1 || !val2) {\n        return false;\n      }\n      return (\n        Number(val1[0]) === Number(val2[0]) &&\n        Number(val1[1]) === Number(val2[1])\n      );\n    };\n    return checkDimension(\"x\") && checkDimension(\"y\");\n  },\n  /**\n   * Generates a new domain scaled by factor and constrained by the original domain.\n   * @param  {[Number, Number]} currentDomain  The domain to be scaled.\n   * @param  {Object} evt the event object\n   * @param  {Object} props the props of the targeted component\n   * @param  {String} axis the desired dimension (either x or y)\n   * @return {[Number, Number]}                The scale domain\n   */\n  // eslint-disable-next-line max-params\n  scale(currentDomain, evt, props, axis) {\n    const [from, to] = currentDomain;\n    const range = Math.abs(to - from);\n    const minimumZoom = props.minimumZoom && props.minimumZoom[axis];\n    const factor = this.getScaleFactor(evt);\n    if (minimumZoom && range <= minimumZoom && factor < 1) {\n      return currentDomain;\n    }\n    const [fromBound, toBound] = this.getDomain(props)[axis];\n    const percent = this.getScalePercent(evt, props, axis);\n    const point = factor * from + percent * (factor * range);\n    const minDomain = this.getMinimumDomain(point, props, axis);\n    const [newMin, newMax] = this.getScaledDomain(\n      currentDomain,\n      factor,\n      percent,\n    );\n    const newDomain = [\n      newMin > fromBound && newMin < toBound ? newMin : fromBound,\n      newMax < toBound && newMax > fromBound ? newMax : toBound,\n    ];\n    const domain =\n      Math.abs(minDomain[1] - minDomain[0]) >\n      Math.abs(newDomain[1] - newDomain[0])\n        ? minDomain\n        : newDomain;\n    return Collection.containsDates([fromBound, toBound])\n      ? [new Date(domain[0]), new Date(domain[1])]\n      : domain;\n  },\n\n  getScaledDomain(currentDomain, factor, percent) {\n    const [from, to] = currentDomain;\n    const range = Math.abs(to - from);\n    const diff = range - range * factor;\n    const newMin = Number(from) + diff * Math.max(percent, 0);\n    const newMax = Number(to) - diff * Math.max(1 - percent, 0);\n    return [Math.min(newMin, newMax), Math.max(newMin, newMax)];\n  },\n\n  getMinimumDomain(point, props, axis) {\n    const { minimumZoom } = props;\n    const originalDomain = this.getDomain(props)[axis];\n    const [from, to] = originalDomain;\n    const defaultMin = Math.abs(from - to) / 1000;\n    const extent = minimumZoom ? minimumZoom[axis] || defaultMin : defaultMin;\n    const minExtent = point - extent / 2;\n    const maxExtent = point + extent / 2;\n    return [\n      minExtent > from && minExtent < to ? minExtent : from,\n      maxExtent < to && maxExtent > from\n        ? maxExtent\n        : Number(from) + extent / 2,\n    ];\n  },\n\n  zoommingOut(evt) {\n    return evt.deltaY > 0;\n  },\n\n  getScaleFactor(evt) {\n    const sign = this.zoommingOut(evt) ? 1 : -1;\n    // eslint-disable-next-line no-magic-numbers\n    const delta = Math.min(Math.abs(evt.deltaY / 300), 0.5); // TODO: Check scale factor\n    return Math.abs(1 + sign * delta);\n  },\n\n  getScalePercent(evt, props, axis) {\n    const originalDomain = this.getDomain(props);\n    const [from, to] = originalDomain[axis];\n    const position = this.getPosition(evt, props, originalDomain);\n    return (position[axis] - from) / Math.abs(to - from);\n  },\n\n  getPosition(evt, props, originalDomain) {\n    const { x, y } = Selection.getSVGEventCoordinates(evt);\n    const originalScale = {\n      x: props.scale.x.domain(originalDomain.x),\n      y: props.scale.y.domain(originalDomain.y),\n    };\n    return Selection.getDataCoordinates(props, originalScale, x, y);\n  },\n\n  /**\n   * Generate a new domain translated by the delta and constrained by the original domain.\n   * @param  {[Number, Number]} currentDomain  The domain to be translated.\n   * @param  {[Number, Number]} originalDomain The original domain for the data set.\n   * @param  {Number}           delta          The delta to translate by\n   * @return {[Number, Number]}                The translated domain\n   */\n  pan(currentDomain, originalDomain, delta) {\n    const [fromCurrent, toCurrent] = currentDomain.map((val) => Number(val));\n    const [fromOriginal, toOriginal] = originalDomain.map((val) => Number(val));\n    const lowerBound = fromCurrent + delta;\n    const upperBound = toCurrent + delta;\n    let newDomain;\n    if (lowerBound > fromOriginal && upperBound < toOriginal) {\n      newDomain = [lowerBound, upperBound];\n    } else if (lowerBound < fromOriginal) {\n      // Clamp to lower limit\n      const dx = toCurrent - fromCurrent;\n      newDomain = [fromOriginal, fromOriginal + dx];\n    } else if (upperBound > toOriginal) {\n      // Clamp to upper limit\n      const dx = toCurrent - fromCurrent;\n      newDomain = [toOriginal - dx, toOriginal];\n    } else {\n      newDomain = currentDomain;\n    }\n    return Collection.containsDates(currentDomain) ||\n      Collection.containsDates(originalDomain)\n      ? newDomain.map((val) => new Date(val))\n      : newDomain;\n  },\n\n  getDomainScale(domain, scale, axis) {\n    const axisDomain = Array.isArray(domain) ? domain : domain[axis];\n    const [from, to] = axisDomain;\n    const range = scale[axis].range();\n    const plottableWidth = Math.abs(range[0] - range[1]);\n    return plottableWidth / (to - from);\n  },\n\n  handleAnimation(ctx) {\n    const animationTimer = ctx.context.animationTimer;\n    const transitionTimer = ctx.context.transitionTimer;\n    transitionTimer.bypassAnimation();\n    animationTimer.bypassAnimation();\n\n    const resumeAnimation = () => {\n      animationTimer.resumeAnimation();\n      transitionTimer.resumeAnimation();\n    };\n    // delay the callback that resumes animation by ~1 frame so that animation does not interfere with wheel events\n    return delay(resumeAnimation, 16); // eslint-disable-line no-magic-numbers\n  },\n\n  getLastDomain(targetProps, originalDomain) {\n    const { zoomDomain, cachedZoomDomain, currentDomain, domain } = targetProps;\n    if (zoomDomain && !this.checkDomainEquality(zoomDomain, cachedZoomDomain)) {\n      return defaults({}, zoomDomain, domain);\n    }\n    return defaults({}, currentDomain || zoomDomain || originalDomain, domain);\n  },\n\n  getDomain(props) {\n    const { originalDomain, domain, children, zoomDimension } = props;\n    const childComponents = Children.toArray(children);\n    let childrenDomain = {};\n    if (childComponents.length) {\n      childrenDomain = zoomDimension\n        ? {\n            [zoomDimension]: Wrapper.getDomainFromChildren(\n              props,\n              zoomDimension,\n              childComponents,\n            ),\n          }\n        : {\n            x: Wrapper.getDomainFromChildren(props, \"x\", childComponents),\n            y: Wrapper.getDomainFromChildren(props, \"y\", childComponents),\n          };\n    }\n    return defaults({}, childrenDomain, originalDomain, domain);\n  },\n\n  onMouseDown(evt, targetProps) {\n    evt.preventDefault();\n    if (!targetProps.allowPan) {\n      return undefined;\n    }\n    const parentSVG = targetProps.parentSVG || Selection.getParentSVG(evt);\n    const { x, y } = Selection.getSVGEventCoordinates(evt, parentSVG);\n    return [\n      {\n        target: \"parent\",\n        mutation: () => {\n          return {\n            startX: x,\n            startY: y,\n            panning: true,\n            parentSVG,\n            parentControlledProps: [\"domain\"],\n          };\n        },\n      },\n    ];\n  },\n\n  onMouseUp(evt, targetProps) {\n    if (!targetProps.allowPan) {\n      return undefined;\n    }\n    return [\n      {\n        target: \"parent\",\n        mutation: () => {\n          return { panning: false };\n        },\n      },\n    ];\n  },\n\n  onMouseLeave(evt, targetProps) {\n    if (!targetProps.allowPan) {\n      return undefined;\n    }\n    return [\n      {\n        target: \"parent\",\n        mutation: () => {\n          return { panning: false };\n        },\n      },\n    ];\n  },\n\n  // eslint-disable-next-line max-params\n  onMouseMove(evt, targetProps, eventKey, ctx) {\n    if (targetProps.panning && targetProps.allowPan) {\n      const {\n        scale,\n        startX,\n        startY,\n        onZoomDomainChange,\n        zoomDomain,\n        zoomDimension,\n        horizontal,\n      } = targetProps;\n      const parentSVG = targetProps.parentSVG || Selection.getParentSVG(evt);\n      const { x, y } = Selection.getSVGEventCoordinates(evt, parentSVG);\n      const originalDomain = this.getDomain(targetProps);\n      const lastDomain = this.getLastDomain(targetProps, originalDomain);\n      const deltaX = horizontal ? y - startY : startX - x;\n      const deltaY = horizontal ? startX - x : y - startY;\n      const dx = deltaX / this.getDomainScale(lastDomain, scale, \"x\");\n      const dy = deltaY / this.getDomainScale(lastDomain, scale, \"y\");\n      const currentDomain = {\n        x:\n          zoomDimension === \"y\"\n            ? originalDomain.x\n            : this.pan(lastDomain.x, originalDomain.x, dx),\n        y:\n          zoomDimension === \"x\"\n            ? originalDomain.y\n            : this.pan(lastDomain.y, originalDomain.y, dy),\n      };\n      const resumeAnimation = this.handleAnimation(ctx);\n\n      const zoomActive = !this.checkDomainEquality(originalDomain, lastDomain);\n\n      const mutatedProps = {\n        parentControlledProps: [\"domain\"],\n        startX: x,\n        startY: y,\n        parentSVG,\n        currentDomain,\n        originalDomain,\n        cachedZoomDomain: zoomDomain,\n        zoomActive,\n      };\n\n      if (Helpers.isFunction(onZoomDomainChange)) {\n        onZoomDomainChange(\n          currentDomain,\n          defaults({}, mutatedProps, targetProps),\n        );\n      }\n      return [\n        {\n          target: \"parent\",\n          callback: resumeAnimation,\n          mutation: () => mutatedProps,\n        },\n      ];\n    }\n    return undefined;\n  },\n\n  // eslint-disable-next-line max-params\n  onWheel(evt, targetProps, eventKey, ctx) {\n    if (!targetProps.allowZoom) {\n      return undefined;\n    }\n    const { onZoomDomainChange, zoomDimension, zoomDomain } = targetProps;\n    const originalDomain = this.getDomain(targetProps);\n    const lastDomain = this.getLastDomain(targetProps, originalDomain);\n    const { x, y } = lastDomain;\n    const currentDomain = {\n      x:\n        zoomDimension === \"y\"\n          ? lastDomain.x\n          : this.scale(x, evt, targetProps, \"x\"),\n      y:\n        zoomDimension === \"x\"\n          ? lastDomain.y\n          : this.scale(y, evt, targetProps, \"y\"),\n    };\n    const resumeAnimation = this.handleAnimation(ctx);\n\n    const zoomActive =\n      !this.zoommingOut(evt) || // if zoomming in or\n      //   if zoomActive is already set AND user hasn't zoommed out all the way\n      (targetProps.zoomActive &&\n        !this.checkDomainEquality(originalDomain, lastDomain));\n\n    const mutatedProps = {\n      currentDomain,\n      originalDomain,\n      cachedZoomDomain: zoomDomain,\n      parentControlledProps: [\"domain\"],\n      panning: false,\n      zoomActive,\n    };\n\n    if (Helpers.isFunction(onZoomDomainChange)) {\n      onZoomDomainChange(\n        currentDomain,\n        defaults({}, mutatedProps, targetProps),\n      );\n    }\n\n    return [\n      {\n        target: \"parent\",\n        callback: resumeAnimation,\n        mutation: () => mutatedProps,\n      },\n    ];\n  },\n};\n\nexport const ZoomHelpers = {\n  checkDomainEquality: RawZoomHelpers.checkDomainEquality.bind(RawZoomHelpers),\n  onMouseDown: RawZoomHelpers.onMouseDown.bind(RawZoomHelpers),\n  onMouseUp: RawZoomHelpers.onMouseUp.bind(RawZoomHelpers),\n  onMouseLeave: RawZoomHelpers.onMouseLeave.bind(RawZoomHelpers),\n  onMouseMove: throttle(\n    RawZoomHelpers.onMouseMove.bind(RawZoomHelpers),\n    16, // eslint-disable-line no-magic-numbers\n    { leading: true, trailing: false },\n  ),\n  onWheel: throttle(\n    RawZoomHelpers.onWheel.bind(RawZoomHelpers),\n    16, // eslint-disable-line no-magic-numbers\n    { leading: true, trailing: false },\n  ),\n};\n"
  },
  {
    "path": "packages/victory-zoom-container/tsconfig.build.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"**/*.test.*\", \"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "packages/victory-zoom-container/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.base.json\",\n  \"exclude\": [\"es\", \"lib\", \"jest.config.ts\"]\n}\n"
  },
  {
    "path": "patches/@changesets__cli@2.24.1.patch",
    "content": "diff --git a/dist/cli.cjs.dev.js b/dist/cli.cjs.dev.js\nindex 55665d53b92288d89b71aab0c231b82bb8cb5ff1..a24dc555b52e95a2cb1232d8c8a0a37e7dbd3fcf 100644\n--- a/dist/cli.cjs.dev.js\n+++ b/dist/cli.cjs.dev.js\n@@ -807,7 +807,6 @@ async function internalPublish(pkgName, opts, twoFactorState) {\n   } // Due to a super annoying issue in yarn, we have to manually override this env variable\n   // See: https://github.com/yarnpkg/yarn/issues/2935#issuecomment-355292633\n \n-\n   const envOverride = {\n     npm_config_registry: getCorrectRegistry()\n   };\n@@ -921,8 +920,9 @@ async function publishPackages({\n   }\n \n   return Promise.all(unpublishedPackagesInfo.map(pkgInfo => {\n-    let pkg = packagesByName.get(pkgInfo.name);\n-    return publishAPackage(pkg, access, twoFactorState, getReleaseTag(pkgInfo, preState, tag));\n+    const pkg = packagesByName.get(pkgInfo.name);\n+    const publishTag = (pkg.packageJson.publishConfig && pkg.packageJson.publishConfig.tag) || tag;\n+    return publishAPackage(pkg, access, twoFactorState, getReleaseTag(pkgInfo, preState, publishTag));\n   }));\n }\n \n@@ -933,7 +933,7 @@ async function publishAPackage(pkg, access, twoFactorState, tag) {\n     publishConfig\n   } = pkg.packageJson;\n   const localAccess = publishConfig === null || publishConfig === void 0 ? void 0 : publishConfig.access;\n-  logger.info(`Publishing ${chalk__default['default'].cyan(`\"${name}\"`)} at ${chalk__default['default'].green(`\"${version}\"`)}`);\n+  logger.info(`Publishing ${chalk__default['default'].cyan(`\"${name}\"`)} at ${chalk__default['default'].green(`\"${version}@${tag}\"`)}`);\n   const publishDir = (publishConfig === null || publishConfig === void 0 ? void 0 : publishConfig.directory) ? path.join(pkg.dir, publishConfig.directory) : pkg.dir;\n   const publishConfirmation = await publish(name, {\n     cwd: publishDir,\n@@ -1221,6 +1221,7 @@ async function run$1(cwd) {\n }\n \n async function run$2(input, flags, cwd) {\n+  logger.warn(\"This is a patched version of @changesets/cli\");\n   if (input[0] === \"init\") {\n     await init(cwd);\n     return;\ndiff --git a/dist/cli.cjs.prod.js b/dist/cli.cjs.prod.js\nindex fa6dd7c6365b814e44a253c4868b315de481d691..05f6f8beb9d2e26730bdb9450a6e68abedee7633 100644\n--- a/dist/cli.cjs.prod.js\n+++ b/dist/cli.cjs.prod.js\n@@ -508,13 +508,20 @@ async function publishPackages({packages: packages, access: access, otp: otp, pr\n     otp: otp,\n     publicPackages: publicPackages\n   }), unpublishedPackagesInfo = await getUnpublishedPackages(publicPackages, preState);\n-  return 0 === unpublishedPackagesInfo.length && logger.warn(\"No unpublished packages to publish\"), \n-  Promise.all(unpublishedPackagesInfo.map((pkgInfo => publishAPackage(packagesByName.get(pkgInfo.name), access, twoFactorState, getReleaseTag(pkgInfo, preState, tag)))));\n+  if (unpublishedPackagesInfo.length === 0) {\n+    warn(\"No unpublished packages to publish\");\n+  }\n+\n+  return Promise.all(unpublishedPackagesInfo.map(pkgInfo => {\n+    const pkg = packagesByName.get(pkgInfo.name);\n+    const publishTag = (pkg.packageJson.publishConfig && pkg.packageJson.publishConfig.tag) || tag;\n+    return publishAPackage(pkg, access, twoFactorState, getReleaseTag(pkgInfo, preState, publishTag));\n+  }));\n }\n \n async function publishAPackage(pkg, access, twoFactorState, tag) {\n   const {name: name, version: version, publishConfig: publishConfig} = pkg.packageJson, localAccess = null == publishConfig ? void 0 : publishConfig.access;\n-  logger.info(`Publishing ${chalk__default.default.cyan(`\"${name}\"`)} at ${chalk__default.default.green(`\"${version}\"`)}`);\n+  logger.info(`Publishing ${chalk__default['default'].cyan(`\"${name}\"`)} at ${chalk__default['default'].green(`\"${version}@${tag}\"`)}`);\n   const publishDir = (null == publishConfig ? void 0 : publishConfig.directory) ? path.join(pkg.dir, publishConfig.directory) : pkg.dir;\n   return {\n     name: name,\n@@ -661,6 +668,7 @@ async function run$1(cwd) {\n }\n \n async function run$2(input, flags, cwd) {\n+  logger.warn(\"This is a patched version of @changesets/cli\");\n   if (\"init\" === input[0]) return void await init(cwd);\n   if (!fs__default.default.existsSync(path__default.default.resolve(cwd, \".changeset\"))) throw logger.error(\"There is no .changeset folder. \"), \n   logger.error(\"If this is the first time `changesets` have been used in this project, run `yarn changeset init` to get set up.\"), \ndiff --git a/dist/cli.esm.js b/dist/cli.esm.js\nindex 4e319be77ee8a563803649324b7fc364bc05be6b..cb2a2bef5c4f75a2cfe59ce7f402078d89f1f778 100644\n--- a/dist/cli.esm.js\n+++ b/dist/cli.esm.js\n@@ -784,7 +784,6 @@ async function internalPublish(pkgName, opts, twoFactorState) {\n   } // Due to a super annoying issue in yarn, we have to manually override this env variable\n   // See: https://github.com/yarnpkg/yarn/issues/2935#issuecomment-355292633\n \n-\n   const envOverride = {\n     npm_config_registry: getCorrectRegistry()\n   };\n@@ -898,8 +897,9 @@ async function publishPackages({\n   }\n \n   return Promise.all(unpublishedPackagesInfo.map(pkgInfo => {\n-    let pkg = packagesByName.get(pkgInfo.name);\n-    return publishAPackage(pkg, access, twoFactorState, getReleaseTag(pkgInfo, preState, tag));\n+    const pkg = packagesByName.get(pkgInfo.name);\n+    const publishTag = (pkg.packageJson.publishConfig && pkg.packageJson.publishConfig.tag) || tag;\n+    return publishAPackage(pkg, access, twoFactorState, getReleaseTag(pkgInfo, preState, publishTag));\n   }));\n }\n \n@@ -910,7 +910,7 @@ async function publishAPackage(pkg, access, twoFactorState, tag) {\n     publishConfig\n   } = pkg.packageJson;\n   const localAccess = publishConfig === null || publishConfig === void 0 ? void 0 : publishConfig.access;\n-  info(`Publishing ${chalk.cyan(`\"${name}\"`)} at ${chalk.green(`\"${version}\"`)}`);\n+  info(`Publishing ${chalk.cyan(`\"${name}\"`)} at ${chalk.green(`\"${version}@${tag}\"`)}`);\n   const publishDir = (publishConfig === null || publishConfig === void 0 ? void 0 : publishConfig.directory) ? join(pkg.dir, publishConfig.directory) : pkg.dir;\n   const publishConfirmation = await publish(name, {\n     cwd: publishDir,\n@@ -1198,6 +1198,7 @@ async function run$1(cwd) {\n }\n \n async function run$2(input, flags, cwd) {\n+  logger.warn(\"This is a patched version of @changesets/cli\");\n   if (input[0] === \"init\") {\n     await init(cwd);\n     return;"
  },
  {
    "path": "pnpm-workspace.yaml",
    "content": "packages:\n  - 'packages/**'\n  - 'website'\n  - 'demo/rn'\n"
  },
  {
    "path": "scripts/changelog.js",
    "content": "const {\n  default: changelogFunctions,\n} = require(\"@svitejs/changesets-changelog-github-compact\");\n\nconst customFunctions = {\n  ...changelogFunctions,\n  getDependencyReleaseLine: async () => \"\",\n};\n\nmodule.exports = {\n  ...customFunctions,\n  default: customFunctions,\n};\n"
  },
  {
    "path": "scripts/release.ts",
    "content": "/**\n * The following code is adapted from a fork of the `changesets/actions` repository\n * to allow us to generate aggregated changelogs for our monorepo.\n * This code can be removed when changesets supports monorepo aggregations.\n */\n\n/* eslint-disable @typescript-eslint/ban-ts-comment */\n\n/* eslint-disable no-console */\n\nimport fs from \"fs-extra\";\nimport path from \"path\";\n\nimport unified from \"unified\";\nimport remarkParse from \"remark-parse\";\nimport remarkStringify from \"remark-stringify\";\n// @ts-ignore\nimport mdastToString from \"mdast-util-to-string\";\nimport { Octokit } from \"octokit\";\n\nexport const BumpLevels = {\n  dep: 0,\n  patch: 1,\n  minor: 2,\n  major: 3,\n} as const;\n\nexport function getChangelogEntry(changelog: string, version: string) {\n  const ast = unified().use(remarkParse).parse(changelog) as any;\n\n  let highestLevel: number = BumpLevels.dep;\n\n  const nodes = ast.children as Array<any>;\n  let headingStartInfo:\n    | {\n        index: number;\n        depth: number;\n      }\n    | undefined;\n  let endIndex: number | undefined;\n\n  for (let i = 0; i < nodes.length; i++) {\n    const node = nodes[i];\n    if (node.type === \"heading\") {\n      const stringified: string = mdastToString(node);\n      const match = stringified.toLowerCase().match(/(major|minor|patch)/);\n      if (match !== null) {\n        const level = BumpLevels[match[0] as \"major\" | \"minor\" | \"patch\"];\n        highestLevel = Math.max(level, highestLevel);\n      }\n      if (headingStartInfo === undefined && stringified === version) {\n        headingStartInfo = {\n          index: i,\n          depth: node.depth,\n        };\n        continue;\n      }\n      if (\n        endIndex === undefined &&\n        headingStartInfo !== undefined &&\n        headingStartInfo.depth === node.depth\n      ) {\n        endIndex = i;\n        break;\n      }\n    }\n  }\n  if (headingStartInfo) {\n    ast.children = ast.children.slice(headingStartInfo.index + 1, endIndex);\n  }\n  return {\n    content: unified().use(remarkStringify).stringify(ast),\n    highestLevel,\n  };\n}\n\nconst createAggregatedRelease = async () => {\n  const octokit = new Octokit({ auth: process.env.CHANGESETS_GITHUB_TOKEN });\n  const prevRelease = await octokit.rest.repos.getLatestRelease({\n    owner: \"FormidableLabs\",\n    repo: \"victory\",\n  });\n\n  const pkgFileName = path.join(\"packages\", \"victory\", \"package.json\");\n  const packageJson = JSON.parse(await fs.readFile(pkgFileName, \"utf8\"));\n\n  const changelogFileName = path.join(\"packages\", \"victory\", \"CHANGELOG.md\");\n  const changelog = await fs.readFile(changelogFileName, \"utf8\");\n\n  const changelogEntry = getChangelogEntry(changelog, packageJson.version);\n\n  if (!changelogEntry) {\n    // we can find a changelog but not the entry for this version\n    // if this is true, something has probably gone wrong\n    throw new Error(\n      `Could not find changelog entry for ${packageJson.name}@${packageJson.version}`,\n    );\n  }\n\n  const tag_name = `v${packageJson.version}`;\n  const prevTag = prevRelease.data.tag_name;\n\n  const link = `Full Changelog: [${prevTag}...${tag_name}](https://github.com/FormidableLabs/victory/compare/${prevTag}...${tag_name})`;\n  const body = `## What's Changed\\n\\n${changelogEntry.content}\\n\\n${link}`;\n\n  await octokit.rest.repos.createRelease({\n    owner: \"FormidableLabs\",\n    repo: \"victory\",\n    tag_name,\n    name: tag_name,\n    body,\n    prerelease: false,\n  });\n};\n\n(async () => {\n  await createAggregatedRelease();\n})()\n  .then(() => console.log(\"Release created!\"))\n  .catch(console.error);\n"
  },
  {
    "path": "scripts/sync-pkgs-wireit-helpers.js",
    "content": "function unique(arr) {\n  return [...new Set(arr)];\n}\nfunction concat(...arrays) {\n  return unique([].concat(...arrays));\n}\n\nfunction generateWireitConfig(pkg, rootPkg) {\n  const isVictoryPackage = (p) => p.startsWith(\"victory\") && p !== pkg.name;\n  const deps = Object.keys(pkg.dependencies || {}).filter(isVictoryPackage);\n  const devDeps = Object.keys(pkg.devDependencies || {}).filter(\n    isVictoryPackage,\n  );\n  const rootDeps = Object.keys(rootPkg.devDependencies).filter(\n    isVictoryPackage,\n  );\n  // Lint require victory-vendor (if dependend) to be built\n  const lintDeps = [\n    // victory-vendor has nested path accesses, which means it needs\n    // to be built for lint to not error on it if a dependency.\n    ...(deps.includes(\"victory-vendor\") ? [\"../victory-vendor:build\"] : []),\n    ...concat(deps, devDeps, rootDeps).map((dep) => `../${dep}:types:create`),\n  ];\n\n  // We want this block to look like JSON, so disable prettier:\n  // prettier-ignore\n  return {\n    \"scripts\": {\n      \"###            THESE SCRIPTS ARE GENERATED           ###\": \"true\",\n      \"###            DO NOT MODIFY THESE MANUALLY          ###\": \"true\",\n      \"build\": \"wireit\",\n      \"build:lib\": \"wireit\",\n      \"build:lib:esm\": \"wireit\",\n      \"build:lib:cjs\": \"wireit\",\n      \"build:dist\": \"wireit\",\n      \"build:dist:dev\": \"wireit\",\n      \"build:dist:min\": \"wireit\",\n      \"check\": \"wireit\",\n      \"types:check\": \"wireit\",\n      \"types:create\": \"wireit\",\n      \"lint\": \"wireit\",\n      \"lint:fix\": \"wireit\",\n      \"jest\": \"wireit\",\n    },\n    \"engines\": {\n      \"node\": \">=18.0.0\"\n    },\n    \"wireit\": {\n      \"###            THESE WIREIT CONFIGS ARE GENERATED        ####\": {},\n      \"###            DO NOT MODIFY THESE MANUALLY              ####\": {},\n      \"build\": {\n        \"dependencies\": [\n          \"build:lib\",\n          \"build:dist\",\n          \"types:create\"\n        ],\n      },\n      \"build:lib\": {\n        \"dependencies\": [\n          \"build:lib:esm\",\n          \"build:lib:cjs\"\n        ],\n      },\n      \"build:lib:esm\": {\n        \"command\": \"nps build:lib:esm\",\n        \"files\": [\n          \"src/**\",\n          \"!src/**/*.test.*\",\n          \"../../.babelrc.build.js\",\n          \"../../.babelrc.js\",\n          \"../../package-scripts.js\",\n        ],\n        \"output\": [\n          \"es/**/*.js\",\n          \"es/**/*.js.map\"\n        ],\n        \"dependencies\": [\n          ...deps.map((dep) => `../${dep}:build:lib:esm`)\n        ],\n        \"packageLocks\": [\"pnpm-lock.yaml\"]\n      },\n      \"build:lib:cjs\": {\n        \"command\": \"nps build:lib:cjs\",\n        \"files\": [\n          \"src/**\",\n          \"!src/**/*.test.*\",\n          \"../../.babelrc.build.js\",\n          \"../../.babelrc.js\",\n          \"../../package-scripts.js\",\n        ],\n        \"output\": [\n          \"lib/**/*.js\",\n          \"lib/**/*.js.map\"\n        ],\n        \"dependencies\": [\n          ...deps.map((dep) => `../${dep}:build:lib:cjs`)\n        ],\n        \"packageLocks\": [\"pnpm-lock.yaml\"]\n      },\n      \"build:dist\": {\n        \"dependencies\": [\n          \"build:dist:dev\",\n          \"build:dist:min\"\n        ],\n      },\n      \"build:dist:dev\": {\n        \"command\": \"nps build:dist:dev\",\n        \"files\": [\n          \"src/**\",\n          \"!src/**/*.test.*\",\n          \"../../.babelrc.build.js\",\n          \"../../.babelrc.js\",\n          \"../../package-scripts.js\",\n          \"../../config/webpack.config.js\",\n          \"../../config/webpack.config.dev.js\",\n        ],\n        \"output\": [\n          \"dist/victory*.js\",\n          \"!dist/victory*.min.js*\",\n        ],\n        // Webpack uses:\n        // 1. Source (`src`) of package being built.\n        // 2. The ESM version of dependencies specified in our\n        //    `package.json:module` fields.\n        \"dependencies\": [\n          ...deps.map((dep) => `../${dep}:build:lib:esm`)\n        ],\n        \"packageLocks\": [\"pnpm-lock.yaml\"]\n      },\n      \"build:dist:min\": {\n        \"command\": \"nps build:dist:min\",\n        \"files\": [\n          \"src/**\",\n          \"!src/**/*.test.*\",\n          \"../../.babelrc.build.js\",\n          \"../../.babelrc.js\",\n          \"../../package-scripts.js\",\n          \"../../config/webpack.config.js\",\n        ],\n        \"output\": [\n          \"dist/victory*.min.js*\"\n        ],\n        \"dependencies\": [\n          ...deps.map((dep) => `../${dep}:build:lib:esm`)\n        ],\n        \"packageLocks\": [\"pnpm-lock.yaml\"]\n      },\n      \"check\": {\n        \"dependencies\": [\n          \"types:check\",\n          \"jest\",\n          \"format\",\n          \"lint\",\n        ]\n      },\n      \"types:check\": {\n        \"command\": \"nps types:pkg:check\",\n        \"files\": [\n          \"src/**/*.{ts,tsx}\",\n          \"../../tsconfig.base.json\",\n          \"tsconfig.json\",\n        ],\n        \"dependencies\": [\n          \"types:create\",\n          ...concat(deps, devDeps, rootDeps)\n            .map((dep) => `../${dep}:types:create`),\n        ],\n        \"output\": [],\n        \"packageLocks\": [\"pnpm-lock.yaml\"]\n      },\n      \"types:create\": {\n        \"command\": \"nps types:pkg:create\",\n        \"files\": [\n          \"src/**\",\n          \"!src/**/*.test.*\",\n          \"../../tsconfig.base.json\",\n          \"tsconfig.build.json\",\n        ],\n        \"output\": [\n          \"es/**/*.d.ts\",\n          \"es/**/*.d.ts.map\",\n          \"lib/**/*.d.ts\",\n          \"lib/**/*.d.ts.map\",\n        ],\n        \"dependencies\": [\n          ...deps.map((dep) => `../${dep}:types:create`)\n        ],\n        \"packageLocks\": [\"pnpm-lock.yaml\"]\n      },\n      // Same as above\n      ...[\"lint\", \"lint:fix\"].reduce((wireit, key) => {\n        wireit[key] = {\n          \"command\": key === \"lint\" ? \"eslint src\" : \"eslint --fix src\",\n          \"files\": [\n            \"src/**\",\n          ],\n          \"output\": [],\n          \"dependencies\": [\n            ...lintDeps,\n          ],\n          \"packageLocks\": [\"pnpm-lock.yaml\"]\n        };\n\n        return wireit;\n      }, {}),\n\n      \"jest\": {\n        \"command\": \"jest --passWithNoTests\",\n        \"files\": [\n          \"src/**/*.test.*\",\n          \"../../.babelrc.js\",\n          \"../../test/jest-config.js\",\n          \"../../test/jest-setup.ts\",\n        ],\n        \"output\": [],\n        // Jest uses:\n        // 1. Source (`src`) for actual test files within a package.\n        // 2. The CommonJS (`lib`) versions of library files (dependencies\n        //    and the package at issue).\n        \"dependencies\": [\n          ...concat(deps, devDeps, rootDeps).map((dep) => `../${dep}:build`),\n        ],\n        \"packageLocks\": [\"pnpm-lock.yaml\"]\n      },\n    },\n  };\n}\n\nmodule.exports = { generateWireitConfig };\n"
  },
  {
    "path": "scripts/sync-pkgs-wireit.js",
    "content": "#!/usr/bin/env node\n\n/**\n * This helper script uses a template to mutate all library package.json's:\n *\n * 1. Adds all `scripts` and `wireit` configs to that package.\n * 2. Updates wireit config dependencies to match package.json dependencies.\n *\n * The script also adds `wireit` configs to the root package.json.\n *\n * Note that this script does _not_ mutate:\n * - victory-vendor\n * - victory-native\n *\n * If you are editing `victory-vendor` or `victory-native`, directly edit them.\n * For **all other packages**, make your changes in\n * `sync-pkgs-wireit-helpers.js`.\n */\n\nconst fs = require(\"fs/promises\");\nconst path = require(\"path\");\nconst { generateWireitConfig } = require(\"./sync-pkgs-wireit-helpers\");\nconst { log, error } = console;\n\n// ============================================================================\n// Config\n// ============================================================================\nconst ROOT = path.resolve(__dirname, \"..\");\nconst PKGS_ROOT = path.join(ROOT, \"packages\");\n\n// Special packages\nconst PKGS = {\n  NATIVE: \"victory-native\",\n  VENDOR: \"victory-vendor\",\n};\nconst SPECIAL_PKGS = new Set([PKGS.NATIVE, PKGS.VENDOR]);\n\n// ============================================================================\n// Helpers\n// ============================================================================\nconst readPkg = async (pkgPath) => JSON.parse(await fs.readFile(pkgPath));\nconst writePkg = async (pkgPath, data, originalPkg) => {\n  const json = JSON.stringify(data, null, 2);\n  if (json === JSON.stringify(originalPkg, null, 2)) {\n    log(`Skipping ${pkgPath} (no changes)`);\n    return;\n  }\n  log(`Writing ${pkgPath}`);\n  await fs.writeFile(pkgPath, `${json}\\n`);\n};\nconst clone = (obj) => JSON.parse(JSON.stringify(obj));\nconst isVictoryPackage = (p) => p.startsWith(\"victory\");\n\n// Check for package locks, which we need to set on each wireit config\n// with non-empty `files`.\nconst validateLocks = (pkgPath, pkg) =>\n  Object.entries(pkg.wireit).forEach(([key, obj]) => {\n    if (obj.files && obj.files.length && !obj.packageLocks) {\n      throw new Error(\n        `Missing packageLocks for wireit config for: ${key} in ${pkgPath}`,\n      );\n    }\n  });\n\n// Root mutation\n//\n// We want to use wireit directly to manage multi-build for better\n// cache hits (e.g. `pnpm -r run build` seems to get a lot of cache\n// misses). So create tasks with cross-package deps\nconst updateRootPkg = async ({ allPkgs }) => {\n  const rootPkgPath = `${ROOT}/package.json`;\n  const originalPkg = await readPkg(rootPkgPath);\n  const rootPkg = clone(originalPkg);\n\n  rootPkg.wireit = rootPkg.wireit || {};\n  [\n    { rootTask: \"build\", pkgTask: \"build\" },\n    { rootTask: \"build:lib:esm\", pkgTask: \"build:lib:esm\" },\n    { rootTask: \"jest:pkgs\", pkgTask: \"jest\" },\n    { rootTask: \"types:check\", pkgTask: \"types:check\" },\n    { rootTask: \"types:create\", pkgTask: \"types:create\" },\n  ].forEach(({ rootTask, pkgTask }) => {\n    rootPkg.wireit[rootTask] = rootPkg.wireit[rootTask] || {};\n    rootPkg.wireit[rootTask].dependencies = allPkgs.map(\n      (p) => `./packages/${p}:${pkgTask}`,\n    );\n  });\n\n  validateLocks(rootPkgPath, rootPkg);\n  await writePkg(rootPkgPath, rootPkg, originalPkg);\n};\n\n// Generate configurations for all packages:\nconst updateLibPkgs = async ({ libPkgs }) => {\n  const rootPkg = await readPkg(`${ROOT}/package.json`);\n\n  for (const workspace of libPkgs) {\n    const pkgPath = `${PKGS_ROOT}/${workspace}/package.json`;\n    const originalPkg = await readPkg(pkgPath);\n    const pkg = {\n      ...originalPkg,\n      ...generateWireitConfig(originalPkg, rootPkg),\n    };\n\n    validateLocks(pkgPath, pkg);\n    await writePkg(pkgPath, pkg, originalPkg);\n  }\n};\n\n// ============================================================================\n// Script\n// ============================================================================\nconst cli = async () => {\n  // Get packages.\n  const libPkgs = (await fs.readdir(PKGS_ROOT)).filter(\n    (p) => isVictoryPackage(p) && !SPECIAL_PKGS.has(p),\n  );\n  const allPkgs = [...SPECIAL_PKGS, ...libPkgs];\n\n  // Mutate package.json's\n  await updateRootPkg({ allPkgs });\n  await updateLibPkgs({ libPkgs });\n\n  log(\"Finished syncing.\");\n};\n\nif (require.main === module) {\n  cli().catch((err) => {\n    error(err);\n    process.exit(1);\n  });\n}\n\nmodule.exports = {\n  cli,\n};\n"
  },
  {
    "path": "stories/utils/arg-types.tsx",
    "content": "import React from \"react\";\n\nimport { VictoryLabel, VictoryTheme, VictoryTooltip } from \"@/victory\";\n\nexport const VictoryAxisCommonProps = {\n  dependentAxis: { control: \"boolean\" },\n  invertAxis: { control: \"boolean\" },\n  tickCount: { control: \"number\" },\n\n  // disable changing these values\n  axisComponent: { control: false },\n  axisLabelComponent: { control: false },\n  axisValue: { control: false },\n  disableInlineStyles: { control: false },\n  gridComponent: { control: false },\n  style: { control: false },\n  tickComponent: { control: false },\n  tickFormat: { control: false },\n  tickLabelComponent: { control: false },\n  tickValues: { control: false },\n} as const;\n\nexport const VictoryCommonThemeProps = {\n  animate: { control: \"boolean\" },\n  colorScale: {\n    control: \"select\",\n    options: [\n      \"greyscale\",\n      \"qualitative\",\n      \"heatmap\",\n      \"warm\",\n      \"cool\",\n      \"red\",\n      \"green\",\n      \"blue\",\n    ],\n  },\n  disableInlineStyles: { control: \"boolean\" },\n  height: { control: \"number\" },\n  horizontal: { control: \"boolean\" },\n  name: { control: \"text\" },\n  padding: { control: \"text\" },\n  polar: { control: \"boolean\" },\n  standalone: { control: \"boolean\" },\n  width: { control: \"number\" },\n\n  // disable changing these values\n  containerComponent: { control: false },\n  groupComponent: { control: false },\n  externalEventMutations: { control: false },\n  domainPadding: { control: false },\n  maxDomain: { control: false },\n  minDomain: { control: false },\n  origin: { control: false },\n  range: { control: false },\n  scale: { control: false },\n  sharedEvents: { control: false },\n  singleQuadrantDomainPadding: { control: false },\n} as const;\n\nexport const VictoryCommonProps = {\n  ...VictoryCommonThemeProps,\n\n  // disable changing these values\n  theme: { control: false },\n\n  // custom control to allow us to hoist the theme to the parent\n  // chart for better control of rendering\n  themeKey: { control: \"select\", options: Object.keys(VictoryTheme) },\n} as const;\n\nexport const VictoryContainerProps = {\n  \"aria-describedby\": { control: \"text\" },\n  \"aria-labelledby\": { control: \"text\" },\n  className: { control: \"text\" },\n  containerId: { control: \"text\" },\n  desc: { control: \"text\" },\n  height: { control: \"number\" },\n  name: { control: \"text\" },\n  ouiaId: { control: \"text\" },\n  ouiaSafe: { control: \"boolean\" },\n  ouiaType: { control: \"text\" },\n  polar: { control: \"boolean\" },\n  portalZIndex: { control: \"number\" },\n  preserveAspectRatio: { control: \"text\" },\n  responsive: { control: \"boolean\" },\n  role: { control: \"text\" },\n  tabIndex: { control: \"number\" },\n  title: { control: \"text\" },\n  width: { control: \"number\" },\n} as const;\n\nexport const VictoryDatableProps = {\n  data: { control: \"object\" },\n  samples: { control: \"number\" },\n  sortKey: { control: \"text\" },\n  sortOrder: { control: \"select\", options: [\"ascending\", \"descending\"] },\n\n  // disable changing these values\n  categories: { control: false },\n  dataComponent: { control: false },\n  domain: { control: false },\n  domainPadding: { control: false },\n  x: { control: false },\n  y: { control: false },\n  y0: { control: false },\n} as const;\n\nexport const VictoryLabelableProps = {\n  labelComponent: {\n    options: [\"Label\", \"Tooltip\"],\n    mapping: {\n      Label: <VictoryLabel />,\n      Tooltip: <VictoryTooltip />,\n    },\n  },\n} as const;\n\nexport const VictoryMultiLabelableProps = {\n  ...VictoryLabelableProps,\n\n  // NOTE: controls not yet supported, but left for clarity\n  // labels: { control: \"text\" },\n} as const;\n\nexport const VictorySingleLabelableProps = {\n  ...VictoryLabelableProps,\n\n  // NOTE: controls not yet supported, but left for clarity\n  // label: { control: \"text\" },\n} as const;\n"
  },
  {
    "path": "stories/utils/data.ts",
    "content": "import range from \"lodash/range\";\nimport seedrandom from \"seedrandom\";\n\nexport const getArrayData = (num: number, samples = 10) => {\n  const seed = \"getData\";\n  const baseSeed = seedrandom(seed);\n  const rand = () => baseSeed.quick() * 10;\n  return range(num).map((v) => {\n    return {\n      x: v + 1,\n      y: range(samples).map(() => rand()),\n    };\n  });\n};\n\nexport const getBoxPlotData = (num, seed = \"getData\") => {\n  const baseSeed = seedrandom(seed);\n  const rand = () => Math.round(1 + baseSeed.quick() * 5);\n  return range(num).map((v) => {\n    const min = rand();\n    const q1 = min + rand();\n    const median = q1 + rand();\n    const q3 = median + rand();\n    const max = q3 + rand();\n    return { x: v + 1, y: v + 1, min, q1, median, q3, max };\n  });\n};\n\nexport const getBoxPlotRepeatData = (num, samples = 10) => {\n  const seed = \"getRepeatData\";\n  const baseSeed = seedrandom(seed);\n  const rand = () => baseSeed.quick() * 10;\n  return range(num).reduce((memo, curr) => {\n    const sampleData = range(samples).map(() => ({\n      x: curr + 1,\n      y: rand(),\n    }));\n    return memo.concat(sampleData);\n  }, [] as any);\n};\n\nexport const getCandlestickData = (num, seed = \"getData\") => {\n  const baseSeed = seedrandom(seed);\n  return range(num).map((v) => {\n    const low = 2 + baseSeed.quick() * 5;\n    const open = low + baseSeed.quick() * 5;\n    const close = low + baseSeed.quick() * 5;\n    const high = Math.max(open, close) + baseSeed.quick() * 5;\n    return { x: v + 1, high, low, open, close };\n  });\n};\n\nexport const getCandlestickTimeData = (num, seed = \"getTimeData\") => {\n  const baseSeed = seedrandom(seed);\n  const current = 1523389495000;\n  return range(num).map((v) => {\n    const low = 2 + baseSeed.quick() * 5;\n    const open = low + baseSeed.quick() * 5;\n    const close = low + baseSeed.quick() * 5;\n    const high = Math.max(open, close) + baseSeed.quick() * 5;\n    return {\n      x: new Date((current / num) * (v + 1)),\n      high,\n      low,\n      open,\n      close,\n    };\n  });\n};\n\nexport const getData = (num: number, seed = \"getData\", max = 10) => {\n  const baseSeed = seedrandom(seed);\n  const rand = () => baseSeed.quick() * max;\n  return range(num).map((v) => ({ x: v + 1, y: rand() }));\n};\n\nexport const getDataWithBaseline = (\n  num: number,\n  seed = \"getData\",\n  max = 10,\n) => {\n  const baseSeed = seedrandom(seed);\n  const rand = () => baseSeed.quick() * max;\n  return range(num).map((v) => ({ x: v + 1, y: rand(), y0: rand() }));\n};\n\nexport const getDescendingSmallData = () => {\n  return [\n    { x: 1, y: 2 },\n    { x: 2, y: 1 },\n    { x: 3, y: 0.5 },\n    { x: 4, y: 0.2 },\n    { x: 5, y: 0.1 },\n    { x: 6, y: -0.1 },\n    { x: 7, y: -0.2 },\n    { x: 8, y: -0.5 },\n    { x: 9, y: -1 },\n    { x: 10, y: -2 },\n  ];\n};\n\nexport const getErrorBarData = (\n  num: number,\n  symmetric = false,\n  seed = \"getData\",\n) => {\n  const baseSeed = seedrandom(seed);\n  const rand = () => baseSeed.quick() * 3;\n  return range(num).map((v) => {\n    return {\n      x: v + 3,\n      y: baseSeed.quick() * 20 + 5,\n      errorX: symmetric ? rand() : [rand(), rand()],\n      errorY: symmetric ? rand() : [rand(), rand()],\n    };\n  });\n};\n\nexport const getFourQuadrantData = (num: number, seed = \"getMixedData\") => {\n  const baseSeed = seedrandom(seed);\n  const rand = () => baseSeed.quick() * 10 - 5;\n  return range(num).map((v) => ({ x: v - Math.round(num / 2), y: rand() }));\n};\n\nexport const getLogData = (num: number, seed = \"getData\") => {\n  const baseSeed = seedrandom(seed);\n  const rand = () => baseSeed.quick() * 100000;\n  return range(num).map((v) => ({ x: v + 1, y: rand() }));\n};\n\nexport const getMixedData = (num: number, seed = \"getMixedData\") => {\n  const baseSeed = seedrandom(seed);\n  const rand = () => baseSeed.quick() * 10 - 5;\n  return range(num).map((v) => ({ x: v + 1, y: rand() }));\n};\n\nexport const getRandomValues = (num, seed = \"random\") => {\n  const baseSeed = seedrandom(seed);\n  const rand = () => Math.round(baseSeed.quick() * 100);\n  const result = range(num).map(() => rand());\n  return result.sort((a, b) => a - b);\n};\n\nexport const getStackedData = (num: number, samples, useStrings) => {\n  return range(num).map(() => {\n    return useStrings ? getStringData(samples) : getData(samples);\n  });\n};\n\nexport const getStringData = (num: number, seed = \"getData\") => {\n  const baseSeed = seedrandom(seed);\n  const rand = () => baseSeed.quick() * 10;\n  return range(num).map((v) => ({ x: `#${v + 1}`, y: rand() }));\n};\n\nexport const getTimeData = (num: number, seed = \"getData\") => {\n  const baseSeed = seedrandom(seed);\n  const rand = () => baseSeed.quick() * 10;\n  const current = 1523389495000;\n  return range(num).map((v) => {\n    return {\n      x: new Date((current / num) * (v + 1)),\n      y: rand(),\n    };\n  });\n};\n\nexport const getTimeValues = (num) => {\n  const current = 1523389495000;\n  return range(num).map((v) => {\n    return new Date((current / num) * (v + 1));\n  });\n};\n\nexport const getValues = (num, min = 0, step = 1) => {\n  return range(num).map((v) => v * step + min);\n};\n"
  },
  {
    "path": "stories/utils/decorators.tsx",
    "content": "import React from \"react\";\n\nconst containerStyle: React.CSSProperties = {\n  display: \"grid\",\n  gridTemplateColumns: \"repeat(2, 1fr)\",\n  gridColumnGap: \"1rem\",\n  gridRowGap: \"1rem\",\n};\n\nexport const componentContainer = (story: any) => (\n  <div style={containerStyle}>{story()}</div>\n);\n"
  },
  {
    "path": "stories/victory-charts/victory-animation/config.ts",
    "content": "import React from \"react\";\nimport type { Meta, StoryObj } from \"@storybook/react\";\n\nimport { VictoryAnimation } from \"@/victory\";\nimport { componentContainer } from \"../../utils/decorators\";\n\ntype StoryProps = React.ComponentProps<typeof VictoryAnimation>;\n\nexport const ComponentMeta: Meta<StoryProps> = {\n  component: VictoryAnimation,\n  decorators: [componentContainer],\n\n  argTypes: {\n    delay: { control: \"number\" },\n    duration: { control: \"number\" },\n    easing: { control: \"text\" },\n  },\n};\n\nexport type Story = StoryObj<StoryProps>;\n"
  },
  {
    "path": "stories/victory-charts/victory-animation/default.stories.tsx",
    "content": "/* eslint-disable react-hooks/rules-of-hooks */\nimport React, { useEffect, useState } from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryAnimation, VictoryLabel, VictoryPie } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryAnimation> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryAnimation\",\n};\n\nconst ANIMATION_DATA = [\n  [\n    { x: 1, y: 0 },\n    { x: 2, y: 100 },\n  ],\n  [\n    { x: 1, y: 25 },\n    { x: 2, y: 75 },\n  ],\n  [\n    { x: 1, y: 50 },\n    { x: 2, y: 50 },\n  ],\n  [\n    { x: 1, y: 75 },\n    { x: 2, y: 25 },\n  ],\n  [\n    { x: 1, y: 100 },\n    { x: 2, y: 0 },\n  ],\n];\n\nexport const Default: Story = {\n  args: {},\n  render: (props) => {\n    const [data, setData] = useState(ANIMATION_DATA[0]);\n    const [percent, setPercent] = useState(0);\n\n    useEffect(() => {\n      const interval = setInterval(() => {\n        const nextIndex =\n          (ANIMATION_DATA.indexOf(data) + 1) % ANIMATION_DATA.length;\n        setData(ANIMATION_DATA[nextIndex]);\n        setPercent(ANIMATION_DATA[nextIndex][0].y);\n      }, 2000);\n\n      // clean up interval on unmount\n      return () => clearInterval(interval);\n    }, [data, percent]);\n\n    return (\n      <div>\n        <svg viewBox=\"0 0 400 400\" width=\"100%\" height=\"100%\">\n          <VictoryPie\n            standalone={false}\n            animate={{ duration: 1000 }}\n            width={400}\n            height={400}\n            data={data}\n            innerRadius={120}\n            cornerRadius={25}\n            labels={() => null}\n            style={{\n              data: {\n                fill: ({ datum }) => {\n                  const color = datum.y > 30 ? \"green\" : \"red\";\n                  return datum.x === 1 ? color : \"transparent\";\n                },\n              },\n            }}\n          />\n          <VictoryAnimation {...props} data={{ percent }}>\n            {(newProps) => {\n              return (\n                <VictoryLabel\n                  textAnchor=\"middle\"\n                  verticalAnchor=\"middle\"\n                  x={200}\n                  y={200}\n                  text={`${Math.round(Number(newProps.percent))}%`}\n                  style={{ fontSize: 45 }}\n                />\n              );\n            }}\n          </VictoryAnimation>\n        </svg>\n      </div>\n    );\n  },\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-area/config.ts",
    "content": "import type { Meta, StoryObj } from \"@storybook/react\";\n\nimport { VictoryArea, VictoryAreaProps } from \"@/victory\";\n\nimport {\n  VictoryCommonProps,\n  VictoryDatableProps,\n  VictoryMultiLabelableProps,\n} from \"../../utils/arg-types\";\nimport { componentContainer } from \"../../utils/decorators\";\n\ntype StoryProps = VictoryAreaProps & {\n  themeKey: string;\n};\n\nexport const ComponentMeta: Meta<Omit<StoryProps, \"themeKey\">> = {\n  component: VictoryArea,\n  decorators: [componentContainer],\n\n  argTypes: {\n    ...VictoryCommonProps,\n    ...VictoryDatableProps,\n    ...VictoryMultiLabelableProps,\n\n    interpolation: {\n      control: \"select\",\n      options: [\n        \"basis\",\n        \"basisClosed\",\n        \"basisOpen\",\n        \"bundle\",\n        \"cardinal\",\n        \"cardinalClosed\",\n        \"cardinalOpen\",\n        \"catmullRom\",\n        \"catmullRomClosed\",\n        \"catmullRomOpen\",\n        \"linear\",\n        \"linearClosed\",\n        \"monotoneX\",\n        \"monotoneY\",\n        \"natural\",\n        \"radial\",\n        \"step\",\n        \"stepAfter\",\n        \"stepBefore\",\n      ],\n    },\n  },\n};\n\nexport type Story = StoryObj<StoryProps>;\n"
  },
  {
    "path": "stories/victory-charts/victory-area/data-accessors.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryArea, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryArea> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryArea\",\n};\n\nexport const DataAccessors: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea\n          {...props}\n          data={[\n            { animal: \"Cat\", pet: 45, wild: 17 },\n            { animal: \"Dog\", pet: 85, wild: 6 },\n            { animal: \"Fish\", pet: 55, wild: 0 },\n            { animal: \"Bird\", pet: 15, wild: 40 },\n          ]}\n          x={\"animal\"}\n          y={(data) => data.pet + data.wild}\n        />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea\n          {...props}\n          data={[\n            { animal: \"Cat\", pet: 45, wild: 17 },\n            { animal: \"Dog\", pet: 85, wild: 6 },\n            { animal: \"Fish\", pet: 55, wild: 0 },\n            { animal: \"Bird\", pet: 15, wild: 40 },\n          ]}\n          x={\"animal\"}\n          y={(data) => data.pet + data.wild}\n        />\n      </VictoryChart>\n      <VictoryChart polar theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea\n          {...props}\n          data={[\n            { animal: \"Cat\", pet: 45, wild: 17 },\n            { animal: \"Dog\", pet: 85, wild: 6 },\n            { animal: \"Fish\", pet: 55, wild: 0 },\n            { animal: \"Bird\", pet: 15, wild: 40 },\n          ]}\n          x={\"animal\"}\n          y={(data) => data.pet + data.wild}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea {...props} data={getData(8)} y0={(d) => d.y - 1} />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea {...props} data={getData(8)} y0={(d) => d.y - 1} />\n      </VictoryChart>\n      <VictoryChart polar theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea {...props} data={getData(8)} y0={(d) => d.y - 1} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea\n          {...props}\n          data={[\n            { a: { b: { c: 1, d: 1 } } },\n            { a: { b: { c: 2, d: 3 } } },\n            { a: { b: { c: 3, d: 2 } } },\n          ]}\n          x={\"a.b.c\"}\n          y={\"a.b.d\"}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea\n          {...props}\n          data={[\n            { x: \"Cat\", y: 45, y0: 17 },\n            { x: \"Dog\", y: 85, y0: 6 },\n            { x: \"Fish\", y: 55, y0: 9 },\n            { x: \"Bird\", y: 15, y0: 4 },\n          ]}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-area/default.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryArea, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryArea> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryArea\",\n};\n\nexport const Default: Story = {\n  args: {},\n  render: (props) => (\n    <VictoryChart\n      theme={VictoryTheme[props.themeKey]}\n      height={props.height}\n      width={props.width}\n    >\n      <VictoryArea {...props} />\n    </VictoryChart>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-area/disable-inline-styles.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { Area, VictoryArea, VictoryTheme } from \"@/victory\";\n\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryArea> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryArea\",\n};\n\nexport const DisableInlineStyles: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryArea\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        disableInlineStyles\n      />\n      <VictoryArea\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dataComponent={<Area disableInlineStyles className=\"fill-purple\" />}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-area/events.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryArea, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryArea> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryArea\",\n};\n\nexport const Events: Story = {\n  args: {},\n  render: (props) => (\n    <VictoryChart theme={VictoryTheme[props.themeKey]}>\n      <VictoryArea\n        {...props}\n        style={{ data: { fill: \"tomato\" } }}\n        events={[\n          {\n            target: \"data\",\n            eventHandlers: {\n              onClick: () => {\n                return [\n                  {\n                    eventKey: \"all\",\n                    target: \"data\",\n                    mutation: (eventProps) => {\n                      const fill = eventProps.style && eventProps.style.fill;\n                      return fill === \"black\"\n                        ? null\n                        : { style: { fill: \"black\" } };\n                    },\n                  },\n                ];\n              },\n            },\n          },\n        ]}\n        data={getData(5)}\n      />\n    </VictoryChart>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-area/interpolation.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  InterpolationPropType,\n  VictoryArea,\n  VictoryChart,\n  VictoryLabel,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { getData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryArea> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryArea\",\n};\n\nexport const Interpolation: Story = {\n  args: {\n    data: getData(8),\n  },\n  render: (props) => (\n    <>\n      {[\n        \"basis\",\n        \"cardinal\",\n        \"catmullRom\",\n        \"linear\",\n        \"monotoneX\",\n        \"monotoneY\",\n        \"natural\",\n        \"step\",\n        \"stepAfter\",\n        \"stepBefore\",\n      ].map((interpolation) => (\n        <VictoryChart theme={VictoryTheme[props.themeKey]} key={interpolation}>\n          <VictoryLabel\n            x={175}\n            y={30}\n            style={{ textAnchor: \"middle\" }}\n            text={interpolation}\n          />\n          <VictoryArea\n            {...props}\n            interpolation={interpolation as InterpolationPropType}\n          />\n        </VictoryChart>\n      ))}\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-area/labels.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryArea, VictoryChart } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryArea> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryArea\",\n};\n\nexport const Labels: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart>\n        <VictoryArea\n          {...props}\n          data={getData(7)}\n          labels={({ datum }) => `x: ${datum.x}`}\n        />\n      </VictoryChart>\n      <VictoryChart>\n        <VictoryArea\n          {...props}\n          data={getData(7)}\n          labels={[\"\", \"\", \"three\", \"four\", \"5\", \"six\"]}\n        />\n      </VictoryChart>\n      <VictoryChart>\n        <VictoryArea\n          {...props}\n          data={[\n            { x: 1, y: 2, label: \"cat\" },\n            { x: 2, y: 5, label: \"dog\" },\n            { x: 3, y: 3, label: \"dog\" },\n            { x: 4, y: -2, label: \"bird\" },\n            { x: 5, y: -5, label: \"cat\" },\n          ]}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-area/log-scale.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryArea, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { getLogData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryArea> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryArea\",\n};\n\nexport const LogScale: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} scale={{ y: \"log\" }}>\n        <VictoryArea\n          {...props}\n          data={getLogData(7)}\n          labels={({ datum }) => `x: ${datum.x}`}\n        />\n      </VictoryChart>\n      <VictoryChart\n        horizontal\n        theme={VictoryTheme[props.themeKey]}\n        scale={{ y: \"log\" }}\n      >\n        <VictoryArea\n          {...props}\n          data={getLogData(7)}\n          labels={({ datum }) => `x: ${datum.x}`}\n        />\n      </VictoryChart>\n      <VictoryChart\n        polar\n        theme={VictoryTheme[props.themeKey]}\n        scale={{ y: \"log\" }}\n      >\n        <VictoryArea {...props} data={getLogData(7)} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-area/plotting-functions.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryArea, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryArea> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryArea\",\n};\n\nexport const PlottingFunctions: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea {...props} y={(d) => Math.sin(2 * Math.PI * d.x)} />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea {...props} y={(d) => Math.sin(2 * Math.PI * d.x)} />\n      </VictoryChart>\n\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea\n          {...props}\n          y={(d) => Math.sin(2 * Math.PI * d.x)}\n          y0={(d) => Math.sin(2 * Math.PI * d.x) - 0.5}\n        />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea\n          {...props}\n          y={(d) => Math.sin(2 * Math.PI * d.x)}\n          y0={(d) => Math.sin(2 * Math.PI * d.x) - 0.5}\n        />\n      </VictoryChart>\n      <VictoryChart polar theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea {...props} y={(d) => Math.sin(Math.PI * d.x)} />\n      </VictoryChart>\n      <VictoryChart polar theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea\n          {...props}\n          y={(d) => Math.sin(Math.PI * d.x)}\n          y0={(d) => Math.sin(Math.PI * d.x) - 0.5}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-area/polar-interpolation.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  InterpolationPropType,\n  VictoryArea,\n  VictoryChart,\n  VictoryLabel,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { getData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryArea> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryArea\",\n};\n\nexport const PolarInterpolation: Story = {\n  args: {\n    data: getData(8),\n  },\n  render: (props) => (\n    <>\n      {[\"basis\", \"cardinal\", \"catmullRom\", \"linear\"].map((interpolation) => (\n        <VictoryChart\n          polar\n          theme={VictoryTheme[props.themeKey]}\n          key={interpolation}\n        >\n          <VictoryLabel\n            x={175}\n            y={30}\n            style={{ textAnchor: \"middle\" }}\n            text={interpolation}\n          />\n          <VictoryArea\n            {...props}\n            interpolation={interpolation as InterpolationPropType}\n          />\n        </VictoryChart>\n      ))}\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-area/polar.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryArea,\n  VictoryChart,\n  VictoryStack,\n  VictoryTheme,\n} from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryArea> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryArea\",\n};\n\nexport const Polar: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart polar theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea {...props} data={getData(7)} />\n      </VictoryChart>\n      <VictoryChart polar innerRadius={50} theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea {...props} data={getData(7)} />\n      </VictoryChart>\n      <VictoryChart polar theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea\n          {...props}\n          data={[\n            { x: \"Cat\", y: 62 },\n            { x: \"Dog\", y: 91 },\n            { x: \"Fish\", y: 55 },\n            { x: \"Bird\", y: 55 },\n            { x: \"Frog\", y: 75 },\n          ]}\n        />\n      </VictoryChart>\n      <VictoryChart polar innerRadius={50} theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea\n          {...props}\n          data={[\n            { x: \"Cat\", y: 62 },\n            { x: \"Dog\", y: 91 },\n            { x: \"Fish\", y: 55 },\n            { x: \"Bird\", y: 55 },\n            { x: \"Frog\", y: 75 },\n          ]}\n        />\n      </VictoryChart>\n      <VictoryChart polar theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack>\n          <VictoryArea {...props} data={getData(5)} />\n          <VictoryArea {...props} data={getData(5, \"seed-1\")} />\n          <VictoryArea {...props} data={getData(5, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart polar innerRadius={50} theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack>\n          <VictoryArea {...props} data={getData(5)} />\n          <VictoryArea {...props} data={getData(5, \"seed-1\")} />\n          <VictoryArea {...props} data={getData(5, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-area/stacked.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryArea,\n  VictoryChart,\n  VictoryStack,\n  VictoryTheme,\n} from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getData, getDataWithBaseline } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryArea> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryArea\",\n};\n\nexport const Stacked: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack colorScale=\"qualitative\" labels={({ datum }) => datum.x}>\n          <VictoryArea {...props} data={getData(7)} />\n          <VictoryArea {...props} data={getData(7, \"seed-1\")} />\n          <VictoryArea {...props} data={getData(7, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack colorScale=\"qualitative\" labels={({ datum }) => datum.x}>\n          <VictoryArea {...props} data={getData(9)} />\n          <VictoryArea {...props} data={getData(5, \"seed-1\")} />\n          <VictoryArea {...props} data={getData(3, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack colorScale=\"qualitative\" labels={({ datum }) => datum.x}>\n          <VictoryArea {...props} data={getData(7)} />\n          <VictoryArea {...props} data={getData(7, \"seed-1\")} />\n          <VictoryArea {...props} data={getData(7, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack colorScale=\"qualitative\" labels={({ datum }) => datum.x}>\n          <VictoryArea {...props} data={getData(9)} />\n          <VictoryArea {...props} data={getData(5, \"seed-1\")} />\n          <VictoryArea {...props} data={getData(3, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart\n        domainPadding={{ y: 20 }}\n        polar\n        theme={VictoryTheme[props.themeKey]}\n      >\n        <VictoryStack colorScale=\"qualitative\" labels={({ datum }) => datum.x}>\n          <VictoryArea {...props} data={getData(7)} />\n          <VictoryArea {...props} data={getData(7, \"seed-1\")} />\n          <VictoryArea {...props} data={getData(7, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart\n        domainPadding={{ y: 20 }}\n        polar\n        theme={VictoryTheme[props.themeKey]}\n      >\n        <VictoryStack colorScale=\"qualitative\" labels={({ datum }) => datum.x}>\n          <VictoryArea {...props} data={getData(9)} />\n          <VictoryArea {...props} data={getData(5, \"seed-1\")} />\n          <VictoryArea {...props} data={getData(3, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack>\n          <VictoryArea {...props} data={getDataWithBaseline(5)} />\n          <VictoryArea {...props} data={getData(5, \"seed-1\")} />\n          <VictoryArea {...props} data={getData(5, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-area/styles.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryArea,\n  VictoryChart,\n  VictoryLabelStyleObject,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { getData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryArea> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryArea\",\n};\n\nconst labelStyle: VictoryLabelStyleObject = {\n  fill: ({ datum }) => (datum.x === \"Dog\" ? \"red\" : \"black\"),\n};\n\nexport const Styles: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea\n          {...props}\n          data={getData(7)}\n          labels={({ datum }) => datum.x}\n          style={{\n            labels: { fontSize: 20, fill: \"tomato\", fontFamily: \"monospace\" },\n            data: {\n              fill: \"tomato\",\n              fillOpacity: 0.7,\n              stroke: \"tomato\",\n              strokeWidth: 2,\n            },\n          }}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea\n          {...props}\n          style={{\n            labels: labelStyle,\n          }}\n          labels={({ datum }) => datum.x}\n          data={[\n            { x: \"Cat\", y: 62 },\n            { x: \"Dog\", y: 91 },\n            { x: \"Fish\", y: 55 },\n            { x: \"Bird\", y: 55 },\n          ]}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-area/theme.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryArea,\n  VictoryChart,\n  VictoryStack,\n  VictoryTheme,\n} from \"@/victory\";\nimport { getData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryArea> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryArea\",\n};\n\nexport const Theme: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea {...props} data={getData(8)} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack labels={({ datum }) => datum.x}>\n          <VictoryArea {...props} data={getData(8)} />\n          <VictoryArea {...props} data={getData(8, \"seed-1\")} />\n          <VictoryArea {...props} data={getData(8, \"seed-2\")} />\n          <VictoryArea {...props} data={getData(8, \"seed-3\")} />\n          <VictoryArea {...props} data={getData(8, \"seed-4\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme.grayscale}>\n        <VictoryArea {...props} data={getData(8)} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme.grayscale}>\n        <VictoryStack labels={({ datum }) => datum.x}>\n          <VictoryArea {...props} data={getData(8)} />\n          <VictoryArea {...props} data={getData(8, \"seed-1\")} />\n          <VictoryArea {...props} data={getData(8, \"seed-2\")} />\n          <VictoryArea {...props} data={getData(8, \"seed-3\")} />\n          <VictoryArea {...props} data={getData(8, \"seed-4\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme.clean}>\n        <VictoryArea {...props} data={getData(8)} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme.clean}>\n        <VictoryStack labels={({ datum }) => datum.x}>\n          <VictoryArea {...props} data={getData(8)} />\n          <VictoryArea {...props} data={getData(8, \"seed-1\")} />\n          <VictoryArea {...props} data={getData(8, \"seed-2\")} />\n          <VictoryArea {...props} data={getData(8, \"seed-3\")} />\n          <VictoryArea {...props} data={getData(8, \"seed-4\")} />\n        </VictoryStack>\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-area/time-scale.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryArea,\n  VictoryChart,\n  VictoryStack,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { getTimeData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryArea> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryArea\",\n};\n\nexport const TimeScale: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea\n          {...props}\n          data={getTimeData(5)}\n          labels={({ datum }) => datum.x.getFullYear()}\n        />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea\n          {...props}\n          data={getTimeData(5)}\n          labels={({ datum }) => datum.x.getFullYear()}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack labels={({ datum }) => datum.x.getFullYear()}>\n          <VictoryArea {...props} data={getTimeData(5)} />\n          <VictoryArea {...props} data={getTimeData(5, \"seed-1\")} />\n          <VictoryArea {...props} data={getTimeData(5, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack labels={({ datum }) => datum.x.getFullYear()}>\n          <VictoryArea {...props} data={getTimeData(5)} />\n          <VictoryArea {...props} data={getTimeData(5, \"seed-1\")} />\n          <VictoryArea {...props} data={getTimeData(5, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-area/tooltips.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryArea,\n  VictoryChart,\n  VictoryTheme,\n  VictoryTooltip,\n} from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getData, getMixedData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryArea> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryArea\",\n};\n\nexport const Tooltips: Story = {\n  args: {\n    labelComponent: <VictoryTooltip active />,\n  },\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea\n          {...props}\n          data={getData(5)}\n          labels={({ datum }) => `x: ${datum.x}`}\n        />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea\n          {...props}\n          data={getData(5)}\n          labels={({ datum }) => `x: ${datum.x}`}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea\n          {...props}\n          data={getMixedData(5)}\n          labels={({ datum }) => `x: ${datum.x}`}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryArea\n          {...props}\n          data={getData(5)}\n          labels={[\"one\", \"two\", \"3\", \"wow, four tooltips\", \"five\"]}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-axis/axis-value.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryAxis, VictoryBar, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryAxis\",\n};\n\nexport const AxisValue: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis {...props} tickValues={[1, 2, 3, 4, 5]} />\n        <VictoryAxis {...props} dependentAxis axisValue={3} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis {...props} axisValue={\"zero\"} />\n        <VictoryAxis {...props} dependentAxis tickValues={[\"-\", \"zero\", \"+\"]} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} scale={{ x: \"time\" }}>\n        <VictoryAxis\n          {...props}\n          tickValues={[\n            new Date(1985, 1, 1),\n            new Date(1995, 1, 1),\n            new Date(2005, 1, 1),\n            new Date(2015, 1, 1),\n          ]}\n          tickFormat={(t) => t.getFullYear()}\n        />\n        <VictoryAxis\n          {...props}\n          dependentAxis\n          axisValue={new Date(2000, 1, 1)}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryBar\n          data={[\n            { x: \"a\", y: 1 },\n            { x: \"b\", y: 2 },\n            { x: \"c\", y: 5 },\n          ]}\n        />\n        <VictoryAxis {...props} dependentAxis axisValue=\"b\" />\n        <VictoryAxis {...props} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-axis/brush-axis-grid-line-styles.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryAxis, VictoryBrushLine } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryAxis\",\n};\n\nexport const BrushAxisGridLineStyles: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryAxis\n        {...props}\n        label=\"Label\"\n        gridComponent={\n          <VictoryBrushLine\n            brushDomain={[0.25, 0.5]}\n            brushAreaStyle={{\n              fill: \"orange\",\n              stroke: \"tomato\",\n              strokeWidth: 2,\n            }}\n            brushStyle={{ fill: \"teal\", stroke: \"navy\", strokeWidth: 2 }}\n            handleStyle={{ strokeWidth: 1, stroke: \"grey\" }}\n          />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-axis/brush-axis-grid-line-width.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryAxis, VictoryBrushLine } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryAxis\",\n};\n\nexport const BrushAxisGridLineWidth: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryAxis\n        {...props}\n        label=\"Label\"\n        gridComponent={\n          <VictoryBrushLine\n            brushDomain={[0.25, 0.5]}\n            brushWidth={40}\n            brushAreaWidth={20}\n            handleWidth={4}\n            brushAreaStyle={{\n              fill: \"orange\",\n              stroke: \"tomato\",\n              strokeWidth: 2,\n            }}\n            brushStyle={{ fill: \"teal\", stroke: \"navy\", strokeWidth: 2 }}\n            handleStyle={{ strokeWidth: 1, stroke: \"grey\" }}\n          />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-axis/brush-axis-grid-line-with-domain.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryAxis, VictoryBrushLine } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryAxis\",\n};\n\nexport const BrushAxisGridLineWithDomain: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryAxis\n        {...props}\n        label=\"Label\"\n        gridComponent={<VictoryBrushLine brushDomain={[0.25, 0.5]} />}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-axis/brush-axis-grid-line.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryAxis, VictoryBrushLine } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryAxis\",\n};\n\nexport const BrushAxisGridLine: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryAxis\n        {...props}\n        label=\"Label\"\n        gridComponent={<VictoryBrushLine />}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-axis/brush-axis-with-domain.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryAxis, VictoryBrushLine } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryAxis\",\n};\n\nexport const BrushAxisWithDomain: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryAxis\n        {...props}\n        label=\"Label\"\n        axisComponent={<VictoryBrushLine brushDomain={[0.25, 0.5]} />}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-axis/brush-axis.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryAxis, VictoryBrushLine } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryAxis\",\n};\n\nexport const BrushAxis: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryAxis\n        {...props}\n        label=\"Label\"\n        axisComponent={<VictoryBrushLine />}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-axis/config.ts",
    "content": "import type { Meta, StoryObj } from \"@storybook/react\";\n\nimport { VictoryAxis, VictoryAxisProps } from \"@/victory\";\n\nimport {\n  VictoryAxisCommonProps,\n  VictoryCommonProps,\n  VictoryDatableProps,\n  VictorySingleLabelableProps,\n} from \"../../utils/arg-types\";\nimport { componentContainer } from \"../../utils/decorators\";\n\ntype StoryProps = VictoryAxisProps & {\n  themeKey: string;\n};\n\nexport type Story = StoryObj<StoryProps>;\n\nexport const ComponentMeta: Meta<Omit<StoryProps, \"themeKey\">> = {\n  component: VictoryAxis,\n  decorators: [componentContainer],\n\n  argTypes: {\n    ...VictoryAxisCommonProps,\n    ...VictoryCommonProps,\n    ...VictoryDatableProps,\n    ...VictorySingleLabelableProps,\n\n    crossAxis: { control: \"boolean\" },\n    fixLabelOverlap: { control: \"boolean\" },\n    offsetX: { control: \"number\" },\n    offsetY: { control: \"number\" },\n    orientation: {\n      control: \"select\",\n      options: [\"top\", \"bottom\", \"left\", \"right\"],\n    },\n  },\n};\n"
  },
  {
    "path": "stories/victory-charts/victory-axis/default.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryAxis, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryAxis\",\n};\n\nexport const Default: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} />\n      <VictoryChart theme={VictoryTheme[props.themeKey]} domain={[-1, 1]} />\n      <VictoryChart />\n      <VictoryChart domain={[-1, 1]} />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-axis/fix-label-overlap.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryAxis, VictoryTheme } from \"@/victory\";\n\nimport { getRandomValues, getTimeValues, getValues } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryAxis\",\n};\n\nexport const FixLabelOverlap: Story = {\n  args: {\n    fixLabelOverlap: true,\n  },\n  render: (props) => (\n    <>\n      <VictoryAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        tickValues={getValues(30)}\n      />\n      <VictoryAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dependentAxis\n        tickValues={getValues(30)}\n      />\n      <VictoryAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        tickValues={getRandomValues(30)}\n      />\n      <VictoryAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dependentAxis\n        tickValues={getRandomValues(30)}\n      />\n      <VictoryAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        scale=\"time\"\n        tickValues={getTimeValues(30)}\n      />\n      <VictoryAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dependentAxis\n        scale=\"time\"\n        tickValues={getTimeValues(30)}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-axis/offsets.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryAxis, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryAxis\",\n};\n\nexport const Offsets: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dependentAxis\n        offsetX={250}\n      />\n      <VictoryAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        offsetY={250}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-axis/orientation.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryAxis, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { getValues } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryAxis\",\n};\n\nexport const Orientation: Story = {\n  args: {\n    tickValues: getValues(5),\n  },\n  render: (props) => (\n    <>\n      <VictoryAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        orientation=\"top\"\n      />\n      <VictoryAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        orientation=\"bottom\"\n      />\n      <VictoryAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        orientation=\"left\"\n      />\n      <VictoryAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        orientation=\"right\"\n      />\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis {...props} orientation=\"top\" />\n        <VictoryAxis {...props} dependentAxis orientation=\"right\" />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis {...props} orientation=\"top\" invertAxis />\n        <VictoryAxis {...props} dependentAxis orientation=\"right\" invertAxis />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} domain={[-5, 5]}>\n        <VictoryAxis {...props} orientation=\"top\" />\n        <VictoryAxis {...props} dependentAxis orientation=\"right\" />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-axis/style.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryAxis, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryAxis\",\n};\n\nexport const Style: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis\n          {...props}\n          label=\"Label\"\n          style={{\n            axis: { stroke: \"#756f6a\" },\n            axisLabel: { fontSize: 20, padding: 30 },\n            grid: { stroke: ({ tick }) => (tick > 0.5 ? \"red\" : \"grey\") },\n            ticks: { stroke: \"grey\", size: 5 },\n            tickLabels: { fontSize: 15, padding: 5 },\n          }}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-axis/tick-format.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryAxis, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { getValues } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryAxis\",\n};\n\nexport const TickFormat: Story = {\n  args: {\n    tickValues: getValues(5),\n  },\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis\n          {...props}\n          tickFormat={[\"one\", \"two\", \"three\", \"four\", \"five\"]}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis {...props} tickFormat={(t) => `#${t}`} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-axis/tick-values.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryAxis, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { getRandomValues, getTimeValues, getValues } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryAxis\",\n};\n\nexport const TickValues: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis {...props} tickValues={getValues(5)} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis {...props} dependentAxis tickValues={getValues(5)} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis {...props} tickValues={getRandomValues(5)} />\n        <VictoryAxis {...props} dependentAxis tickValues={getRandomValues(5)} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis {...props} tickValues={[\"one\", \"two\", \"three\", \"four\"]} />\n        <VictoryAxis\n          {...props}\n          dependentAxis\n          tickValues={[\"one\", \"two\", \"three\", \"four\"]}\n        />\n      </VictoryChart>\n      <VictoryChart\n        theme={VictoryTheme[props.themeKey]}\n        horizontal\n        scale={{ x: \"time\" }}\n      >\n        <VictoryAxis {...props} tickValues={getTimeValues(5)} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} scale={{ x: \"time\" }}>\n        <VictoryAxis {...props} tickValues={getTimeValues(5)} />\n      </VictoryChart>\n      <VictoryChart\n        theme={VictoryTheme[props.themeKey]}\n        horizontal\n        scale={{ x: \"log\" }}\n      >\n        <VictoryAxis\n          {...props}\n          tickValues={[1, 3, 5, 7, 10, 50, 100, 500, 1000]}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} scale={{ x: \"log\" }}>\n        <VictoryAxis\n          {...props}\n          tickValues={[1, 3, 5, 7, 10, 50, 100, 500, 1000]}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis\n          {...props}\n          label={\"Empty Tick Values\"}\n          tickValues={[]}\n          orientation=\"right\"\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-axis/with-domain.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryAxis,\n  VictoryChart,\n  VictoryScatter,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { getValues } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryAxis\",\n};\n\nexport const WithDomain: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        domain={[-10, 10]}\n      />\n      <VictoryAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        domain={[-10, 10]}\n        tickValues={getValues(5)}\n      />\n      <VictoryAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        domain={[-10, 10]}\n        tickValues={[8, 9, 10, 11, 12, 13]}\n      />\n      <VictoryAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        domain={[-2, 2]}\n        tickValues={[\"cat\", \"dog\", \"bird\"]}\n      />\n      <VictoryChart theme={VictoryTheme[props.themeKey]} domain={[1, 4]}>\n        <VictoryScatter\n          data={[\n            { x: 0, y: 1 },\n            { x: 1, y: 2 },\n            { x: 1, y: 3 },\n            { x: 2, y: 4 },\n            { x: 3, y: 3 },\n          ]}\n        />\n        <VictoryAxis {...props} dependentAxis />\n        <VictoryAxis {...props} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} domain={[1, 4]}>\n        <VictoryScatter\n          data={[\n            { x: 0, y: 1 },\n            { x: 1, y: 2 },\n            { x: 1, y: 3 },\n            { x: 2, y: 4 },\n            { x: 3, y: 3 },\n          ]}\n        />\n        <VictoryAxis {...props} dependentAxis invertAxis />\n        <VictoryAxis {...props} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-axis/with-multiline-labels.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryAxis, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { getValues } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryAxis\",\n};\n\nexport const WithMultilineLabels: Story = {\n  args: {\n    tickFormat: (tick) => (tick >= 0 ? tick : `minus\\n${-tick}`),\n    tickValues: getValues(5, -2),\n  },\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis {...props} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis {...props} orientation=\"top\" />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-bar/alignment.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryBar, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { getData, getMixedData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBar\",\n};\n\nexport const Alignment: Story = {\n  args: {\n    data: getData(7),\n  },\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} alignment=\"start\" />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} alignment=\"start\" />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} alignment=\"middle\" />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} alignment=\"middle\" />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} alignment=\"end\" />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} alignment=\"end\" />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getMixedData(5)} alignment=\"start\" />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getMixedData(5)} alignment=\"start\" />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getMixedData(5)} alignment=\"end\" />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getMixedData(5)} alignment=\"end\" />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-bar/bar-ratio.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryBar, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBar\",\n};\n\nexport const BarRatio: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getData(2)} barRatio={0.01} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getData(50)} barRatio={0.01} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getData(7)} barRatio={0.01} />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getData(7)} barRatio={0.01} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getData(2)} barRatio={0.5} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getData(50)} barRatio={0.5} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getData(7)} barRatio={0.5} />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getData(7)} barRatio={0.5} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getData(2)} barRatio={1} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getData(50)} barRatio={1} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getData(7)} barRatio={1} />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getData(7)} barRatio={1} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getData(2)} barRatio={1.5} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getData(50)} barRatio={1.5} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getData(7)} barRatio={1.5} />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getData(7)} barRatio={1.5} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-bar/bar-width.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryBar, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBar\",\n};\n\nexport const BarWidth: Story = {\n  args: {\n    data: getData(7),\n  },\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} barWidth={5} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} barWidth={10} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} barWidth={20} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} barWidth={({ datum }) => datum.x * 4} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-bar/config.ts",
    "content": "import type { Meta, StoryObj } from \"@storybook/react\";\n\nimport { VictoryBar, VictoryBarProps } from \"@/victory\";\n\nimport {\n  VictoryCommonProps,\n  VictoryDatableProps,\n  VictoryMultiLabelableProps,\n} from \"../../utils/arg-types\";\nimport { componentContainer } from \"../../utils/decorators\";\n\ntype StoryProps = VictoryBarProps & {\n  themeKey: string;\n};\n\nexport const ComponentMeta: Meta<Omit<StoryProps, \"themeKey\">> = {\n  component: VictoryBar,\n  decorators: [componentContainer],\n\n  argTypes: {\n    ...VictoryCommonProps,\n    ...VictoryDatableProps,\n    ...VictoryMultiLabelableProps,\n\n    alignment: { control: \"select\", options: [\"start\", \"middle\", \"end\"] },\n    barRatio: { control: \"number\" },\n    barWidth: { control: \"number\" },\n    cornerRadius: { control: \"number\" },\n  },\n};\n\nexport type Story = StoryObj<StoryProps>;\n"
  },
  {
    "path": "stories/victory-charts/victory-bar/corner-radius.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryBar,\n  VictoryChart,\n  VictoryPolarAxis,\n  VictoryTheme,\n} from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getData, getMixedData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBar\",\n};\n\nexport const CornerRadius: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getData(7)} cornerRadius={1} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getData(7)} cornerRadius={5} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getData(7)} cornerRadius={7} />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getData(7)} cornerRadius={7} />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar\n          {...props}\n          data={getMixedData(7)}\n          barWidth={40}\n          cornerRadius={20}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar\n          {...props}\n          data={getMixedData(7)}\n          barWidth={40}\n          cornerRadius={20}\n        />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar\n          {...props}\n          data={getMixedData(7)}\n          barWidth={40}\n          cornerRadius={{\n            topLeft: 5,\n            topRight: 20,\n            bottomLeft: 20,\n            bottomRight: 0,\n          }}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar\n          {...props}\n          data={getMixedData(7)}\n          barWidth={40}\n          cornerRadius={{\n            topLeft: 5,\n            topRight: 20,\n            bottomLeft: 20,\n            bottomRight: 0,\n          }}\n        />\n      </VictoryChart>\n      <VictoryChart polar innerRadius={60} theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar\n          {...props}\n          data={[\n            { x: 45, y: 6 },\n            { x: 90, y: 30 },\n            { x: 135, y: 65 },\n            { x: 180, y: 50 },\n            { x: 270, y: 40 },\n            { x: 315, y: 30 },\n          ]}\n          style={{ data: { fill: \"tomato\", width: 40 } }}\n          cornerRadius={{\n            topRight: 1,\n            topLeft: 20,\n            bottomRight: 5,\n            bottomLeft: 0,\n          }}\n        />\n        <VictoryPolarAxis\n          labelPlacement=\"parallel\"\n          tickValues={[0, 45, 90, 135, 180, 225, 270, 315]}\n        />\n      </VictoryChart>\n      <VictoryChart polar theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar\n          {...props}\n          data={[\n            { x: 45, y: 6 },\n            { x: 90, y: 30 },\n            { x: 135, y: 65 },\n            { x: 180, y: 50 },\n            { x: 270, y: 40 },\n            { x: 315, y: 30 },\n          ]}\n          style={{ data: { fill: \"tomato\", width: 40 } }}\n          cornerRadius={{\n            topRight: 1,\n            topLeft: 20,\n            bottomRight: 5,\n            bottomLeft: 0,\n          }}\n        />\n        <VictoryPolarAxis\n          labelPlacement=\"parallel\"\n          tickValues={[0, 45, 90, 135, 180, 225, 270, 315]}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-bar/data.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryBar, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBar\",\n};\n\nexport const Data: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar\n          {...props}\n          data={[\n            { animal: \"Cat\", pet: 45, wild: 17 },\n            { animal: \"Dog\", pet: 85, wild: 6 },\n            { animal: \"Fish\", pet: 55, wild: 0 },\n            { animal: \"Bird\", pet: 15, wild: 40 },\n          ]}\n          x={\"animal\"}\n          y={(data) => data.pet + data.wild}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getData(8)} y0={(d) => d.y - d.x} />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getData(8)} y0={(d) => d.y - d.x} />\n      </VictoryChart>\n      <VictoryChart polar theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getData(8)} y0={(d) => d.y - d.x} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar\n          {...props}\n          data={[\n            { a: { b: { c: 1, d: 1 } } },\n            { a: { b: { c: 2, d: 3 } } },\n            { a: { b: { c: 3, d: 2 } } },\n          ]}\n          x={\"a.b.c\"}\n          y={\"a.b.d\"}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar\n          {...props}\n          data={[\n            { x: 1, y: 2, label: \"cat\" },\n            { x: 2, y: 5, label: \"dog\" },\n            { x: 3, y: 3, label: \"dog\" },\n            { x: 4, y: -2, label: \"bird\" },\n            { x: 5, y: -5, label: \"cat\" },\n          ]}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-bar/default.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryBar, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBar\",\n};\n\nexport const Default: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryBar {...props} theme={VictoryTheme[props.themeKey]} />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-bar/disable-inline-styles.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { Bar, VictoryBar, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBar\",\n};\n\nexport const DisableInlineStyles: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} disableInlineStyles />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar\n          {...props}\n          dataComponent={<Bar disableInlineStyles className=\"fill-purple\" />}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-bar/domain.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryBar, VictoryChart } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBar\",\n};\n\nexport const Domain: Story = {\n  args: {\n    data: getData(7),\n  },\n  render: (props) => (\n    <>\n      <VictoryBar domain={{ x: [0, 5], y: [0, 8] }} />\n      <VictoryChart domain={{ x: [0, 5], y: [0, 8] }}>\n        <VictoryBar {...props} />\n      </VictoryChart>\n      <VictoryChart minDomain={{ y: 2 }}>\n        <VictoryBar {...props} />\n      </VictoryChart>\n      <VictoryChart maxDomain={{ x: 4 }}>\n        <VictoryBar {...props} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-bar/focus-with-refs.stories.tsx",
    "content": "/* eslint-disable react-hooks/rules-of-hooks */\nimport React, { useEffect, useCallback, useRef } from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  Bar,\n  VictoryBar,\n  VictoryChart,\n  VictoryTheme,\n  VictoryTooltip,\n} from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBar\",\n};\n\nexport const FocusWithRefs: Story = {\n  args: {},\n  render: (props) => {\n    const barsRef = useRef(new Map());\n\n    const focusOnBar = (id) => {\n      const map = barsRef.current;\n      const node = map.get(id);\n      node.focus();\n    };\n\n    useEffect(() => {\n      if (barsRef.current) {\n        focusOnBar(\"1\");\n      }\n    }, []);\n\n    const setRef = useCallback((node) => {\n      const map = barsRef.current;\n      if (node) {\n        map.set(node.attributes.index.value, node);\n      }\n    }, []);\n\n    return (\n      <>\n        <VictoryChart\n          horizontal\n          theme={VictoryTheme[props.themeKey]}\n          domainPadding={10}\n        >\n          <VictoryBar\n            {...props}\n            data={getData(5)}\n            labels={({ datum }) => `x: ${datum.x}`}\n            labelComponent={<VictoryTooltip active />}\n            dataComponent={<Bar tabIndex={0} ref={setRef} />}\n          />\n        </VictoryChart>\n      </>\n    );\n  },\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-bar/get-path.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryBar, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBar\",\n};\n\nexport const GetPath: Story = {\n  args: {\n    data: getData(7),\n  },\n  render: (props) => {\n    const verticalPathFn = (callbackArgs) => {\n      const { x0, x1, y0, y1 } = callbackArgs;\n      return `M ${x0}, ${y0}\n      L ${(x1 + x0) / 2}, ${y1}\n      L ${x1}, ${y0}\n      z`;\n    };\n\n    const horizontalPathFn = (callbackArgs) => {\n      const { x0, x1, y0, y1 } = callbackArgs;\n      return `M ${x0}, ${y1}\n      L ${x1}, ${(y0 + y1) / 2}\n      L ${x0}, ${y0}\n      z`;\n    };\n\n    return (\n      <>\n        <VictoryChart theme={VictoryTheme[props.themeKey]}>\n          <VictoryBar {...props} getPath={verticalPathFn} />\n        </VictoryChart>\n        <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n          <VictoryBar {...props} getPath={horizontalPathFn} />\n        </VictoryChart>\n      </>\n    );\n  },\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-bar/grouped-bars.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryBar,\n  VictoryChart,\n  VictoryGroup,\n  VictoryStack,\n  VictoryTheme,\n  VictoryTooltip,\n} from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getData, getMixedData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBar\",\n};\n\nexport const GroupedBars: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryGroup offset={20} labels={({ datum }) => datum.x}>\n          <VictoryBar {...props} data={getData(3)} />\n          <VictoryBar {...props} data={getData(3, \"seed-1\")} />\n          <VictoryBar {...props} data={getData(3, \"seed-2\")} />\n        </VictoryGroup>\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryGroup offset={10} labels={({ datum }) => datum.x}>\n          <VictoryBar {...props} data={getData(5)} />\n          <VictoryBar {...props} data={getData(3, \"seed-1\")} />\n          <VictoryBar {...props} data={getData(2, \"seed-2\")} />\n        </VictoryGroup>\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryGroup offset={20} labels={({ datum }) => datum.x}>\n          <VictoryBar {...props} data={getMixedData(3)} />\n          <VictoryBar {...props} data={getMixedData(3, \"seed\")} />\n          <VictoryBar {...props} data={getMixedData(3, \"seed-1\")} />\n        </VictoryGroup>\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryGroup offset={20} labels={({ datum }) => datum.x}>\n          <VictoryBar {...props} data={getMixedData(3)} />\n          <VictoryBar {...props} data={getMixedData(3, \"seed\")} />\n          <VictoryBar {...props} data={getMixedData(3, \"seed-1\")} />\n        </VictoryGroup>\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryGroup\n          offset={20}\n          labels={({ datum }) => datum.x}\n          labelComponent={<VictoryTooltip active />}\n        >\n          <VictoryBar {...props} data={getMixedData(3)} />\n          <VictoryBar {...props} data={getMixedData(3, \"seed\")} />\n          <VictoryBar {...props} data={getMixedData(3, \"seed-1\")} />\n        </VictoryGroup>\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryGroup\n          offset={20}\n          labels={({ datum }) => datum.x}\n          labelComponent={<VictoryTooltip active />}\n        >\n          <VictoryBar {...props} data={getMixedData(3)} />\n          <VictoryBar {...props} data={getMixedData(3, \"seed\")} />\n          <VictoryBar {...props} data={getMixedData(3, \"seed-1\")} />\n        </VictoryGroup>\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryGroup\n          offset={20}\n          labels={({ datum }) => datum.x}\n          style={{ data: { width: 15 } }}\n        >\n          <VictoryStack colorScale=\"red\">\n            <VictoryBar {...props} data={getData(3)} />\n            <VictoryBar {...props} data={getData(3, \"seed-1\")} />\n            <VictoryBar {...props} data={getData(3, \"seed-2\")} />\n          </VictoryStack>\n          <VictoryStack colorScale=\"green\">\n            <VictoryBar {...props} data={getData(3)} />\n            <VictoryBar {...props} data={getData(3, \"seed-3\")} />\n            <VictoryBar {...props} data={getData(3, \"seed-4\")} />\n          </VictoryStack>\n          <VictoryStack colorScale=\"blue\">\n            <VictoryBar {...props} data={getData(3)} />\n            <VictoryBar {...props} data={getData(3, \"seed-5\")} />\n            <VictoryBar {...props} data={getData(3, \"seed-6\")} />\n          </VictoryStack>\n        </VictoryGroup>\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryGroup\n          offset={20}\n          labels={({ datum }) => datum.x}\n          style={{ data: { width: 15 } }}\n        >\n          <VictoryStack colorScale=\"red\">\n            <VictoryBar {...props} data={getData(3)} />\n            <VictoryBar {...props} data={getData(3, \"seed-1\")} />\n            <VictoryBar {...props} data={getData(3, \"seed-2\")} />\n          </VictoryStack>\n          <VictoryStack colorScale=\"green\">\n            <VictoryBar {...props} data={getData(3)} />\n            <VictoryBar {...props} data={getData(3, \"seed-3\")} />\n            <VictoryBar {...props} data={getData(3, \"seed-4\")} />\n          </VictoryStack>\n          <VictoryStack colorScale=\"blue\">\n            <VictoryBar {...props} data={getData(3)} />\n            <VictoryBar {...props} data={getData(3, \"seed-5\")} />\n            <VictoryBar {...props} data={getData(3, \"seed-6\")} />\n          </VictoryStack>\n        </VictoryGroup>\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryGroup\n          offset={20}\n          labels={({ datum }) => datum.x}\n          labelComponent={<VictoryTooltip active />}\n        >\n          <VictoryStack colorScale=\"red\">\n            <VictoryBar {...props} data={getMixedData(3)} barWidth={6} />\n            <VictoryBar\n              {...props}\n              data={getMixedData(3, \"seed-1\")}\n              barWidth={6}\n            />\n            <VictoryBar\n              {...props}\n              data={getMixedData(3, \"seed-2\")}\n              barWidth={6}\n            />\n          </VictoryStack>\n          <VictoryStack colorScale=\"green\">\n            <VictoryBar {...props} data={getMixedData(3)} barWidth={6} />\n            <VictoryBar\n              {...props}\n              data={getMixedData(3, \"seed-3\")}\n              barWidth={6}\n            />\n            <VictoryBar\n              {...props}\n              data={getMixedData(3, \"seed-4\")}\n              barWidth={6}\n            />\n          </VictoryStack>\n          <VictoryStack colorScale=\"blue\">\n            <VictoryBar {...props} data={getMixedData(3)} barWidth={6} />\n            <VictoryBar\n              {...props}\n              data={getMixedData(3, \"seed-5\")}\n              barWidth={6}\n            />\n            <VictoryBar\n              {...props}\n              data={getMixedData(3, \"seed-6\")}\n              barWidth={6}\n            />\n          </VictoryStack>\n        </VictoryGroup>\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryGroup\n          offset={20}\n          labels={({ datum }) => datum.x}\n          labelComponent={<VictoryTooltip active />}\n        >\n          <VictoryStack colorScale=\"red\">\n            <VictoryBar {...props} data={getMixedData(3)} barWidth={6} />\n            <VictoryBar\n              {...props}\n              data={getMixedData(3, \"seed-1\")}\n              barWidth={6}\n            />\n            <VictoryBar\n              {...props}\n              data={getMixedData(3, \"seed-2\")}\n              barWidth={6}\n            />\n          </VictoryStack>\n          <VictoryStack colorScale=\"green\">\n            <VictoryBar {...props} data={getMixedData(3)} barWidth={6} />\n            <VictoryBar\n              {...props}\n              data={getMixedData(3, \"seed-3\")}\n              barWidth={6}\n            />\n            <VictoryBar\n              {...props}\n              data={getMixedData(3, \"seed-4\")}\n              barWidth={6}\n            />\n          </VictoryStack>\n          <VictoryStack colorScale=\"blue\">\n            <VictoryBar {...props} data={getMixedData(3)} barWidth={6} />\n            <VictoryBar\n              {...props}\n              data={getMixedData(3, \"seed-5\")}\n              barWidth={6}\n            />\n            <VictoryBar\n              {...props}\n              data={getMixedData(3, \"seed-6\")}\n              barWidth={6}\n            />\n          </VictoryStack>\n        </VictoryGroup>\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-bar/labels.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryBar,\n  VictoryChart,\n  VictoryPolarAxis,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { getData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBar\",\n};\n\nexport const Labels: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} domainPadding={8}>\n        <VictoryBar\n          {...props}\n          data={getData(7)}\n          labels={({ datum }) => `x: ${datum.x}`}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} domainPadding={8}>\n        <VictoryBar\n          {...props}\n          data={getData(7)}\n          labels={[\"\", \"\", \"three\", \"four\", \"5\", \"six\"]}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} domainPadding={10}>\n        <VictoryBar\n          {...props}\n          data={[\n            { x: 1, y: 2, label: \"cat\" },\n            { x: 2, y: 5, label: \"dog\" },\n            { x: 3, y: 3, label: \"dog\" },\n            { x: 4, y: -2, label: \"bird\" },\n            { x: 5, y: -5, label: \"cat\" },\n          ]}\n        />\n      </VictoryChart>\n      <VictoryChart\n        polar\n        theme={VictoryTheme[props.themeKey]}\n        domainPadding={{ y: 20 }}\n      >\n        <VictoryBar\n          {...props}\n          data={[\n            { x: 1, y: 2, label: \"cat\" },\n            { x: 2, y: 5, label: \"dog\" },\n            { x: 3, y: 3, label: \"dog\" },\n            { x: 4, y: 2, label: \"bird\" },\n            { x: 5, y: 5, label: \"cat\" },\n          ]}\n        />\n        <VictoryPolarAxis />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-bar/polar-bars.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryBar,\n  VictoryChart,\n  VictoryGroup,\n  VictoryPolarAxis,\n  VictoryStack,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { getData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBar\",\n};\n\nexport const PolarBars: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} polar>\n        <VictoryBar\n          {...props}\n          style={{ data: { width: 20 } }}\n          data={getData(7)}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} polar>\n        <VictoryBar\n          {...props}\n          style={{ data: { stroke: \"red\", strokeWidth: 2 } }}\n          data={[\n            { x: \"Cat\", y: 62 },\n            { x: \"Dog\", y: 91 },\n            { x: \"Fish\", y: 55 },\n            { x: \"Bird\", y: 55 },\n            { x: \"Frog\", y: 75 },\n          ]}\n        />\n        <VictoryPolarAxis />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} polar endAngle={180}>\n        <VictoryBar\n          {...props}\n          style={{ data: { stroke: \"red\", strokeWidth: 2 } }}\n          data={[\n            { x: \"Cat\", y: 62 },\n            { x: \"Dog\", y: 91 },\n            { x: \"Fish\", y: 55 },\n            { x: \"Bird\", y: 55 },\n            { x: \"Frog\", y: 75 },\n          ]}\n        />\n        <VictoryPolarAxis />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} polar>\n        <VictoryStack colorScale=\"qualitative\">\n          <VictoryBar {...props} data={getData(7)} />\n          <VictoryBar {...props} data={getData(7, \"seed-1\")} />\n          <VictoryBar {...props} data={getData(7, \"seed-2\")} />\n        </VictoryStack>\n        <VictoryPolarAxis />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} polar>\n        <VictoryStack colorScale=\"qualitative\" style={{ data: { width: 15 } }}>\n          <VictoryBar {...props} data={getData(7)} />\n          <VictoryBar {...props} data={getData(7, \"seed-1\")} />\n          <VictoryBar {...props} data={getData(7, \"seed-2\")} />\n        </VictoryStack>\n        <VictoryPolarAxis />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} polar>\n        <VictoryGroup\n          offset={25}\n          colorScale=\"qualitative\"\n          style={{ data: { width: 15 } }}\n        >\n          <VictoryBar {...props} data={getData(5)} />\n          <VictoryBar {...props} data={getData(5, \"seed-1\")} />\n          <VictoryBar {...props} data={getData(5, \"seed-2\")} />\n        </VictoryGroup>\n        <VictoryPolarAxis />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} polar innerRadius={50}>\n        <VictoryGroup\n          offset={25}\n          colorScale=\"qualitative\"\n          style={{ data: { width: 15 } }}\n        >\n          <VictoryBar {...props} data={getData(5)} />\n          <VictoryBar {...props} data={getData(5, \"seed-1\")} />\n          <VictoryBar {...props} data={getData(5, \"seed-2\")} />\n        </VictoryGroup>\n        <VictoryPolarAxis />\n      </VictoryChart>\n      <VictoryChart\n        theme={VictoryTheme[props.themeKey]}\n        polar\n        endAngle={180}\n        innerRadius={50}\n      >\n        <VictoryStack colorScale=\"qualitative\" style={{ data: { width: 15 } }}>\n          <VictoryBar {...props} data={getData(5)} />\n          <VictoryBar {...props} data={getData(5, \"seed-1\")} />\n          <VictoryBar {...props} data={getData(5, \"seed-2\")} />\n        </VictoryStack>\n        <VictoryPolarAxis />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-bar/regressions.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryBar,\n  VictoryChart,\n  VictoryGroup,\n  VictoryStack,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { getData, getStackedData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBar\",\n};\n\nexport const Regressions: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryGroup offset={20} style={{ data: { width: 10 } }}>\n          <VictoryStack colorScale={\"red\"}>\n            {getStackedData(5, 3, \"useStrings\").map((data, index) => {\n              return (\n                <VictoryBar {...props} horizontal key={index} data={data} />\n              );\n            })}\n          </VictoryStack>\n          <VictoryStack colorScale={\"green\"}>\n            {getStackedData(5, 3, \"useStrings\").map((data, index) => {\n              return (\n                <VictoryBar {...props} horizontal key={index} data={data} />\n              );\n            })}\n          </VictoryStack>\n          <VictoryStack colorScale={\"blue\"}>\n            {getStackedData(5, 3, \"useStrings\").map((data, index) => {\n              return (\n                <VictoryBar {...props} horizontal key={index} data={data} />\n              );\n            })}\n          </VictoryStack>\n        </VictoryGroup>\n      </VictoryChart>\n      <VictoryChart>\n        <VictoryGroup\n          offset={20}\n          style={{ data: { width: 15 } }}\n          labels={({ datum }) => datum.x}\n        >\n          <VictoryStack colorScale=\"red\">\n            <VictoryBar {...props} data={getData(4)} />\n            <VictoryBar {...props} data={getData(4, \"seed-1\")} />\n            <VictoryBar {...props} data={getData(4, \"seed-2\")} />\n          </VictoryStack>\n          <VictoryStack colorScale=\"green\">\n            <VictoryBar {...props} data={getData(4)} />\n            <VictoryBar {...props} data={getData(4, \"seed-3\")} />\n            <VictoryBar {...props} data={getData(4, \"seed-4\")} />\n          </VictoryStack>\n          <VictoryStack colorScale=\"blue\">\n            <VictoryBar {...props} data={getData(4)} />\n            <VictoryBar {...props} data={getData(4, \"seed-5\")} />\n            <VictoryBar {...props} data={getData(4, \"seed-6\")} />\n          </VictoryStack>\n        </VictoryGroup>\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-bar/scale.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryBar,\n  VictoryChart,\n  VictoryGroup,\n  VictoryStack,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { getLogData, getTimeData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBar\",\n};\n\nexport const Scale: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart\n        theme={VictoryTheme[props.themeKey]}\n        scale={{ y: \"log\" }}\n        minDomain={1}\n      >\n        <VictoryBar\n          {...props}\n          data={getLogData(7)}\n          labels={({ datum }) => datum.y.toPrecision(1)}\n        />\n      </VictoryChart>\n      <VictoryChart\n        horizontal\n        theme={VictoryTheme[props.themeKey]}\n        scale={{ y: \"log\" }}\n        minDomain={1}\n      >\n        <VictoryBar\n          {...props}\n          data={getLogData(7)}\n          labels={({ datum }) => datum.y.toPrecision(1)}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar\n          {...props}\n          data={getTimeData(5)}\n          labels={({ datum }) => datum.x.getFullYear()}\n        />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar\n          {...props}\n          data={getTimeData(5)}\n          labels={({ datum }) => datum.x.getFullYear()}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack labels={({ datum }) => datum.x.getFullYear()}>\n          <VictoryBar {...props} data={getTimeData(5)} />\n          <VictoryBar {...props} data={getTimeData(5, \"seed-1\")} />\n          <VictoryBar {...props} data={getTimeData(5, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack labels={({ datum }) => datum.x.getFullYear()}>\n          <VictoryBar {...props} data={getTimeData(5)} />\n          <VictoryBar {...props} data={getTimeData(5, \"seed-1\")} />\n          <VictoryBar {...props} data={getTimeData(5, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryGroup offset={10} labels={({ datum }) => datum.x.getFullYear()}>\n          <VictoryBar {...props} data={getTimeData(5)} />\n          <VictoryBar {...props} data={getTimeData(5, \"seed-1\")} />\n          <VictoryBar {...props} data={getTimeData(5, \"seed-2\")} />\n        </VictoryGroup>\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryGroup offset={10} labels={({ datum }) => datum.x.getFullYear()}>\n          <VictoryBar {...props} data={getTimeData(5)} />\n          <VictoryBar {...props} data={getTimeData(5, \"seed-1\")} />\n          <VictoryBar {...props} data={getTimeData(5, \"seed-2\")} />\n        </VictoryGroup>\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-bar/sorting.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryBar, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBar\",\n};\n\nexport const Sorting: Story = {\n  args: {\n    data: [\n      { x: \"low\", y: 1 },\n      { x: \"med\", y: 2 },\n      { x: \"high\", y: 3 },\n    ],\n    sortKey: \"sort\",\n  },\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryBar {...props} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryBar {...props} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-bar/stacked-bars.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryBar,\n  VictoryChart,\n  VictoryLabel,\n  VictoryStack,\n  VictoryTheme,\n  VictoryTooltip,\n} from \"@/victory\";\n\nimport { getData, getDataWithBaseline, getMixedData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBar\",\n};\n\nexport const StackedBars: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} domainPadding={8}>\n        <VictoryStack labels={({ datum }) => datum._y1.toPrecision(2)}>\n          <VictoryBar {...props} data={getData(7)} />\n          <VictoryBar {...props} data={getData(7, \"seed-1\")} />\n          <VictoryBar {...props} data={getData(7, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} domainPadding={8}>\n        <VictoryStack>\n          <VictoryBar\n            {...props}\n            data={getData(7)}\n            labels={({ datum }) => datum.y.toPrecision(2)}\n            labelComponent={<VictoryLabel renderInPortal />}\n          />\n          <VictoryBar\n            {...props}\n            data={getData(7, \"seed-1\")}\n            labels={({ datum }) => datum.y.toPrecision(2)}\n            labelComponent={<VictoryLabel renderInPortal />}\n          />\n          <VictoryBar\n            {...props}\n            data={getData(7, \"seed-2\")}\n            labels={({ datum }) => datum.y.toPrecision(2)}\n            labelComponent={<VictoryLabel renderInPortal />}\n          />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} domainPadding={8}>\n        <VictoryStack labels={({ datum }) => datum._y1.toPrecision(2)}>\n          <VictoryBar {...props} data={getData(9)} />\n          <VictoryBar {...props} data={getData(5, \"seed-1\")} />\n          <VictoryBar {...props} data={getData(3, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} domainPadding={8}>\n        <VictoryStack labels={({ datum }) => datum._y1.toPrecision(2)}>\n          <VictoryBar {...props} data={getMixedData(7)} />\n          <VictoryBar {...props} data={getMixedData(7, \"seed-1\")} />\n          <VictoryBar {...props} data={getMixedData(7, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart\n        horizontal\n        theme={VictoryTheme[props.themeKey]}\n        domainPadding={8}\n      >\n        <VictoryStack labels={({ datum }) => datum._y1.toPrecision(2)}>\n          <VictoryBar {...props} data={getMixedData(7)} />\n          <VictoryBar {...props} data={getMixedData(7, \"seed-1\")} />\n          <VictoryBar {...props} data={getMixedData(7, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} domainPadding={8}>\n        <VictoryStack\n          labels={({ datum }) => datum._y1.toPrecision(2)}\n          labelComponent={<VictoryTooltip active />}\n        >\n          <VictoryBar {...props} data={getMixedData(7)} />\n          <VictoryBar {...props} data={getMixedData(7, \"seed-1\")} />\n          <VictoryBar {...props} data={getMixedData(7, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart\n        horizontal\n        theme={VictoryTheme[props.themeKey]}\n        domainPadding={8}\n      >\n        <VictoryStack\n          labels={({ datum }) => datum._y1.toPrecision(2)}\n          labelComponent={<VictoryTooltip active />}\n        >\n          <VictoryBar {...props} data={getMixedData(7)} />\n          <VictoryBar {...props} data={getMixedData(7, \"seed-1\")} />\n          <VictoryBar {...props} data={getMixedData(7, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack>\n          <VictoryBar {...props} data={getData(90)} />\n          <VictoryBar {...props} data={getData(50, \"seed-1\")} />\n          <VictoryBar {...props} data={getData(200, \"seed-2\")} />\n          <VictoryBar {...props} data={getData(30, \"seed-3\")} />\n          <VictoryBar {...props} data={getData(200, \"seed-4\")} />\n          <VictoryBar {...props} data={getData(100, \"seed-5\")} />\n          <VictoryBar {...props} data={getData(200, \"seed-6\")} />\n          <VictoryBar {...props} data={getData(190, \"seed-7\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack>\n          <VictoryBar {...props} data={getDataWithBaseline(7)} />\n          <VictoryBar {...props} data={getData(7, \"seed-1\")} />\n          <VictoryBar {...props} data={getData(7, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-bar/style.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryBar, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBar\",\n};\n\nexport const Style: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} domainPadding={10}>\n        <VictoryBar\n          {...props}\n          labels={({ datum }) => datum.y}\n          style={{\n            labels: { fontSize: 20, fill: \"tomato\", fontFamily: \"monospace\" },\n            data: {\n              fill: \"tomato\",\n              fillOpacity: 0.7,\n              stroke: \"tomato\",\n              strokeWidth: 2,\n            },\n          }}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} domainPadding={10}>\n        <VictoryBar\n          {...props}\n          style={{\n            data: {\n              stroke: ({ datum }) => (datum.y > 75 ? \"red\" : \"transparent\"),\n              strokeWidth: 3,\n              opacity: ({ datum }) => (datum.y > 75 ? 1 : 0.4),\n            },\n          }}\n          labels={({ datum }) => datum.x}\n          data={[\n            { x: \"Cat\", y: 62 },\n            { x: \"Dog\", y: 91 },\n            { x: \"Fish\", y: 55 },\n            { x: \"Bird\", y: 55 },\n          ]}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-bar/theme.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryBar,\n  VictoryChart,\n  VictoryStack,\n  VictoryTheme,\n} from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBar\",\n};\n\nexport const Theme: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar {...props} data={getData(8)} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack labels={({ datum }) => datum.x}>\n          <VictoryBar {...props} data={getData(8)} />\n          <VictoryBar {...props} data={getData(8, \"seed-1\")} />\n          <VictoryBar {...props} data={getData(8, \"seed-2\")} />\n          <VictoryBar {...props} data={getData(8, \"seed-3\")} />\n          <VictoryBar {...props} data={getData(8, \"seed-4\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme.grayscale}>\n        <VictoryBar {...props} data={getData(8)} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme.grayscale}>\n        <VictoryStack labels={({ datum }) => datum.x}>\n          <VictoryBar {...props} data={getData(8)} />\n          <VictoryBar {...props} data={getData(8, \"seed-1\")} />\n          <VictoryBar {...props} data={getData(8, \"seed-2\")} />\n          <VictoryBar {...props} data={getData(8, \"seed-3\")} />\n          <VictoryBar {...props} data={getData(8, \"seed-4\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme.clean}>\n        <VictoryBar {...props} data={getData(8)} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme.clean}>\n        <VictoryStack labels={({ datum }) => datum.x}>\n          <VictoryBar {...props} data={getData(8)} />\n          <VictoryBar {...props} data={getData(8, \"seed-1\")} />\n          <VictoryBar {...props} data={getData(8, \"seed-2\")} />\n          <VictoryBar {...props} data={getData(8, \"seed-3\")} />\n          <VictoryBar {...props} data={getData(8, \"seed-4\")} />\n        </VictoryStack>\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-bar/tooltips.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryBar,\n  VictoryChart,\n  VictoryPolarAxis,\n  VictoryTheme,\n  VictoryTooltip,\n} from \"@/victory\";\n\nimport { getData, getMixedData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBar\",\n};\n\nexport const Tooltips: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} domainPadding={10}>\n        <VictoryBar\n          {...props}\n          data={getData(5)}\n          labels={({ datum }) => `x: ${datum.x}`}\n          labelComponent={<VictoryTooltip active />}\n        />\n      </VictoryChart>\n      <VictoryChart\n        horizontal\n        theme={VictoryTheme[props.themeKey]}\n        domainPadding={10}\n      >\n        <VictoryBar\n          {...props}\n          data={getData(5)}\n          labels={({ datum }) => `x: ${datum.x}`}\n          labelComponent={<VictoryTooltip active />}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} domainPadding={10}>\n        <VictoryBar\n          {...props}\n          data={getMixedData(5)}\n          labels={({ datum }) => `x: ${datum.x}`}\n          labelComponent={<VictoryTooltip active />}\n        />\n      </VictoryChart>\n      <VictoryChart\n        horizontal\n        theme={VictoryTheme[props.themeKey]}\n        domainPadding={10}\n      >\n        <VictoryBar\n          {...props}\n          data={getMixedData(5)}\n          labels={({ datum }) => `x: ${datum.x}`}\n          labelComponent={<VictoryTooltip active />}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} domainPadding={10}>\n        <VictoryBar\n          {...props}\n          data={getData(5)}\n          labels={[\"one\", \"two\", \"3\", \"wow, four tooltips\", \"five\"]}\n          labelComponent={<VictoryTooltip active />}\n        />\n      </VictoryChart>\n      <VictoryChart polar theme={VictoryTheme[props.themeKey]}>\n        <VictoryBar\n          {...props}\n          data={getData(5)}\n          style={{ data: { width: 20 } }}\n          labels={[\"one\", \"two\", \"3\", \"wow, four tooltips\", \"five\"]}\n          labelComponent={<VictoryTooltip active />}\n        />\n        <VictoryPolarAxis />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-box-plot/box-width.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryBoxPlot, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { getBoxPlotData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryBoxPlot> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBoxPlot\",\n};\n\nexport const BoxWidth: Story = {\n  args: {\n    data: getBoxPlotData(5),\n    domainPadding: 20,\n  },\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBoxPlot boxWidth={5} {...props} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryBoxPlot boxWidth={5} {...props} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBoxPlot boxWidth={35} {...props} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryBoxPlot boxWidth={35} {...props} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBoxPlot boxWidth={35} whiskerWidth={0} {...props} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBoxPlot boxWidth={0} {...props} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-box-plot/config.ts",
    "content": "import type { Meta, StoryObj } from \"@storybook/react\";\n\nimport { VictoryBoxPlot, VictoryBoxPlotProps } from \"@/victory\";\n\nimport { VictoryCommonProps, VictoryDatableProps } from \"../../utils/arg-types\";\nimport { componentContainer } from \"../../utils/decorators\";\n\ntype StoryProps = VictoryBoxPlotProps & {\n  themeKey: string;\n};\n\nexport const ComponentMeta: Meta<Omit<StoryProps, \"themeKey\">> = {\n  component: VictoryBoxPlot,\n  decorators: [componentContainer],\n\n  argTypes: {\n    ...VictoryCommonProps,\n    ...VictoryDatableProps,\n\n    boxWidth: { control: \"number\" },\n    labels: { control: \"boolean\" },\n    max: { control: \"text\" },\n    maxLabels: { control: \"boolean\" },\n    median: { control: \"text\" },\n    medianLabels: { control: \"boolean\" },\n    min: { control: \"text\" },\n    minLabels: { control: \"boolean\" },\n    q1: { control: \"text\" },\n    q1Labels: { control: \"boolean\" },\n    q3: { control: \"text\" },\n    q3Labels: { control: \"boolean\" },\n    whiskerWidth: { control: \"number\" },\n  },\n};\n\nexport type Story = StoryObj<StoryProps>;\n"
  },
  {
    "path": "stories/victory-charts/victory-box-plot/data.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryBoxPlot, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { getArrayData, getBoxPlotRepeatData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryBoxPlot> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBoxPlot\",\n};\n\nexport const Data: Story = {\n  args: {\n    domainPadding: 20,\n  },\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBoxPlot\n          data={[\n            { type: 1, Min: 1, Max: 18, Median: 8, Q1: 5, Q3: 15 },\n            { type: 2, Min: 4, Max: 20, Median: 10, Q1: 7, Q3: 15 },\n            { type: 3, Min: 3, Max: 12, Median: 6, Q1: 5, Q3: 10 },\n          ]}\n          x=\"type\"\n          min=\"Min\"\n          max=\"Max\"\n          median=\"Median\"\n          q1=\"Q1\"\n          q3=\"Q3\"\n          {...props}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryBoxPlot\n          data={[\n            { type: 1, Min: 1, Max: 18, Median: 8, Q1: 5, Q3: 15 },\n            { type: 2, Min: 4, Max: 20, Median: 10, Q1: 7, Q3: 15 },\n            { type: 3, Min: 3, Max: 12, Median: 6, Q1: 5, Q3: 10 },\n          ]}\n          x=\"type\"\n          min=\"Min\"\n          max=\"Max\"\n          median=\"Median\"\n          q1=\"Q1\"\n          q3=\"Q3\"\n          {...props}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBoxPlot data={getArrayData(5, 10)} {...props} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryBoxPlot data={getArrayData(5, 10)} {...props} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBoxPlot data={getBoxPlotRepeatData(5, 10)} {...props} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryBoxPlot data={getBoxPlotRepeatData(5, 10)} {...props} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-box-plot/default.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryBoxPlot, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getBoxPlotData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryBoxPlot> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBoxPlot\",\n};\n\nexport const Default: Story = {\n  args: {\n    domainPadding: 20,\n    data: getBoxPlotData(5),\n  },\n  render: (props) => (\n    <VictoryChart theme={VictoryTheme[props.themeKey]}>\n      <VictoryBoxPlot {...props} />\n    </VictoryChart>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-box-plot/disable-inline-styles.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  Box,\n  LineSegment,\n  VictoryBoxPlot,\n  VictoryChart,\n  VictoryTheme,\n  Whisker,\n} from \"@/victory\";\n\nimport { getBoxPlotData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryBoxPlot> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBoxPlot\",\n};\n\nexport const DisableInlineStyles: Story = {\n  args: {\n    domainPadding: 20,\n    data: getBoxPlotData(8),\n  },\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBoxPlot disableInlineStyles {...props} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBoxPlot\n          q1Component={<Box disableInlineStyles className=\"fill-purple\" />}\n          q3Component={<Box disableInlineStyles className=\"fill-purple\" />}\n          maxComponent={\n            <Whisker disableInlineStyles className=\"stroke-green\" />\n          }\n          minComponent={\n            <Whisker disableInlineStyles className=\"stroke-green\" />\n          }\n          medianComponent={\n            <LineSegment disableInlineStyles className=\"stroke-green\" />\n          }\n          {...props}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-box-plot/domain.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryBoxPlot, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getArrayData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryBoxPlot> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBoxPlot\",\n};\n\nexport const Domain: Story = {\n  args: {\n    data: getArrayData(5, 10),\n    domainPadding: 20,\n  },\n  render: (props) => (\n    <>\n      <VictoryBoxPlot domain={{ x: [3, 5.5], y: [0, 10] }} {...props} />\n      <VictoryChart\n        theme={VictoryTheme[props.themeKey]}\n        domain={{ x: [3, 5.5], y: [0, 10] }}\n      >\n        <VictoryBoxPlot {...props} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} minDomain={{ y: 2 }}>\n        <VictoryBoxPlot {...props} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} maxDomain={{ x: 4 }}>\n        <VictoryBoxPlot {...props} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-box-plot/group.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryBoxPlot, VictoryGroup } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryBoxPlot> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBoxPlot\",\n};\n\nexport const Group: Story = {\n  args: {\n    domainPadding: 20,\n  },\n  render: (props) => (\n    <VictoryGroup>\n      <VictoryBoxPlot\n        minLabels\n        maxLabels\n        data={[\n          { x: 1, y: [1, 2, 3, 5] },\n          { x: 2, y: [3, 2, 8, 10] },\n          { x: 3, y: [2, 8, 6, 5] },\n          { x: 4, y: [1, 3, 2, 9] },\n        ]}\n        style={{\n          min: { stroke: \"tomato\" },\n          max: { stroke: \"orange\" },\n          q1: { fill: \"tomato\" },\n          q3: { fill: \"orange\" },\n          median: { stroke: \"white\", strokeWidth: 2 },\n          minLabels: { fill: \"tomato\" },\n          maxLabels: { fill: \"orange\" },\n        }}\n        {...props}\n      />\n    </VictoryGroup>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-box-plot/labels.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryBoxPlot, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getBoxPlotData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryBoxPlot> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBoxPlot\",\n};\n\nexport const Labels: Story = {\n  args: {\n    data: getBoxPlotData(3),\n    domainPadding: 20,\n  },\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBoxPlot labels {...props} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryBoxPlot labels {...props} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBoxPlot minLabels maxLabels medianLabels {...props} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBoxPlot q1Labels q3Labels {...props} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBoxPlot\n          minLabels={({ datum }) => `min: ${datum.min}`}\n          maxLabels={({ datum }) => `max: ${datum.max}`}\n          medianLabels={({ datum }) => `med: ${datum.median}`}\n          {...props}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBoxPlot\n          q1Labels={({ datum }) => `q1: ${datum.q1}`}\n          q3Labels={({ datum }) => `q3: ${datum.q3}`}\n          {...props}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBoxPlot\n          labels\n          labelOrientation={{\n            q1: \"left\",\n            q3: \"left\",\n            min: \"right\",\n            max: \"right\",\n            median: \"right\",\n          }}\n          {...props}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryBoxPlot\n          labels\n          labelOrientation={{\n            q1: \"top\",\n            q3: \"top\",\n            min: \"bottom\",\n            max: \"bottom\",\n            median: \"bottom\",\n          }}\n          {...props}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-box-plot/style.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryBoxPlot, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { getBoxPlotData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryBoxPlot> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBoxPlot\",\n};\n\nexport const Style: Story = {\n  args: {\n    data: getBoxPlotData(4),\n    domainPadding: 20,\n    labels: true,\n  },\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBoxPlot\n          style={{\n            min: { stroke: \"#FF530D\", strokeWidth: 2 },\n            max: { stroke: \"#2bbee0\", strokeWidth: 2 },\n            q1: { fill: \"#FF530D\", fillOpacity: 0.5 },\n            q3: { fill: \"#2bbee0\", fillOpacity: 0.5 },\n            median: { stroke: \"#fff\", strokeWidth: 2 },\n            minLabels: { fill: \"#FF530D\", padding: 10 },\n            maxLabels: { fill: \"#2bbee0\", padding: 10 },\n          }}\n          {...props}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryBoxPlot\n          style={{\n            min: { stroke: \"#FF530D\", strokeWidth: 2 },\n            max: { stroke: \"#2bbee0\", strokeWidth: 2 },\n            q1: {\n              fill: \"#FF530D\",\n              fillOpacity: ({ datum }) => (datum.q1 < 10 ? 1 : 0.5),\n            },\n            q3: {\n              fill: \"#2bbee0\",\n              fillOpacity: ({ datum }) => (datum.q3 > 15 ? 1 : 0.5),\n            },\n            median: { stroke: \"#fff\", strokeWidth: 2 },\n            minLabels: { fill: \"#FF530D\", padding: 10 },\n            maxLabels: { fill: \"#2bbee0\", padding: 10 },\n          }}\n          {...props}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-box-plot/theme.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryBoxPlot, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getBoxPlotData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryBoxPlot> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBoxPlot\",\n};\n\nexport const Theme: Story = {\n  args: {\n    domainPadding: 20,\n  },\n  render: (props) => (\n    <>\n      <VictoryBoxPlot theme={VictoryTheme.grayscale} />\n      <VictoryChart theme={VictoryTheme.grayscale}>\n        <VictoryBoxPlot data={getBoxPlotData(8)} {...props} />\n      </VictoryChart>\n      <VictoryBoxPlot theme={VictoryTheme.material} {...props} />\n      <VictoryChart theme={VictoryTheme.material}>\n        <VictoryBoxPlot data={getBoxPlotData(8)} {...props} />\n      </VictoryChart>\n      <VictoryBoxPlot theme={VictoryTheme.clean} {...props} />\n      <VictoryChart theme={VictoryTheme.clean}>\n        <VictoryBoxPlot data={getBoxPlotData(8)} {...props} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-box-plot/tooltips.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryBoxPlot,\n  VictoryChart,\n  VictoryTheme,\n  VictoryTooltip,\n} from \"@/victory\";\n\nimport { getBoxPlotData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryBoxPlot> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBoxPlot\",\n};\n\nexport const Tooltips: Story = {\n  args: {\n    data: getBoxPlotData(3),\n    domainPadding: 20,\n    labels: true,\n  },\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBoxPlot\n          minLabelComponent={<VictoryTooltip active />}\n          q3LabelComponent={<VictoryTooltip active />}\n          labelOrientation={{\n            q1: \"left\",\n            q3: \"left\",\n            min: \"right\",\n            max: \"right\",\n            median: \"right\",\n          }}\n          {...props}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryBoxPlot\n          minLabelComponent={<VictoryTooltip active />}\n          q3LabelComponent={<VictoryTooltip active />}\n          labelOrientation={{\n            q1: \"top\",\n            q3: \"top\",\n            min: \"bottom\",\n            max: \"bottom\",\n            median: \"bottom\",\n          }}\n          {...props}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-box-plot/whisker-width.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryBoxPlot, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { getBoxPlotData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryBoxPlot> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryBoxPlot\",\n};\n\nexport const WhiskerWidth: Story = {\n  args: {\n    data: getBoxPlotData(5),\n    domainPadding: 20,\n  },\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBoxPlot whiskerWidth={0} {...props} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryBoxPlot whiskerWidth={0} {...props} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryBoxPlot whiskerWidth={45} {...props} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryBoxPlot whiskerWidth={45} {...props} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-candlestick/candle-colors.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryCandlestick, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { getCandlestickData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryCandlestick> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryCandlestick\",\n};\n\nexport const CandleColors: Story = {\n  args: {\n    candleColors: { positive: \"#8BC34A\", negative: \"#C62828\" },\n    data: getCandlestickData(7),\n    domainPadding: 20,\n  },\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryCandlestick {...props} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryCandlestick\n          {...props}\n          style={{\n            data: { fill: \"tomato\" },\n          }}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-candlestick/config.ts",
    "content": "import type { Meta, StoryObj } from \"@storybook/react\";\n\nimport { VictoryCandlestick, VictoryCandlestickProps } from \"@/victory\";\n\nimport {\n  VictoryCommonProps,\n  VictoryDatableProps,\n  VictoryMultiLabelableProps,\n} from \"../../utils/arg-types\";\nimport { componentContainer } from \"../../utils/decorators\";\n\ntype StoryProps = VictoryCandlestickProps & {\n  themeKey: string;\n};\n\nexport const ComponentMeta: Meta<Omit<StoryProps, \"themeKey\">> = {\n  component: VictoryCandlestick,\n  decorators: [componentContainer],\n\n  argTypes: {\n    ...VictoryCommonProps,\n    ...VictoryDatableProps,\n    ...VictoryMultiLabelableProps,\n\n    candleRatio: { control: \"boolean\" },\n    candleWidth: { control: \"number\" },\n    close: { control: \"text\" },\n    closeLabels: { control: \"boolean\" },\n    high: { control: \"text\" },\n    highLabels: { control: \"boolean\" },\n    low: { control: \"text\" },\n    lowLabels: { control: \"boolean\" },\n    open: { control: \"text\" },\n    openLabels: { control: \"boolean\" },\n    wickStrokeWidth: { control: \"number\" },\n  },\n};\n\nexport type Story = StoryObj<StoryProps>;\n"
  },
  {
    "path": "stories/victory-charts/victory-candlestick/data.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryCandlestick, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryCandlestick> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryCandlestick\",\n};\n\nexport const Data: Story = {\n  args: {\n    domainPadding: 20,\n  },\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryCandlestick\n          {...props}\n          data={[\n            { series: 1, start: 9, close: 30, big: 560, low: 7 },\n            { series: 2, start: 80, close: 40, big: 1200, low: 10 },\n            { series: 3, start: 50, close: 80, big: 900, low: 20 },\n            { series: 4, start: 70, close: 22, big: 700, low: 5 },\n            { series: 5, start: 20, close: 35, big: 500, low: 10 },\n          ]}\n          x=\"series\"\n          open=\"start\"\n          high={(data: any) => data.big / 10}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryCandlestick\n          {...props}\n          data={[\n            { series: 1, start: 9, close: 30, big: 560, low: 7 },\n            { series: 2, start: 80, close: 40, big: 1200, low: 10 },\n            { series: 3, start: 50, close: 80, big: 900, low: 20 },\n            { series: 4, start: 70, close: 22, big: 700, low: 5 },\n            { series: 5, start: 20, close: 35, big: 500, low: 10 },\n          ]}\n          x=\"series\"\n          open=\"start\"\n          high={(data: any) => data.big / 10}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryCandlestick\n          {...props}\n          data={[\n            { x: 1, open: 9, close: 30, high: 56, low: 7 },\n            { x: 2, open: 80, close: 40, high: 120, low: 10 },\n            { x: 3, open: 50, close: 80, high: 90, low: 20 },\n            { x: 4, open: 70, close: 22, high: 70, low: 5 },\n            { x: 5, open: 20, close: 35, high: 50, low: 10 },\n          ]}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-candlestick/default.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryCandlestick, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getCandlestickData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryCandlestick> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryCandlestick\",\n};\n\nexport const Default: Story = {\n  args: {\n    data: getCandlestickData(8),\n  },\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryCandlestick {...props} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-candlestick/disable-inline-styles.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { Candle, VictoryCandlestick, VictoryChart } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getCandlestickData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryCandlestick> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryCandlestick\",\n};\n\nexport const DisableInlineStyles: Story = {\n  args: {\n    data: getCandlestickData(8),\n  },\n  render: (props) => (\n    <>\n      <VictoryChart>\n        <VictoryCandlestick {...props} disableInlineStyles />\n      </VictoryChart>\n      <VictoryChart>\n        <VictoryCandlestick\n          {...props}\n          dataComponent={\n            <Candle disableInlineStyles className=\"fill-green stroke-purple\" />\n          }\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-candlestick/domain.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryCandlestick, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryCandlestick> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryCandlestick\",\n};\n\nexport const Domain: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryCandlestick\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        domain={{ x: [2, 5], y: [50, 150] }}\n        domainPadding={25}\n        data={[\n          { x: 1, open: 9, close: 30, high: 56, low: 7 },\n          { x: 2, open: 80, close: 40, high: 120, low: 10 },\n          { x: 3, open: 50, close: 80, high: 90, low: 20 },\n          { x: 4, open: 70, close: 22, high: 70, low: 5 },\n          { x: 5, open: 20, close: 35, high: 50, low: 10 },\n        ]}\n      />\n      <VictoryChart\n        domain={{ x: [2, 5], y: [50, 150] }}\n        domainPadding={25}\n        theme={VictoryTheme[props.themeKey]}\n      >\n        <VictoryCandlestick\n          {...props}\n          data={[\n            { x: 1, open: 9, close: 30, high: 56, low: 7 },\n            { x: 2, open: 80, close: 40, high: 120, low: 10 },\n            { x: 3, open: 50, close: 80, high: 90, low: 20 },\n            { x: 4, open: 70, close: 22, high: 70, low: 5 },\n            { x: 5, open: 20, close: 35, high: 50, low: 10 },\n          ]}\n        />\n      </VictoryChart>\n      <VictoryChart\n        domainPadding={25}\n        minDomain={{ y: 70 }}\n        theme={VictoryTheme[props.themeKey]}\n      >\n        <VictoryCandlestick\n          {...props}\n          data={[\n            { x: 1, open: 9, close: 30, high: 56, low: 7 },\n            { x: 2, open: 80, close: 40, high: 120, low: 10 },\n            { x: 3, open: 50, close: 80, high: 90, low: 20 },\n            { x: 4, open: 70, close: 22, high: 70, low: 5 },\n            { x: 5, open: 20, close: 35, high: 50, low: 10 },\n          ]}\n        />\n      </VictoryChart>\n      <VictoryChart\n        domainPadding={25}\n        maxDomain={{ x: 4 }}\n        theme={VictoryTheme[props.themeKey]}\n      >\n        <VictoryCandlestick\n          {...props}\n          data={[\n            { x: 1, open: 9, close: 30, high: 56, low: 7 },\n            { x: 2, open: 80, close: 40, high: 120, low: 10 },\n            { x: 3, open: 50, close: 80, high: 90, low: 20 },\n            { x: 4, open: 70, close: 22, high: 70, low: 5 },\n            { x: 5, open: 20, close: 35, high: 50, low: 10 },\n          ]}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-candlestick/labels.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryCandlestick, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getCandlestickData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryCandlestick> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryCandlestick\",\n};\n\nconst sampleData = [\n  { x: 1, open: 9, close: 30, high: 56, low: 7 },\n  { x: 2, open: 80, close: 40, high: 120, low: 10 },\n  { x: 3, open: 50, close: 80, high: 90, low: 20 },\n  { x: 4, open: 70, close: 22, high: 70, low: 5 },\n];\n\nexport const Labels: Story = {\n  args: {\n    domainPadding: 20,\n  },\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryCandlestick\n          {...props}\n          data={getCandlestickData(5)}\n          labels={({ datum }) => `x: ${datum.x}`}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryCandlestick\n          {...props}\n          data={getCandlestickData(5)}\n          labels={({ datum }) => `x: ${datum.x}`}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryCandlestick\n          {...props}\n          data={sampleData}\n          openLabels={({ datum }) => datum.open}\n          closeLabels={({ datum }) => datum.close}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryCandlestick\n          {...props}\n          data={sampleData}\n          openLabels={({ datum }) => datum.open}\n          closeLabels={({ datum }) => datum.close}\n          labelOrientation={{ open: \"top\", close: \"bottom\" }}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryCandlestick\n          {...props}\n          data={sampleData}\n          highLabels={({ datum }) => datum.high}\n          lowLabels={({ datum }) => datum.low}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryCandlestick\n          {...props}\n          data={sampleData}\n          highLabels={({ datum }) => datum.high}\n          lowLabels={({ datum }) => datum.low}\n          labelOrientation={{ low: \"left\", high: \"right\" }}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-candlestick/scale.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryCandlestick, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { getCandlestickTimeData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryCandlestick> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryCandlestick\",\n};\n\nexport const Scale: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart domainPadding={20} theme={VictoryTheme[props.themeKey]}>\n        <VictoryCandlestick\n          {...props}\n          data={getCandlestickTimeData(5)}\n          labels={({ datum }) => datum.x.getFullYear()}\n        />\n      </VictoryChart>\n      <VictoryChart domainPadding={20} theme={VictoryTheme[props.themeKey]}>\n        <VictoryCandlestick\n          {...props}\n          horizontal\n          data={getCandlestickTimeData(5)}\n          labels={({ datum }) => datum.x.getFullYear()}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-candlestick/style.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryCandlestick, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getCandlestickData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryCandlestick> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryCandlestick\",\n};\n\nexport const Style: Story = {\n  args: {\n    data: getCandlestickData(7),\n  },\n  render: (props) => (\n    <>\n      <VictoryChart domainPadding={20} theme={VictoryTheme[props.themeKey]}>\n        <VictoryCandlestick\n          {...props}\n          labels={({ datum }) => datum.x}\n          style={{\n            labels: { fontSize: 20, fill: \"tomato\", fontFamily: \"monospace\" },\n            data: {\n              fill: \"tomato\",\n              fillOpacity: 0.7,\n              stroke: \"tomato\",\n              strokeWidth: 2,\n            },\n          }}\n        />\n      </VictoryChart>\n      <VictoryChart domainPadding={20} theme={VictoryTheme[props.themeKey]}>\n        <VictoryCandlestick\n          {...props}\n          style={{\n            data: {\n              stroke: ({ datum }) =>\n                datum.open > datum.close ? \"red\" : \"black\",\n            },\n          }}\n          labels={({ datum }) => datum.x}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-candlestick/tooltips.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryCandlestick,\n  VictoryChart,\n  VictoryTheme,\n  VictoryTooltip,\n} from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getCandlestickData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryCandlestick> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryCandlestick\",\n};\n\nconst sampleData = [\n  { x: 1, open: 9, close: 30, high: 56, low: 7 },\n  { x: 2, open: 80, close: 40, high: 120, low: 10 },\n  { x: 3, open: 50, close: 80, high: 90, low: 20 },\n  { x: 4, open: 70, close: 22, high: 70, low: 5 },\n];\n\nexport const Tooltips: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart domainPadding={20} theme={VictoryTheme[props.themeKey]}>\n        <VictoryCandlestick\n          {...props}\n          data={getCandlestickData(5)}\n          labels={({ datum }) => `x: ${datum.x}`}\n          labelComponent={<VictoryTooltip active />}\n        />\n      </VictoryChart>\n      <VictoryChart\n        domainPadding={20}\n        theme={VictoryTheme[props.themeKey]}\n        horizontal\n      >\n        <VictoryCandlestick\n          {...props}\n          data={getCandlestickData(5)}\n          labels={({ datum }) => `x: ${datum.x}`}\n          labelComponent={<VictoryTooltip active />}\n        />\n      </VictoryChart>\n      <VictoryChart\n        domainPadding={20}\n        theme={VictoryTheme[props.themeKey]}\n        horizontal\n      >\n        <VictoryCandlestick\n          {...props}\n          data={sampleData}\n          openLabels={({ datum }) => datum.open}\n          closeLabels={({ datum }) => datum.close}\n          openLabelComponent={<VictoryTooltip active />}\n          closeLabelComponent={<VictoryTooltip active />}\n        />\n      </VictoryChart>\n      <VictoryChart\n        domainPadding={20}\n        theme={VictoryTheme[props.themeKey]}\n        horizontal\n      >\n        <VictoryCandlestick\n          {...props}\n          data={sampleData}\n          openLabels={({ datum }) => datum.open}\n          closeLabels={({ datum }) => datum.close}\n          openLabelComponent={<VictoryTooltip active />}\n          closeLabelComponent={<VictoryTooltip active />}\n          labelOrientation={{ open: \"top\", close: \"bottom\" }}\n        />\n      </VictoryChart>\n      <VictoryChart domainPadding={20} theme={VictoryTheme[props.themeKey]}>\n        <VictoryCandlestick\n          {...props}\n          data={sampleData}\n          highLabels={({ datum }) => datum.high}\n          lowLabels={({ datum }) => datum.low}\n          highLabelComponent={<VictoryTooltip active />}\n          lowLabelComponent={<VictoryTooltip active />}\n        />\n      </VictoryChart>\n      <VictoryChart domainPadding={20} theme={VictoryTheme[props.themeKey]}>\n        <VictoryCandlestick\n          {...props}\n          data={sampleData}\n          highLabels={({ datum }) => datum.high}\n          lowLabels={({ datum }) => datum.low}\n          highLabelComponent={<VictoryTooltip active />}\n          lowLabelComponent={<VictoryTooltip active />}\n          labelOrientation={{ low: \"left\", high: \"right\" }}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-candlestick/wick-stroke-width.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryCandlestick, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { getCandlestickData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryCandlestick> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryCandlestick\",\n};\n\nexport const WickStrokeWidth: Story = {\n  args: {\n    data: getCandlestickData(7),\n  },\n  render: (props) => (\n    <>\n      <VictoryChart domainPadding={20} theme={VictoryTheme[props.themeKey]}>\n        <VictoryCandlestick {...props} wickStrokeWidth={5} />\n      </VictoryChart>\n      <VictoryChart domainPadding={20} theme={VictoryTheme[props.themeKey]}>\n        <VictoryCandlestick\n          {...props}\n          style={{\n            data: { stroke: \"tomato\", strokeWidth: 5 },\n          }}\n          wickStrokeWidth={2}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-chart/axes.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryAxis, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryChart> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryChart\",\n};\n\nexport const Axes: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart {...props} theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis />\n      </VictoryChart>\n      <VictoryChart {...props} theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis dependentAxis />\n      </VictoryChart>\n      <VictoryChart {...props} theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis />\n        <VictoryAxis orientation=\"top\" />\n        <VictoryAxis dependentAxis />\n        <VictoryAxis dependentAxis orientation=\"right\" />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-chart/config.ts",
    "content": "import type { Meta, StoryObj } from \"@storybook/react\";\n\nimport { VictoryChart, VictoryChartProps } from \"@/victory\";\n\nimport { VictoryCommonProps } from \"../../utils/arg-types\";\nimport { componentContainer } from \"../../utils/decorators\";\n\ntype StoryProps = VictoryChartProps & {\n  themeKey: string;\n};\n\nexport const ComponentMeta: Meta<Omit<StoryProps, \"themeKey\">> = {\n  component: VictoryChart,\n  decorators: [componentContainer],\n\n  argTypes: {\n    ...VictoryCommonProps,\n\n    desc: { control: \"text\" },\n    endAngle: { control: \"number\" },\n    innerRadius: { control: \"number\" },\n    prependDefaultAxes: { control: \"boolean\" },\n    startAngle: { control: \"number\" },\n    title: { control: \"text\" },\n  },\n};\n\nexport type Story = StoryObj<StoryProps>;\n"
  },
  {
    "path": "stories/victory-charts/victory-chart/default.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryChart> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryChart\",\n};\n\nexport const Default: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart {...props} theme={VictoryTheme[props.themeKey]} />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-chart/domain-from-data.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryAxis,\n  VictoryBoxPlot,\n  VictoryChart,\n  VictoryLine,\n  VictoryScatter,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { getArrayData, getData, getFourQuadrantData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryChart> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryChart\",\n};\n\nexport const DomainFromData: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart {...props} theme={VictoryTheme[props.themeKey]}>\n        <VictoryScatter size={5} symbol=\"plus\" data={getData(10)} />\n        <VictoryScatter\n          size={5}\n          symbol=\"triangleUp\"\n          data={getFourQuadrantData(10)}\n        />\n        <VictoryLine\n          samples={100}\n          y={(d) => 10 * Math.sin(13 * Math.PI * d.x)}\n        />\n      </VictoryChart>\n      <VictoryChart {...props} theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryScatter size={5} symbol=\"plus\" data={getData(10)} />\n        <VictoryScatter\n          size={5}\n          symbol=\"triangleUp\"\n          data={getFourQuadrantData(10)}\n        />\n        <VictoryLine\n          samples={100}\n          y={(d) => 10 * Math.sin(13 * Math.PI * d.x)}\n        />\n      </VictoryChart>\n      <VictoryChart {...props} theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis tickValues={[-10, -5, 5, 10]} />\n        <VictoryAxis dependentAxis tickValues={[-5, 5]} />\n        <VictoryScatter data={getData(10)} />\n        <VictoryLine samples={150} y={(d) => Math.sin(Math.PI * d.x)} />\n      </VictoryChart>\n      <VictoryChart {...props} theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryAxis tickValues={[-10, -5, 5, 10]} />\n        <VictoryAxis dependentAxis tickValues={[-5, 5]} />\n        <VictoryScatter data={getData(10)} />\n        <VictoryLine samples={150} y={(d) => Math.sin(Math.PI * d.x)} />\n      </VictoryChart>\n      <VictoryChart {...props} theme={VictoryTheme[props.themeKey]}>\n        <VictoryScatter\n          size={6}\n          symbol=\"star\"\n          data={[\n            { x: \"cat\", y: 2 },\n            { x: \"dog\", y: 3 },\n            { x: \"bird\", y: 1 },\n            { x: \"frog\", y: 4 },\n          ]}\n        />\n        <VictoryScatter\n          size={6}\n          symbol=\"square\"\n          data={[\n            { x: \"cat\", y: 3 },\n            { x: \"mouse\", y: 3 },\n            { x: \"bird\", y: 5 },\n            { x: \"frog\", y: 7 },\n            { x: \"dog\", y: 1 },\n          ]}\n        />\n      </VictoryChart>\n      <VictoryChart {...props} theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryScatter\n          size={6}\n          symbol=\"star\"\n          data={[\n            { x: \"cat\", y: 2 },\n            { x: \"dog\", y: 3 },\n            { x: \"bird\", y: 1 },\n            { x: \"frog\", y: 4 },\n          ]}\n        />\n        <VictoryScatter\n          size={6}\n          symbol=\"square\"\n          data={[\n            { x: \"cat\", y: 3 },\n            { x: \"mouse\", y: 3 },\n            { x: \"bird\", y: 5 },\n            { x: \"frog\", y: 7 },\n            { x: \"dog\", y: 1 },\n          ]}\n        />\n      </VictoryChart>\n      <VictoryChart {...props} theme={VictoryTheme[props.themeKey]}>\n        <VictoryBoxPlot data={getArrayData(5)} />\n        <VictoryLine samples={100} y={(d) => 5 + 3 * Math.sin(Math.PI * d.x)} />\n      </VictoryChart>\n      <VictoryChart {...props} theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryBoxPlot data={getArrayData(5)} />\n        <VictoryLine samples={100} y={(d) => 5 + 3 * Math.sin(Math.PI * d.x)} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-chart/domain-padding.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryBar, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { getData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryChart> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryChart\",\n};\n\nexport const DomainPadding: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        domainPadding={25}\n      >\n        <VictoryBar data={getData(5)} />\n      </VictoryChart>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        horizontal\n        domainPadding={25}\n      >\n        <VictoryBar data={getData(5)} />\n      </VictoryChart>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        domainPadding={{ x: [25, 0], y: 25 }}\n      >\n        <VictoryBar data={getData(5)} />\n      </VictoryChart>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        horizontal\n        domainPadding={{ x: [25, 0], y: 25 }}\n      >\n        <VictoryBar data={getData(5)} />\n      </VictoryChart>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        domainPadding={{ x: 100 }}\n        singleQuadrantDomainPadding={false}\n      >\n        <VictoryBar data={getData(5)} />\n      </VictoryChart>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        horizontal\n        domainPadding={{ x: 100 }}\n        singleQuadrantDomainPadding={false}\n      >\n        <VictoryBar data={getData(5)} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-chart/domain.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryBar, VictoryChart, VictoryLine, VictoryTheme } from \"@/victory\";\n\nimport { getData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryChart> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryChart\",\n};\n\nexport const Domain: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        domain={[0, 10]}\n      >\n        <VictoryBar data={getData(5)} />\n      </VictoryChart>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        horizontal\n        domain={[0, 10]}\n      >\n        <VictoryBar data={getData(5)} />\n      </VictoryChart>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        domain={{ x: [0, 6], y: [0, 10] }}\n      >\n        <VictoryBar data={getData(5)} />\n      </VictoryChart>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        horizontal\n        domain={{ x: [0, 6], y: [0, 10] }}\n      >\n        <VictoryBar data={getData(5)} />\n      </VictoryChart>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        minDomain={1}\n        maxDomain={7}\n      >\n        <VictoryLine data={getData(100)} />\n      </VictoryChart>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        horizontal\n        minDomain={1}\n        maxDomain={7}\n      >\n        <VictoryLine data={getData(100)} />\n      </VictoryChart>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        minDomain={{ x: 50 }}\n        maxDomain={{ y: 7 }}\n      >\n        <VictoryLine data={getData(100)} />\n      </VictoryChart>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        horizontal\n        minDomain={{ x: 50 }}\n        maxDomain={{ y: 7 }}\n      >\n        <VictoryLine data={getData(100)} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-chart/orientations.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryAxis, VictoryBar, VictoryChart } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryChart> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryChart\",\n};\n\nexport const Orientations: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart\n        {...props}\n        padding={{ left: 20, right: 30, top: 15, bottom: 40 }}\n      >\n        <VictoryAxis tickValues={[1, 2, 3, 4, 5]} />\n        <VictoryAxis\n          orientation=\"left\"\n          dependentAxis\n          tickValues={[1, 2, 3, 4, 5, 6, 7, 8]}\n        />\n        <VictoryAxis\n          orientation=\"right\"\n          dependentAxis\n          tickValues={[1, 2, 3, 4, 5, 6, 7, 8, 9]}\n        />\n        <VictoryBar\n          style={{ data: { fill: \"#c43a31\" } }}\n          data={[\n            { x: 1, y: 1 },\n            { x: 2, y: 7 },\n            { x: 3, y: 4 },\n            { x: 4, y: 5 },\n            { x: 5, y: 2 },\n          ]}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-chart/style.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryBar,\n  VictoryChart,\n  VictoryGroup,\n  VictoryPolarAxis,\n  VictoryStack,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryChart> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryChart\",\n};\n\nexport const Style: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        style={{\n          parent: {\n            border: \"5px solid #000\",\n            backgroundColor: \"cyan\",\n          },\n        }}\n      />\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        polar\n        style={{\n          parent: {\n            border: \"5px solid #000\",\n            backgroundColor: \"cyan\",\n          },\n        }}\n      >\n        <VictoryPolarAxis />\n      </VictoryChart>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        style={{\n          parent: {\n            border: \"5px solid #000\",\n            backgroundColor: \"cyan\",\n          },\n          background: { fill: \"pink\" },\n        }}\n      />\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        polar\n        style={{\n          parent: {\n            border: \"5px solid #000\",\n            backgroundColor: \"cyan\",\n          },\n          background: { fill: \"pink\" },\n        }}\n      >\n        <VictoryPolarAxis />\n      </VictoryChart>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        horizontal\n        style={{\n          parent: {\n            border: \"5px solid #000\",\n            backgroundColor: \"cyan\",\n          },\n          background: { fill: \"pink\" },\n        }}\n      >\n        <VictoryGroup\n          labels={[\"a\", \"b\", \"c\"]}\n          offset={20}\n          colorScale={\"qualitative\"}\n        >\n          <VictoryBar\n            data={[\n              { x: 1, y: 1 },\n              { x: 2, y: 2 },\n              { x: 3, y: 5 },\n            ]}\n          />\n          <VictoryBar\n            data={[\n              { x: 1, y: 2 },\n              { x: 2, y: 1 },\n              { x: 3, y: 7 },\n            ]}\n          />\n          <VictoryBar\n            data={[\n              { x: 1, y: 3 },\n              { x: 2, y: 4 },\n              { x: 3, y: 9 },\n            ]}\n          />\n        </VictoryGroup>\n      </VictoryChart>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        polar\n        domainPadding={{ y: 30 }}\n        innerRadius={30}\n        style={{\n          parent: {\n            border: \"5px solid #000\",\n            backgroundColor: \"cyan\",\n          },\n          background: { fill: \"pink\" },\n        }}\n      >\n        <VictoryGroup\n          labels={[\"a\", \"b\", \"c\"]}\n          offset={20}\n          colorScale={\"qualitative\"}\n          style={{ data: { width: 15 } }}\n        >\n          <VictoryBar\n            data={[\n              { x: 1, y: 1 },\n              { x: 2, y: 2 },\n              { x: 3, y: 5 },\n            ]}\n          />\n          <VictoryBar\n            data={[\n              { x: 1, y: 2 },\n              { x: 2, y: 1 },\n              { x: 3, y: 7 },\n            ]}\n          />\n          <VictoryBar\n            data={[\n              { x: 1, y: 3 },\n              { x: 2, y: 4 },\n              { x: 3, y: 9 },\n            ]}\n          />\n        </VictoryGroup>\n        <VictoryPolarAxis />\n      </VictoryChart>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        domainPadding={{ x: 17 }}\n        style={{\n          parent: {\n            border: \"5px solid #000\",\n            backgroundColor: \"cyan\",\n          },\n          background: { fill: \"pink\" },\n        }}\n      >\n        <VictoryStack labels={[\"a\", \"b\", \"c\"]} colorScale={\"qualitative\"}>\n          <VictoryBar\n            data={[\n              { x: 1, y: 1 },\n              { x: 2, y: 2 },\n              { x: 3, y: 5 },\n            ]}\n          />\n          <VictoryBar\n            data={[\n              { x: 1, y: 2 },\n              { x: 2, y: 1 },\n              { x: 3, y: 7 },\n            ]}\n          />\n          <VictoryBar\n            data={[\n              { x: 1, y: 3 },\n              { x: 2, y: 4 },\n              { x: 3, y: 9 },\n            ]}\n          />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        polar\n        domainPadding={{ y: 30 }}\n        style={{\n          parent: {\n            border: \"5px solid #000\",\n            backgroundColor: \"cyan\",\n          },\n          background: { fill: \"pink\" },\n        }}\n      >\n        <VictoryStack\n          labels={[\"a\", \"b\", \"c\"]}\n          colorScale={\"qualitative\"}\n          style={{ data: { width: 15 } }}\n        >\n          <VictoryBar\n            data={[\n              { x: 1, y: 1 },\n              { x: 2, y: 2 },\n              { x: 3, y: 5 },\n            ]}\n          />\n          <VictoryBar\n            data={[\n              { x: 1, y: 2 },\n              { x: 2, y: 1 },\n              { x: 3, y: 7 },\n            ]}\n          />\n          <VictoryBar\n            data={[\n              { x: 1, y: 3 },\n              { x: 2, y: 4 },\n              { x: 3, y: 9 },\n            ]}\n          />\n        </VictoryStack>\n        <VictoryPolarAxis />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-chart/victory-brush-container-default.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryBrushContainer, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryChart> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryChart\",\n};\n\nexport const VictoryBrushContainerDefault: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        containerComponent={<VictoryBrushContainer />}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-chart/victory-brush-container-with-brush-style.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryBrushContainer, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryChart> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryChart\",\n};\n\nexport const VictoryBrushContainerWithBrushStyle: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        containerComponent={\n          <VictoryBrushContainer\n            brushStyle={{ fill: \"teal\", stroke: \"teal\", fillOpacity: 0.2 }}\n          />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-chart/victory-brush-container-with-domain-horizontal.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryBrushContainer, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryChart> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryChart\",\n};\n\nexport const VictoryBrushContainerWithDomainHorizontal: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        horizontal\n        containerComponent={\n          <VictoryBrushContainer brushDomain={{ x: [0, 0.5], y: [0.5, 1] }} />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-chart/victory-brush-container-with-domain.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryBrushContainer, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryChart> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryChart\",\n};\n\nexport const VictoryBrushContainerWithDomain: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        containerComponent={\n          <VictoryBrushContainer brushDomain={{ x: [0, 0.5], y: [0.5, 1] }} />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-chart/victory-cursor-container-default.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryChart, VictoryCursorContainer, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryChart> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryChart\",\n};\n\nexport const VictoryCursorContainerDefault: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        containerComponent={\n          <VictoryCursorContainer\n            cursorLabel={({ datum }) => datum.x}\n            defaultCursorValue={{ x: 0.25, y: 0.75 }}\n          />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-chart/victory-cursor-container-horizontal.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryChart, VictoryCursorContainer, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryChart> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryChart\",\n};\n\nexport const VictoryCursorContainerHorizontal: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        horizontal\n        containerComponent={\n          <VictoryCursorContainer\n            cursorLabel={({ datum }) => datum.x}\n            defaultCursorValue={{ x: 0.25, y: 0.75 }}\n          />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-chart/victory-zoom-container-default.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryChart,\n  VictoryLine,\n  VictoryZoomContainer,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryChart> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryChart\",\n};\n\nexport const VictoryZoomContainerDefault: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        scale={{ x: \"time\" }}\n        containerComponent={\n          <VictoryZoomContainer\n            zoomDomain={{ x: [new Date(1993, 1, 1), new Date(2005, 1, 1)] }}\n          />\n        }\n      >\n        <VictoryLine\n          style={{\n            data: { stroke: \"red\", strokeWidth: 5 },\n          }}\n          data={[\n            { x: new Date(1982, 1, 1), y: 125 },\n            { x: new Date(1987, 1, 1), y: 257 },\n            { x: new Date(1993, 1, 1), y: 345 },\n            { x: new Date(1997, 1, 1), y: 515 },\n            { x: new Date(2001, 1, 1), y: 132 },\n            { x: new Date(2005, 1, 1), y: 305 },\n            { x: new Date(2011, 1, 1), y: 270 },\n            { x: new Date(2015, 1, 1), y: 470 },\n          ]}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-container/config.ts",
    "content": "import type { Meta, StoryObj } from \"@storybook/react\";\n\nimport { VictoryContainer, VictoryContainerProps } from \"@/victory\";\n\nimport { VictoryContainerProps as ContainerArgTypes } from \"../../utils/arg-types\";\nimport { componentContainer } from \"../../utils/decorators\";\n\ntype StoryProps = VictoryContainerProps & {\n  themeKey: string;\n};\n\nexport const ComponentMeta: Meta<Omit<StoryProps, \"themeKey\">> = {\n  component: VictoryContainer,\n  decorators: [componentContainer],\n\n  argTypes: {\n    ...ContainerArgTypes,\n  },\n};\nexport type Story = StoryObj<StoryProps>;\n"
  },
  {
    "path": "stories/victory-charts/victory-container/preserve-aspect-ratio.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryContainer,\n  VictoryChart,\n  VictoryLabel,\n  VictoryLine,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryContainer> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryContainer\",\n};\n\nexport const PreserveAspectRatio: Story = {\n  args: {\n    height: 250,\n    width: 500,\n  },\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine />\n        <VictoryLabel x={50} y={20} text=\"default (undefined)\" />\n      </VictoryChart>\n      <VictoryChart\n        theme={VictoryTheme[props.themeKey]}\n        containerComponent={\n          <VictoryContainer {...props} preserveAspectRatio=\"none\" />\n        }\n      >\n        <VictoryLine />\n        <VictoryLabel x={50} y={20} text={`preserveAspectRatio=\"none\"`} />\n      </VictoryChart>\n      <VictoryChart\n        theme={VictoryTheme[props.themeKey]}\n        containerComponent={\n          <VictoryContainer {...props} preserveAspectRatio=\"xMinYMin meet\" />\n        }\n      >\n        <VictoryLine />\n        <VictoryLabel\n          x={50}\n          y={20}\n          text={`preserveAspectRatio=\"xMinYMin meet\"`}\n        />\n      </VictoryChart>\n      <VictoryChart\n        theme={VictoryTheme[props.themeKey]}\n        containerComponent={\n          <VictoryContainer {...props} preserveAspectRatio=\"xMinYMin slice\" />\n        }\n      >\n        <VictoryLine />\n        <VictoryLabel\n          x={50}\n          y={20}\n          text={`preserveAspectRatio=\"xMinYMin slice\"`}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-container/responsive.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryContainer,\n  VictoryChart,\n  VictoryLabel,\n  VictoryLine,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryContainer> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryContainer\",\n};\n\nexport const Responsive: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine />\n        <VictoryLabel x={50} y={20} text=\"default responsive={true}\" />\n      </VictoryChart>\n      <VictoryChart\n        theme={VictoryTheme[props.themeKey]}\n        containerComponent={<VictoryContainer {...props} responsive={false} />}\n      >\n        <VictoryLine />\n        <VictoryLabel x={50} y={20} text={`responsive={false}`} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-errorbar/border-width.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryErrorBar, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getErrorBarData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryErrorBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryErrorBar\",\n};\n\nexport const BorderWidth: Story = {\n  args: {\n    data: getErrorBarData(5),\n  },\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryErrorBar {...props} borderWidth={0} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryErrorBar {...props} borderWidth={10} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-errorbar/config.ts",
    "content": "import type { Meta, StoryObj } from \"@storybook/react\";\n\nimport { VictoryErrorBar, VictoryErrorBarProps } from \"@/victory\";\n\nimport {\n  VictoryCommonProps,\n  VictoryDatableProps,\n  VictoryMultiLabelableProps,\n} from \"../../utils/arg-types\";\nimport { componentContainer } from \"../../utils/decorators\";\n\ntype StoryProps = VictoryErrorBarProps & {\n  themeKey: string;\n};\n\nexport const ComponentMeta: Meta<Omit<StoryProps, \"themeKey\">> = {\n  component: VictoryErrorBar,\n  decorators: [componentContainer],\n\n  argTypes: {\n    ...VictoryCommonProps,\n    ...VictoryDatableProps,\n    ...VictoryMultiLabelableProps,\n\n    borderWidth: { control: \"number\" },\n    errorX: { control: \"text\" },\n    errorY: { control: \"text\" },\n  },\n};\n\nexport type Story = StoryObj<StoryProps>;\n"
  },
  {
    "path": "stories/victory-charts/victory-errorbar/data.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryErrorBar, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryErrorBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryErrorBar\",\n};\n\nexport const Data: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryErrorBar\n          {...props}\n          data={[\n            { x: 1, y: 1, errorX: [1, 0.5], errorY: 0.1 },\n            { x: 2, y: 2, errorX: [1, 3], errorY: 0.1 },\n            { x: 3, y: 3, errorX: [1, 3], errorY: [0.2, 0.3] },\n            { x: 4, y: 2, errorX: [1, 0.5], errorY: 0.1 },\n            { x: 5, y: 1, errorX: [1, 0.5], errorY: 0.2 },\n          ]}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryErrorBar\n          {...props}\n          data={[\n            { series: 1, value: 9, error: 3 },\n            { series: 2, value: 80, error: 4 },\n            { series: 3, value: 50, error: 8 },\n            { series: 4, value: 70, error: 2 },\n            { series: 5, value: 20, error: 3 },\n          ]}\n          x=\"series\"\n          y=\"value\"\n          errorY={(d) => [d.error, d.error + 2]}\n        />\n      </VictoryChart>\n      <VictoryChart horizontal>\n        <VictoryErrorBar\n          {...props}\n          data={[\n            { series: 1, value: 9, error: 3 },\n            { series: 2, value: 80, error: 4 },\n            { series: 3, value: 50, error: 8 },\n            { series: 4, value: 70, error: 2 },\n            { series: 5, value: 20, error: 3 },\n          ]}\n          x=\"series\"\n          y=\"value\"\n          errorY={(d) => [d.error, d.error + 2]}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryErrorBar\n          {...props}\n          data={[\n            { x: 1, y: 9, error: 3 },\n            { x: 2, y: 80, error: 4 },\n            { x: 3, y: 50, error: 8 },\n            { x: 4, y: 70, error: 2 },\n            { x: 5, y: 20, error: 3 },\n          ]}\n          errorY={(d) => [d.error, d.error + 2]}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-errorbar/default.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryErrorBar, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryErrorBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryErrorBar\",\n};\n\nexport const Default: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryErrorBar {...props} theme={VictoryTheme[props.themeKey]} />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-errorbar/disable-inline-styles.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  ErrorBar,\n  VictoryErrorBar,\n  VictoryChart,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { getErrorBarData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryErrorBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryErrorbar\",\n};\n\nexport const DisableInlineStyles: Story = {\n  args: {\n    data: getErrorBarData(4),\n  },\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryErrorBar {...props} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryErrorBar\n          {...props}\n          dataComponent={\n            <ErrorBar disableInlineStyles className=\"stroke-purple\" />\n          }\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-errorbar/domain.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryErrorBar, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryErrorBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryErrorBar\",\n};\n\nexport const Domain: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryErrorBar\n        {...props}\n        domain={{ x: [2, 5], y: [25, 100] }}\n        data={[\n          { x: 1, y: 9, errorX: 0.3, errorY: 3 },\n          { x: 2, y: 80, errorX: 0.5, errorY: 2 },\n          { x: 3, y: 50, errorX: 1.1, errorY: 2 },\n          { x: 4, y: 70, errorX: 0.2, errorY: 3 },\n          { x: 5, y: 20, errorX: 0.3, errorY: 2 },\n        ]}\n      />\n      <VictoryChart\n        theme={VictoryTheme[props.themeKey]}\n        domain={{ x: [2, 5], y: [25, 100] }}\n      >\n        <VictoryErrorBar\n          {...props}\n          data={[\n            { x: 1, y: 9, errorX: 0.3, errorY: 3 },\n            { x: 2, y: 80, errorX: 0.5, errorY: 2 },\n            { x: 3, y: 50, errorX: 1.1, errorY: 2 },\n            { x: 4, y: 70, errorX: 0.2, errorY: 3 },\n            { x: 5, y: 20, errorX: 0.3, errorY: 2 },\n          ]}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} minDomain={{ x: 3 }}>\n        <VictoryErrorBar\n          {...props}\n          data={[\n            { x: 1, y: 9, errorX: 0.3, errorY: 3 },\n            { x: 2, y: 80, errorX: 0.5, errorY: 2 },\n            { x: 3, y: 50, errorX: 1.1, errorY: 2 },\n            { x: 4, y: 70, errorX: 0.2, errorY: 3 },\n            { x: 5, y: 20, errorX: 0.3, errorY: 2 },\n          ]}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} maxDomain={{ y: 65 }}>\n        <VictoryErrorBar\n          {...props}\n          data={[\n            { x: 1, y: 9, errorX: 0.3, errorY: 3 },\n            { x: 2, y: 80, errorX: 0.5, errorY: 2 },\n            { x: 3, y: 50, errorX: 1.1, errorY: 2 },\n            { x: 4, y: 70, errorX: 0.2, errorY: 3 },\n            { x: 5, y: 20, errorX: 0.3, errorY: 2 },\n          ]}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-errorbar/labels.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryErrorBar,\n  VictoryChart,\n  VictoryTheme,\n  VictoryTooltip,\n} from \"@/victory\";\n\nimport { getErrorBarData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryErrorBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryErrorBar\",\n};\n\nexport const Labels: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryErrorBar\n          {...props}\n          data={getErrorBarData(5)}\n          labels={({ datum }) => `x: ${datum.x}`}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryErrorBar\n          {...props}\n          data={getErrorBarData(5)}\n          labels={({ datum }) => `x: ${datum.x}`}\n          labelComponent={<VictoryTooltip active />}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryErrorBar\n          {...props}\n          data={[\n            { x: 1, y: 9, errorX: 0.3, errorY: 3, label: \"first\" },\n            { x: 2, y: 80, errorX: 0.5, errorY: 2 },\n            { x: 3, y: 50, errorX: 1.1, errorY: 2, label: \"third\" },\n            { x: 4, y: 70, errorX: 0.2, errorY: 3 },\n            { x: 5, y: 20, errorX: 0.3, errorY: 2, label: [\"last\", \"label\"] },\n          ]}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryErrorBar\n          {...props}\n          data={[\n            { x: 1, y: 9, errorX: 0.3, errorY: 3, label: \"first\" },\n            { x: 2, y: 80, errorX: 0.5, errorY: 2 },\n            { x: 3, y: 50, errorX: 1.1, errorY: 2, label: \"third\" },\n            { x: 4, y: 70, errorX: 0.2, errorY: 3 },\n            { x: 5, y: 20, errorX: 0.3, errorY: 2, label: [\"last\", \"label\"] },\n          ]}\n          labelComponent={<VictoryTooltip active />}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryErrorBar\n          {...props}\n          data={[\n            { x: 1, y: 9, error: 3 },\n            { x: 2, y: 80, error: 4 },\n            { x: 3, y: 50, error: 8 },\n            { x: 4, y: 70, error: 2 },\n            { x: 5, y: 20, error: 3 },\n          ]}\n          errorY={(d) => [d.error, d.error + 2]}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-errorbar/style.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryErrorBar, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getErrorBarData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryErrorBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryErrorBar\",\n};\n\nexport const Style: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryErrorBar\n          {...props}\n          data={getErrorBarData(4)}\n          labels={({ datum }) => datum.x}\n          style={{\n            labels: { fontSize: 20, fill: \"tomato\", fontFamily: \"monospace\" },\n            data: {\n              fill: \"tomato\",\n              fillOpacity: 0.7,\n              stroke: \"tomato\",\n              strokeWidth: 2,\n            },\n          }}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryErrorBar\n          {...props}\n          style={{\n            data: {\n              stroke: ({ datum }) =>\n                datum.errorX > datum.errorY ? \"red\" : \"black\",\n            },\n          }}\n          labels={({ datum }) => datum.x}\n          data={getErrorBarData(4, true)}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-errorbar/theme.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryErrorBar, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { getErrorBarData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryErrorBar> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryErrorBar\",\n};\n\nexport const Theme: Story = {\n  args: {\n    data: getErrorBarData(5),\n  },\n  render: (props) => (\n    <>\n      <VictoryErrorBar {...props} />\n      <VictoryChart>\n        <VictoryErrorBar {...props} />\n      </VictoryChart>\n      <VictoryErrorBar {...props} theme={VictoryTheme.material} />\n      <VictoryChart theme={VictoryTheme.material}>\n        <VictoryErrorBar {...props} />\n      </VictoryChart>\n      <VictoryErrorBar {...props} theme={VictoryTheme.clean} />\n      <VictoryChart theme={VictoryTheme.clean}>\n        <VictoryErrorBar {...props} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-histogram/bin-spacing.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryHistogram, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { data } from \"./data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryHistogram> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryHistogram\",\n};\n\nexport const BinSpacing: Story = {\n  args: {\n    data,\n  },\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryHistogram {...props} binSpacing={10} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryHistogram {...props} binSpacing={10} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryHistogram {...props} binSpacing={5} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryHistogram {...props} binSpacing={5} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-histogram/config.ts",
    "content": "import type { Meta, StoryObj } from \"@storybook/react\";\n\nimport { VictoryHistogram, VictoryHistogramProps } from \"@/victory\";\n\nimport {\n  VictoryCommonProps,\n  VictoryDatableProps,\n  VictoryMultiLabelableProps,\n} from \"../../utils/arg-types\";\nimport { componentContainer } from \"../../utils/decorators\";\n\ntype StoryProps = VictoryHistogramProps & {\n  themeKey: string;\n};\n\nexport const ComponentMeta: Meta<Omit<StoryProps, \"themeKey\">> = {\n  component: VictoryHistogram,\n  decorators: [componentContainer],\n\n  argTypes: {\n    ...VictoryCommonProps,\n    ...VictoryDatableProps,\n    ...VictoryMultiLabelableProps,\n\n    bins: { control: \"number\" },\n    binSpacing: { control: \"number\" },\n    cornerRadius: { control: \"number\" },\n  },\n};\n\nexport type Story = StoryObj<StoryProps>;\n"
  },
  {
    "path": "stories/victory-charts/victory-histogram/corner-radius.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryHistogram, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { data } from \"./data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryHistogram> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryHistogram\",\n};\n\nexport const CornerRadius: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryHistogram {...props} data={data} cornerRadius={1} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryHistogram {...props} data={data} cornerRadius={1} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryHistogram {...props} data={data} cornerRadius={10} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryHistogram {...props} data={data} cornerRadius={10} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryHistogram\n          {...props}\n          data={data}\n          cornerRadius={{ topLeft: 15, bottomRight: 30 }}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryHistogram\n          {...props}\n          data={data}\n          cornerRadius={{ topLeft: 15, bottomRight: 22 }}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-histogram/data.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryHistogram, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { data, timeData } from \"./data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryHistogram> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryHistogram\",\n};\n\nexport const Data: Story = {\n  args: {},\n  render: (props) => {\n    const oneYear = timeData.map(({ x }) => {\n      const newDate = new Date(x);\n      newDate.setFullYear(2020);\n      return { x: newDate };\n    });\n\n    const fourMonths = timeData.map(({ x }, index) => {\n      const newDate = new Date(x);\n      newDate.setFullYear(2020);\n      newDate.setMonth(Math.ceil(index / 200));\n      return { x: newDate };\n    });\n\n    const oneMonth = timeData.map(({ x }) => {\n      const newDate = new Date(x);\n      newDate.setMonth(4);\n      newDate.setFullYear(2020);\n      return { x: newDate };\n    });\n\n    return (\n      <>\n        <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n          <VictoryHistogram {...props} data={timeData} />\n        </VictoryChart>\n        <VictoryChart theme={VictoryTheme[props.themeKey]}>\n          <VictoryHistogram {...props} data={oneYear} />\n        </VictoryChart>\n        <VictoryChart theme={VictoryTheme[props.themeKey]}>\n          <VictoryHistogram {...props} data={fourMonths} />\n        </VictoryChart>\n        <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n          <VictoryHistogram {...props} data={oneMonth} />\n        </VictoryChart>\n        <VictoryChart theme={VictoryTheme[props.themeKey]}>\n          <VictoryHistogram\n            {...props}\n            data={data.map(({ x }) => ({ value: x }))}\n            x={({ value }) => value}\n          />\n        </VictoryChart>\n        {/* <VictoryChart theme={VictoryTheme[props.themeKey]}>\n          <VictoryHistogram {...props}\n            bins=\"year\"\n            data={timeData.map(({ x }) => ({ value: x }))}\n            x={({ value }) => value}\n          />\n        </VictoryChart> */}\n      </>\n    );\n  },\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-histogram/data.ts",
    "content": "export const data = [\n  { x: 18 },\n  { x: 85 },\n  { x: 27 },\n  { x: 62 },\n  { x: 26 },\n  { x: 90 },\n  { x: 85 },\n  { x: 60 },\n  { x: 85 },\n  { x: 21 },\n  { x: 86 },\n  { x: 89 },\n  { x: 60 },\n  { x: 82 },\n  { x: 70 },\n  { x: 22 },\n  { x: 68 },\n  { x: 79 },\n  { x: 18 },\n  { x: 76 },\n  { x: 32 },\n  { x: 26 },\n  { x: 18 },\n  { x: 63 },\n  { x: 71 },\n  { x: 98 },\n  { x: 91 },\n  { x: 22 },\n  { x: 25 },\n  { x: 91 },\n  { x: 18 },\n  { x: 49 },\n  { x: 18 },\n  { x: 79 },\n  { x: 56 },\n  { x: 18 },\n  { x: 18 },\n  { x: 28 },\n  { x: 79 },\n  { x: 44 },\n];\n\nexport const timeData = [\n  { x: new Date(\"2018-09-24T07:00:00.000Z\") },\n  { x: new Date(\"2010-09-14T07:00:00.000Z\") },\n  { x: new Date(\"2011-03-14T07:00:00.000Z\") },\n  { x: new Date(\"2011-01-09T08:00:00.000Z\") },\n  { x: new Date(\"2014-05-06T07:00:00.000Z\") },\n  { x: new Date(\"2012-02-05T08:00:00.000Z\") },\n  { x: new Date(\"2013-08-09T07:00:00.000Z\") },\n  { x: new Date(\"2015-05-21T07:00:00.000Z\") },\n  { x: new Date(\"2020-11-10T08:00:00.000Z\") },\n  { x: new Date(\"2013-01-27T08:00:00.000Z\") },\n  { x: new Date(\"2013-03-03T08:00:00.000Z\") },\n  { x: new Date(\"2015-10-21T07:00:00.000Z\") },\n  { x: new Date(\"2021-09-10T07:00:00.000Z\") },\n  { x: new Date(\"2011-01-05T08:00:00.000Z\") },\n  { x: new Date(\"2020-03-18T07:00:00.000Z\") },\n  { x: new Date(\"2011-02-04T08:00:00.000Z\") },\n  { x: new Date(\"2019-03-19T07:00:00.000Z\") },\n  { x: new Date(\"2019-01-03T08:00:00.000Z\") },\n  { x: new Date(\"2016-07-07T07:00:00.000Z\") },\n  { x: new Date(\"2011-05-18T07:00:00.000Z\") },\n  { x: new Date(\"2021-06-12T07:00:00.000Z\") },\n  { x: new Date(\"2016-09-12T07:00:00.000Z\") },\n  { x: new Date(\"2018-02-24T08:00:00.000Z\") },\n  { x: new Date(\"2016-01-05T08:00:00.000Z\") },\n  { x: new Date(\"2019-08-07T07:00:00.000Z\") },\n  { x: new Date(\"2018-05-19T07:00:00.000Z\") },\n  { x: new Date(\"2020-06-25T07:00:00.000Z\") },\n  { x: new Date(\"2018-09-17T07:00:00.000Z\") },\n  { x: new Date(\"2012-04-27T07:00:00.000Z\") },\n  { x: new Date(\"2016-01-18T08:00:00.000Z\") },\n  { x: new Date(\"2020-01-07T08:00:00.000Z\") },\n  { x: new Date(\"2017-09-24T07:00:00.000Z\") },\n  { x: new Date(\"2014-09-19T07:00:00.000Z\") },\n  { x: new Date(\"2021-09-11T07:00:00.000Z\") },\n  { x: new Date(\"2013-06-10T07:00:00.000Z\") },\n  { x: new Date(\"2020-08-18T07:00:00.000Z\") },\n  { x: new Date(\"2015-06-16T07:00:00.000Z\") },\n  { x: new Date(\"2021-07-26T07:00:00.000Z\") },\n  { x: new Date(\"2014-02-10T08:00:00.000Z\") },\n  { x: new Date(\"2020-07-13T07:00:00.000Z\") },\n  { x: new Date(\"2021-07-06T07:00:00.000Z\") },\n  { x: new Date(\"2012-08-06T07:00:00.000Z\") },\n  { x: new Date(\"2013-11-14T08:00:00.000Z\") },\n  { x: new Date(\"2011-07-01T07:00:00.000Z\") },\n  { x: new Date(\"2017-08-12T07:00:00.000Z\") },\n  { x: new Date(\"2014-08-12T07:00:00.000Z\") },\n  { x: new Date(\"2015-05-20T07:00:00.000Z\") },\n  { x: new Date(\"2010-09-16T07:00:00.000Z\") },\n  { x: new Date(\"2013-09-21T07:00:00.000Z\") },\n  { x: new Date(\"2012-05-19T07:00:00.000Z\") },\n  { x: new Date(\"2010-06-25T07:00:00.000Z\") },\n  { x: new Date(\"2014-02-25T08:00:00.000Z\") },\n  { x: new Date(\"2012-10-14T07:00:00.000Z\") },\n  { x: new Date(\"2014-03-10T07:00:00.000Z\") },\n  { x: new Date(\"2010-06-17T07:00:00.000Z\") },\n  { x: new Date(\"2010-11-19T08:00:00.000Z\") },\n  { x: new Date(\"2016-11-14T08:00:00.000Z\") },\n  { x: new Date(\"2020-03-20T07:00:00.000Z\") },\n  { x: new Date(\"2016-05-21T07:00:00.000Z\") },\n  { x: new Date(\"2018-03-16T07:00:00.000Z\") },\n  { x: new Date(\"2017-07-15T07:00:00.000Z\") },\n  { x: new Date(\"2018-01-11T08:00:00.000Z\") },\n  { x: new Date(\"2010-01-01T08:00:00.000Z\") },\n  { x: new Date(\"2014-10-13T07:00:00.000Z\") },\n  { x: new Date(\"2013-10-08T07:00:00.000Z\") },\n  { x: new Date(\"2020-03-01T08:00:00.000Z\") },\n  { x: new Date(\"2018-09-14T07:00:00.000Z\") },\n  { x: new Date(\"2021-02-17T08:00:00.000Z\") },\n  { x: new Date(\"2020-08-08T07:00:00.000Z\") },\n  { x: new Date(\"2019-04-09T07:00:00.000Z\") },\n  { x: new Date(\"2011-01-05T08:00:00.000Z\") },\n  { x: new Date(\"2013-02-26T08:00:00.000Z\") },\n  { x: new Date(\"2020-03-04T08:00:00.000Z\") },\n  { x: new Date(\"2018-08-04T07:00:00.000Z\") },\n  { x: new Date(\"2011-09-14T07:00:00.000Z\") },\n  { x: new Date(\"2018-02-19T08:00:00.000Z\") },\n  { x: new Date(\"2016-02-08T08:00:00.000Z\") },\n  { x: new Date(\"2020-10-03T07:00:00.000Z\") },\n  { x: new Date(\"2021-05-24T07:00:00.000Z\") },\n  { x: new Date(\"2019-10-04T07:00:00.000Z\") },\n  { x: new Date(\"2019-09-21T07:00:00.000Z\") },\n  { x: new Date(\"2020-06-20T07:00:00.000Z\") },\n  { x: new Date(\"2017-10-10T07:00:00.000Z\") },\n  { x: new Date(\"2017-09-16T07:00:00.000Z\") },\n  { x: new Date(\"2010-05-20T07:00:00.000Z\") },\n  { x: new Date(\"2020-04-05T07:00:00.000Z\") },\n  { x: new Date(\"2021-01-07T08:00:00.000Z\") },\n  { x: new Date(\"2012-09-05T07:00:00.000Z\") },\n  { x: new Date(\"2010-06-11T07:00:00.000Z\") },\n  { x: new Date(\"2010-01-15T08:00:00.000Z\") },\n  { x: new Date(\"2015-06-23T07:00:00.000Z\") },\n  { x: new Date(\"2016-05-07T07:00:00.000Z\") },\n  { x: new Date(\"2012-06-25T07:00:00.000Z\") },\n  { x: new Date(\"2016-05-03T07:00:00.000Z\") },\n  { x: new Date(\"2011-10-12T07:00:00.000Z\") },\n  { x: new Date(\"2019-01-23T08:00:00.000Z\") },\n  { x: new Date(\"2013-01-15T08:00:00.000Z\") },\n  { x: new Date(\"2018-02-05T08:00:00.000Z\") },\n  { x: new Date(\"2011-07-24T07:00:00.000Z\") },\n  { x: new Date(\"2010-11-14T08:00:00.000Z\") },\n  { x: new Date(\"2020-10-16T07:00:00.000Z\") },\n  { x: new Date(\"2016-03-07T08:00:00.000Z\") },\n  { x: new Date(\"2014-02-12T08:00:00.000Z\") },\n  { x: new Date(\"2019-11-20T08:00:00.000Z\") },\n  { x: new Date(\"2019-09-27T07:00:00.000Z\") },\n  { x: new Date(\"2019-03-16T07:00:00.000Z\") },\n  { x: new Date(\"2018-08-15T07:00:00.000Z\") },\n  { x: new Date(\"2020-02-21T08:00:00.000Z\") },\n  { x: new Date(\"2012-05-03T07:00:00.000Z\") },\n  { x: new Date(\"2015-03-23T07:00:00.000Z\") },\n  { x: new Date(\"2021-06-27T07:00:00.000Z\") },\n  { x: new Date(\"2015-03-16T07:00:00.000Z\") },\n  { x: new Date(\"2014-05-04T07:00:00.000Z\") },\n  { x: new Date(\"2020-03-08T08:00:00.000Z\") },\n  { x: new Date(\"2021-07-11T07:00:00.000Z\") },\n  { x: new Date(\"2010-08-15T07:00:00.000Z\") },\n  { x: new Date(\"2016-10-09T07:00:00.000Z\") },\n  { x: new Date(\"2012-07-13T07:00:00.000Z\") },\n  { x: new Date(\"2020-07-22T07:00:00.000Z\") },\n  { x: new Date(\"2019-08-22T07:00:00.000Z\") },\n  { x: new Date(\"2014-03-05T08:00:00.000Z\") },\n  { x: new Date(\"2014-03-05T08:00:00.000Z\") },\n  { x: new Date(\"2021-09-05T07:00:00.000Z\") },\n  { x: new Date(\"2021-02-11T08:00:00.000Z\") },\n  { x: new Date(\"2018-11-07T08:00:00.000Z\") },\n  { x: new Date(\"2017-10-25T07:00:00.000Z\") },\n  { x: new Date(\"2018-03-07T08:00:00.000Z\") },\n  { x: new Date(\"2012-10-17T07:00:00.000Z\") },\n  { x: new Date(\"2021-03-27T07:00:00.000Z\") },\n  { x: new Date(\"2017-01-01T08:00:00.000Z\") },\n  { x: new Date(\"2010-03-21T07:00:00.000Z\") },\n  { x: new Date(\"2021-07-23T07:00:00.000Z\") },\n  { x: new Date(\"2015-11-26T08:00:00.000Z\") },\n  { x: new Date(\"2021-02-20T08:00:00.000Z\") },\n  { x: new Date(\"2018-09-18T07:00:00.000Z\") },\n  { x: new Date(\"2018-09-27T07:00:00.000Z\") },\n  { x: new Date(\"2021-05-24T07:00:00.000Z\") },\n  { x: new Date(\"2019-05-02T07:00:00.000Z\") },\n  { x: new Date(\"2018-06-12T07:00:00.000Z\") },\n  { x: new Date(\"2016-05-13T07:00:00.000Z\") },\n  { x: new Date(\"2020-07-22T07:00:00.000Z\") },\n  { x: new Date(\"2017-04-19T07:00:00.000Z\") },\n  { x: new Date(\"2010-10-14T07:00:00.000Z\") },\n  { x: new Date(\"2021-11-01T07:00:00.000Z\") },\n  { x: new Date(\"2015-09-03T07:00:00.000Z\") },\n  { x: new Date(\"2015-01-18T08:00:00.000Z\") },\n  { x: new Date(\"2020-05-22T07:00:00.000Z\") },\n  { x: new Date(\"2020-05-21T07:00:00.000Z\") },\n  { x: new Date(\"2017-01-09T08:00:00.000Z\") },\n  { x: new Date(\"2017-01-01T08:00:00.000Z\") },\n  { x: new Date(\"2020-05-13T07:00:00.000Z\") },\n  { x: new Date(\"2013-01-24T08:00:00.000Z\") },\n  { x: new Date(\"2013-04-05T07:00:00.000Z\") },\n  { x: new Date(\"2018-04-15T07:00:00.000Z\") },\n  { x: new Date(\"2014-02-11T08:00:00.000Z\") },\n  { x: new Date(\"2014-11-21T08:00:00.000Z\") },\n  { x: new Date(\"2017-10-12T07:00:00.000Z\") },\n  { x: new Date(\"2020-06-15T07:00:00.000Z\") },\n  { x: new Date(\"2015-01-20T08:00:00.000Z\") },\n  { x: new Date(\"2021-08-26T07:00:00.000Z\") },\n  { x: new Date(\"2010-10-20T07:00:00.000Z\") },\n  { x: new Date(\"2012-09-02T07:00:00.000Z\") },\n  { x: new Date(\"2018-09-20T07:00:00.000Z\") },\n  { x: new Date(\"2015-04-01T07:00:00.000Z\") },\n  { x: new Date(\"2012-02-22T08:00:00.000Z\") },\n  { x: new Date(\"2017-03-03T08:00:00.000Z\") },\n  { x: new Date(\"2011-06-08T07:00:00.000Z\") },\n  { x: new Date(\"2015-08-11T07:00:00.000Z\") },\n  { x: new Date(\"2010-01-10T08:00:00.000Z\") },\n  { x: new Date(\"2019-05-18T07:00:00.000Z\") },\n  { x: new Date(\"2020-09-03T07:00:00.000Z\") },\n  { x: new Date(\"2011-09-04T07:00:00.000Z\") },\n  { x: new Date(\"2017-10-01T07:00:00.000Z\") },\n  { x: new Date(\"2010-07-02T07:00:00.000Z\") },\n  { x: new Date(\"2010-05-15T07:00:00.000Z\") },\n  { x: new Date(\"2021-08-23T07:00:00.000Z\") },\n  { x: new Date(\"2018-05-19T07:00:00.000Z\") },\n  { x: new Date(\"2015-11-21T08:00:00.000Z\") },\n  { x: new Date(\"2014-11-15T08:00:00.000Z\") },\n  { x: new Date(\"2014-06-10T07:00:00.000Z\") },\n  { x: new Date(\"2013-11-21T08:00:00.000Z\") },\n  { x: new Date(\"2021-04-06T07:00:00.000Z\") },\n  { x: new Date(\"2014-03-26T07:00:00.000Z\") },\n  { x: new Date(\"2020-05-07T07:00:00.000Z\") },\n  { x: new Date(\"2016-06-03T07:00:00.000Z\") },\n  { x: new Date(\"2018-04-07T07:00:00.000Z\") },\n  { x: new Date(\"2020-04-14T07:00:00.000Z\") },\n  { x: new Date(\"2010-07-27T07:00:00.000Z\") },\n  { x: new Date(\"2020-03-03T08:00:00.000Z\") },\n  { x: new Date(\"2012-02-24T08:00:00.000Z\") },\n  { x: new Date(\"2018-06-10T07:00:00.000Z\") },\n  { x: new Date(\"2010-05-16T07:00:00.000Z\") },\n  { x: new Date(\"2017-09-15T07:00:00.000Z\") },\n  { x: new Date(\"2017-11-16T08:00:00.000Z\") },\n  { x: new Date(\"2013-04-03T07:00:00.000Z\") },\n  { x: new Date(\"2013-04-05T07:00:00.000Z\") },\n  { x: new Date(\"2012-07-21T07:00:00.000Z\") },\n  { x: new Date(\"2020-03-09T07:00:00.000Z\") },\n  { x: new Date(\"2019-11-07T08:00:00.000Z\") },\n  { x: new Date(\"2017-07-17T07:00:00.000Z\") },\n  { x: new Date(\"2011-03-02T08:00:00.000Z\") },\n  { x: new Date(\"2012-11-05T08:00:00.000Z\") },\n  { x: new Date(\"2020-03-12T07:00:00.000Z\") },\n  { x: new Date(\"2021-08-27T07:00:00.000Z\") },\n  { x: new Date(\"2013-04-04T07:00:00.000Z\") },\n  { x: new Date(\"2013-09-24T07:00:00.000Z\") },\n  { x: new Date(\"2021-08-08T07:00:00.000Z\") },\n  { x: new Date(\"2020-11-24T08:00:00.000Z\") },\n  { x: new Date(\"2018-07-13T07:00:00.000Z\") },\n  { x: new Date(\"2010-05-17T07:00:00.000Z\") },\n  { x: new Date(\"2020-09-06T07:00:00.000Z\") },\n  { x: new Date(\"2020-08-13T07:00:00.000Z\") },\n  { x: new Date(\"2015-05-22T07:00:00.000Z\") },\n  { x: new Date(\"2015-11-22T08:00:00.000Z\") },\n  { x: new Date(\"2011-07-26T07:00:00.000Z\") },\n  { x: new Date(\"2017-10-20T07:00:00.000Z\") },\n  { x: new Date(\"2010-01-18T08:00:00.000Z\") },\n  { x: new Date(\"2018-02-21T08:00:00.000Z\") },\n  { x: new Date(\"2018-09-26T07:00:00.000Z\") },\n  { x: new Date(\"2016-03-14T07:00:00.000Z\") },\n  { x: new Date(\"2011-07-08T07:00:00.000Z\") },\n  { x: new Date(\"2015-06-18T07:00:00.000Z\") },\n  { x: new Date(\"2017-03-19T07:00:00.000Z\") },\n  { x: new Date(\"2019-06-12T07:00:00.000Z\") },\n  { x: new Date(\"2021-05-08T07:00:00.000Z\") },\n  { x: new Date(\"2010-07-23T07:00:00.000Z\") },\n  { x: new Date(\"2017-11-12T08:00:00.000Z\") },\n  { x: new Date(\"2021-04-19T07:00:00.000Z\") },\n  { x: new Date(\"2013-07-22T07:00:00.000Z\") },\n  { x: new Date(\"2012-02-26T08:00:00.000Z\") },\n  { x: new Date(\"2019-10-08T07:00:00.000Z\") },\n  { x: new Date(\"2010-11-13T08:00:00.000Z\") },\n  { x: new Date(\"2016-02-09T08:00:00.000Z\") },\n  { x: new Date(\"2020-09-19T07:00:00.000Z\") },\n  { x: new Date(\"2020-06-11T07:00:00.000Z\") },\n  { x: new Date(\"2021-05-12T07:00:00.000Z\") },\n  { x: new Date(\"2013-03-26T07:00:00.000Z\") },\n  { x: new Date(\"2015-11-12T08:00:00.000Z\") },\n  { x: new Date(\"2016-03-15T07:00:00.000Z\") },\n  { x: new Date(\"2021-04-09T07:00:00.000Z\") },\n  { x: new Date(\"2010-07-26T07:00:00.000Z\") },\n  { x: new Date(\"2021-01-11T08:00:00.000Z\") },\n  { x: new Date(\"2017-04-22T07:00:00.000Z\") },\n  { x: new Date(\"2019-01-13T08:00:00.000Z\") },\n  { x: new Date(\"2020-06-08T07:00:00.000Z\") },\n  { x: new Date(\"2013-03-08T08:00:00.000Z\") },\n  { x: new Date(\"2012-10-19T07:00:00.000Z\") },\n  { x: new Date(\"2018-06-12T07:00:00.000Z\") },\n  { x: new Date(\"2021-01-27T08:00:00.000Z\") },\n  { x: new Date(\"2010-06-23T07:00:00.000Z\") },\n  { x: new Date(\"2013-07-06T07:00:00.000Z\") },\n  { x: new Date(\"2014-09-09T07:00:00.000Z\") },\n  { x: new Date(\"2012-06-17T07:00:00.000Z\") },\n  { x: new Date(\"2013-05-24T07:00:00.000Z\") },\n  { x: new Date(\"2011-03-10T08:00:00.000Z\") },\n  { x: new Date(\"2021-05-27T07:00:00.000Z\") },\n  { x: new Date(\"2017-11-06T08:00:00.000Z\") },\n  { x: new Date(\"2019-10-21T07:00:00.000Z\") },\n  { x: new Date(\"2014-09-20T07:00:00.000Z\") },\n  { x: new Date(\"2018-02-17T08:00:00.000Z\") },\n  { x: new Date(\"2019-02-09T08:00:00.000Z\") },\n  { x: new Date(\"2015-04-11T07:00:00.000Z\") },\n  { x: new Date(\"2021-08-16T07:00:00.000Z\") },\n  { x: new Date(\"2011-10-11T07:00:00.000Z\") },\n  { x: new Date(\"2010-01-13T08:00:00.000Z\") },\n  { x: new Date(\"2021-01-19T08:00:00.000Z\") },\n  { x: new Date(\"2016-11-12T08:00:00.000Z\") },\n  { x: new Date(\"2011-08-25T07:00:00.000Z\") },\n  { x: new Date(\"2012-02-09T08:00:00.000Z\") },\n  { x: new Date(\"2016-01-08T08:00:00.000Z\") },\n  { x: new Date(\"2016-01-01T08:00:00.000Z\") },\n  { x: new Date(\"2017-09-15T07:00:00.000Z\") },\n  { x: new Date(\"2012-05-08T07:00:00.000Z\") },\n  { x: new Date(\"2016-06-12T07:00:00.000Z\") },\n  { x: new Date(\"2019-06-26T07:00:00.000Z\") },\n  { x: new Date(\"2011-09-24T07:00:00.000Z\") },\n  { x: new Date(\"2020-07-07T07:00:00.000Z\") },\n  { x: new Date(\"2013-08-04T07:00:00.000Z\") },\n  { x: new Date(\"2020-10-14T07:00:00.000Z\") },\n  { x: new Date(\"2021-02-13T08:00:00.000Z\") },\n  { x: new Date(\"2021-03-13T08:00:00.000Z\") },\n  { x: new Date(\"2020-07-15T07:00:00.000Z\") },\n  { x: new Date(\"2011-05-27T07:00:00.000Z\") },\n  { x: new Date(\"2020-10-05T07:00:00.000Z\") },\n  { x: new Date(\"2021-03-01T08:00:00.000Z\") },\n  { x: new Date(\"2012-10-24T07:00:00.000Z\") },\n  { x: new Date(\"2020-07-11T07:00:00.000Z\") },\n  { x: new Date(\"2011-07-25T07:00:00.000Z\") },\n  { x: new Date(\"2021-08-20T07:00:00.000Z\") },\n  { x: new Date(\"2016-11-07T08:00:00.000Z\") },\n  { x: new Date(\"2016-01-11T08:00:00.000Z\") },\n  { x: new Date(\"2018-08-02T07:00:00.000Z\") },\n  { x: new Date(\"2011-07-13T07:00:00.000Z\") },\n  { x: new Date(\"2013-07-10T07:00:00.000Z\") },\n  { x: new Date(\"2010-10-23T07:00:00.000Z\") },\n  { x: new Date(\"2015-03-06T08:00:00.000Z\") },\n  { x: new Date(\"2012-01-18T08:00:00.000Z\") },\n  { x: new Date(\"2013-11-02T07:00:00.000Z\") },\n  { x: new Date(\"2017-09-17T07:00:00.000Z\") },\n  { x: new Date(\"2019-02-17T08:00:00.000Z\") },\n  { x: new Date(\"2019-09-01T07:00:00.000Z\") },\n  { x: new Date(\"2013-01-16T08:00:00.000Z\") },\n  { x: new Date(\"2012-09-08T07:00:00.000Z\") },\n  { x: new Date(\"2021-02-24T08:00:00.000Z\") },\n  { x: new Date(\"2019-05-22T07:00:00.000Z\") },\n  { x: new Date(\"2010-06-07T07:00:00.000Z\") },\n  { x: new Date(\"2013-04-21T07:00:00.000Z\") },\n  { x: new Date(\"2021-06-22T07:00:00.000Z\") },\n  { x: new Date(\"2015-03-11T07:00:00.000Z\") },\n  { x: new Date(\"2019-01-01T08:00:00.000Z\") },\n  { x: new Date(\"2015-03-03T08:00:00.000Z\") },\n  { x: new Date(\"2014-08-02T07:00:00.000Z\") },\n  { x: new Date(\"2012-11-05T08:00:00.000Z\") },\n  { x: new Date(\"2018-06-03T07:00:00.000Z\") },\n  { x: new Date(\"2017-02-20T08:00:00.000Z\") },\n  { x: new Date(\"2010-04-25T07:00:00.000Z\") },\n  { x: new Date(\"2011-11-25T08:00:00.000Z\") },\n  { x: new Date(\"2020-08-19T07:00:00.000Z\") },\n  { x: new Date(\"2016-01-24T08:00:00.000Z\") },\n  { x: new Date(\"2019-02-14T08:00:00.000Z\") },\n  { x: new Date(\"2020-06-02T07:00:00.000Z\") },\n  { x: new Date(\"2015-11-01T07:00:00.000Z\") },\n  { x: new Date(\"2016-09-01T07:00:00.000Z\") },\n  { x: new Date(\"2016-02-08T08:00:00.000Z\") },\n  { x: new Date(\"2011-11-20T08:00:00.000Z\") },\n  { x: new Date(\"2021-04-25T07:00:00.000Z\") },\n  { x: new Date(\"2010-01-05T08:00:00.000Z\") },\n  { x: new Date(\"2015-07-25T07:00:00.000Z\") },\n  { x: new Date(\"2017-10-07T07:00:00.000Z\") },\n  { x: new Date(\"2019-07-11T07:00:00.000Z\") },\n  { x: new Date(\"2017-02-23T08:00:00.000Z\") },\n  { x: new Date(\"2011-05-12T07:00:00.000Z\") },\n  { x: new Date(\"2013-03-01T08:00:00.000Z\") },\n  { x: new Date(\"2015-06-02T07:00:00.000Z\") },\n  { x: new Date(\"2015-07-21T07:00:00.000Z\") },\n  { x: new Date(\"2017-06-23T07:00:00.000Z\") },\n  { x: new Date(\"2021-08-13T07:00:00.000Z\") },\n  { x: new Date(\"2016-01-04T08:00:00.000Z\") },\n  { x: new Date(\"2010-06-08T07:00:00.000Z\") },\n  { x: new Date(\"2019-08-11T07:00:00.000Z\") },\n  { x: new Date(\"2011-03-15T07:00:00.000Z\") },\n  { x: new Date(\"2016-11-26T08:00:00.000Z\") },\n  { x: new Date(\"2014-07-24T07:00:00.000Z\") },\n  { x: new Date(\"2013-03-10T08:00:00.000Z\") },\n  { x: new Date(\"2011-01-16T08:00:00.000Z\") },\n  { x: new Date(\"2017-02-27T08:00:00.000Z\") },\n  { x: new Date(\"2010-02-24T08:00:00.000Z\") },\n  { x: new Date(\"2011-03-22T07:00:00.000Z\") },\n  { x: new Date(\"2012-06-15T07:00:00.000Z\") },\n  { x: new Date(\"2014-02-10T08:00:00.000Z\") },\n  { x: new Date(\"2012-11-22T08:00:00.000Z\") },\n  { x: new Date(\"2019-09-19T07:00:00.000Z\") },\n  { x: new Date(\"2011-02-18T08:00:00.000Z\") },\n  { x: new Date(\"2021-01-08T08:00:00.000Z\") },\n  { x: new Date(\"2013-11-08T08:00:00.000Z\") },\n  { x: new Date(\"2020-08-01T07:00:00.000Z\") },\n  { x: new Date(\"2019-04-20T07:00:00.000Z\") },\n  { x: new Date(\"2016-03-18T07:00:00.000Z\") },\n  { x: new Date(\"2020-05-22T07:00:00.000Z\") },\n  { x: new Date(\"2018-07-20T07:00:00.000Z\") },\n  { x: new Date(\"2021-06-07T07:00:00.000Z\") },\n  { x: new Date(\"2012-07-24T07:00:00.000Z\") },\n  { x: new Date(\"2010-09-20T07:00:00.000Z\") },\n  { x: new Date(\"2016-11-10T08:00:00.000Z\") },\n  { x: new Date(\"2014-09-07T07:00:00.000Z\") },\n  { x: new Date(\"2011-01-16T08:00:00.000Z\") },\n  { x: new Date(\"2013-11-04T08:00:00.000Z\") },\n  { x: new Date(\"2015-04-07T07:00:00.000Z\") },\n  { x: new Date(\"2018-02-14T08:00:00.000Z\") },\n  { x: new Date(\"2016-05-13T07:00:00.000Z\") },\n  { x: new Date(\"2013-03-02T08:00:00.000Z\") },\n  { x: new Date(\"2020-05-03T07:00:00.000Z\") },\n  { x: new Date(\"2010-11-07T07:00:00.000Z\") },\n  { x: new Date(\"2012-02-25T08:00:00.000Z\") },\n  { x: new Date(\"2016-03-04T08:00:00.000Z\") },\n  { x: new Date(\"2016-08-19T07:00:00.000Z\") },\n  { x: new Date(\"2012-11-24T08:00:00.000Z\") },\n  { x: new Date(\"2015-01-10T08:00:00.000Z\") },\n  { x: new Date(\"2016-11-02T07:00:00.000Z\") },\n  { x: new Date(\"2012-09-03T07:00:00.000Z\") },\n  { x: new Date(\"2016-07-02T07:00:00.000Z\") },\n  { x: new Date(\"2018-07-22T07:00:00.000Z\") },\n  { x: new Date(\"2021-01-04T08:00:00.000Z\") },\n  { x: new Date(\"2013-06-06T07:00:00.000Z\") },\n  { x: new Date(\"2020-02-04T08:00:00.000Z\") },\n  { x: new Date(\"2013-04-26T07:00:00.000Z\") },\n  { x: new Date(\"2015-06-24T07:00:00.000Z\") },\n  { x: new Date(\"2012-05-20T07:00:00.000Z\") },\n  { x: new Date(\"2018-07-14T07:00:00.000Z\") },\n  { x: new Date(\"2010-05-07T07:00:00.000Z\") },\n  { x: new Date(\"2010-10-11T07:00:00.000Z\") },\n  { x: new Date(\"2014-05-05T07:00:00.000Z\") },\n  { x: new Date(\"2021-05-08T07:00:00.000Z\") },\n  { x: new Date(\"2012-04-05T07:00:00.000Z\") },\n  { x: new Date(\"2012-02-23T08:00:00.000Z\") },\n  { x: new Date(\"2012-09-05T07:00:00.000Z\") },\n  { x: new Date(\"2012-05-22T07:00:00.000Z\") },\n  { x: new Date(\"2011-09-05T07:00:00.000Z\") },\n  { x: new Date(\"2017-08-19T07:00:00.000Z\") },\n  { x: new Date(\"2011-08-16T07:00:00.000Z\") },\n  { x: new Date(\"2010-06-15T07:00:00.000Z\") },\n  { x: new Date(\"2018-09-26T07:00:00.000Z\") },\n  { x: new Date(\"2015-11-18T08:00:00.000Z\") },\n  { x: new Date(\"2020-01-23T08:00:00.000Z\") },\n  { x: new Date(\"2016-04-08T07:00:00.000Z\") },\n  { x: new Date(\"2016-11-24T08:00:00.000Z\") },\n  { x: new Date(\"2016-10-10T07:00:00.000Z\") },\n  { x: new Date(\"2019-01-18T08:00:00.000Z\") },\n  { x: new Date(\"2018-09-11T07:00:00.000Z\") },\n  { x: new Date(\"2013-10-09T07:00:00.000Z\") },\n  { x: new Date(\"2014-06-12T07:00:00.000Z\") },\n  { x: new Date(\"2010-07-17T07:00:00.000Z\") },\n  { x: new Date(\"2021-09-15T07:00:00.000Z\") },\n  { x: new Date(\"2010-06-16T07:00:00.000Z\") },\n  { x: new Date(\"2016-04-27T07:00:00.000Z\") },\n  { x: new Date(\"2014-06-17T07:00:00.000Z\") },\n  { x: new Date(\"2012-09-03T07:00:00.000Z\") },\n  { x: new Date(\"2017-11-10T08:00:00.000Z\") },\n  { x: new Date(\"2021-10-20T07:00:00.000Z\") },\n  { x: new Date(\"2011-02-19T08:00:00.000Z\") },\n  { x: new Date(\"2018-07-02T07:00:00.000Z\") },\n  { x: new Date(\"2017-03-14T07:00:00.000Z\") },\n  { x: new Date(\"2020-07-07T07:00:00.000Z\") },\n  { x: new Date(\"2017-09-09T07:00:00.000Z\") },\n  { x: new Date(\"2021-10-19T07:00:00.000Z\") },\n  { x: new Date(\"2017-02-03T08:00:00.000Z\") },\n  { x: new Date(\"2015-07-05T07:00:00.000Z\") },\n  { x: new Date(\"2012-11-27T08:00:00.000Z\") },\n  { x: new Date(\"2021-06-03T07:00:00.000Z\") },\n  { x: new Date(\"2010-01-23T08:00:00.000Z\") },\n  { x: new Date(\"2021-05-23T07:00:00.000Z\") },\n  { x: new Date(\"2015-05-12T07:00:00.000Z\") },\n  { x: new Date(\"2018-03-03T08:00:00.000Z\") },\n  { x: new Date(\"2021-05-07T07:00:00.000Z\") },\n  { x: new Date(\"2012-06-22T07:00:00.000Z\") },\n  { x: new Date(\"2019-03-03T08:00:00.000Z\") },\n  { x: new Date(\"2014-10-03T07:00:00.000Z\") },\n  { x: new Date(\"2014-04-02T07:00:00.000Z\") },\n  { x: new Date(\"2020-11-04T08:00:00.000Z\") },\n  { x: new Date(\"2012-02-16T08:00:00.000Z\") },\n  { x: new Date(\"2014-02-18T08:00:00.000Z\") },\n  { x: new Date(\"2011-07-25T07:00:00.000Z\") },\n  { x: new Date(\"2020-01-11T08:00:00.000Z\") },\n  { x: new Date(\"2013-01-13T08:00:00.000Z\") },\n  { x: new Date(\"2012-04-06T07:00:00.000Z\") },\n  { x: new Date(\"2021-10-22T07:00:00.000Z\") },\n  { x: new Date(\"2013-05-04T07:00:00.000Z\") },\n  { x: new Date(\"2011-03-14T07:00:00.000Z\") },\n  { x: new Date(\"2016-10-07T07:00:00.000Z\") },\n  { x: new Date(\"2013-04-23T07:00:00.000Z\") },\n  { x: new Date(\"2013-07-05T07:00:00.000Z\") },\n  { x: new Date(\"2014-03-09T08:00:00.000Z\") },\n  { x: new Date(\"2011-09-24T07:00:00.000Z\") },\n  { x: new Date(\"2019-10-02T07:00:00.000Z\") },\n  { x: new Date(\"2013-08-27T07:00:00.000Z\") },\n  { x: new Date(\"2011-11-16T08:00:00.000Z\") },\n  { x: new Date(\"2018-09-14T07:00:00.000Z\") },\n  { x: new Date(\"2018-05-08T07:00:00.000Z\") },\n  { x: new Date(\"2014-03-08T08:00:00.000Z\") },\n  { x: new Date(\"2011-09-05T07:00:00.000Z\") },\n  { x: new Date(\"2021-07-10T07:00:00.000Z\") },\n  { x: new Date(\"2012-04-26T07:00:00.000Z\") },\n  { x: new Date(\"2015-03-10T07:00:00.000Z\") },\n  { x: new Date(\"2017-06-25T07:00:00.000Z\") },\n  { x: new Date(\"2012-06-06T07:00:00.000Z\") },\n  { x: new Date(\"2016-03-17T07:00:00.000Z\") },\n  { x: new Date(\"2019-10-13T07:00:00.000Z\") },\n  { x: new Date(\"2017-04-08T07:00:00.000Z\") },\n  { x: new Date(\"2019-09-03T07:00:00.000Z\") },\n  { x: new Date(\"2013-02-09T08:00:00.000Z\") },\n  { x: new Date(\"2011-11-07T08:00:00.000Z\") },\n  { x: new Date(\"2021-07-07T07:00:00.000Z\") },\n  { x: new Date(\"2013-03-15T07:00:00.000Z\") },\n  { x: new Date(\"2016-07-10T07:00:00.000Z\") },\n  { x: new Date(\"2011-01-03T08:00:00.000Z\") },\n  { x: new Date(\"2020-03-20T07:00:00.000Z\") },\n  { x: new Date(\"2010-04-25T07:00:00.000Z\") },\n  { x: new Date(\"2020-11-23T08:00:00.000Z\") },\n  { x: new Date(\"2016-09-05T07:00:00.000Z\") },\n  { x: new Date(\"2013-02-24T08:00:00.000Z\") },\n  { x: new Date(\"2016-04-11T07:00:00.000Z\") },\n  { x: new Date(\"2015-07-07T07:00:00.000Z\") },\n  { x: new Date(\"2018-11-19T08:00:00.000Z\") },\n  { x: new Date(\"2014-01-09T08:00:00.000Z\") },\n  { x: new Date(\"2016-03-05T08:00:00.000Z\") },\n  { x: new Date(\"2011-02-07T08:00:00.000Z\") },\n  { x: new Date(\"2016-02-17T08:00:00.000Z\") },\n  { x: new Date(\"2017-06-21T07:00:00.000Z\") },\n  { x: new Date(\"2013-10-23T07:00:00.000Z\") },\n  { x: new Date(\"2017-08-24T07:00:00.000Z\") },\n  { x: new Date(\"2018-01-17T08:00:00.000Z\") },\n  { x: new Date(\"2015-04-19T07:00:00.000Z\") },\n  { x: new Date(\"2016-05-10T07:00:00.000Z\") },\n  { x: new Date(\"2018-01-01T08:00:00.000Z\") },\n  { x: new Date(\"2017-01-01T08:00:00.000Z\") },\n  { x: new Date(\"2021-10-02T07:00:00.000Z\") },\n  { x: new Date(\"2012-02-20T08:00:00.000Z\") },\n  { x: new Date(\"2010-04-07T07:00:00.000Z\") },\n  { x: new Date(\"2019-07-21T07:00:00.000Z\") },\n  { x: new Date(\"2014-06-15T07:00:00.000Z\") },\n];\n"
  },
  {
    "path": "stories/victory-charts/victory-histogram/date-bins.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryHistogram, VictoryChart, VictoryTheme } from \"@/victory\";\nimport * as d3Array from \"@/victory-vendor/d3-array\";\nimport * as d3Scale from \"@/victory-vendor/d3-scale\";\nimport * as d3Time from \"@/victory-vendor/d3-time\";\n\nimport { timeData } from \"./data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryHistogram> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryHistogram\",\n};\n\nexport const DateBins: Story = {\n  args: {},\n  render: (props) => {\n    // HACK: d3scale has a scaleTime function but the types\n    // are whack coming through the build\n    const niceTimeScale = (d3Scale as any)\n      .scaleTime()\n      .domain(d3Array.extent(timeData, ({ x }) => x))\n      .nice();\n\n    return (\n      <>\n        <VictoryChart theme={VictoryTheme[props.themeKey]}>\n          <VictoryHistogram\n            {...props}\n            data={timeData}\n            bins={[\n              new Date(2010, 0, 1),\n              new Date(2020, 5, 1),\n              new Date(2021, 0, 1),\n            ]}\n          />\n        </VictoryChart>\n        <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n          <VictoryHistogram\n            {...props}\n            data={timeData}\n            bins={[\n              new Date(2010, 0, 1),\n              new Date(2020, 5, 1),\n              new Date(2021, 0, 1),\n            ]}\n          />\n        </VictoryChart>\n        <VictoryChart theme={VictoryTheme[props.themeKey]}>\n          <VictoryHistogram {...props} data={timeData} bins={2} />\n        </VictoryChart>\n        <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n          <VictoryHistogram {...props} data={timeData} bins={2} />\n        </VictoryChart>\n        <VictoryChart theme={VictoryTheme[props.themeKey]}>\n          <VictoryHistogram {...props} data={timeData} bins={10} />\n        </VictoryChart>\n        <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n          <VictoryHistogram {...props} data={timeData} bins={10} />\n        </VictoryChart>\n        <VictoryChart theme={VictoryTheme[props.themeKey]}>\n          <VictoryHistogram\n            {...props}\n            data={timeData}\n            bins={niceTimeScale.ticks(d3Time.utcDay)}\n          />\n        </VictoryChart>\n        <VictoryChart theme={VictoryTheme[props.themeKey]}>\n          <VictoryHistogram\n            {...props}\n            data={timeData}\n            bins={niceTimeScale.ticks(d3Time.utcMonth)}\n          />\n        </VictoryChart>\n        <VictoryChart theme={VictoryTheme[props.themeKey]}>\n          <VictoryHistogram\n            {...props}\n            data={timeData}\n            bins={niceTimeScale.ticks(d3Time.utcYear)}\n          />\n        </VictoryChart>\n      </>\n    );\n  },\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-histogram/default.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryHistogram, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { data } from \"./data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryHistogram> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryHistogram\",\n};\n\nexport const Default: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryHistogram {...props} data={data} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-histogram/disable-inline-styles.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { Bar, VictoryHistogram, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { data } from \"./data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryHistogram> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryHistogram\",\n};\n\nexport const DisableInlineStyles: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryHistogram {...props} data={data} disableInlineStyles />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryHistogram\n          {...props}\n          data={data}\n          dataComponent={<Bar disableInlineStyles className=\"fill-purple\" />}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-histogram/domain.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryHistogram, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { data } from \"./data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryHistogram> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryHistogram\",\n};\n\nexport const Domain: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryHistogram\n        {...props}\n        data={data}\n        domain={{ x: [20, 100], y: [3, 10] }}\n      />\n      <VictoryChart\n        theme={VictoryTheme[props.themeKey]}\n        domain={{ x: [20, 100], y: [3, 10] }}\n      >\n        <VictoryHistogram {...props} data={data} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} minDomain={{ x: 40 }}>\n        <VictoryHistogram {...props} data={data} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} maxDomain={{ y: 4 }}>\n        <VictoryHistogram {...props} data={data} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-histogram/empty-data.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryHistogram, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryHistogram> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryHistogram\",\n};\n\nexport const EmptyData: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryHistogram {...props} data={[]} bins={2} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryHistogram {...props} data={[]} bins={[0, 30, 100, 150]} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryHistogram\n          {...props}\n          scale={{ x: \"time\" }}\n          data={[]}\n          bins={[\n            new Date(2015, 0, 1),\n            new Date(2020, 0, 1),\n            new Date(2025, 0, 1),\n          ]}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryHistogram\n          {...props}\n          scale={{ x: \"time\" }}\n          data={[]}\n          bins={[\n            new Date(2015, 0, 1),\n            new Date(2020, 0, 1),\n            new Date(2025, 0, 1),\n          ]}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-histogram/get-path.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryHistogram, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { data } from \"./data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryHistogram> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryHistogram\",\n};\n\nexport const GetPath: Story = {\n  args: {},\n  render: (props) => {\n    // const verticalPathFn = (callbackArgs) => {\n    //   const { x0, x1, y0, y1 } = callbackArgs;\n    //   return `M ${x0}, ${y0}\n    //   L ${(x1 + x0) / 2}, ${y1}\n    //   L ${x1}, ${y0}\n    //   z`;\n    // };\n\n    // const horizontalPathFn = (callbackArgs) => {\n    //   const { x0, x1, y0, y1 } = callbackArgs;\n    //   return `M ${x0}, ${y1}\n    //   L ${x1}, ${(y0 + y1) / 2}\n    //   L ${x0}, ${y0}\n    //   z`;\n    // };\n\n    // TODO: revert this when the getPath types are fixed.\n    return (\n      <>\n        <VictoryChart theme={VictoryTheme[props.themeKey]}>\n          {/* <VictoryHistogram {...props} data={data} getPath={verticalPathFn} /> */}\n          <VictoryHistogram {...props} data={data} />\n        </VictoryChart>\n        <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n          {/* <VictoryHistogram {...props} data={data} getPath={horizontalPathFn} /> */}\n          <VictoryHistogram {...props} data={data} />\n        </VictoryChart>\n      </>\n    );\n  },\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-histogram/labels.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryHistogram,\n  VictoryChart,\n  VictoryTheme,\n  VictoryTooltip,\n} from \"@/victory\";\n\nimport { data } from \"./data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryHistogram> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryHistogram\",\n};\n\nexport const Labels: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryHistogram\n          {...props}\n          data={data}\n          bins={5}\n          labels={({ datum }) => `${datum.x0} - ${datum.x1}`}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryHistogram\n          {...props}\n          data={data}\n          bins={5}\n          labels={({ datum }) => `${datum.x0} - ${datum.x1}`}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryHistogram\n          {...props}\n          data={data}\n          bins={5}\n          labels={[\"\", \"\", \"three\", \"four\", \"5\", \"six\"]}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryHistogram\n          {...props}\n          data={data}\n          bins={5}\n          labels={[\"\", \"\", \"three\", \"four\", \"5\", \"six\"]}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryHistogram\n          {...props}\n          data={data}\n          bins={5}\n          labels={({ datum }) => `${datum.x0} - ${datum.x1}`}\n          labelComponent={<VictoryTooltip active />}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryHistogram\n          {...props}\n          data={data}\n          bins={5}\n          labels={[\"one\", \"two\", \"3\", \"wow, four tooltips\", \"five\"]}\n          labelComponent={<VictoryTooltip active />}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-histogram/mixed-charts.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryHistogram,\n  VictoryLine,\n  VictoryChart,\n  VictoryScatter,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { data } from \"./data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryHistogram> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryHistogram\",\n};\n\nexport const MixedCharts: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryHistogram {...props} data={data} />\n        <VictoryLine\n          data={[\n            { x: 0, y: 5 },\n            { x: 10, y: 5 },\n            { x: 20, y: 2 },\n            { x: 30, y: 9 },\n            { x: 50, y: 2 },\n            { x: 60, y: 4 },\n            { x: 80, y: 12 },\n            { x: 120, y: 8 },\n          ]}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryHistogram {...props} data={data} />\n        <VictoryScatter\n          data={[\n            { x: 0, y: 5 },\n            { x: 10, y: 5 },\n            { x: 20, y: 2 },\n            { x: 30, y: 9 },\n            { x: 50, y: 2 },\n            { x: 60, y: 4 },\n            { x: 80, y: 12 },\n            { x: 120, y: 8 },\n          ]}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-histogram/numeric-bins.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryHistogram, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { data } from \"./data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryHistogram> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryHistogram\",\n};\n\nexport const NumericBins: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryHistogram {...props} data={data} bins={2} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryHistogram {...props} data={data} bins={2} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryHistogram {...props} data={data} bins={8} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryHistogram {...props} data={data} bins={8} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryHistogram {...props} data={data} bins={48} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryHistogram {...props} data={data} bins={48} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryHistogram {...props} data={data} bins={[0, 30, 50]} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryHistogram {...props} data={data} bins={[0, 30, 50]} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryHistogram {...props} data={data} bins={[0, 30, 50, 100]} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryHistogram {...props} data={data} bins={[0, 30, 50, 100]} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryHistogram {...props} data={data} bins={[0, 10, 30, 70, 150]} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryHistogram {...props} data={data} bins={[0, 10, 30, 70, 150]} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-histogram/scale.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryHistogram, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { data, timeData } from \"./data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryHistogram> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryHistogram\",\n};\n\nexport const Scale: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart\n        theme={VictoryTheme[props.themeKey]}\n        domainPadding={{ y: 25 }}\n      >\n        <VictoryHistogram\n          {...props}\n          binSpacing={10}\n          data={timeData}\n          labels={({ datum }) =>\n            `${datum.x0.getFullYear()}\\n|\\n${datum.x1.getFullYear()}`\n          }\n        />\n      </VictoryChart>\n      <VictoryChart\n        theme={VictoryTheme[props.themeKey]}\n        horizontal\n        domainPadding={{ y: 35 }}\n      >\n        <VictoryHistogram\n          {...props}\n          binSpacing={10}\n          data={timeData}\n          labels={({ datum }) =>\n            `${datum.x0.getFullYear()} - ${datum.x1.getFullYear()}`\n          }\n        />\n      </VictoryChart>\n      <VictoryChart\n        theme={VictoryTheme[props.themeKey]}\n        scale={{ y: \"log\" }}\n        minDomain={{ y: 1 }}\n      >\n        <VictoryHistogram {...props} data={data} />\n      </VictoryChart>\n      <VictoryChart\n        theme={VictoryTheme[props.themeKey]}\n        scale={{ y: \"log\" }}\n        minDomain={{ y: 1 }}\n        horizontal\n      >\n        <VictoryHistogram {...props} data={data} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-histogram/stacked.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryHistogram,\n  VictoryChart,\n  VictoryStack,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { getData } from \"../../utils/data\";\nimport { data } from \"./data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryHistogram> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryHistogram\",\n};\n\nexport const Stacked: Story = {\n  args: {},\n  render: (props) => {\n    const stackedData = [\n      ...[50, 30, 100, 32, 50, 10, 49, 78, 20].map((count) =>\n        getData(count, count.toString(), 100),\n      ),\n      [{ x: 1 }, { x: 3 }, { x: 1 }, { x: 2 }],\n    ];\n\n    return (\n      <>\n        <VictoryChart theme={VictoryTheme[props.themeKey]}>\n          <VictoryStack colorScale=\"qualitative\" bins={[0, 20, 65, 90, 100]}>\n            {stackedData.map((d, index) => (\n              <VictoryHistogram {...props} data={d} key={index} />\n            ))}\n          </VictoryStack>\n        </VictoryChart>\n        <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n          <VictoryStack colorScale=\"qualitative\" bins={[0, 20, 65, 90, 100]}>\n            {stackedData.map((d, index) => (\n              <VictoryHistogram {...props} data={d} key={index} />\n            ))}\n          </VictoryStack>\n        </VictoryChart>\n        <VictoryChart theme={VictoryTheme[props.themeKey]}>\n          <VictoryStack colorScale=\"qualitative\" bins={5}>\n            {stackedData.map((d, index) => (\n              <VictoryHistogram\n                {...props}\n                data={d}\n                key={index}\n                bins={index === 0 ? [0, 20, 100] : undefined}\n              />\n            ))}\n          </VictoryStack>\n        </VictoryChart>\n        <VictoryChart theme={VictoryTheme[props.themeKey]}>\n          <VictoryStack colorScale=\"qualitative\" bins={5}>\n            {stackedData.map((d, index) => (\n              <VictoryHistogram\n                {...props}\n                binSpacing={10}\n                data={d}\n                key={index}\n              />\n            ))}\n          </VictoryStack>\n        </VictoryChart>\n        <VictoryChart theme={VictoryTheme[props.themeKey]}>\n          <VictoryStack colorScale=\"qualitative\">\n            <VictoryHistogram\n              {...props}\n              data={data.map(({ x }) => ({ a: { b: { c: x } } }))}\n              x=\"a.b.c\"\n            />\n            {stackedData.map((d, index) => (\n              <VictoryHistogram {...props} data={d} key={index} />\n            ))}\n          </VictoryStack>\n        </VictoryChart>\n        <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n          <VictoryStack colorScale=\"qualitative\">\n            <VictoryHistogram\n              {...props}\n              data={data.map(({ x }) => ({ a: { b: { c: x } } }))}\n              x=\"a.b.c\"\n            />\n            {stackedData.map((d, index) => (\n              <VictoryHistogram {...props} data={d} key={index} />\n            ))}\n          </VictoryStack>\n        </VictoryChart>\n      </>\n    );\n  },\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-histogram/styles.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryHistogram, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { data } from \"./data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryHistogram> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryHistogram\",\n};\n\nexport const Styles: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryHistogram\n          {...props}\n          data={data}\n          style={{\n            data: { transform: \"translate(0px, -20px) skew(2deg, 2deg)\" },\n          }}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryHistogram\n          {...props}\n          data={data}\n          style={{\n            data: {\n              stroke: ({ datum }) => (datum.y > 3 ? \"red\" : \"transparent\"),\n              strokeWidth: 3,\n              opacity: ({ datum }) => (datum.y > 3 ? 1 : 0.4),\n            },\n          }}\n          labels={[\"one\", \"two\", \"three\", \"four\", \"five\"]}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-histogram/theme.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryHistogram, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { data } from \"./data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryHistogram> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryHistogram\",\n};\n\nexport const Theme: Story = {\n  args: {\n    data,\n  },\n  render: (props) => (\n    <>\n      <VictoryHistogram {...props} />\n      <VictoryChart>\n        <VictoryHistogram {...props} />\n      </VictoryChart>\n      <VictoryHistogram {...props} theme={VictoryTheme.material} />\n      <VictoryChart theme={VictoryTheme.material}>\n        <VictoryHistogram {...props} />\n      </VictoryChart>\n      <VictoryHistogram {...props} theme={VictoryTheme.clean} />\n      <VictoryChart theme={VictoryTheme.clean}>\n        <VictoryHistogram {...props} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-label/anchors.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryLabel, VictoryScatter } from \"@/victory\";\nimport { defaultScatterProps, Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryLabel> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLabel\",\n};\n\nexport const Anchors: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            textAnchor=\"end\"\n            verticalAnchor=\"end\"\n            text={[\"textAnchor: end\", \"with\", \"verticalAnchor: end\"]}\n            backgroundStyle={{ stroke: \"blue\", fill: \"none\" }}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            textAnchor=\"end\"\n            verticalAnchor=\"middle\"\n            text={[\"textAnchor: end\", \"with\", \"verticalAnchor: middle\"]}\n            backgroundStyle={{ stroke: \"blue\", fill: \"none\" }}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            textAnchor=\"end\"\n            verticalAnchor=\"start\"\n            text={[\"textAnchor: end\", \"with\", \"verticalAnchor: start\"]}\n            backgroundStyle={{ stroke: \"blue\", fill: \"none\" }}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            textAnchor=\"middle\"\n            verticalAnchor=\"end\"\n            text={[\"textAnchor: middle\", \"with\", \"verticalAnchor: end\"]}\n            backgroundStyle={{ stroke: \"blue\", fill: \"none\" }}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            textAnchor=\"middle\"\n            verticalAnchor=\"middle\"\n            text={[\"textAnchor: middle\", \"with\", \"verticalAnchor: middle\"]}\n            backgroundStyle={{ stroke: \"blue\", fill: \"none\" }}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            textAnchor=\"middle\"\n            verticalAnchor=\"start\"\n            text={[\"textAnchor: middle\", \"with\", \"verticalAnchor: start\"]}\n            backgroundStyle={{ stroke: \"blue\", fill: \"none\" }}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            textAnchor=\"start\"\n            verticalAnchor=\"end\"\n            text={[\"textAnchor: start\", \"with\", \"verticalAnchor: end\"]}\n            backgroundStyle={{ stroke: \"blue\", fill: \"none\" }}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            textAnchor=\"start\"\n            verticalAnchor=\"middle\"\n            text={[\"textAnchor: start\", \"with\", \"verticalAnchor: middle\"]}\n            backgroundStyle={{ stroke: \"blue\", fill: \"none\" }}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            textAnchor=\"end\"\n            verticalAnchor=\"start\"\n            text={[\"textAnchor: end\", \"with\", \"verticalAnchor: start\"]}\n            backgroundStyle={{ stroke: \"blue\", fill: \"none\" }}\n          />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-label/angles.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryLabel, VictoryScatter } from \"@/victory\";\nimport { defaultScatterProps, Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryLabel> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLabel\",\n};\n\nexport const Angles: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            angle={45}\n            verticalAnchor=\"middle\"\n            text={[\"middle\", \"middle\", \"anchors\"]}\n            backgroundStyle={{ stroke: \"blue\", fill: \"none\" }}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            angle={45}\n            textAnchor=\"start\"\n            text={[\"start\", \"end\", \"anchors\"]}\n            backgroundStyle={{ stroke: \"blue\", fill: \"none\" }}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            angle={45}\n            textAnchor=\"end\"\n            verticalAnchor=\"start\"\n            text={[\"end\", \"start\", \"anchors\"]}\n            backgroundStyle={{ stroke: \"blue\", fill: \"none\" }}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            angle={-45}\n            verticalAnchor=\"middle\"\n            text={[\"middle\", \"middle\", \"anchors\"]}\n            backgroundStyle={[{ stroke: \"blue\", fill: \"none\" }]}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            angle={-45}\n            textAnchor=\"start\"\n            text={[\"start\", \"end\", \"anchors\"]}\n            backgroundStyle={[{ stroke: \"blue\", fill: \"none\" }]}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            angle={-45}\n            textAnchor=\"end\"\n            verticalAnchor=\"start\"\n            text={[\"end\", \"start\", \"anchors\"]}\n            backgroundStyle={[{ stroke: \"blue\", fill: \"none\" }]}\n          />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-label/background-padding.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryLabel, VictoryScatter } from \"@/victory\";\nimport { defaultScatterProps, Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryLabel> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLabel\",\n};\n\nexport const BackgroundPadding: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            backgroundStyle={[\n              { fill: \"pink\" },\n              { fill: \"lavender\" },\n              { fill: \"thistle\" },\n              { fill: \"plum\" },\n            ]}\n            text={[\n              \"Victory is awesome.\",\n              \"backgroundPadding as a number\",\n              \"applies to all lines\",\n              \"but alters positioning\",\n            ]}\n            backgroundPadding={10}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            backgroundStyle={[\n              { fill: \"pink\" },\n              { fill: \"lavender\" },\n              { fill: \"thistle\" },\n              { fill: \"plum\" },\n            ]}\n            text={[\n              \"Victory is awesome.\",\n              \"backgroundPadding as an object\",\n              \"applies to all lines\",\n              \"but alters positioning\",\n            ]}\n            backgroundPadding={{ top: 0, bottom: 10, left: 20, right: -10 }}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            backgroundStyle={[\n              { fill: \"pink\" },\n              { fill: \"lavender\" },\n              { fill: \"thistle\" },\n              { fill: \"plum\" },\n            ]}\n            text={[\n              \"Victory is awesome.\",\n              \"backgroundPadding as an array\",\n              \"applies to all lines\",\n              \"but alters positioning\",\n            ]}\n            backgroundPadding={[\n              { top: 0, bottom: 10, left: 20, right: -10 },\n              -5,\n              { top: 0, bottom: 10, left: 40, right: -30 },\n              20,\n            ]}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            angle={45}\n            backgroundStyle={[\n              { fill: \"pink\" },\n              { fill: \"lavender\" },\n              { fill: \"thistle\" },\n              { fill: \"plum\" },\n            ]}\n            text={[\n              \"Victory is awesome.\",\n              \"backgroundPadding as a number\",\n              \"applies to all lines\",\n              \"but alters positioning\",\n            ]}\n            backgroundPadding={10}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            angle={45}\n            backgroundStyle={[\n              { fill: \"pink\" },\n              { fill: \"lavender\" },\n              { fill: \"thistle\" },\n              { fill: \"plum\" },\n            ]}\n            text={[\n              \"Victory is awesome.\",\n              \"backgroundPadding as an object\",\n              \"applies to all lines\",\n              \"but alters positioning\",\n            ]}\n            backgroundPadding={{ top: 0, bottom: 10, left: 20, right: -10 }}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            angle={45}\n            backgroundStyle={[\n              { fill: \"pink\" },\n              { fill: \"lavender\" },\n              { fill: \"thistle\" },\n              { fill: \"plum\" },\n            ]}\n            text={[\n              \"Victory is awesome.\",\n              \"backgroundPadding as an array\",\n              \"applies to all lines\",\n              \"but alters positioning\",\n            ]}\n            backgroundPadding={[\n              { top: 0, bottom: 10, left: 20, right: -10 },\n              -5,\n              { top: 0, bottom: 10, left: 40, right: -30 },\n              20,\n            ]}\n          />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-label/background-styles.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryLabel, VictoryScatter } from \"@/victory\";\nimport { defaultScatterProps, Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryLabel> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLabel\",\n};\n\nexport const BackgroundStyles: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            backgroundStyle={[\n              { fill: \"pink\" },\n              { fill: \"lavender\" },\n              { fill: \"thistle\" },\n              { fill: \"plum\" },\n            ]}\n            text={[\n              \"Victory is awesome.\",\n              \"Even if we leave blank arrays\",\n              \"for style or lineHeight,\",\n              \"Victory will save us with defaults.\",\n            ]}\n            lineHeight={[]}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            backgroundStyle={[\n              { fill: \"pink\" },\n              { fill: \"lavender\" },\n              { fill: \"thistle\" },\n              { fill: \"plum\" },\n            ]}\n            text={[\n              \"Victory is awesome.\",\n              \"backgrounds work with \",\n              \"multiple lineHeights,\",\n              \"but the positioning does change\",\n            ]}\n            lineHeight={[1, 2, 1, 3]}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            angle={70}\n            backgroundStyle={[\n              { fill: \"pink\" },\n              { fill: \"lavender\" },\n              { fill: \"thistle\" },\n              { fill: \"plum\" },\n            ]}\n            text={[\n              \"Victory is awesome.\",\n              \"background rects\",\n              \"all get appropriate\",\n              \"angle transforms\",\n            ]}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            dy={({ datum }) => (datum.y > 0 ? -5 : 8)}\n            verticalAnchor=\"end\"\n            backgroundPadding={{ top: 5, right: 5, bottom: 5, left: 5 }}\n            backgroundStyle={{ fill: \"plum\", stroke: \"#000000\" }}\n            text={[\n              \"Victory is awesome.\",\n              \"background styles\",\n              \"work with dy functions\",\n            ]}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            dx={({ datum }) => (datum.y > 0 ? -5 : 8)}\n            verticalAnchor=\"end\"\n            backgroundPadding={{ top: 5, right: 5, bottom: 5, left: 5 }}\n            backgroundStyle={{ fill: \"thistle\", stroke: \"#000000\" }}\n            text={[\n              \"Victory is awesome.\",\n              \"background styles\",\n              \"work with dx functions\",\n            ]}\n          />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-label/config.ts",
    "content": "import React from \"react\";\nimport type { Meta, StoryObj } from \"@storybook/react\";\n\nimport { VictoryLabel, VictoryScatterProps } from \"@/victory\";\nimport { componentContainer } from \"../../utils/decorators\";\n\ntype StoryProps = React.ComponentProps<typeof VictoryLabel>;\n\nexport const ComponentMeta: Meta<Omit<StoryProps, \"themeKey\">> = {\n  component: VictoryLabel,\n  decorators: [componentContainer],\n\n  argTypes: {\n    angle: { control: \"number\" },\n    capHeight: { control: \"number\" },\n    className: { control: \"text\" },\n    desc: { control: \"text\" },\n    direction: { control: \"select\", options: [\"inherit\", \"rtl\", \"ltr\"] },\n    id: { control: \"text\" },\n    inline: { control: \"boolean\" },\n    labelPlacement: {\n      control: \"select\",\n      options: [\"parallel\", \"perpendicular\", \"vertical\"],\n    },\n    lineHeight: { control: \"number\" },\n    polar: { control: \"boolean\" },\n    renderInPortal: { control: \"boolean\" },\n    tabIndex: { control: \"number\" },\n    text: { control: \"text\" },\n    textAnchor: {\n      control: \"select\",\n      options: [\"inherit\", \"start\", \"middle\", \"end\"],\n    },\n    transform: { control: \"text\" },\n    verticalAnchor: {\n      control: \"select\",\n      options: [\"inherit\", \"start\", \"middle\", \"end\"],\n    },\n  },\n};\n\nexport type Story = StoryObj<StoryProps>;\n\nexport const defaultScatterProps: VictoryScatterProps = {\n  style: {\n    labels: { padding: 0, fontFamily: \"arial\" },\n    data: { fill: \"gold\" },\n  },\n  width: 300,\n  height: 300,\n  domain: [-10, 10],\n  data: [{ x: 0, y: 0 }],\n  labels: () => \"Label\",\n  size: 5,\n};\n"
  },
  {
    "path": "stories/victory-charts/victory-label/default-rendering.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryLabel, VictoryScatter } from \"@/victory\";\nimport { defaultScatterProps, Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryLabel> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLabel\",\n};\n\nexport const Default: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={<VictoryLabel {...props} />}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-label/inline.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryLabel, VictoryScatter } from \"@/victory\";\nimport { defaultScatterProps, Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryLabel> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLabel\",\n};\n\nexport const Inline: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            backgroundStyle={{ fill: \"lavender\" }}\n            verticalAnchor=\"middle\"\n            text={[\"Victory is awesome.\", \"This is inline styling for labels.\"]}\n            inline\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            inline\n            backgroundStyle={[\n              { fill: \"pink\" },\n              { fill: \"lavender\" },\n              { fill: \"thistle\" },\n              { fill: \"plum\" },\n            ]}\n            text={[\n              \"Victory is awesome.\",\n              \"backgrounds work with \",\n              \"multiple lineHeights,\",\n              \"but the positioning does change\",\n            ]}\n            lineHeight={[1, 2, 1, 3]}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            inline\n            angle={70}\n            backgroundStyle={[\n              { fill: \"pink\" },\n              { fill: \"lavender\" },\n              { fill: \"thistle\" },\n              { fill: \"plum\" },\n            ]}\n            text={[\n              \"Victory is awesome.\",\n              \"background rects\",\n              \"all get appropriate\",\n              \"angle transforms\",\n            ]}\n          />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-label/line-height.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryLabel, VictoryScatter } from \"@/victory\";\nimport { defaultScatterProps, Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryLabel> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLabel\",\n};\n\nexport const LineHeight: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            lineHeight={2}\n            text={[\"single\", \"lineHeight\", \"value\"]}\n            backgroundStyle={{ stroke: \"blue\", fill: \"none\" }}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            lineHeight={[2]}\n            text={[\"single array\", \"lineHeight\", \"value\"]}\n            backgroundStyle={{ stroke: \"blue\", fill: \"none\" }}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            lineHeight={[2, 1, 3]}\n            text={[\"multi array\", \"lineHeight\", \"value\"]}\n            backgroundStyle={{ stroke: \"blue\", fill: \"none\" }}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            lineHeight={2}\n            text={[\"single\", \"lineHeight\", \"value\"]}\n            backgroundStyle={[{ stroke: \"blue\", fill: \"none\" }]}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            lineHeight={[2]}\n            text={[\"single array\", \"lineHeight\", \"value\"]}\n            backgroundStyle={[{ stroke: \"blue\", fill: \"none\" }]}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            lineHeight={[2, 1, 3]}\n            text={[\"multi array\", \"lineHeight\", \"value\"]}\n            backgroundStyle={[{ stroke: \"blue\", fill: \"none\" }]}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            lineHeight={[2, 1, 3]}\n            text={[\"测试汉字\", \"不在正常的 ASCII 范围内\", \"最后一行\"]}\n            backgroundStyle={[{ stroke: \"blue\", fill: \"none\" }]}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            lineHeight={[2, 1, 3]}\n            text={[\n              \"اختبار اللغات التي تُقرأ من اليمين إلى اليسار\",\n              \"مثل العربية\",\n              \"هناك أكثر من ذلك بكثير\",\n            ]}\n            backgroundStyle={[{ stroke: \"blue\", fill: \"none\" }]}\n          />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-label/positioning.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryLabel, VictoryScatter } from \"@/victory\";\nimport { defaultScatterProps, Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryLabel> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLabel\",\n};\n\nexport const Positioning: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={<VictoryLabel {...props} x={100} text=\"x = 100\" />}\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={<VictoryLabel {...props} y={100} text=\"y = 100\" />}\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={<VictoryLabel {...props} dx={50} text=\"dx = 50\" />}\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={<VictoryLabel {...props} dy={50} text=\"dy = 50\" />}\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            dx={({ datum }) => datum.x + 50}\n            text=\"dx function\"\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            dy={({ datum }) => datum.x - 20}\n            text=\"dy function\"\n          />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-label/styles.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryLabel, VictoryScatter } from \"@/victory\";\nimport { defaultScatterProps, Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryLabel> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLabel\",\n};\n\nexport const Styles: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            style={{ fontSize: 20, fontFamily: \"arial\" }}\n            text={[\"single\", \"style\", \"object\"]}\n            backgroundStyle={{ stroke: \"blue\", fill: \"none\" }}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            style={[{ fontSize: 20, fontFamily: \"arial\" }]}\n            text={[\"single\", \"element\", \"array\"]}\n            backgroundStyle={{ stroke: \"blue\", fill: \"none\" }}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            style={[\n              { fontSize: 20, fontFamily: \"arial\" },\n              { fontSize: 18, fill: \"red\", fontFamily: \"arial\" },\n            ]}\n            text={[\"multi\", \"element\", \"array\"]}\n            backgroundStyle={{ stroke: \"blue\", fill: \"none\" }}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            style={{ fontSize: 20, fontFamily: \"arial\" }}\n            text={[\"single\", \"style\", \"object\"]}\n            backgroundStyle={[{ stroke: \"blue\", fill: \"none\" }]}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            style={[{ fontSize: 20, fontFamily: \"arial\" }]}\n            text={[\"single\", \"element\", \"array\"]}\n            backgroundStyle={[{ stroke: \"blue\", fill: \"none\" }]}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            style={[\n              { fontSize: 20, fontFamily: \"arial\" },\n              { fontSize: 12, fill: \"red\", fontFamily: \"arial\" },\n            ]}\n            text={[\"multi\", \"element\", \"array\"]}\n            backgroundStyle={[{ stroke: \"blue\", fill: \"none\" }]}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            style={{\n              fontSize: ({ datum }) => (datum.y === 0 ? 12 : 15),\n              fontFamily: \"arial\",\n            }}\n            text={[\"object\", \"with\", \"functions\"]}\n            backgroundStyle={{ stroke: \"blue\", fill: \"none\" }}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            style={[\n              {\n                fontSize: ({ datum }) => (datum.y === 0 ? 12 : 15),\n                fontFamily: \"arial\",\n              },\n            ]}\n            text={[\"single array\", \"with\", \"functions\"]}\n            backgroundStyle={{ stroke: \"blue\", fill: \"none\" }}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            style={[\n              {\n                fontSize: ({ datum }) => (datum.y === 0 ? 12 : 15),\n                fontFamily: \"arial\",\n              },\n              {\n                fill: ({ datum }) => (datum.y === 0 ? \"red\" : \"blue\"),\n                fontFamily: \"arial\",\n              },\n            ]}\n            text={[\"multi array\", \"with\", \"functions\"]}\n            backgroundStyle={{ stroke: \"blue\", fill: \"none\" }}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            style={{\n              fontSize: ({ datum }) => (datum.y === 0 ? 12 : 15),\n              fontFamily: \"arial\",\n            }}\n            text={[\"object\", \"with\", \"functions\"]}\n            backgroundStyle={[{ stroke: \"blue\", fill: \"none\" }]}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            style={[\n              {\n                fontSize: ({ datum }) => (datum.y === 0 ? 12 : 15),\n                fontFamily: \"arial\",\n              },\n            ]}\n            text={[\"single array\", \"with\", \"functions\"]}\n            backgroundStyle={[{ stroke: \"blue\", fill: \"none\" }]}\n          />\n        }\n      />\n      <VictoryScatter\n        {...defaultScatterProps}\n        labelComponent={\n          <VictoryLabel\n            {...props}\n            style={[\n              {\n                fontSize: ({ datum }) => (datum.y === 0 ? 12 : 15),\n                fontFamily: \"arial\",\n              },\n              {\n                fill: ({ datum }) => (datum.y === 0 ? \"red\" : \"blue\"),\n                fontFamily: \"arial\",\n              },\n            ]}\n            text={[\"multi array\", \"with\", \"functions\"]}\n            backgroundStyle={[{ stroke: \"blue\", fill: \"none\" }]}\n          />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-legend/config.ts",
    "content": "import type { Meta, StoryObj } from \"@storybook/react\";\n\nimport { VictoryLegend, VictoryLegendProps } from \"@/victory\";\n\nimport {\n  VictoryCommonProps,\n  VictoryDatableProps,\n  VictorySingleLabelableProps,\n} from \"../../utils/arg-types\";\nimport { componentContainer } from \"../../utils/decorators\";\n\ntype StoryProps = VictoryLegendProps & {\n  themeKey: string;\n};\n\nexport const ComponentMeta: Meta<Omit<StoryProps, \"themeKey\">> = {\n  component: VictoryLegend,\n  decorators: [componentContainer],\n\n  argTypes: {\n    ...VictoryCommonProps,\n    ...VictoryDatableProps,\n    ...VictorySingleLabelableProps,\n\n    centerTitle: { control: \"boolean\" },\n    itemsPerRow: { control: \"number\" },\n    orientation: { control: \"select\", options: [\"horizontal\", \"vertical\"] },\n    rowGutter: { control: \"number\" },\n    symbolSpacer: { control: \"number\" },\n    title: { control: \"text\" },\n    titleOrientation: { control: \"select\", options: [\"top\", \"bottom\"] },\n    x: { control: \"number\" },\n    y: { control: \"number\" },\n  },\n};\n\nexport type Story = StoryObj<StoryProps>;\n"
  },
  {
    "path": "stories/victory-charts/victory-legend/default.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryAxis,\n  VictoryLegend,\n  VictoryChart,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryLegend> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLegend\",\n};\n\nexport const Default: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis />\n        <VictoryLegend {...props} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis />\n        <VictoryLegend {...props} orientation=\"horizontal\" />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-legend/line-height.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryAxis,\n  VictoryLegend,\n  VictoryChart,\n  VictoryTheme,\n} from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryLegend> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLegend\",\n};\n\nexport const LineHeight: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis />\n        <VictoryLegend\n          orientation=\"vertical\"\n          rowGutter={0}\n          style={{\n            labels: { lineHeight: 0.275 },\n          }}\n          data={[{ name: \"One\" }, { name: \"Two\" }, { name: \"Three\" }]}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis />\n        <VictoryLegend\n          orientation=\"vertical\"\n          rowGutter={0}\n          style={{\n            labels: { lineHeight: 0.75 },\n          }}\n          data={[{ name: \"One\" }, { name: \"Two\" }, { name: \"Three\" }]}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-legend/title.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\nimport range from \"lodash/range\";\n\nimport {\n  VictoryAxis,\n  VictoryLegend,\n  VictoryChart,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryLegend> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLegend\",\n};\n\nconst getData = (num) => {\n  return range(num).map((v) => ({\n    name: `Series ${v + 1}`,\n    symbol: {\n      size: 5,\n      type: \"circle\",\n      fill: undefined,\n    },\n  }));\n};\n\nexport const Title: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis />\n        <VictoryLegend\n          data={getData(5)}\n          title={`TITLE\\nmultiline`}\n          orientation=\"horizontal\"\n          itemsPerRow={3}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis />\n        <VictoryLegend\n          data={getData(5)}\n          title={`TITLE\\nmultiline`}\n          centerTitle\n          itemsPerRow={3}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis />\n        <VictoryLegend\n          data={getData(5)}\n          title={`TITLE\\nmultiline`}\n          centerTitle\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis />\n        <VictoryLegend\n          data={getData(5)}\n          title={`TITLE\\nmultiline`}\n          orientation=\"horizontal\"\n          itemsPerRow={3}\n          style={{ title: { padding: 20 } }}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis />\n        <VictoryLegend\n          data={getData(5)}\n          title={`TITLE\\nmultiline`}\n          itemsPerRow={3}\n          titleOrientation=\"bottom\"\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis />\n        <VictoryLegend\n          data={getData(5)}\n          title={`TITLE\\nmultiline`}\n          itemsPerRow={3}\n          titleOrientation=\"left\"\n          centerTitle\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryAxis />\n        <VictoryLegend\n          data={getData(5)}\n          title={`TITLE\\nmultiline`}\n          itemsPerRow={3}\n          titleOrientation=\"right\"\n          style={{ title: { padding: 20 } }}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-line/config.ts",
    "content": "import type { Meta, StoryObj } from \"@storybook/react\";\n\nimport { VictoryLine, VictoryLineProps } from \"@/victory\";\n\nimport {\n  VictoryCommonProps,\n  VictoryDatableProps,\n  VictoryMultiLabelableProps,\n} from \"../../utils/arg-types\";\nimport { componentContainer } from \"../../utils/decorators\";\n\ntype StoryProps = VictoryLineProps & {\n  themeKey: string;\n};\n\nexport const ComponentMeta: Meta<Omit<StoryProps, \"themeKey\">> = {\n  component: VictoryLine,\n  decorators: [componentContainer],\n\n  argTypes: {\n    ...VictoryCommonProps,\n    ...VictoryDatableProps,\n    ...VictoryMultiLabelableProps,\n\n    interpolation: {\n      control: \"select\",\n      options: [\n        \"basis\",\n        \"basisClosed\",\n        \"basisOpen\",\n        \"bundle\",\n        \"cardinal\",\n        \"cardinalClosed\",\n        \"cardinalOpen\",\n        \"catmullRom\",\n        \"catmullRomClosed\",\n        \"catmullRomOpen\",\n        \"linear\",\n        \"linearClosed\",\n        \"monotoneX\",\n        \"monotoneY\",\n        \"natural\",\n        \"radial\",\n        \"step\",\n        \"stepAfter\",\n        \"stepBefore\",\n      ],\n    },\n  },\n};\n\nexport type Story = StoryObj<StoryProps>;\n"
  },
  {
    "path": "stories/victory-charts/victory-line/data-accessors.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryLine, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryLine> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLine\",\n};\n\nexport const DataAccessors: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine\n          {...props}\n          data={[\n            { animal: \"Cat\", pet: 45, wild: 17 },\n            { animal: \"Dog\", pet: 85, wild: 6 },\n            { animal: \"Fish\", pet: 55, wild: 0 },\n            { animal: \"Bird\", pet: 15, wild: 40 },\n            { animal: \"Monkey\", pet: 5, wild: 40 },\n          ]}\n          x={\"animal\"}\n          y={(data) => data.pet + data.wild}\n        />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine\n          {...props}\n          data={[\n            { animal: \"Cat\", pet: 45, wild: 17 },\n            { animal: \"Dog\", pet: 85, wild: 6 },\n            { animal: \"Fish\", pet: 55, wild: 0 },\n            { animal: \"Bird\", pet: 15, wild: 40 },\n            { animal: \"Monkey\", pet: 5, wild: 40 },\n          ]}\n          x={\"animal\"}\n          y={(data) => data.pet + data.wild}\n        />\n      </VictoryChart>\n      <VictoryChart polar theme={VictoryTheme[props.themeKey]} innerRadius={30}>\n        <VictoryLine\n          {...props}\n          data={[\n            { animal: \"Cat\", pet: 45, wild: 17 },\n            { animal: \"Dog\", pet: 85, wild: 6 },\n            { animal: \"Fish\", pet: 55, wild: 0 },\n            { animal: \"Bird\", pet: 15, wild: 40 },\n            { animal: \"Monkey\", pet: 5, wild: 40 },\n          ]}\n          x={\"animal\"}\n          y={(data) => data.pet + data.wild}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine {...props} data={getData(8)} />\n      </VictoryChart>\n      <VictoryChart polar theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine {...props} data={getData(8)} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine\n          {...props}\n          data={[\n            { a: { b: { c: 1, d: 1 } } },\n            { a: { b: { c: 2, d: 3 } } },\n            { a: { b: { c: 3, d: 2 } } },\n          ]}\n          x={\"a.b.c\"}\n          y={\"a.b.d\"}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine\n          {...props}\n          data={[\n            { x: \"Cat\", y: 45, y0: 17 },\n            { x: \"Dog\", y: 85, y0: 6 },\n            { x: \"Fish\", y: 55, y0: 9 },\n            { x: \"Bird\", y: 15, y0: 4 },\n          ]}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-line/default.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryLine, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryLine> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLine\",\n};\n\nexport const Default: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryLine {...props} theme={VictoryTheme[props.themeKey]} />\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine {...props} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-line/disable-inline-styles.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { Curve, VictoryLine, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryLine> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLine\",\n};\n\nexport const DisableInlineStyles: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine {...props} disableInlineStyles />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine\n          {...props}\n          dataComponent={<Curve disableInlineStyles className=\"stroke-green\" />}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-line/events.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryLine, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryLine> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLine\",\n};\n\nexport const Events: Story = {\n  args: {},\n  render: (props) => (\n    <VictoryChart theme={VictoryTheme[props.themeKey]}>\n      <VictoryLine\n        {...props}\n        style={{\n          data: { stroke: \"#c43a31\" },\n        }}\n        events={[\n          {\n            target: \"parent\",\n            eventHandlers: {\n              onClick: () => {\n                return [\n                  {\n                    target: \"data\",\n                    eventKey: \"all\",\n                    mutation: ({ style }) => {\n                      return style.stroke === \"black\"\n                        ? null\n                        : { style: { stroke: \"black\", strokeWidth: 5 } };\n                    },\n                  },\n                ];\n              },\n            },\n          },\n        ]}\n        data={getData(5, \"seed-1\")}\n      />\n    </VictoryChart>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-line/interpolation.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  InterpolationPropType,\n  VictoryLine,\n  VictoryChart,\n  VictoryLabel,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { getData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryLine> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLine\",\n};\n\nexport const Interpolation: Story = {\n  args: {},\n  render: (props) => {\n    const makeInterpolationChart = (interpolation) => (\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryLabel\n          x={175}\n          y={30}\n          style={{ textAnchor: \"middle\" }}\n          text={interpolation}\n        />\n        <VictoryLine\n          {...props}\n          data={getData(8)}\n          interpolation={interpolation as InterpolationPropType}\n        />\n      </VictoryChart>\n    );\n\n    return (\n      <>\n        {[\n          \"basis\",\n          \"cardinal\",\n          \"catmullRom\",\n          \"linear\",\n          \"monotoneX\",\n          \"monotoneY\",\n          \"natural\",\n          \"step\",\n          \"stepAfter\",\n          \"stepBefore\",\n        ].map((interpolation) => makeInterpolationChart(interpolation))}\n      </>\n    );\n  },\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-line/labels.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryLine, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryLine> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLine\",\n};\n\nexport const Labels: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine\n          {...props}\n          data={getData(7)}\n          labels={({ datum }) => `x: ${datum.x}`}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine\n          {...props}\n          data={getData(7)}\n          labels={[\"\", \"\", \"three\", \"four\", \"5\", \"six\"]}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine\n          {...props}\n          data={[\n            { x: 1, y: 2, label: \"cat\" },\n            { x: 2, y: 5, label: \"dog\" },\n            { x: 3, y: 3, label: \"dog\" },\n            { x: 4, y: -2, label: \"bird\" },\n            { x: 5, y: -5, label: \"cat\" },\n          ]}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-line/log-scale.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryLine, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { getLogData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryLine> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLine\",\n};\n\nexport const LogScale: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} scale={{ y: \"log\" }}>\n        <VictoryLine\n          {...props}\n          data={getLogData(7)}\n          labels={({ datum }) => `x: ${datum.x}`}\n        />\n      </VictoryChart>\n      <VictoryChart\n        horizontal\n        theme={VictoryTheme[props.themeKey]}\n        scale={{ y: \"log\" }}\n      >\n        <VictoryLine\n          {...props}\n          data={getLogData(7)}\n          labels={({ datum }) => `x: ${datum.x}`}\n        />\n      </VictoryChart>\n      <VictoryChart\n        polar\n        theme={VictoryTheme[props.themeKey]}\n        scale={{ y: \"log\" }}\n      >\n        <VictoryLine {...props} data={getLogData(7)} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-line/plotting-functions.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryLine, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryLine> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLine\",\n};\n\nexport const PlottingFunctions: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine {...props} y={(d) => Math.sin(2 * Math.PI * d.x)} />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine {...props} y={(d) => Math.sin(2 * Math.PI * d.x)} />\n      </VictoryChart>\n\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine\n          {...props}\n          y={(d) => Math.sin(2 * Math.PI * d.x)}\n          y0={(d) => Math.sin(2 * Math.PI * d.x) - 0.5}\n        />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine\n          {...props}\n          y={(d) => Math.sin(2 * Math.PI * d.x)}\n          y0={(d) => Math.sin(2 * Math.PI * d.x) - 0.5}\n        />\n      </VictoryChart>\n      <VictoryChart polar theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine {...props} y={(d) => Math.sin(Math.PI * d.x)} />\n      </VictoryChart>\n      <VictoryChart polar theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine\n          {...props}\n          y={(d) => Math.sin(Math.PI * d.x)}\n          y0={(d) => Math.sin(Math.PI * d.x) - 0.5}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-line/polar-interpolation.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  InterpolationPropType,\n  VictoryLine,\n  VictoryChart,\n  VictoryLabel,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { getData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryLine> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLine\",\n};\n\nexport const PolarInterpolation: Story = {\n  args: {},\n  render: (props) => {\n    const makeInterpolationChart = (interpolation) => (\n      <VictoryChart polar theme={VictoryTheme[props.themeKey]}>\n        <VictoryLabel\n          x={175}\n          y={30}\n          style={{ textAnchor: \"middle\" }}\n          text={interpolation}\n        />\n        <VictoryLine\n          {...props}\n          data={getData(8)}\n          interpolation={interpolation as InterpolationPropType}\n        />\n      </VictoryChart>\n    );\n\n    return (\n      <>\n        {[\"basis\", \"cardinal\", \"catmullRom\", \"linear\"].map((interpolation) =>\n          makeInterpolationChart(interpolation),\n        )}\n      </>\n    );\n  },\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-line/polar.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryLine,\n  VictoryChart,\n  VictoryStack,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { getData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryLine> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLine\",\n};\n\nexport const Polar: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart polar theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine {...props} data={getData(7)} />\n      </VictoryChart>\n      <VictoryChart polar innerRadius={50} theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine {...props} data={getData(7)} />\n      </VictoryChart>\n      <VictoryChart\n        polar\n        theme={VictoryTheme[props.themeKey]}\n        minDomain={{ y: 1 }}\n      >\n        <VictoryLine\n          {...props}\n          data={[\n            { x: \"Cat\", y: 62 },\n            { x: \"Dog\", y: 91 },\n            { x: \"Fish\", y: 55 },\n            { x: \"Bird\", y: 55 },\n            { x: \"Frog\", y: 75 },\n          ]}\n        />\n      </VictoryChart>\n      <VictoryChart polar innerRadius={50} theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine\n          {...props}\n          data={[\n            { x: \"Cat\", y: 62 },\n            { x: \"Dog\", y: 91 },\n            { x: \"Fish\", y: 55 },\n            { x: \"Bird\", y: 55 },\n            { x: \"Frog\", y: 75 },\n          ]}\n        />\n      </VictoryChart>\n      <VictoryChart polar theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack>\n          <VictoryLine {...props} data={getData(5)} />\n          <VictoryLine {...props} data={getData(5, \"seed-1\")} />\n          <VictoryLine {...props} data={getData(5, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart polar innerRadius={50} theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack>\n          <VictoryLine {...props} data={getData(5)} />\n          <VictoryLine {...props} data={getData(5, \"seed-1\")} />\n          <VictoryLine {...props} data={getData(5, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-line/stacked.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryLine,\n  VictoryChart,\n  VictoryStack,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { getData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryLine> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLine\",\n};\n\nexport const Stacked: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack colorScale=\"qualitative\" labels={({ datum }) => datum.x}>\n          <VictoryLine {...props} data={getData(7)} />\n          <VictoryLine {...props} data={getData(7, \"seed-1\")} />\n          <VictoryLine {...props} data={getData(7, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack colorScale=\"qualitative\" labels={({ datum }) => datum.x}>\n          <VictoryLine {...props} data={getData(9)} />\n          <VictoryLine {...props} data={getData(5, \"seed-1\")} />\n          <VictoryLine {...props} data={getData(3, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack colorScale=\"qualitative\" labels={({ datum }) => datum.x}>\n          <VictoryLine {...props} data={getData(7)} />\n          <VictoryLine {...props} data={getData(7, \"seed-1\")} />\n          <VictoryLine {...props} data={getData(7, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack colorScale=\"qualitative\" labels={({ datum }) => datum.x}>\n          <VictoryLine {...props} data={getData(9)} />\n          <VictoryLine {...props} data={getData(5, \"seed-1\")} />\n          <VictoryLine {...props} data={getData(3, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart\n        domainPadding={{ y: 20 }}\n        polar\n        theme={VictoryTheme[props.themeKey]}\n      >\n        <VictoryStack colorScale=\"qualitative\" labels={({ datum }) => datum.x}>\n          <VictoryLine {...props} data={getData(7)} />\n          <VictoryLine {...props} data={getData(7, \"seed-1\")} />\n          <VictoryLine {...props} data={getData(7, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart\n        domainPadding={{ y: 20 }}\n        polar\n        theme={VictoryTheme[props.themeKey]}\n      >\n        <VictoryStack colorScale=\"qualitative\" labels={({ datum }) => datum.x}>\n          <VictoryLine {...props} data={getData(9)} />\n          <VictoryLine {...props} data={getData(5, \"seed-1\")} />\n          <VictoryLine {...props} data={getData(3, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-line/styles.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryLine, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryLine> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLine\",\n};\n\nexport const Styles: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine\n          {...props}\n          data={getData(7)}\n          labels={({ datum }) => datum.x}\n          style={{\n            labels: { fontSize: 20, fill: \"tomato\", fontFamily: \"monospace\" },\n            data: { stroke: \"tomato\", strokeWidth: 2 },\n          }}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine\n          {...props}\n          labels={({ datum }) => datum.x}\n          data={[\n            { x: \"Cat\", y: 62 },\n            { x: \"Dog\", y: 91 },\n            { x: \"Fish\", y: 55 },\n            { x: \"Bird\", y: 55 },\n          ]}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-line/theme.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryLine,\n  VictoryChart,\n  VictoryStack,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { getData, getMixedData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryLine> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLine\",\n};\n\nexport const Theme: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart>\n        <VictoryLine\n          {...props}\n          data={getMixedData(8)}\n          labels={({ datum }) => datum.x}\n        />\n      </VictoryChart>\n      <VictoryChart>\n        <VictoryStack labels={({ datum }) => datum.x}>\n          <VictoryLine {...props} data={getData(8)} />\n          <VictoryLine {...props} data={getData(8, \"seed-1\")} />\n          <VictoryLine {...props} data={getData(8, \"seed-2\")} />\n          <VictoryLine {...props} data={getData(8, \"seed-3\")} />\n          <VictoryLine {...props} data={getData(8, \"seed-4\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme.material}>\n        <VictoryLine\n          {...props}\n          data={getMixedData(8)}\n          labels={({ datum }) => datum.x}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme.material}>\n        <VictoryStack labels={({ datum }) => datum.x}>\n          <VictoryLine {...props} data={getData(8)} />\n          <VictoryLine {...props} data={getData(8, \"seed-1\")} />\n          <VictoryLine {...props} data={getData(8, \"seed-2\")} />\n          <VictoryLine {...props} data={getData(8, \"seed-3\")} />\n          <VictoryLine {...props} data={getData(8, \"seed-4\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme.clean}>\n        <VictoryLine\n          {...props}\n          data={getMixedData(8)}\n          labels={({ datum }) => datum.x}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme.clean}>\n        <VictoryStack labels={({ datum }) => datum.x}>\n          <VictoryLine {...props} data={getData(8)} />\n          <VictoryLine {...props} data={getData(8, \"seed-1\")} />\n          <VictoryLine {...props} data={getData(8, \"seed-2\")} />\n          <VictoryLine {...props} data={getData(8, \"seed-3\")} />\n          <VictoryLine {...props} data={getData(8, \"seed-4\")} />\n        </VictoryStack>\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-line/time-scale.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryLine,\n  VictoryChart,\n  VictoryStack,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { getTimeData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryLine> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLine\",\n};\n\nexport const TimeScale: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine\n          {...props}\n          data={getTimeData(5)}\n          labels={({ datum }) => datum.x.getFullYear()}\n        />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine\n          {...props}\n          data={getTimeData(5)}\n          labels={({ datum }) => datum.x.getFullYear()}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack labels={({ datum }) => datum.x.getFullYear()}>\n          <VictoryLine {...props} data={getTimeData(5)} />\n          <VictoryLine {...props} data={getTimeData(5, \"seed-1\")} />\n          <VictoryLine {...props} data={getTimeData(5, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack labels={({ datum }) => datum.x.getFullYear()}>\n          <VictoryLine {...props} data={getTimeData(5)} />\n          <VictoryLine {...props} data={getTimeData(5, \"seed-1\")} />\n          <VictoryLine {...props} data={getTimeData(5, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-line/tooltips.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryLine,\n  VictoryChart,\n  VictoryTheme,\n  VictoryTooltip,\n} from \"@/victory\";\n\nimport { getData, getMixedData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryLine> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryLine\",\n};\n\nexport const Tooltips: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine\n          {...props}\n          data={getData(5)}\n          labels={({ datum }) => `x: ${datum.x}`}\n          labelComponent={<VictoryTooltip active />}\n        />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine\n          {...props}\n          data={getData(5)}\n          labels={({ datum }) => `x: ${datum.x}`}\n          labelComponent={<VictoryTooltip active />}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine\n          {...props}\n          data={getMixedData(5)}\n          labels={({ datum }) => `x: ${datum.x}`}\n          labelComponent={<VictoryTooltip active />}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryLine\n          {...props}\n          data={getData(5)}\n          labels={[\"one\", \"two\", \"3\", \"wow, four tooltips\", \"five\"]}\n          labelComponent={<VictoryTooltip active />}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-pie/categories.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPie, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryPie> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPie\",\n};\n\nexport const Categories: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        categories={{ x: [\"B\", \"A\", \"E\", \"C\", \"D\"] }}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        categories={{ x: [\"E\", \"C\", \"A\", \"D\", \"B\"] }}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-pie/config.ts",
    "content": "import type { Meta, StoryObj } from \"@storybook/react\";\n\nimport { VictoryPie, VictoryPieProps } from \"@/victory\";\n\nimport {\n  VictoryCommonProps,\n  VictoryDatableProps,\n  VictoryMultiLabelableProps,\n} from \"../../utils/arg-types\";\nimport { componentContainer } from \"../../utils/decorators\";\n\ntype StoryProps = VictoryPieProps & {\n  themeKey: string;\n};\n\nexport const ComponentMeta: Meta<Omit<StoryProps, \"themeKey\">> = {\n  component: VictoryPie,\n  decorators: [componentContainer],\n\n  argTypes: {\n    ...VictoryCommonProps,\n    ...VictoryDatableProps,\n    ...VictoryMultiLabelableProps,\n\n    cornerRadius: { control: \"number\" },\n    endAngle: { control: \"number\" },\n    innerRadius: { control: \"number\" },\n    labelIndicator: { control: \"boolean\" },\n    labelIndicatorInnerOffset: { control: \"number\" },\n    labelIndicatorOuterOffset: { control: \"number\" },\n    labelPlacement: {\n      control: \"select\",\n      options: [\"parallel\", \"perpendicular\", \"vertical\"],\n    },\n    labelPosition: {\n      control: \"select\",\n      options: [\"startAngle\", \"endAngle\", \"centroid\"],\n    },\n    labelRadius: { control: \"number\" },\n    padAngle: { control: \"number\" },\n    startAngle: { control: \"number\" },\n  },\n};\n\nexport type Story = StoryObj<StoryProps>;\n"
  },
  {
    "path": "stories/victory-charts/victory-pie/corner-radius.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPie, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryPie> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPie\",\n};\n\nexport const CornerRadius: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        cornerRadius={10}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        cornerRadius={10}\n        innerRadius={100}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        cornerRadius={({ datum }) => datum.x * 5}\n        innerRadius={100}\n        data={[\n          { x: 1, y: 1 },\n          { x: 2, y: 3 },\n          { x: 3, y: 5 },\n          { x: 4, y: 2 },\n          { x: 5, y: 3 },\n        ]}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        cornerRadius={({ datum }) => datum.r}\n        innerRadius={100}\n        data={[\n          { x: 1, y: 1 },\n          { x: 2, y: 3 },\n          { x: 3, y: 5, r: 15 },\n          { x: 4, y: 2 },\n          { x: 5, y: 3 },\n        ]}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-pie/data.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPie, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryPie> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPie\",\n};\n\nexport const Data: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        data={[\n          { x: \"Cat\", y: 63 },\n          { x: \"Dog\", y: 91 },\n          { x: \"Fish\", y: 55 },\n          { x: \"Bird\", y: 55 },\n        ]}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        data={[\n          { animal: \"Cat\", pet: 45, wild: 17 },\n          { animal: \"Dog\", pet: 85, wild: 6 },\n          { animal: \"Fish\", pet: 55, wild: 0 },\n          { animal: \"Bird\", pet: 15, wild: 40 },\n        ]}\n        x={\"animal\"}\n        y={(data) => data.pet + data.wild}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        data={[\n          { x: \"Cat\", y: 62 },\n          { x: \"Dog\", y: 91 },\n          { x: \"Fish\", y: 55 },\n          { x: \"Bird\", y: 55 },\n        ]}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-pie/default.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPie, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryPie> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPie\",\n};\n\nexport const Default: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryPie {...props} theme={VictoryTheme[props.themeKey]} />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-pie/disable-inline-styles.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPie, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryPie> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPie\",\n};\n\n// TODO: uncomment when Slice props are fixed to include className\nexport const DisableInlineStyles: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        disableInlineStyles\n      />\n      {/* <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dataComponent={<Slice disableInlineStyles className=\"fill-purple\" />}\n      /> */}\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-pie/inner-radius.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPie, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryPie> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPie\",\n};\n\nexport const InnerRadius: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        innerRadius={100}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        radius={({ datum }) => datum.radius}\n        innerRadius={({ datum }) => datum.radius - 20}\n        data={[\n          { x: 1, y: 1, radius: 110 },\n          { x: 2, y: 3, radius: 120 },\n          { x: 3, y: 5, radius: 140 },\n          { x: 4, y: 2, radius: 150 },\n          { x: 5, y: 3, radius: 130 },\n        ]}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        innerRadius={({ datum }) => datum.y + 10}\n        labelRadius={({ datum }) => datum.y - 20}\n        data={[\n          { x: \"Cat\", y: 62 },\n          { x: \"Dog\", y: 91 },\n          { x: \"Fish\", y: 55 },\n          { x: \"Bird\", y: 25 },\n        ]}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        innerRadius={({ datum }) => datum.radius}\n        data={[\n          { x: 1, y: 1, radius: 50 },\n          { x: 2, y: 3 },\n          { x: 3, y: 5 },\n          { x: 4, y: 2 },\n          { x: 5, y: 3 },\n        ]}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-pie/label-indicator.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { LineSegment, VictoryPie, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryPie> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPie\",\n};\n\nexport const LabelIndicator: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        labelIndicator\n      />\n\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        labelIndicator\n        radius={90}\n        labelRadius={100}\n        labelIndicatorInnerOffset={25}\n        labelIndicatorOuterOffset={4}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        innerRadius={50}\n        labelIndicator\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        innerRadius={50}\n        labelIndicator\n        labelIndicatorInnerOffset={25}\n        labelIndicatorOuterOffset={10}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        innerRadius={50}\n        labelIndicator={<LineSegment />}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        labelRadius={90}\n        innerRadius={50}\n        radius={75}\n        labelIndicator={\n          <LineSegment\n            style={{\n              stroke: \"red\",\n              strokeDasharray: 1,\n              strokeWidth: 2,\n              fill: \"none\",\n            }}\n          />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-pie/label-placement.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPie, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryPie> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPie\",\n};\n\nexport const LabelPlacement: Story = {\n  args: {\n    data: [\n      { x: 1, y: 1, l: 0 },\n      { x: 2, y: 1, l: 45 },\n      { x: 3, y: 1, l: 90 },\n      { x: 4, y: 1, l: 135 },\n      { x: 5, y: 1, l: 180 },\n      { x: 6, y: 1, l: 225 },\n      { x: 7, y: 1, l: 270 },\n      { x: 8, y: 1, l: 315 },\n    ],\n  },\n  render: (props) => (\n    <>\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        style={{ labels: { fill: \"magenta\" } }}\n        labelPosition=\"startAngle\"\n        labelPlacement=\"parallel\"\n        labelRadius={50}\n        labels={({ datum }) => `${datum.l} degrees`}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        style={{ labels: { fill: \"magenta\" } }}\n        radius={120}\n        labelPosition=\"startAngle\"\n        labelPlacement=\"perpendicular\"\n        labels={({ datum }) => `${datum.l}\\ndegrees`}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        style={{ labels: { fill: \"magenta\" } }}\n        labelPosition=\"endAngle\"\n        labelPlacement=\"parallel\"\n        labelRadius={50}\n        labels={({ datum }) => `${datum.l} degrees`}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        style={{ labels: { fill: \"magenta\" } }}\n        radius={120}\n        labelPosition=\"endAngle\"\n        labelPlacement=\"perpendicular\"\n        labels={({ datum }) => `${datum.l}\\ndegrees`}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-pie/label-radius.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPie, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryPie> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPie\",\n};\n\nexport const LabelRadius: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        style={{ labels: { fill: \"magenta\" } }}\n        labelRadius={100}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        style={{ labels: { fill: \"magenta\" } }}\n        labelRadius={({ datum }) => datum.y}\n        radius={80}\n        innerRadius={100}\n        data={[\n          { x: 1, y: 100 },\n          { x: 2, y: 130 },\n          { x: 3, y: 150 },\n          { x: 4, y: 120 },\n          { x: 5, y: 130 },\n        ]}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        style={{ labels: { fill: \"magenta\" } }}\n        labelRadius={({ datum }) => datum.r}\n        innerRadius={100}\n        data={[\n          { x: 1, y: 100 },\n          { x: 2, y: 130 },\n          { x: 3, y: 150, r: 80 },\n          { x: 4, y: 120 },\n          { x: 5, y: 130 },\n        ]}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        style={{ labels: { fill: \"magenta\" } }}\n        labelRadius={({ datum }) => datum.r}\n        innerRadius={100}\n        labelPosition=\"startAngle\"\n        data={[\n          { x: 1, y: 100 },\n          { x: 2, y: 130 },\n          { x: 3, y: 150, r: 80 },\n          { x: 4, y: 120 },\n          { x: 5, y: 130 },\n        ]}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-pie/labels.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPie, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryPie> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPie\",\n};\n\nexport const Labels: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        labels={[\"one\", \"two\", \"three\", \"four\"]}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        labels={({ index }) => `#${index}`}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        labels={({ index }) => `#${index}`}\n        labelPosition=\"startAngle\"\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        labels={({ index }) => `#${index}`}\n        labelPosition=\"endAngle\"\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-pie/origin.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPie, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryPie> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPie\",\n};\n\nexport const Origin: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        style={{ labels: { fill: \"magenta\" } }}\n        origin={{ x: 150, y: 150 }}\n        labelRadius={100}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        style={{ labels: { fill: \"magenta\" } }}\n        origin={{ x: 150, y: 150 }}\n        labelRadius={100}\n        endAngle={90}\n        startAngle={-90}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        style={{ labels: { fill: \"magenta\" } }}\n        origin={{ x: 200, y: 0 }}\n        labelRadius={100}\n        startAngle={-270}\n        endAngle={-90}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-pie/pad-angle.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPie, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryPie> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPie\",\n};\n\nexport const PadAngle: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        padAngle={6}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        padAngle={6}\n        innerRadius={100}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        padAngle={({ datum }) => datum.x * 2}\n        innerRadius={100}\n        data={[\n          { x: 1, y: 1 },\n          { x: 2, y: 3 },\n          { x: 3, y: 5 },\n          { x: 4, y: 2 },\n          { x: 5, y: 3 },\n        ]}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        padAngle={({ datum }) => datum.r}\n        innerRadius={100}\n        data={[\n          { x: 1, y: 1 },\n          { x: 2, y: 3 },\n          { x: 3, y: 5, r: 8 },\n          { x: 4, y: 2 },\n          { x: 5, y: 3 },\n        ]}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-pie/radius.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPie, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryPie> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPie\",\n};\n\nexport const Radius: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        radius={100}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        radius={({ datum }) => datum.radius}\n        data={[\n          { x: 1, y: 1, radius: 110 },\n          { x: 2, y: 3, radius: 120 },\n          { x: 3, y: 5, radius: 140 },\n          { x: 4, y: 2, radius: 150 },\n          { x: 5, y: 3, radius: 130 },\n        ]}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        radius={({ datum }) => datum.y + 100}\n        labelRadius={({ datum }) => datum.y + 50}\n        style={{\n          labels: { fill: \"white\" },\n        }}\n        data={[\n          { x: \"Cat\", y: 62 },\n          { x: \"Dog\", y: 91 },\n          { x: \"Fish\", y: 55 },\n          { x: \"Bird\", y: 25 },\n        ]}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        innerRadius={80}\n        radius={({ datum }) => datum.y + 100}\n        labelRadius={({ datum }) => datum.y + 65}\n        style={{\n          labels: { fill: \"white\" },\n        }}\n        data={[\n          { x: \"Cat\", y: 62 },\n          { x: \"Dog\", y: 91 },\n          { x: \"Fish\", y: 55 },\n          { x: \"Bird\", y: 25 },\n        ]}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-pie/start-and-end-angles.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { Helpers, Slice, VictoryPie, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryPie> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPie\",\n};\n\nexport const StartAndEndAngles: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        endAngle={90}\n        startAngle={-90}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        endAngle={90}\n        innerRadius={140}\n        padAngle={5}\n        startAngle={-90}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dataComponent={\n          <Slice\n            sliceStartAngle={0}\n            sliceEndAngle={({ datum }) => datum.endAngle}\n          />\n        }\n        labels={() => null}\n        cornerRadius={5}\n        radius={({ datum }) => datum.radius}\n        innerRadius={({ datum }) => datum.innerRadius}\n        data={[\n          { x: \"Cat\", y: 62, innerRadius: 0, radius: 30 },\n          { x: \"Dog\", y: 91, innerRadius: 35, radius: 65 },\n          { x: \"Fish\", y: 55, innerRadius: 70, radius: 100 },\n          { x: \"Bird\", y: 55, innerRadius: 105, radius: 135, endAngle: 360 },\n        ]}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dataComponent={\n          <Slice\n            sliceStartAngle={-90}\n            sliceEndAngle={({ slice }) =>\n              Helpers.radiansToDegrees(slice?.endAngle) - 90\n            }\n          />\n        }\n        labels={() => null}\n        cornerRadius={5}\n        radius={({ datum }) => datum.radius}\n        innerRadius={({ datum }) => datum.innerRadius}\n        data={[\n          { x: \"Cat\", y: 62, innerRadius: 0, radius: 30 },\n          { x: \"Dog\", y: 91, innerRadius: 35, radius: 65 },\n          { x: \"Fish\", y: 55, innerRadius: 70, radius: 100 },\n          { x: \"Bird\", y: 55, innerRadius: 105, radius: 135 },\n        ]}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-pie/styles.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPie, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryPie> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPie\",\n};\n\nexport const Styles: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        style={{\n          labels: { fontSize: 20 },\n          data: {\n            stroke: \"red\",\n            strokeWidth: 3,\n            fillOpacity: 0.3,\n          },\n        }}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        colorScale=\"cool\"\n        style={{\n          labels: { fontSize: 20 },\n          data: {\n            fillOpacity: 0.3,\n          },\n        }}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        style={{\n          labels: {\n            fill: \"white\",\n            fontSize: 12,\n            fontWeight: \"bold\",\n          },\n        }}\n        data={[\n          { x: \"<5\", y: 6279 },\n          { x: \"5-13\", y: 9182 },\n          { x: \"14-17\", y: 5511 },\n          { x: \"18-24\", y: 7164 },\n          { x: \"25-44\", y: 6716 },\n          { x: \"45-64\", y: 4263 },\n          { x: \"≥65\", y: 7502 },\n        ]}\n        innerRadius={100}\n        labelRadius={110}\n        colorScale={[\n          \"#D85F49\",\n          \"#F66D3B\",\n          \"#D92E1D\",\n          \"#D73C4C\",\n          \"#FFAF59\",\n          \"#E28300\",\n          \"#F6A57F\",\n        ]}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-pie/theme.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPie, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryPie> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPie\",\n};\n\nexport const Theme: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryPie {...props} />\n      <VictoryPie {...props} theme={VictoryTheme.material} />\n      <VictoryPie {...props} theme={VictoryTheme.clean} />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-pie/tooltips.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPie, VictoryTheme, VictoryTooltip } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryPie> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPie\",\n};\n\nexport const Tooltips: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        radius={100}\n        labels={[\"one\", \"two\", \"three labels\", \"four\"]}\n        labelPlacement=\"perpendicular\"\n        labelComponent={<VictoryTooltip active />}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        radius={100}\n        labelComponent={<VictoryTooltip active />}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        radius={100}\n        labels={({ index }) => `#${index}`}\n        labelPosition=\"startAngle\"\n        labelPlacement=\"perpendicular\"\n        labelComponent={<VictoryTooltip active />}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        radius={100}\n        labels={({ index }) => `#${index}`}\n        labelPosition=\"endAngle\"\n        labelPlacement=\"perpendicular\"\n        labelComponent={<VictoryTooltip active />}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        radius={100}\n        labels={({ index }) => `#${index}`}\n        labelPosition=\"startAngle\"\n        labelPlacement=\"parallel\"\n        labelComponent={<VictoryTooltip active />}\n      />\n      <VictoryPie\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        radius={100}\n        labels={({ index }) => `#${index}`}\n        labelPosition=\"endAngle\"\n        labelPlacement=\"parallel\"\n        labelComponent={<VictoryTooltip active />}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-polar-axis/axis-angle.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPolarAxis, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryPolarAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPolarAxis\",\n};\n\nexport const AxisAngle: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dependentAxis\n        axisAngle={45}\n        tickFormat={[\"one\", \"two\", \"three\", \"four\", \"five\"]}\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dependentAxis\n        axisAngle={315}\n        tickFormat={[\"one\", \"two\", \"three\", \"four\", \"five\"]}\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dependentAxis\n        axisAngle={45}\n        endAngle={180}\n        tickFormat={[\"one\", \"two\", \"three\", \"four\", \"five\"]}\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dependentAxis\n        axisAngle={315}\n        endAngle={180}\n        tickFormat={[\"one\", \"two\", \"three\", \"four\", \"five\"]}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-polar-axis/axis-value.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPolarAxis, VictoryChart, VictoryTheme } from \"@/victory\";\n\nimport { getValues } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryPolarAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPolarAxis\",\n};\n\nexport const AxisValue: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart polar>\n        <VictoryPolarAxis\n          {...props}\n          theme={VictoryTheme[props.themeKey]}\n          dependentAxis\n          axisValue={1.5}\n          tickValues={getValues(3)}\n        />\n        <VictoryPolarAxis\n          {...props}\n          theme={VictoryTheme[props.themeKey]}\n          tickValues={getValues(5)}\n        />\n      </VictoryChart>\n      <VictoryChart polar>\n        <VictoryPolarAxis\n          {...props}\n          theme={VictoryTheme[props.themeKey]}\n          dependentAxis\n          axisValue=\"three\"\n          tickValues={getValues(3)}\n        />\n        <VictoryPolarAxis\n          {...props}\n          theme={VictoryTheme[props.themeKey]}\n          tickValues={[\"one\", \"two\", \"three\", \"four\", \"five\"]}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-polar-axis/config.ts",
    "content": "import type { Meta, StoryObj } from \"@storybook/react\";\n\nimport { VictoryPolarAxis, VictoryPolarAxisProps } from \"@/victory\";\n\nimport {\n  VictoryAxisCommonProps,\n  VictoryCommonProps,\n  VictoryDatableProps,\n} from \"../../utils/arg-types\";\nimport { componentContainer } from \"../../utils/decorators\";\n\ntype StoryProps = VictoryPolarAxisProps & {\n  themeKey: string;\n};\n\nexport const ComponentMeta: Meta<Omit<StoryProps, \"themeKey\">> = {\n  component: VictoryPolarAxis,\n  decorators: [componentContainer],\n\n  argTypes: {\n    ...VictoryAxisCommonProps,\n    ...VictoryCommonProps,\n    ...VictoryDatableProps,\n\n    axisAngle: { control: \"number\" },\n    endAngle: { control: \"number\" },\n    innerRadius: { control: \"number\" },\n    labelPlacement: {\n      control: \"select\",\n      options: [\"parallel\", \"perpendicular\", \"vertical\"],\n    },\n    startAngle: { control: \"number\" },\n  },\n};\n\nexport type Story = StoryObj<StoryProps>;\n"
  },
  {
    "path": "stories/victory-charts/victory-polar-axis/default.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPolarAxis, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryPolarAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPolarAxis\",\n};\n\nexport const Default: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart polar theme={VictoryTheme[props.themeKey]} />\n      <VictoryPolarAxis {...props} theme={VictoryTheme[props.themeKey]} />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-polar-axis/domain.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPolarAxis, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getValues } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryPolarAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPolarAxis\",\n};\n\nexport const Domain: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        domain={[-10, 10]}\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dependentAxis\n        domain={[-10, 10]}\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        tickValues={getValues(5)}\n        domain={[-10, 10]}\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dependentAxis\n        tickValues={getValues(5)}\n        domain={[-10, 10]}\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        tickValues={[8, 9, 10, 11, 12, 13]}\n        domain={[-10, 10]}\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dependentAxis\n        tickValues={[8, 9, 10, 11, 12, 13]}\n        domain={[-10, 10]}\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        tickValues={[\"cat\", \"dog\", \"bird\"]}\n        domain={[-2, 2]}\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dependentAxis\n        tickValues={[\"cat\", \"dog\", \"bird\"]}\n        domain={[-2, 2]}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-polar-axis/inner-radius.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPolarAxis, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getValues } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryPolarAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPolarAxis\",\n};\n\nexport const InnerRadius: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart polar innerRadius={50}>\n        <VictoryPolarAxis\n          {...props}\n          theme={VictoryTheme[props.themeKey]}\n          dependentAxis\n          tickValues={getValues(5)}\n        />\n        <VictoryPolarAxis\n          {...props}\n          theme={VictoryTheme[props.themeKey]}\n          tickValues={getValues(5)}\n        />\n      </VictoryChart>\n      <VictoryChart polar innerRadius={50} endAngle={180}>\n        <VictoryPolarAxis\n          {...props}\n          theme={VictoryTheme[props.themeKey]}\n          dependentAxis\n          tickValues={getValues(5)}\n        />\n        <VictoryPolarAxis\n          {...props}\n          theme={VictoryTheme[props.themeKey]}\n          tickValues={getValues(5)}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-polar-axis/label-placement.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPolarAxis, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryPolarAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPolarAxis\",\n};\n\nexport const LabelPlacement: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        labelPlacement=\"parallel\"\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dependentAxis\n        axisAngle={45}\n        labelPlacement=\"parallel\"\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        labelPlacement=\"perpendicular\"\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dependentAxis\n        axisAngle={45}\n        labelPlacement=\"perpendicular\"\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        labelPlacement=\"vertical\"\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dependentAxis\n        axisAngle={45}\n        labelPlacement=\"vertical\"\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-polar-axis/scale.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPolarAxis, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getTimeValues } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryPolarAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPolarAxis\",\n};\n\nexport const Scale: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        tickValues={getTimeValues(5)}\n        scale=\"time\"\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dependentAxis\n        tickValues={getTimeValues(5)}\n        scale=\"time\"\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        tickValues={[1, 5, 10, 50, 500, 10000]}\n        scale=\"log\"\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dependentAxis\n        tickValues={[1, 5, 10, 50, 500, 10000]}\n        scale=\"log\"\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-polar-axis/start-and-end-angle.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPolarAxis, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryPolarAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPolarAxis\",\n};\n\nexport const StartAndEndAngle: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        startAngle={45}\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dependentAxis\n        startAngle={45}\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        endAngle={90}\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dependentAxis\n        endAngle={90}\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        startAngle={45}\n        endAngle={360 + 45}\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dependentAxis\n        startAngle={45}\n        endAngle={360 + 45}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-polar-axis/style.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPolarAxis, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryPolarAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPolarAxis\",\n};\n\nexport const Style: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        style={{\n          axis: { stroke: \"#756f6a\" },\n          axisLabel: { fontSize: 20, padding: 30 },\n          grid: { stroke: ({ tick }) => (tick > 0.5 ? \"red\" : \"grey\") },\n          ticks: { stroke: \"grey\", size: 5 },\n          tickLabels: { fontSize: 15, padding: 5 },\n        }}\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dependentAxis\n        style={{\n          axis: { stroke: \"#756f6a\" },\n          axisLabel: { fontSize: 20, padding: 30 },\n          grid: { stroke: ({ tick }) => (tick > 0.5 ? \"red\" : \"grey\") },\n          ticks: { stroke: \"grey\", size: 5 },\n          tickLabels: { fontSize: 15, padding: 5 },\n        }}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-polar-axis/theme.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPolarAxis, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryPolarAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPolarAxis\",\n};\n\nexport const Theme: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart polar theme={VictoryTheme.grayscale} />\n      <VictoryPolarAxis {...props} theme={VictoryTheme.grayscale} />\n      <VictoryChart polar theme={VictoryTheme.material} />\n      <VictoryPolarAxis {...props} theme={VictoryTheme.material} />\n      <VictoryChart polar theme={VictoryTheme.clean} />\n      <VictoryPolarAxis {...props} theme={VictoryTheme.clean} />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-polar-axis/tick-format.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPolarAxis, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getValues } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryPolarAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPolarAxis\",\n};\n\nexport const TickFormat: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        tickValues={getValues(5)}\n        tickFormat={[\"one\", \"two\", \"three\", \"four\", \"five\"]}\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dependentAxis\n        axisAngle={45}\n        tickValues={getValues(5)}\n        tickFormat={[\"one\", \"two\", \"three\", \"four\", \"five\"]}\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        tickValues={getValues(5)}\n        tickFormat={(t) => `#${t}`}\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dependentAxis\n        axisAngle={45}\n        tickValues={getValues(5)}\n        tickFormat={(t) => `#${t}`}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-polar-axis/tick-values.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryPolarAxis, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getRandomValues, getValues } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryPolarAxis> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPolarAxis\",\n};\n\nexport const TickValues: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        tickValues={getValues(5)}\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dependentAxis\n        axisAngle={45}\n        tickValues={getValues(5)}\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        tickValues={getRandomValues(5)}\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dependentAxis\n        axisAngle={45}\n        tickValues={getRandomValues(5)}\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        tickValues={[\"one\", \"two\", \"three\", \"four\", \"five\"]}\n      />\n      <VictoryPolarAxis\n        {...props}\n        theme={VictoryTheme[props.themeKey]}\n        dependentAxis\n        axisAngle={45}\n        tickValues={[\"one\", \"two\", \"three\", \"four\", \"five\"]}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-portal/config.ts",
    "content": "import React from \"react\";\nimport type { Meta, StoryObj } from \"@storybook/react\";\n\nimport { VictoryPortal } from \"@/victory\";\nimport { componentContainer } from \"../../utils/decorators\";\n\ntype StoryProps = React.ComponentProps<typeof VictoryPortal>;\n\nexport const ComponentMeta: Meta<StoryProps> = {\n  component: VictoryPortal,\n  decorators: [componentContainer],\n};\n\nexport type Story = StoryObj<StoryProps>;\n"
  },
  {
    "path": "stories/victory-charts/victory-portal/default.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryBar,\n  VictoryPortal,\n  VictoryChart,\n  VictoryGroup,\n  VictoryLabel,\n} from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryPortal> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryPortal\",\n};\n\nexport const Default: Story = {\n  args: {},\n  render: (props) => (\n    <div style={{ height: \"400px\" }}>\n      <VictoryChart domainPadding={{ x: 50 }}>\n        <VictoryGroup offset={15}>\n          <VictoryBar\n            labels={[\"apples\", \"bananas\", \"cherries\"]}\n            style={{\n              labels: { fontSize: 20, fill: \"tomato\" },\n            }}\n            labelComponent={\n              <VictoryPortal {...props}>\n                <VictoryLabel />\n              </VictoryPortal>\n            }\n            data={[\n              { x: 1, y: 1 },\n              { x: 2, y: 2 },\n              { x: 3, y: 5 },\n            ]}\n          />\n          <VictoryBar\n            data={[\n              { x: 1, y: 2 },\n              { x: 2, y: 1 },\n              { x: 3, y: 7 },\n            ]}\n          />\n          <VictoryBar\n            data={[\n              { x: 1, y: 3 },\n              { x: 2, y: 4 },\n              { x: 3, y: 9 },\n            ]}\n          />\n        </VictoryGroup>\n      </VictoryChart>\n    </div>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-scatter/bubble-charts.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryScatter, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryScatter> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryScatter\",\n};\n\nexport const BubbleCharts: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} domainPadding={25}>\n        <VictoryScatter {...props} data={getData(10)} bubbleProperty=\"x\" />\n      </VictoryChart>\n      <VictoryChart\n        theme={VictoryTheme[props.themeKey]}\n        domainPadding={25}\n        horizontal\n      >\n        <VictoryScatter {...props} data={getData(10)} bubbleProperty=\"x\" />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} domainPadding={25}>\n        <VictoryScatter\n          {...props}\n          data={getData(10)}\n          bubbleProperty=\"x\"\n          maxBubbleSize={25}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} domainPadding={25}>\n        <VictoryScatter\n          {...props}\n          data={getData(10)}\n          bubbleProperty=\"x\"\n          minBubbleSize={10}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} domainPadding={25}>\n        <VictoryScatter\n          {...props}\n          data={getData(10)}\n          bubbleProperty=\"x\"\n          minBubbleSize={8}\n          maxBubbleSize={20}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} polar>\n        <VictoryScatter\n          {...props}\n          data={getData(10)}\n          bubbleProperty=\"x\"\n          maxBubbleSize={25}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} domainPadding={25}>\n        <VictoryScatter\n          {...props}\n          data={getData(10)}\n          bubbleProperty=\"x\"\n          size={3}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} domainPadding={25}>\n        <VictoryScatter\n          {...props}\n          data={getData(10)}\n          bubbleProperty=\"x\"\n          symbol=\"plus\"\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-scatter/config.ts",
    "content": "import type { Meta, StoryObj } from \"@storybook/react\";\n\nimport { VictoryScatter, VictoryScatterProps } from \"@/victory\";\n\nimport {\n  VictoryCommonProps,\n  VictoryDatableProps,\n  VictoryMultiLabelableProps,\n} from \"../../utils/arg-types\";\nimport { componentContainer } from \"../../utils/decorators\";\n\ntype StoryProps = VictoryScatterProps & {\n  themeKey: string;\n};\n\nexport const ComponentMeta: Meta<Omit<StoryProps, \"themeKey\">> = {\n  component: VictoryScatter,\n  decorators: [componentContainer],\n\n  argTypes: {\n    ...VictoryCommonProps,\n    ...VictoryDatableProps,\n    ...VictoryMultiLabelableProps,\n\n    bubbleProperty: { control: \"text\" },\n    maxBubbleSize: { control: \"number\" },\n    size: { control: \"number\" },\n  },\n};\n\nexport type Story = StoryObj<StoryProps>;\n"
  },
  {
    "path": "stories/victory-charts/victory-scatter/data-accessors.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryScatter, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryScatter> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryScatter\",\n};\n\nexport const DataAccessors: Story = {\n  args: {\n    data: [\n      { animal: \"Cat\", pet: 45, wild: 17 },\n      { animal: \"Dog\", pet: 85, wild: 6 },\n      { animal: \"Fish\", pet: 55, wild: 0 },\n      { animal: \"Bird\", pet: 15, wild: 40 },\n      { animal: \"Monkey\", pet: 5, wild: 40 },\n    ],\n  },\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryScatter\n          {...props}\n          labels={({ datum }) => datum.animal}\n          x={\"animal\"}\n          y={(data) => data.pet + data.wild}\n        />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryScatter\n          {...props}\n          labels={({ datum }) => datum.animal}\n          x={\"animal\"}\n          y={(data) => data.pet + data.wild}\n        />\n      </VictoryChart>\n      <VictoryChart polar theme={VictoryTheme[props.themeKey]} innerRadius={30}>\n        <VictoryScatter\n          {...props}\n          labels={({ datum }) => datum.animal}\n          x={\"animal\"}\n          y={(data) => data.pet + data.wild}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryScatter {...props} data={getData(8)} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryScatter\n          {...props}\n          data={[\n            { a: { b: { c: 1, d: 1 } } },\n            { a: { b: { c: 2, d: 3 } } },\n            { a: { b: { c: 3, d: 2 } } },\n          ]}\n          x={\"a.b.c\"}\n          y={\"a.b.d\"}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryScatter\n          {...props}\n          data={[\n            { x: \"Cat\", y: 45, y0: 17 },\n            { x: \"Dog\", y: 85, y0: 6 },\n            { x: \"Fish\", y: 55, y0: 9 },\n            { x: \"Bird\", y: 15, y0: 4 },\n          ]}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryScatter {...props} y={(d) => Math.sin(2 * Math.PI * d.x)} />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} polar>\n        <VictoryScatter {...props} y={(d) => Math.sin(2 * Math.PI * d.x)} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-scatter/default-rendering.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryScatter, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryScatter> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryScatter\",\n};\n\nexport const Default: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryScatter {...props} />\n      <VictoryChart>\n        <VictoryScatter {...props} />\n      </VictoryChart>\n      <VictoryScatter {...props} theme={VictoryTheme.material} />\n      <VictoryChart theme={VictoryTheme.material}>\n        <VictoryScatter {...props} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-scatter/disable-inline-styles.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { Point, VictoryScatter, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryScatter> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryScatter\",\n};\n\nexport const DisableInlineStyles: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryScatter {...props} disableInlineStyles />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryScatter\n          {...props}\n          dataComponent={<Point disableInlineStyles className=\"fill-green\" />}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-scatter/domain.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryScatter, VictoryChart } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryScatter> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryScatter\",\n};\n\nexport const Domain: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryScatter\n        {...props}\n        data={getData(5)}\n        domain={{ x: [0, 4], y: [5, 10] }}\n      />\n      <VictoryChart minDomain={{ x: 3 }}>\n        <VictoryScatter {...props} data={getData(5)} />\n      </VictoryChart>\n      <VictoryChart maxDomain={{ y: 5 }}>\n        <VictoryScatter {...props} data={getData(5)} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-scatter/functional-symbols.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  ScatterSymbolType,\n  VictoryScatter,\n  VictoryChart,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { getData, getMixedData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryScatter> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryScatter\",\n};\n\nconst SYMBOLS: ScatterSymbolType[] = [\n  \"circle\",\n  \"cross\",\n  \"diamond\",\n  \"plus\",\n  \"minus\",\n  \"square\",\n  \"star\",\n  \"triangleDown\",\n  \"triangleUp\",\n];\n\nexport const FunctionalSymbols: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryScatter\n          {...props}\n          data={getMixedData(8)}\n          symbol={({ index }) => SYMBOLS[index]}\n          labels={({ index }) => SYMBOLS[index]}\n          size={8}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} horizontal>\n        <VictoryScatter\n          {...props}\n          data={getMixedData(8)}\n          symbol={({ index }) => SYMBOLS[index]}\n          labels={({ index }) => SYMBOLS[index]}\n          size={8}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryScatter\n          {...props}\n          data={[\n            { x: 1, y: 45, symbol: \"star\" },\n            { x: 2, y: 85 },\n            { x: 3, y: 55, symbol: \"square\" },\n            { x: 4, y: 15 },\n          ]}\n          symbol=\"plus\"\n          size={8}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} polar innerRadius={30}>\n        <VictoryScatter\n          {...props}\n          data={getData(8)}\n          symbol={({ index }) => SYMBOLS[index]}\n          labels={({ index }) => SYMBOLS[index]}\n          size={8}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-scatter/labels.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryScatter, VictoryChart } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryScatter> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryScatter\",\n};\n\nexport const Labels: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart>\n        <VictoryScatter\n          {...props}\n          data={getData(7)}\n          labels={({ datum }) => `x: ${datum.x}`}\n        />\n      </VictoryChart>\n      <VictoryChart>\n        <VictoryScatter\n          {...props}\n          data={getData(7)}\n          labels={[\"\", \"\", \"three\", \"four\", \"5\", \"six\"]}\n        />\n      </VictoryChart>\n      <VictoryChart>\n        <VictoryScatter\n          {...props}\n          data={[\n            { x: 1, y: 2, label: \"cat\" },\n            { x: 2, y: 5, label: \"dog\" },\n            { x: 3, y: 3, label: \"dog\" },\n            { x: 4, y: -2, label: \"bird\" },\n            { x: 5, y: -5, label: \"cat\" },\n          ]}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-scatter/log-scale.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryScatter, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getLogData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryScatter> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryScatter\",\n};\n\nexport const LogScale: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]} scale={{ y: \"log\" }}>\n        <VictoryScatter\n          {...props}\n          data={getLogData(7)}\n          labels={({ datum }) => `x: ${datum.x}`}\n        />\n      </VictoryChart>\n      <VictoryChart\n        horizontal\n        theme={VictoryTheme[props.themeKey]}\n        scale={{ y: \"log\" }}\n      >\n        <VictoryScatter\n          {...props}\n          data={getLogData(7)}\n          labels={({ datum }) => `x: ${datum.x}`}\n        />\n      </VictoryChart>\n      <VictoryChart\n        polar\n        theme={VictoryTheme[props.themeKey]}\n        scale={{ y: \"log\" }}\n      >\n        <VictoryScatter {...props} data={getLogData(7)} />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-scatter/polar.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryScatter,\n  VictoryChart,\n  VictoryStack,\n  VictoryTheme,\n} from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryScatter> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryScatter\",\n};\n\nexport const Polar: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart polar theme={VictoryTheme[props.themeKey]}>\n        <VictoryScatter {...props} data={getData(7)} />\n      </VictoryChart>\n      <VictoryChart polar innerRadius={50} theme={VictoryTheme[props.themeKey]}>\n        <VictoryScatter {...props} data={getData(7)} />\n      </VictoryChart>\n      <VictoryChart\n        polar\n        theme={VictoryTheme[props.themeKey]}\n        minDomain={{ y: 1 }}\n      >\n        <VictoryScatter\n          {...props}\n          data={[\n            { x: \"Cat\", y: 62 },\n            { x: \"Dog\", y: 91 },\n            { x: \"Fish\", y: 55 },\n            { x: \"Bird\", y: 55 },\n            { x: \"Frog\", y: 75 },\n          ]}\n        />\n      </VictoryChart>\n      <VictoryChart polar innerRadius={50} theme={VictoryTheme[props.themeKey]}>\n        <VictoryScatter\n          {...props}\n          data={[\n            { x: \"Cat\", y: 62 },\n            { x: \"Dog\", y: 91 },\n            { x: \"Fish\", y: 55 },\n            { x: \"Bird\", y: 55 },\n            { x: \"Frog\", y: 75 },\n          ]}\n        />\n      </VictoryChart>\n      <VictoryChart polar theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack>\n          <VictoryScatter {...props} data={getData(5)} />\n          <VictoryScatter {...props} data={getData(5, \"seed-1\")} />\n          <VictoryScatter {...props} data={getData(5, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart polar innerRadius={50} theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack>\n          <VictoryScatter {...props} data={getData(5)} />\n          <VictoryScatter {...props} data={getData(5, \"seed-1\")} />\n          <VictoryScatter {...props} data={getData(5, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-scatter/stacked.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryScatter,\n  VictoryChart,\n  VictoryStack,\n  VictoryTheme,\n} from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryScatter> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryScatter\",\n};\n\nexport const Stacked: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack colorScale=\"qualitative\" labels={({ datum }) => datum.x}>\n          <VictoryScatter {...props} data={getData(7)} />\n          <VictoryScatter {...props} data={getData(7, \"seed-1\")} />\n          <VictoryScatter {...props} data={getData(7, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack colorScale=\"qualitative\" labels={({ datum }) => datum.x}>\n          <VictoryScatter {...props} data={getData(9)} />\n          <VictoryScatter {...props} data={getData(5, \"seed-1\")} />\n          <VictoryScatter {...props} data={getData(3, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack colorScale=\"qualitative\" labels={({ datum }) => datum.x}>\n          <VictoryScatter {...props} data={getData(7)} />\n          <VictoryScatter {...props} data={getData(7, \"seed-1\")} />\n          <VictoryScatter {...props} data={getData(7, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack colorScale=\"qualitative\" labels={({ datum }) => datum.x}>\n          <VictoryScatter {...props} data={getData(9)} />\n          <VictoryScatter {...props} data={getData(5, \"seed-1\")} />\n          <VictoryScatter {...props} data={getData(3, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart\n        domainPadding={{ y: 20 }}\n        polar\n        theme={VictoryTheme[props.themeKey]}\n      >\n        <VictoryStack colorScale=\"qualitative\" labels={({ datum }) => datum.x}>\n          <VictoryScatter {...props} data={getData(7)} />\n          <VictoryScatter {...props} data={getData(7, \"seed-1\")} />\n          <VictoryScatter {...props} data={getData(7, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart\n        domainPadding={{ y: 20 }}\n        polar\n        theme={VictoryTheme[props.themeKey]}\n      >\n        <VictoryStack colorScale=\"qualitative\" labels={({ datum }) => datum.x}>\n          <VictoryScatter {...props} data={getData(9)} />\n          <VictoryScatter {...props} data={getData(5, \"seed-1\")} />\n          <VictoryScatter {...props} data={getData(3, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-scatter/styles.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryScatter, VictoryChart, VictoryTheme } from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryScatter> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryScatter\",\n};\n\nexport const Styles: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryScatter\n          {...props}\n          data={getData(7)}\n          labels={({ datum }) => datum.x}\n          style={{\n            labels: { fontSize: 20, fill: \"tomato\", fontFamily: \"monospace\" },\n            data: { fill: \"tomato\" },\n          }}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryScatter\n          {...props}\n          style={{\n            data: {\n              fill: ({ datum }) => (datum.x === \"Dog\" ? \"red\" : \"black\"),\n            },\n          }}\n          labels={({ datum }) => datum.x}\n          data={[\n            { x: \"Cat\", y: 62 },\n            { x: \"Dog\", y: 91 },\n            { x: \"Fish\", y: 55 },\n            { x: \"Bird\", y: 55 },\n          ]}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-scatter/symbols.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  ScatterSymbolType,\n  VictoryScatter,\n  VictoryChart,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { getMixedData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryScatter> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryScatter\",\n};\n\nconst SYMBOLS: ScatterSymbolType[] = [\n  \"circle\",\n  \"cross\",\n  \"diamond\",\n  \"plus\",\n  \"minus\",\n  \"square\",\n  \"star\",\n  \"triangleDown\",\n  \"triangleUp\",\n];\n\nexport const Symbols: Story = {\n  args: {},\n  render: (props) => {\n    return (\n      <>\n        {SYMBOLS.map((symbol) => (\n          <div key={symbol}>\n            <VictoryChart theme={VictoryTheme[props.themeKey]}>\n              <VictoryScatter\n                {...props}\n                data={getMixedData(8)}\n                symbol={symbol}\n                size={10}\n                labels={() => symbol}\n              />\n            </VictoryChart>\n            <VictoryChart theme={VictoryTheme[props.themeKey]} polar>\n              <VictoryScatter\n                {...props}\n                data={getMixedData(8)}\n                symbol={symbol}\n                size={10}\n                labels={() => symbol}\n              />\n            </VictoryChart>\n          </div>\n        ))}\n      </>\n    );\n  },\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-scatter/theme.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryScatter,\n  VictoryChart,\n  VictoryStack,\n  VictoryTheme,\n} from \"@/victory\";\n\nimport { getData, getMixedData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryScatter> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryScatter\",\n};\n\nexport const Theme: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart>\n        <VictoryScatter\n          {...props}\n          data={getMixedData(8)}\n          labels={({ datum }) => datum.x}\n        />\n      </VictoryChart>\n      <VictoryChart>\n        <VictoryStack labels={({ datum }) => datum.x}>\n          <VictoryScatter {...props} data={getData(8)} />\n          <VictoryScatter {...props} data={getData(8, \"seed-1\")} />\n          <VictoryScatter {...props} data={getData(8, \"seed-2\")} />\n          <VictoryScatter {...props} data={getData(8, \"seed-3\")} />\n          <VictoryScatter {...props} data={getData(8, \"seed-4\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme.material}>\n        <VictoryScatter\n          {...props}\n          data={getMixedData(8)}\n          labels={({ datum }) => datum.x}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme.material}>\n        <VictoryStack labels={({ datum }) => datum.x}>\n          <VictoryScatter {...props} data={getData(8)} />\n          <VictoryScatter {...props} data={getData(8, \"seed-1\")} />\n          <VictoryScatter {...props} data={getData(8, \"seed-2\")} />\n          <VictoryScatter {...props} data={getData(8, \"seed-3\")} />\n          <VictoryScatter {...props} data={getData(8, \"seed-4\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme.clean}>\n        <VictoryScatter\n          {...props}\n          data={getMixedData(8)}\n          labels={({ datum }) => datum.x}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme.clean}>\n        <VictoryStack labels={({ datum }) => datum.x}>\n          <VictoryScatter {...props} data={getData(8)} />\n          <VictoryScatter {...props} data={getData(8, \"seed-1\")} />\n          <VictoryScatter {...props} data={getData(8, \"seed-2\")} />\n          <VictoryScatter {...props} data={getData(8, \"seed-3\")} />\n          <VictoryScatter {...props} data={getData(8, \"seed-4\")} />\n        </VictoryStack>\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-scatter/time-scale.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryScatter,\n  VictoryChart,\n  VictoryStack,\n  VictoryTheme,\n} from \"@/victory\";\nimport { Story, ComponentMeta } from \"./config\";\nimport { getTimeData } from \"../../utils/data\";\n\nconst meta: Meta<typeof VictoryScatter> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryScatter\",\n};\n\nexport const TimeScale: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryScatter\n          {...props}\n          data={getTimeData(5)}\n          labels={({ datum }) => datum.x.getFullYear()}\n        />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryScatter\n          {...props}\n          data={getTimeData(5)}\n          labels={({ datum }) => datum.x.getFullYear()}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack labels={({ datum }) => datum.x.getFullYear()}>\n          <VictoryScatter {...props} data={getTimeData(5)} />\n          <VictoryScatter {...props} data={getTimeData(5, \"seed-1\")} />\n          <VictoryScatter {...props} data={getTimeData(5, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryStack labels={({ datum }) => datum.x.getFullYear()}>\n          <VictoryScatter {...props} data={getTimeData(5)} />\n          <VictoryScatter {...props} data={getTimeData(5, \"seed-1\")} />\n          <VictoryScatter {...props} data={getTimeData(5, \"seed-2\")} />\n        </VictoryStack>\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-scatter/tooltips.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport {\n  VictoryScatter,\n  VictoryChart,\n  VictoryTheme,\n  VictoryTooltip,\n} from \"@/victory\";\n\nimport { getData, getMixedData } from \"../../utils/data\";\nimport { Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryScatter> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryScatter\",\n};\n\nexport const Tooltips: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryScatter\n          {...props}\n          data={getData(5)}\n          labels={({ datum }) => `x: ${datum.x}`}\n          labelComponent={<VictoryTooltip active />}\n        />\n      </VictoryChart>\n      <VictoryChart horizontal theme={VictoryTheme[props.themeKey]}>\n        <VictoryScatter\n          {...props}\n          data={getData(5)}\n          labels={({ datum }) => `x: ${datum.x}`}\n          labelComponent={<VictoryTooltip active />}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryScatter\n          {...props}\n          data={getMixedData(5)}\n          labels={({ datum }) => `x: ${datum.x}`}\n          labelComponent={<VictoryTooltip active />}\n        />\n      </VictoryChart>\n      <VictoryChart theme={VictoryTheme[props.themeKey]}>\n        <VictoryScatter\n          {...props}\n          data={getData(5)}\n          labels={[\"one\", \"two\", \"3\", \"wow, four tooltips\", \"five\"]}\n          labelComponent={<VictoryTooltip active />}\n        />\n      </VictoryChart>\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-tooltip/center-offset.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryTooltip, VictoryBar } from \"@/victory\";\nimport { defaultBarProps, polarBarProps, Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryTooltip> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryTooltip\",\n};\n\nexport const CenterOffset: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryBar\n        {...defaultBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            centerOffset={{ x: 20 }}\n            text={`x\\noffset`}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        horizontal\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            centerOffset={{ x: 20 }}\n            text={`x\\noffset`}\n          />\n        }\n      />\n      <VictoryBar\n        {...polarBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            centerOffset={{ x: 20 }}\n            text={`x\\noffset`}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            centerOffset={{ y: 20 }}\n            text={`y\\noffset`}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        horizontal\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            centerOffset={{ y: 20 }}\n            text={`y\\noffset`}\n          />\n        }\n      />\n      <VictoryBar\n        {...polarBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            centerOffset={{ y: 20 }}\n            text={`y\\noffset`}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            centerOffset={{ x: 20, y: 20 }}\n            text={`x, y\\noffset`}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        horizontal\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            centerOffset={{ x: 20, y: 20 }}\n            text={`x, y\\noffset`}\n          />\n        }\n      />\n      <VictoryBar\n        {...polarBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            centerOffset={{ x: 20, y: 20 }}\n            text={`x, y\\noffset`}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            centerOffset={{ y: ({ datum }) => (datum.y < 0 ? 10 : -10), x: 10 }}\n            text={`function\\noffset`}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        horizontal\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            centerOffset={{\n              x: ({ datum }) => (datum.y < 0 ? -10 : 10),\n              y: -10,\n            }}\n            text={`function\\noffset`}\n          />\n        }\n      />\n      <VictoryBar\n        {...polarBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            centerOffset={{\n              y: ({ index }) => (Number(index) < 3 ? -10 : 10),\n              x: 10,\n            }}\n            text={`function\\noffset`}\n          />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-tooltip/config.ts",
    "content": "import type { Meta, StoryObj } from \"@storybook/react\";\n\nimport { VictoryTooltip, VictoryTooltipProps } from \"@/victory\";\n\nimport { VictoryLabelableProps } from \"../../utils/arg-types\";\nimport { componentContainer } from \"../../utils/decorators\";\nimport { getData, getMixedData } from \"../../utils/data\";\n\ntype StoryProps = VictoryTooltipProps & {\n  themeKey: string;\n};\n\nexport const ComponentMeta: Meta<Omit<StoryProps, \"themeKey\">> = {\n  component: VictoryTooltip,\n  decorators: [componentContainer],\n\n  argTypes: {\n    ...VictoryLabelableProps,\n\n    active: { control: \"boolean\" },\n    activateData: { control: \"boolean\" },\n    angle: { control: \"number\" },\n    cornerRadius: { control: \"number\" },\n    dx: { control: \"number\" },\n    dy: { control: \"number\" },\n    flyoutHeight: { control: \"number\" },\n    flyoutPadding: { control: \"number\" },\n    flyoutWidth: { control: \"number\" },\n    height: { control: \"number\" },\n    horizontal: { control: \"boolean\" },\n    index: { control: \"number\" },\n    pointerOrientation: {\n      control: \"select\",\n      options: [\"top\", \"bottom\", \"left\", \"right\"],\n    },\n    pointerWidth: { control: \"number\" },\n    renderInPortal: { control: \"boolean\" },\n    text: { control: \"text\" },\n    width: { control: \"number\" },\n    x: { control: \"number\" },\n    y: { control: \"number\" },\n  },\n};\n\nexport type Story = StoryObj<StoryProps>;\n\nexport const defaultBarProps = {\n  style: {\n    labels: { fontFamily: \"arial\" },\n    data: { fill: \"gold\", width: 20 },\n  },\n  width: 300,\n  height: 300,\n  domainPadding: { y: 25 },\n  data: getMixedData(5),\n  labels: () => \"Label\",\n  size: 5,\n};\n\nexport const polarBarProps = {\n  style: {\n    labels: { fontFamily: \"arial\" },\n    data: { fill: \"gold\", width: 20 },\n  },\n  polar: true,\n  width: 300,\n  height: 300,\n  domainPadding: { y: 25 },\n  data: getData(5),\n  labels: () => \"Label\",\n  size: 5,\n};\n"
  },
  {
    "path": "stories/victory-charts/victory-tooltip/constrain-to-visible-area.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryTooltip, VictoryBar } from \"@/victory\";\nimport { defaultBarProps, Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryTooltip> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryTooltip\",\n};\n\nexport const ConstrainToVisibleArea: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryBar\n        {...defaultBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            constrainToVisibleArea\n            centerOffset={{\n              y: ({ datum }) => (datum.y > 0 ? -40 : 40),\n              x: ({ datum }) => (datum.y > 0 ? -20 : 20),\n            }}\n            pointerOrientation={({ datum }) => (datum.y > 0 ? \"bottom\" : \"top\")}\n            text={`constrain\\nto\\nvisible\\narea`}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        horizontal\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            constrainToVisibleArea\n            centerOffset={{\n              y: ({ datum }) => (datum.y > 0 ? -60 : 60),\n              x: ({ datum }) => (datum.y > 0 ? -10 : 10),\n            }}\n            pointerOrientation={({ datum }) => (datum.y > 0 ? \"bottom\" : \"top\")}\n            text={`constrain to\\nvisible area`}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            constrainToVisibleArea\n            centerOffset={{\n              x: ({ datum }) => (datum.y > 0 ? 70 : -70),\n              y: ({ datum }) => (datum.y > 0 ? -10 : 10),\n            }}\n            pointerOrientation={({ datum }) => (datum.y > 0 ? \"left\" : \"right\")}\n            text={`constrain to\\nvisible area`}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        horizontal\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            constrainToVisibleArea\n            centerOffset={{\n              x: ({ datum }) => (datum.y > 0 ? 70 : -70),\n              y: ({ datum }) => (datum.y > 0 ? -10 : 10),\n            }}\n            pointerOrientation={({ datum }) => (datum.y > 0 ? \"left\" : \"right\")}\n            text={`constrain\\nto\\nvisible\\narea`}\n          />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-tooltip/corner-radius.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryTooltip, VictoryBar } from \"@/victory\";\nimport { defaultBarProps, polarBarProps, Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryTooltip> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryTooltip\",\n};\n\nexport const CornerRadius: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryBar\n        {...defaultBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            cornerRadius={10}\n            text={`cornerRadius\\n10`}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        horizontal\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            cornerRadius={10}\n            text={`cornerRadius\\n10`}\n          />\n        }\n      />\n      <VictoryBar\n        {...polarBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            cornerRadius={10}\n            text={`cornerRadius\\n10`}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            cornerRadius={({ text }) => (text === \"square\" ? 0 : 5)}\n            text={({ datum }) => (datum.y < 0 ? \"square\" : \"rounded \")}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        horizontal\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            cornerRadius={({ text }) => (text === \"square\" ? 0 : 5)}\n            text={({ datum }) => (datum.y < 0 ? \"square\" : \"rounded \")}\n          />\n        }\n      />\n      <VictoryBar\n        {...polarBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            cornerRadius={({ text }) => (text === \"square\" ? 0 : 5)}\n            text={({ index }) => (Number(index) > 2 ? \"square\" : \"rounded \")}\n          />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-tooltip/default.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryTooltip, VictoryBar } from \"@/victory\";\nimport { defaultBarProps, polarBarProps, Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryTooltip> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryTooltip\",\n};\n\nexport const Default: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryBar\n        {...defaultBarProps}\n        labelComponent={<VictoryTooltip {...props} active />}\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        horizontal\n        labelComponent={<VictoryTooltip {...props} active />}\n      />\n      <VictoryBar\n        {...polarBarProps}\n        labelComponent={<VictoryTooltip {...props} active />}\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-tooltip/disable-inline-styles.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { Flyout, VictoryLabel, VictoryTooltip, VictoryBar } from \"@/victory\";\nimport { defaultBarProps, Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryTooltip> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryTooltip\",\n};\n\nexport const DisableInlineStyles: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryBar\n        {...defaultBarProps}\n        labelComponent={\n          <VictoryTooltip {...props} active disableInlineStyles />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            flyoutComponent={\n              <Flyout disableInlineStyles className=\"fill-purple\" />\n            }\n            labelComponent={\n              <VictoryLabel disableInlineStyles className=\"fill-green\" />\n            }\n          />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-tooltip/flyout-height.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryTooltip, VictoryBar } from \"@/victory\";\nimport { defaultBarProps, polarBarProps, Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryTooltip> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryTooltip\",\n};\n\nexport const FlyoutHeight: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryBar\n        {...defaultBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            flyoutHeight={50}\n            text={`flyoutHeight\\n50`}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        horizontal\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            flyoutHeight={50}\n            text={`flyoutHeight\\n50`}\n          />\n        }\n      />\n      <VictoryBar\n        {...polarBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            flyoutHeight={50}\n            text={`flyoutHeight\\n50`}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            flyoutHeight={({ text }) => (text === \"short\" ? 20 : 50)}\n            text={({ datum }) => (datum.y < 0 ? \"short\" : \"tall\")}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        horizontal\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            flyoutHeight={({ text }) => (text === \"short\" ? 20 : 50)}\n            text={({ datum }) => (datum.y < 0 ? \"short\" : \"tall\")}\n          />\n        }\n      />\n      <VictoryBar\n        {...polarBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            flyoutHeight={({ text }) => (text === \"short\" ? 20 : 50)}\n            text={({ index }) => (Number(index) > 2 ? \"short\" : \"tall\")}\n          />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-tooltip/flyout-padding.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryTooltip, VictoryBar } from \"@/victory\";\nimport { defaultBarProps, polarBarProps, Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryTooltip> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryTooltip\",\n};\n\nexport const FlyoutPadding: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryBar\n        {...defaultBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            flyoutPadding={{ top: 20, left: 15, right: 5 }}\n            text={`flyoutPadding`}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        horizontal\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            flyoutPadding={{ top: 30, bottom: 10 }}\n            text={`flyoutPadding\\nhorizontal`}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            flyoutPadding={({ datum }) =>\n              datum.y > 0 ? { top: 20, left: 15, right: 5 } : 2\n            }\n            text={`flyoutPadding\\nfunction`}\n          />\n        }\n      />\n      <VictoryBar\n        {...polarBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            flyoutPadding={{ top: 20, left: 15, right: 5 }}\n            text={`flyoutPadding\\npolar`}\n          />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-tooltip/flyout-style.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryTooltip, VictoryBar } from \"@/victory\";\nimport { defaultBarProps, polarBarProps, Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryTooltip> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryTooltip\",\n};\n\nexport const FlyoutStyle: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryBar\n        {...defaultBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            style={{ padding: 5, fontFamily: \"arial\" }}\n            flyoutStyle={{\n              stroke: \"red\",\n              strokeWidth: 2,\n              strokeDasharray: \"1, 2\",\n            }}\n            text={`flyoutStyle`}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        horizontal\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            style={{ padding: 5, fill: \"red\", fontFamily: \"arial\" }}\n            flyoutStyle={{\n              fill: \"pink\",\n              strokeWidth: 0,\n              opacity: 0.5,\n              padding: 10,\n            }}\n            text={`flyoutStyle`}\n          />\n        }\n      />\n      <VictoryBar\n        {...polarBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            style={{ padding: 10, fontFamily: \"arial\" }}\n            flyoutStyle={{ fill: \"cyan\", strokeWidth: 0, opacity: 0.5 }}\n            text={`flyoutStyle\\npolar`}\n          />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-tooltip/flyout-width.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryTooltip, VictoryBar } from \"@/victory\";\nimport { defaultBarProps, polarBarProps, Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryTooltip> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryTooltip\",\n};\n\nexport const FlyoutWidth: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryBar\n        {...defaultBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            flyoutWidth={100}\n            text={`flyoutWidth\\n100`}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        horizontal\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            flyoutWidth={100}\n            text={`flyoutWidth\\n100`}\n          />\n        }\n      />\n      <VictoryBar\n        {...polarBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            flyoutWidth={100}\n            text={`flyoutWidth\\n100`}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            flyoutWidth={({ text }) => (text === \"short\" ? 35 : 100)}\n            text={({ datum }) => (datum.y < 0 ? \"short\" : \"long\")}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        horizontal\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            flyoutWidth={({ text }) => (text === \"short\" ? 35 : 100)}\n            text={({ datum }) => (datum.y < 0 ? \"short\" : \"long\")}\n          />\n        }\n      />\n      <VictoryBar\n        {...polarBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            flyoutWidth={({ text }) => (text === \"short\" ? 35 : 100)}\n            text={({ index }) => (Number(index) > 2 ? \"short\" : \"long\")}\n          />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-tooltip/pointer-length.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryTooltip, VictoryBar } from \"@/victory\";\nimport { defaultBarProps, polarBarProps, Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryTooltip> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryTooltip\",\n};\n\nexport const PointerLength: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryBar\n        {...defaultBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            centerOffset={{ x: ({ index }) => (index === 0 ? -20 : 0) }}\n            pointerLength={30}\n            text={`pointerLength\\n30`}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        horizontal\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            pointerLength={30}\n            centerOffset={{ y: ({ index }) => (index === 0 ? 20 : 0) }}\n            text={`pointerLength\\n30`}\n          />\n        }\n      />\n      <VictoryBar\n        {...polarBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            pointerLength={30}\n            centerOffset={{ x: ({ index }) => (index === 0 ? 20 : 0) }}\n            text={`pointerLength\\n30`}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            centerOffset={{ x: ({ index }) => (Number(index) < 2 ? 20 : 0) }}\n            pointerLength={({ text }) => (text === \"short\" ? 1 : 30)}\n            text={({ datum }) => (datum.y < 0 ? \"short\" : \"long \")}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        horizontal\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            centerOffset={{ y: ({ index }) => (Number(index) < 2 ? 20 : 0) }}\n            pointerLength={({ text }) => (text === \"short\" ? 1 : 30)}\n            text={({ datum }) => (datum.y < 0 ? \"short\" : \"long \")}\n          />\n        }\n      />\n      <VictoryBar\n        {...polarBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            centerOffset={{\n              x: ({ index }) => (index === 0 || index === 4 ? 20 : 0),\n            }}\n            pointerLength={({ text }) => (text === \"short\" ? 1 : 30)}\n            text={({ index }) => (Number(index) > 2 ? \"short\" : \"long \")}\n          />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-tooltip/pointer-orientation.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryTooltip, VictoryBar } from \"@/victory\";\nimport { defaultBarProps, polarBarProps, Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryTooltip> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryTooltip\",\n};\n\nexport const PointerOrientation: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryBar\n        {...defaultBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            pointerOrientation={({ datum }) => (datum.y > 0 ? \"bottom\" : \"top\")}\n            text={({ datum }) =>\n              datum.y > 0 ? `orientation\\nbottom` : `orientation\\ntop`\n            }\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        horizontal\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            centerOffset={{\n              y: ({ datum }) => (datum.y > 0 ? -40 : 40),\n              x: ({ datum }) => (datum.y > 0 ? -20 : 20),\n            }}\n            pointerOrientation={({ datum }) => (datum.y > 0 ? \"bottom\" : \"top\")}\n            text={({ datum }) =>\n              datum.y > 0 ? `orientation\\nbottom` : `orientation\\ntop`\n            }\n          />\n        }\n      />\n      <VictoryBar\n        {...polarBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            pointerOrientation={({ index }) => (index < 3 ? \"bottom\" : \"top\")}\n            text={({ index }) =>\n              Number(index) < 3 ? `orientation\\nbottom` : `orientation\\ntop`\n            }\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            centerOffset={{\n              x: ({ datum }) => (datum.y > 0 ? 55 : -55),\n            }}\n            pointerOrientation={({ datum }) => (datum.y > 0 ? \"left\" : \"right\")}\n            text={({ datum }) =>\n              datum.y > 0 ? `orientation\\nleft` : `orientation\\nright`\n            }\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        horizontal\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            pointerOrientation={({ datum }) => (datum.y > 0 ? \"left\" : \"right\")}\n            text={({ datum }) =>\n              datum.y > 0 ? `orientation\\nleft` : `orientation\\nright`\n            }\n          />\n        }\n      />\n\n      <VictoryBar\n        {...polarBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            labelPlacement=\"parallel\"\n            pointerOrientation={({ index }) =>\n              index === 2 || index === 3 ? \"right\" : \"left\"\n            }\n            text={({ index }) =>\n              index === 2 || index === 3\n                ? `orientation\\nleft`\n                : `orientation\\nright`\n            }\n          />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "stories/victory-charts/victory-tooltip/pointer-width.stories.tsx",
    "content": "import React from \"react\";\nimport type { Meta } from \"@storybook/react\";\n\nimport { VictoryTooltip, VictoryBar } from \"@/victory\";\nimport { defaultBarProps, polarBarProps, Story, ComponentMeta } from \"./config\";\n\nconst meta: Meta<typeof VictoryTooltip> = {\n  ...ComponentMeta,\n  title: \"Victory Charts/VictoryTooltip\",\n};\n\nexport const PointerWidth: Story = {\n  args: {},\n  render: (props) => (\n    <>\n      <VictoryBar\n        {...defaultBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            pointerWidth={20}\n            centerOffset={{ x: ({ index }) => (index === 0 ? -20 : 0) }}\n            text={`pointerWidth\\n20`}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        horizontal\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            pointerWidth={20}\n            centerOffset={{ y: ({ index }) => (index === 0 ? 20 : 0) }}\n            text={`pointerWidth\\n20`}\n          />\n        }\n      />\n      <VictoryBar\n        {...polarBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            pointerWidth={20}\n            centerOffset={{ x: ({ index }) => (index === 0 ? 20 : 0) }}\n            text={`pointerWidth\\n20`}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            centerOffset={{ x: ({ index }) => (Number(index) < 2 ? -20 : 0) }}\n            pointerWidth={({ text }) => (text === \"skinny\" ? 0 : 20)}\n            text={({ datum }) => (datum.y < 0 ? \"skinny\" : \"wide \")}\n          />\n        }\n      />\n      <VictoryBar\n        {...defaultBarProps}\n        horizontal\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            centerOffset={{ y: ({ index }) => (Number(index) < 2 ? 20 : 0) }}\n            pointerWidth={({ text }) => (text === \"skinny\" ? 0 : 20)}\n            text={({ datum }) => (datum.y < 0 ? \"skinny\" : \"wide \")}\n          />\n        }\n      />\n      <VictoryBar\n        {...polarBarProps}\n        labelComponent={\n          <VictoryTooltip\n            {...props}\n            active\n            centerOffset={{\n              x: ({ index }) => (index === 0 || index === 4 ? 20 : 0),\n            }}\n            pointerWidth={({ text }) => (text === \"skinny\" ? 0 : 20)}\n            text={({ index }) => (Number(index) > 2 ? \"skinny\" : \"wide \")}\n          />\n        }\n      />\n    </>\n  ),\n};\n\nexport default meta;\n"
  },
  {
    "path": "test/helpers/index.ts",
    "content": "export * from \"./svg\";\nexport * from \"./wrappers\";\n"
  },
  {
    "path": "test/helpers/svg.ts",
    "content": "import * as d3Scale from \"victory-vendor/d3-scale\";\nimport * as d3Shape from \"victory-vendor/d3-shape\";\nimport { _internalD3Voronoi as d3Voronoi } from \"victory-voronoi/lib/helper-methods\";\nimport without from \"lodash/without\";\nimport min from \"lodash/min\";\nimport max from \"lodash/max\";\nimport property from \"lodash/property\";\n\nconst RECTANGULAR_SEQUENCE = [\"M\", \"A\", \"L\", \"A\", \"L\", \"A\", \"L\", \"A\", \"z\"];\nconst CIRCULAR_SEQUENCE = [\"M\", \"m\", \"a\", \"a\"];\nconst TRIANGULAR_SEQUENCE = [\"M\", \"L\", \"L\", \"z\"];\nconst CIRCULAR_SECTOR_SEQUENCE = [\"M\", \"A\", \"L\", \"Z\"];\n\nexport const calculateD3Path = (props, pathType, index = 0) => {\n  const { width, height, padding, scale, interpolation, data, domain } = props;\n  const scaleType = scale\n    ? `scale${scale[0].toUpperCase() + scale.slice(1)}`\n    : \"scaleLinear\";\n  const curveType =\n    typeof interpolation === \"string\"\n      ? `curve${interpolation[0].toUpperCase() + interpolation.slice(1)}`\n      : undefined;\n  const curveFunction =\n    typeof interpolation === \"function\" ? interpolation : d3Shape[curveType!];\n\n  const dataDomain = data.reduce(\n    (prev, datum) => {\n      if (datum.x < prev.x[0]) {\n        prev.x[0] = datum.x;\n      } else if (datum.x > prev.x[1]) {\n        prev.x[1] = datum.x;\n      }\n\n      if (datum.y < prev.y[0]) {\n        prev.y[0] = datum.y;\n      } else if (datum.y > prev.y[1]) {\n        prev.y[1] = datum.y;\n      }\n\n      return prev;\n    },\n    { x: [0, 0], y: [0, 0] },\n  );\n\n  const range = {\n    x: [padding, width - padding],\n    y: [height - padding, padding],\n  };\n\n  const scaleX = d3Scale[scaleType]()\n    .domain((domain && domain.x) || dataDomain.x)\n    .range(range.x);\n  const scaleY = d3Scale[scaleType]()\n    .domain((domain && domain.y) || dataDomain.y)\n    .range(range.y);\n\n  switch (pathType) {\n    case \"line\": {\n      return (\n        d3Shape\n          .line()\n          .curve(curveFunction)\n          // @ts-expect-error property x does not exist\n          .x((d) => scaleX(d.x))\n          // @ts-expect-error property y does not exist\n          .y((d) => scaleY(d.y))(data)\n      );\n    }\n    case \"area\": {\n      const modifiedData = props.data.map((datum) => {\n        return { x: datum.x, y: datum.y, y1: datum.y, y0: datum.y0 };\n      });\n      return (\n        d3Shape\n          .area()\n          .curve(curveFunction)\n          // @ts-expect-error property x does not exist\n          .x((d) => scaleX(d.x))\n          // @ts-expect-error property y1 does not exist\n          .y1((d) => scaleY(d.y1))\n          // @ts-expect-error property y0 does not exist\n          .y0((d) => scaleY(d.y0))(modifiedData)\n      );\n    }\n    case \"voronoi\": {\n      const minRange = [Math.min(...range.x), Math.min(...range.y)];\n      const maxRange = [Math.max(...range.x), Math.max(...range.y)];\n      const voronoi = d3Voronoi()\n        .x((d) => scaleX(d.x))\n        .y((d) => scaleY(d.y))\n        .extent([minRange, maxRange]);\n      const polygons = voronoi.polygons(data);\n      const polygon = without(polygons[index], \"data\");\n      return `M ${polygon.join(\"L\")} Z`;\n    }\n  }\n\n  return undefined;\n};\n\nexport const parseSvgPathCommands = (commandStr) => {\n  const matches = commandStr.match(\n    /[MmLlHhVvCcSsQqTtAaZz]+[^MmLlHhVvCcSsQqTtAaZz]*/g,\n  );\n\n  return matches.map((match) => {\n    const name = match.charAt(0);\n    const args = match\n      .substring(1)\n      .split(\",\")\n      .map((arg) => {\n        return parseFloat(arg);\n      });\n\n    return {\n      raw: match,\n      name,\n      args,\n    };\n  });\n};\n\nexport const getPathCommandsFromContainer = (container) => {\n  const commandStr = container.getAttribute(\"d\");\n  return parseSvgPathCommands(commandStr);\n};\n\nexport const exhibitsShapeSequence = (commandString, shapeSeqeuence) => {\n  const commands = parseSvgPathCommands(commandString);\n  return commands.every(\n    (command, index) => command.name === shapeSeqeuence[index],\n  );\n};\n\n/**\n * Retrieve the raw svg height of a bar.\n *\n * @param {string} commandString - The \"d\" attribute of a `path` element.\n * @returns {Number}             - The height of the bar in svg units.\n */\nexport const getBarHeight = (commandString) => {\n  const commands = parseSvgPathCommands(commandString);\n\n  return Math.abs(commands[0].args[1] - commands[2].args[1]);\n};\n\n/**\n * Assert the provided element renders a 4-sided shape and return dimensions.\n *\n * @param {HTMLElement} path - An HTML path element.\n * @returns {Object}         - Dimensions of the shape\n */\nexport const getBarShape = (path) => {\n  const commandstring = path.getAttribute(\"d\");\n  const commands = parseSvgPathCommands(commandstring);\n\n  const points = commands.filter((command) => {\n    return command.name !== \"z\";\n  });\n  const verticalPoints: any[] = points.map(property(\"args.1\"));\n  const horizontalPoints: any[] = points.map(property(\"args.0\"));\n  const height = max(verticalPoints) - min(verticalPoints);\n  const width = max(horizontalPoints) - min(horizontalPoints);\n\n  return {\n    height,\n    width,\n  };\n};\n\nexport const getDistanceFromOrigin = (coord) => {\n  return Math.sqrt(Math.pow(coord.x, 2) + Math.pow(coord.y, 2));\n};\n\n/**\n * Get the angle between 2 arbitrary SVG coordinates,\n * using 0, 0 as origin\n *\n * @param {{x: number, y: number}} coord1 SVG coordinates for point 1\n * @param {{x: number, y: number}} coord2 SVG coordinates for point 2\n * @return {number} Degrees, 0 - 360\n */\nexport const getAngleBetweenSVGCoordinates = (coord1, coord2) => {\n  const cartesianY1 = coord1.y * -1;\n  const cartesianY2 = coord2.y * -1;\n\n  const radians =\n    Math.atan2(cartesianY1, coord1.x) - Math.atan2(cartesianY2, coord2.x);\n  const theta = radians * (180 / Math.PI);\n\n  return theta < 0 ? 360 + theta : theta;\n};\n\n/**\n * Get the initial coordinates of the arc drawn in an SVG pie slice\n *\n * @param {String} sliceCommandString The command attribute of a `path` element\n * @return {{x: number, y: number}}   SVG coordinates\n */\nexport const getSliceArcStart = (sliceCommandString) => {\n  const cmds = parseSvgPathCommands(sliceCommandString);\n\n  return {\n    x: cmds[0].args[0],\n    y: cmds[0].args[1],\n  };\n};\n\n/**\n * Get the final coordinates of the arc drawn in an SVG pie slice\n *\n * @param {String} sliceCommandString The command attribute of a `path` element\n * @return {{x: number, y: number}}   SVG coordinates\n */\nexport const getSliceArcEnd = (sliceCommandString) => {\n  const cmds = parseSvgPathCommands(sliceCommandString);\n\n  // @see https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/d#Arcto\n  return {\n    x: cmds[1].args[5],\n    y: cmds[1].args[6],\n  };\n};\n\n/**\n * Translate SVG coordinates to cartesian system and get clockwise\n * from positive Y axis\n *\n * @param {{x: number, y: number}} coord X & Y values in SVG coordinate system\n * @return {number}                      Degrees from normal Cartesian positive Y axis axis, counter clockwise\n */\nexport const getSvgCoordinatesAngleFromCartesianYAxis = (coord) => {\n  const cartesianY = coord.y * -1; // Y coordinate in SVG system is inverse of normal Cartesian\n  const theta = Math.atan2(coord.x, cartesianY) * (180 / Math.PI);\n\n  return theta < 0 ? 360 + theta : theta;\n};\n\n/**\n * Determines if a rectangular shape is produced from the provided path command.\n *\n * @param {String} commandString - The command attribute of a `path` element.\n * @returns {Boolean}            - Boolean indicating if the command string produces a rectangular shape.\n */\nexport const isBar = (commandString) =>\n  exhibitsShapeSequence(commandString, RECTANGULAR_SEQUENCE);\n\n/**\n * Determines if a circular shape is produced from the provided path command.\n *\n * @param {String} commandString - The command attribute of a `path` element.\n * @returns {Boolean}            - Boolean indicating if the command string produces a circular shape.\n */\nexport const isCircle = (commandString) =>\n  exhibitsShapeSequence(commandString, CIRCULAR_SEQUENCE);\n\n/**\n * Determines if a triangular shape is produced from the provided path command.\n *\n * @param {String} commandString - The command attribute of a `path` element.\n * @returns {Boolean}            - Boolean indicating if the command string produces a triangular shape.\n */\nexport const isTriangle = (commandString) =>\n  exhibitsShapeSequence(commandString, TRIANGULAR_SEQUENCE);\n\n/**\n * Determines if a circular sector (slice of pie) shape is produced from the provided path command.\n *\n * @param {String} commandString - The command attribute of a `path` element.\n * @returns {Boolean}            - Boolean indicating if the command string produces a circular sector shape.\n */\nexport const isCircularSector = (commandString) =>\n  exhibitsShapeSequence(commandString, CIRCULAR_SECTOR_SEQUENCE);\nexport const getSvgPointCoordinates = (container) => {\n  const commands = getPathCommandsFromContainer(container);\n  return commands[0].args;\n};\n\n/**\n * Convert the raw svg coordinates to scaled Cartesian coordinates.\n *\n * @param {Array} coords - The x and y coordinates, respectively.\n * @param {Object} svgDimensions - The width, height, and padding of the svg.\n * @param {Number} svgDimensions.width - The width of the svg.\n * @param {Number} svgDimensions.height - The height of the svg.\n * @param {Number} svgDimensions.padding - The space between the edge of the\n *   svg and the chart area.\n * @param {Object} domain - The x and y domains.\n * @param {Array} domain.x - The lower and upper x bounds, respectively.\n * @param {Array} domain.y - The lower and upper y bounds, respectively.\n * @returns {Array} The Cartesian x and y coordinates, respectively.\n */\nexport const convertSvgCoordinatesToCartesian = (\n  coords,\n  svgDimensions,\n  domain,\n) => {\n  const { width, height, padding } = svgDimensions;\n\n  const cartesianX = coords[0] - padding;\n  const cartesianY = height - coords[1] - padding;\n\n  const chartWidth = width - padding * 2;\n  const chartHeight = height - padding * 2;\n\n  const scaledX = (cartesianX / chartWidth) * (domain.x[1] - domain.x[0]);\n  const scaledY = (cartesianY / chartHeight) * (domain.y[1] - domain.y[0]);\n\n  const shiftedX = scaledX + domain.x[0];\n  const shiftedY = scaledY + domain.y[0];\n\n  return [shiftedX, shiftedY];\n};\n"
  },
  {
    "path": "test/helpers/wrappers.tsx",
    "content": "import * as React from \"react\";\n\nexport function SVGWrapper(props: any) {\n  return <svg {...props} />;\n}\n"
  },
  {
    "path": "test/jest-setup.ts",
    "content": "import \"@testing-library/jest-dom/matchers\";\nimport \"@testing-library/jest-dom/jest-globals\";\n"
  },
  {
    "path": "test/jest.config.ts",
    "content": "// paths are relative to the root of the package they are executed in\nconst jestConfig = {\n  preset: \"ts-jest\",\n  testEnvironment: \"jsdom\",\n  testMatch: [\"**/src/**/?(*.)+(spec|test).[jt]s?(x)\"],\n  setupFilesAfterEnv: [\"../../test/jest-setup.ts\"],\n};\n\nexport default jestConfig;\n"
  },
  {
    "path": "test/tsconfig.json",
    "content": "{\n  \"extends\": \"../tsconfig.base.json\"\n}\n"
  },
  {
    "path": "tsconfig.base.json",
    "content": "{\n  \"extends\": \"./tsconfig.json\",\n}\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2015\",\n    \"module\": \"es6\",\n    \"jsx\": \"react\",\n    \"declaration\": true,\n    \"declarationMap\": true,\n    \"sourceMap\": true,\n    \"isolatedModules\": true,\n    \"strict\": true,        \n    \"noImplicitAny\": false,\n    \"moduleResolution\": \"node\",           \n    \"esModuleInterop\": true,              \n    \"skipLibCheck\": true,                 \n    \"forceConsistentCasingInFileNames\": true,\n    \"baseUrl\": \".\",\n    \"lib\": [\n      \"dom\", \n      \"dom.iterable\", \n      \"esnext\"\n    ],\n    \"paths\": {\n      \"@/*\": [\"packages/*\"]\n    },\n    \"types\": [\"@testing-library/jest-dom\"],\n  },\n}\n"
  },
  {
    "path": "tsconfig.storybook.json",
    "content": "{\n  \"extends\": \"./tsconfig.json\",\n  \"include\": [\"stories/**/*\"],\n  \"compilerOptions\": {\n    \"noEmit\": true\n  }\n}\n"
  },
  {
    "path": "vercel.json",
    "content": "{\n  \"redirects\": [\n    {\n      \"source\": \"/open-source/victory/docs\",\n      \"destination\": \"/open-source/victory/docs/introduction\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/faq\",\n      \"destination\": \"/open-source/victory/docs/introduction\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/gallery\",\n      \"destination\": \"/open-source/victory/docs/introduction\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/gallery/:slug\",\n      \"destination\": \"/open-source/victory/docs/introduction\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/about\",\n      \"destination\": \"/open-source/victory\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-area\",\n      \"destination\": \"/open-source/victory/docs/api/victory-area\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/react-native\",\n      \"destination\": \"/open-source/victory/docs/api/react-native\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/server-side-rendering\",\n      \"destination\": \"/open-source/victory/docs/api/server-side-rendering\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-axis\",\n      \"destination\": \"/open-source/victory/docs/api/victory-axis\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-bar\",\n      \"destination\": \"/open-source/victory/docs/api/victory-bar\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-box-plot\",\n      \"destination\": \"/open-source/victory/docs/api/victory-box-plot\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-candlestick\",\n      \"destination\": \"/open-source/victory/docs/api/victory-candlestick\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-error-bar\",\n      \"destination\": \"/open-source/victory/docs/api/victory-error-bar\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-histogram\",\n      \"destination\": \"/open-source/victory/docs/api/victory-histogram\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-line\",\n      \"destination\": \"/open-source/victory/docs/api/victory-line\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-pie\",\n      \"destination\": \"/open-source/victory/docs/api/victory-pie\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-polar-axis\",\n      \"destination\": \"/open-source/victory/docs/api/victory-polar-axis\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-scatter\",\n      \"destination\": \"/open-source/victory/docs/api/victory-scatter\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-voronoi\",\n      \"destination\": \"/open-source/victory/docs/api/victory-voronoi\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-chart\",\n      \"destination\": \"/open-source/victory/docs/api/victory-chart\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-brush-container\",\n      \"destination\": \"/open-source/victory/docs/api/victory-brush-container\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-clip-container\",\n      \"destination\": \"/open-source/victory/docs/api/victory-clip-container\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-container\",\n      \"destination\": \"/open-source/victory/docs/api/victory-container\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-cursor-container\",\n      \"destination\": \"/open-source/victory/docs/api/victory-cursor-container\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-group\",\n      \"destination\": \"/open-source/victory/docs/api/victory-group\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-selection-container\",\n      \"destination\": \"/open-source/victory/docs/api/victory-selection-container\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-stack\",\n      \"destination\": \"/open-source/victory/docs/api/victory-stack\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-voronoi-container\",\n      \"destination\": \"/open-source/victory/docs/api/victory-voronoi-container\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-zoom-container\",\n      \"destination\": \"/open-source/victory/docs/api/victory-zoom-container\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/common-container-props\",\n      \"destination\": \"/open-source/victory/docs/api/victory-common-container-props\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/create-container\",\n      \"destination\": \"/open-source/victory/docs/guides/containers\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-accessible-group\",\n      \"destination\": \"/open-source/victory/docs/api/victory-accessible-group\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-animation\",\n      \"destination\": \"/open-source/victory/docs/api/victory-animation\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-brush-line\",\n      \"destination\": \"/open-source/victory/docs/api/victory-brush-line\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-label\",\n      \"destination\": \"/open-source/victory/docs/api/victory-label\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-legend\",\n      \"destination\": \"/open-source/victory/docs/api/victory-legend\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-portal\",\n      \"destination\": \"/open-source/victory/docs/api/victory-portal\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-primitives\",\n      \"destination\": \"/open-source/victory/docs/api/victory-primitives\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-shared-events\",\n      \"destination\": \"/open-source/victory/docs/api/victory-shared-events\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-theme\",\n      \"destination\": \"/open-source/victory/docs/api/victory-theme\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-tooltip\",\n      \"destination\": \"/open-source/victory/docs/api/victory-tooltip\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-transition\",\n      \"destination\": \"/open-source/victory/docs/api/victory-transition\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/victory-canvas\",\n      \"destination\": \"/open-source/victory/docs/api/victory-canvas\",\n      \"permanent\": true\n    },\n    {\n      \"source\": \"/open-source/victory/docs/common-props\",\n      \"destination\": \"/open-source/victory/docs/api/victory-common-props\",\n      \"permanent\": true\n    }\n  ]\n}\n"
  },
  {
    "path": "website/.gitignore",
    "content": "# Dependencies\n/node_modules\n\n# Production\n/build\n\n# Generated files\n.docusaurus\n.cache-loader\n\n# Misc\n.DS_Store\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n"
  },
  {
    "path": "website/README.md",
    "content": "# Website\n\nThis website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator.\n\n### Installation\n\n```\n$ yarn\n```\n\n### Local Development\n\n```\n$ yarn start\n```\n\nThis command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.\n\n### Build\n\n```\n$ yarn build\n```\n\nThis command generates static content into the `build` directory and can be served using any static contents hosting service.\n\n### Deployment\n\nThis site is deployed using Vercel, which will automatically detect the site config and deploy\n"
  },
  {
    "path": "website/babel.config.js",
    "content": "module.exports = {\n  presets: [require.resolve(\"@docusaurus/core/lib/babel/preset\")],\n};\n"
  },
  {
    "path": "website/docs/api/_category_.json",
    "content": "{\n  \"label\": \"API\",\n  \"position\": 3,\n  \"link\": null\n}\n"
  },
  {
    "path": "website/docs/api/victory-accessible-group.mdx",
    "content": "---\ntitle: VictoryAccessibleGroup\n---\n\nA specialized group container that enables users to assign `aria-label`s, `desc`s and other props specified below which allow for improved access by screen readers. `VictoryAccessibleGroup` can be used as any `groupComponent` prop value. `VictoryAccessibleGroup` will render its children in a `<g>` element and includes a `desc` tag if provided as a prop.\n\n## Props\n\n---\n\n### aria-describedby\n\n<Badges>\n  <TypeBadge value=\"string\" />\n</Badges>\n\nThe `aria-describedby` prop applies to the `g` element rendered by `VictoryAccessibleGroup` as well as `descId` if a `desc` is provided. This prop should be given as a string corresponding to the id of an element that describes the chart.\n\n---\n\n### aria-label\n\n<Badges>\n  <TypeBadge value=\"string\" />\n</Badges>\n\nThe `aria-label` prop applies to the `g` element rendered by `VictoryAccessibleGroup`.\n\n---\n\n### children\n\n<Badges>\n  <TypeBadge value=\"ReactElement | ReactElement[]\" />\n</Badges>\n\n`VictoryAccessibleGroup` renders a single child, or an array of children in the group element.\n\n---\n\n### className\n\n<Badges>\n  <TypeBadge value=\"string\" />\n</Badges>\n\nThe `className` prop specifies a className that will be applied to the `g` element rendered by `VictoryAccessibleGroup`. If this prop is not set, the className will default to \"VictoryAccessibleGroup\".\n\n_example:_ `className=\"myChartAccessibleGroup\"`\n\n---\n\n### desc\n\n<Badges>\n  <TypeBadge value=\"string\" />\n</Badges>\n\nThe `desc` prop specifies the description of the chart/SVG to assist with accessibility for screen readers. The more descriptive this title is, the more useful it will be for people using screen readers.\n\n_example:_ `desc=\"Golden retrievers make up 30%, Labs make up 25%, and other dog breeds are not represented above 5% each.\"`\n\n---\n\n### tabIndex\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `tabIndex` will be applied to the `g` element.\n"
  },
  {
    "path": "website/docs/api/victory-animation.mdx",
    "content": "---\ntitle: VictoryAnimation\n---\n\n:::info\n[See this guide to animations with Victory Charts](/docs/guides/animations). The `VictoryAnimation` component is used for animating arbitrary React components and is not commonly used.\n:::\n\n`VictoryAnimation` animates prop changes for any React component. To animate prop changes, define a child function that accepts an object of tweened values and other animation information and returns a component to render.\n\n```jsx\n<VictoryAnimation {...animationProps} data={myComponentProps}>\n  {(tweenedProps, animationInfo) => {\n    if (animationInfo.animating && animationInfo.progress < 1) {\n      return <MyComponent {...tweenedProps} />;\n    }\n  }}\n</VictoryAnimation>\n```\n\n## Props\n\n---\n\n### children\n\n<Badges>\n  <TypeBadge value=\"(style: AnimationStyle, info: AnimationInfo) => React.ReactElement\" />\n</Badges>\n\n`VictoryAnimation` takes a single child, which should be given as a function of a tweened props object and an animation information object. The child function should return a component to render.\n\n---\n\n### data\n\n<Badges>\n  <TypeBadge value=\"AnimationData\" />\n</Badges>\n\n\nThe `data` prop specifies a set of values to tween between. When this prop changes, `VictoryAnimation` will begin animating between the current and next values. This prop should be given as an array or an object. `VictoryAnimation` uses [d3-interpolate][] to tween between values, with some [slight modifications][].\n\n---\n\n### duration\n\n<Badges>\n  <TypeBadge value=\"number\" />\n  <DefaultsBadge value=\"1000\" />\n</Badges>\n\nThe `duration` prop determines the number of milliseconds the animation should take to complete. This prop should be given as a number.\n\n---\n\n### delay\n\n<Badges>\n  <TypeBadge value=\"number\" />\n  <DefaultsBadge value=\"10\" />\n</Badges>\n\nThe `delay` prop specifies a delay in milliseconds before the start of an animation, or between each animation in the queue. This prop should be given as a number.\n\n### easing\n\n<Badges>\n  <TypeBadge value=\"AnimationEasing\" />\n  <DefaultsBadge value='\"quadInOut\"' />\n</Badges>\n\nThe `easing` prop specifies the type of easing to use for an animation. The supported types of easing are: _\"back\", \"backIn\", \"backOut\", \"backInOut\", \"bounce\", \"bounceIn\", \"bounceOut\", \"bounceInOut\", \"circle\", \"circleIn\", \"circleOut\", \"circleInOut\", \"linear\", \"linearIn\", \"linearOut\", \"linearInOut\", \"cubic\", \"cubicIn\", \"cubicOut\", \"cubicInOut\", \"elastic\", \"elasticIn\", \"elasticOut\", \"elasticInOut\", \"exp\", \"expIn\", \"expOut\", \"expInOut\", \"poly\", \"polyIn\", \"polyOut\", \"polyInOut\", \"quad\", \"quadIn\", \"quadOut\", \"quadInOut\", \"sin\", \"sinIn\", \"sinOut\", \"sinInOut\"_.\n\n---\n\n### onEnd\n\n<Badges>\n  <TypeBadge value=\"() => void\" />\n</Badges>\n\nThe `onEnd` prop specifies a function that will be called when the animation ends. If there are multiple animations in the queue, the `onEnd` function will be called after the last animation in the queue completes.\n\n[d3-interpolate]: https://github.com/d3/d3-interpolate\n[slight modifications]: https://github.com/FormidableLabs/victory/blob/main/packages/victory-core/src/victory-animation/util.ts\n"
  },
  {
    "path": "website/docs/api/victory-area.mdx",
    "content": "---\ntitle: VictoryArea\n---\n\n:::info\nFor examples of `VictoryArea` in action, visit the [Area Chart](/docs/charts/area) examples.\n:::\n\n## Inherited Props\n\n<CommonProps\n  interfaces={[\n    \"VictoryCommonProps\",\n    \"VictoryDatableProps\",\n    \"VictoryMultiLabelableProps\",\n    \"VictoryEventProps\",\n  ]}\n  overrides={[\n    \"dataComponent\",\n    \"groupComponent\",\n    \"labelComponent\",\n    \"events\",\n    \"eventKey\",\n  ]}\n/>\n\n## Component Props\n\n---\n\n### dataComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<Area>\" />\n</Badges>\n\n`VictoryArea` overrides the standard [`dataComponent`](/docs/api/victory-datatable-props#datacomponent) prop and supplies the following props to its `dataComponent`:\n\n- `data`\n- `events`\n- `groupComponent`\n- `interpolation`\n- `origin` (for polar charts)\n- `polar`\n- `scale`\n- `style`\n\n:::note\nBecause `VictoryArea` renders a single element to represent the entire dataset, the `dataComponent` it renders will not have access to `datum` like the `dataComponent` elements rendered by other Victory components such as `VictoryScatter`.\n:::\n\n---\n\n### eventKey\n\n<Badges>\n  <TypeBadge value=\"string | number | string[] | number[] | (args: CallbackArgs) => string | number\" />\n</Badges>\n\n`VictoryArea` uses the standard `eventKey` prop. [Read about the `eventKey` prop in more detail here](/docs/guides/events)\n\n:::note\n`VictoryArea` only renders one element per dataset, so only one event key will be generated.\n:::\n\n---\n\n### events\n\n<Badges>\n  <TypeBadge value=\"array[object]\" />\n</Badges>\n\n`VictoryArea` uses the standard `events` prop. [Read about it in detail](/docs/guides/events)\n\nSee the [Events Guide](/docs/guides/events) for more information on defining events.\n\n:::note\n`VictoryArea` uses the special `eventKey` \"all\" rather than referring to data by index, as it renders only one element for an entire dataset\n:::\n\n```jsx live\n<div style={{ margin: 50 }}>\n  <h3>Click the area chart element</h3>\n  <VictoryArea\n    events={[\n      {\n        target: \"data\",\n        eventHandlers: {\n          onClick: () => {\n            return [\n              {\n                eventKey: \"all\",\n                mutation: (props) => {\n                  const fill =\n                    props.style &&\n                    props.style.fill;\n                  return fill ===\n                    \"black\"\n                    ? null\n                    : {\n                        style: {\n                          fill: \"black\",\n                        },\n                      };\n                },\n              },\n            ];\n          },\n        },\n      },\n    ]}\n    data={sampleData}\n    theme={VictoryTheme.clean}\n  />\n</div>\n```\n\n---\n\n### groupComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<VictoryClipContainer>\" />\n</Badges>\n\n`VictoryArea` uses the standard `groupComponent` prop. [Read about it in detail](/docs/api/victory-common-theme-props#groupcomponent)\n\n:::note\n`VictoryArea` uses [`VictoryClipContainer`](/docs/api/victory-clip-container) as its default `groupComponent` `VictoryClipContainer` renders a `<g>` tag with a `clipPath` `def`. This allows continuous data components to transition smoothly when new data points enter and exit.\n:::\n\n:::warning\nUsing a custom `groupComponent` with `VictoryArea` may result in broken animations.\n:::\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryArea\n    groupComponent={\n      <VictoryClipContainer\n        clipPadding={{\n          top: 5,\n          right: 10,\n        }}\n      />\n    }\n    style={{\n      data: {\n        stroke: \"#c43a31\",\n        strokeWidth: 5,\n        strokeLinecap: \"round\",\n      },\n    }}\n    data={sampleData}\n  />\n</VictoryChart>\n```\n\n---\n\n### interpolation\n\n<Badges>\n  <TypeBadge value=\"InterpolationPropType | Function\" />\n  <DefaultsBadge value='\"linear\"' />\n</Badges>\n\nThe `interpolation` prop determines how data points should be connected when creating a path. Victory uses [d3-shape](https://github.com/d3/d3-shape#curves) for interpolating curves.\n\n#### Interpolation Options\n\nBoth cartesian and polar charts may use the following interpolation options:\n\n- `\"basis\"`\n- `\"cardinal\"`\n- `\"catmullRom\"`\n- `\"linear\"`\n\nCartesian charts may also use the following interpolation options:\n\n- `\"monotoneX\"`\n- `\"monotoneY\"`\n- `\"natural\"`\n- `\"step\"`\n- `\"stepAfter\"`\n- `\"stepBefore\"`\n\nYou can also provide a [custom curve function](https://github.com/d3/d3-shape#custom-curves).\n\n```jsx live\n<VictoryArea\n  interpolation=\"natural\"\n  data={sampleData}\n  theme={VictoryTheme.clean}\n/>\n```\n\n---\n\n### labelComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<VictoryLabel renderInPortal />\" />\n</Badges>\n\n`VictoryArea` uses the standard `labelComponent` prop. [Read about it in detail](/docs/api/victory-datatable-props#datacomponent)\n\n:::note\nTo enable tooltips on `VictoryArea`, it is necessary to use [`VictoryVoronoiContainer`](/docs/api/victory-voronoi-container)\n:::\n\n```jsx live\n<VictoryArea\n  data={sampleData}\n  labels={({ datum }) => datum.y}\n  labelComponent={\n    <VictoryLabel\n      renderInPortal\n      dy={-20}\n    />\n  }\n  theme={VictoryTheme.clean}\n/>\n```\n\n---\n\n### style\n\n<Badges>\n  <TypeBadge value=\"VictoryStyleInterface\" />\n  <DefaultsBadge value=\"(provided by theme)\" />\n</Badges>\n\nDefines the style of the component using [VictoryStyleInterface](/docs/api/victory-style-interface).\n\n:::note\nSince `VictoryArea` renders a single element to represent an entire dataset, it is not possible to use functional styles to change the style of the line as a function of an individual `datum`. Instead, try using [gradient fills](/docs/guides/themes#using-gradient-fills) for styling continuous data.\n:::\n\n```jsx live\n<VictoryArea\n  style={{\n    data: {\n      fill: \"#c43a31\",\n      fillOpacity: 0.7,\n      stroke: \"#c43a31\",\n      strokeWidth: 3,\n    },\n    labels: {\n      fontSize: 15,\n      fill: ({ datum }) =>\n        datum.x === 3\n          ? \"#000000\"\n          : \"#c43a31\",\n    },\n  }}\n  data={sampleData}\n  labels={({ datum }) => datum.x}\n  theme={VictoryTheme.clean}\n/>\n```\n"
  },
  {
    "path": "website/docs/api/victory-axis-common-props.mdx",
    "content": "---\ntitle: VictoryAxisCommonProps\n---\n\nA set of props available to components that implement an Axis in Victory.\n\n## Props\n\n---\n\n### axisComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value='<LineSegment type={\"axis\"}/>' />\n</Badges>\n\nThe `axisComponent` prop takes a component instance which will be responsible for rendering an axis line. The new element created from the passed `axisComponent` will be provided with the following props calculated by `VictoryAxis`: `x1`, `y1`, `x2`, `y2`, `style` and `events`. Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If an `axisComponent` is not provided, `VictoryAxis` will use its default [LineSegment][] component.\n\n```jsx\naxisComponent={<LineSegment events={{ onClick: handleClick }}/>}\n```\n\n---\n\n### axisLabelComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<VictoryLabel/>\" />\n</Badges>\n\nThe `axisLabelComponent` prop takes a component instance which will be used to render the axis label. The new element created from the passed `axisLabelComponent` will be supplied with the following props: `x`, `y`, `verticalAnchor`, `textAnchor`, `angle`, `transform`, `style` and `events`. Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If `axisLabelComponent` is omitted, a new [`VictoryLabel`][] will be created with props described above.\n\n```jsx\naxisLabelComponent={<VictoryLabel dy={20}/>}\n```\n\n---\n\n### axisValue\n\nThe `axisValue` prop may be used to position the dependent axis. This prop is useful when dependent axes should line up with values on the independent axis.\n\n---\n\n### dependentAxis\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n  <DefaultsBadge value=\"false\" />\n</Badges>\n\nThe `dependentAxis` boolean prop specifies whether the axis corresponds to the dependent variable (usually y). This prop is useful when composing `VictoryAxis` with other components to form a chart.\n\n```jsx live\n<VictoryAxis dependentAxis />\n```\n\n---\n\n### gridComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value='<LineSegment type={\"grid\"}/>' />\n</Badges>\n\nThe `gridComponent` prop takes a component instance which will be responsible for rendering a grid element. The new element created from the passed `gridComponent` will be provided with the following props calculated by `VictoryAxis`: `x1`, `y1`, `x2`, `y2`, `tick`, `style` and `events`. Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If a `gridComponent` is not provided, `VictoryAxis` will use its default [LineSegment][] component.\n\n```jsx\ngridComponent={<LineSegment events={{ onClick: handleClick }}/>}\n```\n\n---\n\n### invertAxis\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n  <DefaultsBadge value=\"false\" />\n</Badges>\n\nThe `invertAxis` boolean prop specifies whether the domain for a given axis should be inverted. By default, axes will be displayed with lower values on the bottom / left, and higher values on the top / right regardless of orientation.\n\n---\n\n### style\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n  <DefaultsBadge value=\"provided by default theme\" />\n</Badges>\n\nThe `style` prop defines the style of the component. The style prop should be given as an object with styles defined for `parent`, `axis`, `axisLabel`, `grid`, `ticks`, and `tickLabels`. Any valid svg styles are supported, but `width`, `height`, and `padding` should be specified via props as they determine relative layout for components in VictoryChart. Functional styles may be defined for `grid`, `tick`, and `tickLabel` style properties, and they will be evaluated with the props corresponding to each of these elements, such as `tick`, `index`, and `text`.\n\n```ts\nstyle?: {\n  parent?: VictoryStyleObject;\n  axis?: VictoryStyleObject;\n  axisLabel?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n  grid?: VictoryStyleObject;\n  ticks?: VictoryTickStyleObject;\n  tickLabels?: VictoryLabelStyleObject | VictoryLabelStyleObject[];\n};\n```\n\n:::note\nWhen a component is rendered as a child of another Victory component, or within a custom `<svg>` element with `standalone={false}` parent styles will be applied to the enclosing `<g>` tag. Many styles that can be applied to a parent `<svg>` will not be expressed when applied to a `<g>`.\n:::\n\n:::note\ncustom `angle` and `verticalAnchor` properties may be included in `labels` styles.\n:::\n\n```jsx live\n<VictoryAxis\n  label=\"Label\"\n  style={{\n    axis: { stroke: \"#756f6a\" },\n    axisLabel: {\n      fontSize: 20,\n      padding: 30,\n    },\n    grid: {\n      stroke: ({ tick }) =>\n        tick > 0.5 ? \"red\" : \"grey\",\n    },\n    ticks: { stroke: \"grey\", size: 5 },\n    tickLabels: {\n      fontSize: 15,\n      padding: 5,\n    },\n  }}\n/>\n```\n\n---\n\n### tickComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value='<LineSegment type={\"tick\"}/>' />\n</Badges>\n\nThe `tickComponent` prop takes a component instance which will be responsible for rendering a tick element. The new element created from the passed `tickComponent` will be provided with the following props calculated by `VictoryAxis`: `x1`, `y1`, `x2`, `y2`, `tick`, `style` and `events`. Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If a `tickComponent` is not provided, `VictoryAxis` will use its default [LineSegment][] component.\n\n```jsx\ntickComponent={<LineSegment events={{ onClick: handleClick }}/>}\n```\n\n---\n\n### tickCount\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nSpecifies approximately how many ticks should be drawn on the axis. If an array of ticks is supplied in `tickValues` or `tickFormat`, the `tickCount` prop will be used to _downsample_ the provided array to the specified length. If `tickValues` are not explicitly provided, this value is used by [d3Scale][] to calculate an _approximate_ number of ticks. [d3Scale][] prioritizes returning \"nice\" values and evenly spaced ticks over an exact number of ticks. This prop must be given as a positive integer.\n\n---\n\n### tickFormat\n\n<Badges>\n  <TypeBadge value=\"any[] | function\" />\n</Badges>\n\nSpecifies how tick values should be labeled. The `tickFormat` prop can be given as an array of values to display for each tick, or as a function to be applied to every `tickValue`. When given as a function, `tickFormat` will be called with the following arguments: `tick` - the individual tick value, `index` - the index of the tick in the array, and `ticks` - the entire array of ticks.\n\n```jsx live\n<VictoryAxis\n  tickValues={[2.11, 3.9, 6.1, 8.05]}\n  tickFormat={(t) =>\n    `${Math.round(t)}k`\n  }\n/>\n```\n\n---\n\n### tickLabelComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<VictoryLabel/>\" />\n</Badges>\n\nThe `tickLabelComponent` prop takes a component instance which will be used to render the axis label. The new element created from the passed `tickLabelComponent` will be supplied with the following props: `x`, `y`, `text`, `verticalAnchor`, `textAnchor`, `angle`, `transform`, `style` and `events`. Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If `tickLabelComponent` is omitted, a new [`VictoryLabel`][] will be created with props described above.\n\n```jsx\ntickLabelComponent={<VictoryLabel dy={20}/>}\n```\n\n---\n\n### tickValues\n\n<Badges>\n  <TypeBadge value=\"any[]\" />\n</Badges>\n\n`type: array`\n\nThe `tickValues` prop explicitly specifies a set of tick values to draw on the axis. This prop should be given as an array of unique values of the same type (_i.e.,_ all numbers). The `tickValues` prop is used to specify the _values_ of each tick, so numeric values are typically appropriate. An array of strings or dates may be supplied for categorical and time series data respectively. Use the [tickFormat][] prop to specify how ticks should be labeled. _Note:_ `tickValues` should be given as a unique array.\n\n```jsx live\n<VictoryAxis\n  tickValues={[2, 4, 6, 8]}\n/>\n```\n\n[tickformat]: /docs/api/victory-axis-common-props#tickformat\n[d3scale]: https://github.com/d3/d3-scale\n[linesegment]: /docs/api/victory-primitives#linesegment\n[`victorylabel`]: /docs/api/victory-label\n"
  },
  {
    "path": "website/docs/api/victory-axis.mdx",
    "content": "---\ntitle: VictoryAxis\n---\n\n:::info\nFor examples of `VictoryAxis` in action, visit the [Chart Axis](/docs/guides/axis) guide.\n:::\n\n## Inherited Props\n\n<CommonProps\n  interfaces={[\n    \"VictoryAxisCommonProps\",\n    \"VictoryCommonProps\",\n    \"VictorySingleLabelableProps\",\n    \"VictoryEventProps\",\n  ]}\n  overrides={[]}\n/>\n\n## Component Props\n\n---\n\n### crossAxis\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n</Badges>\n\nThe `crossAxis` boolean prop specifies whether a given axis is intended to cross another axis. When this prop is true, zeroes will be removed from the array of ticks so that they do not clutter the origin of the chart.\n\n:::note\nWhen `VictoryAxis` is nested within `VictoryChart`, `VictoryChart` will determine a value for the `crossAxis` prop based on domain, but this prop may be overridden by supplying a `crossAxis` prop directly to the `VictoryAxis` child component.\n:::\n\n---\n\n### domain\n\n<Badges>\n  <TypeBadge value=\"array[low, high] || { x: [low, high], y: [low, high] }\" />\n</Badges>\n\nThe `domain` prop describes the range of data the component will include. This prop can be given as an array of the minimum and maximum expected values of the data or as an object that specifies separate arrays for x and y. If this prop is not provided, a domain will be calculated from data, or other available information.\n\n:::note\nThe `x` value supplied to the `domain` prop refers to the _independent_ variable, and the `y` value refers to the _dependent_ variable. This may cause confusion in horizontal charts, as the independent variable will corresponds to the y axis.\n:::\n\n---\n\n### fixLabelOverlap\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n  <DefaultsBadge value=\"false\" />\n</Badges>\n\nWhen true, this prop reduces the number of tick labels to fit the length of the axis. Labels are\nremoved at approximately even intervals from the original array of labels. This feature only works\nwell for labels that are approximately evenly spaced.\n\n---\n\n### offsetX\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `offsetX` prop defines how far from the edge of its permitted area an axis should be offset in the x direction. If this prop is not given, the offset will be calculated based on font size, axis orientation, and label padding. When `VictoryAxis` is used with `VictoryChart`, `VictoryChart` will determine a value for `offsetX` that makes the axes line up correctly, but this value may be overridden by supplying an `offsetX` prop directly to the `VictoryAxis` child component.\n\n:::note\nThe `offsetX` prop is relative to the edge corresponding to the orientation of the axis, _e.g._ the left edge when `orientation=\"left\"`.\n:::\n\n```jsx live\n<VictoryAxis\n  dependentAxis\n  offsetX={225}\n/>\n```\n\n---\n\n### offsetY\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `offsetY` prop defines how far from the edge of its permitted area an axis should be offset in the y direction. If this prop is not given, the offset will be calculated based on font size, axis orientation, and label padding. When `VictoryAxis` is used with `VictoryChart`, `VictoryChart` will determine a value for `offsetY` that makes the axes line up correctly, but this value may be overridden by supplying an `offsetY` prop directly to the `VictoryAxis` child component.\n\n:::note\nThe `offsetY` prop is relative to the edge corresponding to the orientation of the axis, _e.g._ the bottom edge when `orientation=\"bottom\"`.\n:::\n\n```jsx live\n<VictoryAxis offsetY={150} />\n```\n\n---\n\n### orientation\n\n<Badges>\n  <TypeBadge value='\"top\" | \"bottom\" | \"left\" | \"right\"' />\n</Badges>\n\nThe `orientation` prop specifies the position and orientation of your axis. Options are \"top\", \"bottom\", \"left\", and \"right\".\n\n```jsx live\n<VictoryAxis orientation=\"top\" />\n```\n\n[animations guide]: /docs/guides/animations\n[events guide]: /docs/guides/events\n[themes guide]: /docs/guides/themes\n[`victorychart`]: /docs/api/victory-chart\n[tickformat]: /docs/api/victory-axis-common-props#tickformat\n[d3scale]: https://github.com/d3/d3-scale\n[grayscale theme]: https://github.com/FormidableLabs/victory/blob/main/packages/victory-core/src/victory-theme/grayscale.tsx\n[linesegment component]: /docs/api/victory-primitives#linesegment\n[`victorylabel`]: /docs/api/victory-label\n"
  },
  {
    "path": "website/docs/api/victory-bar.mdx",
    "content": "---\ntitle: VictoryBar\n---\n\n:::info\nFor examples of `VictoryBar` in action, visit the [Bar Chart](/docs/charts/bar) examples.\n:::\n\n## Inherited Props\n\n<CommonProps\n  interfaces={[\n    \"VictoryCommonProps\",\n    \"VictoryDatableProps\",\n    \"VictoryMultiLabelableProps\",\n    \"VictoryEventProps\",\n  ]}\n  overrides={[]}\n/>\n\n## Component Props\n\n---\n\n### alignment\n\n<Badges>\n  <TypeBadge value='\"start\" | \"middle\" | \"end\"' />\n</Badges>\n\nThe `alignment` prop specifies how bars should be aligned relative to their data points. This prop may be given as \"start\", \"middle\" or \"end\". When this prop is not specified, bars will have \"middle\" alignment relative to their data points.\n\n```jsx live\n<VictoryChart theme={VictoryTheme.clean}>\n  <VictoryBar alignment=\"start\" />\n</VictoryChart>\n```\n\n---\n\n### barRatio\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `barRatio` prop specifies an _approximate_ ratio between bar widths and spaces between bars. When width is not specified via the `barWidth` prop or in bar styles, the `barRatio` prop will be used to calculate a default width for each bar given the total number of bars in the data series and the overall width of the chart.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n  domainPadding={{ x: 30 }}\n>\n  <VictoryBar\n    barRatio={0.8}\n  />\n</VictoryChart>\n```\n\n---\n\n### barWidth\n\n<Badges>\n  <TypeBadge value=\"number | (args: CallbackArgs) => number\" />\n</Badges>\n\nThe `barWidth` prop is used to specify the width of each bar. This prop may be given as a number of pixels or as a function that returns a number. When this prop is given as a function, it will be evaluated for each bar with the props object corresponding to that bar. When this value is not given, a default value will be calculated based on the overall dimensions of the chart, and the number of bars.\n\n:::note\nIt is still possible to define bar width via the style prop with the `width` attribute, but `barWidth` will take precedence.\n:::\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n  domainPadding={{ x: 20 }}\n>\n  <VictoryBar\n    barWidth={({ datum }) => datum.x * 7}\n  />\n</VictoryChart>\n```\n\n---\n\n### cornerRadius\n\n<Badges>\n  <TypeBadge value=\"number | (args: CallbackArgs) => number | { top, bottom, topLeft, topRight, bottomLeft, bottomRight }\" />\n</Badges>\n\nThe `cornerRadius` prop specifies a radius to apply to each bar. If this prop is given as a single number, the radius will only be applied to the _top_ of each bar. When this prop is given as a function, it will be evaluated for each bar with the props object corresponding to that bar.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n  domainPadding={{ x: 20 }}\n>\n  <VictoryBar\n    cornerRadius={{ topLeft: ({ datum }) => datum.x * 4 }}\n  />\n</VictoryChart>\n```\n\n---\n\n### getPath\n\n<Badges>\n  <TypeBadge value=\"(props: VictoryBarProps) => string\" />\n</Badges>\n\nThe `getPath` prop is used to customize the path of the bar. This prop should be given as a function that takes an object of props and returns a string. The `getPath` function will be called with the props object for each bar.\n\n---\n\n### style\n\n<Badges>\n  <TypeBadge value=\"VictoryStyleInterface\" />\n  <DefaultsBadge value=\"(provided by theme)\" />\n</Badges>\n\nDefines the style of the component using [VictoryStyleInterface](/docs/api/victory-style-interface).\n\n```jsx live\n<VictoryChart domainPadding={{ x: 30 }}>\n  <VictoryBar\n    style={{\n      data: {\n        fill: ({ datum }) => datum.x === 3 ? \"#000000\" : \"#c43a31\",\n        stroke: ({ index }) => +index % 2 === 0  ? \"#000000\" : \"#c43a31\",\n        fillOpacity: 0.7,\n        strokeWidth: 3\n      },\n      labels: {\n        fontSize: 15,\n        fill: ({ datum }) => datum.x === 3 ? \"#000000\" : \"#c43a31\"\n      }\n    }}\n    data={sampleData}\n    labels={({ datum }) => datum.x}\n  />\n</VictoryChart>\n```\n\n[animations guide]: /docs/guides/animations\n[data accessors guide]: /docs/guides/data-accessors\n[custom components guide]: /docs/guides/custom-components\n[events guide]: /docs/guides/events\n[themes guide]: /docs/guides/themes\n[`victorychart`]: /docs/api/victory-chart\n[grayscale theme]: https://github.com/FormidableLabs/victory/blob/main/packages/victory-core/src/victory-theme/grayscale.tsx\n"
  },
  {
    "path": "website/docs/api/victory-boxplot.mdx",
    "content": "---\ntitle: VictoryBoxPlot\n---\n\n:::info\nFor examples of `VictoryBoxPlot` in action, visit the [Box Plot](/docs/charts/box-plot) examples.\n:::\n\n## Inherited Props\n\n<CommonProps\n  interfaces={[\n    \"VictoryCommonProps\",\n    \"VictoryDatableProps\",\n    \"VictoryEventProps\",\n  ]}\n  overrides={[\n    \"data\",\n    \"events\",\n    \"eventKey\",\n  ]}\n/>\n\n## Component Props\n\n---\n\n### boxWidth\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `boxWidth` prop specifies how wide each box should be. If the `whiskerWidth` prop is not set, this prop will also determine the width of the whisker crosshair.\n\n```jsx live\n<VictoryChart\n  domainPadding={10}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBoxPlot\n    boxWidth={10}\n    whiskerWidth={5}\n    data={[\n      { x: 1, y: [1, 2, 3, 5] },\n      { x: 2, y: [3, 2, 8, 10] },\n      { x: 3, y: [2, 8, 6, 5] },\n      { x: 4, y: [1, 3, 2, 9] },\n    ]}\n  />\n</VictoryChart>\n```\n\n---\n\n### data\n\n<Badges>\n  <TypeBadge value=\"any[]\" />\n</Badges>\n\nThe `data` prop for `VictoryBoxPlot` may be given in a a variety of formats:\n\n- As an array of standard data objects with values specified for `x` and `y`\n  When given in this format, repeated values for `x` will be used for calculating summary statistics\n\n```jsx\ndata={[\n  { x: 1, y: 2 },\n  { x: 1, y: 3 },\n  { x: 1, y: 5 },\n  { x: 2, y: 1 },\n  { x: 2, y: 4 },\n  { x: 2, y: 5 },\n  ...\n]}\n```\n\n- As an array of data objects where `y` is given as an array of values\n  When given in this format, array values are used for calculating summary statistics.\n\n```jsx\ndata={[\n  { x: 1, y: [1, 2, 3, 5] },\n  { x: 2, y: [3, 2, 8, 10] },\n  { x: 3, y: [2, 8, 6, 5] },\n  { x: 4, y: [1, 3, 2, 9] }\n]}\n```\n\n- As an array of data objects with pre-calculated summary statistics(`min`, `median`, `max`, `q1`, `q3`)\n  When given in this format, `VictoryBoxPlot` _will not_ perform statistical analysis. Pre-calculating summary statistics for large datasets will improve performance.\n\n```ts\ndata={[\n  { x: 1, min: 2, median: 5, max: 10, q1: 3, q3: 7 },\n  { x: 2, min: 1, median: 4, max: 9, q1: 3, q3: 6 },\n  { x: 3, min: 1, median: 6, max: 12, q1: 4, q3: 10 },\n}]\n```\n\nUse the [`x`][], [`y`][], [`min`][], [`max`][], [`median`][], [`q1`][], and [`q3`][] data accessor props to specify custom data formats. Refer to the [Data Accessors Guide][] for more detail.\n\n### eventKey\n\n<Badges>\n  <TypeBadge value=\"string | number | string[] | number[] | (args: CallbackArgs) => string | number\" />\n</Badges>\n\nSpecifies how event targets are addressed. **This prop is not commonly used.** [Read about the `eventKey` prop in more detail here](/docs/guides/events)\n\n---\n\n### events\n\n<Badges>\n  <TypeBadge value=\"any[]\" />\n</Badges>\n\n`VictoryBoxPlot` uses the standard `events` prop. [Read about it here](/docs/guides/events)\n\nSee the [Events Guide][] for more information on defining events.\n\n:::note\nvalid event targets for `VictoryBoxPlot` are:\n\"min\", \"minLabels\", \"grid\", \"ticks\", and \"tickLabels\".\n:::\n\n```jsx live\n<div>\n  <h3>Click a data bar below</h3>\n  <VictoryBoxPlot\n    medianLabels={() => null}\n    events={[\n      {\n        target: \"q3\",\n        eventHandlers: {\n          onClick: () => {\n            return [\n              {\n                mutation: (props) => {\n                  return {\n                    style:\n                      Object.assign(\n                        props.style,\n                        {\n                          fill: \"tomato\",\n                        },\n                      ),\n                  };\n                },\n              },\n            ];\n          },\n        },\n      },\n    ]}\n    data={[\n      { x: 1, y: [1, 2, 3, 5] },\n      { x: 2, y: [3, 2, 8, 10] },\n      { x: 3, y: [2, 8, 6, 5] },\n      { x: 4, y: [1, 3, 2, 9] },\n    ]}\n    theme={VictoryTheme.clean}\n  />\n</div>\n```\n\n---\n\n### labelOrientation\n\n<Badges>\n  <TypeBadge value='\"top\" | \"bottom\" | \"left\" | \"right\" | { min, max, median, q1, q3 }' />\n</Badges>\n\nThe `labelOrientation` prop determines where labels are placed relative to their corresponding data. If this prop is not set, it will be set to \"top\" for horizontal charts, and \"right\" for vertical charts.\n\n```jsx live\n<VictoryChart\n  horizontal\n  domainPadding={20}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBoxPlot\n    labels\n    labelOrientation=\"top\"\n    data={[\n      { x: 1, y: [1, 2, 3, 5] },\n      { x: 2, y: [3, 2, 8, 10] },\n      { x: 3, y: [2, 8, 6, 5] },\n      { x: 4, y: [1, 3, 2, 9] },\n    ]}\n  />\n</VictoryChart>\n```\n\n---\n\n### labels\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n</Badges>\n\nWhen the boolean `labels` prop is set to `true`, the values for `min`, `max`, `median`, `q1`, and `q3` will be displayed for each box. For more granular label control, use the individual [`minLabels`][], [`maxLabels`][], [`medianLabels`][], [`q1Labels`][], and [`q3Labels`][] props.\n\n---\n\n### max\n\n<Badges>\n  <TypeBadge value=\"string | string[] | number | (args: CallbackArgs) => string | number\" />\n</Badges>\n\nDefines the max value of a box plot.\n\n**string:** specify which property in an array of data objects should be used as the max value\n\n_examples:_ `max=\"max_value\"`\n\n**function:** use a function to translate each element in a data array into a max value\n\n_examples:_ `max={() => 10}`\n\n**path string or path array:** specify which property in an array of nested data objects should be used as a max value\n\n_examples:_ `max=\"bonds.max\"`, `max={[\"bonds\", \"max\"]}`\n\n---\n\n### maxComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<Whisker/>\" />\n</Badges>\n\nThe `maxComponent` prop takes a component instance which will be responsible for rendering an element to represent the maximum value of the box plot. The new element created from the passed `maxComponent` will be provided with the following props calculated by `VictoryBoxPlot`: `datum`, `index`, `scale`, `style`, `events`, `majorWhisker` and `minorWhisker`. The `majorWhisker` and `minorWhisker` props are given as objects with values for `x1`, `y1`, `x2` and `y2` that describes the lines that make up the major and minor whisker. Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If a `maxComponent` is not provided, `VictoryBoxPlot` will use its default [Whisker component][].\n\nSee the [Custom Components Guide][] for more detail on creating your own components\n\n```jsx\nmaxComponent={<Whisker events={{ onClick: handleClick }}/>}\n```\n\n---\n\n### maxLabelComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<VictoryLabel/>\" />\n</Badges>\n\nThe `maxLabelComponent` prop takes a component instance which will be used to render the label corresponding to the maximum value for each box. The new element created from the passed `maxLabelComponent` will be supplied with the following props: `x`, `y`, `datum`, `index`, `scale`, `verticalAnchor`, `textAnchor`, `angle`, `transform`, `style` and `events`. Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If `maxLabelComponent` is omitted, a new [`VictoryLabel`][] will be created with props described above.\n\nSee the [Custom Components Guide][] for more detail on creating your own components\n\n```jsx\nmaxLabelComponent={<VictoryLabel dy={20}/>}\n```\n\n```jsx live\n<VictoryBoxPlot\n  data={[\n    { x: 1, y: [1, 2, 3, 5] },\n    { x: 2, y: [3, 2, 8, 10] },\n    { x: 3, y: [2, 8, 6, 5] },\n    { x: 4, y: [1, 3, 2, 9] },\n  ]}\n  maxLabels\n  maxLabelComponent={\n    <VictoryLabel\n      dx={-10}\n      dy={-10}\n      textAnchor=\"middle\"\n    />\n  }\n  theme={VictoryTheme.clean}\n/>\n```\n\n---\n\n### maxLabels\n\n<Badges>\n  <TypeBadge value=\"boolean | (string|number)[] | (data: any) => string\" />\n</Badges>\n\nThe `maxLabels` prop defines the labels that will appear above each point. This prop should be given as a boolean, an array or as a function of the props corresponding to that label. When given as a boolean value, the max value of each datum will be used for the label.\n\n#### Common Usage\n\n- `maxLabels`\n- `maxLabels={[\"first\", \"second\", \"third\"]}`\n- `maxLabels={({ datum }) => Math.round(datum.max)}`\n\n---\n\n### median\n\n<Badges>\n  <TypeBadge value=\"string | string[] | number | (args: CallbackArgs) => string | number\" />\n</Badges>\n\nUse the `median` data accessor prop to define the median value of a box plot.\n\n**string:** specify which property in an array of data objects should be used as the median value\n\n_examples:_ `median=\"median_value\"`\n\n**function:** use a function to translate each element in a data array into a median value\n\n_examples:_ `median={() => 10}`\n\n**path string or path array:** specify which property in an array of nested data objects should be used as a median value\n\n_examples:_ `median=\"bonds.median\"`, `median={[\"bonds\", \"median\"]}`\n\n---\n\n### medianComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<LineSegment/>\" />\n</Badges>\n\nThe `medianComponent` prop takes a component instance which will be responsible for rendering an element to represent the median value of the box plot. The new element created from the passed `medianComponent` will be provided with the following props calculated by `VictoryBoxPlot`: `datum`, `index`, `scale`, `style`, `events`, `x1`, `y1`, `x2` and `y2` Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If a `medianComponent` is not provided, `VictoryBoxPlot` will use its default [Line component][].\n\nSee the [Custom Components Guide][] for more detail on creating your own components\n\n```jsx\nmedianComponent={<LineSegment events={{ onClick: handleClick }}/>}\n```\n\n---\n\n### medianLabelComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<VictoryLabel/>\" />\n</Badges>\n\nThe `medianLabelComponent` prop takes a component instance which will be used to render the label corresponding to the median value for each box. The new element created from the passed `medianLabelComponent` will be supplied with the following props: `x`, `y`, `datum`, `index`, `scale`, `verticalAnchor`, `textAnchor`, `angle`, `transform`, `style` and `events`. Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If `medianLabelComponent` is omitted, a new [`VictoryLabel`][] will be created with props described above.\n\nSee the [Custom Components Guide][] for more detail on creating your own components\n\n```jsx\nmedianLabelComponent={<VictoryLabel dy={20}/>}\n```\n\n```jsx live\n<VictoryBoxPlot\n  data={[\n    { x: 1, y: [1, 2, 3, 5] },\n    { x: 2, y: [3, 2, 8, 10] },\n    { x: 3, y: [2, 8, 6, 5] },\n    { x: 4, y: [1, 3, 2, 9] },\n  ]}\n  medianLabels\n  medianLabelComponent={\n    <VictoryLabel\n      dx={-10}\n      dy={-10}\n      textAnchor=\"middle\"\n    />\n  }\n  theme={VictoryTheme.clean}\n/>\n```\n\n---\n\n### medianLabels\n\n<Badges>\n  <TypeBadge value=\"boolean | (string|number)[] | (data: any) => string\" />\n</Badges>\n\nThe `medianLabels` prop defines the labels that will appear above each point. This prop should be given as a boolean, an array or as a function of the props corresponding to that label. When given as a boolean value, the median value of each datum will be used for the label.\n\n#### Common Usage\n\n- `medianLabels`\n- `medianLabels={[\"first\", \"second\", \"third\"]}`\n- `medianLabels={({ datum }) => Math.round(datum.median)}`\n\n---\n\n### min\n\n<Badges>\n  <TypeBadge value=\"string | string[] | number | (args: CallbackArgs) => string | number\" />\n</Badges>\n\nUse the `min` data accessor prop to define the min value of a box plot.\n\n**string:** specify which property in an array of data objects should be used as the min value\n\n_examples:_ `min=\"min_value\"`\n\n**function:** use a function to translate each element in a data array into a min value\n\n_examples:_ `min={() => 10}`\n\n**path string or path array:** specify which property in an array of nested data objects should be used as a min value\n\n_examples:_ `min=\"bonds.min\"`, `min={[\"bonds\", \"min\"]}`\n\n---\n\n### minComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<Whisker/>\" />\n</Badges>\n\nThe `minComponent` prop takes a component instance which will be responsible for rendering an element to represent the minimum value of the box plot. The new element created from the passed `minComponent` will be provided with the following props calculated by `VictoryBoxPlot`: `datum`, `index`, `scale`, `style`, `events`, `majorWhisker` and `minorWhisker`. The `majorWhisker` and `minorWhisker` props are given as objects with values for `x1`, `y1`, `x2` and `y2` that describes the lines that make up the major and minor whisker. Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If a `minComponent` is not provided, `VictoryBoxPlot` will use its default [Whisker component][].\n\nSee the [Custom Components Guide][] for more detail on creating your own components\n\n```jsx\nminComponent={<Whisker events={{ onClick: handleClick }}/>}\n```\n\n---\n\n### minLabelComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge  value=\"<VictoryLabel/>\" />\n</Badges>\n\nThe `minLabelComponent` prop takes a component instance which will be used to render the label corresponding to the minimum value for each box. The new element created from the passed `minLabelComponent` will be supplied with the following props: `x`, `y`, `datum`, `index`, `scale`, `verticalAnchor`, `textAnchor`, `angle`, `transform`, `style` and `events`. Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If `minLabelComponent` is omitted, a new [`VictoryLabel`][] will be created with props described above.\n\nSee the [Custom Components Guide][] for more detail on creating your own components\n\n```jsx\nminLabelComponent={<VictoryLabel dy={20}/>}\n```\n\n```jsx live\n<VictoryBoxPlot\n  data={[\n    { x: 1, y: [1, 2, 3, 5] },\n    { x: 2, y: [3, 2, 8, 10] },\n    { x: 3, y: [2, 8, 6, 5] },\n    { x: 4, y: [1, 3, 2, 9] },\n  ]}\n  minLabels\n  minLabelComponent={\n    <VictoryLabel\n      dx={-10}\n      dy={10}\n      textAnchor=\"middle\"\n    />\n  }\n  theme={VictoryTheme.clean}\n/>\n```\n\n---\n\n### minLabels\n\n<Badges>\n  <TypeBadge value=\"boolean | (string|number)[] | (data: any) => string\" />\n</Badges>\n\nThe `minLabels` prop defines the labels that will appear above each point. This prop should be given as a boolean, an array or as a function of the props corresponding to that label. When given as a boolean value, the min value of each datum will be used for the label.\n\n#### Common Usage\n\n- `minLabels`\n- `minLabels={[\"first\", \"second\", \"third\"]}`\n- `minLabels={({ datum }) => Math.round(datum.min)}`\n\n---\n\n### q1\n\n<Badges>\n  <TypeBadge value=\"string | string[] | number | (args: CallbackArgs) => string | number\" />\n</Badges>\n\nUse the `q1` data accessor prop to define the q1 value of a box plot.\n\n**string:** specify which property in an array of data objects should be used as the q1 value\n\n_examples:_ `q1=\"q1_value\"`\n\n**function:** use a function to translate each element in a data array into a q1 value\n\n_examples:_ `q1={() => 10}`\n\n**path string or path array:** specify which property in an array of nested data objects should be used as a q1 value\n\n_examples:_ `q1=\"bonds.q1\"`, `q1={[\"bonds\", \"q1\"]}`\n\n---\n\n### q1Component\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge  value=\"<Box/>\" />\n</Badges>\n\nThe `q1Component` prop takes a component instance which will be responsible for rendering an element to represent the q1 value of the box plot. The new element created from the passed `q1Component` will be provided with the following props calculated by `VictoryBoxPlot`: `datum`, `index`, `scale`, `style`, `events`, `x`, `y`, `width` and `height` Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If a `q1Component` is not provided, `VictoryBoxPlot` will use its default [Box component][].\n\nSee the [Custom Components Guide][] for more detail on creating your own components\n\n```jsx\nq1Component={<Box events={{ onClick: handleClick }}/>}\n```\n\n---\n\n### q1LabelComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge  value=\"<VictoryLabel/>\" />\n</Badges>\n\nThe `q1LabelComponent` prop takes a component instance which will be used to render the label corresponding to the q1 value for each box. The new element created from the passed `q1LabelComponent` will be supplied with the following props: `x`, `y`, `datum`, `index`, `scale`, `verticalAnchor`, `textAnchor`, `angle`, `transform`, `style` and `events`. Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If `q1LabelComponent` is omitted, a new [`VictoryLabel`][] will be created with props described above.\n\nSee the [Custom Components Guide][] for more detail on creating your own components\n\n```jsx\nq1LabelComponent={<VictoryLabel dy={20}/>}\n```\n\n```jsx live\n<VictoryBoxPlot\n  data={[\n    { x: 1, y: [1, 2, 3, 5] },\n    { x: 2, y: [3, 2, 8, 10] },\n    { x: 3, y: [2, 8, 6, 5] },\n    { x: 4, y: [1, 3, 2, 9] },\n  ]}\n  q1Labels\n  q1LabelComponent={\n    <VictoryLabel dx={5} dy={5} />\n  }\n  theme={VictoryTheme.clean}\n/>\n```\n\n---\n\n### q1Labels\n\n<Badges>\n  <TypeBadge value=\"boolean | (string|number)[] | (data: any) => string\" />\n</Badges>\n\nThe `q1Labels` prop defines the labels that will appear above each point. This prop should be given as a boolean, an array or as a function of the props corresponding to that label. When given as a boolean value, the q1 value of each datum will be used for the label.\n\n#### Common Usage\n\n- `q1Labels`\n- `q1Labels={[\"first\", \"second\", \"third\"]}`\n- `q1Labels={({ datum }) => Math.round(datum.q1)}`\n\n---\n\n### q3\n\n<Badges>\n  <TypeBadge value=\"string | string[] | number | (args: CallbackArgs) => string | number\" />\n</Badges>\n\nUse the `q3` data accessor prop to define the q3 value of a box plot.\n\n**string:** specify which property in an array of data objects should be used as the q3 value\n\n_examples:_ `q3=\"q3_value\"`\n\n**function:** use a function to translate each element in a data array into a q3 value\n\n_examples:_ `q3={() => 10}`\n\n**path string or path array:** specify which property in an array of nested data objects should be used as a q3 value\n\n_examples:_ `q3=\"bonds.q3\"`, `q3={[\"bonds\", \"q3\"]}`\n\n---\n\n### q3Component\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge  value=\"<Box/>\" />\n</Badges>\n\nThe `q3Component` prop takes a component instance which will be responsible for rendering an element to represent the q3 value of the box plot. The new element created from the passed `q3Component` will be provided with the following props calculated by `VictoryBoxPlot`: `datum`, `index`, `scale`, `style`, `events`, `x`, `y`, `width` and `height` Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If a `q3Component` is not provided, `VictoryBoxPlot` will use its default [Box component][].\n\nSee the [Custom Components Guide][] for more detail on creating your own components\n\n```jsx\nq3Component={<Box events={{ onClick: handleClick }}/>}\n```\n\n---\n\n### q3LabelComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge  value=\"<VictoryLabel/>\" />\n</Badges>\n\nThe `q3LabelComponent` prop takes a component instance which will be used to render the label corresponding to the q3 value for each box. The new element created from the passed `q3LabelComponent` will be supplied with the following props: `x`, `y`, `datum`, `index`, `scale`, `verticalAnchor`, `textAnchor`, `angle`, `transform`, `style` and `events`. Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If `q3LabelComponent` is omitted, a new [`VictoryLabel`][] will be created with props described above.\n\nSee the [Custom Components Guide][] for more detail on creating your own components\n\n```jsx\nq3LabelComponent={<VictoryLabel dy={20}/>}\n```\n\n```jsx live\n<VictoryBoxPlot\n  data={[\n    { x: 1, y: [1, 2, 3, 5] },\n    { x: 2, y: [3, 2, 8, 10] },\n    { x: 3, y: [2, 8, 6, 5] },\n    { x: 4, y: [1, 3, 2, 9] },\n  ]}\n  q3Labels\n  q3LabelComponent={\n    <VictoryLabel dx={5} dy={5} />\n  }\n  theme={VictoryTheme.clean}\n/>\n```\n\n---\n\n### q3Labels\n\n<Badges>\n  <TypeBadge value=\"boolean | (string|number)[] | (data: any) => string\" />\n</Badges>\n\nThe `q3Labels` prop defines the labels that will appear above each point. This prop should be given as a boolean, an array or as a function of the props corresponding to that label. When given as a boolean value, the q3 value of each datum will be used for the label.\n\n#### Common Usage\n\n- `q3Labels`\n- `q3Labels={[\"first\", \"second\", \"third\"]}`\n- `q3Labels={({ datum }) => Math.round(datum.q3)}`\n\n---\n\n### style\n\n<Badges>\n  <TypeBadge value=\"VictoryStyleInterface\" />\n  <DefaultsBadge value=\"(provided by theme)\" />\n</Badges>\n\nDefines the style of the component using `VictoryBoxPlotStyleInterface`.\n\n```ts\ntype VictoryBoxPlotStyleInterface = {\n  parent: object,\n  max: object,\n  maxLabels: object,\n  min: object,\n  minLabels: object,\n  median: object,\n  medianLabels: object,\n  q1: object,\n  q1Labels: object,\n  q3: object,\n  q3Labels: object\n}\n```\n\nThe `style` prop defines the style of the component. The style prop should be given as an object with styles defined for `parent`, `max`, `maxLabels`, `min`, `minLabels`,`median`, `medianLabels`,`q1`, `q1Labels`,`q3`, `q3Labels`. Any valid svg styles are supported, but `width`, `height`, and `padding` should be specified via props as they determine relative layout for components in VictoryChart. Functional styles may be defined for style properties, and they will be evaluated with the props corresponding to each element.\n\n_note:_ When a component is rendered as a child of another Victory component, or within a custom `<svg>` element with `standalone={false}` parent styles will be applied to the enclosing `<g>` tag. Many styles that can be applied to a parent `<svg>` will not be expressed when applied to a `<g>`.\n\n_note:_ custom `angle` and `verticalAnchor` properties may be included in `labels` styles.\n\n```jsx live\n<VictoryBoxPlot\n  minLabels\n  maxLabels\n  data={[\n    { x: 1, y: [1, 2, 3, 5] },\n    { x: 2, y: [3, 2, 8, 10] },\n    { x: 3, y: [2, 8, 6, 5] },\n    { x: 4, y: [1, 3, 2, 9] },\n  ]}\n  style={{\n    min: { stroke: \"tomato\" },\n    max: { stroke: \"orange\" },\n    q1: { fill: \"tomato\" },\n    q3: { fill: \"orange\" },\n    median: {\n      stroke: \"white\",\n      strokeWidth: 2,\n    },\n    minLabels: { fill: \"tomato\" },\n    maxLabels: { fill: \"orange\" },\n  }}\n/>\n```\n\n---\n\n### whiskerWidth\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `whiskerWidth` prop specifies how wide each whisker crosshair should be. If the `whiskerWidth` prop is not set, the width of the whisker crosshair will match the width of the box.\n\n```jsx live\n<VictoryChart\n  domainPadding={10}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBoxPlot\n    boxWidth={10}\n    whiskerWidth={5}\n    data={[\n      { x: 1, y: [1, 2, 3, 5] },\n      { x: 2, y: [3, 2, 8, 10] },\n      { x: 3, y: [2, 8, 6, 5] },\n      { x: 4, y: [1, 3, 2, 9] },\n    ]}\n  />\n</VictoryChart>\n```\n"
  },
  {
    "path": "website/docs/api/victory-brush-container.mdx",
    "content": "---\ntitle: VictoryBrushContainer\n---\n\nAdds the ability to highlight a region of a chart, and interact with highlighted regions.\n\n:::info\nFor examples of `VictoryBrushContainer` in action, visit the [Data Selection](/docs/guides/data-selection) guide.\n:::\n\n## Inherited Props\n\n<CommonProps\n  interfaces={[\"VictoryContainerProps\"]}\n/>\n\n## Component Props\n\n---\n\n### allowDrag\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n  <DefaultsBadge value=\"true\" />\n</Badges>\n\nThe optional `allowDrag` prop accepts a boolean that enables dragging behavior for the highlighted brush area. Resizing will still be enabled when the `allowDrag` prop is set to false.\n\n```jsx live\n<VictoryChart\n  containerComponent={\n    <VictoryBrushContainer\n      allowDrag={false}\n      brushDomain={{ x: [0.1, 0.3] }}\n    />\n  }\n  theme={VictoryTheme.clean}\n>\n  <VictoryLine />\n</VictoryChart>\n```\n\n---\n\n### allowDraw\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n  <DefaultsBadge value=\"true\" />\n</Badges>\n\nThe optional `allowDraw` prop accepts a boolean that enables drawing new brush areas. When this prop is set to false, existing brush areas may still be resized or dragged, but clicking outside of existing brush areas will not trigger the creation of new brush areas.\n\n```jsx live\n<VictoryChart\n  containerComponent={\n    <VictoryBrushContainer\n      allowDraw={false}\n      brushDomain={{ x: [0.1, 0.3] }}\n    />\n  }\n  theme={VictoryTheme.clean}\n>\n  <VictoryLine />\n</VictoryChart>\n```\n\n---\n\n### allowResize\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n  <DefaultsBadge value=\"true\" />\n</Badges>\n\nThe optional `allowResize` prop accepts a boolean that enables resizing the highlighted brush area. Dragging will still be enabled when the `allowResize` prop is set to false, but the dimensions of the brush area will be fixed. By default, when `allowResize` is set to false, clicking outside of the brush area will center the brush on the user's mouse position without resizing it. This behavior can be controlled via the [defaultBrushArea prop](/docs/api/victory-brush-container/#defaultbrusharea).\n\n```jsx live\n<VictoryChart\n  containerComponent={\n    <VictoryBrushContainer\n      allowResize={false}\n      brushDomain={{ x: [0.1, 0.3] }}\n    />\n  }\n  theme={VictoryTheme.clean}\n>\n  <VictoryLine />\n</VictoryChart>\n```\n\n---\n\n### brushComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<rect/>\" />\n</Badges>\n\nThe `brushComponent` prop specifies the component to be rendered for the highlighted area.\nThis component will be supplied with the following props: x, y, width, height, and style.\nWhen this prop is not specified, a `<rect/>` will be rendered.\n\n---\n\n### brushDimension\n\n<Badges>\n  <TypeBadge value='\"x\" || \"y\"' />\n  <DefaultsBadge value='\"x\"' />\n</Badges>\n\nWhen the `brushDimension` prop is set, brushing will only be specific to the given dimension\n(either \"x\" or \"y\"), and the entire domain of the other dimension will be highlighted. When this prop\nis not specified, highlighting will occur along both dimensions.\n\n---\n\n### brushDomain\n\n<Badges>\n  <TypeBadge value=\"{ x: [low, high], y: [low, high] }\" />\n</Badges>\n\nThe optional `brushDomain` prop describes the highlighted state. This prop is an object that\nspecifies separate arrays for `x` and `y`. Each array is a tuple that describes the minimum and maximum\nvalues to render. If this prop is not provided initially, the chart will render with the entire\ndomain highlighted. When this prop changes, the chart will render with a new highlighted domain.\n\n_example:_ `brushDomain={{x: [50, 100], y: [0, 100]}`\n\n---\n\n### brushStyle\n\n<Badges>\n  <TypeBadge value=\"React.CSSProperties\" />\n  <DefaultsBadge value='{stroke: \"transparent\", fill: \"black\", fillOpacity: 0.1}' />\n</Badges>\n\nThe `brushStyle` adds custom styles to the `brushComponent`.\n\n---\n\n### defaultBrushArea\n\n<Badges>\n  <TypeBadge value='\"all\" | \"none\" | \"disable\" | \"move\"' />\n</Badges>\n\nThe `defaultBrushArea` prop specifies how the container will behave when a region outside the active brush is clicked without selecting a new area. When the prop is set to \"all\", the entire domain will be selected. When the prop is set to \"none\", no new region will be selected, and any existing active brush will be cleared. When the prop is set to \"disable\" the new selected region will default to the current active brush. When this prop is set to \"move\", the active brush will be moved so that it is centered over the location of the click event.\n\n```jsx live\n<VictoryChart\n  containerComponent={\n    <VictoryBrushContainer\n      defaultBrushArea=\"disable\"\n      brushDomain={{ x: [0.1, 0.3] }}\n    />\n  }\n>\n  <VictoryLine />\n</VictoryChart>\n```\n\n---\n\n### disable\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n</Badges>\n\nWhen the `disable` prop is set to `true`, `VictoryBrushContainer` events will not fire.\n\n---\n\n### handleComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<rect/>\" />\n</Badges>\n\nThe `handleComponent` prop specifies the component to be rendered for each handle for the highlighted\narea. This component will be supplied with the following props: `x`, `y`, `width`, `height`, `cursor`, and `style`.\nWhen this prop is not specified, a `<rect/>` will be rendered.\n\n---\n\n### handleStyle\n\n<Badges>\n  <TypeBadge value=\"React.CSSProperties\" />\n  <DefaultsBadge value='{stroke: \"transparent\", fill: \"transparent\"}' />\n</Badges>\n\nThe `handleStyle` adds custom styles to the `handleComponents`. This prop should be given as\nan object of SVG style attributes.\n\nHandles refer to the region on each highlighted area where the area may be\nexpanded. Only handles relevant to the given `dimension` will be rendered. For example, when\n`brushDimension=\"x\"` only \"left\" and \"right\" handles will be rendered. Handles are automatically styled\nwith cursors appropriate to their orientation.\n\n---\n\n### handleWidth\n\n<Badges>\n  <TypeBadge value=\"number\" />\n  <DefaultsBadge value=\"8\" />\n</Badges>\n\nThe `handleWidth` prop specifies the size of the rendered handle component in pixels. This prop will determine the width of \"left\" and \"right\" handles and the height of \"top\" and \"bottom\" handles.\n\n---\n\n### onBrushCleared\n\n<Badges>\n  <TypeBadge value=\"function\" />\n</Badges>\n\nThe optional `onBrushCleared` prop accepts a function to be called when the active brush area is cleared. The function accepts the parameters of `domain` (the updated domain), and `props` (the props used by `VictoryBrushContainer`).\n\n_example:_ `onBrushCleared={(domain, props) => handleBrushCleared(domain, props)}`\n\n---\n\n### onBrushDomainChange\n\n<Badges>\n  <TypeBadge value=\"function\" />\n</Badges>\n\nThe optional `onBrushDomainChange` prop accepts a function to be called on each update to the highlighted domain. The function accepts the parameters of `domain` (the updated domain), and `props` (the props used by `VictoryBrushContainer`).\n\n_example:_ `onBrushDomainChange={(domain, props) => handleDomainChange(domain, props)}`\n\n---\n\n### onBrushDomainChangeEnd\n\n<Badges>\n  <TypeBadge value=\"function\" />\n</Badges>\n\nThe optional `onBrushDomainChangeEnd` prop accepts a function to be called only on mouse up events. The function accepts the parameters of `domain` (the updated domain), and `props` (the props used by `VictoryBrushContainer`).\n\n_example:_ `onBrushDomainChangeEnd={(domain, props) => handleDomainChangeEnd(domain, props)}`\n"
  },
  {
    "path": "website/docs/api/victory-brush-line.mdx",
    "content": "---\ntitle: VictoryBrushLine\n---\n\n`VictoryBrushLine` renders a brush component centered around a line. It may be used in place of the default `axisComponent` or `gridComponent` within `VictoryAxis`. Use `VictoryBrushLine` instead of [`VictoryBrushContainer`](/docs/api/victory-brush-container) in charts that require multiple brushes.\n\n```jsx live\n<VictoryChart\n  domainPadding={50}\n  theme={VictoryTheme.clean}\n>\n  <VictoryScatter\n    size={4}\n    data={[\n      { x: 1, y: 1 },\n      { x: 2, y: 2 },\n      { x: 3, y: 4 },\n    ]}\n  />\n  <VictoryAxis\n    tickValues={[1, 2, 3]}\n    gridComponent={\n      <VictoryBrushLine width={30} />\n    }\n  />\n</VictoryChart>\n```\n\n## Component Props\n\n---\n\n### allowDrag\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n  <DefaultsBadge value=\"true\" />\n</Badges>\n\nThe optional `allowDrag` prop accepts a boolean that enables dragging behavior for the highlighted brush area. Resizing will still be enabled when the `allowDrag` prop is set to false.\n\n---\n\n### allowResize\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n  <DefaultsBadge value=\"true\" />\n</Badges>\n\nThe optional `allowResize` prop accepts a boolean that enables resizing the highlighted brush area. Dragging will still be enabled when the `allowResize` prop is set to false, but the dimensions of the brush area will be fixed.\n\n---\n\n### brushAreaComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<Box/>\" />\n</Badges>\n\nThe `brushAreaComponent` prop specifies the component to be rendered for the interactive brush region.\nThis component will be supplied with the following props: x, y, width, height, and style.\nWhen this prop is not specified, a [`Box`](/docs/api/victory-primitives) component will be rendered.\n\n---\n\n### brushAreaStyle\n\n<Badges>\n  <TypeBadge value=\"VictoryStyleObject\" />\n</Badges>\n\nThe `brushAreaStyle` prop adds custom styles to the `brushAreaComponent`. This prop should be given as\nan object of SVG style attributes. Styles supplied to `brushAreaStyle` are assigned to the following default styles:\n\n```js\n{\n  stroke: \"none\",\n  fill: \"black\",\n  opacity: ({ active }) => active ? 0.2 : 0.1\n}\n```\n\n:::note\n`cursor` styles should not be applied via this prop, as they are dynamically assigned\n:::\n\n---\n\n### brushAreaWidth\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `brushAreaWidth` prop is used to specify the width of the interactive brush region. If this prop is not supplied, the `width` prop will be used.\n\n---\n\n### brushComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<Box/>\" />\n</Badges>\n\nThe `brushComponent` prop specifies the component to be rendered for the active brush.\nThis component will be supplied with the following props: x, y, width, height, and style.\nWhen this prop is not specified, a [`Box`](/docs/api/victory-primitives) component will be rendered.\n\n---\n\n### brushDomain\n\n<Badges>\n  <TypeBadge value=\"[low, high]\" />\n  <DefaultsBadge value=\"<Box/>\" />\n</Badges>\n\nThe optional `brushDomain` prop describes the highlighted state. This prop should be given as an array of the minimum and maximum values of the highlighted region.\n\n_example:_ `brushDomain={[50, 100]}`\n\n---\n\n### brushStyle\n\n<Badges>\n  <TypeBadge value=\"VictoryStyleObject\" />\n</Badges>\n\nThe `brushStyle` prop adds custom styles to the `brushComponent`. This prop should be given as\nan object of SVG style attributes. Styles supplied to `brushStyle` are assigned to the following default styles:\n\n```js\n{\n  pointerEvents: \"none\",\n  stroke: \"none\",\n  fill: \"black\",\n  opacity: ({ active }) => active ? 0.4 : 0.3\n}\n```\n\n---\n\n### brushWidth\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `brushWidth` prop is used to specify the width of the active brush. If this prop is not supplied, the `width` prop will be used.\n\n---\n\n### className\n\n<Badges>\n  <TypeBadge value=\"string\" />\n</Badges>\n\nThis prop specifies the class name that will be applied to the rendered element\n\n---\n\n### dimension\n\n<Badges>\n  <TypeBadge value='\"x\" || \"y\"' />\n</Badges>\n\nThe `dimension` prop specified whether the brush will be vertical (\"y\"), or horizontal (\"x\")\n\n---\n\n### disable\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n</Badges>\n\nWhen the `disable` prop is set to `true`, `VictoryBrushLine` events will not fire.\n\n---\n\n### events\n\n<Badges>\n  <TypeBadge value=\"any\" />\n</Badges>\n\nThe `events` prop specifies a set of events that will be attached to the brush component group. This prop should not be set manually.\n\n---\n\n### groupComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<g/>\" />\n</Badges>\n\nThis prop specifies the element used to group rendered elements\n\n---\n\n### handleComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<Box/>\" />\n</Badges>\n\nThe `handleComponent` prop specifies the component to be rendered for each handle.\nThis component will be supplied with the following props: x, y, width, height, and style.\nWhen this prop is not specified, a [`Box`](/docs/api/victory-primitives) component will be rendered.\n\n---\n\n### handleStyle\n\n<Badges>\n  <TypeBadge value=\"VictoryStyleObject\" />\n</Badges>\n\nThe `handleStyle` props adds custom styles to the `handleComponent`. This prop should be given as\nan object of SVG style attributes. Styles supplied to `handleStyle` are assigned to the following default styles:\n\n```js\n{\n  pointerEvents: \"none\",\n  stroke: \"none\",\n  fill: \"none\"\n}\n```\n\n---\n\n### handleWidth\n\n<Badges>\n  <TypeBadge value=\"number\" />\n  <DefaultsBadge value=\"10\" />\n</Badges>\n\nThe `handleWidth` prop is used to specify the width of each handle component.\n\n---\n\n### lineComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<Axis/>\" />\n</Badges>\n\nThe `lineComponent` prop specifies the component to render for the underlying axis or grid line.\nThis component will be supplied with the following props: x1, y1, x2, y2 and style.\nWhen this prop is not specified, an [`Axis`](/docs/api/victory-primitives) component will be rendered.\n\n---\n\n### onBrushDomainChange\n\n<Badges>\n  <TypeBadge value=\"function\" />\n</Badges>\n\nThe `onBrushDomainChange` prop specifies a callback function which will be called whenever the brush domain changes. The callback provided will be called with the following arguments:\n\n- `currentDomain`: The current brush domain\n- `props`: the current set of props for `VictoryBrushLine`\n\n---\n\n### scale\n\n<Badges>\n  <TypeBadge value=\"object\" />\n</Badges>\n\nThis prop specifies `scale` of the parent chart with `domain` and `range` applied. This prop should not be set manually.\n\n---\n\n### style\n\n<Badges>\n  <TypeBadge value=\"object\" />\n</Badges>\n\nThe `style` prop specifies the styles that will be applied to the `lineComponent`. This prop should be given as\nan object of SVG style attributes.\n\n---\n\n### type\n\n<Badges>\n  <TypeBadge value=\"string\" />\n</Badges>\n\nThe `type` is used to specify which event target a particular `VictoryBrushLine` belongs to. When `VictoryBrushLine` is used by `VictoryAxis` as its `axisComponent` or `gridComponent`, this prop will be set automatically to \"axis\" or \"grid\" as appropriate.\n\n---\n\n### width\n\n<Badges>\n  <TypeBadge value=\"number\" />\n  <DefaultsBadge value=\"10\" />\n</Badges>\n\nThe `width` prop specified the width of both the `brush` and `brushArea`. When `brushWidth` or `brushAreaWidth` are specified, this prop will not be used\n"
  },
  {
    "path": "website/docs/api/victory-candlestick.mdx",
    "content": "---\ntitle: VictoryCandlestick\n---\n\n:::info\nFor examples of `VictoryCandlestick` in action, visit the [Candlestick](/docs/charts/candlestick) examples.\n:::\n\n## Inherited Props\n\n<CommonProps\n  interfaces={[\n    \"VictoryCommonProps\",\n    \"VictoryDatableProps\",\n    \"VictoryMultiLabelableProps\",\n    \"VictoryEventProps\",\n  ]}\n  overrides={[\"labels\"]}\n  notImplemented={[\"polar\"]}\n/>\n\n## Component Props\n\n---\n\n### candleColors\n\n<Badges>\n  <TypeBadge value=\"{ positive: string, negative: string }\" />\n  <DefaultsBadge value=\"provided by theme\" />\n</Badges>\n\nCandle colors are significant in candlestick charts, with colors indicating whether a market closed higher than it opened (positive), or closed lower than it opened (negative). The `candleColors` prop should be given as an object with color strings specified for positive and negative.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n  domainPadding={{ x: 25 }}\n>\n  <VictoryCandlestick\n    candleColors={{\n      positive: \"#5f5c5b\",\n      negative: \"#c43a31\",\n    }}\n    data={sampleDataDates}\n  />\n</VictoryChart>\n```\n\n---\n\n### candleRatio\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `candleRatio` prop specifies an _approximate_ ratio between candle widths and spaces between candles. When width is not specified via the `candleWidth` prop or in candle styles, the `candleRatio` prop will be used to calculate a default width for each candle given the total number of candles in the data series and the overall width of the chart.\n\n```jsx live\n<VictoryCandlestick\n  candleRatio={0.8}\n  data={sampleDataDates}\n/>\n```\n\n---\n\n### candleWidth\n\n<Badges>\n  <TypeBadge value=\"number | Function\" />\n</Badges>\n\nThe `candleWidth` prop is used to specify the width of each candle. This prop may be given as a number of pixels or as a function that returns a number. When this prop is given as a function, it will be evaluated with a single argument: an object containing all the props passed to the `Candle` component. When this value is not given, a default value will be calculated based on the overall dimensions of the chart, and the number of candles.\n\n:::note\nIt is still possible to define candle width via the style prop with the `width` attribute, but `candleWidth` will take precedence.\n:::\n\n```jsx live\n<VictoryCandlestick\n  candleWidth={55}\n  data={sampleDataDates}\n/>\n```\n\n---\n\n### close\n\n<Badges>\n  <TypeBadge value=\"string | integer | string[] | Function\" />\n</Badges>\n\nUse `close` data accessor prop to define the close value of a candle.\n\n**string:** specify which property in an array of data objects should be used as the close value\n\n_examples:_ `close=\"closing_value\"`\n\n**function:** use a function to translate each element in a data array into a close value\n\n_examples:_ `close={() => 10}`\n\n**array index:** specify which index of an array should be used as a close value when data is given as an array of arrays\n\n_examples:_ `close={1}`\n\n**path string or path array:** specify which property in an array of nested data objects should be used as a close value\n\n_examples:_ `close=\"bonds.close\"`, `close={[\"bonds\", \"close\"]}`\n\n---\n\n### closeLabelComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<VictoryLabel/>\" />\n</Badges>\n\nThe `closeLabelComponent` prop takes a component instance which will be used to render the label corresponding to the close value for each candle. The new element created from the passed `closeLabelComponent` will be supplied with the following props: `x`, `y`, `datum`, `index`, `scale`, `verticalAnchor`, `textAnchor`, `angle`, `transform`, `style` and `events`. Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If `closeLabelComponent` is omitted, a new [`VictoryLabel`](/docs/api/victory-label) will be created with props described above.\n\n```jsx live\n<VictoryCandlestick\n  data={sampleDataDates}\n  closeLabels\n  closeLabelComponent={\n    <VictoryLabel\n      dx={-30}\n      textAnchor=\"middle\"\n    />\n  }\n/>\n```\n\n---\n\n### closeLabels\n\n<Badges>\n  <TypeBadge value=\"array | Function | boolean\" />\n</Badges>\n\nThe `closeLabels` prop defines the labels that will correspond to the close value for each candle. This prop should be given as a boolean, an array or as a function of the props corresponding to that label. When given as a boolean value, the max value of each datum will be used for the label.\n\n_examples:_\n\n- `closeLabels`\n- `closeLabels={[\"first\", \"second\", \"third\"]}`\n- `closeLabels={({ datum }) => Math.round(datum.close)}`\n\n---\n\n### data\n\n<Badges>\n  <TypeBadge value=\"any[]\" />\n</Badges>\n\n:::caution\nThis property is not currently typed, but requires a specific data format. We are working on adding more specific types to this prop.\n:::\n\nSpecify data via the data prop. By default, `VictoryCandlestick` expects data as an array of objects with `x`, `open`, `close`, `high`, and `low` keys. Use the `x`, `open`, `close`, `high`, and `low` data accessor props to specify custom data formats.\n\n```jsx live\n<VictoryCandlestick\n  data={[\n    {\n      x: new Date(2016, 6, 1),\n      open: 5,\n      close: 10,\n      high: 15,\n      low: 0,\n    },\n    {\n      x: new Date(2016, 6, 2),\n      open: 10,\n      close: 15,\n      high: 20,\n      low: 5,\n    },\n    {\n      x: new Date(2016, 6, 3),\n      open: 15,\n      close: 20,\n      high: 22,\n      low: 10,\n    },\n    {\n      x: new Date(2016, 6, 4),\n      open: 20,\n      close: 10,\n      high: 25,\n      low: 7,\n    },\n    {\n      x: new Date(2016, 6, 5),\n      open: 10,\n      close: 8,\n      high: 15,\n      low: 5,\n    },\n  ]}\n/>\n```\n\n---\n\n### eventKey\n\n<Badges>\n  <TypeBadge value=\"string | integer | string[] | Function\" />\n</Badges>\n\n`VictoryCandlestick` uses the standard `eventKey` prop to specify how event targets are addressed. **This prop is not commonly used.** [Read about the `eventKey` prop in more detail here](/docs/guides/events)\n\n---\n\n### events\n\n<Badges>\n  <TypeBadge value=\"object[]\" />\n</Badges>\n\n`VictoryCandlestick` uses the standard `events` prop. [Read about it here](/docs/guides/events)\n\nSee the [Events Guide][] for more information on defining events.\n\n```jsx live\n<div>\n  <h3>Click Me</h3>\n  <VictoryCandlestick\n    events={[\n      {\n        target: \"data\",\n        eventHandlers: {\n          onClick: () => {\n            return [\n              {\n                target: \"data\",\n                mutation: (props) => {\n                  const fill =\n                    props.style &&\n                    props.style.fill;\n                  return fill ===\n                    \"#c43a31\"\n                    ? null\n                    : {\n                        style: {\n                          fill: \"#c43a31\",\n                        },\n                      };\n                },\n              },\n            ];\n          },\n        },\n      },\n    ]}\n    data={sampleDataDates}\n  />\n</div>\n```\n\n---\n\n### high\n\n<Badges>\n  <TypeBadge value=\"string | integer | string[] | Function\" />\n</Badges>\n\nUse `high` data accessor prop to define the high value of a candle.\n\n**string:** specify which property in an array of data objects should be used as the high value\n\n_examples:_ `high=\"highest_value\"`\n\n**function:** use a function to translate each element in a data array into a high value\n\n_examples:_ `high={() => 10}`\n\n**array index:** specify which index of an array should be used as a high value when data is given as an array of arrays\n\n_examples:_ `high={1}`\n\n**path string or path array:** specify which property in an array of nested data objects should be used as a high value\n\n_examples:_ `high=\"bonds.high\"`, `high={[\"bonds\", \"high\"]}`\n\n---\n\n### highLabelComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<VictoryLabel/>\" />\n</Badges>\n\nThe `highLabelComponent` prop takes a component instance which will be used to render the label corresponding to the highest value for each candle. The new element created from the passed `highLabelComponent` will be supplied with the following props: `x`, `y`, `datum`, `index`, `scale`, `verticalAnchor`, `textAnchor`, `angle`, `transform`, `style` and `events`. Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If `highLabelComponent` is omitted, a new [`VictoryLabel`](/docs/api/victory-label) will be created with props described above.\n\nSee the [Custom Components Guide][] for more detail on creating your own components\n\n```jsx\nhighLabelComponent={<VictoryLabel dy={20}/>}\n```\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryCandlestick\n    data={sampleDataDates}\n    highLabels\n    highLabelComponent={\n      <VictoryLabel\n        dx={-10}\n        textAnchor=\"middle\"\n      />\n    }\n  />\n</VictoryChart>\n```\n\n---\n\n### highLabels\n\n<Badges>\n  <TypeBadge value=\"array | Function | boolean\" />\n</Badges>\n\nThe `highLabels` prop defines the labels that will correspond to the high value for each candle. This prop should be given as a boolean, an array or as a function of the props corresponding to that label. When given as a boolean value, the max value of each datum will be used for the label.\n\n_examples:_\n\n- `highLabels`\n- `highLabels={[\"first\", \"second\", \"third\"]}`\n- `highLabels={({ datum }) => Math.round(datum.high)}`\n\n---\n\n### labelOrientation\n\n<Badges>\n  <TypeBadge value='\"top\" | \"bottom\" | \"left\" | \"right\" | { open, close, low, high }' />\n</Badges>\n\nThe `labelOrientation` prop determines where a label should be placed in relation to the candle it corresponds to. This prop may be given as \"top\", \"bottom\", \"left\", \"right\", or as an object with an option defined for some or all of the labels.\n\n```jsx live\n<VictoryCandlestick\n  data={sampleDataDates}\n  closeLabels={() => \"close\"}\n  highLabels={() => \"high\"}\n  lowLabels={() => \"low\"}\n  openLabels={() => \"open\"}\n  style={{ labels: { padding: 4 } }}\n  labelOrientation={{\n    close: \"right\",\n    open: \"right\",\n    high: \"top\",\n    low: \"bottom\",\n  }}\n/>\n```\n\n---\n\n### labels\n\n<Badges>\n  <TypeBadge value=\"array | Function\" />\n</Badges>\n\nThe `labels` prop defines the label associated with the candle. This prop is typically given as a function.\n\n```jsx live\n<VictoryCandlestick\n  data={sampleDataDates}\n  labels={({ datum }) =>\n    `open: ${datum.open}`\n  }\n  theme={VictoryTheme.clean}\n/>\n```\n\n---\n\n### low\n\n<Badges>\n  <TypeBadge value=\"string | integer | string[] | Function\" />\n</Badges>\n\nUse `low` data accessor prop to define the low value of a candle.\n\n**string:** specify which property in an array of data objects should be used as the low value\n\n_examples:_ `low=\"lowest_value\"`\n\n**function:** use a function to translate each element in a data array into a low value\n\n_examples:_ `low={() => 10}`\n\n**array index:** specify which index of an array should be used as a low value when data is given as an array of arrays\n\n_examples:_ `low={1}`\n\n**path string or path array:** specify which property in an array of nested data objects should be used as a low value\n\n_examples:_ `low=\"bonds.low\"`, `low={[\"bonds\", \"low\"]}`\n\n---\n\n### lowLabelComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<VictoryLabel/>\" />\n</Badges>\n\nThe `lowLabelComponent` prop takes a component instance which will be used to render the label corresponding to the lowest value for each candle. The new element created from the passed `lowLabelComponent` will be supplied with the following props: `x`, `y`, `datum`, `index`, `scale`, `verticalAnchor`, `textAnchor`, `angle`, `transform`, `style` and `events`. Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If `lowLabelComponent` is omitted, a new [`VictoryLabel`](/docs/api/victory-label) will be created with props described above.\n\n```jsx live\n<VictoryCandlestick\n  data={sampleDataDates}\n  lowLabels\n  lowLabelComponent={\n    <VictoryTooltip pointerLength={0} />\n  }\n  events={[\n    {\n      target: \"data\",\n      eventHandlers: {\n        onMouseOver: () => ({\n          target: \"lowLabels\",\n          mutation: () => ({\n            active: true,\n          }),\n        }),\n        onMouseOut: () => ({\n          target: \"lowLabels\",\n          mutation: () => ({\n            active: false,\n          }),\n        }),\n      },\n    },\n  ]}\n/>\n```\n\n---\n\n### lowLabels\n\n<Badges>\n  <TypeBadge value=\"array | Function | boolean\" />\n</Badges>\n\nThe `lowLabels` prop defines the labels that will correspond to the low value for each candle. This prop should be given as a boolean, an array or as a function of the props corresponding to that label. When given as a boolean value, the max value of each datum will be used for the label.\n\n_examples:_\n\n- `lowLabels`\n- `lowLabels={[\"first\", \"second\", \"third\"]}`\n- `lowLabels={({ datum }) => Math.round(datum.low)}`\n\n---\n\n### open\n\n<Badges>\n  <TypeBadge value=\"string | integer | string[] | Function\" />\n</Badges>\n\nUse `open` data accessor prop to define the open value of a candle.\n\n**string:** specify which property in an array of data objects should be used as the open value\n\n_examples:_ `open=\"opening_value\"`\n\n**function:** use a function to translate each element in a data array into an open value\n\n_examples:_ `open={() => 10}`\n\n**array index:** specify which index of an array should be used as an open value when data is given as an array of arrays\n\n_examples:_ `open={1}`\n\n**path string or path array:** specify which property in an array of nested data objects should be used as an open value\n\n_examples:_ `open=\"bonds.open\"`, `open={[\"bonds\", \"open\"]}`\n\n---\n\n### openLabelComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<VictoryLabel/>\" />\n</Badges>\n\nThe `openLabelComponent` prop takes a component instance which will be used to render the label corresponding to the open value for each candle. The new element created from the passed `openLabelComponent` will be supplied with the following props: `x`, `y`, `datum`, `index`, `scale`, `verticalAnchor`, `textAnchor`, `angle`, `transform`, `style` and `events`. Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If `openLabelComponent` is omitted, a new [`VictoryLabel`](/docs/api/victory-label) will be created with props described above.\n\n```jsx live\n<VictoryCandlestick\n  data={sampleDataDates}\n  openLabels\n  openLabelComponent={\n    <VictoryLabel\n      dx={-30}\n      textAnchor=\"middle\"\n    />\n  }\n/>\n```\n\n---\n\n### openLabels\n\n<Badges>\n  <TypeBadge value=\"array | Function | boolean\" />\n</Badges>\n\nThe `openLabels` prop defines the labels that will correspond to the open value for each candle. This prop should be given as a boolean, an array or as a function of the props corresponding to that label. When given as a boolean value, the max value of each datum will be used for the label.\n\n_examples:_\n\n- `openLabels`\n- `openLabels={[\"first\", \"second\", \"third\"]}`\n- `openLabels={({ datum }) => Math.round(datum.open)}`\n\n---\n\n### style\n\n<Badges>\n  <TypeBadge value=\"VictoryCandlestickStyleInterface\" />\n</Badges>\n\nThe `style` prop defines the style of the component. The style prop should be given as an object with styles defined for `parent`, `data`, `labels`, `closeLabels`, `highLabels`,`lowLabels`, and `openLabels`. Any valid svg styles are supported, but `width`, `height`, and `padding` should be specified via props as they determine relative layout for components in VictoryChart. Functional styles may be defined for style properties, and they will be evaluated with the props corresponding to each element.\n\n:::note\nWhen a component is rendered as a child of another Victory component, or within a custom `<svg>` element with `standalone={false}` parent styles will be applied to the enclosing `<g>` tag. Many styles that can be applied to a parent `<svg>` will not be expressed when applied to a `<g>`.\n:::\n\n```jsx live\n<VictoryCandlestick\n  data={sampleDataDates}\n  labels={() => \"labels\"}\n  closeLabels={() => \"close\"}\n  highLabels={() => \"high\"}\n  lowLabels={() => \"low\"}\n  openLabels={() => \"open\"}\n  style={{\n    data: {\n      fill: \"#c43a31\",\n      fillOpacity: 0.7,\n      stroke: \"#c43a31\",\n      strokeWidth: 3,\n    },\n    labels: {\n      fill: \"tomato\",\n      padding: 2,\n    },\n    closeLabels: {\n      fill: \"orange\",\n      padding: 2,\n    },\n    highLabels: {\n      fill: \"blue\",\n      padding: 2,\n    },\n    lowLabels: {\n      fill: \"teal\",\n      padding: 2,\n    },\n    openLabels: {\n      fill: \"green\",\n      padding: 2,\n    },\n  }}\n/>\n```\n\n---\n\n### wickStrokeWidth\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nWhen the `wickStrokeWidth` prop is set, this value will be used to determine the stroke width for the candle wick. When this prop is not set, the `strokeWidth` set by the `style` prop will apply to both the candle and the wick.\n"
  },
  {
    "path": "website/docs/api/victory-canvas.mdx",
    "content": "---\ntitle: VictoryCanvas\n---\n\nThe `victory-canvas` package currently provides a set of *experimental* primitive components that will allow Victory to render data in a Canvas container rather than as an SVG.\n\n:::danger\nThis API should not be used in production and only serves as an experiment.\n:::\n\n## Container Components\n\n### CanvasGroup\n\nThis component is designed to be used as the `groupComponent` for any chart type to enable Canvas rendering. This component will create a `<canvas />` HTML component, and allow other child components to access the Canvas context via React context.\n\n```jsx\nconst MyLine = (props) => (\n  <VictoryLine groupComponent={<CanvasGroup />} {...props} />\n);\n```\n\n## Primitive Components\n\nEach of these primitive components depends on the Canvas context that it gets through the `useCanvasContext` React hook. Rather than returning a React component, they render elements to the screen through the Canvas context.\n\n### CanvasPoint\n\nDesigned to be used with `VictoryScatter`, this component mimics the behavior of `Point`.\n\n```jsx\nconst MyScatter = (props) => (\n  <VictoryScatter\n    groupComponent={<CanvasGroup />}\n    dataComponent={<CanvasPoint />}\n    {...props}\n  />\n);\n```\n\n**Props**\n\n- `active` _boolean_ a flag signifying whether the component is active\n- `data` _array_ the entire dataset\n- `datum` _object_ the data point corresponding to this point\n- `events` _object_ events to attach to the rendered element\n- `getPath` _function_ a function of `x`, `y`, and `size` that returns a path string. When this optional function is provided, it will be used to calculate a path, rather than one of the path functions corresponding to the `symbol`s supported by `Point`.\n- `index` _number_ the index of this point within the dataset\n- `origin` _object_ the svg coordinates of the center point of a polar chart\n- `polar` _boolean_ a flag specifying whether the component is part of a polar chart\n- `scale` _object_ the x and y scale of the parent chart with `domain` and `range` applied\n- `size` _number or function_ the size of the point. When this prop is given as a function, it will be called with the rest of the props supplied to `Point`.\n- `style` _object_ the styles to apply to the rendered element\n- `symbol` _\"circle\", \"cross\", \"diamond\", \"plus\", \"minus\", \"square\", \"star\", \"triangleDown\", \"triangleUp\"_ which symbol the point should render. This prop may also be given as a function that returns one of the above options. When this prop is given as a function, it will be called with the rest of the props supplied to `Point`.\n- `transform` _string_ a transform that will be supplied to elements this component renders\n- `x` _number_ the x coordinate of the center of the point\n- `y` _number_ the y coordinate of the center of the point\n\n### CanvasCurve\n\nDesigned to be used with [VictoryLine][], this component mimics the behavior of `Curve`.\n\n```jsx\nconst MyLine = (props) => (\n  <VictoryLine\n    groupComponent={<CanvasGroup />}\n    dataComponent={<CanvasLine />}\n    {...props}\n  />\n);\n```\n\n**Props**\n\n- `active` _boolean_ a flag signifying whether the component is active\n- `data` _array_ the entire dataset used to define the curve\n- `events` _object_ events to attach to the rendered element\n- `interpolation` _string or function_ the interpolation to use when calculating a path\n- `origin` _object_ the svg coordinates of the center point of a polar chart\n- `polar` _boolean_ a flag specifying whether the component is part of a polar chart\n- `role` _string_ the aria role to assign to the element\n- `scale` _object_ the x and y scale of the parent chart with `domain` and `range` applied\n- `style` _object_ the styles to apply to the rendered element\n- `transform` _string_ a transform that will be supplied to elements this component renders\n\n### CanvasBar\n\nDesigned to be used with `VictoryBar`, this component mimics the behavior of `Bar`.\n\n```jsx\nconst Bar = (props) => (\n  <VictoryBar\n    groupComponent={<CanvasGroup />}\n    dataComponent={<CanvasBar />}\n    {...props}\n  />\n);\n```\n\n**Props**\n\n- `active` _boolean_ a flag signifying whether the component is active\n- `alignment` \\*\"start\", \"middle\", or \"end\" specifies how a bar path should be aligned in relation to its data point\n- `barRatio` _number_ a number between zero and one that will be used to calculate bar width when an explicit width is not given\n- `barWidth` _number or function_ A prop defining the width of the bar. When this prop is given as a function, it will be called with the rest of the props supplied to `Bar`.\n- `cornerRadius` _number, function or object_ the number of pixels of corner radius to apply when calculating a bar path. When this prop is given as a function, it will be called with the rest of the props supplied to `Bar`. When given as an object, this prop may include values for top, bottom, topLeft, topRight, bottomLeft and bottomRight, with more specific values overriding less specific values\n- `data` _array_ the entire dataset\n- `datum` _object_ the data point corresponding to this bar\n- `events` _object_ events to attach to the rendered element\n- `index` _number_ the index of this bar within the dataset\n- `origin` _object_ the svg coordinates of the center point of a polar chart\n- `polar` _boolean_ a flag specifying whether the component is part of a polar chart\n- `scale` _object_ the x and y scale of the parent chart with `domain` and `range` applied\n- `style` _object_ the styles to apply to the rendered element\n- `transform` _string_ a transform that will be supplied to elements this component renders\n- `width` _number_ the width of parent chart (used to calculate default bar width `style.width` is not supplied)\n- `x` _number_ the x coordinate of the top of the bar\n- `y0` _number_ the y coordinate of the baseline of the bar\n- `y` _number_ the y coordinate of the top of the bar\n"
  },
  {
    "path": "website/docs/api/victory-chart.mdx",
    "content": "---\ntitle: VictoryChart\n---\n\n## Inherited Props\n\n<CommonProps\n  interfaces={[\n    \"VictoryCommonProps\",\n    \"VictoryEventProps\",\n  ]}\n/>\n\n---\n\n### backgroundComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n</Badges>\n\nThe `backgroundComponent` prop takes a component instance which will be responsible for rendering a background if the `VictoryChart`'s `style` component includes `background` styles. The new element created from the passed `backgroundComponent` will be provided with the following properties calculated by `VictoryChart`: `height`, `polar`, `scale`, `style`, `x`, `y`, `width`. All of these props on `Background` should take precedence over what `VictoryChart` is trying to set.\n\n```jsx live\n<VictoryChart\n  height={300}\n  width={300}\n  domain={[-1, 1]}\n  style={{\n    background: { fill: \"lightblue\" },\n  }}\n  backgroundComponent={\n    <Background y={20} height={100} />\n  }\n  theme={VictoryTheme.clean}\n/>\n```\n\n---\n\n### children\n\n<Badges>\n  <TypeBadge value=\"ReactElement | ReactElement[]\" />\n</Badges>\n\n`VictoryChart` works with any combination of the following children: [VictoryArea][], [VictoryAxis][] / [VictoryPolarAxis][], [VictoryBar][], [VictoryCandlestick][], [VictoryErrorBar][], [VictoryGroup][], [VictoryLine][], [VictoryScatter][], [VictoryHistogram][], [VictoryStack][], and [VictoryVoronoi][]. Children supplied to `VictoryChart` will be cloned and rendered with new props so that all children share common props such as `domain` and `scale`.\n\n:::note\npolar charts must use `VictoryPolarAxis` rather than `VictoryAxis`\n:::\n\n---\n\n### containerComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n</Badges>\n\n`VictoryChart` uses the standard `containerComponent` prop. [Read about it in detail here](/docs/api/victory-common-theme-props/#containercomponent)\n\n```jsx\ncontainerComponent={<VictoryVoronoiContainer/>}\n```\n\n---\n\n### desc\n\n<Badges>\n  <TypeBadge value=\"string\" />\n</Badges>\n\nThe `desc` prop specifies the description of the chart/SVG to assist with accessibility for screen readers. The more descriptive this title is, the more useful it will be for people using screen readers.\n\n---\n\n### defaultAxes\n\n<Badges>\n  <TypeBadge value=\"{ independent: ReactElement; dependent: ReactElement }\" />\n</Badges>\n\nSet the default axis for this chart when no axis is provided. Allows you to customize the axis component for the chart.\n\n:::note\nThis property is not typically used\n:::\n\n```ts\n// default\ndefaultAxes = {\n  independent: <VictoryAxis />,\n  dependent: <VictoryAxis dependentAxis />\n}\n```\n\n### defaultPolarAxes\n\n<Badges>\n  <TypeBadge value=\"{ independent: ReactElement; dependent: ReactElement }\" />\n</Badges>\n\nSet the default axis for this chart when no axis is provided. Allows you to customize the axis component for the chart.\n\n:::note\nThis property is not typically used\n:::\n\n```ts\n// default\ndefaultPolarAxes ={\n  independent: <VictoryPolarAxis />,\n  dependent: <VictoryPolarAxis dependentAxis />\n}\n```\n\n---\n\n### domain\n\n<Badges>\n  <TypeBadge value=\"array[low, high] || { x: [low, high], y: [low, high] }\" />\n  <DefaultsBadge value=\"calculated from data\" />\n</Badges>\n\nThe `domain` prop describes the range of data the component will include. This prop can be given as an array of the minimum and maximum expected values of the data or as an object that specifies separate arrays for x and y. If this prop is not provided, a domain will be calculated from data, or other available information.\n\n:::note\n`VictoryChart` controls the `domain` prop of its children.\n:::\n\n---\n\n### endAngle\n\n<Badges>\n  <TypeBadge value=\"number\" />\n  <DefaultsBadge value=\"360\" />\n</Badges>\n\nThe `endAngle` props defines the overall end angle of a polar chart in degrees. This prop is used in conjunction with `startAngle` to create polar chart that spans only a segment of a circle, or to change overall rotation of the chart. This prop should be given as a number of degrees. Degrees are defined as starting at the 3 o'clock position, and proceeding counterclockwise.\n\n```jsx live\n<div>\n  <VictoryChart\n    polar\n    theme={VictoryTheme.clean}\n    startAngle={90}\n    endAngle={450}\n  >\n    <VictoryPolarAxis\n      tickValues={[\n        0, 45, 90, 135, 180, 225, 270,\n        315,\n      ]}\n      labelPlacement=\"vertical\"\n    />\n    <VictoryBar\n      style={{ data: { width: 30 } }}\n      data={[\n        { x: 0, y: 2 },\n        { x: 60, y: 3 },\n        { x: 120, y: 5 },\n        { x: 180, y: 4 },\n        { x: 240, y: 4 },\n        { x: 300, y: 4 },\n      ]}\n    />\n  </VictoryChart>\n\n  <VictoryChart\n    polar\n    theme={VictoryTheme.clean}\n    startAngle={0}\n    endAngle={180}\n  >\n    <VictoryPolarAxis\n      tickValues={[0, 45, 90, 135, 180]}\n      labelPlacement=\"vertical\"\n    />\n    <VictoryBar\n      style={{ data: { width: 30 } }}\n      data={[\n        { x: 0, y: 2 },\n        { x: 45, y: 3 },\n        { x: 90, y: 5 },\n        { x: 135, y: 4 },\n        { x: 180, y: 7 },\n      ]}\n    />\n  </VictoryChart>\n</div>\n```\n\n---\n\n### events\n\n<Badges>\n  <TypeBadge value=\"any[]\" />\n</Badges>\n\n`VictoryChart` uses the standard `events` prop. [Read about it in more detail here](/docs/guides/events)\n\nSee the [Events Guide][] for more information on defining events.\n\n:::note\n`VictoryChart` coordinates events between children using the `VictorySharedEvents` and the `sharedEvents` prop\n:::\n\n```jsx live\n<VictoryChart\n  events={[\n    {\n      childName: \"all\",\n      target: \"data\",\n      eventHandlers: {\n        onClick: () => {\n          return [\n            {\n              childName: \"area-2\",\n              target: \"data\",\n              mutation: (props) => ({\n                style: Object.assign(\n                  {},\n                  props.style,\n                  { fill: \"gold\" },\n                ),\n              }),\n            },\n            {\n              childName: \"area-3\",\n              target: \"data\",\n              mutation: (props) => ({\n                style: Object.assign(\n                  {},\n                  props.style,\n                  { fill: \"orange\" },\n                ),\n              }),\n            },\n            {\n              childName: \"area-4\",\n              target: \"data\",\n              mutation: (props) => ({\n                style: Object.assign(\n                  {},\n                  props.style,\n                  { fill: \"red\" },\n                ),\n              }),\n            },\n          ];\n        },\n      },\n    },\n  ]}\n  theme={VictoryTheme.clean}\n>\n  <VictoryStack>\n    <VictoryArea\n      name=\"area-1\"\n      data={sampleData}\n    />\n    <VictoryArea\n      name=\"area-2\"\n      data={sampleData}\n    />\n    <VictoryArea\n      name=\"area-3\"\n      data={sampleData}\n    />\n    <VictoryArea\n      name=\"area-4\"\n      data={sampleData}\n    />\n  </VictoryStack>\n</VictoryChart>\n```\n\n---\n\n### innerRadius\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nWhen the `innerRadius` prop is set, polar charts will be hollow rather than circular.\n\n```jsx live\n<VictoryChart\n  polar\n  theme={VictoryTheme.clean}\n>\n  <VictoryPolarAxis />\n  <VictoryPolarAxis\n    dependentAxis\n    tickValues={[1, 3, 5]}\n    axisAngle={40}\n  />\n  <VictoryBar\n    data={sampleData}\n    style={{ data: { width: 30 } }}\n  />\n</VictoryChart>\n```\n\n---\n\n### prependDefaultAxes\n\n<Badges>\n  <TypeBadge value=\"number\" />\n  <DefaultsBadge value=\"true\" />\n</Badges>\n\nBy default, `VictoryChart` will prepend default axes to the beginning of the children array. This behavior can be disabled by setting `prependDefaultAxes` to `false`.\n\n---\n\n### startAngle\n\n<Badges>\n  <TypeBadge value=\"number\" />\n  <DefaultsBadge value=\"0\" />\n</Badges>\n\nThe `startAngle` props defines the overall start angle of a polar chart in degrees. This prop is used in conjunction with `endAngle` to create polar chart that spans only a segment of a circle, or to change overall rotation of the chart. This prop should be given as a number of degrees. Degrees are defined as starting at the 3 o'clock position, and proceeding counterclockwise.\n\n```jsx live\n<div>\n  <VictoryChart\n    polar\n    theme={VictoryTheme.clean}\n    startAngle={90}\n    endAngle={450}\n  >\n    <VictoryPolarAxis\n      tickValues={[\n        0, 45, 90, 135, 180, 225, 270,\n        315,\n      ]}\n      labelPlacement=\"vertical\"\n    />\n    <VictoryBar\n      data={[\n        { x: 0, y: 2 },\n        { x: 60, y: 3 },\n        { x: 120, y: 5 },\n        { x: 180, y: 4 },\n        { x: 240, y: 4 },\n        { x: 300, y: 4 },\n      ]}\n    />\n  </VictoryChart>\n\n  <VictoryChart\n    polar\n    theme={VictoryTheme.clean}\n    startAngle={0}\n    endAngle={180}\n  >\n    <VictoryPolarAxis\n      tickValues={[0, 45, 90, 135, 180]}\n      labelPlacement=\"vertical\"\n    />\n    <VictoryBar\n      data={[\n        { x: 0, y: 2 },\n        { x: 45, y: 3 },\n        { x: 90, y: 5 },\n        { x: 135, y: 4 },\n        { x: 180, y: 7 },\n      ]}\n    />\n  </VictoryChart>\n</div>\n```\n\n---\n\n### style\n\n<Badges>\n  <TypeBadge value=\"VictoryStyleInterface\" />\n  <DefaultsBadge value=\"(provided by theme)\" />\n</Badges>\n\nDefines the style of the component using [VictoryStyleInterface](/docs/api/victory-style-interface).\n\nnote: custom valid svg style properties that are supported may be included in `background` styles.\n\n_default (provided by default theme):_ See [grayscale theme][] for more detail\n\n```jsx live\n<VictoryChart\n  style={{\n    parent: {\n      border: \"1px solid #ccc\",\n    },\n    background: {\n      fill: \"pink\",\n    },\n  }}\n/>\n```\n\n---\n\n### title\n\n<Badges>\n  <TypeBadge value=\"string\" />\n</Badges>\n\nThe `title` prop specifies the title to be applied to the SVG to assist with accessibility for screen readers. The more descriptive this title is, the more useful it will be for people using screen readers\n"
  },
  {
    "path": "website/docs/api/victory-clip-container.mdx",
    "content": "---\ntitle: VictoryClipContainer\n---\n\nEnables curtain-style transitions for continuous data types like `VictoryLine` and `VictoryArea`. `VictoryClipContainer` will render its children either in a regular `<g>` element, or in a `<g>` element clipped by a rectangular clip path when a `clipWidth` is supplied.\n\n:::info\nFor examples of `VictoryClipContainer` in action, visit the [containers](/docs/guides/containers) guide.\n:::\n\n## Component Props\n\n---\n\n### children\n\n<Badges>\n  <TypeBadge value=\"ReactElement | ReactElement[]\" />\n</Badges>\n\n`VictoryClipContainer` renders a single child, or an array of children in group element.\n\n---\n\n### circleComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<Circle/>\" />\n</Badges>\n\nThe `circleComponent` prop specifies the element to use when a `VictoryClipContainer` renders a circular clip path. By default, `VictoryClipContainer` uses the [Circle](/docs/api/victory-primitives#circle) component.\n\n---\n\n### className\n\n<Badges>\n  <TypeBadge value=\"string\" />\n</Badges>\n\nThe `className` prop specifies a class name that will be applied to the rendered element.\n\n---\n\n### clipHeight\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `clipHeight` prop determines the base height of the rectangular clip path. This prop should be\ngiven as a number. If this prop is not given, it will be calculated based on the height and padding\nof the parent chart.\n\n---\n\n### clipId\n\n<Badges>\n  <TypeBadge value=\"string | number\" />\n</Badges>\n\nThe `clipId` prop may be used to set a deterministic id for the container. When a `containerId` is not manually set, a unique id will be generated. It is usually necessary to set deterministic ids for automated testing.\n\n---\n\n### clipPadding\n\n<Badges>\n  <TypeBadge value=\"{ top: number, bottom: number, left: number, right: number }\" />\n</Badges>\n\nThe `clipPadding` prop is used when the clipped area should be larger than the range of a chart.\nThis prop should be given as an object with `top`, `bottom`, `left`, and `right` properties. Set\nthe `clipPadding` prop is useful for extending the visible area of a chart in some dimension so\nthat data or labels are not cut off.\n\n---\n\n### clipPathComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<ClipPath/>\" />\n</Badges>\n\nThe `clipPathComponent` prop specifies the clip path to apply to the rendered group when appropriate. By default, `VictoryClipContainer` uses the [ClipPath](/docs/api/victory-primitives#clippath) component.\n\n---\n\n### clipWidth\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `clipWidth` prop determines the base width of the rectangular clip path. This prop should be\ngiven as a number. If this prop is not given, it will be calculated based on the width and padding\nof the parent chart.\n\n---\n\n### events\n\n<Badges>\n  <TypeBadge value=\"object\" />\n</Badges>\n\nThe `events` prop attaches arbitrary event handlers to the group element. This prop should be given as an object of event names and corresponding event handlers. When events are provided via Victory's event system, event handlers will be called with the event, the props of the component it is attached to, and an `eventKey` when applicable.\n\n_examples:_ `events={{onClick: (evt) => alert(\"x: \" + evt.clientX)}}`\n\n---\n\n### groupComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<g/>\" />\n</Badges>\n\n`VictoryClipContainer` uses the standard `groupComponent` prop. [Read about it here](/docs/api/victory-common-theme-props#groupcomponent)\n\n---\n\n### origin\n\n<Badges>\n  <TypeBadge value=\"{ x: number, y: number }\" />\n</Badges>\n\nVictory components will pass an `origin` prop to define the center point in svg coordinates for polar charts. **This prop should not be set manually.**\n\n---\n\n### polar\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n</Badges>\n\nVictory components can pass a boolean `polar` prop to specify whether a label is part of a polar chart. **This prop should not be set manually.**\n\n---\n\n### radius\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `radius` prop determines the radius of the circular clip path used for polar charts. This prop should be\ngiven as a number. If this prop is not given, it will be calculated based on the dimensions and padding\nof the parent chart.\n\n---\n\n### rectComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<Rect/>\" />\n</Badges>\n\nThe `rectComponent` prop specifies the element to use when a `VictoryClipContainer` renders a rectangular clip path. By default, `VictoryClipContainer` uses the [Rect](/docs/api/victory-primitives) component.\n\n---\n\n### translateX\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `translateX` prop determines the offset of the clip path from the base x coordinate. This prop\nshould be given as a number. If this prop is not given, it will be calculated based on the padding\nof the parent chart.\n\n---\n\n### translateY\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `translateY` prop determines the offset of the clip path from the base y coordinate. This prop\nshould be given as a number. If this prop is not given, it will be calculated based on the padding\nof the parent chart.\n"
  },
  {
    "path": "website/docs/api/victory-common-props.mdx",
    "content": "---\ntitle: VictoryCommonProps\n---\n\nComponents that allow theming will implement these props.\n\n## Inherited Props\n\n<CommonProps\n  interfaces={[\n    \"VictoryCommonThemeProps\",\n  ]}\n/>\n\n## Props\n\n---\n\n### theme\n\n<Badges>\n  <TypeBadge value=\"VictoryThemeDefinition\" />\n  <DefaultsBadge value=\"VictoryTheme.grayscale\" />\n</Badges>\n\nThe `theme` prop specifies a theme to use for determining styles and layout properties for a component. Any styles or props defined in `theme` may be overwritten by props specified on the component instance. By default, components use a [grayscale theme][].\n\nSee the [Themes Guide][] for information about creating custom themes.\n"
  },
  {
    "path": "website/docs/api/victory-common-theme-props.mdx",
    "content": "---\ntitle: VictoryCommonThemeProps\n---\n\nCommon props for all Victory components that use themes. Some components override these props with specific implementations. See the specific component's API documentation for more information.\n\n## Props\n\n---\n\n### animate\n\n<Badges>\n  <TypeBadge value=\"boolean | AnimatePropTypeInterface\" />\n</Badges>\n\nThe `animate` prop specifies props for [VictoryAnimation][] and [VictoryTransition][] to use. The animate prop may be used to specify the duration, delay, and easing of an animation as well as the behavior of `onEnter` and `onExit` and `onLoad` transitions. Each Victory component defines its own default transitions, but these may be modified, or overwritten with the `animate` prop. An `animationWhitelist` may also be specified on the `animate` prop. When given, only props specified in the whitelist will animate.\n\nSee the [Animations Guide][] for more detail on animations and transitions\n\n```jsx live noInline\nfunction App(props) {\n  const [state, setState] =\n    React.useState({\n      data: getData(),\n      size: getSize(),\n    });\n\n  React.useEffect(() => {\n    const setStateInterval =\n      window.setInterval(() => {\n        setState({\n          data: getData(),\n          size: getSize(),\n        });\n      }, 3000);\n\n    return () => {\n      window.clearInterval(\n        setStateInterval,\n      );\n    };\n  }, []);\n\n  return (\n    <VictoryChart\n      domain={{ y: [0, 1] }}\n      animate={{ duration: 2000 }}\n      theme={VictoryTheme.clean}\n    >\n      <VictoryScatter\n        size={state.size}\n        data={state.data}\n        style={{\n          data: {\n            opacity: ({ datum }) =>\n              datum.opacity || 1,\n          },\n        }}\n        animate={{\n          animationWhitelist: [\n            \"style\",\n            \"data\",\n            \"size\",\n          ], // Try removing \"size\"\n          onExit: {\n            duration: 500,\n            before: () => ({\n              opacity: 0.3,\n              _y: 0,\n            }),\n          },\n          onEnter: {\n            duration: 500,\n            before: () => ({\n              opacity: 0.3,\n              _y: 0,\n            }),\n            after: (datum) => ({\n              opacity: 1,\n              _y: datum._y,\n            }),\n          },\n        }}\n      />\n    </VictoryChart>\n  );\n}\n\nfunction getData() {\n  const num = Math.floor(\n    10 * Math.random() + 5,\n  );\n  const points = new Array(num).fill(1);\n  return points.map((point, index) => {\n    return {\n      x: index + 1,\n      y: Math.random(),\n    };\n  });\n}\n\nfunction getSize() {\n  return Math.random() * 10;\n}\n\nrender(<App />);\n```\n\n---\n\n### containerComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<VictoryContainer>\" />\n</Badges>\n\nThe `containerComponent` prop takes a component instance which will be used to create a container element for standalone charts. If a `containerComponent` is not provided, the default `VictoryContainer` component will be used. Other Victory container components include:\n\n- [VictoryBrushContainer][]\n- [VictoryCursorContainer][]\n- [VictorySelectionContainer][]\n- [VictoryVoronoiContainer][]\n- [VictoryZoomContainer][]\n- hybrid containers may be created using the [createContainer][] helper\n\nVictory container components all support `title` and `desc` props, which are intended to add accessibility to Victory components. The more descriptive these props are, the more accessible your data will be for people using screen readers. These props may be set by passing them directly to the supplied component. By default, all Victory container components render responsive `svg` elements using the `viewBox` attribute. To render a static container, set `responsive={false}` directly on the container instance supplied via the `containerComponent` prop. All Victory container components also render a `Portal` element that may be used in conjunction with [VictoryPortal][] to force components to render above other children.\n\nContainer components are supplied with the following props:\n\n- `domain`\n- `height`\n- `horizontal`\n- `origin` (for polar charts)\n- `padding`\n- `polar`\n- `scale`\n- `standalone`\n- `style`\n- `theme`\n- `width`\n\n```jsx live\n<VictoryScatter\n  containerComponent={\n    <VictoryCursorContainer\n      cursorLabel={({ datum }) =>\n        `${datum.x.toPrecision(\n          2,\n        )}, ${datum.y.toPrecision(2)}`\n      }\n    />\n  }\n/>\n```\n\n---\n\n### disableInlineStyles\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n  <DefaultsBadge value=\"false\" />\n</Badges>\n\nAllows Victory components to work better with CSS classes or styled-components. By default, Victory provides inline styles to chart components, which will override any conflicting CSS styles. This flag will remove the inline styles, making it easier to provide custom styling for components via CSS.\n\nIf this prop is passed to a chart type (e.g. `VictoryBar`), it will apply to all data and label components for that chart.\n\n---\n\n### domainPadding\n\n<Badges>\n  <TypeBadge value=\"number | array[left, right] | { x: [left, right], y: [bottom, top] }\" />\n</Badges>\n\nThe `domainPadding` prop specifies a number of pixels of padding to add to the beginning or end of a domain. This prop is useful for explicitly spacing data elements farther from the beginning or end of a domain to prevent axis crowding. When given as a single number, `domainPadding` will be applied to the upper and lower bound of both the x and y domains. This prop may also be given as an object with numbers or two-element arrays specified for x and y. When specifying arrays for `domainPadding`, the first element of the array will specify the padding to be applied to domain minimum, and the second element will specify padding the be applied to domain maximum.\n\n:::note\nThe `x` value supplied to the `domainPadding` prop refers to the _independent_ variable, and the `y` value refers to the _dependent_ variable. This may cause confusion in horizontal charts, as the independent variable will corresponds to the y axis.\n:::\n\n#### Common Usage\n\n- `domainPadding={20}`\n- `domainPadding={{ x: [20, 0] }}`\n\n:::note\nValues supplied for `domainPadding` will be coerced so that padding a domain will never result in charts including an additional quadrant. For example, if an original domain included only positive values, `domainPadding` will be coerced so that the resulted padded domain will not include negative values.\n:::\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 100 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar data={sampleData} />\n</VictoryChart>\n```\n\n---\n\n### externalEventMutations\n\n<Badges>\n  <TypeBadge value=\"EventCallbackInterface[]\" />\n</Badges>\n\nOccasionally is it necessary to trigger events in Victory's event system from some external element such as a button or a form field. Use the `externalEventMutation` prop to specify a set of mutations to apply to a given chart.\n\n```ts\ntype EventCallbackInterface<T, U> = {\n  target: T;\n  eventKey: U;\n  childName?: StringOrNumberOrList;\n  mutation: (props: any) => any;\n  callback?: () => void;\n};\n\ntype externalEventMutations =\n  EventCallbackInterface<\n    string | string[],\n    StringOrNumberOrList\n  >[];\n```\n\nThe `target`, `eventKey`, and `childName` (when applicable) must always be specified. The `mutation` function will be called with the current props of the element specified by the `target`, `eventKey` and `childName` provided. The mutation function should return a mutation object for that element. The `callback` prop should be used to clear the `externalEventMutations` prop once the mutation has been applied. Clearing `externalEventMutations` is crucial for charts that animate.\n\n```jsx live noInline\nfunction App() {\n  const [state, setState] =\n    React.useState({\n      externalMutations: undefined,\n    });\n\n  function removeMutation() {\n    setState({\n      externalMutations: undefined,\n    });\n  }\n\n  function clearClicks() {\n    setState({\n      externalMutations: [\n        {\n          childName: \"Bar-1\",\n          target: [\"data\"],\n          eventKey: \"all\",\n          mutation: () => ({\n            style: undefined,\n          }),\n          callback: removeMutation,\n        },\n      ],\n    });\n  }\n\n  const buttonStyle = {\n    backgroundColor: \"black\",\n    color: \"white\",\n    padding: \"10px\",\n    marginTop: \"10px\",\n  };\n\n  return (\n    <div>\n      <button\n        onClick={clearClicks}\n        style={buttonStyle}\n      >\n        Reset\n      </button>\n      <VictoryChart\n        domain={{ x: [0, 5] }}\n        externalEventMutations={\n          state.externalMutations\n        }\n        events={[\n          {\n            target: \"data\",\n            childName: \"Bar-1\",\n            eventHandlers: {\n              onClick: () => ({\n                target: \"data\",\n                mutation: () => ({\n                  style: {\n                    fill: \"orange\",\n                  },\n                }),\n              }),\n            },\n          },\n        ]}\n        theme={VictoryTheme.clean}\n      >\n        <VictoryBar\n          name=\"Bar-1\"\n          style={{\n            data: { fill: \"grey\" },\n          }}\n          labels={() => \"click me!\"}\n          data={[\n            { x: 1, y: 2 },\n            { x: 2, y: 4 },\n            { x: 3, y: 1 },\n            { x: 4, y: 5 },\n          ]}\n        />\n      </VictoryChart>\n    </div>\n  );\n}\n\nrender(<App />);\n```\n\n:::note\nExternal mutations are applied to the same state object that is used to control events in Victory, so depending on the order in which they are triggered, external event mutations may override mutations caused by internal Victory events or vice versa.\n:::\n\n---\n\n### groupComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n</Badges>\n\nThe `groupComponent` prop takes a component instance which will be used to create group elements for use within container elements. For most components, this prop defaults to a `<g>` tag. Continuous data components like `VictoryLine` and `VictoryArea` use [VictoryClipContainer][] a component which renders a `<g>` tag with a `clipPath` `def`. This allows continuous data components to transition smoothly when new data points enter and exit. `VictoryClipContainer` may also be used with components like `VictoryScatter` to prevent data from overflowing the chart area.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryScatter\n    data={sampleData}\n    size={20}\n    groupComponent={\n      <VictoryClipContainer />\n    }\n  />\n</VictoryChart>\n```\n\n---\n\n### height\n\n<Badges>\n  <TypeBadge value=\"number\" />\n  <DefaultsBadge value=\"300\" />\n</Badges>\n\nThe `height` prop determines the height of the containing `<svg>`. By default Victory components render responsive containers with the `viewBox` attribute set to `viewBox=\"0, 0, width, height\"` and `width=\"100%\"`, `height=\"auto\"`. In responsive containers, the `width` and `height` props affect the _aspect ratio_ of the rendered component, while the absolute width and height are determined by the container. To render a static container, pass `responsive={false}` to the `containerComponent` like `containerComponent={<VictoryContainer responsive={false}/>}`, or set `standalone={false}` and render the resulting `<g>` tag in your own `<svg>` container. When a component is nested within `VictoryChart`, `VictoryStack`, or `VictoryGroup` setting the `height` prop on the child component will have no effect.\n\n```jsx live\n<div>\n  <VictoryBar height={500} />\n  <VictoryBar\n    height={500}\n    containerComponent={\n      <VictoryContainer\n        responsive={false}\n      />\n    }\n  />\n</div>\n```\n\n---\n\n### horizontal\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n  <DefaultsBadge value=\"false\" />\n</Badges>\n\nThe horizontal prop determines whether data will be plotted horizontally. When this prop is set to true, the independent variable will be plotted on the y axis and the dependent variable will be plotted on the x axis.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n  domainPadding={{ x: 10 }}\n>\n  <VictoryBar\n    horizontal\n    data={sampleData}\n  />\n</VictoryChart>\n```\n\n---\n\n### maxDomain\n\n<Badges>\n  <TypeBadge value=\"number | { x: number, y: number }\" />\n</Badges>\n\nThe `maxDomain` prop defines a maximum domain value for a chart. This prop is useful in situations where the maximum domain of a chart is static, while the minimum value depends on data or other variable information. If the `domain` prop is set in addition to `maximumDomain`, `domain` will be used.\n\n:::note\nThe `x` value supplied to the `maxDomain` prop refers to the _independent_ variable, and the `y` value refers to the _dependent_ variable. This may cause confusion in horizontal charts, as the independent variable will corresponds to the y axis.\n:::\n\n#### Common Usage\n\n- `maxDomain={0}`\n- `maxDomain={{ y: 0 }}`\n\n```jsx live\n<VictoryChart\n  maxDomain={{ y: 0 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryLine\n    data={[\n      { x: 1, y: -2 },\n      { x: 2, y: 1 },\n      { x: 3, y: -1 },\n      { x: 4, y: -3 },\n    ]}\n  />\n</VictoryChart>\n```\n\n---\n\n### minDomain\n\n<Badges>\n  <TypeBadge value=\"number | { x: number, y: number }\" />\n</Badges>\n\nThe `minDomain` prop defines a minimum domain value for a chart. This prop is useful in situations where the minimum domain of a chart is static, while the maximum value depends on data or other variable information. If the `domain` prop is set in addition to `minimumDomain`, `domain` will be used.\n\n:::note\nThe `x` value supplied to the `minDomain` prop refers to the _independent_ variable, and the `y` value refers to the _dependent_ variable. This may cause confusion in horizontal charts, as the independent variable will corresponds to the y axis.\n:::\n\n#### Common Usage\n\n- `minDomain={0}`\n- `minDomain={{ y: 0 }}`\n\n```jsx live\n<VictoryChart\n  minDomain={{ y: 0 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryLine\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: -1 },\n      { x: 3, y: 1 },\n      { x: 4, y: 3 },\n    ]}\n  />\n</VictoryChart>\n```\n\n---\n\n### name\n\n<Badges>\n  <TypeBadge value=\"string\" />\n</Badges>\n\nThe `name` prop is used to reference a component instance when defining shared events.\n\n---\n\n### origin\n\n<Badges>\n  <TypeBadge value=\"{ x: number, y: number }\" />\n</Badges>\n\nThe origin prop is used to define the center point in svg coordinates for polar charts. All children within a polar chart must share the same origin, so setting this prop on children nested within `VictoryChart`, `VictoryStack`, or `VictoryGroup` will have no effect. When this prop is not set, it will be calculated based on the `width`, `height` and `padding` of the chart.\n\n:::note\nThis prop is typically not set by external consumers.\n:::\n\n---\n\n### padding\n\n<Badges>\n  <TypeBadge value=\"number | { top: number, bottom: number, left: number, right: number }\" />\n  <DefaultsBadge value=\"50\" />\n</Badges>\n\nThe `padding` prop specifies the amount of padding in number of pixels between the edge of the chart and any rendered child components. This prop can be given as a number or as an object with padding specified for top, bottom, left and right. As with [width][] and [height][], the absolute padding will depend on whether the component is rendered in a responsive container. When a component is nested within `VictoryChart`, `VictoryStack`, or `VictoryGroup` setting `padding` on the child component will have no effect.\n\n#### Common Usage\n\n- `padding={{top: 20, bottom: 60}}`\n- `padding={40}`\n\n```jsx live\n<VictoryChart\n  padding={{\n    top: 40,\n    bottom: 80,\n    left: 40,\n    right: 80,\n  }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryLine data={sampleData} />\n</VictoryChart>\n```\n\n---\n\n### polar\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n  <DefaultsBadge value=\"false\" />\n</Badges>\n\nSpecifies whether a chart should be plotted on a polar coordinate system. All components in a given chart must share the same coordinate system, so setting this prop on children nested within `VictoryChart`, `VictoryStack`, or `VictoryGroup` will have no effect.\n\n```jsx live\n<div>\n  <VictoryBar\n    polar\n    data={sampleData}\n    labels={(d) => d.x.toFixed(0)}\n    width={400}\n    height={400}\n    domain={{ x: [0, 7], y: [0, 7] }}\n    style={{\n      data: {\n        fill: \"#c43a31\",\n        stroke: \"black\",\n        strokeWidth: 2,\n      },\n    }}\n    theme={VictoryTheme.clean}\n  />\n  <VictoryBar\n    data={sampleData}\n    labels={(d) => d.x.toFixed(0)}\n    width={400}\n    height={400}\n    domain={{ x: [0, 7], y: [0, 7] }}\n    style={{\n      data: {\n        fill: \"#c43a31\",\n        stroke: \"black\",\n        strokeWidth: 2,\n      },\n    }}\n    theme={VictoryTheme.clean}\n  />\n</div>\n```\n\n---\n\n### range\n\n<Badges>\n  <TypeBadge value=\"array[low, high] | { x: [low, high], y: [low, high] }\" />\n</Badges>\n\nDescribes the dimensions over which data may be plotted. For cartesian coordinate systems, this corresponds to minimum and maximum svg coordinates in the x and y dimension. In polar coordinate systems this corresponds to a range of angles and radii. When this value is not given it will be calculated from the `width`, `height`, and `padding`, or from the `startAngle` and `endAngle` in the case of polar charts. All components in a given chart must share the same range, so setting this prop on children nested within `VictoryChart`, `VictoryStack`, or `VictoryGroup` will have no effect.\n\n#### Common Usage\n\n- Cartesian: `range={{ x: [50, 250], y: [50, 250] }}`\n- Polar: `range={{ x: [0, 360], y: [0, 250] }}`\n\n:::note\nThis prop is typically not set by external consumers.\n:::\n\n---\n\n### scale\n\n<Badges>\n  <TypeBadge value=\"scale || { x: scale, y: scale }\" />\n  <DefaultsBadge value='linear' />\n</Badges>\n\nThe `scale` prop determines which scales your chart should use. In this case, \"scale\" refers to the d3 scale that is used inside Victory to determine the placement of data, ticks, and labels. A scale type can be either a string (\"linear\", \"time\", \"log\", \"sqrt\"), or a custom d3 scale function. This prop can be passed as a single scale, or as an object with scales specified for x and y. For \"time\" scales, data points should be `Date` objects or `getTime()` instances.\n\nThis prop should be set at the top-level of the chart in order to avoid being overwritten by the default value. In other words, unless an individual chart component is being used as a standalone component (without a `VictoryChart` wrapper), this prop should be added to the `VictoryChart` component.\n\n:::note\nThe `x` value supplied to the `scale` prop refers to the _independent_ variable, and the `y` value refers to the _dependent_ variable. This may cause confusion in horizontal charts, as the independent variable will correspond to the y axis.\n:::\n\n:::caution\nOn categorical axis domains (such as bar chart), the only valid scale is \"linear\".\n:::\n\n_examples:_\n\n- `scale=\"time\"`\n- `scale={{x: \"linear\", y: \"log\"}}`\n\n```jsx live\n<VictoryChart\n  scale={{ x: \"linear\", y: \"log\" }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryLine\n    style={{ data: { stroke: \"red\" } }}\n    domain={{ x: [0, 5] }}\n    y={(d) => Math.pow(1 - d.x, 10)}\n  />\n</VictoryChart>\n```\n\nIn this example, a [discontinous scale plugin from d3fc](https://github.com/d3fc/d3fc/blob/master/packages/d3fc-discontinuous-scale/README.md) can be used to create a custom scale function to skip weekends along the x-axis.\n\n:::note\nThe data set has already been filtered to only include weekdays.\n:::\n\n```jsx live noInline\nfunction App() {\n  const data = [\n    { x: new Date(2021, 5, 1), y: 8 },\n    { x: new Date(2021, 5, 2), y: 10 },\n    { x: new Date(2021, 5, 3), y: 7 },\n    { x: new Date(2021, 5, 4), y: 4 },\n    { x: new Date(2021, 5, 7), y: 6 },\n    { x: new Date(2021, 5, 8), y: 3 },\n    { x: new Date(2021, 5, 9), y: 7 },\n    { x: new Date(2021, 5, 10), y: 9 },\n    { x: new Date(2021, 5, 11), y: 6 },\n  ];\n\n  const discontinuousScale =\n    scaleDiscontinuous(\n      d3Scale.scaleTime(),\n    ).discontinuityProvider(\n      discontinuitySkipWeekends(),\n    );\n\n  return (\n    <VictoryChart\n      scale={{ x: discontinuousScale }}\n      theme={VictoryTheme.clean}\n    >\n      <VictoryArea\n        data={data}\n        style={{\n          data: {\n            fill: \"lightblue\",\n            stroke: \"teal\",\n          },\n        }}\n      />\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n\n---\n\n### sharedEvents\n\n<Badges>\n  <TypeBadge value=\"{ events: any[]; getEventState: Function }\" />\n</Badges>\n\nUsed to coordinate events between Victory components using `VictorySharedEvents`.\n\n:::warning\nThis prop should not be set manually.\n:::\n\n---\n\n### singleQuadrantDomainPadding\n\n<Badges>\n  <TypeBadge value=\"boolean | { x: boolean, y: boolean }\" />\n</Badges>\n\nBy default `domainPadding` is coerced to existing quadrants. This means that if a given domain only includes positive values, no amount of padding applied by `domainPadding` will result in a domain with negative values. This is the desired behavior in most cases. For users that need to apply padding without regard to quadrant, the `singleQuadrantDomainPadding` prop may be used. This prop may be given as a boolean or an object with boolean values specified for \"x\" and/or \"y\". When this prop is false (or false for a given dimension), padding will be applied without regard to quadrant. If this prop is not specified, `domainPadding` will be coerced to existing quadrants.\n\n:::note\nThe `x` value supplied to the `singleQuadrantDomainPadding` prop refers to the _independent_ variable, and the `y` value refers to the _dependent_ variable. This may cause confusion in horizontal charts, as the independent variable will corresponds to the y axis.\n:::\n\n#### Common Usage\n\n- `singleQuadrantDomainPadding={false}`\n- `singleQuadrantDomainPadding={{ x: false }}`\n\n```jsx live\n<VictoryChart\n  singleQuadrantDomainPadding={{\n    x: false,\n  }}\n  domainPadding={100}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar data={sampleData} />\n  <VictoryAxis crossAxis={false} />\n</VictoryChart>\n```\n\n---\n\n### standalone\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n  <DefaultsBadge value=\"true\" />\n</Badges>\n\nSpecifies whether the component should be rendered in an independent `<svg>` element or in a `<g>` tag. This prop defaults to true, and renders an `svg`. Wrapper components like `VictoryChart`, `VictoryStack`, and `VictoryGroup` force children to use `standalone={false}`.\n\n```jsx live\n<svg width={300} height={300}>\n  <circle\n    cx={150}\n    cy={150}\n    r={150}\n    fill=\"#c43a31\"\n  />\n  <VictoryArea\n    standalone={false}\n    width={300}\n    height={300}\n    padding={0}\n    data={sampleData}\n  />\n</svg>\n```\n\n---\n\n### width\n\n<Badges>\n  <TypeBadge value=\"number\" />\n  <DefaultsBadge value=\"450\" />\n</Badges>\n\nThe `width` prop determines the width of the containing `<svg>`. By default Victory components render responsive containers with the `viewBox` attribute set to `viewBox=\"0, 0, width, height\"` and `width=\"100%\"`, `height=\"auto\"`. In responsive containers, the `width` and `height` props affect the _aspect ratio_ of the rendered component, while the absolute width and height are determined by the container. To render a static container, pass `responsive={false}` to the `containerComponent` like `containerComponent={<VictoryContainer responsive={false}/>}`, or set `standalone={false}` and render the resulting `<g>` tag in your own `<svg>` container. When a component is nested within `VictoryChart`, `VictoryStack`, or `VictoryGroup` setting `width` prop on the child component will have no effect.\n\n```jsx live\n<div>\n  <VictoryBar width={1200} />\n  <VictoryBar\n    width={1200}\n    containerComponent={\n      <VictoryContainer\n        responsive={false}\n      />\n    }\n  />\n</div>\n```\n\n[x]: #x\n[y]: #y\n[grayscale theme]: https://github.com/FormidableLabs/victory/blob/main/packages/victory-core/src/victory-theme/grayscale.tsx\n[width]: #width\n[height]: #height\n[victorylabel]: /docs/api/victory-label\n[victorytooltip]: /docs/api/victory-tooltip\n[victoryportal]: /docs/api/victory-portal\n[victoryboxplot]: /docs/api/victory-box-plot\n[victoryclipcontainer]: /docs/api/victory-clip-container\n[victorybrushcontainer]: /docs/api/victory-brush-container\n[victorycursorcontainer]: /docs/api/victory-cursor-container\n[victoryselectioncontainer]: /docs/api/victory-selection-container\n[victoryvoronoicontainer]: /docs/api/victory-voronoi-container\n[victoryzoomcontainer]: /docs/api/victory-zoom-container\n[createcontainer]: /docs/guides/containers\n[victoryanimation]: /docs/api/victory-animation\n[victorytransition]: /docs/api/victory-transition\n[sortby]: https://lodash.com/docs/4.17.4#sortBy\n[animations guide]: /docs/guides/animations\n[data accessors guide]: /docs/guides/data-accessors\n[custom components guide]: /docs/guides/custom-components\n[events guide]: /docs/guides/events\n[themes guide]: /docs/guides/themes\n"
  },
  {
    "path": "website/docs/api/victory-container-props.mdx",
    "content": "---\ntitle: VictoryContainerProps\n---\n\nA set of props available to Victory [container](/docs/guides/containers) components.\n\n## Props\n\n---\n\n### aria-describedby\n\n<Badges>\n  <TypeBadge value=\"string\" />\n</Badges>\n\nThe `aria-describedby` prop applies to the `svg` element rendered by `VictoryContainer`. This prop should be given as a string corresponding to the id of an element that describes the chart. If the `desc` prop is set on `VictoryContainer`, the `aria-describedby` prop applied to `VictoryContainer`'s `svg` will correspond to the id of the `desc` tag `VictoryContainer` renders.\n\n---\n\n### aria-labelledby\n\n<Badges>\n  <TypeBadge value=\"string\" />\n</Badges>\n\nThe `aria-labelledby` prop applies to the `svg` element rendered by `VictoryContainer`. This prop should be given as a string corresponding to the id of an element that labels the chart. If the `title` prop is set on `VictoryContainer`, the `aria-labelledby` prop applied to `VictoryContainer`'s `svg` will correspond to the id of the `title` tag `VictoryContainer` renders.\n\n---\n\n### children\n\n<Badges>\n  <TypeBadge value=\"ReactElement | ReactElement[]\" />\n</Badges>\n\nThe `children` prop specifies the child or children that will be rendered within the container. This prop should not be set manually. It will be set by whatever Victory component is rendering the container.\n\n---\n\n### className\n\n<Badges>\n  <TypeBadge value=\"string\" />\n</Badges>\n\nThe `className` prop specifies a className that will be applied to the outer-most div rendered by `VictoryContainer` if this prop is not set, the className will default to \"VictoryContainer\"\n\n---\n\n### containerId\n\n<Badges>\n  <TypeBadge value=\"number | string\" />\n</Badges>\n\nThe `containerId` prop may be used to set a deterministic id for the container. When a `containerId` is not manually set, a unique id will be generated. It is usually necessary to set deterministic ids for automated testing.\n\n---\n\n### containerRef\n\n<Badges>\n  <TypeBadge value=\"function\" />\n</Badges>\n\nThe `containerRef` prop may be used to attach a ref to the outermost element rendered by the container. This prop should be given as a function.\n\n_example:_ `containerRef={(ref) => { this.chartRef = ref; }}`\n\n---\n\n### desc\n\n<Badges>\n  <TypeBadge value=\"string\" />\n</Badges>\n\nThe `desc` prop specifies the description of the chart/SVG to assist with accessibility for screen readers. The more descriptive this title is, the more useful it will be for people using screen readers.\n\n_example:_ `desc=\"Golden retrievers make up 30%, Labs make up 25%, and other dog breeds are not represented above 5% each.\"`\n\n---\n\n### events\n\n<Badges>\n  <TypeBadge value=\"object\" />\n</Badges>\n\nThe `events` prop attaches arbitrary event handlers to the container element. This prop should be\ngiven as an object of event names and corresponding [React event handlers][]. Events defined directly\nvia this prop will be masked by `defaultEvents` on `VictorySelectionContainer` (`onMouseDown`,\n`onMouseUp`, and `onMouseMove`), and by any events defined through Victory's event\nsystem that target parent elements.\n\n_example:_ `events={{onClick: (evt) => alert(\"x: \" + evt.clientX)}}`\n\n---\n\n### height\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `height` prop determines the height of the containing `<svg>`. By default VictoryContainer renders responsive containers with the `viewBox` attribute set to `viewBox=\"0, 0, width, height\"` and `width=\"100%\"`, `height=\"100%\"`. In responsive containers, the `width` and `height` props affect the _aspect ratio_ of the rendered component, while the absolute width and height are determined by the container. To render a static container, set `responsive={false}`\n\n_example:_ `height={350}`\n\n---\n\n### name\n\n<Badges>\n  <TypeBadge value=\"string\" />\n</Badges>\n\nThe `name` prop is used to reference a component instance when defining shared events.\n\n---\n\n### origin\n\n<Badges>\n  <TypeBadge value=\"{ x: number, y: number }\" />\n</Badges>\n\nThe origin prop is used to define the center point in svg coordinates for polar charts.\n\n:::note\nThis prop is typically not set by external consumers.\n:::\n\n---\n\n### ouiaId\n\n<Badges>\n  <TypeBadge value=\"number | string\" />\n</Badges>\n\nThe `ouiaId` prop outputs an id attribute called `data-ouia-component-id`, which must be unique within the surrounding context of the component.\n\nThis prop is used by the Open UI Automation 1.0-RC spec to help maintain automated testing environments. Components that are OUIA compliant must provide the following props; `ouiaId`, `ouiaSafe`, and `ouiaType`.\n\n---\n\n### ouiaSafe\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n</Badges>\n\nThe `ouiaSafe` outputs an attribute called `data-ouia-safe`, which indicates that the component is in a static state.\n\nThis prop is used by the Open UI Automation 1.0-RC spec to help maintain automated testing environments. Components that are OUIA compliant must provide the following props; `ouiaId`, `ouiaSafe`, and `ouiaType`.\n\n  <DefaultsBadge value='true' />\n\n---\n\n### ouiaType\n\n<Badges>\n  <TypeBadge value=\"string\" />\n</Badges>\n\nThe `ouiaType` prop outputs an attribute called `data-ouia-component-type`, which specifies a unique name identifying the root level HTML element.\n\nThis prop is used by the Open UI Automation 1.0-RC spec to help maintain automated testing environments. Components that are OUIA compliant must provide the following props; `ouiaId`, `ouiaSafe`, and `ouiaType`.\n\n_example:_ A page that has a special container could choose to name that container as `FrameworkA/CustomContainer`.\n\n---\n\n### polar\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n  <DefaultsBadge value=\"false\" />\n</Badges>\n\nSpecifies whether a chart should be plotted on a polar coordinate system.\n\n:::note\nThis prop is typically not set by external consumers on containers\n:::\n\n---\n\n### portalComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n</Badges>\n\nThe `portalComponent` prop takes a component instance which will be used as a container for children that should render inside a top-level container so that they will always appear above other elements. [VictoryTooltip][] renders inside a portal so that tooltips always render above data. [VictoryPortal][] is used to define elements that should render in the portal container. This prop defaults to [Portal][], and should only be overridden when changing rendered elements from SVG to another type of element _e.g.,_ [react-native-svg][] elements.\n\n  <DefaultsBadge value='<Portal/>}' />\n\n---\n\n### portalZIndex\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `portalZIndex` prop determines the z-index of the div enclosing the portal component. If a `portalZIndex` prop is not set, the z-index of the enclosing div will be set to 99.\n\n---\n\n### preserveAspectRatio\n\n<Badges>\n  <TypeBadge value=\"string\" />\n</Badges>\n\nThe `preserveAspectRatio` prop applies to the `svg` elements rendered by `VictoryContainer` to give users more control over how responsive svgs are positioned and scaled. When the `responsive` prop on `VictoryContainer` is set to `false`, this prop has no effect.\n\n```jsx live\n<div style={{ width: \"400px\", height: \"400px\"}}>\n  <VictoryChart\n    height={300}\n    width={400}\n    style={{ parent: { border: \"1px solid black\" } }}\n    containerComponent={\n      <VictoryContainer\n        preserveAspectRatio=\"none\"\n      />\n    }\n    theme={VictoryTheme.clean}\n  >\n    <VictoryLine/>\n  </VictoryChart>\n</div>\n```\n\n---\n\n### responsive\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n  <DefaultsBadge value=\"true\" />\n</Badges>\n\nThe `responsive` prop specifies whether the rendered container should be a responsive container with a `viewBox` attribute, or a static container with absolute width and height.\n\n---\n\n### role\n\n<Badges>\n  <TypeBadge value=\"string\" />\n  <DefaultsBadge value=\"img\" />\n</Badges>\n\nThe `role` prop specifies the role attribute that will be applied to the `svg` element rendered by `VictoryContainer`\n\n---\n\n### scale\n\n<Badges>\n  <TypeBadge value=\"scale | { x: scale, y: scale }\" />\n</Badges>\n\nSpecifies the scale for a container.\n\n:::note\nThis prop is typically not set by external consumers on containers\n:::\n\n---\n\n### style\n\n<Badges>\n  <TypeBadge value=\"React.CSSProperties\" />\n  <DefaultsBadge value=\"provided by theme\" />\n</Badges>\n\nThe `style` prop defines the style of the container, and should be given as an object of style attributes.\nThe `width` and `height` should be specified via props instead of style attributes as they determine\nrelative layout for components.\n\n_example:_ `style={{border: \"1px solid #ccc\"}}`\n\n---\n\n### tabIndex\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `tabIndex` prop applies to the `svg` element rendered by `VictoryContainer` to allow users to focus on the chart container via keyboard navigation. This prop should be given as a number.\n\n---\n\n### theme\n\n<Badges>\n  <TypeBadge value=\"number\" />\n  <DefaultsBadge value=\"VictoryTheme.grayscale\" />\n</Badges>\n\nThe `theme` prop specifies a theme to use for determining styles and layout props for a\ncomponent. Any styles or props defined in `theme` may be overridden by props specified on the\ncomponent instance.\n\n---\n\n### title\n\n<Badges>\n  <TypeBadge value=\"string\" />\n</Badges>\n\nThe `title` prop specifies the title to be applied to the SVG to assist with accessibility for screen readers. The more descriptive this title is, the more useful it will be for people using screen readers\n\n---\n\n### width\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `width` prop determines the width of the containing `<svg>`. By default VictoryContainer renders responsive containers with the `viewBox` attribute set to `viewBox=\"0, 0, width, height\"` and `width=\"100%\"`, `height=\"auto\"`. In responsive containers, the `width` and `height` props affect the _aspect ratio_ of the rendered component, while the absolute width and height are determined by the container. To render a static container, set `responsive={false}`\n\n## Native-Only Props\n\n### onTouchStart\n\n<Badges>\n  <TypeBadge value=\"function\" />\n</Badges>\n\nThe optional `onTouchStart` prop takes a function that is called on every touch event on the chart (when using `victory-native`). The most common use of `onTouchStart` is to prevent the chart's parent `ScrollView` from scrolling, so that the chart and container can be interacted with unencumbered. The function accepts a single parameter, `event`, a React Native [Synthetic Event][]. Also see `onTouchEnd`.\n\n```jsx\n<ScrollView scrollEnabled={this.state.scrollEnabled}>\n  <VictoryChart\n    containerComponent={\n      <VictoryContainer\n        onTouchStart={() => this.setState({ scrollEnabled: false })}\n        onTouchEnd={() => this.setState({ scrollEnabled: true })}\n      />\n    }\n    theme={VictoryTheme.clean}\n  >\n    <VictoryBar />\n  </VictoryChart>\n</ScrollView>\n```\n\n---\n\n### onTouchEnd\n\n<Badges>\n  <TypeBadge value=\"function\" />\n</Badges>\n\nThe optional `onTouchEnd` prop takes a function that is called at the conclusion of every touch event on the chart (when using `victory-native`). The most common use of `onTouchEnd` is to prevent the chart's parent `ScrollView` from scrolling, so that the chart and container can be interacted with unencumbered. The function accepts a single parameter, `event`, a React Native [Synthetic Event][]. Also see `onTouchStart`.\n\n---\n\n[victoryportal]: /docs/api/victory-portal\n[portal]: https://github.com/FormidableLabs/victory/blob/main/packages/victory-core/src/victory-portal/portal.tsx\n[react-native-svg]: https://github.com/react-native-community/react-native-svg\n[victorytheme]: /docs/api/victory-theme\n[victorytooltip]: /docs/api/victory-tooltip\n[grayscale theme]: https://github.com/FormidableLabs/victory/blob/main/packages/victory-core/src/victory-theme/grayscale.tsx\n[read more about themes here]: /docs/guides/themes\n[synthetic event]: https://facebook.github.io/react-native/docs/gesture-responder-system.html#responder-lifecycle\n[react event handlers]: https://reactjs.org/docs/handling-events.html\n"
  },
  {
    "path": "website/docs/api/victory-container.mdx",
    "content": "---\ntitle: VictoryContainer\n---\n\n`VictoryContainer` provides a top-level `<svg>` element for other Victory components to render within.\nBy default, `VictoryContainer` renders responsive SVGs. `VictoryContainer` also provides a [Portal][]\ncontainer that can be accessed via [VictoryPortal][] in order to render specified children above others. All other Victory containers extend `VictoryContainer`. Check out documentation for [common container props][] for more information about customizing container props.\n\n:::info\nFor an overview of containers, visit the [containers](/docs/guides/containers) guide.\n:::\n\n## Inherited Props\n\n<CommonProps\n  interfaces={[\"VictoryContainerProps\"]}\n/>\n\n[victoryportal]: /docs/api/victory-portal\n[portal]: https://github.com/FormidableLabs/victory/blob/main/packages/victory-core/src/victory-portal/portal.tsx\n[common container props]: /docs/api/victory-container-props\n"
  },
  {
    "path": "website/docs/api/victory-cursor-container.mdx",
    "content": "---\ntitle: VictoryCursorContainer\n---\n\nAdds a cursor to a chart to inspect coordinates.\n\n:::info\nFor examples of `VictoryCursorContainer` in action, visit the [Tooltips](/docs/guides/tooltips) guide.\n:::\n\n## Inherited Props\n\n<CommonProps\n  interfaces={[\"VictoryContainerProps\"]}\n/>\n\n## Component Props\n\n---\n\n### cursorComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<LineSegment/>\" />\n</Badges>\n\nThe `cursorComponent` prop takes a component instance which will be used to render a cursor element. The new element created will be supplied with `x1`, `y1`, `x2` and `y2` positioning props. If a `cursorComponent` is not supplied, a new [LineSegment][] component will be rendered.\n\n---\n\n### cursorDimension\n\n<Badges>\n  <TypeBadge value='\"x\" || \"y\"' />\n</Badges>\n\nWhen the `cursorDimension` prop is set, the cursor will be a line to inspect the given dimension\n(either \"x\" or \"y\"). When this prop is not specified, the cursor will be a 2-dimensional crosshair.\nFor example, if you would like to inspect the time of time-series data, set `dimension={\"x\"}`;\nthe cursor will then be a vertical line that will inspect the time value of the current mouse position.\n\n```jsx live\n<VictoryScatter\n  containerComponent={\n    <VictoryCursorContainer\n      cursorDimension=\"x\"\n      cursorLabel={({ datum }) =>\n        `${_.round(datum.x, 2)}, ${_.round(\n          datum.y,\n          2,\n        )}`\n      }\n    />\n  }\n/>\n```\n\n---\n\n### cursorLabel\n\n<Badges>\n  <TypeBadge value=\"function\" />\n</Badges>\n\nThe `cursorLabel` prop defines the label that will appear next to the cursor.\nA label will only appear if `cursorLabel` is set. This prop should be given as a function of a point (an Object with `x` and `y` properties).\n\n_example:_ `cursorLabel={(point) => point.x}`\n\n---\n\n### cursorLabelComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<VictoryLabel/>\" />\n</Badges>\n\nThe `cursorLabelComponent` prop takes a component instance which will be used to render a label for the cursor. The new element created from the passed `cursorLabelComponent` will be supplied with the following props: `x`, `y`, `active`, `text`. If `cursorLabelComponent` is omitted, a new [VictoryLabel][] will be created with the props described above.\n\n---\n\n### cursorLabelOffset\n\n<Badges>\n  <TypeBadge value=\"number | { x: number, y: number }\" />\n  <DefaultsBadge value=\"{ x: 5, y: -10 }\" />\n</Badges>\n\nThe `cursorLabelOffset` prop determines the pixel offset of the cursor label from the cursor point.\nThis prop should be an Object with `x` and `y` properties, or a number to be used for both dimensions.\n\n---\n\n### defaultCursorValue\n\n<Badges>\n  <TypeBadge value=\"number | { x: number, y: number }\" />\n</Badges>\n\nWhenever the mouse is not over the chart, the cursor will not be displayed.\nIf instead you would like to keep it displayed, use the `defaultCursorValue` prop to set the default value. The prop should be a point (an Object with `x` and `y` properties) for 2-dimensional cursors, or a number for 1-dimensional cursors.\n\n_examples:_ `defaultCursorValue={{x: 1, y: 1}}`, `defaultCursorValue={0}`\n\n---\n\n### disable\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n</Badges>\n\nWhen the `disable` prop is set to `true`, `VictoryCursorContainer` events will not fire.\n\n---\n\n### onCursorChange\n\n<Badges>\n  <TypeBadge value=\"function\" />\n</Badges>\n\nIf provided, the `onCursorChange` function will be called every time the cursor value changes. `onCursorChange` is called with `value` (the updated cursor value) and `props` (the props used by `VictoryCursorContainer`). A common use for `onCursorChange` is to save the cursor value to state and use it in another part of the view.\n\n_example:_ `onCursorChange={(value, props) => this.setState({cursorValue: value})}`\n\n[victoryvoronoicontainer]: /docs/api/victory-voronoi-container\n[victorycontainer]: /docs/api/victory-container\n[victorylabel]: /docs/api/victory-label\n[linesegment]: /docs/api/victory-primitives#linesegment\n"
  },
  {
    "path": "website/docs/api/victory-datatable-props.mdx",
    "content": "---\ntitle: VictoryDatatableProps\n---\n\nA set of props available to components that implement data visualization in Victory. These props are used to define the data that will be visualized, as well as the appearance and behavior of the visualization.\n\n## Props\n\n---\n\n### categories\n\n<Badges>\n  <TypeBadge value=\"string[] | { x: string[], y: string[] }\" />\n</Badges>\n\nSpecifies how categorical data for a chart should be ordered. This prop should be given as an array of string values, or an object with these arrays of values specified for x and y. If this prop is not set, categorical data will be plotted in the order it was given in the data array.\n\n:::note\nThe `x` value supplied to the `categories` prop refers to the _independent_ variable, and the `y` value refers to the _dependent_ variable. This may cause confusion in horizontal charts, as the independent variable will corresponds to the y axis.\n:::\n\n```jsx live\n<VictoryChart\n  domainPadding={25}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar\n    categories={{\n      x: [\n        \"birds\",\n        \"cats\",\n        \"dogs\",\n        \"fish\",\n        \"frogs\",\n      ],\n    }}\n    data={[\n      { x: \"cats\", y: 1 },\n      { x: \"dogs\", y: 2 },\n      { x: \"birds\", y: 3 },\n      { x: \"fish\", y: 2 },\n      { x: \"frogs\", y: 1 },\n    ]}\n  />\n</VictoryChart>\n```\n\n---\n\n### data\n\n<Badges>\n  <TypeBadge value=\"any[]\" />\n</Badges>\n\nBy default, Victory components expect data as an array of objects with `x` and `y` properties. Use the [x][] and [y][] data accessor props to define a custom data format. Data objects may also include information about ~~styles~~, labels, and props that may be applied to individual data components.\n\n:::note\nAll values stored on the data object will be interpolated during animation. Do not store functions on data objects.\n:::\n\n```jsx live\n<VictoryScatter\n  size={7}\n  data={[\n    {\n      x: 1,\n      y: 1,\n      label: \"first\",\n      symbol: \"star\",\n      opacity: 0.5,\n      fill: \"blue\",\n    },\n    {\n      x: 2,\n      y: 2,\n      label: \"second\",\n      symbol: \"circle\",\n      opacity: 0.8,\n      fill: \"red\",\n    },\n    {\n      x: 3,\n      y: 3,\n      label: \"third\",\n      symbol: \"square\",\n      fill: \"gold\",\n    },\n    {\n      x: 4,\n      y: 4,\n      label: \"fourth\",\n      symbol: \"diamond\",\n      fill: \"green\",\n    },\n  ]}\n  style={{\n    data: {\n      fill: ({ datum }) => datum.fill,\n      opacity: ({ datum }) =>\n        datum.opacity,\n    },\n  }}\n/>\n```\n\n---\n\n### dataComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n</Badges>\n\nA component instance which will be responsible for rendering a data element. The new element created from the passed `dataComponent` will be provided with all the props it needs to render. These props will always include `data`, `events`, `scale` and `style`. Individual components will supply additional props expected by their default `dataComponents`. See individual api docs for complete props lists. Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If a `dataComponent` is not provided, each component will use its own default `dataComponent`.\n\nSee the [Custom Components Guide][] for more detail on creating your own `dataComponents`\n\n```jsx live noInline\nfunction CatPoint(props) {\n  const { x, y, datum } = props; // VictoryScatter supplies x, y and datum\n  const cat =\n    datum._y >= 0 ? \"😻\" : \"😹\";\n\n  return (\n    <text x={x} y={y} fontSize={30}>\n      {cat}\n    </text>\n  );\n}\n\nfunction App() {\n  return (\n    <VictoryChart>\n      <VictoryScatter\n        dataComponent={<CatPoint />}\n        y={(d) =>\n          Math.sin(2 * Math.PI * d.x)\n        }\n        samples={15}\n      />\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n\n---\n\n### domain\n\n<Badges>\n  <TypeBadge value=\"array[low, high] || { x: [low, high], y: [low, high] }\" />\n</Badges>\n\nThe `domain` prop describes the range of data the component will include. This prop can be given as an array of the minimum and maximum expected values of the data or as an object that specifies separate arrays for x and y. If this prop is not provided, a domain will be calculated from data, or other available information.\n\n:::note\nThe `x` value supplied to the `domain` prop refers to the _independent_ variable, and the `y` value refers to the _dependent_ variable. This may cause confusion in horizontal charts, as the independent variable will corresponds to the y axis.\n:::\n\n#### Common Usage\n\n- `domain={[-1, 1]}`\n- `domain={{x: [0, 100], y: [0, 1]}}`\n\n```jsx live\n<VictoryChart\n  domain={{ x: [0.5, 5.5], y: [0, 10] }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar data={sampleData} />\n</VictoryChart>\n```\n\n---\n\n### domainPadding\n\n<Badges>\n  <TypeBadge value=\"number | array[left, right] | { x: [left, right], y: [bottom, top] }\" />\n</Badges>\n\nThe `domainPadding` prop specifies a number of pixels of padding to add to the beginning or end of a domain. This prop is useful for explicitly spacing data elements farther from the beginning or end of a domain to prevent axis crowding. When given as a single number, `domainPadding` will be applied to the upper and lower bound of both the x and y domains. This prop may also be given as an object with numbers or two-element arrays specified for x and y. When specifying arrays for `domainPadding`, the first element of the array will specify the padding to be applied to domain minimum, and the second element will specify padding the be applied to domain maximum.\n\n:::note\nThe `x` value supplied to the `domainPadding` prop refers to the _independent_ variable, and the `y` value refers to the _dependent_ variable. This may cause confusion in horizontal charts, as the independent variable will corresponds to the y axis.\n:::\n\n#### Common Usage\n\n- `domainPadding={20}`\n- `domainPadding={{ x: [20, 0] }}`\n\n:::note\nValues supplied for `domainPadding` will be coerced so that padding a domain will never result in charts including an additional quadrant. For example, if an original domain included only positive values, `domainPadding` will be coerced so that the resulted padded domain will not include negative values.\n:::\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 100 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar data={sampleData} />\n</VictoryChart>\n```\n\n---\n\n### samples\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nSpecifies how many individual points to plot when plotting\ny as a function of x. The `samples` prop is ignored if `data` is supplied in props.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryLine\n    samples={25}\n    y={(d) =>\n      Math.sin(5 * Math.PI * d.x)\n    }\n  />\n  <VictoryLine\n    samples={100}\n    style={{ data: { stroke: \"red\" } }}\n    y={(d) =>\n      Math.cos(5 * Math.PI * d.x)\n    }\n  />\n</VictoryChart>\n```\n\n---\n\n### sortKey\n\n<Badges>\n  <TypeBadge value=\"string | number | string[] | function\" />\n</Badges>\n\nIndicates how data should be sorted. This prop is\ngiven directly to the lodash [sortBy][] function to be executed on the final\ndataset.\n\n:::note\nSorting only applies to categorical axis data. Linear data will not be sorted.\n:::\n\n#### Common Usage\n\n`string` - specify which property in a data object to sort the data array by\n\n```jsx\nsortKey = \"x\";\n```\n\n`function` - use a function to determine how to sort data elements in an array\n\n```jsx\nsortKey={(datum) => datum.xValue + datum.error}\n```\n\n`number` - specify which index of an array should be used to sort data when data is given as an array of arrays\n\n```jsx\nsortKey={0}\n```\n\n`array` - specify multiple properties to sort by\n\n```jsx\nsortKey={[\"age\", \"height\"]}\n```\n\n```jsx live\n<VictoryLine\n  data={_.range(0, 2 * Math.PI, 0.01).map(\n    (t) => ({ t }),\n  )}\n  sortKey=\"t\"\n  x={(d) =>\n    Math.sin(3 * d.t + 2 * Math.PI)\n  }\n  y={(d) => Math.sin(2 * d.t)}\n/>\n```\n\n---\n\n### sortOrder\n\n<Badges>\n  <TypeBadge value='\"ascending\" | \"descending\"' />\n  <DefaultsBadge value='\"ascending\"' />\n</Badges>\n\nThe `sortOrder` prop specifies whether sorted data should be returned in ascending or descending order.\n\n---\n\n### x\n\n<Badges>\n  <TypeBadge value=\"string | string[] | number | function\" />\n</Badges>\n\nUse the `x` data accessor prop to determine how the component defines data in the x dimension.\n\n`string` - specify which property in an array of data objects should be used as the x value. This string may reference a nested property using dot notation.\n\n```jsx\nx=\"name\";\nx=\"employees.name\"\n```\n\n`string[]` - specify which property in an array of nested data objects should be used as an x value\n\n```jsx\nx={[\"employees\", \"name\"]}\n```\n\n`number` - specify which index of an array should be used as an x value when data is given as an array of arrays\n\n```jsx\nx={0}\n```\n\n`function` - use a function to translate each element in a data array into an x value\n\n```jsx\nx={(datum) => datum.xValue + datum.error}\n```\n\nSee the [Data Accessors Guide][] for more detail on formatting and processing data.\n\n---\n\n### y\n\n<Badges>\n  <TypeBadge value=\"string | string[] | number | function\" />\n</Badges>\n\nUse the `y` data accessor prop to determine how the component defines data in the x dimension.\n\n`string` - specify which property in an array of data objects should be used as the x value. This string may reference a nested property using dot notation.\n\n```jsx\ny=\"salary\";\ny=\"employees.salary\"\n```\n\n`string[]` - specify which property in an array of nested data objects should be used as an x value\n\n```jsx\ny={[\"employees\", \"salary\"]}\n```\n\n`number` - specify which index of an array should be used as an x value when data is given as an array of arrays\n\n```jsx\ny={0}\n```\n\n`function` - use a function to translate each element in a data array into an x value\n\n```jsx\ny={(datum) => Math.sin(2 * Math.PI * datum.x)}\n```\n\nSee the [Data Accessors Guide][] for more detail on formatting and processing data.\n\n### y0\n\n---\n\n<Badges>\n  <TypeBadge value=\"string | string[] | number | function\" />\n</Badges>\n\nUse the `y0` data accessor prop to determine how the component defines the baseline of `y` data.\n\n`string` - specify which property in an array of data objects should be used as the `y0` value. This string may reference a nested property using dot notation.\n\n```jsx\ny0=\"last_quarter_profit\";\ny0=\"sales.last_quarter_profit\"\n```\n\n`string[]` - specify which property in an array of nested data objects should be used as a `y0` value\n\n```jsx\ny0={[\"sales\", \"last_quarter_profit\"]}\n```\n\n`number` - specify which index of an array should be used as an `y0` value when data is given as an array of arrays\n\n```jsx\ny0={1}\n```\n\n`function` - use a function to translate each element in a data array into an `y0` value\n\n```jsx\ny0={() => 10}\n```\n\nSee the [Data Accessors Guide][] for more detail on formatting and processing data.\n\n[x]: #x\n[y]: #y\n[grayscale theme]: https://github.com/FormidableLabs/victory/blob/main/packages/victory-core/src/victory-theme/grayscale.tsx\n[width]: #width\n[height]: #height\n[victorylabel]: /docs/api/victory-label\n[victorytooltip]: /docs/api/victory-tooltip\n[victoryportal]: /docs/api/victory-portal\n[victoryboxplot]: /docs/api/victory-box-plot\n[victoryclipcontainer]: /docs/api/victory-clip-container\n[victorybrushcontainer]: /docs/api/victory-brush-container\n[victorycursorcontainer]: /docs/api/victory-cursor-container\n[victoryselectioncontainer]: /docs/api/victory-selection-container\n[victoryvoronoicontainer]: /docs/api/victory-voronoi-container\n[victoryzoomcontainer]: /docs/api/victory-zoom-container\n[createcontainer]: /docs/guides/containers\n[victoryanimation]: /docs/api/victory-animation\n[victorytransition]: /docs/api/victory-transition\n[sortby]: https://lodash.com/docs/4.17.4#sortBy\n[animations guide]: /docs/guides/animations\n[data accessors guide]: /docs/guides/data-accessors\n[custom components guide]: /docs/guides/custom-components\n[events guide]: /docs/guides/events\n[themes guide]: /docs/guides/themes\n"
  },
  {
    "path": "website/docs/api/victory-error-bar.mdx",
    "content": "---\ntitle: VictoryErrorBar\n---\n\n:::info\nFor examples of `VictoryErrorBar` in action, visit the [Error Bar](/docs/charts/error-bar) examples.\n:::\n\n## Inherited Props\n\n<CommonProps\n  interfaces={[\n    \"VictoryCommonProps\", // omits 'polar'\n    \"VictoryDatableProps\",\n    \"VictoryMultiLabelableProps\",\n    \"VictoryEventProps\",\n  ]}\n  overrides={[\"data\"]}\n  notImplemented={[\"polar\"]}\n/>\n\n## Component Props\n\n---\n\n### borderWidth\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `borderWidth` prop sets the border width of the error bars. `borderWidth` will set both x and y error bar width.\n\n```jsx\nborderWidth={10}\n```\n\n---\n\n### data\n\n<Badges>\n  <TypeBadge value=\"{x: number, y: number, errorX: number, errorY: number}[]\" />\n</Badges>\n\nSpecify data via the data prop. By default, `VictoryErrorBar` expects data as an array of objects with `x`, `y`, `errorX` and `errorY` keys. Use the `x`, `y`, `errorX` and `errorY` data accessor props to specify custom data formats.\n\n---\n\n### errorX\n\n<Badges>\n  <TypeBadge value=\"string | integer | string[] | Function\" />\n</Badges>\n\nUse `errorX` data accessor prop to define the x error bar.\n\n**string:** specify which property in an array of data objects should be used as the errorX value\n\n_examples:_ `errorX=\"uncertainty\"`\n\n**function:** use a function to translate each element in a data array into a errorX value\n\n_examples:_ `errorX={() => 10}`\n\n**array index:** specify which index of an array should be used as a errorX value when data is given as an array of arrays\n\n_examples:_ `errorX={1}`\n\n**path string or path array:** specify which property in an array of nested data objects should be used as an errorX value\n\n_examples:_ `errorX=\"measurement.uncertainty\"`, `errorX={[\"measurement\", \"uncertainty\"]}`\n\n---\n\n### errorY\n\n<Badges>\n  <TypeBadge value=\"string | integer | string[] | Function\" />\n</Badges>\n\nUse `errorY` data accessor prop to define the y error bar.\n\n**string:** specify which property in an array of data objects should be used as the errorY value\n\n_examples:_ `errorY=\"uncertainty\"`\n\n**function:** use a function to translate each element in a data array into an errorY value\n\n_examples:_ `errorY={() => 10}`\n\n**array index:** specify which index of an array should be used as an errorY value when data is given as an array of arrays\n\n_examples:_ `errorY={1}`\n\n**path string or path array:** specify which property in an array of nested data objects should be used as an errorY value\n\n_examples:_ `errorY=\"measurement.uncertainty\"`, `errorY={[\"measurement\", \"uncertainty\"]}`\n\n---\n\n### eventKey\n\n<Badges>\n  <TypeBadge value=\"string | integer | string[] | Function\" />\n</Badges>\n\n`VictoryErrorBar` uses the standard `eventKey` prop to specify how event targets are addressed. **This prop is not commonly used.** [Read about the `eventKey` prop in more detail here](/docs/guides/events)\n\n```jsx\neventKey = \"x\";\n```\n\n---\n\n### events\n\n<Badges>\n  <TypeBadge value=\"object[]\" />\n</Badges>\n\n`VictoryErrorBar` uses the standard `events` prop. [Read about it here](/docs/guides/events)\n\nSee the [Events Guide][] for more information on defining events.\n\n```jsx live\n<div>\n  <h3>Click an error bar below</h3>\n  <VictoryErrorBar\n    style={{\n      data: { strokeWidth: 5 },\n    }}\n    events={[\n      {\n        target: \"data\",\n        eventHandlers: {\n          onClick: () => {\n            return [\n              {\n                target: \"data\",\n                mutation: (props) => {\n                  const stroke =\n                    props.style &&\n                    props.style.stroke;\n                  return stroke ===\n                    \"#c43a31\"\n                    ? null\n                    : {\n                        style: {\n                          stroke:\n                            \"#c43a31\",\n                          strokeWidth: 7,\n                        },\n                      };\n                },\n              },\n            ];\n          },\n        },\n      },\n    ]}\n    data={[\n      {\n        x: 15,\n        y: 35,\n        errorX: 1,\n        errorY: 3,\n      },\n      {\n        x: 20,\n        y: 42,\n        errorX: 3,\n        errorY: 2,\n      },\n      {\n        x: 25,\n        y: 30,\n        errorX: 5,\n        errorY: 5,\n      },\n      {\n        x: 30,\n        y: 35,\n        errorX: 5,\n        errorY: 3,\n      },\n      {\n        x: 35,\n        y: 22,\n        errorX: 8,\n        errorY: 2,\n      },\n    ]}\n  />\n</div>\n```\n\n---\n\n### style\n\n<Badges>\n  <TypeBadge value=\"{ parent: object, data: object, labels: object }\" />\n</Badges>\n\n`VictoryErrorBar` uses the standard `style` prop. [Read about it here](/docs/guides/themes)\n\n_default (provided by default theme):_ See [grayscale theme][] for more detail\n\n```jsx live\n<VictoryErrorBar\n  style={{\n    data: {\n      stroke: \"#c43a31\",\n      strokeWidth: 5,\n    },\n    labels: {\n      fontSize: 15,\n      fill: \"#c43a31\",\n    },\n  }}\n  data={sampleErrorData}\n  labels={({ datum }) => datum.x}\n/>\n```\n"
  },
  {
    "path": "website/docs/api/victory-group.mdx",
    "content": "---\ntitle: VictoryGroup\n---\n\n`VictoryGroup` is a wrapper component that renders a given set of children with some shared props. `VictoryGroup` reconciles the domain and layout for all its children, and coordinates animations and shared events. `VictoryGroup` may also be used to supply common data and styles to all its children. This is especially useful when adding markers to a line, or adding voronoi tooltips to data. `VictoryGroup` may also be used to apply an offset to a group of children, as with grouped bar charts, or may be used to stack several components on the same level, _e.g.,_ stacked area charts with data markers.\n\n`VictoryGroup` works with:\n[VictoryArea][], [VictoryBar][], [VictoryBoxPlot][], [VictoryCandlestick][], [VictoryErrorBar][], [VictoryLine][], [VictoryScatter][], [VictoryHistogram][], [VictoryStack][], and [VictoryVoronoi][].\n\n:::note\n`VictoryGroup` _should not_ be used with [VictoryAxis][] children. Use [VictoryChart][] instead.\n:::\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryGroup\n    offset={20}\n    colorScale={\"qualitative\"}\n  >\n    <VictoryBar\n      data={[\n        { x: 1, y: 1 },\n        { x: 2, y: 2 },\n        { x: 3, y: 5 },\n      ]}\n    />\n    <VictoryBar\n      data={[\n        { x: 1, y: 2 },\n        { x: 2, y: 1 },\n        { x: 3, y: 7 },\n      ]}\n    />\n    <VictoryBar\n      data={[\n        { x: 1, y: 3 },\n        { x: 2, y: 4 },\n        { x: 3, y: 9 },\n      ]}\n    />\n  </VictoryGroup>\n</VictoryChart>\n```\n\n## Inherited Props\n\n<CommonProps\n  interfaces={[\n    \"VictoryCommonProps\",\n    \"VictoryDatableProps\",\n    \"VictoryMultiLabelableProps\",\n    \"VictoryEventProps\",\n  ]}\n  overrides={[\"animate\"]}\n/>\n\n## Component Props\n\n---\n\n### children\n\n<Badges>\n  <TypeBadge value=\"ReactElement | ReactElement[]\" />\n</Badges>\n\n`VictoryGroup` works with any combination of the following children: [VictoryArea][], [VictoryBar][], [VictoryCandlestick][], [VictoryErrorBar][], [VictoryLine][], [VictoryScatter][], [VictoryHistogram][], [VictoryStack][], and [VictoryVoronoi][]. Children supplied to `VictoryGroup` will be cloned and rendered with new props so that all children share common props such as `domain` and `scale`.\n\n---\n\n### color\n\n<Badges>\n  <TypeBadge value=\"string\" />\n</Badges>\n\nThe `color` prop is an optional prop that defines a single color to be applied to the children of `VictoryGroup`. The `color` prop will override colors specified via `colorScale`.\n\n```jsx live\n<VictoryGroup\n  data={sampleData}\n  color=\"blue\"\n>\n  <VictoryLine />\n  <VictoryScatter\n    size={6}\n    symbol=\"star\"\n  />\n</VictoryGroup>\n```\n\n---\n\n### eventKey\n\n<Badges>\n  <TypeBadge value=\"string | number | string[] | number[] | (args: CallbackArgs) => string | number\" />\n</Badges>\n\n`VictoryGroup` uses the standard `eventKey` prop to specify how event targets are addressed. **This prop is not commonly used.** [Read about the `eventKey` prop in more detail here](/docs/guides/events)\n\n```jsx\neventKey = \"x\";\n```\n\n---\n\n### events\n\n<Badges>\n  <TypeBadge value=\"array[object]\" />\n</Badges>\n\n`VictoryGroup` uses the standard `events` prop. [Read about it in more detail here](/docs/guides/events)\n\n:::note\n`VictoryGroup` coordinates events between children using the `VictorySharedEvents` and the `sharedEvents` prop\n:::\n\n```jsx live\n<VictoryGroup\n  offset={20}\n  events={[\n    {\n      childName: \"all\",\n      target: \"data\",\n      eventHandlers: {\n        onClick: () => {\n          return [\n            {\n              childName: \"bar-2\",\n              target: \"data\",\n              mutation: (props) => ({\n                style: Object.assign(\n                  {},\n                  props.style,\n                  { fill: \"gold\" },\n                ),\n              }),\n            },\n            {\n              childName: \"bar-3\",\n              target: \"data\",\n              mutation: (props) => ({\n                style: Object.assign(\n                  {},\n                  props.style,\n                  { fill: \"orange\" },\n                ),\n              }),\n            },\n            {\n              childName: \"bar-4\",\n              target: \"data\",\n              mutation: (props) => ({\n                style: Object.assign(\n                  {},\n                  props.style,\n                  { fill: \"red\" },\n                ),\n              }),\n            },\n          ];\n        },\n      },\n    },\n  ]}\n>\n  <VictoryBar\n    name=\"bar-1\"\n    data={[\n      { x: \"a\", y: 2 },\n      { x: \"b\", y: 3 },\n      { x: \"c\", y: 5 },\n    ]}\n  />\n  <VictoryBar\n    name=\"bar-2\"\n    data={[\n      { x: \"a\", y: 1 },\n      { x: \"b\", y: 4 },\n      { x: \"c\", y: 5 },\n    ]}\n  />\n  <VictoryBar\n    name=\"bar-3\"\n    data={[\n      { x: \"a\", y: 3 },\n      { x: \"b\", y: 2 },\n      { x: \"c\", y: 6 },\n    ]}\n  />\n  <VictoryBar\n    name=\"bar-4\"\n    data={[\n      { x: \"a\", y: 2 },\n      { x: \"b\", y: 3 },\n      { x: \"c\", y: 3 },\n    ]}\n  />\n</VictoryGroup>\n```\n\n---\n\n### offset\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `offset` prop determines the number of pixels each element in a group should be offset from its original position on the independent axis. In the case of groups of bars, this number should be equal to the width of the bar plus the desired spacing between bars.\n\n```jsx live\n<VictoryGroup offset={25}>\n  <VictoryBar\n    data={[\n      { x: \"a\", y: 2 },\n      { x: \"b\", y: 3 },\n      { x: \"c\", y: 5 },\n    ]}\n  />\n  <VictoryBar\n    data={[\n      { x: \"a\", y: 1 },\n      { x: \"b\", y: 4 },\n      { x: \"c\", y: 5 },\n    ]}\n  />\n  <VictoryBar\n    data={[\n      { x: \"a\", y: 3 },\n      { x: \"b\", y: 2 },\n      { x: \"c\", y: 6 },\n    ]}\n  />\n</VictoryGroup>\n```\n\n---\n\n### style\n\n<Badges>\n  <TypeBadge value=\"VictoryStyleInterface\" />\n  <DefaultsBadge value=\"(provided by theme)\" />\n</Badges>\n\nDefines the style of the component using [VictoryStyleInterface](/docs/api/victory-style-interface).\n\nStyles on children of `VictoryGroup` will override styles set on the `VictoryGroup` component.\n\n_default (provided by default theme):_ See [grayscale theme][] for more detail\n\n```jsx live\n<VictoryGroup\n  offset={25}\n  style={{\n    data: {\n      fillOpacity: 0.7,\n      stroke: \"black\",\n      strokeWidth: 3,\n    },\n  }}\n>\n  <VictoryBar\n    style={{\n      data: { stroke: \"#c43a31\" },\n    }}\n    data={[\n      { x: \"a\", y: 2 },\n      { x: \"b\", y: 3 },\n      { x: \"c\", y: 5 },\n    ]}\n  />\n  <VictoryBar\n    data={[\n      { x: \"a\", y: 1 },\n      { x: \"b\", y: 4 },\n      { x: \"c\", y: 5 },\n    ]}\n  />\n  <VictoryBar\n    data={[\n      { x: \"a\", y: 3 },\n      { x: \"b\", y: 2 },\n      { x: \"c\", y: 6 },\n    ]}\n  />\n</VictoryGroup>\n```\n\n[animations guide]: /docs/guides/animations\n[data accessors guide]: /docs/guides/data-accessors\n[events guide]: /docs/guides/events\n[themes guide]: /docs/guides/themes\n[grayscale theme]: https://github.com/FormidableLabs/victory/blob/main/packages/victory-core/src/victory-theme/grayscale.tsx\n[victoryarea]: /docs/api/victory-area\n[victoryaxis]: /docs/api/victory-axis\n[victorybar]: /docs/api/victory-bar\n[victoryboxplot]: /docs/api/victory-boxplot\n[victorycandlestick]: /docs/api/victory-candlestick\n[victorychart]: /docs/api/victory-chart\n[victoryerrorbar]: /docs/api/victory-error-bar\n[victoryline]: /docs/api/victory-line\n[victoryscatter]: /docs/api/victory-scatter\n[victoryhistogram]: /docs/api/victory-histogram\n[victorystack]: /docs/api/victory-stack\n[victoryvoronoi]: /docs/api/victory-voronoi\n[victorylabel]: /docs/api/victory-label\n[x]: /docs/api/victory-datatable-props#x\n[y]: /docs/api/victory-datatable-props#y\n"
  },
  {
    "path": "website/docs/api/victory-histogram.mdx",
    "content": "---\ntitle: VictoryHistogram\n---\n\n:::info\nFor examples of `VictoryHistogram` in action, visit the [Histogram Chart](/docs/charts/histogram) examples.\n:::\n\n## Inherited Props\n\n<CommonProps\n  interfaces={[\n    \"VictoryCommonProps\",\n    \"VictoryDatableProps\",\n    \"VictoryMultiLabelableProps\",\n    \"VictoryEventProps\",\n  ]}\n  overrides={[\"data\"]}\n  notImplemented={[\"polar\", \"y\", \"y0\"]}\n/>\n\n## Component Props\n\n---\n\n### bins\n\n<Badges>\n  <TypeBadge value=\"number | number[] | Date[]\" />\n</Badges>\n\n**`VictoryHistogram` uses [`d3.bin`](https://observablehq.com/@d3/d3-bin) to do binning.**\n\nThe `bins` prop is used to specify how the data will be binned. There are a few options for this, the first being passing no value, ie the default behavior, which is letting `d3.bin` generate the buckets based on the data. The second is passing a number, which specifies _approximately_ the number of bins to generate, this is not a guarantee (see `d3.bin` for more details). The last options are passing an array of numbers or dates (depending on the data), this array represents an array of thresholds. So for example if the bin prop provided is `[0, 10, 20, 35]`, this would result in 3 bins, that would look like [0, 10) , [10, 20), \\[20, 35\\].\n\nThis prop allows for a lot of flexibility in how the data is displayed. For example it is possible to have uneven sized bins if so desired. It is also possible to group the data by days, weeks, or years.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 20 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryHistogram\n    data={sampleHistogramData}\n    bins={[0, 3, 7, 10]}\n  />\n</VictoryChart>\n```\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 20 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryHistogram\n    data={sampleHistogramDateData}\n    bins={[\n      new Date(2020, 1, 1),\n      new Date(2020, 4, 1),\n      new Date(2020, 8, 1),\n      new Date(2020, 11, 1),\n    ]}\n  />\n</VictoryChart>\n```\n\n```jsx live noInline\nconst App = () => {\n  const niceTimeScale = d3Scale\n    .scaleTime()\n    .domain(\n      d3Array.extent(\n        sampleHistogramDateData,\n        ({ x }) => x,\n      ),\n    )\n    .nice();\n\n  // get thresholds to bin data by months\n  const bins = niceTimeScale.ticks(\n    d3Time.utcMonth,\n  ); // try utcDay\n\n  return (\n    <VictoryChart\n      domainPadding={{ x: 20 }}\n      theme={VictoryTheme.clean}\n    >\n      <VictoryHistogram\n        data={sampleHistogramDateData}\n        bins={bins}\n      />\n    </VictoryChart>\n  );\n};\n\nrender(<App />);\n```\n\n---\n\n### binSpacing\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `binSpacing` prop is used to specify space between each bin. `binSpacing` represents the number of pixels that will be between each bin (including at the beginning and end of the bins). By default, bins are rendered with no spacing.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 20 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryHistogram\n    binSpacing={20}\n    data={sampleHistogramData}\n  />\n</VictoryChart>\n```\n\n---\n\n### cornerRadius\n\n<Badges>\n  <TypeBadge value=\"Function | number | { top, bottom, topLeft, topRight, bottomLeft, bottomRight }\" />\n</Badges>\n\nThe `cornerRadius` prop specifies a radius to apply to each bar. If this prop is given as a single number, the radius will only be applied to the _top_ of each bar. When this prop is given as a function, it will be evaluated for each bar with the props object corresponding to that bar.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 15 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryHistogram\n    cornerRadius={{\n      topLeft: ({ datum }) =>\n        datum.y * 4,\n    }}\n    data={sampleHistogramData}\n  />\n</VictoryChart>\n```\n\n---\n\n### data\n\n<Badges>\n  <TypeBadge value=\"any[]\" />\n</Badges>\n\n`VictoryHistogram` uses the standard data prop, except for it only expects each object within the array to have an `x` property. The `x` data accessor prop can be used to define a custom data property.\n\nBecause each bar represents a bin rather than a particular data point (like with `VictoryScatter` for example), when accessing `datum` via a prop that passes `datum` such as style, `datum` will have properties `x`, `x0`, `x1`, `y`, and `binnedData`. `x` is the midpoint between the bin, `x0` is the beginning of the bin, `x1` is the end of the bin, `y` is the aggregate amount of data points within that bin, and `binnedData` is an array of the original data points that were grouped into this bin.\n\n---\n\n### eventKey\n\n<Badges>\n  <TypeBadge value=\"string | integer | string[] | Function\" />\n</Badges>\n\n`VictoryHistogram` uses the standard `eventKey` prop to specify how event targets are addressed. **This prop is not commonly used.** [Read about the `eventKey` prop in more detail here](/docs/guides/events)\n\n---\n\n### events\n\n<Badges>\n  <TypeBadge value=\"object[]\" />\n</Badges>\n\n`VictoryHistogram` uses the standard `events` prop. [Read about it here](/docs/guides/events)\n\nSee the [Events Guide][] for more information on defining events.\n\n```jsx live\n<div>\n  <h3>Click a bar below</h3>\n  <VictoryHistogram\n    events={[\n      {\n        target: \"data\",\n        eventHandlers: {\n          onClick: () => {\n            return [\n              {\n                target: \"data\",\n                mutation: (props) => {\n                  const fill =\n                    props.style &&\n                    props.style.fill;\n                  return fill ===\n                    \"black\"\n                    ? null\n                    : {\n                        style: {\n                          fill: \"black\",\n                        },\n                      };\n                },\n              },\n            ];\n          },\n        },\n      },\n    ]}\n    data={sampleHistogramData}\n    theme={VictoryTheme.clean}\n  />\n</div>\n```\n\n---\n\n### style\n\n<Badges>\n  <TypeBadge value=\"{ parent: object, data: object, labels: object }\" />\n</Badges>\n\n`VictoryHistogram` uses the standard `style` prop. [Read about it here](/docs/guides/themes)\n\n_default (provided by default theme):_ See [grayscale theme][] for more detail\n\n```jsx live\n<VictoryHistogram\n  style={{\n    data: {\n      fill: ({ datum }) =>\n        datum.y === 3\n          ? \"#000000\"\n          : \"lightblue\",\n      stroke: ({ index }) =>\n        +index % 2 === 0\n          ? \"#000000\"\n          : \"lightblue\",\n      fillOpacity: 0.7,\n      strokeWidth: 3,\n    },\n    labels: {\n      fontSize: 15,\n      fill: ({ datum }) =>\n        datum.y === 3\n          ? \"#000000\"\n          : \"lightblue\",\n    },\n  }}\n  data={sampleHistogramData}\n  labels={({ datum }) => datum.y}\n/>\n```\n"
  },
  {
    "path": "website/docs/api/victory-label.mdx",
    "content": "---\ntitle: VictoryLabel\n---\n\nVictoryLabel renders the label components that are used across all of Victory.\n\n## Component Props\n\n---\n\n### angle\n\n<Badges>\n  <TypeBadge value=\"string | number\" />\n</Badges>\n\n\nThe `angle` prop specifies the angle to rotate the text around its anchor point.\n\n```jsx live\n<VictoryScatter\n  domain={[-10, 10]}\n  data={[{ x: 0, y: 0 }]}\n  labels=\"This is a label\"\n  labelComponent={\n    <VictoryLabel angle={-45} textAnchor=\"end\"/>\n  }\n/>\n```\n\n---\n\n### backgroundComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<Rect/>\" />\n</Badges>\n\nThe `backgroundComponent` prop takes a component instance which will be used to create backgrounds for labels. The new element created from the passed `backgroundComponent` will be supplied with the following properties: x, y, height, width, style, and transform. Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If `backgroundComponent` is omitted, a default [Rect][] component will be created with props described above. `backgroundComponent` is only rendered when a `backgroundStyle` prop is added to `VictoryLabel`.\n\n_examples:_ `backgroundComponent={<Rect height={50}/>}`\n\n---\n\n### backgroundPadding\n\n<Badges>\n  <TypeBadge value=\"number || array || { top: number, bottom: number, left: number, right: number }\" />\n  <DefaultsBadge value=\"<Rect/>\" />\n</Badges>\n\nThe `backgroundPadding` prop adds padding around background elements. This prop may be given as a number or an object with values for \"top\", \"bottom\", \"left\", and \"right\". In the case of multi-line, multi-background labels, this prop may be given as an array.\n\n```jsx live\n<VictoryScatter\n  domain={[-10, 10]}\n  data={[{ x: 0, y: 0 }]}\n  labels={() => [\"This is a\", \"multi-line\", \"label\"]}\n  labelComponent={\n    <VictoryLabel\n      dy={-20}\n      textAnchor=\"start\"\n      backgroundPadding={[\n      \t3,\n      \t{ left: 20, right: 20 },\n        { left: 20}\n      ]}\n      backgroundStyle={[\n        { fill: \"red\", opacity: 0.2 },\n        { fill: \"green\", opacity: 0.2 },\n        { fill: \"blue\", opacity: 0.2 }\n      ]}\n    />\n  }\n/>\n```\n\n---\n\n### backgroundStyle\n\n<Badges>\n  <TypeBadge value=\"VictoryLabelStyleObject | VictoryLabelStyleObject[]\" />\n</Badges>\n\n\nThe `backgroundStyle` prop defines a set of SVG style properties that will be applied to the rendered\nbackground element(s). This prop should be given as an object, or array of objects. When this prop is\ngiven as an array of objects _and_ there are multi-line labels, multiple background elements will be rendered, and styled individually. When this prop is given as an object, a single background element will be rendered for the entire label.\n\n```jsx live\n<VictoryScatter\n  domain={[-10, 10]}\n  data={[{ x: 0, y: 0 }]}\n  labels={() => [\"This is a\", \"multi-line\", \"label\"]}\n  labelComponent={\n    <VictoryLabel\n      backgroundStyle={{ fill: \"pink\" }}\n      backgroundPadding={3}\n    />\n  }\n/>\n```\n\n---\n\n### capHeight\n\n<Badges>\n  <TypeBadge value=\"string | number | (args: CallbackArgs) => string | number\" />\n</Badges>\n\nThe `capHeight` prop defines a text metric for the font being used: the expected height of capital letters. This is necessary because of SVG, which (a) positions the _bottom_ of the text at `y`, and (b) has no notion of line height. This prop should be given as a number of ems.\n\n---\n\n### className\n\n<Badges>\n  <TypeBadge value=\"string\" />\n</Badges>\n\nThe `className` prop specifies a class name that will be applied to the rendered text element.\n\n---\n\n### data\n\n<Badges>\n  <TypeBadge value=\"any[]\" />\n</Badges>\n\nVictory components can pass a `data` prop to their label component. This can be useful in custom components that need to make use of the entire dataset.\n\n---\n\n### datum\n\n<Badges>\n  <TypeBadge value=\"any\" />\n</Badges>\n\nVictory components can pass a `datum` prop to their label component. This can be used to calculate functional styles, and determine text. If `x` and `y` are not specified, `datum` will be used to determine label position.\n\n---\n\n### desc\n\n<Badges>\n  <TypeBadge value=\"string\" />\n</Badges>\n\nThe `desc` prop specifies the description of the chart/SVG to assist with accessibility for screen readers. The more descriptive this title is, the more useful it will be for people using screen readers.\n\n---\n\n### direction\n\n<Badges>\n  <TypeBadge value='\"rtl\" | \"ltr\" | \"inherit\"' />\n  <DefaultsBadge value='\"inherit\"' />\n</Badges>\n\nThe `direction` prop determines which text direction to apply to the rendered `text` element\n\n---\n\n### dx\n\n<Badges>\n  <TypeBadge value=\"string | number | (args: CallbackArgs) => string | number\" />\n</Badges>\n\nThe `dx` prop defines a horizontal shift from the `x` coordinate.\n\n```jsx live\n<VictoryScatter\n  domain={[-10, 10]}\n  data={[{ x: 0, y: 0 }]}\n  labels={() => [\"This is a\", \"multi-line\", \"label\"]}\n  style={{ labels: { padding: 0 } }}\n  labelComponent={\n    <VictoryLabel\n      dx={20}\n      textAnchor=\"start\"\n      verticalAnchor=\"middle\"\n    />\n  }\n/>\n```\n\n---\n\n### dy\n\n<Badges>\n  <TypeBadge value=\"string | number | (args: CallbackArgs) => string | number\" />\n</Badges>\n\nThe `dy` prop defines a vertical shift from the `y` coordinate. This prop is affected by `capHeight`, `lineHeight`, and `verticalAnchor`, and the number of lines of text that make up the label.\n\n```jsx live\n<VictoryScatter\n  domain={[-10, 10]}\n  data={[{ x: 0, y: 0 }]}\n  labels={() => [\"This is a\", \"multi-line\", \"label\"]}\n  style={{ labels: { padding: 0 } }}\n  labelComponent={\n    <VictoryLabel\n      dy={20}\n      textAnchor=\"end\"\n      verticalAnchor=\"start\"\n    />\n  }\n/>\n```\n\n---\n\n### events\n\n<Badges>\n  <TypeBadge value=\"array[object]\" />\n</Badges>\n\nThe `events` prop attaches arbitrary event handlers to the label component. This prop should be given as an object of event names and corresponding event handlers. When events are provided via Victory's event system, event handlers will be called with the event, the props of the component it is attached to, and an `eventKey`.\n\n_example:_ `events={{onClick: (evt) => alert(\"x: \" + evt.clientX)}}`\n\n---\n\n### groupComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n</Badges>\n\nThe `groupComponent` prop takes a component instance which will be used to create group elements when `VictoryLabel` renders both labels and backgrounds.\n\n_default:_ `<g/>`\n\n---\n\n### id\n\n<Badges>\n  <TypeBadge value=\"string | number | (args: CallbackArgs) => string | number\" />\n</Badges>\n\nThe `id` prop specifies a HTML ID that will be applied to the rendered text element.\n\n---\n\n### inline\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n</Badges>\n\nWhen the `text` property contains an array of strings, the `inline` property lets the `<tspan />` elements lay out next to each other. If this property is not specified, the `<tspan />` elements will stack vertically instead.\n\n_default:_ `false`\n\n```jsx live\n<VictoryScatter\n  domain={[-10, 10]}\n  data={[{ x: 0, y: 0 }]}\n  labels={() => [\"This is a\", \"multi-line\", \"label\"]}\n  labelComponent={\n    <VictoryLabel\n      inline\n      style={[\n        { fill: \"red\" },\n        { fill: \"green\" },\n        { fill: \"blue\" }\n      ]}\n    />\n  }\n/>\n```\n\n---\n\n### labelPlacement\n\n<Badges>\n  <TypeBadge value='\"parallel\" || \"perpendicular\" || \"vertical\"' />\n</Badges>\n\nThe `labelPlacement` prop is used to specify the placement of labels relative to the data point they represent. This prop may be given as \"vertical\", \"parallel\" or \"perpendicular\". This props is particularly useful in polar charts, where it may be desirable to position a label either parallel or perpendicular to its corresponding angle. When this prop is not set, perpendicular label placement will be used for polar charts, and vertical label placement will be used for cartesian charts.\n\n---\n\n### lineHeight\n\n<Badges>\n  <TypeBadge value=\"string || number || function || array\" />\n</Badges>\n\nThe `lineHeight` prop defines how much space a single line of text should take up. Note that SVG has no notion of line-height, so the positioning may differ slightly from what you would expect with CSS, but the result is similar: a roughly equal amount of extra space is distributed above and below the line of text. This prop should be given as a number of ems.\n\n```jsx live\n<VictoryScatter\n  domain={[-10, 10]}\n  data={[{ x: 0, y: 0 }]}\n  labels={() => [\"This is a\", \"multi-line\", \"label\"]}\n  labelComponent={\n    <VictoryLabel\n      lineHeight={[1, 1, 3]}\n      style={[\n        { fill: \"red\" },\n        { fill: \"green\" },\n        { fill: \"blue\" }\n      ]}\n    />\n  }\n/>\n```\n\n---\n\n### origin\n\n<Badges>\n  <TypeBadge value=\"{ x: number, y: number }\" />\n</Badges>\n\nVictory components will pass an `origin` prop is to define the center point in svg coordinates for polar charts. **This prop should not be set manually.**\n\n---\n\n### polar\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n</Badges>\n\nVictory components can pass a boolean `polar` prop to specify whether a label is part of a polar chart. **This prop should not be set manually.**\n\n---\n\n### renderInPortal\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n</Badges>\n\nThe `renderInPortal` prop specifies whether `VictoryLabel` should render text in place or within a `VictoryPortal`. Setting `renderInPortal` to true is equivalent to wrapping `VictoryLabel` in a `VictoryPortal`. This prop is false by default.\n\n---\n\n### scale\n\n<Badges>\n  <TypeBadge value=\"{ x: scale, y: scale }\" />\n</Badges>\n\nVictory components can pass a `scale` prop to their label component. This can be used to calculate the position of label elements from `datum`. **This prop should not be set manually.**\n\n---\n\n### style\n\n<Badges>\n  <TypeBadge value=\"any[]\" />\n</Badges>\n\nThe `style` prop defines a set of SVG style properties that will be applied to the rendered\n`<text/>` element. This prop should be given as an object, or array of objects. When this prop is\ngiven as an array of objects, each style object in the array will be applied to the corresponding\n`<tspan/>` in multi-line labels. When this prop is given as an array with fewer elements than there are `<tspan/>` elements, the _first_ element of the style array will be applied to extra lines.\n\n```jsx live\n<VictoryScatter\n  domain={[-10, 10]}\n  data={[{ x: 0, y: 0 }]}\n  labels={() => [\"This is a\", \"multi-line\", \"label\"]}\n  labelComponent={\n    <VictoryLabel\n      style={[\n        { fill: \"red\", fontSize: 25 },\n        { fill: \"green\", fontFamily: \"monospace\" }\n      ]}\n    />\n  }\n/>\n```\n\n---\n\n### tabIndex\n\n<Badges>\n  <TypeBadge value=\" number | (args: CallbackArgs) => number\" />\n</Badges>\n\nThe `tabIndex` prop specifies the `tabIndex` that will be applied to the rendered label. This prop may be given as a number or as a function that returns a number.\n\n---\n\n### text\n\n<Badges>\n  <TypeBadge value=\"string | string[]| number | (args: CallbackArgs) => string | number\" />\n</Badges>\n\nThe `text` prop defines the text `VictoryLabel` will render. The `text` prop may be given as a\nstring, number, a function of `datum`, or an array of any of these. Strings may include newline\ncharacters, which `VictoryLabel` will split into separate `<tspan/>` elements. When `text` is given\nas an array, separate `<tspan/>` elements will be created for each element in the array.\n\n_examples:_ `text={(datum) => \"x: \" + datum.x}`, `text=\"Apples\\n(green)\"`, `text={[\"first line\", \"second line\"]}`\n\n```jsx live\n<VictoryScatter\n  domain={[-10, 10]}\n  data={[{ x: 0, y: 0 }]}\n  labels={true}\n  labelComponent={\n    <VictoryLabel\n      text={({ datum }) => [`x: ${datum.x}`, `y: ${datum.y}`]}\n    />\n  }\n/>\n```\n\n---\n\n### textComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<Text />\" />\n</Badges>\n\nThe `textComponent` prop takes a component instance which will be used to create text elements when `VictoryLabel` renders labels.\n\n---\n\n### textAnchor\n\n<Badges>\n  <TypeBadge value='\"start\" || \"middle\" || \"end\" || \"inherit\" || function' />\n</Badges>\n\nThe `textAnchor` prop defines how the text is horizontally positioned relative to the given `x` and `y` coordinates. Options are \"start\", \"middle\", \"end\", and \"inherit\". This prop may also be given as a function that returns one of these options.\n\n```jsx live\n<VictoryScatter\n  domain={[-10, 10]}\n  data={[{ x: 0, y: 0 }]}\n  labels={() => [\"This is a\", \"multi-line\", \"label\"]}\n  labelComponent={\n    <VictoryLabel\n      textAnchor={({ text }) => text.length > 1 ? \"start\" : \"middle\"}\n    />\n  }\n/>\n```\n\n---\n\n### transform\n\n<Badges>\n  <TypeBadge value='string | object | function' />\n</Badges>\n\nThe `transform` prop applies a transform to the rendered `<text>` element. This prop may be supplied as a string or an object containing transform definitions.\n\n```jsx live\n<VictoryScatter\n  domain={[-10, 10]}\n  data={[{ x: 0, y: 0 }]}\n  labels={() => [\"This is a\", \"multi-line\", \"label\"]}\n  labelComponent={\n    <VictoryLabel\n      transform=\"skewX(30)\"\n    />\n  }\n/>\n```\n\n---\n\n### verticalAnchor\n\n<Badges>\n  <TypeBadge value='\"start\" | \"middle\" | \"end\"' />\n</Badges>\n\nThe `verticalAnchor` prop defines how the text is vertically positioned relative to the given `x` and `y` coordinates. Options are \"start\", \"middle\" and \"end\". This prop may also be given as a function that returns one of these options.\n\n```jsx live\n<VictoryScatter\n  domain={[-10, 10]}\n  data={[{ x: 0, y: 0 }]}\n  labels={() => [\"This is a\", \"multi-line\", \"label\"]}\n  labelComponent={\n    <VictoryLabel\n      verticalAnchor={({ text }) => text.length > 1 ? \"start\" : \"middle\"}\n    />\n  }\n/>\n```\n\n---\n\n### x\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `x` prop defines the x coordinate to use as a basis for positioning the label element. Please note that this prop should be given in terms of `svg` coordinates, not data coordinates. To add a label annotation to a chart that is fixed to a specific _data_ coordinate, please use the `scale` prop that `VictoryChart` provides to its children to transform data coordinates into `svg` coordinates.\n\n```jsx live noInline\n  const DataLabel = props => {\n    const x = props.scale.x(props.x);\n    const y = props.scale.y(props.y);\n    return <VictoryLabel {...props} x={x} y={y}/>\n  };\n\n  const MyChart = () => {\n    return (\n      <VictoryChart domain={ [0, 10]}>\n        <VictoryLine />\n        <VictoryScatter data={[{ x: 5, y: 5 }]} />\n        <DataLabel\n          x={5}\n          y={5}\n          dy={10}\n          text=\"a custom data coordinate label\"\n        />\n        <VictoryLabel\n          x={55}\n          y={50}\n          text=\"an svg coordinate label\"\n        />\n      </VictoryChart>\n    );\n  };\n\n\nrender(<MyChart/>);\n```\n\n---\n\n### y\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `y` prop defines the y coordinate to use as a basis for positioning the label element. Please note that this prop should be given in terms of `svg` coordinates, not data coordinates.\n\n[Rect]: /docs/api/victory-primitives#rect\n"
  },
  {
    "path": "website/docs/api/victory-labelable-props.mdx",
    "content": "---\ntitle: VictoryLabelableProps\n---\n\nA set of props available to components that can display labels.\n\n## Props\n\n---\n\n### labelComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<VictoryLabel>\" />\n</Badges>\n\nThe `labelComponent` prop takes a component instance which will be used to render labels for the component. The new element created from the passed `labelComponent` will be supplied with the following properties: x, y, index, data, datum, verticalAnchor, textAnchor, angle, style, text, and events. Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If `labelComponent` is omitted, a new [VictoryLabel][] will be created with the props described above. [VictoryTooltip][] is commonly used as a `labelComponent`\n\n:::note\n`labelComponent` is not currently supported for `VictoryBoxPlot` as it has its own label components (`maxLabelComponent`, `medianLabelComponent`, `minLabelComponent`, `q1LabelComponent` & `q3LabelComponent`). See [VictoryBoxPlot][] for more info.\n:::\n\n#### Common Usage\n\n- `labelComponent={<VictoryLabel dy={20}/>}`\n- `labelComponent={<VictoryTooltip/>}`\n\n```jsx live\n<VictoryBar\n  data={sampleData}\n  labels={({ datum }) => datum.y}\n  style={{ labels: { fill: \"white\" } }}\n  labelComponent={<VictoryLabel dy={30} />}\n  theme={VictoryTheme.clean}\n/>\n```\n"
  },
  {
    "path": "website/docs/api/victory-legend.mdx",
    "content": "---\ntitle: VictoryLegend\n---\n\n:::info\nFor examples of `VictoryLegend` in action, visit the [Chart Legends](/docs/guides/legends) guide.\n:::\n\n## Inherited Props\n\n<CommonProps\n  interfaces={[\n    \"VictoryCommonProps\",\n    \"VictoryDatableProps\",\n    \"VictorySingleLabelableProps\",\n    \"VictoryEventProps\",\n  ]}\n  overrides={[\n    \"containerComponent\",\n    \"data\",\n    \"dataComponent\",\n    \"events\",\n    \"x\",\n    \"y\",\n  ]}\n  notImplemented={[\"y0\"]}\n/>\n\n## Component Props\n\n---\n\n### borderComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<Border/>\" />\n</Badges>\n\nThe `borderComponent` prop takes a component instance which will be responsible for rendering a border around the legend. The new element created from the passed `borderComponent` will be provided with the following properties calculated by `VictoryLegend`: `x`, `y`, `width`, `height`, and `style`. Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If a `borderComponent` is not provided, `VictoryLegend` will use its default [Border][] component. Please note that the default width and height calculated for the border component is based on _approximated_ text measurements, and may need to be adjusted.\n\n```jsx\nborderComponent={<Border width={300}/>}\n```\n\n---\n\n### borderPadding\n\n<Badges>\n  <TypeBadge value=\"number || { top: number, bottom: number, left: number, right: number }\" />\n  <DefaultsBadge value=\"<Area>\" />\n</Badges>\n\nThe `borderPadding` specifies the amount of padding that should be added between the legend items and the border. This prop may be given as a number, or as an object with values specified for `top`, `bottom`, `left`, and `right`. Please note that the default width and height calculated for the border component is based on _approximated_ text measurements, so padding may need to be adjusted.\n\n```jsx\nborderPadding={{ top: 20, bottom: 10 }}\n```\n\n---\n\n### centerTitle\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n</Badges>\n\nThe `centerTitle` boolean prop specifies whether a legend title should be centered.\n\n```jsx live\n<VictoryLegend\n  x={125}\n  y={10}\n  title=\"Legend\"\n  centerTitle\n  orientation=\"horizontal\"\n  gutter={20}\n  style={{\n    border: { stroke: \"black\" },\n    title: { fontSize: 20 },\n  }}\n  data={[\n    { name: \"One\" },\n    { name: \"Two\" },\n    { name: \"Three\" },\n  ]}\n/>\n```\n\n---\n\n### containerComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<VictoryContainer/>\" />\n</Badges>\n\n`VictoryLegend` uses the standard `containerComponent` prop. [Read about it here](/docs/api/victory-common-theme-props#containercomponent)\n\n:::warning\n`VictoryLegend` only works with the `VictoryContainer` component\n:::\n\n```jsx\ncontainerComponent={<VictoryContainer responsive={false}/>}\n```\n\n---\n\n### data\n\n<Badges>\n  <TypeBadge value=\"array[{ name, symbol, labels }]\" />\n  <DefaultsBadge value='[{ name: \"Series 1\" }, { name: \"Series 2\" }]}' />\n</Badges>\n\nSpecify data via the `data` prop. `VictoryLegend` expects data as an array of objects with `name` (required), `symbol`, and `labels` properties. The `data` prop must be given as an array. The symbol rendered may be changed by altering the `type` property of the `symbol` object. Valid types include: circle\", \"diamond\", \"plus\", \"minus\", \"square\", \"star\", \"triangleDown\", and \"triangleUp\". If you want to use SVG icons from a custom component or an SVG based icon library like [react-icons](https://react-icons.github.io/react-icons/) use the `dataComponent` property.\n\n```jsx live\n<VictoryLegend\n  x={125}\n  y={50}\n  orientation=\"horizontal\"\n  gutter={20}\n  style={{\n    border: { stroke: \"black\" },\n  }}\n  data={[\n    {\n      name: \"One\",\n      symbol: {\n        fill: \"tomato\",\n        type: \"star\",\n      },\n    },\n    {\n      name: \"Two\",\n      symbol: { fill: \"orange\" },\n      labels: { fill: \"orange\" },\n    },\n    {\n      name: \"Three\",\n      symbol: { fill: \"gold\" },\n    },\n  ]}\n/>\n```\n\n---\n\n### dataComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<Point/>\" />\n</Badges>\n\n`VictoryLegend` uses the standard `dataComponent` prop. [Read about it here](/docs/api/victory-datatable-props#datacomponent)\n\n`VictoryLegend` supplies the following props to its `dataComponent`: `data`, `datum`, `events`, `index`, `x`, `y`, `size`, `style`, and `symbol`. `VictoryLegend` renders a [Point][] component by default.\n\n```jsx\ndataComponent={<Point events={{ onClick: handleClick }}/>}\n```\n\nAn example of using Custom icons as `dataComponent` in `VictoryLegend`.\n\n```jsx live noInline\nconst { FaSun } = reactIconsFa;\n\nconst CustomIcon = (props) => {\n  return (\n    <FaSun\n      fill={\n        props?.style?.fill || \"green\"\n      }\n      x={props.x - 7}\n      y={props.y - 7}\n      size={15}\n    />\n  );\n};\n\nfunction App() {\n  return (\n    <VictoryLegend\n      orientation={\"horizontal\"}\n      x={65}\n      y={50}\n      data={[\n        {\n          name: \"One\",\n          symbol: { fill: \"orange\" },\n        },\n        {\n          name: \"Two\",\n          symbol: { fill: \"blue\" },\n        },\n        { name: \"Three\" },\n      ]}\n      dataComponent={<CustomIcon />}\n    />\n  );\n}\n\nrender(<App />);\n```\n\nAn example of using multiple Custom icons as `dataComponent` in `VictoryLegend`.\n\n```jsx live noInline\nconst CustomMultipleIcon = (props) => {\n  const { x, y, datum } = props;\n  const Icon = reactIconsFa[datum.icon];\n  return (\n    <Icon\n      x={x - 7}\n      y={y - 7}\n      size={15}\n    />\n  );\n};\n\nfunction App() {\n  return (\n    <VictoryLegend\n      orientation={\"horizontal\"}\n      x={65}\n      y={50}\n      data={[\n        { name: \"One\", icon: \"FaMoon\" },\n        { name: \"Two\", icon: \"FaSun\" },\n        {\n          name: \"Three\",\n          icon: \"FaStar\",\n        },\n      ]}\n      dataComponent={\n        <CustomMultipleIcon />\n      }\n    />\n  );\n}\n\nrender(<App />);\n```\n\n---\n\n### eventKey\n\n<Badges>\n  <TypeBadge value=\"string | integer | string[] | function\" />\n</Badges>\n\n`VictoryLegend` uses the standard `eventKey` prop to specify how event targets are addressed. **This prop is not commonly used.** [Read about the `eventKey` prop in more detail here](/docs/guides/events)\n\n---\n\n### events\n\n<Badges>\n  <TypeBadge value=\"array[object]\" />\n</Badges>\n\n`VictoryLegend` uses the standard `events` prop. [Read about it here](/docs/guides/events)\n\nSee the [Events Guide][] for more information on defining events.\n\n```jsx live\n<div>\n  <h3>Click Me</h3>\n  <VictoryLegend\n    events={[\n      {\n        target: \"data\",\n        eventHandlers: {\n          onClick: () => {\n            return [\n              {\n                target: \"data\",\n                mutation: (props) => {\n                  const fill =\n                    props.style &&\n                    props.style.fill;\n                  return fill ===\n                    \"#c43a31\"\n                    ? null\n                    : {\n                        style: {\n                          fill: \"#c43a31\",\n                        },\n                      };\n                },\n              },\n              {\n                target: \"labels\",\n                mutation: (props) => {\n                  return props.text ===\n                    \"clicked\"\n                    ? null\n                    : {\n                        text: \"clicked\",\n                      };\n                },\n              },\n            ];\n          },\n        },\n      },\n    ]}\n    data={[\n      { name: \"One\" },\n      { name: \"Two\" },\n      { name: \"Three\" },\n    ]}\n  />\n</div>\n```\n\n---\n\n### gutter\n\n<Badges>\n  <TypeBadge value=\"number || { left: number, right: number }\" />\n  <DefaultsBadge value=\"10}\" />\n</Badges>\n\nThe `gutter` prop defines the number of pixels between legend columns. This prop may be given as a number, or as an object with values specified for \"left\" and \"right\" gutters. To set spacing between rows, use the `rowGutter` prop.\n\n```jsx live\n<VictoryLegend\n  x={125}\n  y={50}\n  orientation=\"horizontal\"\n  gutter={50}\n  style={{\n    border: { stroke: \"black\" },\n  }}\n  data={[\n    { name: \"One\" },\n    { name: \"Two\" },\n    { name: \"Three\" },\n  ]}\n/>\n```\n\n---\n\n### itemsPerRow\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `itemsPerRow` prop determines how many items to render in each row of a horizontal legend, or in each column of a vertical legend. This prop should be given as an integer. When this prop is not given, legend items will be rendered in a single row or column.\n\n```jsx live\n<VictoryLegend\n  x={125}\n  y={50}\n  orientation=\"horizontal\"\n  itemsPerRow={3}\n  gutter={20}\n  style={{\n    border: { stroke: \"black\" },\n  }}\n  data={[\n    { name: \"One\" },\n    { name: \"Two\" },\n    { name: \"Three\" },\n    { name: \"Four\" },\n  ]}\n/>\n```\n\n---\n\n### orientation\n\n<Badges>\n  <TypeBadge value='\"vertical\" || \"horizontal\"' />\n  <DefaultsBadge value='vertical\"' />\n</Badges>\n\nThe `orientation` prop takes a string that defines whether legend data are displayed in a row or column. When `orientation` is `\"horizontal\"`, legend items will be displayed in rows. When `orientation` is `\"vertical\"`, legend items will be displayed in columns.\n\n---\n\n### rowGutter\n\n<Badges>\n  <TypeBadge value=\"number || { top: number, bottom: number }\" />\n</Badges>\n\nThe `rowGutter` prop defines the number of pixels between legend rows. This prop may be given as a number, or as an object with values specified for \"top\" and \"bottom\" gutters. To set spacing between columns, use the `gutter` prop.\n\n```jsx live\n<VictoryLegend\n  x={125}\n  y={50}\n  orientation=\"vertical\"\n  gutter={20}\n  rowGutter={{ top: 0, bottom: 10 }}\n  style={{\n    border: { stroke: \"black\" },\n  }}\n  data={[\n    { name: \"One\" },\n    { name: \"Two\" },\n    { name: \"Three\" },\n  ]}\n/>\n```\n\n---\n\n### style\n\n<Badges>\n  <TypeBadge value=\"{ border: object, data: object, labels: object, parent: object, title: object }\" />\n</Badges>\n\nThe `style` prop defines the style of the component. The style prop should be given as an object with styles defined for `parent`, `data`, `labels`, `title`, and `border`. Any valid svg styles are supported, but `width`, `height`, and `padding` should be specified via props as they determine relative layout for components in VictoryChart. Functional styles may be defined for `data`, and `labels` style properties, and they will be evaluated with the props corresponding to each element.\n\n_note:_ When a component is rendered as a child of another Victory component, or within a custom `<svg>` element with `standalone={false}` parent styles will be applied to the enclosing `<g>` tag. Many styles that can be applied to a parent `<svg>` will not be expressed when applied to a `<g>`.\n\n_note:_ custom `angle` and `verticalAnchor` properties may be included in `labels` and `title` styles.\n\n_default (provided by default theme):_ See [grayscale theme][] for more detail\n\n```jsx live\n<VictoryLegend\n  x={125}\n  y={50}\n  title=\"Legend\"\n  centerTitle\n  orientation=\"horizontal\"\n  gutter={20}\n  style={{\n    data: {\n      fill: \"blue\",\n      stroke: \"navy\",\n      strokeWidth: 2,\n    },\n    labels: { fill: \"navy\" },\n    border: { stroke: \"black\" },\n    title: { fontSize: 20 },\n  }}\n  data={[\n    {\n      name: \"One\",\n      symbol: { fill: \"tomato\" },\n    },\n    {\n      name: \"Two\",\n      labels: { fill: \"orange\" },\n    },\n    { name: \"Three\" },\n  ]}\n/>\n```\n\n---\n\n### symbolSpacer\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `symbolSpacer` prop defines the number of pixels between data components and label components. When a `symbolSpacer` is not defined, spacing is calculated based on symbol size and label font size.\n\n```jsx live\n<VictoryLegend\n  x={125}\n  y={50}\n  orientation=\"horizontal\"\n  symbolSpacer={5}\n  gutter={20}\n  data={[\n    { name: \"One\" },\n    { name: \"Two\" },\n    { name: \"Three\" },\n  ]}\n/>\n```\n\n---\n\n### title\n\n<Badges>\n  <TypeBadge value=\"string | string[]\" />\n</Badges>\n\nThe `title` prop specifies a title to render with the legend. This prop should be given as a string, or an array of strings for multi-line titles.\n\n```jsx live\n<VictoryLegend\n  x={125}\n  y={50}\n  title=\"Legend Title\"\n  gutter={20}\n  orientation=\"horizontal\"\n  style={{\n    border: { stroke: \"black\" },\n    title: { fontSize: 20 },\n  }}\n  data={[\n    { name: \"One\" },\n    { name: \"Two\" },\n    { name: \"Three\" },\n  ]}\n/>\n```\n\n---\n\n### titleComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<VictoryLabel>\" />\n</Badges>\n\nThe `titleComponent` prop takes a component instance which will be used to render a title for the component. The new element created from the passed `labelComponent` will be supplied with the following properties: `x`, `y`, `index`, `data`, `datum`, `verticalAnchor`, `textAnchor`, `style`, `text`, and `events`. Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If `labelComponent` is omitted, a new [VictoryLabel][] will be created with the props described above.\n\n```jsx live\n<VictoryLegend\n  x={125}\n  y={50}\n  title={[\"Legend Title\", \"subtitle\"]}\n  gutter={20}\n  orientation=\"horizontal\"\n  style={{\n    border: { stroke: \"black\" },\n  }}\n  titleComponent={\n    <VictoryLabel\n      style={[\n        { fontSize: 20 },\n        { fontSize: 12 },\n      ]}\n    />\n  }\n  data={[\n    { name: \"One\" },\n    { name: \"Two\" },\n    { name: \"Three\" },\n  ]}\n/>\n```\n\n---\n\n### titleOrientation\n\n<Badges>\n  <TypeBadge value='\"top\" || \"bottom\" || \"left\" || \"right\"' />\n  <DefaultsBadge value='\"top' />\n</Badges>\n\nThe `titleOrientation` prop specifies where the title should be rendered in relation to the rest of the legend. Possible values for this prop are \"top\", \"bottom\", \"left\", and \"right\".\n\n```jsx live\n<VictoryLegend\n  x={50}\n  y={50}\n  title=\"Legend Title\"\n  titleOrientation=\"left\"\n  gutter={20}\n  orientation=\"horizontal\"\n  style={{\n    border: { stroke: \"black\" },\n    title: { fontSize: 20 },\n  }}\n  data={[\n    { name: \"One\" },\n    { name: \"Two\" },\n    { name: \"Three\" },\n  ]}\n/>\n```\n\n---\n\n### x\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `x` prop defines the x coordinate corresponding to the upper left corner of the legend.\n\n---\n\n### y\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `y` prop defines the y coordinate corresponding to the upper left corner of the legend.\n\n[victorylabel]: /docs/api/victory-label\n[point]: /docs/api/victory-primitives#point\n[border]: /docs/api/victory-primitives#border\n[grayscale theme]: https://github.com/FormidableLabs/victory/blob/main/packages/victory-core/src/victory-theme/grayscale.tsx\n[read more about themes here]: /docs/guides/themes\n[custom components guide]: /docs/guides/custom-components\n[events guide]: /docs/guides/events\n"
  },
  {
    "path": "website/docs/api/victory-line.mdx",
    "content": "---\ntitle: VictoryLine\n---\n\n:::info\nFor examples of `VictoryLine` in action, visit the [Line Chart](/docs/charts/line) examples.\n:::\n\n## Inherited Props\n\n<CommonProps\n  interfaces={[\n    \"VictoryCommonProps\",\n    \"VictoryDatableProps\",\n    \"VictoryMultiLabelableProps\",\n    \"VictoryEventProps\",\n  ]}\n  overrides={[]}\n/>\n\n## Component Props\n\n---\n\n### eventKey\n\n<Badges>\n  <TypeBadge value=\"string | integer | string[] | Function\" />\n</Badges>\n\n`VictoryLine` uses the standard `eventKey` prop. **This prop is not commonly used.** [Read about the `eventKey` prop in more detail here](/docs/guides/events)\n\n:::note\n`VictoryLine` only renders one element per dataset, so only one event key will be generated.\n:::\n\n---\n\n### events\n\n<Badges>\n  <TypeBadge value=\"object[]\" />\n</Badges>\n\n`VictoryLine` uses the standard `events` prop. [Read about it here](/docs/guides/events)\n\n:::note\n`VictoryLine` will use the special `eventKey` \"all\" rather than referring to data by index, as it renders only one element for an entire dataset\n:::\n\n```jsx live\n<div>\n  <h3>Click the line below</h3>\n  <VictoryChart\n    theme={VictoryTheme.clean}\n  >\n    <VictoryLine\n      events={[{\n        target: \"parent\",\n        eventHandlers: {\n          onClick: () => {\n            return [\n              {\n                target: \"data\",\n                eventKey: \"all\",\n                mutation: ({ style }) => {\n                  return style.stroke === \"black\"\n                    ? null\n                    : { style: { stroke: \"black\", strokeWidth: 5 } };\n                }\n              }\n            ];\n          }\n        }\n      }]}\n      data={sampleData}\n      theme={VictoryTheme.clean}\n    />\n  </VictoryChart>\n</div>\n```\n\n---\n\n### interpolation\n\n<Badges>\n  <TypeBadge value=\"InterpolationPropType | Function\" />\n  <DefaultsBadge value='\"linear\"' />\n</Badges>\n\nThe `interpolation` prop determines how data points should be connected when creating a path. Victory uses [d3-shape](https://github.com/d3/d3-shape#curves) for interpolating curves.\n\nPolar line charts may use the following interpolation options: \"basis\", \"cardinal\", \"catmullRom\", \"linear\"\n\nCartesian line charts may use the following interpolation options: \"basis\", \"bundle\", \"cardinal\", \"catmullRom\", \"linear\", \"monotoneX\", \"monotoneY\", \"natural\", \"step\", \"stepAfter\", \"stepBefore\"\n\nYou can also provide a function if you need to adjust parameters for d3-shape curves or to use a [custom curve function](https://github.com/d3/d3-shape#custom-curves).\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryLine\n    interpolation=\"natural\"\n    data={sampleData}\n  />\n</VictoryChart>\n```\n\n---\n\n### style\n\n<Badges>\n  <TypeBadge value=\"{ parent: object, data: object, labels: object }\" />\n</Badges>\n\n`VictoryLine` uses the standard `style` prop. [Read about it here](/docs/guides/themes)\n\n:::note\nSince `VictoryLine` renders a single element to represent an entire dataset, it is not possible to use functional styles to change the style of the line as a function of an individual `datum`. Instead, try using [gradient fills](/docs/guides/themes) for styling continuous data.\n:::\n\n_default (provided by default theme):_ See [grayscale theme][] for more detail\n\n```jsx live\n<VictoryLine\n  style={{\n    data: {\n      stroke: \"#c43a31\",\n      strokeWidth: ({ data }) => data.length\n    },\n    labels: {\n      fontSize: 15,\n      fill: ({ datum }) => datum.x === 3 ? \"#000000\" : \"#c43a31\"\n    }\n  }}\n  data={sampleData}\n  labels={({ datum }) => datum.x}\n/>\n```\n"
  },
  {
    "path": "website/docs/api/victory-multi-labelable-props.mdx",
    "content": "---\ntitle: VictoryMultiLabelableProps\n---\n\nA set of props available to components that can display multiple labels.\n\n## Inherited Props\n\n<CommonProps\n  interfaces={[\n    \"VictoryLabelableProps\",\n  ]}\n/>\n\n## Props\n\n---\n\n### labels\n\n<Badges>\n  <TypeBadge value=\"string[] | number[] | function\" />\n</Badges>\n\nThe `labels` prop defines the labels that will appear above each point. This prop should be given as an array or as a function. When given as a function, `labels` will be called with a single argument: an object containing all the props supplied to the label component. A full list of props that will be passed to `VictoryLabel` is given [here](/docs/api/victory-label).\n\n#### Common Usage\n\n- `labels={[\"first\", \"second\", \"third\"]}`\n- `labels={({ datum }) => datum.y}`\n\n```jsx live\n<VictoryBar\n  data={sampleData}\n  labels={({ datum }) => `y: ${datum.y}`}\n  theme={VictoryTheme.clean}\n/>\n```\n"
  },
  {
    "path": "website/docs/api/victory-pie.mdx",
    "content": "---\ntitle: VictoryPie\n---\n\n:::info\nFor examples of `VictoryPie` in action, visit the [Pie Chart](/docs/charts/pie) examples.\n:::\n\n## Inherited Props\n\n<CommonProps\n  interfaces={[\n    \"VictoryCommonProps\", // Omits 'polar'\n    \"VictoryDatableProps\",\n    \"VictoryMultiLabelableProps\",\n    \"VictoryEventProps\",\n  ]}\n  overrides={[]}\n  notImplemented={[\"polar\"]}\n/>\n\n## Component Props\n\n---\n\n### cornerRadius\n\n<Badges>\n  <TypeBadge value=\"number | Function\" />\n</Badges>\n\nThe `cornerRadius` prop specifies the corner radius of the slices rendered in the pie chart. When given as a function, `cornerRadius` will be evaluated for each slice of the pie with an object corresponding to the props for that slice.\n\n```jsx live\n<VictoryPie\n  cornerRadius={({ datum }) =>\n    datum.y * 5\n  }\n  data={sampleData}\n  theme={VictoryTheme.clean}\n/>\n```\n\n---\n\n### endAngle\n\n<Badges>\n  <TypeBadge value=\"number\" />\n  <DefaultsBadge value=\"360\" />\n</Badges>\n\nThe `endAngle` props defines the overall end angle of the pie in degrees. This prop is used in conjunction with `startAngle` to create a pie that spans only a segment of a circle, or to change overall rotation of the pie. This prop should be given as a number of degrees. Degrees are defined as starting at the 12 o'clock position, and proceeding clockwise.\n\n\n```jsx live\n<div>\n  <VictoryPie\n    startAngle={90}\n    endAngle={450}\n    data={sampleData}\n    theme={VictoryTheme.clean}\n  />\n  <VictoryPie\n    startAngle={90}\n    endAngle={-90}\n    data={sampleData}\n    theme={VictoryTheme.clean}\n  />\n</div>\n```\n\n---\n\n### eventKey\n\n<Badges>\n  <TypeBadge value=\"string | integer | string[] | Function\" />\n</Badges>\n\n`VictoryPie` uses the standard `eventKey` prop to specify how event targets are addressed. **This prop is not commonly used.** [Read about the `eventKey` prop in more detail here](/docs/guides/events)\n\n---\n\n### events\n\n<Badges>\n  <TypeBadge value=\"object[]\" />\n</Badges>\n\n`VictoryPie` uses the standard `events` prop. [Read about it here](/docs/guides/events)\n\nSee the [Events Guide][] for more information on defining events.\n\n```jsx live\n<div>\n  <h3>Click a pie slice below</h3>\n  <VictoryPie\n    events={[\n      {\n        target: \"data\",\n        eventHandlers: {\n          onClick: () => {\n            return [\n              {\n                target: \"data\",\n                mutation: ({\n                  style,\n                }) => {\n                  return style.fill ===\n                    \"#c43a31\"\n                    ? null\n                    : {\n                        style: {\n                          fill: \"#c43a31\",\n                        },\n                      };\n                },\n              },\n              {\n                target: \"labels\",\n                mutation: ({\n                  text,\n                }) => {\n                  return text ===\n                    \"clicked\"\n                    ? null\n                    : {\n                        text: \"clicked\",\n                      };\n                },\n              },\n            ];\n          },\n        },\n      },\n    ]}\n    data={sampleData}\n    theme={VictoryTheme.clean}\n  />\n</div>\n```\n\n---\n\n### innerRadius\n\n<Badges>\n  <TypeBadge value=\"number | Function\" />\n</Badges>\n\nThe `innerRadius` prop determines the number of pixels between the center of the chart and the inner edge of a donut chart. When this prop is set to zero a regular pie chart is rendered. When this prop is given as a function, `innerRadius` will be evaluated for each slice of the pie with the props corresponding to that slice\n\n```jsx live\n<VictoryPie\n  innerRadius={({ datum }) =>\n    datum.y * 20\n  }\n  data={sampleData}\n  theme={VictoryTheme.clean}\n/>\n```\n\n---\n\n### labelIndicator\n\n<Badges>\n  <TypeBadge value=\"boolean | ReactElement\" />\n</Badges>\n\nThe `labelIndicator` prop defines the label indicator line between labels and the pie chart. If this prop is used as a boolean,then the default indicator will be displayed. To customize or pass your own styling `<LineSegment/>` can be passed to labelIndicator. LabelIndicator is functional only when labelPosition = \"centroid\". To adjust the labelIndicator length, `labelIndicatorInnerOffset` and `labelIndicatorOuterOffset` props can be used alongside labelIndicator.\n\n```jsx live\n<VictoryGroup\n  theme={VictoryTheme.clean}\n>\n  <VictoryPie\n    data={sampleData}\n    labelIndicator\n  />\n  <VictoryPie\n    data={sampleData}\n    labelIndicator={\n      <LineSegment\n        style={{\n          stroke: \"red\",\n          strokeDasharray: 1,\n          fill: \"none\",\n        }}\n      />\n    }\n  />\n  <VictoryPie\n    data={sampleData}\n    labelIndicator={\n      <LineSegment\n        style={{\n          stroke: \"red\",\n          strokeDasharray: 1,\n          fill: \"none\",\n        }}\n      />\n    }\n    labelIndicatorInnerOffset={10}\n    labelIndicatorOuterOffset={5}\n  />\n</VictoryGroup>\n```\n\n---\n\n### labelIndicatorInnerOffset\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `labelIndicatorInnerOffset` prop defines the offset by which the indicator length inside pie chart is being drawn. Higher the number shorter the length.\n\n```jsx live\n<VictoryPie\n  data={sampleData}\n  labelIndicator\n  labelIndicatorInnerOffset={10}\n  theme={VictoryTheme.clean}\n/>\n```\n\n---\n\n### labelIndicatorOuterOffset\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `labelIndicatorOuterOffset` prop defines the offset by which the indicator length outside the pie chart is being drawn. Higher the number shorter the length.\n\n```jsx live\n<VictoryPie\n  data={sampleData}\n  labelIndicator\n  labelIndicatorOuterOffset={5}\n/>\n```\n\n---\n\n### labelPlacement\n\n<Badges>\n  <TypeBadge value='\"parallel\" | \"perpendicular\" | \"vertical\" | Function' />\n</Badges>\n\nThe `labelPlacement` prop specifies the angular placement of each label relative to the angle of its corresponding slice. This prop should be given as \"parallel\", \"perpendicular\", \"vertical\", or as a function that returns one of these values. When this prop is not given, the label will be placed vertically.\n\n```jsx live\n<VictoryPie\n  data={sampleData}\n  labels={({ datum }) =>\n    `y: ${datum.y}`\n  }\n  labelPosition={({ index }) =>\n    index ? \"centroid\" : \"startAngle\"\n  }\n  labelPlacement={({ index }) =>\n    index ? \"parallel\" : \"vertical\"\n  }\n  theme={VictoryTheme.clean}\n/>\n```\n\n---\n\n### labelPosition\n\n<Badges>\n  <TypeBadge value='\"startAngle\" | \"endAngle\" | \"centroid\" | Function' />\n</Badges>\n\nThe `labelPosition` prop specifies the position of each label relative to its corresponding slice. This prop should be given as \"startAngle\", \"endAngle\", \"centroid\", or as a function that returns one of these values. When this prop is not given, the label will be positioned at the centroid of each slice.\n\n```jsx live\n<VictoryPie\n  data={sampleData}\n  labels={({ datum }) => datum.y}\n  labelPosition={({ index }) =>\n    index ? \"centroid\" : \"startAngle\"\n  }\n  theme={VictoryTheme.clean}\n/>\n```\n\n---\n\n### labelRadius\n\n<Badges>\n  <TypeBadge value=\"number | Function\" />\n</Badges>\n\nThe `labelRadius` prop defines the radius of the arc that will be used for positioning each slice label. If this prop is not set, the label radius will default to the radius of the pie + label padding. If this prop is given as a function, it will be evaluated for each label `VictoryPie` renders, and will be evaluated with the props that correspond to that label, as well as the radius and innerRadius of the corresponding slice. If `labelIndicator` prop is being used, passed `labelRadius`(> radius) is used to calculate the co-ordinates of the outer indicator line. If no specific value for labelRadius is passed , default values will be considered. The outer indicator line length is the difference between `labelRadius` and `labelIndicatorOuterOffset`.\n\n```jsx live\n<VictoryPie\n  data={sampleData}\n  labelRadius={({ innerRadius }) =>\n    innerRadius + 5\n  }\n  radius={({ datum }) =>\n    50 + datum.y * 20\n  }\n  innerRadius={50}\n  style={{\n    labels: {\n      fill: \"white\",\n      fontSize: 20,\n      fontWeight: \"bold\",\n    },\n  }}\n  theme={VictoryTheme.clean}\n/>\n```\n\n---\n\n### padAngle\n\n<Badges>\n  <TypeBadge value=\"number | Function\" />\n</Badges>\n\nThe `padAngle` prop defines the amount of separation between adjacent data slices in number of degrees. When this prop is given as a function it will be evaluated for each slice, and will be evaluated with the props that correspond to that slice.\n\n```jsx live\n<VictoryPie\n  padAngle={({ datum }) => datum.y}\n  innerRadius={100}\n  data={sampleData}\n/>\n```\n\n---\n\n### radius\n\n<Badges>\n  <TypeBadge value=\"number | Function\" />\n</Badges>\n\nThe `radius` prop specifies the radius of the pie. When this prop is not given, it will be calculated based on the `width`, `height`, and `padding` props. When this prop is given as a function it will be evaluated for each slice with the props corresponding to that slice.\n\n```jsx live\n<VictoryPie\n  radius={({ datum }) =>\n    20 + datum.y * 20\n  }\n  data={sampleData}\n  theme={VictoryTheme.clean}\n/>\n```\n\n---\n\n### startAngle\n\n<Badges>\n  <TypeBadge value=\"number\" />\n  <DefaultsBadge value=\"0\" />\n</Badges>\n\nThe `startAngle` props defines the overall start angle of the pie in degrees. This prop is used in conjunction with `endAngle` to create a pie that spans only a segment of a circle, or to change overall rotation of the pie. This prop should be given as a number of degrees. Degrees are defined as starting at the 12 o'clock position, and proceeding clockwise.\n\n```jsx live\n<div>\n  <VictoryPie\n    startAngle={90}\n    endAngle={450}\n    data={sampleData}\n    theme={VictoryTheme.clean}\n  />\n  <VictoryPie\n    startAngle={90}\n    endAngle={-90}\n    data={sampleData}\n    theme={VictoryTheme.clean}\n  />\n</div>\n```\n\n---\n\n### style\n\n<Badges>\n  <TypeBadge value=\"{ parent: object, data: object, labels: object }\" />\n</Badges>\n\n`VictoryPie` uses the standard `style` prop. [Read about it here](/docs/guides/themes)\n\n_default (provided by default theme):_ See [grayscale theme][] for more detail\n\n```jsx live\n<VictoryPie\n  style={{\n    data: {\n      fillOpacity: 0.9,\n      stroke: \"#c43a31\",\n      strokeWidth: 3,\n    },\n    labels: {\n      fontSize: 25,\n      fill: \"#c43a31\",\n    },\n  }}\n  data={sampleData}\n/>\n```\n"
  },
  {
    "path": "website/docs/api/victory-polar-axis.mdx",
    "content": "---\ntitle: VictoryPolarAxis\n---\n\nRenders a circular axis which can be used on its own or composed with [`VictoryChart`](/docs/api/victory-chart).\n\n:::info\nFor examples of `VictoryPolarAxis` in action, visit the [Chart Axis](/docs/guides/axis) guide.\n:::\n\n## Example\n\n```jsx live\n<svg width={400} height={400}>\n  <VictoryPolarAxis\n    width={400}\n    height={400}\n    theme={VictoryTheme.clean}\n    standalone={false}\n  />\n  <VictoryPolarAxis\n    dependentAxis\n    width={400}\n    height={400}\n    domain={[0, 10]}\n    theme={VictoryTheme.clean}\n    standalone={false}\n  />\n</svg>\n```\n\n## Inherited Props\n\n<CommonProps\n  interfaces={[\n    \"VictoryAxisCommonProps\",\n    \"VictoryCommonProps\",\n    \"VictorySingleLabelableProps\",\n  ]}\n  overrides={[]}\n/>\n\n## Component Props\n\n---\n\n### axisAngle\n\n<Badges>\n  <TypeBadge value=\"number\" />\n  <DefaultsBadge value=\"0\" />\n</Badges>\n\nThe `axisAngle` prop is used to position the dependent axis. This prop should be given in degrees. Degrees are defined as starting at the 3 o'clock position, and proceeding counterclockwise. This prop only affects the dependent axis.\n\n```jsx live\n<VictoryPolarAxis\n  dependentAxis\n  theme={VictoryTheme.clean}\n  axisAngle={45}\n/>\n```\n\n---\n\n### circularAxisComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<Arc/>\" />\n</Badges>\n\nThe `circularAxisComponent` prop takes a component instance which will be responsible for rendering an axis arc for the independent axis. The dependent axis renders an `axisComponent`. The new element created from the passed `circularAxisComponent` will be provided with the following props calculated by `VictoryPolarAxis`: `style`, `events`,\n`cx`, `cy`, `r`, `startAngle`, and `endAngle`. Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If a `circularAxisComponent` is not provided, `VictoryPolarAxis` will use its default [Arc component][].\n\n```jsx\ncircularAxisComponent={<Arc r={300}/>}\n```\n\n---\n\n### circularGridComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<Arc />\" />\n</Badges>\n\nThe `circularGridComponent` prop takes a component instance which will be responsible for rendering a grid element. The new element created from the passed `circularGridComponent` will be provided with the following props calculated by `VictoryPolarAxis`: `x1`, `y1`, `x2`, `y2`, `tick`, `style` and `events`. Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If a `circularGridComponent` is not provided, `VictoryPolarAxis` will use its default [Arc component][].\n\n```jsx\ncircularGridComponent={<Arc r={300}/>}\n```\n\n---\n\n### endAngle\n\n<Badges>\n  <TypeBadge value=\"number\" />\n  <DefaultsBadge value=\"360\" />\n</Badges>\n\nThe `endAngle` props defines the overall end angle of the axis in degrees. This prop is used in conjunction with `startAngle` to create an axis that spans only a segment of a circle, or to change overall rotation of the axis. This prop should be given as a number of degrees. Degrees are defined as starting at the 3 o'clock position, and proceeding counterclockwise.\n\n```jsx live\n<div style={{ display: \"flex\" }}>\n  <VictoryPolarAxis\n    startAngle={90}\n    endAngle={450}\n    tickValues={[0, 90, 180, 270]}\n    labelPlacement=\"vertical\"\n  />\n  <VictoryPolarAxis\n    startAngle={0}\n    endAngle={180}\n    tickValues={[0, 45, 90, 135, 180]}\n  />\n</div>\n```\n\n---\n\n### events\n\n<Badges>\n  <TypeBadge value=\"object[]\" />\n</Badges>\n\n`VictoryPolarAxis` uses the standard `events` prop.\n\nSee the [Events Guide](/docs/guides/events) for more information on defining events.\n\n:::note\nValid event targets for `VictoryPolarAxis` are \"axis\", \"axisLabel\", \"grid\", \"ticks\", and \"tickLabels\".\nTargets that correspond to only one element (\"axis\" and \"axisLabel\") should use the special eventKey \"all\".\n:::\n\n---\n\n### innerRadius\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nWhen the `innerRadius` prop is set, polar axes will be hollow rather than circular.\n\n```jsx live\n<VictoryPolarAxis\n  theme={VictoryTheme.clean}\n/>\n```\n\n---\n\n### labelPlacement\n\n<Badges>\n  <TypeBadge\n    value={`\"parallel\" | \"perpendicular\" | \"vertical\"`}\n  />\n  <DefaultsBadge value='\"parallel\"' />\n</Badges>\n\nThe `labelPlacement` prop specifies how tick labels should be placed relative to the angular tick values. Options for this prop are \"vertical\", \"parallel\", and \"perpendicular\".\n\n```jsx live\n<VictoryPolarAxis\n  labelPlacement=\"perpendicular\"\n  theme={VictoryTheme.clean}\n/>\n```\n\n---\n\n### startAngle\n\n<Badges>\n  <TypeBadge value=\"number\" />\n  <DefaultsBadge value=\"0\" />\n</Badges>\n\nThe `startAngle` props defines the overall end angle of the axis in degrees. This prop is used in conjunction with `endAngle` to create an axis that spans only a segment of a circle, or to change overall rotation of the axis. This prop should be given as a number of degrees. Degrees are defined as starting at the 3 o'clock position, and proceeding counterclockwise.\n\n```jsx live\n<div style={{ display: \"flex\" }}>\n  <VictoryPolarAxis\n    startAngle={90}\n    endAngle={450}\n    tickValues={[0, 90, 180, 270]}\n    labelPlacement=\"vertical\"\n  />\n  <VictoryPolarAxis\n    startAngle={0}\n    endAngle={180}\n    tickValues={[0, 45, 90, 135, 180]}\n  />\n</div>\n```\n\n---\n\n### style\n\n<Badges>\n  <TypeBadge value=\"{ axis: object, axisLabel: object, grid: object, ticks: object, tickLabels: object }\" />\n</Badges>\n\nThe `style` prop defines the style of the component. The style prop should be given as an object with styles defined for `parent`, `axis`, `axisLabel`, `grid`, `ticks`, and `tickLabels`. Any valid svg styles are supported, but `width`, `height`, and `padding` should be specified via props as they determine relative layout for components in VictoryChart. Functional styles may be defined for `grid`, `tick`, and `tickLabel` style properties, and they will be evaluated with the props corresponding to each axis element, such as `tick` and `index`.\n\n```jsx live\n<VictoryPolarAxis\n  style={{\n    axis: { stroke: \"black\" },\n    grid: {\n      stroke: ({ tick }) =>\n        tick > 0.5 ? \"red\" : \"blue\",\n    },\n    tickLabels: {\n      fontSize: 15,\n      padding: 15,\n    },\n  }}\n/>\n```\n"
  },
  {
    "path": "website/docs/api/victory-portal.mdx",
    "content": "---\ntitle: VictoryPortal\n---\n\n`VictoryPortal` is a wrapper component that renders a child in a top-level [Portal][] element within [VictoryContainer][]. This is useful in instances where elements should always be rendered above others, like tooltips and labels. If a Portal element is not found, `VictoryPortal` will render its child in place.\n\n---\n\n### children\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n</Badges>\n\n`VictoryPortal` takes a single `children`, and renders it in a top level portal element. Any additional props passed to `VictoryPortal` will be spread onto the child. In the following example, the `labelComponent` passed to the first series of bars has been wrapped in `VictoryPortal`. The resulting labels will be rendered in a top-level portal container, and will not be overlapped by subsequent data series, as they otherwise would have.\n\n```jsx live\n<VictoryChart \n  domainPadding={{ x: 50 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryGroup offset={25}>\n    <VictoryBar\n      labels={[\"apples\", \"bananas\", \"cherries\"]}\n      style={{\n        labels: { fontSize: 20 }\n      }}\n      labelComponent={<VictoryPortal><VictoryLabel/></VictoryPortal>}\n      data={[{x: 1, y: 1}, {x: 2, y: 2}, {x: 3, y: 5}]}\n    />\n    <VictoryBar\n      data={[{x: 1, y: 2}, {x: 2, y: 1}, {x: 3, y: 7}]}\n    />\n    <VictoryBar\n      data={[{x: 1, y: 3}, {x: 2, y: 4}, {x: 3, y: 9}]}\n    />\n  </VictoryGroup>\n</VictoryChart>\n```\n\n---\n\n### groupComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n</Badges>\n\nThe `groupComponent` prop takes a component instance which will be used to create a group element for `VictoryPortal` to render its child component into. This prop defaults to a `<g>` tag.\n\n[victorycontainer]: /docs/api/victory-container\n[portal]: https://github.com/FormidableLabs/victory/blob/main/packages/victory-core/src/victory-portal/portal.tsx\n"
  },
  {
    "path": "website/docs/api/victory-primitives.mdx",
    "content": "---\ntitle: VictoryPrimitives\n---\n\nVictory is built around a set of simple, stateless components. Along with [VictoryContainer][], [VictoryClipContainer][], and [VictoryLabel][], the following list represents every simple element a Victory component might render. These simple components are responsible for supplying props to primitive components. Victory maintains a small subset of primitive components with additional logic in place to prevent unnecessary rendering. Extracting every rendered element into its own component allows Victory to support both web and React Native applications with very little additional code, as only a few components need to be modified to render [react-native-svg][] elements rather than SVG elements. These primitives are also exposed for users to wrap, extend or reference when creating their own custom rendered components.\n\n## Primitive Components\n\nEach of these primitive components renders SVG elements. The following components are the only Victory components that render SVG elements with the exception of `VictoryContainer` and `VictoryPortal`. These elements are used by other simple components such as `Bar` and `Area`.\n\n### Border\n\nUsed by `VictoryLegend`\n\n```jsx\nconst Border = (props) => <Rect {...props} />;\n```\n\n### Circle\n\nUsed by `Background`, `VictoryClipContainer`, and `Voronoi`\n\n```jsx\nconst Circle = (props) => <circle vectorEffect=\"non-scaling-stroke\" {...props} />;\n```\n\n### ClipPath\n\nUsed by `VictoryClipContainer` and `Voronoi`\n\n```jsx\nconst ClipPath = (props) => (\n  <defs>\n    <clipPath id={props.clipId}>{props.children}</clipPath>\n  </defs>\n);\n```\n\n### Line\n\nUsed by `Axis`, `Candle`, and `ErrorBar`\n\n```jsx\nconst Line = (props) => <line vectorEffect=\"non-scaling-stroke\" {...props} />;\n```\n\n### Path\n\nUsed by `Arc`, `Area`, `Bar`, `Curve`, `Flyout`, `Point`, `Slice`, and `Voronoi`\n\n```jsx\nconst Path = (props) => <path {...props} />;\n```\n\n### Rect\n\nUsed by `VictoryClipPath`, `Background`, `Border`, and `Candle`\n\n```jsx\nconst Rect = (props) => <rect vectorEffect=\"non-scaling-stroke\" {...props} />;\n```\n\n### Text\n\nUsed by `VictoryLabel`\n\n```jsx\nconst Text = (props) => {\n  const { children, title, desc, ...rest } = props;\n  return (\n    <text {...rest}>\n      {title && <title>{title}</title>}\n      {desc && <desc>{desc}</desc>}\n      {children}\n    </text>\n  );\n};\n```\n\n### TSpan\n\nUsed by `VictoryLabel`\n\n```jsx\nconst TSpan = (props) => <tspan {...props} />;\n```\n\n## Simple Components\n\n### Arc\n\n[VictoryPolarAxis][] uses the `Arc` primitive to draw circular axes and grid lines. `Arc` renders a `<Path>` element. [View the source][arc]\n\n**Props**\n\n- `active` _boolean_ a flag signifying whether the component is active\n- `ariaLabel` _string or function_ a prop controlling the aria-label that will be applied to the rendered path. When this prop is given as a function it will be called with the rest of the props supplied to `Arc`\n- `className` _string_ the class name that will be applied to the rendered path\n- `closedPath` _boolean_ a flag signifying whether this arc is should render a closed path\n- `cx` _number_ the x coordinate of the center of the arc path\n- `cy` _number_ the y coordinate of the center of the arc path\n- `datum` _any_ the data point or tick corresponding to this arc\n- `endAngle` _number_ the end angle of the arc given in degrees\n- `events` _object_ events to attach to the rendered element\n- `groupComponent` _element_ the element used to group rendered elements _default_ `<g/>`\n- `id` _string or number_ an id to apply to the rendered component\n- `pathComponent` _element_ the rendered path element _default_ `<Path/>`\n- `r` _number_ the radius of the arc\n- `role` _string_ the aria role to assign to the element\n- `scale` _object_ the x and y scale of the parent chart with `domain` and `range` applied\n- `shapeRendering` _string_ the shape rendering attribute to apply to the rendered path\n- `startAngle` _number_ the start angle of the arc given in degrees\n- `style` _object_ the styles to apply to the rendered element\n- `tabIndex` _number or function_ will be applied to the rendered path. When this prop is given as a function it will be called with the rest of the props supplied to `Arc`\n- `transform` _string_ a transform that will be supplied to elements this component renders\n\n### Area\n\n[VictoryArea][] uses `Area` to represent an entire dataset. `Area` renders a `<Path/>` element, or a group of paths if the stroke of the area should be rendered in a different style from the filled section of the area. [View the source][area]\n\n**Props**\n\n- `active` _boolean_ a flag signifying whether the component is active\n- `ariaLabel` _string or function_ a prop controlling the aria-label that will be applied to the rendered path. When this prop is given as a function it will be called with the rest of the props supplied to `Area`\n- `className` _string_ the class name that will be applied to the rendered path\n- `data` _array_ the entire dataset used to define the area\n- `events` _object_ events to attach to the rendered element\n- `groupComponent` _element_ the element used to group rendered elements _default_ `<g/>`\n- `id` _string or number_ an id to apply to the rendered component\n- `interpolation` _string or function_ the interpolation to use when calculating a path\n- `origin` _object_ the svg coordinates of the center point of a polar chart\n- `polar` _boolean_ a flag specifying whether the component is part of a polar chart\n- `pathComponent` _element_ the rendered path element _default_ `<Path/>`\n- `role` _string_ the aria role to assign to the element\n- `scale` _object_ the x and y scale of the parent chart with `domain` and `range` applied\n- `shapeRendering` _string_ the shape rendering attribute to apply to the rendered path\n- `style` _object_ the styles to apply to the rendered element\n- `tabIndex` _number or function_ that will be applied to rendered path. When this prop is given as a function it will be called with the rest of the props supplied to `Area`\n- `transform` _string_ a transform that will be supplied to elements this component renders\n\n### LineSegment\n\nThe `LineSegment` component renders straight lines. This component is used to render grids, ticks, and axis lines in [VictoryAxis][]. [View the source][axis]\n\n**Props**\n\n- `active` _boolean_ a flag signifying whether the component is active\n- `ariaLabel` _string or function_ a prop controlling the aria-label that will be applied to the rendered lineComponent. When this prop is given as a function it will be called with the rest of the props supplied to `LineSegment`\n- `className` _string_ the class name that will be applied to the rendered element\n- `data` _array_ the entire dataset\n- `datum` _object_ the data point corresponding to this line\n- `events` _object_ events to attach to the rendered element\n- `id` _string or number_ an id to apply to the rendered component\n- `index` _number_ the index of this line within the dataset\n- `lineComponent` _element_ the rendered line element _default_ `<Line/>`\n- `role` _string_ the aria role to assign to the element\n- `shapeRendering` _string_ the shape rendering attribute to apply to the rendered elements\n- `style` _object_ the styles to apply to the rendered element\n- `tabIndex` _number or funciton_ will be applied to the rendered lineComponent. When this prop is given as a function it will be called with the rest of the props supplied to `LineSegment`\n- `transform` _string_ a transform that will be supplied to elements this component renders\n- `x1` _number_ the x coordinate of the beginning of the line\n- `x2` _number_ the x coordinate of the end of the line\n- `y1` _number_ the y coordinate of the beginning of the line\n- `y2` _number_ the y coordinate of the end of the line\n\n### Background\n\nThe `Background` component is used to render an SVG background on VictoryChart. `Background` will render a `<Circle>` for charts with `polar={true}` and a `<Rect>` element for all other charts. [View the source][background]\n\n**Props**\n\n- `className` _string_ the class name that will be applied to the rendered path\n- `circleComponent` _element_ the rendered circle element _default_ `<Circle/>`\n- `events` _object_ events to attach to the rendered element\n- `height` _number_ the height of the `<rect/>` element\n- `id` _string or number_ an id to apply to the rendered component\n- `origin` _object_ the svg coordinates of the center point of a polar chart\n- `polar` _boolean_ a flag specifying whether the component is part of a polar chart\n- `rectComponent` _element_ the rendered rect element _default_ `<Rect/>`\n- `role` _string_ the aria role to assign to the element\n- `rx` _number_ the x radius of the rendered `<rect/>` element\n- `ry` _number_ the y radius of the rendered `<rect/>` element\n- `scale` _object_ the x and y scale of the parent chart with `domain` and `range` applied\n- `shapeRendering` _string_ the shape rendering attribute to apply to the rendered path\n- `style` _object_ the styles to apply to the rendered element\n- `width` _number_ the width of the `<rect/>` element\n- `x` _number_ the x coordinate of the upper-left corner of the background for non-polar charts and center of the background for polar charts\n- `y` _number_ the y coordinate of the top of the background\n\n### Bar\n\n[VictoryBar][] uses `Bar` to represent a single data point as a bar extending horizontally or vertically from the independent axis. `Bar` renders a `<Path>` element. It is also used by [VictoryHistogram][] to represent \"bins\" of data. [View the source][bar]\n\n**Props**\n\n- `active` _boolean_ a flag signifying whether the component is active\n- `alignment` \\*\"start\", \"middle\", or \"end\" specifies how a bar path should be aligned in relation to its data point\n- `ariaLabel` _string or function_ a prop controlling the aria-label that will be applied to the rendered path. When this prop is given as a function it will be called with the rest of the props supplied to `Bar`\n- `barRatio` _number_ a number between zero and one that will be used to calculate bar width when an explicit width is not given\n- `barWidth` _number or function_ A prop defining the width of the bar. When this prop is given as a function, it will be called with the rest of the props supplied to `Bar`.\n- `className` _string_ the class name that will be applied to the rendered path\n- `cornerRadius` _number, function or object_ the number of pixels of corner radius to apply when calculating a bar path. When this prop is given as a function, it will be called with the rest of the props supplied to `Bar`. When given as an object, this prop may include values for top, bottom, topLeft, topRight, bottomLeft and bottomRight, with more specific values overriding less specific values\n- `data` _array_ the entire dataset\n- `datum` _object_ the data point corresponding to this bar\n- `events` _object_ events to attach to the rendered element\n- `id` _string or number_ an id to apply to the rendered component\n- `index` _number_ the index of this bar within the dataset\n- `origin` _object_ the svg coordinates of the center point of a polar chart\n- `pathComponent` _element_ the rendered path element _default_ `<Path/>`\n- `polar` _boolean_ a flag specifying whether the component is part of a polar chart\n- `role` _string_ the aria role to assign to the element\n- `scale` _object_ the x and y scale of the parent chart with `domain` and `range` applied\n- `shapeRendering` _string_ the shape rendering attribute to apply to the rendered path\n- `style` _object_ the styles to apply to the rendered element\n- `tabIndex` _number or function_ number applied to rendered path. When given as a function it will be called with the rest of the props supplied to `Bar`\n- `transform` _string_ a transform that will be supplied to elements this component renders\n- `width` _number_ the width of parent chart (used to calculate default bar width `style.width` is not supplied)\n- `x` _number_ the x coordinate of the top of the bar\n- `y0` _number_ the y coordinate of the baseline of the bar\n- `y` _number_ the y coordinate of the top of the bar\n\n### Box\n\n[VictoryLegend][] uses the `Box` component to draw a border around a legend area. `Box` renders a `<Rect/>` element. [View the source][border]\n\n_note_ `Box` also exported as `Border`\n\n**Props**\n\n- `active` _boolean_ a flag signifying whether the component is active\n- `ariaLabel` _string or function_ a prop that controls the a propcontrollings the aria-label that will be applied to the rendered path. When this prop is given as a function it will be called with the rest of the props supplied to `Box`\n- `className` _string_ the class name that will be applied to the rendered element\n- `events` _object_ events to attach to the rendered element\n- `height` _number_ the height of the `<rect/>` element\n- `id` _string or number_ an id to apply to the rendered component\n- `rectComponent` _element_ the rendered path element _default_ `<Rect/>`\n- `role` _string_ the aria role to assign to the element\n- `shapeRendering` _string_ the shape rendering attribute to apply to the rendered element\n- `style` _object_ the styles to apply to the rendered element\n- `tabIndex` _number or function_ will be applied to the rendered path. When given as a function it will be called with the rest of the props supplied to `Box`\n- `transform` _string_ a transform that will be supplied to elements this component renders\n- `width` _number_ the width of the `<rect/>` element\n- `x` _number_ the x coordinate of the upper-left corner of the `<rect/>` element\n- `y` _number_ the y coordinate of the upper-left corner of the `<rect/>` element\n\n### Candle\n\n[VictoryCandlestick][] uses `Candle` to represent a single data point as a candle. `Candle` renders a group with `<Rect>` and `<Line>` elements. [View the source][candlestick]\n\n**Props**\n\n- `active` _boolean_ a flag signifying whether the component is active\n- `ariaLabel` _string or function_ a prop controlling the aria-label that will be applied to the rendered `<Rect>` and `<Line>` elements. When this prop is given as a function it will be called with the rest of the props supplied to `Candle`\n- `candleRatio` _number_ a number between zero and one that will be used to calculate candle width when an explicit width is not given\n- `candleWidth` _number or function_ A prop defining the width of the candle. When this prop is given as a function, it will be called with the rest of the props supplied to `Candle`.\n- `className` _string_ the class name that will be applied to the rendered element\n- `close` _number_ the y coordinate of the closing value\n- `data` _array_ the entire dataset\n- `datum` _object_ the data point corresponding to this candle\n- `events` _object_ events to attach to the rendered element\n- `groupComponent` _element_ the element used to group rendered elements _default_ `<g/>`\n- `high` _number_ the y coordinate of the high value\n- `id` _string or number_ an id to apply to the rendered component\n- `index` _number_ the index of this candle within the dataset\n- `lineComponent` _element_ the rendered line element _default_ `<Line/>`\n- `low` _number_ the y coordinate of the low value\n- `open` _number_ the y coordinate of the opening value\n- `rectComponent` _element_ the rendered path element _default_ `<Rect/>`\n- `role` _string_ the aria role to assign to the element\n- `scale` _object_ the x and y scale of the parent chart with `domain` and `range` applied\n- `shapeRendering` _string_ the shape rendering attribute to apply to the rendered elements\n- `style` _object_ the styles to apply to the rendered element\n- `tabIndex` _number or function_ a prop controlling the aria-label that will be applied to the rendered `<Rect>` and `<Line>` elements. When given as a function it will be called with the rest of the props supplied to `Candle`\n- `transform` _string_ a transform that will be supplied to elements this component renders\n- `width` _number_ the width of parent chart (used to calculate default candle width `style.width` is not supplied)\n- `widthStrokeWidth` _number_ the stroke width of the candle wick. (style.strokeWidth will be used when this value is not given)\n- `x` _number_ the x coordinate of the candle\n\n### Curve\n\n[VictoryLine][] uses `Curve` to represent an entire dataset as a line or curve. `Curve` renders a `<Path>` element. [View the source][curve]\n\n**Props**\n\n- `active` _boolean_ a flag signifying whether the component is active\n- `ariaLabel` _string or function_ a prop controlling the aria-label that will be applied to the rendered path. When this prop is given as a function it will be called with the rest of the props supplied to `Curve`\n- `className` _string_ the class name that will be applied to the rendered element\n- `data` _array_ the entire dataset used to define the curve\n- `events` _object_ events to attach to the rendered element\n- `groupComponent` _element_ the element used to group rendered elements _default_ `<g/>`\n- `id` _string or number_ an id to apply to the rendered component\n- `interpolation` _string or function_ the interpolation to use when calculating a path\n- `origin` _object_ the svg coordinates of the center point of a polar chart\n- `pathComponent` _element_ the rendered path element _default_ `<Path/>`\n- `polar` _boolean_ a flag specifying whether the component is part of a polar chart\n- `role` _string_ the aria role to assign to the element\n- `scale` _object_ the x and y scale of the parent chart with `domain` and `range` applied\n- `shapeRendering` _string_ the shape rendering attribute to apply to the rendered path\n- `style` _object_ the styles to apply to the rendered element\n- `tabIndex` _number or function_ will be applied to the rendered path. When given as a function it will be called with the rest of the props supplied to `Curve`\n- `transform` _string_ a transform that will be supplied to elements this component renders\n\n### ErrorBar\n\n[VictoryErrorBar][] uses `ErrorBar` to render x and y error bars. `ErrorBar` renders a group of `<Line>` elements. [View the source][errorbar]\n\n**Props**\n\n- `active` _boolean_ a flag signifying whether the component is active\n- `ariaLabel` _string or function_ a prop controlling the aria-label that will be applied to the group, `g`, containing the rendered `<Line>` elements. When this prop is given as a function it will be called with the rest of the props supplied to `ErrorBar`\n- `borderWidth` _number_ the width of the cross-hairs on the end of each error bar _default: 10_\n- `className` _string_ the class name that will be applied to the rendered element\n- `data` _array_ the entire dataset\n- `datum` _object_ the data point corresponding to this error bar\n- `errorX` _number, array, or boolean_ errors in the x dimension.\n- `errorY` _number, array, or boolean_ errors in the y dimension.\n- `events` _object_ events to attach to the rendered element\n- `groupComponent` _element_ the element used to group rendered elements _default_ `<g/>`\n- `id` _string or number_ an id to apply to the rendered component\n- `index` _number_ the index of this error bar within the dataset\n- `lineComponent` _element_ the rendered line element _default_ `<Line/>`\n- `origin` _object_ the svg coordinates of the center point of a polar chart\n- `polar` _boolean_ a flag specifying whether the component is part of a polar chart\n- `role` _string_ the aria role to assign to the element\n- `scale` _object_ the x and y scale of the parent chart with `domain` and `range` applied\n- `shapeRendering` _string_ the shape rendering attribute to apply to the rendered elements\n- `style` _object_ the styles to apply to the rendered element\n- `tabIndex` _number or function_ applies to the group, `g`, containing the `<Line>` elements. When this prop is given as a function it will be called with the rest of the props supplied to `ErrorBar`\n- `transform` _string_ a transform that will be supplied to elements this component renders\n- `x` _number_ the x coordinate of the center of the error bar\n- `y` _number_ the y coordinate of the center of the error bar\n\n### Flyout\n\n[VictoryTooltip][] uses `Flyout` to render a flyout style path around text. `Flyout` renders `<Path>` element. [View the source][flyout]\n\n**Props**\n\n- `active` _boolean_ a flag signifying whether the component is active\n- `center` _object_ the center coordinates of the flyout\n- `className` _string_ the class name that will be applied to the rendered element\n- `cornerRadius` _number_ the corner radius of the flyout\n- `data` _array_ the entire dataset if applicable\n- `datum` _object_ the data point corresponding to this flyout if applicable\n- `dx` _number_ offset in the x dimension.\n- `dy` _number_ offset in the y dimension.\n- `events` _object_ events to attach to the rendered element\n- `height` _number_ the height of the flyout\n- `id` _string or number_ an id to apply to the rendered component\n- `index` _number_ the index of this flyout within the dataset\n- `orientation` _\"top\", \"bottom\", \"left\", \"right\"_\n- `origin` _object_ the svg coordinates of the center point of a polar chart\n- `pathComponent` _element_ the rendered path element _default_ `<Path/>`\n- `pointerLength` _number_ the length of the triangular pointer\n- `pointerWidth` _number_ the width of the base of the triangular pointer\n- `polar` _boolean_ a flag specifying whether the component is part of a polar chart\n- `role` _string_ the aria role to assign to the element\n- `shapeRendering` _string_ the shape rendering attribute to apply to the rendered elements\n- `style` _object_ the styles to apply to the rendered element\n- `transform` _string_ a transform that will be supplied to elements this component renders\n- `width` _number_ the width of the flyout\n- `x` _number_ the x coordinate of data point associated with this flyout\n- `y` _number_ the y coordinate of data point associated with this flyout\n\n### Point\n\n[VictoryScatter][] uses `Point` to render each point in a scatter plot. `Point` renders a `<Path>` element. [View the source][point]\n\n**Props**\n\n- `active` _boolean_ a flag signifying whether the component is active\n- `ariaLabel` _string or function_ a prop controlling the aria-label that will be applied to the rendered path. When this prop is given as a function it will be called with the rest of the props supplied to `Point`\n- `className` _string_ the class name that will be applied to the rendered element\n- `data` _array_ the entire dataset\n- `datum` _object_ the data point corresponding to this point\n- `events` _object_ events to attach to the rendered element\n- `getPath` _function_ a function of `x`, `y`, and `size` that returns a path string. When this optional function is provided, it will be used to calculate a path, rather than one of the path functions corresponding to the `symbol`s supported by `Point`.\n- `id` _string or number_ an id to apply to the rendered component\n- `index` _number_ the index of this point within the dataset\n- `origin` _object_ the svg coordinates of the center point of a polar chart\n- `pathComponent` _element_ the rendered path element _default_ `<Path/>`\n- `polar` _boolean_ a flag specifying whether the component is part of a polar chart\n- `role` _string_ the aria role to assign to the element\n- `scale` _object_ the x and y scale of the parent chart with `domain` and `range` applied\n- `shapeRendering` _string_ the shape rendering attribute to apply to the rendered path\n- `size` _number or function_ the size of the point. When this prop is given as a function, it will be called with the rest of the props supplied to `Point`.\n- `style` _object_ the styles to apply to the rendered element\n- `symbol` _\"circle\", \"cross\", \"diamond\", \"plus\", \"minus\", \"square\", \"star\", \"triangleDown\", \"triangleUp\"_ which symbol the point should render. This prop may also be given as a function that returns one of the above options. When this prop is given as a function, it will be called with the rest of the props supplied to `Point`.\n- `tabIndex` _number or function_ number will be applied to the rendered path. When this prop is given as a function it will be called with the rest of the props supplied to `Point`\n- `transform` _string_ a transform that will be supplied to elements this component renders\n- `x` _number_ the x coordinate of the center of the point\n- `y` _number_ the y coordinate of the center of the point\n\n### Slice\n\n[VictoryPie][] uses `Slice` to render each slice in a pie chart. `Slice` renders a `<Path>` element. [View the source][slice]\n\n**Props**\n\n- `active` _boolean_ a flag signifying whether the component is active\n- `ariaLabel` _string or function_ a prop controlling the aria-label that will be applied to the rendered path. When this prop is given as a function it will be called with the rest of the props supplied to `Slice`\n- `className` _string_ the class name that will be applied to the rendered element\n- `cornerRadius` _number or function_ the corner radius to apply to this slice. When this prop is given as a function it will be called with the rest of the props supplied to `Slice`.\n- `data` _array_ the entire dataset\n- `datum` _object_ the data point corresponding to this slice\n- `events` _object_ events to attach to the rendered element\n- `id` _string or number_ an id to apply to the rendered component\n- `index` _number_ the index of this slice within the dataset\n- `innerRadius` _number or function_ the inner radius of the slice. When this prop is given as a function it will be called with `datum` and `active`.\n- `padAngle` _number or function_ the angular padding to add to the slice. When this prop is given as a function it will be called with the rest of the props supplied to `Slice`.\n- `pathComponent` _element_ the rendered path element _default_ `<Path/>`\n- `pathFunction` _function_ a function that calculates the path of a given slice. When given, this prop will be called with the `slice` object\n- `radius` _number or function_ the outer radius of the slice. When this prop is given as a function it will be called with the rest of the props supplied to `Slice`.\n- `role` _string_ the aria role to assign to the element\n- `shapeRendering` _string_ the shape rendering attribute to apply to the rendered path\n- `slice` _object_ an object specifying the startAngle, endAngle, padAngle, and data of the slice\n- `sliceEndAngle` _number or function_ the end angle the slice. When this prop is given as a function it will be called with the rest of the props supplied to `Slice`.\n- `sliceStartAngle` _number or function_ the start angle of the slice. When this prop is given as a function it will be called with the rest of the props supplied to `Slice`.\n- `style` _object_ the styles to apply to the rendered element\n- `tabIndex` _number or function_ number will be applied to the rendered path. When this prop is given as a function it will be called with the rest of the props supplied to `Slice`.\n- `transform` _string_ a transform that will be supplied to elements this component renders\n\n### Voronoi\n\n[VictoryVoronoi][] uses `Voronoi` to render voronoi polygons. `Voronoi` renders either a `<Path>` element corresponding to a voronoi polygon, or a `<Circle/>` clipped with a `<ClipPath>` defined by the path of the polygon. [View the source][voronoi]\n\n**Props**\n\n- `active` _boolean_ a flag signifying whether the component is active\n- `ariaLabel` _string or function_ a prop controlling the aria-label that will be applied to the rendered path. When this prop is given as a function it will be called with the rest of the props supplied to `Voronoi`\n- `circleComponent` _element_ the rendered circle element _default_ `<Circle/>`\n- `className` _string_ the class name that will be applied to the rendered element\n- `clipPathComponent` _element_ the rendered clipPath element _default_ `<ClipPath/>`\n- `data` _array_ the entire dataset\n- `datum` _object_ the data point corresponding to this voronoi polygon\n- `events` _object_ events to attach to the rendered element\n- `groupComponent` _element_ the rendered group element _default_ `<g/>`\n- `id` _string or number_ an id to apply to the rendered component\n- `index` _number_ the index of this voronoi polygon within the dataset\n- `origin` _object_ the svg coordinates of the center point of a polar chart\n- `pathComponent` _element_ the rendered path element _default_ `<Path/>`\n- `polar` _boolean_ a flag specifying whether the component is part of a polar chart\n- `polygon` _array_ an array of points defining the polygon\n- `role` _string_ the aria role to assign to the element\n- `shapeRendering` _string_ the shape rendering attribute to apply to the rendered path\n- `size` _number_ the maximum size of the voronoi polygon\n- `style` _object_ the styles to apply to the rendered element\n- `tabIndex` _number or function_ will be applied to the rendered path. When this prop is given as a function it will be called with the rest of the props supplied to `Voronoi`\n- `transform` _string_ a transform that will be supplied to elements this component renders.\n- `x` _number_ the x coordinate of the data point\n- `y` _number_ the y coordinate of the data point\n\n### Whisker\n\n[VictoryBoxPlot][] uses the `Whisker` component to draw whiskers for the minimum and maximum values in a box plot. `Whisker` renders a group of `<Line/>` elements. [View the source][whisker]\n\n**Props**\n\n- `active` _boolean_ a flag signifying whether the component is active\n- `ariaLabel` _string or function_ a prop controlling the aria-label that will be applied to the rendered `<Line>` elements. When this prop is given as a function it will be called with the rest of the props supplied to `Whisker`\n- `className` _string_ the class name that will be applied to the rendered element\n- `events` _object_ events to attach to the rendered element\n- `groupComponent` _element_ the rendered group element _default_ `<g/>`\n- `id` _string or number_ an id to apply to the rendered component\n- `lineComponent` _element_ the rendered line element _default_ `<Line/>`\n- `majorWhisker` _object_ an object with values `x1`, `x2`, `y1`, `y2` describing the major whisker line\n- `minorWhisker` _object_ an object with values `x1`, `x2`, `y1`, `y2` describing the minor whisker line\n- `role` _string_ the aria role to assign to the element\n- `shapeRendering` _string_ the shape rendering attribute to apply to the rendered element\n- `style` _object_ the styles to apply to the rendered element\n- `tabIndex` _number or function_ will be applied to the rendered `<Line>`. When this prop is given as a function it will be called with the rest of the props supplied to `Whisker`\n- `transform` _string_ a transform that will be supplied to elements this component renders.\n\n[victorycontainer]: /docs/api/victory-container\n[victoryclipcontainer]: /docs/api/victory-clip-container\n[victorylabel]: /docs/api/victory-label\n[react-native-svg]: https://github.com/react-native-community/react-native-svg\n[arc]: https://github.com/FormidableLabs/victory/blob/main/packages/victory-core/src/victory-primitives/arc.tsx\n[victorypolaraxis]: /docs/api/victory-polar-axis\n[area]: https://github.com/FormidableLabs/victory/blob/main/packages/victory-area/src/area.tsx\n[victoryarea]: /docs/api/victory-area\n[background]: https://github.com/FormidableLabs/victory/blob/main/packages/victory-core/src/victory-primitives/background.tsx\n[bar]: https://github.com/FormidableLabs/victory/blob/main/packages/victory-bar/src/bar.tsx \n[border]: https://github.com/FormidableLabs/victory/blob/main/packages/victory-core/src/victory-primitives/border.tsx\n[victorybar]: /docs/api/victory-bar\n[candlestick]: https://github.com/FormidableLabs/victory/blob/main/packages/victory-candlestick/src/victory-candlestick.tsx \n[victorycandlestick]: /docs/api/victory-candlestick\n[curve]: https://github.com/FormidableLabs/victory/blob/main/packages/victory-line/src/curve.tsx \n[victoryline]: /docs/api/victory-line\n[errorbar]: https://github.com/FormidableLabs/victory/blob/main/packages/victory-errorbar/src/error-bar.tsx\n[victoryerrorbar]: /docs/api/victory-error-bar\n[flyout]: https://github.com/FormidableLabs/victory/blob/main/packages/victory-tooltip/src/flyout.tsx\n[victorytooltip]: /docs/api/victory-tooltip\n[victoryaxis]: /docs/api/victory-axis\n[axis]: https://github.com/FormidableLabs/victory/blob/main/packages/victory-axis/src/victory-axis.tsx\n[point]: https://github.com/FormidableLabs/victory/blob/main/packages/victory-core/src/victory-primitives/point.tsx\n[slice]: https://github.com/FormidableLabs/victory/blob/main/packages/victory-pie/src/slice.tsx\n[whisker]: https://github.com/FormidableLabs/victory/blob/main/packages/victory-core/src/victory-primitives/whisker.tsx\n[victorypie]: /docs/api/victory-pie\n[voronoi]: https://github.com/FormidableLabs/victory/blob/main/packages/victory-voronoi/src/voronoi.tsx\n[victoryvoronoi]: /docs/api/victory-voronoi\n[victoryscatter]: /docs/api/victory-scatter\n[victorylegend]: /docs/api/victory-legend\n[victoryboxplot]: /docs/api/victory-boxplot\n[victoryhistogram]: /docs/api/victory-histogram\n"
  },
  {
    "path": "website/docs/api/victory-scatter.mdx",
    "content": "---\ntitle: VictoryScatter\n---\n\n:::info\nFor examples of `VictoryScatter` in action, visit the [Scatter Chart](/docs/charts/scatter) examples.\n:::\n\n## Inherited Props\n\n<CommonProps\n  interfaces={[\n    \"VictoryCommonProps\",\n    \"VictoryDatableProps\",\n    \"VictoryMultiLabelableProps\",\n    \"VictoryEventProps\",\n  ]}\n  overrides={[\"data\"]}\n/>\n\n## Component Props\n\n---\n\n### bubbleProperty\n\n<Badges>\n  <TypeBadge value=\"string\" />\n  <DefaultsBadge value='\"z\"' />\n</Badges>\n\nThe `bubbleProperty` prop indicates which property of the data object should be used to scale data points in a bubble chart. If a `bubbleProperty` is given, `size` and `symbol` props will be ignored. Bubble charts always render circular points.\n\n\n```jsx live\n<VictoryScatter\n  bubbleProperty=\"amount\"\n  maxBubbleSize={25}\n  minBubbleSize={5}\n  data={[\n    { x: 1, y: 2, amount: 30 },\n    { x: 2, y: 3, amount: 40 },\n    { x: 3, y: 5, amount: 25 },\n    { x: 4, y: 4, amount: 10 },\n    { x: 5, y: 7, amount: 45 },\n  ]}\n  theme={VictoryTheme.clean}\n/>\n```\n\n---\n\n### data\n\n<Badges>\n  <TypeBadge value=\"object[]\" />\n</Badges>\n\n`VictoryScatter` uses the standard `data` prop. However, it also will preferentially use `symbol`, `size`, and `label` properties supplied via data objects.\n\n---\n\n### eventKey\n\n<Badges>\n  <TypeBadge value=\"string | integer | string[] | Function\" />\n</Badges>\n\n`VictoryScatter` uses the standard `eventKey` prop to specify how event targets are addressed. **This prop is not commonly used.** [Read about the `eventKey` prop in more detail here](/docs/guides/events)\n\n---\n\n### events\n\n<Badges>\n  <TypeBadge value=\"object[]\" />\n</Badges>\n\n`VictoryScatter` uses the standard `events` prop. [Read about it in more detail here](/docs/guides/events)\n\nSee the [Events Guide][] for more information on defining events.\n\n```jsx live\n<div>\n  <h3>Click a data point below</h3>\n  <VictoryChart\n    theme={VictoryTheme.clean}\n  >\n    <VictoryScatter\n      size={9}\n      labels={() => null}\n      events={[\n        {\n          target: \"data\",\n          eventHandlers: {\n            onClick: () => {\n              return [\n                {\n                  target: \"data\",\n                  mutation: (props) => {\n                    const fill =\n                      props.style &&\n                      props.style.fill;\n                    return fill ===\n                      \"black\"\n                      ? null\n                      : {\n                          style: {\n                            fill: \"black\",\n                          },\n                        };\n                  },\n                },\n                {\n                  target: \"labels\",\n                  mutation: (props) => {\n                    return props.text ===\n                      \"clicked\"\n                      ? null\n                      : {\n                          text: \"clicked\",\n                        };\n                  },\n                },\n              ];\n            },\n          },\n        },\n      ]}\n      data={sampleData}\n    />\n  </VictoryChart>\n</div>\n```\n\n---\n\n### maxBubbleSize\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `maxBubbleSize` prop sets an upper limit for scaling data points in a bubble chart. If not given, this prop will be calculated based on the `width`, `height`, and `padding` of the component.\n\n```jsx\nmaxBubbleSize={25}\n```\n\n---\n\n### minBubbleSize\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `minBubbleSize` prop sets a lower limit for scaling data points in a bubble chart. If not given, this prop will be calculated based on the calculated `maxBubbleSize`.\n\n```jsx\nminBubbleSize={5}\n```\n\n---\n\n### size\n\n<Badges>\n  <TypeBadge value=\"number | Function\" />\n</Badges>\n\nThe `size` prop determines how to scale each data point. When this prop given as a function, it will be called for each point with the props corresponding to that point. If `size` is not specified, either in props or in a theme, it will default to 1. `size` may also be set directly on each data object.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryScatter\n    size={({ datum }) => datum.y + 2}\n    data={sampleData}\n  />\n</VictoryChart>\n```\n\n---\n\n### style\n\n<Badges>\n  <TypeBadge value=\"{ parent: object, data: object, labels: object }\" />\n</Badges>\n\n`VictoryScatter` uses the standard `style` prop. [Read about it in detail here](/docs/guides/themes)\n\n_default (provided by default theme):_ See [grayscale theme][] for more detail\n\n```jsx live\n<VictoryScatter\n  style={{\n    data: {\n      fill: ({ datum }) =>\n        datum.x === 3\n          ? \"#000000\"\n          : \"#c43a31\",\n      stroke: ({ datum }) =>\n        datum.x === 3\n          ? \"#000000\"\n          : \"#c43a31\",\n      fillOpacity: 0.7,\n      strokeWidth: 3,\n    },\n    labels: {\n      fontSize: 15,\n      fill: ({ datum }) =>\n        datum.x === 3\n          ? \"#000000\"\n          : \"#c43a31\",\n    },\n  }}\n  size={9}\n  data={sampleData}\n  labels={({ datum }) => datum.x}\n/>\n```\n\n---\n\n### symbol\n\n<Badges>\n  <TypeBadge value=\"Function | Options\" />\n  <DefaultsBadge value='\"circle\"' />\n</Badges>\n\nThe `symbol` prop determines which symbol should be drawn to represent data points. Options are: \"circle\", \"cross\", \"diamond\", \"plus\", \"minus\", \"square\", \"star\", \"triangleDown\", \"triangleUp\". When this prop is given as a function, it will be evaluated for each point with the props corresponding to that point. If no `symbol` prop is specified, a circle will be rendered. `symbol` may also be set directly on each data object.\n\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryScatter\n    symbol={({ datum }) =>\n      datum.y > 3\n        ? \"triangleUp\"\n        : \"triangleDown\"\n    }\n    size={7}\n    data={sampleData}\n  />\n</VictoryChart>\n```\n"
  },
  {
    "path": "website/docs/api/victory-selection-container.mdx",
    "content": "---\ntitle: VictorySelectionContainer\n---\n\nEnables selecting data points within a highlighted region.\n\n:::info\nFor examples of `VictorySelectionContainer` in action, visit the [containers](/docs/guides/containers) guide.\n:::\n\n## Inherited Props\n\n<CommonProps\n  interfaces={[\"VictoryContainerProps\"]}\n  overrides={[]}\n/>\n\n## Component Props\n\n---\n\n### activateSelectedData\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n  <DefaultsBadge value=\"true\" />\n</Badges>\n\nWhen the `activateSelectedData` prop is set to true, the `active` prop will be set to true on all selected data points. When this prop is set to false, the `onSelection` and `onSelectionCleared` callbacks will still fire, but no mutations will occur via Victory's event system.\n\n---\n\n### disable\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n</Badges>\n\nWhen the `disable` prop is set to `true`, `VictorySelectionContainer` events will not fire.\n\n---\n\n### onSelection\n\n<Badges>\n  <TypeBadge value=\"function\" />\n</Badges>\n\nThe `onSelection` prop accepts a function to be called whenever new data points are selected. The\nfunction is called with the parameters `points` (an array of objects with `childName`, `eventKey`,\nand `data`), `bounds` (an object with min / max arrays specified for `x` and `y`), and `props` (the props used by `VictorySelectionContainer`)\n\n_example:_ `onSelection={(points, bounds, props) => handleSelection(points, bounds, props)}`\n\n---\n\n### onSelectionCleared\n\n<Badges>\n  <TypeBadge value=\"function\" />\n</Badges>\n\nThe `onSelectionCleared` prop accepts a function to be called whenever the selection is cleared. The function is called with the props used by `VictorySelectionContainer`\n\n_example:_ `onSelectionCleared={(props) => handleSelectionCleared(props)}`\n\n### selectionBlacklist\n\n`type: array[string]`\n\n<Badges>\n  <TypeBadge value=\"function\" />\n</Badges>\n\nThe `selectionBlacklist` prop is used to exclude data from potential selections. This prop should be given as an array of strings that match the `name` prop of Victory component that should be excluded from selection.\n\n_example:_ `selectionBlackList={[\"first-line\", \"second-line\"]}`\n\n---\n\n### selectionComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<rect/>\" />\n</Badges>\n\nThe `selectionComponent` prop specifies the element to be rendered for the selected area. When\nthis prop is not specified, a `<rect/>` will be rendered. This component will be supplied with the\nfollowing props: `x`, `y`, `width`, `height`, and `style`.\n\n---\n\n### selectionDimension\n\n<Badges>\n  <TypeBadge value='\"x\" | \"y\"`' />\n</Badges>\n\nWhen the `selectionDimension` prop is set, the selection will only take the given dimension into account.\nFor example, when `dimension` is set to \"x\", the selected area will cover the entire y domain\nregardless of mouse position.\n\n_example:_ `selectionDimension=\"x\"`\n\n```jsx live\n<VictoryChart\n  containerComponent={\n    <VictorySelectionContainer selectionDimension=\"x\" />\n  }\n  theme={VictoryTheme.clean}\n>\n  <VictoryScatter\n    style={{\n      data: {\n        fill: ({ active }) =>\n          active ? \"tomato\" : \"gray\",\n      },\n    }}\n  />\n</VictoryChart>\n```\n\n---\n\n### selectionStyle\n\n<Badges>\n  <TypeBadge value=\"object\" />\n  <DefaultsBadge value='{stroke: \"transparent\", fill: \"black\", fillOpacity: 0.1}' />\n</Badges>\n\nThe `selectionStyle` prop should be given as an object of style attributes to be applied to the\n`selectionComponent`\n\n```jsx live\n<VictoryChart\n  containerComponent={\n    <VictorySelectionContainer\n      selectionStyle={{\n        fill: \"tomato\",\n        fillOpacity: 0.5,\n        stroke: \"tomato\",\n        strokeWidth: 2,\n      }}\n    />\n  }\n  theme={VictoryTheme.clean}\n>\n  <VictoryScatter\n    style={{\n      data: {\n        fill: ({ active }) =>\n          active ? \"tomato\" : \"gray\",\n      },\n    }}\n  />\n</VictoryChart>\n```\n"
  },
  {
    "path": "website/docs/api/victory-shared-events.mdx",
    "content": "---\ntitle: VictorySharedEvents\n---\n\nThe `VictorySharedEvents` wrapper coordinates events between its child components. Specify a set of events on the `VictorySharedEvents` wrapper to target children. [VictoryChart](/docs/api/victory-chart), [VictoryGroup](/docs/api/victory-group), and [VictoryStack](/docs/api/victory-stack) all use `VictorySharedEvents`, but it may also be used on its own.\n\n:::info\nFor examples of using events in Victory, visit the [Chart Events](/docs/guides/events) guide.\n:::\n\n## Component Props\n\n:::caution\nThis API is largely undocumented and is primarily used internally by Victory components. It is not recommended for general use.\n:::\n\n---\n\n### children\n\n<Badges>\n  <TypeBadge value=\"Element[]\" />\n</Badges>\n\n`VictorySharedEvents` renders an array of children with new `sharedEvents` props which define a set of events, and a shared state accessor.\n\n---\n\n### events\n\n<Badges>\n  <TypeBadge value=\"object[]\" />\n</Badges>\n\nThe `events` prop takes an array of event objects. Event objects are composed of a `target`, an `eventKey`, a `childName` and `eventHandlers`. Targets may be any valid style namespace for a given component, so \"data\" and \"labels\" are valid targets for this components like `VictoryBar`. `eventKey` may be given as a single value, or as an array of values to specify individual targets. If `eventKey` is not specified, the given `eventHandlers` will be attached to all elements of the specified `target` type. The `childName` property may be given as a string or an array of strings to target multiple children. The `eventHandlers` object should be given as an object whose keys are standard event names (i.e. `onClick`) and whose values are event callbacks. The return value of an event handler is used to modify elements. The return value should be given as an object or an array of objects with optional `target`, `childName` and `eventKey` keys for specifying the element(s) to be modified, and a `mutation` key whose value is a function. The `target` and `eventKey` keys will default to those corresponding to the element the event handler was attached to. The `mutation` function will be called with the calculated props for each element that should be modified (i.e. a bar label), and the object returned from the mutation function will override the props of that element via object assignment.\n\n```jsx live\n<svg viewBox=\"0 0 450 350\">\n  <VictorySharedEvents\n    events={[\n      {\n        childName: [\"pie\", \"bar\"],\n        target: \"data\",\n        eventHandlers: {\n          onMouseOver: () => {\n            return [\n              {\n                childName: [\n                  \"pie\",\n                  \"bar\",\n                ],\n                mutation: (props) => {\n                  return {\n                    style:\n                      Object.assign(\n                        {},\n                        props.style,\n                        {\n                          fill: \"tomato\",\n                        },\n                      ),\n                  };\n                },\n              },\n            ];\n          },\n          onMouseOut: () => {\n            return [\n              {\n                childName: [\n                  \"pie\",\n                  \"bar\",\n                ],\n                mutation: () => {\n                  return null;\n                },\n              },\n            ];\n          },\n        },\n      },\n    ]}\n  >\n    <g transform={\"translate(150, 50)\"}>\n      <VictoryBar\n        name=\"bar\"\n        width={300}\n        standalone={false}\n        style={{\n          data: { width: 20 },\n          labels: { fontSize: 25 },\n        }}\n        data={[\n          { x: \"a\", y: 2 },\n          { x: \"b\", y: 3 },\n          { x: \"c\", y: 5 },\n          { x: \"d\", y: 4 },\n        ]}\n        labels={[\"a\", \"b\", \"c\", \"d\"]}\n        labelComponent={\n          <VictoryLabel y={280} />\n        }\n        theme={VictoryTheme.clean}\n      />\n    </g>\n    <g transform={\"translate(0, -75)\"}>\n      <VictoryPie\n        name=\"pie\"\n        width={250}\n        standalone={false}\n        data={[\n          { x: \"a\", y: 1 },\n          { x: \"b\", y: 4 },\n          { x: \"c\", y: 5 },\n          { x: \"d\", y: 7 },\n        ]}\n        theme={VictoryTheme.clean}\n        style={{\n          labels: {\n            fontSize: 25,\n            padding: 10,\n          },\n        }}\n      />\n    </g>\n  </VictorySharedEvents>\n</svg>\n```\n\n---\n\n### eventKey\n\n<Badges>\n  <TypeBadge value=\"string | integer | string[] | Function\" />\n</Badges>\n\nThe `eventKey` prop is used to assign eventKeys to data. This prop operates identically to the `x` and `y` data accessor props. By default, the eventKey of each datum will be equal to its index in the data array. `eventKey` may also be defined directly on each data object.\n\n---\n\n### externalEventMutations\n\n<Badges>\n  <TypeBadge value=\"object[]\" />\n</Badges>\n\nOccasionally is it necessary to trigger events in Victory's event system from some external element such as a button or a form field. Use the `externalEventMutation` prop to specify a set of mutations to apply to a given chart. The `externalEventMutations` should be given in the following form:\n\nThe `target`, `eventKey`, and `childName` (when applicable) must always be specified. The `mutation` function will be called with the current props of the element specified by the `target`, `eventKey` and `childName` provided. The mutation function should return a mutation object for that element. The `callback` prop should be used to clear the `externalEventMutations` prop once the mutation has been applied. Clearing `externalEventMutations` is crucial for charts that animate.\n\n```jsx live noInline\nfunction App() {\n  const [state, setState] =\n    React.useState({\n      externalMutations: undefined,\n    });\n\n  function removeMutation() {\n    setState({\n      externalMutations: undefined,\n    });\n  }\n\n  function clearClicks() {\n    setState({\n      externalMutations: [\n        {\n          childName: [\"bar\", \"pie\"],\n          target: [\"data\"],\n          eventKey: \"all\",\n          mutation: () => ({\n            style: undefined,\n          }),\n          callback: removeMutation,\n        },\n      ],\n    });\n  }\n\n  const buttonStyle = {\n    backgroundColor: \"black\",\n    color: \"white\",\n    padding: \"10px\",\n    marginTop: \"10px\",\n  };\n\n  return (\n    <div>\n      <button\n        onClick={clearClicks}\n        style={buttonStyle}\n      >\n        Reset\n      </button>\n      <svg viewBox=\"0 0 450 350\">\n        <VictorySharedEvents\n          externalEventMutations={\n            state.externalMutations\n          }\n          events={[\n            {\n              childName: [\"pie\", \"bar\"],\n              target: \"data\",\n              eventHandlers: {\n                onClick: () => {\n                  return [\n                    {\n                      childName: [\n                        \"pie\",\n                        \"bar\",\n                      ],\n                      mutation: (\n                        props,\n                      ) => {\n                        return {\n                          style:\n                            Object.assign(\n                              {},\n                              props.style,\n                              {\n                                fill: \"tomato\",\n                              },\n                            ),\n                        };\n                      },\n                    },\n                  ];\n                },\n              },\n            },\n          ]}\n        >\n          <g\n            transform={\n              \"translate(150, 50)\"\n            }\n          >\n            <VictoryBar\n              name=\"bar\"\n              width={300}\n              standalone={false}\n              style={{\n                data: { width: 20 },\n                labels: {\n                  fontSize: 25,\n                },\n              }}\n              data={[\n                { x: \"a\", y: 2 },\n                { x: \"b\", y: 3 },\n                { x: \"c\", y: 5 },\n                { x: \"d\", y: 4 },\n              ]}\n              labels={[\n                \"a\",\n                \"b\",\n                \"c\",\n                \"d\",\n              ]}\n              labelComponent={\n                <VictoryLabel y={290} />\n              }\n              theme={VictoryTheme.clean}\n            />\n          </g>\n          <g\n            transform={\n              \"translate(0, -75)\"\n            }\n          >\n            <VictoryPie\n              name=\"pie\"\n              width={250}\n              standalone={false}\n              style={{\n                labels: {\n                  fontSize: 25,\n                  padding: 10,\n                },\n              }}\n              data={[\n                { x: \"a\", y: 1 },\n                { x: \"b\", y: 4 },\n                { x: \"c\", y: 5 },\n                { x: \"d\", y: 7 },\n              ]}\n              theme={VictoryTheme.clean}\n            />\n          </g>\n        </VictorySharedEvents>\n      </svg>\n    </div>\n  );\n}\n\nrender(<App />);\n```\n\n:::note\nExternal mutations are applied to the same state object that is used to control events in Victory, so depending on the order in which they are triggered, external event mutations may override mutations caused by internal Victory events or vice versa.\n:::\n"
  },
  {
    "path": "website/docs/api/victory-single-labelable-props.mdx",
    "content": "---\ntitle: VictorySingleLabelableProps\n---\n\nA set of props available to components that can display multiple labels.\n\n## Inherited Props\n\n<CommonProps\n  interfaces={[\n    \"VictoryLabelableProps\",\n  ]}\n/>\n\n## Props\n\n---\n\n### label\n\n<Badges>\n  <TypeBadge value=\"string | { (data: any): string | number | null }\" />\n</Badges>\n\nThe `label` prop defines the label that will appear with the axis.\n"
  },
  {
    "path": "website/docs/api/victory-stack.mdx",
    "content": "---\ntitle: VictoryStack\n---\n\n`VictoryStack` is a wrapper component that renders a given set of children in a stacked layout. Like other wrapper components, `VictoryStack` also reconciles the domain and layout for all its children, and coordinates animations and shared events.\n\n## Supported Components\n\n- [VictoryArea](/docs/api/victory-area)\n- [VictoryBar](/docs/api/victory-bar)\n- [VictoryCandlestick](/docs/api/victory-candlestick)\n- [VictoryErrorBar](/docs/api/victory-error-bar)\n- [VictoryGroup](/docs/api/victory-group)\n- [VictoryLine](/docs/api/victory-line)\n- [VictoryScatter](/docs/api/victory-scatter)\n- [VictoryHistogram](/docs/api/victory-histogram) - Only with other `VictoryHistogram` components\n\n## Unsupported Components\n\n- [VictoryVoronoi](/docs/api/victory-axis)\n- [VictoryAxis](/docs/api/victory-axis)\n\n## Example\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryStack>\n    <VictoryArea\n      data={[\n        { x: \"a\", y: 2 },\n        { x: \"b\", y: 3 },\n        { x: \"c\", y: 5 },\n      ]}\n    />\n    <VictoryArea\n      data={[\n        { x: \"a\", y: 1 },\n        { x: \"b\", y: 4 },\n        { x: \"c\", y: 5 },\n      ]}\n    />\n    <VictoryArea\n      data={[\n        { x: \"a\", y: 3 },\n        { x: \"b\", y: 2 },\n        { x: \"c\", y: 6 },\n      ]}\n    />\n  </VictoryStack>\n</VictoryChart>\n```\n\n## Inherited Props\n\n<CommonProps\n  interfaces={[\n    \"VictoryCommonProps\",\n    \"VictoryMultiLabelableProps\",\n    \"VictoryEventProps\",\n  ]}\n  overrides={[]}\n/>\n\n## Component Props\n\n---\n\n### categories\n\n<Badges>\n  <TypeBadge value=\"string[] | { x: string[], y: string[]\" />\n</Badges>\n\n`VictoryStack` uses the standard `categories` prop. [Read about it here](/docs/api/victory-datatable-props#categories)\n\n_note:_ When this prop is set, `VictoryGroup` controls the `categories` prop of its children.\n\n```jsx\ncategories={[\"dogs\", \"cats\", \"mice\"]}\n```\n\n---\n\n### children\n\n<Badges>\n  <TypeBadge value=\"ReactElement | ReactElement[]\" />\n</Badges>\n\nChildren supplied to `VictoryGroup` will be cloned and rendered with new props so that all children share common props such as `domain` and `scale`.\n\n---\n\n### eventKey\n\n<Badges>\n  <TypeBadge value=\"string | integer | strin[] | Function\" />\n</Badges>\n\n`VictoryStack` uses the standard `eventKey` prop to specify how event targets are addressed. **This prop is not commonly used.** [Read about the `eventKey` prop in more detail here](/docs/guides/events)\n\n---\n\n### events\n\n<Badges>\n  <TypeBadge value=\"object[]\" />\n</Badges>\n\n`VictoryStack` uses the standard `events` prop. [Read about it in more detail here](/docs/guides/events)\n\nSee the [Events Guide][] for more information on defining events.\n\n_note:_ `VictoryStack` coordinates events between children using the `VictorySharedEvents` and the `sharedEvents` prop\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryStack\n    events={[\n      {\n        childName: \"all\",\n        target: \"data\",\n        eventHandlers: {\n          onClick: () => {\n            return [\n              {\n                childName: \"area-2\",\n                target: \"data\",\n                mutation: (props) => ({\n                  style: Object.assign(\n                    {},\n                    props.style,\n                    { fill: \"gold\" },\n                  ),\n                }),\n              },\n              {\n                childName: \"area-3\",\n                target: \"data\",\n                mutation: (props) => ({\n                  style: Object.assign(\n                    {},\n                    props.style,\n                    { fill: \"orange\" },\n                  ),\n                }),\n              },\n              {\n                childName: \"area-4\",\n                target: \"data\",\n                mutation: (props) => ({\n                  style: Object.assign(\n                    {},\n                    props.style,\n                    { fill: \"red\" },\n                  ),\n                }),\n              },\n            ];\n          },\n        },\n      },\n    ]}\n  >\n    <VictoryArea\n      name=\"area-1\"\n      data={sampleData}\n    />\n    <VictoryArea\n      name=\"area-2\"\n      data={sampleData}\n    />\n    <VictoryArea\n      name=\"area-3\"\n      data={sampleData}\n    />\n    <VictoryArea\n      name=\"area-4\"\n      data={sampleData}\n    />\n  </VictoryStack>\n</VictoryChart>\n```\n\n---\n\n### style\n\n<Badges>\n  <TypeBadge value=\"{ parent: object, data: object, labels: object }\" />\n</Badges>\n\n`VictoryStack` uses the standard `style` prop. [Read about it here](/docs/guides/themes)\n\nStyles on children of `VictoryGroup` will override styles set on the `VictoryGroup` component.\n\n```jsx live\n<VictoryStack\n  style={{\n    data: {\n      stroke: \"black\",\n      strokeWidth: 3,\n    },\n  }}\n>\n  <VictoryBar\n    style={{\n      data: { fill: \"#c43a31\" },\n    }}\n    data={[\n      { x: \"a\", y: 2 },\n      { x: \"b\", y: 3 },\n      { x: \"c\", y: 5 },\n    ]}\n  />\n  <VictoryBar\n    data={[\n      { x: \"a\", y: 1 },\n      { x: \"b\", y: 4 },\n      { x: \"c\", y: 5 },\n    ]}\n  />\n  <VictoryBar\n    data={[\n      { x: \"a\", y: 3 },\n      { x: \"b\", y: 2 },\n      { x: \"c\", y: 6 },\n    ]}\n  />\n</VictoryStack>\n```\n\n---\n\n### xOffset\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `xOffset` prop is used for grouping stacks of bars. This prop will be set by the `VictoryGroup` component wrapper, or can be set manually.\n"
  },
  {
    "path": "website/docs/api/victory-style-interface.mdx",
    "content": "---\ntitle: VictoryStyleInterface\n---\n\nDefines the style of the component using valid svg styles. However, `width`, `height`, and `padding` should be specified via props as they determine relative layout for components in [VictoryChart](/docs/api/victory-chart).\n\n:::info\nFor more information about themes and styles, see the [themes guide](/docs/guides/themes).\n:::\n\n## Example\n\nStyle attributes can be defined as an object of `CSSProperties`.\n\n```jsx\nstyle={{\n  data: { fill: \"tomato\", opacity: 0.7 },\n  labels: { fontSize: 12 },\n  parent: { border: \"1px solid #ccc\" }\n}}\n```\n\nOr they may be defined as a function of the props for whatever element it applies to.\n\n```jsx\nstyle={{\n  data: { fill: ({ datum }) => datum.y > 0 ? \"green\" : \"red\" },\n  labels: { fontSize: ({ text }) => text.length > 10 ? 8 : 12 },\n  parent: { border: \"1px solid #ccc\" }\n}}\n```\n\n```jsx live\n<VictoryScatter\n  style={{\n    parent: {\n      border: \"1px solid #ccc\",\n    },\n    data: {\n      fill: \"#c43a31\",\n      fillOpacity: 0.6,\n      stroke: \"#c43a31\",\n      strokeWidth: 3,\n    },\n    labels: {\n      fontSize: 15,\n      fill: \"#c43a31\",\n      padding: 15,\n    },\n  }}\n  size={9}\n  data={sampleData}\n  labels={({ datum }) => datum.x}\n/>\n```\n\n## Type Signature\n\n```ts\ntype StringOrNumberOrCallback =\n  | string\n  | number\n  | ((props: any) => string | number);\n\ntype VictoryStyleObject = {\n  [K in keyof React.CSSProperties]: StringOrNumberOrCallback;\n};\n\ntype LabelProps =\n  React.CSSProperties & {\n    angle?: number;\n    verticalAnchor?: VerticalAnchorType;\n  };\n\ntype VictoryLabelStyleObject = {\n  [K in keyof LabelProps]: StringOrNumberOrCallback;\n};\n\ninterface VictoryStyleInterface {\n  parent?: VictoryStyleObject;\n  data?: VictoryStyleObject;\n  labels?:\n    | VictoryLabelStyleObject\n    | VictoryLabelStyleObject[];\n  border?: VictoryStyleObject;\n}\n```\n\n## Caveats\n\n:::note\nWhen a component is rendered as a child of another Victory component, or within a custom `<svg>` element with `standalone={false}`, parent styles will be applied to the enclosing `<g>` tag. Many styles that can be applied to a parent `<svg>` will not be expressed when applied to a `<g>`.\n:::\n\n:::note\nThe `style` prop used by `VictoryAxis` has a different format than the standard `style` prop.\n:::\n\n:::note\ncustom `angle` and `verticalAnchor` properties may be included in labels styles.\n:::\n"
  },
  {
    "path": "website/docs/api/victory-theme.mdx",
    "content": "---\ntitle: VictoryTheme\n---\n\nAllows you to create a consistent look across all of your chart elements, either by using one of the included themes or by creating your own. By default, Victory components use the `grayscale` theme.\n\nVictory includes several [prebuilt](https://github.com/FormidableLabs/victory/blob/main/packages/victory-core/src/victory-theme) themes that can be used.\n\n:::info\nFor more information about themes and styles, see the [themes guide](/docs/guides/themes).\n:::\n\n## Types\n\nThis is roughly what the `VictoryTheme` object looks like, see the [source code](https://github.com/FormidableLabs/victory/blob/main/packages/victory-core/src/victory-theme/types.ts#L90) for the full definition.\n\n:::note\nThe `dependentAxis` and `independentAxis`, `polarDependentAxis`, and `polarIndependentAxis` will be merged with any props and styles supplied in the `axis` namespace.\n:::\n\n```ts\ninterface VictoryThemeDefinition {\n  palette: {...props};\n  area: {...props}\n  axis: {...props},\n  dependentAxis: {...props},\n  independentAxis: {...props},\n  polarDependentAxis: {...props},\n  polarIndependentAxis: {...props},\n  bar: {...props},\n  candlestick: {...props},\n  chart: {...props},\n  errorbar: {...props},\n  histogram: {...props},\n  group: {...props},\n  legend: {...props},\n  line: {...props},\n  pie: {...props},\n  scatter: {...props},\n  stack: {...props},\n  tooltip: {...props},\n  voronoi: {...props}\n}\n```\n\n### `palette`\n\nThe `palette` property defines a collection of colors that can be used across all chart elements. Each palette contains predefined color arrays that you can use directly or customize as needed.\n\n#### Properties\n\n| Property      | Type       | Description                                                                                   |\n| ------------- | ---------- | --------------------------------------------------------------------------------------------- |\n| `grayscale`   | `string[]` | Shades of gray, ideal for minimalist or monochrome chart designs                              |\n| `qualitative` | `string[]` | Used for categorical data, containing distinct colors that are easy to differentiate visually |\n| `heatmap`     | `string[]` | A gradient-based color scheme often used for heatmaps or data density visualizations          |\n| `warm`        | `string[]` | Warm colors like reds, oranges, and yellows                                                   |\n| `cool`        | `string[]` | Cool colors such as blues, purples, and greens                                                |\n| `red`         | `string[]` | Various shades of red                                                                         |\n| `blue`        | `string[]` | Various shades of blue                                                                        |\n| `green`       | `string[]` | Various shades of green                                                                       |\n\n## Example\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryLine data={sampleData} />\n</VictoryChart>\n```\n"
  },
  {
    "path": "website/docs/api/victory-tooltip.mdx",
    "content": "---\ntitle: VictoryTooltip\n---\n\n`VictoryTooltip` renders a tooltip component with a set of default events. When `VictoryTooltip` is used as a label component for any Victory component that renders data, it will attach events to rendered data components that will activate the tooltip when hovered or focused. `VictoryTooltip` renders text as well as a configurable [Flyout](/docs/api/victory-primitives#flyout) container.\n\n:::info\nFor examples of `VictoryTooltip` in action, visit the [tooltips](/docs/guides/tooltips) guide.\n:::\n\n:::note\nWhen providing tooltips for `VictoryLine` or `VictoryArea`, it is necessary to use [`VictoryVoronoiContainer`](/docs/api/victory-voronoi-container), as these components only render a single element for the entire dataset.\n:::\n\n```jsx live\n<VictoryChart\n  domain={{ x: [0, 11], y: [-10, 10] }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar\n    labelComponent={<VictoryTooltip />}\n    data={[\n      {\n        x: 2,\n        y: 5,\n        label: \"right-side-up\",\n      },\n      {\n        x: 4,\n        y: -6,\n        label: \"upside-down\",\n      },\n      { x: 6, y: 4, label: \"tiny\" },\n      {\n        x: 8,\n        y: -5,\n        label: \"or a little \\n BIGGER\",\n      },\n      {\n        x: 10,\n        y: 7,\n        label: \"automatically\",\n      },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Inherited Props\n\n<CommonProps\n  interfaces={[\"VictoryLabelableProps\"]}\n  overrides={[]}\n/>\n\n## Component Props\n\n---\n\n### active\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n</Badges>\n\nThe `active` prop specifies whether the tooltip component should be displayed.\n\n---\n\n### activateData\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n  <DefaultsBadge value=\"false}\" />\n</Badges>\n\nWhen true, tooltip events will set the `active` prop on both data and label elements.\n\n---\n\n### angle\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `angle` prop specifies the angle to rotate the tooltip around its origin point.\n\n---\n\n### center\n\n<Badges>\n  <TypeBadge value=\"{ x: number, y: number }\" />\n</Badges>\n\nThe `center` prop determines the position of the center of the tooltip flyout. This prop should be given as an object that describes the desired x and y svg coordinates of the center of the tooltip. This prop is useful for positioning the flyout of a tooltip _independent from_ the pointer. When `VictoryTooltip` is used with `VictoryVoronoiContainer`, the `center` prop is what enables the `mouseFollowTooltips` option. When this prop is set, non-zero `pointerLength` values will no longer be respected.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 50, y: 100 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar\n    data={sampleData}\n    labels={() => \"HELLO\"}\n    labelComponent={\n      <VictoryTooltip\n        center={{ x: 225, y: 30 }}\n        pointerOrientation=\"bottom\"\n        flyoutWidth={150}\n        flyoutHeight={50}\n        pointerWidth={150}\n        cornerRadius={0}\n      />\n    }\n  />\n</VictoryChart>\n```\n\n---\n\n### centerOffset\n\n<Badges>\n  <TypeBadge value=\"{ x: number | Function, y: number | Function }\" />\n</Badges>\n\nThe `centerOffset` prop determines the position of the center of the tooltip flyout _in relation to_ the flyout pointer. This prop should be given as an object of x and y, where each is either a numeric offset value or a function that returns a numeric value. When this prop is set, non-zero `pointerLength` values will no longer be respected.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 20 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar\n    data={sampleData}\n    labels={({ datum }) =>\n      `x: ${datum.x}, y: ${datum.y}`\n    }\n    labelComponent={\n      <VictoryTooltip\n        dy={0}\n        centerOffset={{ x: 25, y: -25 }}\n      />\n    }\n  />\n</VictoryChart>\n```\n\n---\n\n### constrainToVisibleArea\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n</Badges>\n\nThe `constrainToVisibleArea` prop determines whether to coerce tooltips so that they fit within the visible area of the chart. When this prop is set to true, tooltip pointers will still point to the correct data point, but the center of the tooltip will be shifted to fit within the overall width and height of the svg Victory renders.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 20 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar\n    data={sampleData}\n    labels={() =>\n      \"These labels just go on, and on, and on...\"\n    }\n    labelComponent={\n      <VictoryTooltip\n        constrainToVisibleArea\n      />\n    }\n  />\n</VictoryChart>\n```\n\n---\n\n### cornerRadius\n\n<Badges>\n  <TypeBadge value=\"number | Function\" />\n</Badges>\n\nThe `cornerRadius` prop determines the corner radius of the flyout container. This prop may be given as a positive number or a function of datum.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 20 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar\n    data={sampleData}\n    labels={({ datum }) =>\n      `y: ${datum.y}`\n    }\n    labelComponent={\n      <VictoryTooltip\n        cornerRadius={({ datum }) =>\n          datum.x * 2\n        }\n      />\n    }\n  />\n</VictoryChart>\n```\n\n---\n\n### data\n\n<Badges>\n  <TypeBadge value=\"object[]\" />\n</Badges>\n\nVictory components can pass a `data` prop to their label component. This can be useful in custom components that need to make use of the entire dataset.\n\n---\n\n### datum\n\n<Badges>\n  <TypeBadge value=\"object\" />\n</Badges>\n\nVictory components can pass a `datum` prop to their label component. This can\nbe used to calculate functional styles, and determine text.\n\n---\n\n### dx\n\n<Badges>\n  <TypeBadge value=\"number | Function\" />\n</Badges>\n\nThe `dx` prop defines a horizontal shift from the `x` coordinate.\n\n---\n\n### dy\n\n<Badges>\n  <TypeBadge value=\"number | Function\" />\n</Badges>\n\nThe `dy` prop defines a vertical shift from the `y` coordinate.\n\n---\n\n### events\n\n<Badges>\n  <TypeBadge value=\"object\" />\n</Badges>\n\nThe `events` prop attaches arbitrary event handlers to the label component. This prop should be given as an object of event names and corresponding event handlers. When events are provided via Victory's event system, event handlers will be called with the event, the props of the component it is attached to, and an eventKey.\n\n_examples:_ `events={{onClick: (evt) => alert(\"x: \" + evt.clientX)}}`\n\n---\n\n### flyoutComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge valuie=\"<Flyout/>\" />\n</Badges>\n\nThe `flyoutComponent` prop takes a component instance which will be used to create the flyout path for each tooltip. The new element created from the passed `flyoutComponent` will be supplied with the following properties: x, y, dx, dy, index, datum, cornerRadius, pointerLength, pointerWidth, width, height, orientation, style, and events. Any of these props may be overridden by passing in props to the supplied component, or modified or ignored within the custom component itself. If `flyoutComponent` is omitted, a default [Flyout][] component will be created with props described above.\n\n_examples:_ `flyoutComponent={<Flyout x={50} y={50}/>}`, `flyoutComponent={<MyCustomFlyout/>}`\n\n---\n\n### flyoutHeight\n\n<Badges>\n  <TypeBadge value=\"number | Function\" />\n</Badges>\n\nThe `flyoutHeight` prop defines the height of the tooltip flyout. This prop may be given as a positive number or a function of datum. If this prop is not set, `flyoutHeight` will be determined based on an [approximate text size][] calculated from the `text` and `style` props provided to `VictoryTooltip`.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 20 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar\n    data={sampleData}\n    labels={({ datum }) =>\n      `y: ${datum.y}`\n    }\n    labelComponent={\n      <VictoryTooltip\n        flyoutHeight={60}\n      />\n    }\n  />\n</VictoryChart>\n```\n\n---\n\n### flyoutPadding\n\n<Badges>\n  <TypeBadge value=\"number | Function | { top: number, bottom: number, left: number, right: number}\" />\n  <DefaultsBadge value=\"5\" />\n</Badges>\n\nThe `flyoutPadding` prop may be used to adjust the spacing between the tooltip label and the edges of the flyout outline. This prop may be given as a single number, an object with values for \"top\", \"bottom\", \"left\" and \"right\", or as a function that returns one of these.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 20 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar\n    data={sampleData}\n    labels={({ datum }) =>\n      datum.x % 2 === 0\n        ? [\n            `x: ${datum.x}`,\n            `y: ${datum.y}`,\n          ]\n        : [`y: ${datum.y}`]\n    }\n    labelComponent={\n      <VictoryTooltip\n        flyoutPadding={({ text }) =>\n          text.length > 1\n            ? {\n                top: 0,\n                bottom: 0,\n                left: 7,\n                right: 7,\n              }\n            : 7\n        }\n      />\n    }\n  />\n</VictoryChart>\n```\n\n---\n\n### flyoutStyle\n\n<Badges>\n  <TypeBadge value=\"object\" />\n</Badges>\n\nThe `style` prop applies SVG style properties to the rendered flyout container. These props will be passed to the `flyoutComponent`.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 20 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar\n    data={sampleData}\n    labels={({ datum }) =>\n      `y: ${datum.y}`\n    }\n    labelComponent={\n      <VictoryTooltip\n        flyoutStyle={{\n          stroke: \"tomato\",\n          strokeWidth: 2,\n        }}\n      />\n    }\n  />\n</VictoryChart>\n```\n\n---\n\n### flyoutWidth\n\n<Badges>\n  <TypeBadge value=\"number | Function\" />\n</Badges>\n\nThe `flyoutWidth` prop defines the width of the tooltip flyout. This prop may be given as a positive number or a function of datum. If this prop is not set, `flyoutWidth` will be determined based on an [approximate text size][] calculated from the `text` and `style` props provided to `VictoryTooltip`.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 20 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar\n    data={sampleData}\n    labels={({ datum }) =>\n      `y: ${datum.y}`\n    }\n    labelComponent={\n      <VictoryTooltip\n        flyoutWidth={90}\n      />\n    }\n  />\n</VictoryChart>\n```\n\n---\n\n### groupComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<g/>\" />\n</Badges>\n\nThe `groupComponent` prop takes a component instance which will be used to create group elements for use within container elements. This prop defaults to a `<g>` tag.\n\n---\n\n### height\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThis prop refers to the height of the `svg` that `VictoryLabel` is rendered within. **This prop is passed from parents of `VictoryLabel`, and should not be set manually. In versions before `^33.0.0` this prop referred to the height of the tooltip flyout. Please use `flyoutHeight` instead**\n\n---\n\n### horizontal\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n</Badges>\n\nThe `horizontal` prop determines whether to plot the flyouts to the left / right of the (x, y) coordinate rather than top / bottom. This is useful when an orientation prop is not provided, and data will determine the default orientation. _i.e._ negative values result in a left orientation and positive values will result in a right orientation by default.\n\n---\n\n### index\n\n<Badges>\n  <TypeBadge value=\"number | string\" />\n</Badges>\n\nThe `index` prop represents the index of the datum in the data array.\n\n---\n\n### pointerOrientation\n\n<Badges>\n  <TypeBadge\n    value={`\"top\" | \"bottom\" | \"left\" | \"right\" | Function`}\n  />\n</Badges>\n\nThis prop determines which side of the tooltip flyout the pointer should originate on. When this prop is not set, it will be determined based on the overall `orientation` of the flyout in relation to its data point, and any `center` or `centerOffset` values.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 20 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar\n    barWidth={20}\n    data={sampleData}\n    labels={({ datum }) => datum.y}\n    labelComponent={\n      <VictoryTooltip\n        pointerOrientation=\"right\"\n        dy={0}\n        dx={-12}\n        pointerWidth={25}\n        flyoutHeight={25}\n        flyoutWidth={25}\n        cornerRadius={0}\n        centerOffset={{ x: -50 }}\n      />\n    }\n  />\n</VictoryChart>\n```\n\n---\n\n### pointerWidth\n\n<Badges>\n  <TypeBadge value=\"number | Function\" />\n</Badges>\n\nThe `pointerWidth` prop determines the width of the base of the triangular pointer extending from the flyout. This prop may be given as a positive number or a function of datum.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 20 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar\n    data={sampleData}\n    labels={({ datum }) =>\n      `y: ${datum.y}`\n    }\n    labelComponent={\n      <VictoryTooltip\n        pointerWidth={20}\n      />\n    }\n  />\n</VictoryChart>\n```\n\n---\n\n### renderInPortal\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n  <DefaultsBadge value=\"true\" />\n</Badges>\n\nWhen `renderInPortal` is true, rendered tooltips will be wrapped in [VictoryPortal][] and rendered within the [Portal][] element within [VictoryContainer][]. _Note:_ This prop should be set to _false_ when using a custom container element.\n\n---\n\n### style\n\n<Badges>\n  <TypeBadge value=\"object\" />\n</Badges>\n\nThe `style` prop applies SVG style properties to the rendered `<text>` element.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 20 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar\n    data={sampleData}\n    labels={({ datum }) =>\n      `y: ${datum.y}`\n    }\n    labelComponent={\n      <VictoryTooltip\n        style={{\n          fill: \"tomato\",\n          stroke: \"black\",\n          strokeWidth: 2,\n        }}\n      />\n    }\n  />\n</VictoryChart>\n```\n\n---\n\n### text\n\n<Badges>\n  <TypeBadge value=\"string | number | Function | (string | number)[]\" />\n</Badges>\n\nThe `text` prop defines the text `VictoryTooltip` will render. The `text` prop may be given as a string, number, or function of `datum`. When [VictoryLabel][] is used as the `labelComponent`, strings may include newline characters, which VictoryLabel will split in to separate `<tspan/>` elements.\n\n---\n\n### width\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThis prop refers to the width of the `svg` that `VictoryLabel` is rendered within. **This prop is passed from parents of `VictoryLabel`, and should not be set manually. In versions before `^33.0.0` this prop referred to the width of the tooltip flyout. Please use `flyoutWidth` instead**\n\n---\n\n### x\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `x` prop defines the x coordinate to use as a basis for positioning the tooltip element.\n\n---\n\n### y\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe `y` prop defines the y coordinate to use as a basis for positioning the tooltip element.\n"
  },
  {
    "path": "website/docs/api/victory-transition.mdx",
    "content": "---\ntitle: VictoryTransition\n---\n\n`VictoryTransition` wraps a single child component in `VictoryAnimation`. In addition to animating the child component, it will also handle transitions for any entering and exiting nodes via the `onEnter` and `onExit` and `onLoad` transitions defined on its `animate` prop.\n\n:::info\nThis component is not typically used. Visit the [Animation](/docs/guides/animations) guide for examples of how to add animation to charts.\n:::\n\n## Component Props\n\n---\n\n### children\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n</Badges>\n\n`VictoryTransition` adds transitions to a single child.\n\n---\n\n### animate\n\n<Badges>\n  <TypeBadge value=\"object | boolean\" />\n</Badges>\n\nThe `animate` prop specifies props for VictoryAnimation and VictoryTransition to use. The animate prop may be used to specify the duration, delay and easing of an animation as well as the behavior of `onEnter` and `onExit` and `onLoad` transitions. Each Victory component defines its own default transitions, but these may be modified, or overwritten with the `animate` prop.\n\n_examples:_ `animate={{duration: 2000, onLoad: {duration: 1000}, onEnter: {duration: 500, before: () => ({y: 0})}}}`\n\n---\n\n### animationWhitelist\n\n<Badges>\n  <TypeBadge value=\"string[]\" />\n</Badges>\n\nThe `animationWhitelist` defines a list of props to animate on the child. This prop should be given as an array of strings.\n"
  },
  {
    "path": "website/docs/api/victory-voronoi-container.mdx",
    "content": "---\ntitle: VictoryVoronoiContainer\n---\n\nAdds the ability to associate a mouse position with the data point(s) closest to it.\n\n:::info\nFor examples of `VictoryVoronoiContainer` in action, visit the [containers](/docs/guides/containers) guide.\n:::\n\n## Inherited Props\n\n<CommonProps\n  interfaces={[\"VictoryContainerProps\"]}\n  overrides={[]}\n/>\n\n## Component Props\n\n---\n\n### activateData\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n  <DefaultsBadge value=\"true\" />\n</Badges>\n\nWhen the `activateData` prop is set to true, the `active` prop will be set to true on all data components within a voronoi area. When this prop is set to false, the `onActivated` and `onDeactivated` callbacks will still fire, but no mutations to data components will occur via Victory's event system.\n\n---\n\n### activateLabels\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n  <DefaultsBadge value=\"true\" />\n</Badges>\n\nWhen the `activateLabels` prop is set to true, the `active` prop will be set to true on all labels corresponding to points within a voronoi area. When this prop is set to false, the `onActivated` and `onDeactivated` callbacks will still fire, but no mutations to label components will occur via Victory's event system. Labels defined directly on `VictoryVoronoiContainer` via the `labels` prop will still appear when this prop is set to false.\n\n---\n\n### disable\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n</Badges>\n\nWhen the `disable` prop is set to `true`, `VictoryVoronoiContainer` events will not fire.\n\n---\n\n### labels\n\n<Badges>\n  <TypeBadge value=\"function\" />\n</Badges>\n\nWhen a `labels` prop is provided to `VictoryVoronoiContainer` it will render a label component\nrather than activating labels on the child components it renders. This is useful for creating multi-\npoint tooltips. This prop should be given as a function which will be called once for each active point. The `labels` function will be called with the props that correspond to the active label.\n\n_example:_ `labels={({ datum }) => \"y: \" + datum.y}`\n\n---\n\n### labelComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n  <DefaultsBadge value=\"<VictoryTooltip centerOffset={{ x: 5 }} />\" />\n</Badges>\n\nThe `labelComponent` prop specified the component that will be rendered when `labels` are defined\non `VictoryVoronoiContainer`. If the `labels` prop is omitted, no label component will be rendered.\n\n```jsx live\n<VictoryChart\n  domain={{ y: [0, 6] }}\n  containerComponent={\n    <VictoryVoronoiContainer\n      labels={() =>\n        \"Long, verbose labels\"\n      }\n      labelComponent={\n        <VictoryTooltip\n          dy={-7}\n          constrainToVisibleArea\n        />\n      }\n    />\n  }\n  theme={VictoryTheme.clean}\n>\n  <VictoryScatter\n    style={{\n      data: { fill: \"red\" },\n      labels: { fill: \"red\" },\n    }}\n    data={[\n      { x: 0, y: 2 },\n      { x: 2, y: 3 },\n      { x: 4, y: 4 },\n      { x: 6, y: 5 },\n    ]}\n  />\n  <VictoryScatter\n    data={[\n      { x: 2, y: 2 },\n      { x: 4, y: 3 },\n      { x: 6, y: 4 },\n      { x: 8, y: 5 },\n    ]}\n  />\n</VictoryChart>\n```\n\n---\n\n### mouseFollowTooltips\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n</Badges>\n\nWhen the `mouseFollowTooltip` prop is set on `VictoryVoronoiContainer`, The position of the center of the tooltip follows the position of the mouse.\n\n```jsx live\n<VictoryChart\n  domain={{ y: [0, 6] }}\n  containerComponent={\n    <VictoryVoronoiContainer\n      mouseFollowTooltips\n      voronoiDimension=\"x\"\n      labels={({ datum }) =>\n        `y: ${datum.y}`\n      }\n    />\n  }\n  theme={VictoryTheme.clean}\n>\n  <VictoryScatter\n    style={{\n      data: { fill: \"red\" },\n      labels: { fill: \"red\" },\n    }}\n    data={[\n      { x: 0, y: 2 },\n      { x: 2, y: 3 },\n      { x: 4, y: 4 },\n      { x: 6, y: 5 },\n    ]}\n  />\n  <VictoryScatter\n    data={[\n      { x: 2, y: 2 },\n      { x: 4, y: 3 },\n      { x: 6, y: 4 },\n      { x: 8, y: 5 },\n    ]}\n  />\n</VictoryChart>\n```\n\n---\n\n### onActivated\n\n<Badges>\n  <TypeBadge value=\"function\" />\n</Badges>\n\nThe `onActivated` prop accepts a function to be called whenever new data points are activated.\nThe function is called with the parameters `points` (an array of active data objects) and `props` (the props used by `VictoryVoronoiContainer`).\n\n_example:_ `onActivated={(points, props) => filterList(points, props)}`\n\n---\n\n### onDeactivated\n\n<Badges>\n  <TypeBadge value=\"function\" />\n</Badges>\n\nThe `onDeactivated` prop accepts a function to be called whenever points are deactivated.\nThe function is called with the parameters `points` (an array of the newly-deactivated data objects) and `props` (the props used by `VictoryVoronoiContainer`).\n\n_example:_ `onDeactivated={(points, props) => removeFromList(points, props)}`\n\n---\n\n### radius\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nWhen the `radius` prop is set, the voronoi areas associated with each data point will be no larger\nthan the given radius. This prop should be given as a number.\n\n---\n\n### voronoiBlacklist\n\n<Badges>\n  <TypeBadge value=\"string[]\" />\n</Badges>\n\nThe `voronoiBlacklist` prop is used to specify a list of components to ignore when calculating a shared voronoi diagram. Components with a `name` prop matching an element in the `voronoiBlacklist` array will be ignored by `VictoryVoronoiContainer`. Ignored components will never be flagged as active, and will not contribute data to shared tooltips or labels.\n\n_example:_ `voronoiBlacklist={[\"redPoints\"]}`\n\n```jsx live\n<VictoryChart\n  domain={{ y: [0, 6] }}\n  containerComponent={\n    <VictoryVoronoiContainer\n      voronoiBlacklist={[\"redPoints\"]}\n      labels={({ datum }) =>\n        `y: ${datum.y}`\n      }\n    />\n  }\n  theme={VictoryTheme.clean}\n>\n  <VictoryScatter\n    name=\"redPoints\"\n    style={{\n      data: { fill: \"red\" },\n      labels: { fill: \"red\" },\n    }}\n    data={[\n      { x: 0, y: 2 },\n      { x: 2, y: 3 },\n      { x: 4, y: 4 },\n      { x: 6, y: 5 },\n    ]}\n  />\n  <VictoryScatter\n    data={[\n      { x: 2, y: 2 },\n      { x: 4, y: 3 },\n      { x: 6, y: 4 },\n      { x: 8, y: 5 },\n    ]}\n  />\n</VictoryChart>\n```\n\n---\n\n### voronoiDimension\n\n<Badges>\n  <TypeBadge value='\"x\" | \"y\"' />\n</Badges>\n\nWhen the `voronoiDimension` prop is set, voronoi selection will only take the given dimension into account.\nFor example, when `dimension` is set to \"x\", all data points matching a particular x mouse position\nwill be activated regardless of y value. When this prop is not given, voronoi selection is\ndetermined by both x and y values.\n\n_example:_ `voronoiDimension=\"x\"`\n\n```jsx live\n<VictoryChart\n  domain={{ y: [0, 6] }}\n  containerComponent={\n    <VictoryVoronoiContainer\n      voronoiDimension=\"x\"\n      labels={({ datum }) =>\n        `y: ${datum.y}`\n      }\n    />\n  }\n  theme={VictoryTheme.clean}\n>\n  <VictoryScatter\n    style={{\n      data: { fill: \"red\" },\n      labels: { fill: \"red\" },\n    }}\n    data={[\n      { x: 0, y: 2 },\n      { x: 2, y: 3 },\n      { x: 4, y: 4 },\n      { x: 6, y: 5 },\n    ]}\n  />\n  <VictoryScatter\n    data={[\n      { x: 2, y: 2 },\n      { x: 4, y: 3 },\n      { x: 6, y: 4 },\n      { x: 8, y: 5 },\n    ]}\n  />\n</VictoryChart>\n```\n\n---\n\n### voronoiPadding\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nWhen the `voronoiPadding` prop is given, the area of the chart that will trigger voronoi events is\nreduced by the given padding on every side. By default, no padding is applied, and the entire range\nof a given chart may trigger voronoi events. This prop should be given as a number.\n"
  },
  {
    "path": "website/docs/api/victory-voronoi.mdx",
    "content": "---\ntitle: VictoryVoronoi\n---\n\n:::info\nFor examples of `VictoryVoronoi` in action, visit the [Scatter Chart](/docs/charts/voronoi) examples.\n:::\n\n## Inherited Props\n\n<CommonProps\n  interfaces={[\n    \"VictoryCommonProps\", // Omits 'polar'\n    \"VictoryDatableProps\",\n    \"VictoryMultiLabelableProps\",\n  ]}\n  overrides={[]}\n/>\n\n## Component Props\n\n---\n\n### events\n\n<Badges>\n  <TypeBadge value=\"object[]\" />\n</Badges>\n\n`VictoryVoronoi` uses the standard `events` prop. [Read about it in more detail here](/docs/guides/events)\n\nSee the [Events Guide][] for more information on defining events.\n\n```jsx live\n<div>\n  <h3>Click a cell below</h3>\n  <VictoryVoronoi\n    events={[\n      {\n        target: \"data\",\n        eventHandlers: {\n          onClick: () => {\n            return [\n              {\n                target: \"data\",\n                mutation: (props) => {\n                  const fill =\n                    props.style &&\n                    props.style.fill;\n                  return fill ===\n                    \"black\"\n                    ? null\n                    : {\n                        style: {\n                          fill: \"black\",\n                        },\n                      };\n                },\n              },\n            ];\n          },\n        },\n      },\n    ]}\n    data={sampleData}\n    theme={VictoryTheme.clean}\n  />\n</div>\n```\n\n---\n\n### size\n\n<Badges>\n  <TypeBadge value=\"number\" />\n</Badges>\n\nThe size prop determines the maximum size of each voronoi area. When this prop is given, a circular area of the specified size will be rendered, and clipped where it would overlap with other voronoi areas. If this prop is not given, the entire voronoi area will be used.\n\n---\n\n### style\n\n<Badges>\n  <TypeBadge value=\"{ parent: object, data: object, labels: object }\" />\n</Badges>\n\n`VictoryVoronoi` uses the standard `style` prop. [Read about it in detail here](/docs/guides/themes)\n\n```jsx live\n<VictoryVoronoi\n  style={{\n    data: {\n      stroke: \"#c43a31\",\n      strokeWidth: 3,\n    },\n    labels: {\n      fontSize: 15,\n      fill: \"#c43a31\",\n      padding: 15,\n    },\n  }}\n  size={50}\n  data={sampleData}\n  labels={({ datum }) => datum.x}\n/>\n```\n"
  },
  {
    "path": "website/docs/api/victory-zoom-container.mdx",
    "content": "---\ntitle: VictoryZoomContainer\n---\n\nProvides pan and zoom behavior for any Victory component that works with an x, y axis,\n\n:::info\nFor examples of `VictoryZoomContainer` in action, visit the [containers](/docs/guides/containers) guide.\n:::\n\n## Inherited Props\n\n<CommonProps\n  interfaces={[\"VictoryContainerProps\"]}\n  overrides={[]}\n/>\n\n## Component Props\n\n---\n\n### allowPan\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n  <DefaultsBadge value=\"true\" />\n</Badges>\n\nThe optional `allowPan` prop accepts a boolean that enables the panning functionality. Zooming will still be enabled when the `allowPan` prop is set to false.\n\n---\n\n### allowZoom\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n  <DefaultsBadge value=\"true\" />\n</Badges>\n\nThe optional `allowZoom` prop accepts a boolean that enables the zoom functionality. Panning will still be enabled when the `allowZoom` prop is set to false.\n\n---\n\n### clipContainerComponent\n\n<Badges>\n  <TypeBadge value=\"ReactElement\" />\n</Badges>\n\n`VictoryZoomContainer` works by clipping data outside of a given domain. `VictoryZoomContainer` uses `VictoryClipContainer` by default. This prop should not be replaced with a custom component, but you may want to set props on `VictoryClipContainer`, such as `clipPadding`\n\n_example:_ `clipContainerComponent={<VictoryClipContainer clipPadding={{top: 10, right: 10}} />}`\n\n---\n\n### disable\n\n<Badges>\n  <TypeBadge value=\"boolean\" />\n</Badges>\n\nWhen the `disable` prop is set to `true`, `VictoryZoomContainer` events will not fire.\n\n---\n\n### downsample\n\n<Badges>\n  <TypeBadge value=\"number | boolean\" />\n</Badges>\n\nThe `downsample` prop limits the number of points that will be displayed. This prop may be given as a boolean or a number corresponding to the maximum number of points. When given as a boolean, the maximum number of points that will be plotted is 150.\n\n---\n\n### minimumZoom\n\n<Badges>\n  <TypeBadge value=\"{ x: number, y: number }\" />\n</Badges>\n\nThe `minimumZoom` prop sets a minimum domain extent for the zoomed chart. When the difference between\nthe maximum and minimum of a zoomed domain is equal to the `minimumZoom` in either dimension, the\ncomponent will stop responding to events that would normally trigger zooming in. Zooming out and\npanning will still be enabled. When this prop is not specified, the default minimum zoom will\ncover 1 / 1000th of the original domain. This prop should be given as an object with numeric values\nfor x and y.\n\n_example:_ `minimumZoom={{x: 1, y: 0.01}}`\n\n---\n\n### onZoomDomainChange\n\n<Badges>\n  <TypeBadge value=\"function\" />\n</Badges>\n\nThe optional `onZoomDomainChange` prop accepts a function to be called on each update to the visible domain. The function accepts the parameters `domain` (the updated domain) and `props` (the props used by `VictoryZoomContainer`).\n\n_example:_ `onZoomDomainChange={(domain, props) => handleDomainChange(domain, props)}`\n\n---\n\n### zoomDomain\n\n<Badges>\n  <TypeBadge value=\"{ x: [low, high], y: [low, high] }\" />\n</Badges>\n\nThe `zoomDomain` prop describes the zoomed state. This prop is an object that\nspecifies separate arrays for x and y. Each array is a tuple that describes the minimum and maximum\nvalues to render. If this prop is not provided initially, the chart will render without an initial\nzoom, displaying the entire dataset. Updates to `zoomDomain` will trigger a re-render of the chart\nwith the new domain.\n\n_example:_ `zoomDomain={{x: [0, 100]}}`\n\n---\n\n### zoomDimension\n\n<Badges>\n  <TypeBadge value='\"x\" || \"y\"' />\n</Badges>\n\nWhen the `zoomDimension` prop is set, panning and zooming will be restricted to the given dimension\n(either x or y), and the domain of the other dimension will remain static. When this prop is not\nspecified, both x and y dimensions will pan and zoom.\n\n_example:_ `zoomDimension=\"x\"`\n"
  },
  {
    "path": "website/docs/charts/_category_.json",
    "content": "{\n  \"label\": \"Chart Types\",\n  \"position\": 1,\n  \"link\": null\n}\n"
  },
  {
    "path": "website/docs/charts/area.mdx",
    "content": "---\ntitle: Area\n---\n\nArea charts are used for visualizing trends in data over a continuous interval while emphasizing the magnitude of the values.\n\n## Basic\n\nSee the [full API here](/docs/api/victory-area). Typically composed with [`VictoryChart`](/docs/api/victory-chart) to create full charts.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryArea data={sampleData} />\n</VictoryChart>\n```\n\n## Area Charts - Horizontal\n\nArea charts can be rendered with a flipped axis by setting the `horizontal` prop to `true`. This prop can be applied to either `VictoryChart` or `VictoryArea`.\n\n```jsx live\n<VictoryChart\n  horizontal\n  theme={VictoryTheme.clean}\n>\n  <VictoryArea data={sampleData} />\n</VictoryChart>\n```\n\n## Area Charts - Interpolation\n\nArea charts can use interpolation to smooth the line between data points. See the [full list of interpolation options](/docs/api/victory-area#interpolation).\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryArea\n    data={sampleData}\n    interpolation=\"natural\"\n  />\n</VictoryChart>\n```\n\n## Area Charts - Null Data\n\nArea charts can handle null data points by setting the `data` prop to an array of objects with `x` and `y` values. Null data points will be skipped.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryArea\n    data={[\n      { x: 1, y: 1 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 2 },\n      { x: 5, y: null },\n      { x: 6, y: null },\n      { x: 7, y: 6 },\n      { x: 8, y: 7 },\n      { x: 9, y: 8 },\n      { x: 10, y: 12 },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Area Charts - Discontinuous Scale\n\nArea charts can be rendered with a discontinuous scale by using the `scaleDiscontinuous` plugin from `@d3fc/d3fc-discontinuous-scale`.\n\n```jsx live noInline\nfunction App() {\n  const data = [\n    { x: new Date(2021, 5, 1), y: 8 },\n    { x: new Date(2021, 5, 2), y: 10 },\n    { x: new Date(2021, 5, 3), y: 7 },\n    { x: new Date(2021, 5, 4), y: 4 },\n    { x: new Date(2021, 5, 7), y: 6 },\n    { x: new Date(2021, 5, 8), y: 3 },\n    { x: new Date(2021, 5, 9), y: 7 },\n    { x: new Date(2021, 5, 10), y: 9 },\n    { x: new Date(2021, 5, 11), y: 6 },\n  ];\n\n  // scaleDiscontinuous and discontinuitySkipWeekends are both\n  // plugins imported from @d3fc/d3fc-discontinuous-scale\n  const discontinuousScale =\n    scaleDiscontinuous(\n      d3Scale.scaleTime(),\n    ).discontinuityProvider(\n      discontinuitySkipWeekends(),\n    );\n\n  return (\n    <VictoryChart\n      scale={{ x: discontinuousScale }}\n      theme={VictoryTheme.clean}\n    >\n      <VictoryArea data={data} />\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n\n## Area Charts - Plotting\n\nArea charts can render math functions as data by supplying a function to the `y` prop.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryArea\n    interpolation=\"basis\"\n    data={_.range(0, 100)}\n    y={(d) => Math.sin(d)}\n  />\n</VictoryChart>\n```\n\n## Area Charts - Combined\n\nArea charts can be combined into the same chart. Note that the order of the components will determine the rendering order.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryArea\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n    style={{\n      data: {\n        fill: \"#8b46ff\",\n        fillOpacity: 0.65,\n      },\n    }}\n  />\n  <VictoryArea\n    data={[\n      { x: 1, y: 1 },\n      { x: 2, y: 4 },\n      { x: 3, y: 5 },\n      { x: 4, y: 7 },\n      { x: 5, y: 5 },\n    ]}\n    style={{\n      data: {\n        fill: \"#2d7ff9\",\n        fillOpacity: 0.65,\n      },\n    }}\n  />\n</VictoryChart>\n```\n\n## Area Charts - Baseline\n\nArea charts can be rendered with a baseline for dependent values by setting the `y0` property on each data point.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryArea\n    data={[\n      { x: 1, y: 2, y0: 0 },\n      { x: 2, y: 3, y0: 1 },\n      { x: 3, y: 5, y0: 1 },\n      { x: 4, y: 4, y0: 2 },\n      { x: 5, y: 6, y0: 2 },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Area Charts - Stacked\n\nArea charts can be stacked using the `VictoryStack` component. This will automatically adjust the `y0` property for each data point and apply a `colorScale`.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryStack colorScale=\"qualitative\">\n    <VictoryArea\n      data={[\n        { x: 1, y: 2 },\n        { x: 2, y: 3 },\n        { x: 3, y: 5 },\n        { x: 4, y: 4 },\n        { x: 5, y: 7 },\n      ]}\n    />\n    <VictoryArea\n      data={[\n        { x: 1, y: 1 },\n        { x: 2, y: 4 },\n        { x: 3, y: 5 },\n        { x: 4, y: 7 },\n        { x: 5, y: 5 },\n      ]}\n    />\n    <VictoryArea\n      data={[\n        { x: 1, y: 3 },\n        { x: 2, y: 2 },\n        { x: 3, y: 6 },\n        { x: 4, y: 2 },\n        { x: 5, y: 6 },\n      ]}\n    />\n    <VictoryArea\n      data={[\n        { x: 1, y: 2 },\n        { x: 2, y: 3 },\n        { x: 3, y: 3 },\n        { x: 4, y: 4 },\n        { x: 5, y: 7 },\n      ]}\n    />\n  </VictoryStack>\n</VictoryChart>\n```\n\n## Area Charts - Labels\n\nAdd labels to charts by setting the `labels` prop to the name of a property in the dataset, or a function that returns the label value. You can customize the display of the labels by using the [`labelComponent`](/docs/api/victory-area#labelcomponent) prop.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryArea\n    data={sampleData}\n    labels={({ datum }) => datum.y}\n  />\n</VictoryChart>\n```\n\n## Area Charts - Tooltips\n\n`VictoryArea` only renders a single element to represent an entire dataset, so replacing its `labelComponent` with `VictoryTooltip` won't work as expected. Use `VictoryVoronoiContainer` to associate mouse position with the nearest data points.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n  containerComponent={\n    <VictoryVoronoiContainer />\n  }\n>\n  <VictoryArea\n    data={sampleData}\n    labelComponent={<VictoryTooltip />}\n    labels={({ datum }) => datum.y}\n  />\n</VictoryChart>\n```\n\n## Area Charts - Animation\n\nCharts can be animated by setting the `animate` prop. See the [animations](/docs/guides/animations) guide for more information.\n\n```jsx live noInline\nfunction App() {\n  const [state, setState] =\n    React.useState({ data: getData() });\n\n  React.useState(() => {\n    const setStateInterval =\n      window.setInterval(() => {\n        setState({ data: getData() });\n      }, 4000);\n\n    return () => {\n      window.clearInterval(\n        setStateInterval,\n      );\n    };\n  }, []);\n\n  return (\n    <VictoryChart\n      theme={VictoryTheme.clean}\n    >\n      <VictoryStack colorScale={\"blue\"}>\n        {state.data.map((data, i) => {\n          return (\n            <VictoryArea\n              key={i}\n              data={data}\n              interpolation=\"basis\"\n              animate={{\n                duration: 1000,\n              }}\n            />\n          );\n        })}\n      </VictoryStack>\n    </VictoryChart>\n  );\n}\n\nfunction getData() {\n  return _.range(7).map(() => {\n    return [\n      { x: 1, y: _.random(1, 5) },\n      { x: 2, y: _.random(1, 10) },\n      { x: 3, y: _.random(2, 10) },\n      { x: 4, y: _.random(2, 10) },\n      { x: 5, y: _.random(2, 15) },\n    ];\n  });\n}\n\nrender(<App />);\n```\n\n## Area Charts - Styles\n\nChart styling can be customized by using the theme or overriding the style prop on the component.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryArea\n    data={sampleData}\n    labels={({ datum }) => datum.y}\n    style={{\n      data: {\n        fill: \"#c43a31\",\n        fillOpacity: 0.4,\n        stroke: \"#c43a31\",\n        strokeWidth: 2,\n      },\n      labels: {\n        fontSize: 12,\n        fill: \"#c43a31\",\n      },\n    }}\n  />\n</VictoryChart>\n```\n\n## Area Charts - Events\n\nEvents can be handled by passing an array of event objects to the `events` prop on the `VictoryArea` component. `VictoryArea` uses the special `all` key for the target prop to attach events to all data points. See the [events](/docs/guides/events) guide for more information.\n\n```jsx live noInline\nfunction App() {\n  const toggleFillColor = (fill) => {\n    if (fill === \"black\") {\n      return null;\n    } else {\n      return {\n        style: {\n          fill: \"black\",\n        },\n      };\n    }\n  };\n\n  return (\n    <VictoryChart\n      theme={VictoryTheme.clean}\n    >\n      <VictoryArea\n        data={sampleData}\n        labels={({ datum }) => datum.y}\n        events={[\n          {\n            target: \"data\",\n            eventHandlers: {\n              onClick: () => {\n                return [\n                  {\n                    eventKey: \"all\",\n                    mutation: (props) =>\n                      toggleFillColor(\n                        props.style\n                          ?.fill,\n                      ),\n                  },\n                ];\n              },\n            },\n          },\n        ]}\n      />\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n\n## Polar Area Charts\n\nArea charts can be rendered in polar coordinates by setting the `polar` prop to `true` and using `VictoryPolarAxis` components.\n\n```jsx live\n<VictoryChart\n  polar\n  domain={{ y: [0, 7] }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryPolarAxis\n    dependentAxis\n    style={{ axis: { stroke: \"none\" } }}\n    tickFormat={() => null}\n  />\n  <VictoryPolarAxis />\n  <VictoryArea data={sampleData} />\n</VictoryChart>\n```\n\n## Polar Area Charts - Radar\n\nArea charts can be rendered in polar coordinates with a radar shape by setting the `polar` prop to `true` and using `VictoryPolarAxis` components.\n\n```jsx live noInline\nconst characterData = [\n  {\n    strength: 1,\n    intelligence: 250,\n    luck: 1,\n    stealth: 40,\n    charisma: 50,\n  },\n  {\n    strength: 2,\n    intelligence: 300,\n    luck: 2,\n    stealth: 80,\n    charisma: 90,\n  },\n  {\n    strength: 5,\n    intelligence: 225,\n    luck: 3,\n    stealth: 60,\n    charisma: 120,\n  },\n];\n\nfunction App() {\n  const [state, setState] =\n    React.useState({\n      data: processData(characterData),\n      maxima: getMaxima(characterData),\n    });\n\n  return (\n    <VictoryChart\n      polar\n      theme={VictoryTheme.clean}\n      domain={{ y: [0, 1] }}\n    >\n      <VictoryGroup\n        style={{\n          data: {\n            fillOpacity: 0.2,\n            strokeWidth: 2,\n          },\n        }}\n      >\n        {state.data.map((data, i) => {\n          return (\n            <VictoryArea\n              key={i}\n              data={data}\n            />\n          );\n        })}\n      </VictoryGroup>\n      {Object.keys(state.maxima).map(\n        (key, i) => {\n          return (\n            <VictoryPolarAxis\n              key={i}\n              dependentAxis\n              style={{\n                axisLabel: {\n                  padding: 10,\n                },\n                axis: {\n                  stroke: \"none\",\n                },\n                grid: {\n                  stroke: \"grey\",\n                  strokeWidth: 0.25,\n                  opacity: 0.5,\n                },\n              }}\n              tickLabelComponent={\n                <VictoryLabel labelPlacement=\"vertical\" />\n              }\n              labelPlacement=\"perpendicular\"\n              axisValue={i + 1}\n              label={key}\n              tickFormat={(t) =>\n                Math.ceil(\n                  t * state.maxima[key],\n                )\n              }\n              tickValues={[\n                0.25, 0.5, 0.75,\n              ]}\n            />\n          );\n        },\n      )}\n      <VictoryPolarAxis\n        labelPlacement=\"parallel\"\n        tickFormat={() => \"\"}\n        style={{\n          axis: { stroke: \"none\" },\n          grid: {\n            stroke: \"grey\",\n            opacity: 0.5,\n          },\n        }}\n      />\n    </VictoryChart>\n  );\n}\n\nfunction getMaxima(data) {\n  const groupedData = Object.keys(\n    data[0],\n  ).reduce((memo, key) => {\n    memo[key] = data.map((d) => d[key]);\n    return memo;\n  }, {});\n  return Object.keys(\n    groupedData,\n  ).reduce((memo, key) => {\n    memo[key] = Math.max(\n      ...groupedData[key],\n    );\n    return memo;\n  }, {});\n}\n\nfunction processData(data) {\n  const maxByGroup = getMaxima(data);\n  const makeDataArray = (d) => {\n    return Object.keys(d).map((key) => {\n      return {\n        x: key,\n        y: d[key] / maxByGroup[key],\n      };\n    });\n  };\n  return data.map((datum) =>\n    makeDataArray(datum),\n  );\n}\n\nrender(<App />);\n```\n\n## Standalone Rendering\n\nArea charts can be rendered outside a VictoryChart.\n\n```jsx live\n<VictoryArea\n  theme={VictoryTheme.clean}\n  data={sampleData}\n/>\n```\n\nThey can also be embeded in other SVG components by using the `standalone` prop.\n\n```jsx live\n<div style={{ padding: \"20px\" }}>\n  <svg\n    width={300}\n    height={300}\n    style={{\n      display: \"block\",\n      margin: \"0 auto\",\n    }}\n  >\n    <circle\n      cx={150}\n      cy={150}\n      r={150}\n      fill=\"#9ded91\"\n    />\n    <VictoryArea\n      standalone={false}\n      theme={VictoryTheme.clean}\n      width={300}\n      height={300}\n      padding={{ left: 10, right: 10 }}\n      data={sampleData}\n    />\n  </svg>\n</div>\n```\n"
  },
  {
    "path": "website/docs/charts/bar.mdx",
    "content": "---\ntitle: Bar\n---\n\nBar charts renders a dataset as series of bars and is used for comparing numeric values between different categories.\n\n## Basic\n\nSee the [full API here](/docs/api/victory-bar). Typically composed with [`VictoryChart`](/docs/api/victory-chart) to create full charts.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 20 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar data={sampleData} />\n</VictoryChart>\n```\n\n## Bar Charts - Domain\n\nBars in `VictoryBar` are centered around their corresponding value by default. You can move your bars away from your axis by setting a new domain, adding `domainPadding`, or changing how bars are aligned relative to their values with the `alignment` prop on `VictoryBar`.\n\n:::note\nUsing `domainPadding` to adjust the bar position is the most common way to adjust the position of bars in a chart.\n:::\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 50 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar data={sampleData} />\n</VictoryChart>\n```\n\n:::note\nSetting the bar alignment using the `alignment` prop.\n:::\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar\n    alignment=\"start\"\n    data={sampleData}\n  />\n</VictoryChart>\n```\n\n:::note\nSetting the bar alignment using the `domain` prop.\n:::\n\n```jsx live\n<VictoryChart\n  domain={{ x: [0.5, 5.5] }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar data={sampleData} />\n</VictoryChart>\n```\n\n## Bar Charts - Horizontal\n\nBar charts can be rendered horizontally by setting the `horizontal` prop to `true`. This prop can be applied to either `VictoryChart` or `VictoryBar`.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 20 }}\n  horizontal\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar />\n</VictoryChart>\n```\n\n## Bar Charts - Labels\n\nAdd labels to charts by setting the `labels` prop to the name of a property in the dataset, or a function that returns the label value. You can customize the display of the labels by using the [`labelComponent`](/docs/api/victory-area#labelcomponent) prop.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 20 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar\n    data={sampleData}\n    labels={({ datum }) => datum.y}\n  />\n</VictoryChart>\n```\n\n## Bar Charts - Tooltips\n\nTooltips can be added by using a [`VictoryTooltip`](/docs/api/victory-tooltip) component as the `labelComponent`.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 20 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar\n    data={sampleData}\n    labelComponent={<VictoryTooltip />}\n    labels={({ datum }) => datum.y}\n  />\n</VictoryChart>\n```\n\n## Bar Charts - Grouped\n\nBar charts can be grouped to show how different subcategories compare to each other.\n\n```jsx live noInline\nfunction App() {\n  return (\n    <VictoryChart\n      theme={VictoryTheme.clean}\n      domain={{ y: [0.5, 5.5] }}\n      domainPadding={{ x: 40 }}\n    >\n      <VictoryGroup\n        offset={20}\n        style={{ data: { width: 15 } }}\n      >\n        <VictoryBar\n          data={[\n            { x: \"2023 Q1\", y: 1 },\n            { x: \"2023 Q2\", y: 2 },\n            { x: \"2023 Q3\", y: 3 },\n            { x: \"2023 Q4\", y: 2 },\n          ]}\n        />\n        <VictoryBar\n          data={[\n            { x: \"2023 Q1\", y: 2 },\n            { x: \"2023 Q2\", y: 3 },\n            { x: \"2023 Q3\", y: 4 },\n            { x: \"2023 Q4\", y: 5 },\n          ]}\n        />\n        <VictoryBar\n          data={[\n            { x: \"2023 Q1\", y: 1 },\n            { x: \"2023 Q2\", y: 2 },\n            { x: \"2023 Q3\", y: 3 },\n            { x: \"2023 Q4\", y: 4 },\n          ]}\n        />\n      </VictoryGroup>\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n\n## Bar Charts - Grouped Labels\n\nBar chart labels for grouped bars can be rendered by setting the `labels` prop to the name of a property in the dataset, an array, or a function that returns the label value.\n\n```jsx live noInline\nfunction App() {\n  return (\n    <VictoryChart\n      theme={VictoryTheme.clean}\n      domain={{ y: [0.5, 5.5] }}\n      domainPadding={{ x: 40 }}\n    >\n      <VictoryGroup\n        offset={20}\n        style={{ data: { width: 15 } }}\n      >\n        <VictoryBar\n          data={[\n            { x: \"2023 Q1\", y: 1 },\n            { x: \"2023 Q2\", y: 2 },\n            { x: \"2023 Q3\", y: 3 },\n            { x: \"2023 Q4\", y: 2 },\n          ]}\n          labels={({ datum }) =>\n            datum.y\n          }\n        />\n        <VictoryBar\n          data={[\n            { x: \"2023 Q1\", y: 2 },\n            { x: \"2023 Q2\", y: 3 },\n            { x: \"2023 Q3\", y: 4 },\n            { x: \"2023 Q4\", y: 5 },\n          ]}\n          labels={({ datum }) =>\n            datum.y\n          }\n        />\n        <VictoryBar\n          data={[\n            { x: \"2023 Q1\", y: 1 },\n            { x: \"2023 Q2\", y: 2 },\n            { x: \"2023 Q3\", y: 3 },\n            { x: \"2023 Q4\", y: 4 },\n          ]}\n          labels={({ datum }) =>\n            datum.y\n          }\n        />\n      </VictoryGroup>\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n\n## Bar Charts - Combination\n\nBar charts can be rendered with other chart types like `Line`.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 20 }}\n  horizontal\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar />\n  <VictoryLine />\n</VictoryChart>\n```\n\n## Bar Charts - Animation\n\nCharts can be animated by setting the `animate` prop. See the [animations](/docs/guides/animations) guide for more information.\n\n```jsx live noInline\nfunction App() {\n  const [data, setData] =\n    React.useState(getData());\n\n  React.useState(() => {\n    const setStateInterval =\n      window.setInterval(() => {\n        setData(getData());\n      }, 4000);\n\n    return () => {\n      window.clearInterval(\n        setStateInterval,\n      );\n    };\n  }, []);\n\n  return (\n    <VictoryChart\n      theme={VictoryTheme.clean}\n      domainPadding={{ x: 20 }}\n    >\n      <VictoryBar\n        animate={{ duration: 1000 }}\n        data={data}\n      />\n    </VictoryChart>\n  );\n}\n\nfunction getData() {\n  return [\n    { x: 1, y: _.random(1, 5) },\n    { x: 2, y: _.random(1, 10) },\n    { x: 3, y: _.random(2, 10) },\n    { x: 4, y: _.random(2, 10) },\n    { x: 5, y: _.random(2, 15) },\n    { x: 6, y: _.random(2, 8) },\n    { x: 7, y: _.random(2, 11) },\n  ];\n}\n\nrender(<App />);\n```\n\n## Bar Charts - Zoom & Pan\n\nBar charts support pan and zoom behavior by using the `VictoryZoomContainer` component. See the [Pan & Zoom](/docs/guides/pan-and-zoom) guide for more information.\n\n```jsx live\n<VictoryChart\n  domain={{ x: [0, 10] }}\n  theme={VictoryTheme.clean}\n  containerComponent={\n    <VictoryZoomContainer\n      zoomDimension=\"x\"\n      zoomDomain={{ x: [0, 5] }}\n      minimumZoom={{ x: 1 }}\n    />\n  }\n>\n  <VictoryBar\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n      { x: 6, y: 6 },\n      { x: 7, y: 8 },\n      { x: 8, y: 9 },\n      { x: 9, y: 10 },\n      { x: 10, y: 12 },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Bar Charts - Styles\n\nChart styling can be customized by using the theme or overriding the style prop on the component.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 20 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar\n    data={sampleData}\n    labels={({ datum }) => datum.y}\n    style={{\n      data: {\n        fill: \"#c43a31\",\n        fillOpacity: 0.4,\n        stroke: \"#c43a31\",\n        strokeWidth: 2,\n      },\n      labels: {\n        fontSize: 12,\n        fill: \"#c43a31\",\n      },\n    }}\n  />\n</VictoryChart>\n```\n\n## Bar Charts - Events\n\nEvents can be handled by passing an array of event objects to the `events` prop on the component. Each event object should specify a `target` and an `eventHandlers` object. See the [events](/docs/guides/events) guide for more information.\n\n```jsx live noInline\nfunction App() {\n  const toggleFillColor = (fill) => {\n    if (fill === \"black\") {\n      return null;\n    } else {\n      return {\n        style: {\n          fill: \"black\",\n        },\n      };\n    }\n  };\n\n  return (\n    <VictoryChart\n      domainPadding={{ x: 20 }}\n      theme={VictoryTheme.clean}\n    >\n      <VictoryBar\n        data={sampleData}\n        labels={({ datum }) => datum.y}\n        events={[\n          {\n            target: \"data\",\n            eventHandlers: {\n              onClick: () => {\n                return [\n                  {\n                    target: \"data\",\n                    mutation: (props) =>\n                      toggleFillColor(\n                        props.style\n                          ?.fill,\n                      ),\n                  },\n                ];\n              },\n            },\n          },\n        ]}\n      />\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n\n## Stacked Bar Charts\n\nBar charts can be stacked to show how different categories contribute to the total.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 40 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryStack>\n    <VictoryBar\n      data={[\n        { x: \"Sales\", y: 2 },\n        { x: \"Marketing\", y: 3 },\n        { x: \"Finance\", y: 5 },\n      ]}\n    />\n    <VictoryBar\n      data={[\n        { x: \"Sales\", y: 1 },\n        { x: \"Marketing\", y: 4 },\n        { x: \"Finance\", y: 5 },\n      ]}\n    />\n    <VictoryBar\n      data={[\n        { x: \"Sales\", y: 3 },\n        { x: \"Marketing\", y: 2 },\n        { x: \"Finance\", y: 6 },\n      ]}\n    />\n  </VictoryStack>\n</VictoryChart>\n```\n\n## Stacked Bar Charts - 100%\n\nWhile Victory does not support 100% stacked bar charts natively, you can achieve this by transforming your data.\n\n```jsx live noInline\nconst myDataset = [\n  [\n    { x: \"a\", y: 1 },\n    { x: \"b\", y: 2 },\n    { x: \"c\", y: 3 },\n    { x: \"d\", y: 2 },\n    { x: \"e\", y: 3 },\n  ],\n  [\n    { x: \"a\", y: 2 },\n    { x: \"b\", y: 3 },\n    { x: \"c\", y: 7 },\n    { x: \"d\", y: 5 },\n    { x: \"e\", y: 3 },\n  ],\n  [\n    { x: \"a\", y: 5 },\n    { x: \"b\", y: 2 },\n    { x: \"c\", y: 3 },\n    { x: \"d\", y: 4 },\n    { x: \"e\", y: 4 },\n  ],\n];\n\nfunction App() {\n  // This is an example of a function you might\n  // use to transform your data to make 100% data\n\n  function transformData(dataset) {\n    const totals = dataset[0].map(\n      (data, i) => {\n        return dataset.reduce(\n          (memo, curr) => {\n            return memo + curr[i].y;\n          },\n          0,\n        );\n      },\n    );\n    return dataset.map((data) => {\n      return data.map((datum, i) => {\n        return {\n          x: datum.x,\n          y:\n            (datum.y / totals[i]) * 100,\n        };\n      });\n    });\n  }\n\n  const dataset =\n    transformData(myDataset);\n  return (\n    <div>\n      <VictoryChart\n        domainPadding={{ x: 30, y: 20 }}\n        theme={VictoryTheme.clean}\n      >\n        <VictoryStack>\n          {dataset.map((data, i) => {\n            return (\n              <VictoryBar\n                data={data}\n                key={i}\n              />\n            );\n          })}\n        </VictoryStack>\n        <VictoryAxis\n          dependentAxis\n          tickFormat={(tick) =>\n            `${tick}%`\n          }\n        />\n        <VictoryAxis\n          tickFormat={[\n            \"a\",\n            \"b\",\n            \"c\",\n            \"d\",\n            \"e\",\n          ]}\n        />\n      </VictoryChart>\n    </div>\n  );\n}\n\nrender(<App />);\n```\n\n## Stacked Bar Charts - Grouped\n\nBar charts can be stacked and grouped to show how different subcategories contribute to the total.\n\n```jsx live noInline\nfunction App() {\n  const getBarData = () => {\n    return [1, 2, 3, 4, 5].map(() => {\n      return [\n        { x: 1, y: Math.random() },\n        { x: 2, y: Math.random() },\n        { x: 3, y: Math.random() },\n      ];\n    });\n  };\n\n  return (\n    <div>\n      <VictoryChart\n        domainPadding={{ x: 50 }}\n      >\n        <VictoryGroup\n          offset={20}\n          style={{\n            data: { width: 15 },\n          }}\n        >\n          <VictoryStack\n            colorScale={\"red\"}\n          >\n            {getBarData().map(\n              (data, index) => {\n                return (\n                  <VictoryBar\n                    key={index}\n                    data={data}\n                  />\n                );\n              },\n            )}\n          </VictoryStack>\n          <VictoryStack\n            colorScale={\"green\"}\n          >\n            {getBarData().map(\n              (data, index) => {\n                return (\n                  <VictoryBar\n                    key={index}\n                    data={data}\n                  />\n                );\n              },\n            )}\n          </VictoryStack>\n          <VictoryStack\n            colorScale={\"blue\"}\n          >\n            {getBarData().map(\n              (data, index) => {\n                return (\n                  <VictoryBar\n                    key={index}\n                    data={data}\n                  />\n                );\n              },\n            )}\n          </VictoryStack>\n        </VictoryGroup>\n      </VictoryChart>\n    </div>\n  );\n}\n\nrender(<App />);\n```\n\n## Diverging Bar Charts\n\nDiverging bar are useful for showing how different categories compare to a common baseline. By default, Victory will calculate the domain based on the data provided.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 50 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar\n    data={[\n      { x: \"rabbits\", y: 5 },\n      { x: \"cats\", y: -10 },\n      { x: \"dogs\", y: 15 },\n      { x: \"turtles\", y: -8 },\n      { x: \"snakes\", y: -2 },\n      { x: \"fish\", y: 5 },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Diverging Bar Charts - Horizontal\n\nDiverging bar are useful for showing how different categories compare to a common baseline. By default, Victory will calculate the domain based on the data provided.\n\n```jsx live\n<VictoryChart\n  horizontal\n  domainPadding={{ x: 50 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar\n    data={[\n      { x: \"rabbits\", y: 5 },\n      { x: \"cats\", y: -10 },\n      { x: \"dogs\", y: 15 },\n      { x: \"turtles\", y: -8 },\n      { x: \"snakes\", y: -2 },\n      { x: \"fish\", y: 5 },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Diverging Bar Charts - Grouped\n\nDiverging bar are useful for showing how different categories compare to a common baseline. By default, Victory will calculate the baseline based on the data provided.\n\n```jsx live noInline\nfunction App() {\n  return (\n    <VictoryChart\n      domainPadding={{ x: 50 }}\n      theme={VictoryTheme.clean}\n    >\n      <VictoryGroup\n        offset={18}\n        colorScale={\"qualitative\"}\n      >\n        {getBarData().map(\n          (data, index) => {\n            return (\n              <VictoryBar\n                key={index}\n                data={data}\n                labels={({ datum }) =>\n                  datum.y\n                }\n              />\n            );\n          },\n        )}\n      </VictoryGroup>\n    </VictoryChart>\n  );\n}\n\nfunction getBarData() {\n  return _.range(5).map(() => {\n    return [\n      {\n        x: \"rabbits\",\n        y: _.random(-5, 5),\n      },\n      {\n        x: \"cats\",\n        y: _.random(-10, 10),\n      },\n      {\n        x: \"dogs\",\n        y: _.random(-15, 15),\n      },\n    ];\n  });\n}\n\nrender(<App />);\n```\n\n## Diverging Bar Charts - Floating\n\nDiverging bar are useful for showing how different categories compare to a common baseline.\n\n```jsx live noInline\nconst dataA = [\n  { x: \"Television\", y: 38 },\n  { x: \"Smartwatch\", y: 37 },\n  { x: \"Fitness Monitor\", y: 25 },\n  { x: \"Tablet\", y: 19 },\n  { x: \"Camera\", y: 15 },\n  { x: \"Laptop\", y: 13 },\n  { x: \"Phone\", y: 12 },\n];\n\nconst dataB = dataA.map((point) => {\n  const y = Math.round(\n    point.y +\n      3 * (Math.random() - 0.75),\n  );\n  return { ...point, y };\n});\n\nconst width = 400;\nconst height = 300;\n\nfunction App() {\n  return (\n    <VictoryChart\n      horizontal\n      height={height}\n      width={width}\n      padding={{\n        top: 100,\n        bottom: 30,\n        left: 50,\n        right: 50,\n      }}\n      theme={VictoryTheme.clean}\n    >\n      <VictoryLegend\n        x={90}\n        y={20}\n        orientation=\"horizontal\"\n        gutter={20}\n        data={[\n          {\n            name: \"Ages 18-20\",\n          },\n          {\n            name: \"Ages 21-24\",\n          },\n        ]}\n      />\n      <VictoryStack\n        style={{\n          data: { width: 12 },\n          labels: { fontSize: 12 },\n        }}\n      >\n        <VictoryBar\n          data={dataA}\n          y={(data) =>\n            -Math.abs(data.y)\n          }\n          labels={({ datum }) =>\n            `${Math.abs(datum.y)}%`\n          }\n        />\n        <VictoryBar\n          data={dataB}\n          labels={({ datum }) =>\n            `${Math.abs(datum.y)}%`\n          }\n        />\n      </VictoryStack>\n\n      <VictoryAxis\n        style={{\n          axis: {\n            stroke: \"transparent\",\n          },\n          ticks: {\n            stroke: \"transparent\",\n          },\n          tickLabels: {\n            fontSize: 12,\n            fill: \"black\",\n          },\n        }}\n        /*\n          Use a custom tickLabelComponent with\n          an absolutely positioned x value to position\n          your tick labels in the center of the chart. The correct\n          y values are still provided by VictoryAxis for each tick\n        */\n        tickLabelComponent={\n          <VictoryLabel\n            x={width / 2}\n            textAnchor=\"middle\"\n          />\n        }\n        tickValues={dataA\n          .map((point) => point.x)\n          .reverse()}\n      />\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n\n## Polar Bar Charts\n\nBar charts can be rendered in polar coordinates by setting the `polar` prop to `true` and using `VictoryPolarAxis` components.\n\n```jsx live\n<VictoryChart\n  polar\n  theme={VictoryTheme.clean}\n>\n  <VictoryPolarAxis\n    dependentAxis\n    style={{ axis: { stroke: \"none\" } }}\n    tickFormat={() => null}\n  />\n  <VictoryPolarAxis />\n  <VictoryBar data={sampleData} />\n</VictoryChart>\n```\n\n## Polar Bar Charts - Stacked\n\nBar charts can be rendered in polar coordinates by setting the `polar` prop to `true` and using `VictoryPolarAxis` components.\n\n```jsx live noInline\nconst directions = {\n  0: \"E\",\n  45: \"NE\",\n  90: \"N\",\n  135: \"NW\",\n  180: \"W\",\n  225: \"SW\",\n  270: \"S\",\n  315: \"SE\",\n};\nconst orange = {\n  base: \"#2D7FF9\",\n  highlight: \"#2750AE\",\n};\nconst red = {\n  base: \"#8B46FF\",\n  highlight: \"#6B1CB0\",\n};\nconst innerRadius = 30;\n\nfunction CompassCenter(props) {\n  const { origin } = props;\n  const circleStyle = {\n    stroke: red.base,\n    strokeWidth: 2,\n    fill: orange.base,\n  };\n\n  return (\n    <g>\n      <circle\n        cx={origin.x}\n        cy={origin.y}\n        r={innerRadius}\n        style={circleStyle}\n      />\n    </g>\n  );\n}\n\nfunction CenterLabel(props) {\n  const { datum, active, color } =\n    props;\n  const text = [\n    `${directions[datum._x]}`,\n    `${Math.round(datum._y1)} mph`,\n  ];\n  const baseStyle = {\n    fill: color.highlight,\n    textAnchor: \"middle\",\n  };\n  const style = [\n    {\n      ...baseStyle,\n      fontSize: 18,\n      fontWeight: \"bold\",\n    },\n    { ...baseStyle, fontSize: 12 },\n  ];\n\n  return active ? (\n    <VictoryLabel\n      text={text}\n      style={style}\n      x={75}\n      y={75}\n      renderInPortal\n    />\n  ) : null;\n}\n\nfunction App() {\n  const [state, setState] =\n    React.useState({\n      wind: getWindData(),\n    });\n\n  return (\n    <VictoryChart\n      polar\n      animate={{\n        duration: 500,\n        onLoad: { duration: 500 },\n      }}\n      theme={VictoryTheme.clean}\n      innerRadius={innerRadius}\n      domainPadding={{ y: 10 }}\n      events={[\n        {\n          childName: \"all\",\n          target: \"data\",\n          eventHandlers: {\n            onMouseOver: () => {\n              return [\n                {\n                  target: \"labels\",\n                  mutation: () => ({\n                    active: true,\n                  }),\n                },\n                {\n                  target: \"data\",\n                  mutation: () => ({\n                    active: true,\n                  }),\n                },\n              ];\n            },\n            onMouseOut: () => {\n              return [\n                {\n                  target: \"labels\",\n                  mutation: () => ({\n                    active: false,\n                  }),\n                },\n                {\n                  target: \"data\",\n                  mutation: () => ({\n                    active: false,\n                  }),\n                },\n              ];\n            },\n          },\n        },\n      ]}\n    >\n      <VictoryPolarAxis\n        dependentAxis\n        labelPlacement=\"vertical\"\n        style={{\n          axis: { stroke: \"none\" },\n        }}\n        tickFormat={() => \"\"}\n      />\n      <VictoryPolarAxis\n        labelPlacement=\"parallel\"\n        tickValues={_.keys(\n          directions,\n        ).map((k) => +k)}\n        tickFormat={_.values(\n          directions,\n        )}\n      />\n      <VictoryStack>\n        <VictoryBar\n          style={{\n            data: {\n              fill: ({ active }) =>\n                active\n                  ? orange.highlight\n                  : orange.base,\n              width: 40,\n            },\n          }}\n          data={state.wind}\n          x=\"windBearing\"\n          y=\"windSpeed\"\n          labels={() => \"\"}\n          labelComponent={\n            <CenterLabel\n              color={orange}\n            />\n          }\n        />\n        <VictoryBar\n          style={{\n            data: {\n              fill: (d, a) =>\n                a\n                  ? red.highlight\n                  : red.base,\n              width: 40,\n            },\n          }}\n          data={state.wind}\n          x=\"windBearing\"\n          y={(d) =>\n            d.windGust - d.windSpeed\n          }\n          labels={() => \"\"}\n          labelComponent={\n            <CenterLabel color={red} />\n          }\n        />\n      </VictoryStack>\n      <CompassCenter />\n    </VictoryChart>\n  );\n}\n\nfunction getWindData() {\n  return _.keys(directions).map((d) => {\n    const speed =\n      Math.floor(_.random() * 17) + 4;\n    return {\n      windSpeed: speed,\n      windGust: speed + _.random(2, 10),\n      windBearing: +d,\n    };\n  });\n}\n\nrender(<App />);\n```\n\n## Standalone Rendering\n\nBar charts can be rendered outside a VictoryChart.\n\n```jsx live\n<VictoryBar\n  theme={VictoryTheme.clean}\n/>\n```\n\nThey can also be embeded in other SVG components by using the `standalone` prop.\n\n```jsx live\n<div style={{ padding: \"20px\" }}>\n  <svg\n    width={300}\n    height={300}\n    style={{\n      display: \"block\",\n      margin: \"0 auto\",\n    }}\n  >\n    <circle\n      cx={150}\n      cy={150}\n      r={150}\n      fill=\"#9ded91\"\n    />\n    <VictoryBar\n      standalone={false}\n      theme={VictoryTheme.clean}\n      width={300}\n      height={300}\n      padding={{ left: 10, right: 10 }}\n      data={sampleData}\n    />\n  </svg>\n</div>\n```\n"
  },
  {
    "path": "website/docs/charts/box-plot.mdx",
    "content": "---\ntitle: Box Plot\n---\n\nBox plots are used to show the distribution of a dataset. The box represents the interquartile range, the line in the middle is the median, and the whiskers represent the range of the data.\n\n## Basic\n\nSee the [full API here](/docs/api/victory-boxplot). Typically composed with [`VictoryChart`](/docs/api/victory-chart) to create full charts.\n\n```jsx live\n<VictoryChart\n  domainPadding={20}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBoxPlot\n    boxWidth={15}\n    data={[\n      { x: 1, y: [\"2\", \"3\", \"5\", \"8\"] },\n      { x: 2, y: [\"1\", \"3\", \"5\", \"8\"] },\n      { x: 3, y: [\"2\", \"5\", \"7\", \"9\"] },\n      { x: 4, y: [\"4\", \"6\", \"7\", \"9\"] },\n      { x: 5, y: [\"1\", \"2\", \"4\", \"5\"] },\n      { x: 6, y: [\"1\", \"2\", \"6\", \"8\"] },\n      { x: 7, y: [\"2\", \"4\", \"5\", \"8\"] },\n      { x: 8, y: [\"1\", \"4\", \"4\", \"7\"] },\n      { x: 9, y: [\"2\", \"5\", \"7\", \"9\"] },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Box Plot - Horizontal\n\nBar charts can be rendered horizontally by setting the `horizontal` prop to `true`. This prop can be applied to either `VictoryChart` or `VictoryBoxPlot`.\n\n```jsx live\n<VictoryChart\n  horizontal\n  domainPadding={20}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBoxPlot\n    boxWidth={10}\n    data={[\n      { x: 1, y: [\"2\", \"3\", \"5\", \"8\"] },\n      { x: 2, y: [\"1\", \"3\", \"5\", \"8\"] },\n      { x: 3, y: [\"2\", \"5\", \"7\", \"9\"] },\n      { x: 4, y: [\"4\", \"6\", \"7\", \"9\"] },\n      { x: 5, y: [\"1\", \"2\", \"4\", \"5\"] },\n      { x: 6, y: [\"1\", \"2\", \"6\", \"8\"] },\n      { x: 7, y: [\"2\", \"4\", \"5\", \"8\"] },\n      { x: 8, y: [\"1\", \"4\", \"4\", \"7\"] },\n      { x: 9, y: [\"2\", \"5\", \"7\", \"9\"] },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Box Plot - Labels\n\nBox plots can be labeled by setting the `labels` prop to `true`. By default this will show all labels. For more granular label control, use the individual `minLabels`, `maxLabels`, `medianLabels`, `q1Labels`, and `q3Labels` props.\n\n```jsx live\n<VictoryChart\n  domainPadding={20}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBoxPlot\n    labels\n    labelOrientation=\"right\"\n    boxWidth={10}\n    data={[\n      { x: 1, y: [\"2\", \"3\", \"5\", \"8\"] },\n      { x: 2, y: [\"1\", \"3\", \"5\", \"8\"] },\n      { x: 3, y: [\"2\", \"5\", \"7\", \"9\"] },\n      { x: 4, y: [\"4\", \"6\", \"7\", \"9\"] },\n      { x: 5, y: [\"1\", \"2\", \"4\", \"5\"] },\n      { x: 6, y: [\"1\", \"2\", \"6\", \"8\"] },\n    ]}\n  />\n</VictoryChart>\n```\n\nSpecific labels can be chosen by using the appropriate label prop. In this example, the `minLabels` prop is set to `true` to show only the minimum value of each box.\n\n```jsx live\n<VictoryChart\n  domainPadding={20}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBoxPlot\n    minLabels\n    boxWidth={10}\n    data={[\n      { x: 1, y: [\"2\", \"3\", \"5\", \"8\"] },\n      { x: 2, y: [\"1\", \"3\", \"5\", \"8\"] },\n      { x: 3, y: [\"2\", \"5\", \"7\", \"9\"] },\n      { x: 4, y: [\"4\", \"6\", \"7\", \"9\"] },\n      { x: 5, y: [\"1\", \"2\", \"4\", \"5\"] },\n      { x: 6, y: [\"1\", \"2\", \"6\", \"8\"] },\n      { x: 7, y: [\"2\", \"4\", \"5\", \"8\"] },\n      { x: 8, y: [\"1\", \"4\", \"4\", \"7\"] },\n      { x: 9, y: [\"2\", \"5\", \"7\", \"9\"] },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Box Plot - Animation\n\nCharts can be animated by setting the `animate` prop. See the [animations](/docs/guides/animations) guide for more information.\n\n```jsx live noInline\nfunction App() {\n  const [data, setData] =\n    React.useState(getData());\n\n  React.useState(() => {\n    const setStateInterval =\n      window.setInterval(() => {\n        setData(getData());\n      }, 4000);\n\n    return () => {\n      window.clearInterval(\n        setStateInterval,\n      );\n    };\n  }, []);\n\n  return (\n    <VictoryChart\n      theme={VictoryTheme.clean}\n      domainPadding={{ x: 20 }}\n    >\n      <VictoryBoxPlot\n        animate={{ duration: 1000 }}\n        data={data}\n        boxWidth={10}\n      />\n    </VictoryChart>\n  );\n}\n\nfunction rr(start, end, count) {\n  return _.range(count).map(() =>\n    _.random(start, end),\n  );\n}\n\nfunction getData() {\n  return [\n    { x: 1, y: rr(1, 10, 4) },\n    { x: 2, y: rr(1, 10, 4) },\n    { x: 3, y: rr(1, 10, 4) },\n    { x: 4, y: rr(1, 10, 4) },\n    { x: 5, y: rr(1, 10, 4) },\n    { x: 6, y: rr(1, 10, 4) },\n    { x: 7, y: rr(1, 10, 4) },\n    { x: 8, y: rr(1, 10, 4) },\n    { x: 9, y: rr(1, 10, 4) },\n  ];\n}\n\nrender(<App />);\n```\n\n## Box Plot - Styles\n\nChart styling can be customized by using the theme or overriding the style prop on the component.\n\n```jsx live\n<VictoryChart\n  domainPadding={20}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBoxPlot\n    labels\n    labelOrientation=\"right\"\n    boxWidth={10}\n    data={[\n      { x: 1, y: [\"2\", \"3\", \"5\", \"8\"] },\n      { x: 2, y: [\"1\", \"3\", \"5\", \"8\"] },\n      { x: 3, y: [\"2\", \"5\", \"7\", \"9\"] },\n      { x: 4, y: [\"4\", \"6\", \"7\", \"9\"] },\n      { x: 5, y: [\"1\", \"2\", \"4\", \"5\"] },\n      { x: 6, y: [\"1\", \"2\", \"6\", \"8\"] },\n    ]}\n    style={{\n      min: { stroke: \"tomato\" },\n      max: { stroke: \"orange\" },\n      q1: { fill: \"tomato\" },\n      q3: { fill: \"orange\" },\n      median: {\n        stroke: \"white\",\n        strokeWidth: 2,\n      },\n      minLabels: { fill: \"tomato\" },\n      maxLabels: { fill: \"orange\" },\n    }}\n  />\n</VictoryChart>\n```\n\n## Box Plot - Events\n\nEvents can be handled by passing an array of event objects to the `events` prop on the component. Each event object should specify a `target` and an `eventHandlers` object. See the [events](/docs/guides/events) guide for more information.\n\n```jsx live\n<VictoryChart\n  domainPadding={20}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBoxPlot\n    labels\n    labelOrientation=\"right\"\n    boxWidth={10}\n    data={[\n      { x: 1, y: [\"2\", \"3\", \"5\", \"8\"] },\n      { x: 2, y: [\"1\", \"3\", \"5\", \"8\"] },\n      { x: 3, y: [\"2\", \"5\", \"7\", \"9\"] },\n      { x: 4, y: [\"4\", \"6\", \"7\", \"9\"] },\n      { x: 5, y: [\"1\", \"2\", \"4\", \"5\"] },\n      { x: 6, y: [\"1\", \"2\", \"6\", \"8\"] },\n    ]}\n    events={[\n      {\n        target: \"q1\",\n        eventHandlers: {\n          onClick: () => {\n            return [\n              {\n                target: \"q1Labels\",\n                mutation: () => ({\n                  text: \"LABEL!\",\n                }),\n              },\n            ];\n          },\n        },\n      },\n      {\n        target: \"q3\",\n        eventHandlers: {\n          onClick: () => {\n            return [\n              {\n                mutation: (props) => {\n                  return {\n                    style:\n                      Object.assign(\n                        props.style,\n                        {\n                          fill: \"tomato\",\n                        },\n                      ),\n                  };\n                },\n              },\n            ];\n          },\n        },\n      },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Box Plot - Tooltips\n\nTooltips are not displayed by default on VictoryBoxPlot; to enable tooltips, use a custom events prop to handle interactions.\n\n```jsx live noInline\nfunction App() {\n  const activate =\n    (label: string) => () =>\n      [\n        {\n          target: label,\n          mutation: () => ({\n            active: true,\n          }),\n        },\n      ];\n\n  const deactivate =\n    (label: string) => () =>\n      [\n        {\n          target: label,\n          mutation: () => ({\n            active: undefined,\n          }),\n        },\n      ];\n\n  const dataTypes = [\n    \"min\",\n    \"max\",\n    \"q1\",\n    \"q3\",\n    \"median\",\n  ];\n\n  const events = dataTypes.map(\n    (dataType) => ({\n      target: dataType,\n      eventHandlers: {\n        onMouseOver: activate(\n          `${dataType}Labels`,\n        ),\n        onFocus: activate(\n          `${dataType}Labels`,\n        ),\n        onTouchStart: activate(\n          `${dataType}Labels`,\n        ),\n        onMouseOut: deactivate(\n          `${dataType}Labels`,\n        ),\n        onBlur: deactivate(\n          `${dataType}Labels`,\n        ),\n        onTouchEnd: deactivate(\n          `${dataType}Labels`,\n        ),\n      },\n    }),\n  );\n\n  return (\n    <VictoryBoxPlot\n      minLabels\n      maxLabels\n      q1Labels\n      q3Labels\n      medianLabels\n      events={events}\n      minLabelComponent={\n        <VictoryTooltip />\n      }\n      maxLabelComponent={\n        <VictoryTooltip />\n      }\n      q1LabelComponent={\n        <VictoryTooltip />\n      }\n      q3LabelComponent={\n        <VictoryTooltip />\n      }\n      medianLabelComponent={\n        <VictoryTooltip />\n      }\n      data={[\n        { x: \"red\", y: [5, 10, 9, 2] },\n        { x: \"blue\", y: [1, 15, 6, 8] },\n        { x: \"green\", y: [3, 5, 6, 9] },\n        {\n          x: \"yellow\",\n          y: [5, 20, 8, 12],\n        },\n        {\n          x: \"white\",\n          y: [2, 11, 12, 13],\n        },\n      ]}\n    />\n  );\n}\n\nrender(<App />);\n```\n\n## Standalone Rendering\n\nBox Plot charts can be rendered outside a VictoryChart.\n\n```jsx live\n<VictoryBoxPlot\n  boxWidth={15}\n  data={[\n    { x: 1, y: [\"2\", \"3\", \"5\", \"8\"] },\n    { x: 2, y: [\"1\", \"3\", \"5\", \"8\"] },\n    { x: 3, y: [\"2\", \"5\", \"7\", \"9\"] },\n    { x: 4, y: [\"4\", \"6\", \"7\", \"9\"] },\n    { x: 5, y: [\"1\", \"2\", \"4\", \"5\"] },\n    { x: 6, y: [\"1\", \"2\", \"6\", \"8\"] },\n    { x: 7, y: [\"2\", \"4\", \"5\", \"8\"] },\n    { x: 8, y: [\"1\", \"4\", \"4\", \"7\"] },\n    { x: 9, y: [\"2\", \"5\", \"7\", \"9\"] },\n  ]}\n  theme={VictoryTheme.clean}\n/>\n```\n\nThey can also be embeded in other SVG components by using the `standalone` prop.\n\n```jsx live\n<svg\n  width={300}\n  height={300}\n  style={{\n    display: \"block\",\n    margin: \"0 auto\",\n  }}\n>\n  <circle\n    cx={150}\n    cy={150}\n    r={150}\n    fill=\"#9ded91\"\n  />\n  <VictoryBoxPlot\n    standalone={false}\n    theme={VictoryTheme.clean}\n    width={300}\n    height={300}\n    padding={{ left: 10, right: 10 }}\n    data={[\n      { x: 1, y: [\"2\", \"3\", \"5\", \"8\"] },\n      { x: 2, y: [\"1\", \"3\", \"5\", \"8\"] },\n      { x: 3, y: [\"2\", \"5\", \"7\", \"9\"] },\n      { x: 4, y: [\"4\", \"6\", \"7\", \"9\"] },\n      { x: 5, y: [\"1\", \"2\", \"4\", \"5\"] },\n      { x: 6, y: [\"1\", \"2\", \"6\", \"8\"] },\n      { x: 7, y: [\"2\", \"4\", \"5\", \"8\"] },\n      { x: 8, y: [\"1\", \"4\", \"4\", \"7\"] },\n      { x: 9, y: [\"2\", \"5\", \"7\", \"9\"] },\n    ]}\n  />\n</svg>\n```\n"
  },
  {
    "path": "website/docs/charts/candlestick.mdx",
    "content": "---\ntitle: Candlestick\n---\n\nCandlesticks are used to visualize the movement of data over a time period by plotting the open, close, high, and low values of a dataset.\n\n## Basic\n\nSee the [full API here](/docs/api/victory-candlestick). Typically composed with [`VictoryChart`](/docs/api/victory-chart) to create full charts.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 25 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryCandlestick\n    data={[\n      {\n        x: \"3/1/23\",\n        open: 5,\n        close: 10,\n        high: 15,\n        low: 0,\n      },\n      {\n        x: \"3/2/23\",\n        open: 10,\n        close: 15,\n        high: 20,\n        low: 5,\n      },\n      {\n        x: \"3/3/23\",\n        open: 15,\n        close: 20,\n        high: 22,\n        low: 10,\n      },\n      {\n        x: \"3/4/23\",\n        open: 20,\n        close: 10,\n        high: 25,\n        low: 7,\n      },\n      {\n        x: \"3/5/23\",\n        open: 10,\n        close: 8,\n        high: 15,\n        low: 5,\n      },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Candlestick - Horizontal\n\nCandlestick charts can be rendered horizontally by setting the `horizontal` prop to `true`. This prop can be applied to either `VictoryChart` or `VictoryBoxPlot`.\n\n```jsx live\n<VictoryChart\n  horizontal\n  domainPadding={{ x: 25 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryCandlestick\n    data={[\n      {\n        x: \"3/1/23\",\n        open: 5,\n        close: 10,\n        high: 15,\n        low: 0,\n      },\n      {\n        x: \"3/2/23\",\n        open: 10,\n        close: 15,\n        high: 20,\n        low: 5,\n      },\n      {\n        x: \"3/3/23\",\n        open: 15,\n        close: 20,\n        high: 22,\n        low: 10,\n      },\n      {\n        x: \"3/4/23\",\n        open: 20,\n        close: 10,\n        high: 25,\n        low: 7,\n      },\n      {\n        x: \"3/5/23\",\n        open: 10,\n        close: 8,\n        high: 15,\n        low: 5,\n      },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Candlestick - Labels\n\nCandlestick charts can be labeled by setting the `labels` prop to `true`. By default this will show all labels.\n\nIt's also possible to control each label individually by using the specific label properties defined in the [VictoryCandlestick](/docs/api/victory-candlestick) API.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 25 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryCandlestick\n    labels\n    data={[\n      {\n        x: \"3/1/23\",\n        open: 5,\n        close: 10,\n        high: 15,\n        low: 0,\n      },\n      {\n        x: \"3/2/23\",\n        open: 10,\n        close: 15,\n        high: 20,\n        low: 5,\n      },\n      {\n        x: \"3/3/23\",\n        open: 15,\n        close: 20,\n        high: 22,\n        low: 10,\n      },\n      {\n        x: \"3/4/23\",\n        open: 20,\n        close: 10,\n        high: 25,\n        low: 7,\n      },\n      {\n        x: \"3/5/23\",\n        open: 10,\n        close: 8,\n        high: 15,\n        low: 5,\n      },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Candlestick - Label Functions\n\nThe labels prop can also accept a function to customize the candlestick label. When using a function, the other labels will need to be set using their specific props in the [VictoryCandlestick](/docs/api/victory-candlestick) API.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 25 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryCandlestick\n    labels={({ datum }) => datum.x}\n    openLabels={({ datum }) =>\n      `->${datum.open}`\n    }\n    data={[\n      {\n        x: \"3/1/23\",\n        open: 5,\n        close: 10,\n        high: 15,\n        low: 0,\n      },\n      {\n        x: \"3/2/23\",\n        open: 10,\n        close: 15,\n        high: 20,\n        low: 5,\n      },\n      {\n        x: \"3/3/23\",\n        open: 15,\n        close: 20,\n        high: 22,\n        low: 10,\n      },\n      {\n        x: \"3/4/23\",\n        open: 20,\n        close: 10,\n        high: 25,\n        low: 7,\n      },\n      {\n        x: \"3/5/23\",\n        open: 15,\n        close: 8,\n        high: 15,\n        low: 5,\n      },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Candlestick - Label Orientation\n\nThe `labelOrientation` prop can be used to control the orientation of the labels.\n\n```jsx live\n<VictoryCandlestick\n  theme={VictoryTheme.clean}\n  labels\n  labelOrientation={{\n    low: \"bottom\",\n    high: \"top\",\n  }}\n  data={[\n    {\n      x: \"3/1/23\",\n      open: 5,\n      close: 10,\n      high: 15,\n      low: 0,\n    },\n    {\n      x: \"3/2/23\",\n      open: 10,\n      close: 15,\n      high: 20,\n      low: 5,\n    },\n    {\n      x: \"3/3/23\",\n      open: 15,\n      close: 20,\n      high: 22,\n      low: 10,\n    },\n    {\n      x: \"3/4/23\",\n      open: 20,\n      close: 10,\n      high: 25,\n      low: 7,\n    },\n    {\n      x: \"3/5/23\",\n      open: 10,\n      close: 8,\n      high: 15,\n      low: 5,\n    },\n  ]}\n/>\n```\n\n## Candlestick - Time Scales\n\nCandlestick charts can leverage d3-scale to handle time scales. The `x` prop can be set to a Date Object.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 25 }}\n  theme={VictoryTheme.clean}\n  scale={{ x: \"time\" }}\n>\n  <VictoryAxis\n    tickFormat={(t) =>\n      `${t.getDate()}/${t.getMonth()}`\n    }\n  />\n  <VictoryAxis dependentAxis />\n  <VictoryCandlestick\n    data={[\n      {\n        x: new Date(2016, 6, 1),\n        open: 5,\n        close: 10,\n        high: 15,\n        low: 0,\n      },\n      {\n        x: new Date(2016, 6, 2),\n        open: 10,\n        close: 15,\n        high: 20,\n        low: 5,\n      },\n      {\n        x: new Date(2016, 6, 3),\n        open: 15,\n        close: 20,\n        high: 22,\n        low: 10,\n      },\n      {\n        x: new Date(2016, 6, 4),\n        open: 20,\n        close: 10,\n        high: 25,\n        low: 7,\n      },\n      {\n        x: new Date(2016, 6, 5),\n        open: 10,\n        close: 8,\n        high: 15,\n        low: 5,\n      },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Candlestick - Animation\n\nCandlestick charts can be animated with the `animate` prop.\n\n```jsx live noInline\nfunction App() {\n  const [data, setData] =\n    React.useState(getData());\n\n  React.useState(() => {\n    const setStateInterval =\n      window.setInterval(() => {\n        setData(getData());\n      }, 4000);\n\n    return () => {\n      window.clearInterval(\n        setStateInterval,\n      );\n    };\n  }, []);\n\n  return (\n    <VictoryChart\n      domainPadding={{ x: 25 }}\n      theme={VictoryTheme.clean}\n    >\n      <VictoryCandlestick\n        animate={{ duration: 1000 }}\n        data={data}\n      />\n    </VictoryChart>\n  );\n}\n\nfunction getData() {\n  return _.range(5).map((i) => {\n    return {\n      x: `3/${i + 1}/23`,\n      open: _.random(5, 10),\n      close: _.random(10, 20),\n      high: _.random(20, 25),\n      low: _.random(1, 5),\n    };\n  });\n}\n\nrender(<App />);\n```\n\n## Candlestick - Styles\n\nChart styling can be customized by using the theme or overriding the style prop on the component.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 25 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryCandlestick\n    labels={() => \"labels\"}\n    closeLabels={() => \"close\"}\n    highLabels={() => \"high\"}\n    lowLabels={() => \"low\"}\n    openLabels={() => \"open\"}\n    data={[\n      {\n        x: \"3/1/23\",\n        open: 5,\n        close: 10,\n        high: 15,\n        low: 0,\n      },\n      {\n        x: \"3/2/23\",\n        open: 10,\n        close: 15,\n        high: 20,\n        low: 5,\n      },\n      {\n        x: \"3/3/23\",\n        open: 15,\n        close: 20,\n        high: 22,\n        low: 10,\n      },\n      {\n        x: \"3/4/23\",\n        open: 20,\n        close: 10,\n        high: 25,\n        low: 7,\n      },\n      {\n        x: \"3/5/23\",\n        open: 10,\n        close: 8,\n        high: 15,\n        low: 5,\n      },\n    ]}\n    style={{\n      data: {\n        fill: \"#c43a31\",\n        fillOpacity: 0.7,\n        stroke: \"#c43a31\",\n        strokeWidth: 3,\n      },\n      labels: {\n        fill: \"tomato\",\n        padding: 2,\n      },\n      closeLabels: {\n        fill: \"orange\",\n        padding: 2,\n      },\n      highLabels: {\n        fill: \"blue\",\n        padding: 2,\n      },\n      lowLabels: {\n        fill: \"teal\",\n        padding: 2,\n      },\n      openLabels: {\n        fill: \"green\",\n        padding: 2,\n      },\n    }}\n  />\n</VictoryChart>\n```\n\n## Candlestick - Events\n\nEvents can be handled by passing an array of event objects to the `events` prop on the component. Each event object should specify a `target` and an `eventHandlers` object. See the [events](/docs/guides/events) guide for more information.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 25 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryCandlestick\n    events={[\n      {\n        target: \"data\",\n        eventHandlers: {\n          onClick: () => {\n            return [\n              {\n                target: \"data\",\n                mutation: (props) => {\n                  const fill =\n                    props.style &&\n                    props.style.fill;\n                  return fill ===\n                    \"#c43a31\"\n                    ? null\n                    : {\n                        style: {\n                          fill: \"#c43a31\",\n                        },\n                      };\n                },\n              },\n            ];\n          },\n        },\n      },\n    ]}\n    data={sampleDataDates}\n  />\n</VictoryChart>\n```\n\n## Candlestick - Brush and Zoom\n\nCandlestick charts support zoom and pan behavior by using the `VictoryZoomContainer` and `VictoryBrushContainer` components. See the [Pan & Zoom](/docs/guides/pan-and-zoom) and [Data Selection](/docs/guides/data-selection) guides for more information.\n\n```jsx live noInline\nfunction App() {\n  const sampleData = [\n    {\n      x: 5,\n      open: 5,\n      close: 10,\n      high: 15,\n      low: 0,\n    },\n    {\n      x: 10,\n      open: 10,\n      close: 15,\n      high: 20,\n      low: 5,\n    },\n    {\n      x: 15,\n      open: 15,\n      close: 20,\n      high: 22,\n      low: 10,\n    },\n    {\n      x: 20,\n      open: 20,\n      close: 10,\n      high: 25,\n      low: 7,\n    },\n    {\n      x: 25,\n      open: 10,\n      close: 8,\n      high: 15,\n      low: 5,\n    },\n  ];\n  const [state, setState] = React.useState({});\n\n  const handleZoom = (domain) => {\n    setState({ selectedDomain: domain });\n  };\n\n  const handleBrush = (domain) => {\n    setState({ zoomDomain: domain });\n  };\n\n  return (\n    <div>\n      <VictoryChart\n        theme={VictoryTheme.clean}\n        domainPadding={{ x: 25 }}\n        containerComponent={\n          <VictoryZoomContainer\n            zoomDimension=\"x\"\n            zoomDomain={state.zoomDomain}\n            onZoomDomainChange={handleZoom}\n          />\n        }\n      >\n        <VictoryCandlestick\n          data={sampleData}\n        />\n      </VictoryChart>\n\n      <VictoryChart\n        height={170}\n        theme={VictoryTheme.clean}\n        domainPadding={{ x: 25 }}\n        padding={{top: 0, left: 50, right: 50, bottom: 30}}\n        containerComponent={\n          <VictoryBrushContainer\n            brushDimension=\"x\"\n            brushDomain={state.selectedDomain}\n            onBrushDomainChange={handleBrush}\n          />\n        }\n      >\n        <VictoryAxis />\n        <VictoryCandlestick data={sampleData} />\n      </VictoryChart>\n    </div>\n  )\n}\n\nrender(<App />);\n```\n\n## Standalone Rendering\n\nBox Plot charts can be rendered outside a VictoryChart.\n\n```jsx live\n<VictoryCandlestick\n  data={[\n    {\n      x: \"3/1/23\",\n      open: 5,\n      close: 10,\n      high: 15,\n      low: 0,\n    },\n    {\n      x: \"3/2/23\",\n      open: 10,\n      close: 15,\n      high: 20,\n      low: 5,\n    },\n    {\n      x: \"3/3/23\",\n      open: 15,\n      close: 20,\n      high: 22,\n      low: 10,\n    },\n    {\n      x: \"3/4/23\",\n      open: 20,\n      close: 10,\n      high: 25,\n      low: 7,\n    },\n    {\n      x: \"3/5/23\",\n      open: 10,\n      close: 8,\n      high: 15,\n      low: 5,\n    },\n  ]}\n  theme={VictoryTheme.clean}\n/>\n```\n\nThey can also be embeded in other SVG components by using the `standalone` prop.\n\n```jsx live\n<svg\n  width={300}\n  height={300}\n  style={{\n    display: \"block\",\n    margin: \"0 auto\",\n  }}\n>\n  <circle\n    cx={150}\n    cy={150}\n    r={150}\n    fill=\"#9ded91\"\n  />\n  <VictoryCandlestick\n    standalone={false}\n    width={300}\n    height={300}\n    padding={{ left: 10, right: 10 }}\n    data={[\n      {\n        x: \"3/1/23\",\n        open: 5,\n        close: 10,\n        high: 15,\n        low: 0,\n      },\n      {\n        x: \"3/2/23\",\n        open: 10,\n        close: 15,\n        high: 20,\n        low: 5,\n      },\n      {\n        x: \"3/3/23\",\n        open: 15,\n        close: 20,\n        high: 22,\n        low: 10,\n      },\n      {\n        x: \"3/4/23\",\n        open: 20,\n        close: 10,\n        high: 25,\n        low: 7,\n      },\n      {\n        x: \"3/5/23\",\n        open: 10,\n        close: 8,\n        high: 15,\n        low: 5,\n      },\n    ]}\n    theme={VictoryTheme.clean}\n  />\n</svg>\n```\n"
  },
  {
    "path": "website/docs/charts/error-bar.mdx",
    "content": "---\ntitle: Error Bar\n---\n\nError Bars are used to represent the variability or uncertainty in a set of data and are often used with bar, line, and scatter plots. Error bars can be used to show standard deviation, standard error, confidence intervals, or any other statistical measure.\n\n## Basics\n\nSee the [full API here](/docs/api/victory-error-bar). Typically composed with [`VictoryChart`](/docs/api/victory-chart) to create full charts.\n\n```jsx live\n<VictoryChart\n  domainPadding={15}\n  theme={VictoryTheme.clean}\n>\n  <VictoryErrorBar\n    data={[\n      {\n        x: 15,\n        y: 35,\n        errorX: 1,\n        errorY: 3,\n      },\n      {\n        x: 20,\n        y: 42,\n        errorX: 3,\n        errorY: 2,\n      },\n      {\n        x: 25,\n        y: 30,\n        errorX: 5,\n        errorY: 5,\n      },\n      {\n        x: 30,\n        y: 35,\n        errorX: 5,\n        errorY: 3,\n      },\n      {\n        x: 35,\n        y: 22,\n        errorX: 8,\n        errorY: 2,\n      },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Error Bars - Horizontal\n\nError Bars can be rendered horizontally by setting the `horizontal` prop to `true`. This prop can be applied to either `VictoryChart` or `VictoryBoxPlot`.\n\n```jsx live\n<VictoryChart\n  horizontal\n  domainPadding={15}\n  theme={VictoryTheme.clean}\n>\n  <VictoryErrorBar\n    data={[\n      {\n        x: 15,\n        y: 35,\n        errorX: 1,\n        errorY: 3,\n      },\n      {\n        x: 20,\n        y: 42,\n        errorX: 3,\n        errorY: 2,\n      },\n      {\n        x: 25,\n        y: 30,\n        errorX: 5,\n        errorY: 5,\n      },\n      {\n        x: 30,\n        y: 35,\n        errorX: 5,\n        errorY: 3,\n      },\n      {\n        x: 35,\n        y: 22,\n        errorX: 8,\n        errorY: 2,\n      },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Error Bars - Error Formats\n\nError bars can be customized by providing functions to the `errorX` and `errorY` props. These functions should return the error value for each data point.\n\n```jsx live\n<VictoryChart\n  domainPadding={15}\n  theme={VictoryTheme.clean}\n>\n  <VictoryErrorBar\n    data={[\n      { x: 15, y: 350, error: 0.2 },\n      { x: 20, y: 420, error: 0.05 },\n      { x: 25, y: 300, error: 0.1 },\n      { x: 30, y: 350, error: 0.2 },\n      { x: 35, y: 220, error: 0.15 },\n    ]}\n    errorX={(datum) =>\n      datum.error * datum.x\n    }\n    errorY={(datum) =>\n      datum.error * datum.y\n    }\n  />\n</VictoryChart>\n```\n\n## Error Bars - Labels\n\nError Bars can be labeled by setting the `labels` prop to a function that returns a string.\n\n```jsx live\n<VictoryChart\n  domainPadding={15}\n  theme={VictoryTheme.clean}\n>\n  <VictoryErrorBar\n    labels={({ datum }) => datum.y}\n    data={[\n      { x: 15, y: 350, error: 0.2 },\n      { x: 20, y: 420, error: 0.05 },\n      { x: 25, y: 300, error: 0.1 },\n      { x: 30, y: 350, error: 0.2 },\n      { x: 35, y: 220, error: 0.15 },\n    ]}\n    errorX={(datum) =>\n      datum.error * datum.x\n    }\n    errorY={(datum) =>\n      datum.error * datum.y\n    }\n  />\n</VictoryChart>\n```\n\n## Error Bars - Tooltips\n\nTooltips can be added by using a [`VictoryTooltip`](/docs/api/victory-tooltip) component as the `labelComponent`.\n\n```jsx live\n<VictoryChart\n  domainPadding={15}\n  theme={VictoryTheme.clean}\n>\n  <VictoryErrorBar\n    labels={({ datum }) => datum.y}\n    data={[\n      { x: 15, y: 350, error: 0.2 },\n      { x: 20, y: 420, error: 0.05 },\n      { x: 25, y: 300, error: 0.1 },\n      { x: 30, y: 350, error: 0.2 },\n      { x: 35, y: 220, error: 0.15 },\n    ]}\n    errorX={(datum) =>\n      datum.error * datum.x\n    }\n    errorY={(datum) =>\n      datum.error * datum.y\n    }\n    labelComponent={<VictoryTooltip />}\n  />\n</VictoryChart>\n```\n\n## Error Bars - Combination\n\nError Bars can be combined with other Victory components to create more complex visualizations.\n\n```jsx live noInline\nconst data = [\n  {\n    x: 10,\n    y1: 250,\n    y2: 300,\n    ey1: 0.1,\n    ey2: 0.1,\n  },\n  {\n    x: 15,\n    y1: 350,\n    y2: 500,\n    ey1: 0.1,\n    ey2: 0.08,\n  },\n  {\n    x: 20,\n    y1: 420,\n    y2: 640,\n    ey1: 0.05,\n    ey2: 0.1,\n  },\n  {\n    x: 25,\n    y1: 300,\n    y2: 450,\n    ey1: 0.1,\n    ey2: 0.1,\n  },\n  {\n    x: 30,\n    y1: 350,\n    y2: 500,\n    ey1: 0.1,\n    ey2: 0.1,\n  },\n  {\n    x: 35,\n    y1: 220,\n    y2: 350,\n    ey1: 0.15,\n    ey2: 0.05,\n  },\n  {\n    x: 40,\n    y1: 250,\n    y2: 290,\n    ey1: 0.1,\n    ey2: 0.1,\n  },\n];\n\nconst segments = [\"y1\", \"y2\"];\nconst colors = {\n  y1: VictoryTheme.clean.palette.qualitative[1],\n  y2: VictoryTheme.clean.palette.qualitative[4],\n};\n\nfunction App() {\n  return (\n    <VictoryChart\n      theme={VictoryTheme.clean}\n    >\n      {segments.map((y) => (\n        <VictoryGroup>\n          <VictoryLine\n            data={data}\n            y={y}\n            style={{\n              data: {\n                stroke: colors[y],\n              },\n            }}\n            interpolation=\"natural\"\n          />\n\n          <VictoryScatter\n            data={data}\n            y={y}\n            style={{\n              data: {\n                fill: colors[y],\n              },\n            }}\n          />\n\n          <VictoryErrorBar\n            data={data}\n            y={y}\n            errorY={(datum) =>\n              datum[y] * datum[`e${y}`]\n            }\n            style={{\n              data: {\n                stroke: colors[y],\n              },\n            }}\n          />\n        </VictoryGroup>\n      ))}\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n\n## Error Bars - Styles\n\nChart styling can be customized by using the theme or overriding the style prop on the component.\n\n```jsx live\n<VictoryChart\n  domainPadding={15}\n  theme={VictoryTheme.clean}\n>\n  <VictoryErrorBar\n    labels={({ datum }) => datum.y}\n    data={[\n      { x: 15, y: 350, error: 0.2 },\n      { x: 20, y: 420, error: 0.05 },\n      { x: 25, y: 300, error: 0.1 },\n      { x: 30, y: 350, error: 0.2 },\n      { x: 35, y: 220, error: 0.15 },\n    ]}\n    errorX={(datum) =>\n      datum.error * datum.x\n    }\n    errorY={(datum) =>\n      datum.error * datum.y\n    }\n    style={{\n      data: {\n        stroke: \"#c43a31\",\n        strokeWidth: 5,\n      },\n      labels: {\n        fontSize: 15,\n        fill: \"#c43a31\",\n      },\n    }}\n  />\n</VictoryChart>\n```\n\n## Error Bars - Events\n\nEvents can be handled by passing an array of event objects to the `events` prop on the component. Each event object should specify a `target` and an `eventHandlers` object. See the [events](/docs/guides/events) guide for more information.\n\n```jsx live\n<VictoryChart\n  domainPadding={15}\n  theme={VictoryTheme.clean}\n>\n  <VictoryErrorBar\n    labels={({ datum }) => datum.y}\n    data={[\n      { x: 15, y: 350, error: 0.2 },\n      { x: 20, y: 420, error: 0.05 },\n      { x: 25, y: 300, error: 0.1 },\n      { x: 30, y: 350, error: 0.2 },\n      { x: 35, y: 220, error: 0.15 },\n    ]}\n    errorX={(datum) =>\n      datum.error * datum.x\n    }\n    errorY={(datum) =>\n      datum.error * datum.y\n    }\n    events={[\n      {\n        target: \"data\",\n        eventHandlers: {\n          onClick: () => {\n            return [\n              {\n                target: \"data\",\n                mutation: (props) => {\n                  const stroke =\n                    props.style &&\n                    props.style.stroke;\n                  return stroke ===\n                    \"#c43a31\"\n                    ? null\n                    : {\n                        style: {\n                          stroke:\n                            \"#c43a31\",\n                          strokeWidth: 7,\n                        },\n                      };\n                },\n              },\n            ];\n          },\n        },\n      },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Standalone Rendering\n\nError Bars can be rendered outside a VictoryChart.\n\n```jsx live\n<VictoryErrorBar\n  theme={VictoryTheme.clean}\n  data={[\n    { x: 15, y: 350, error: 0.2 },\n    { x: 20, y: 420, error: 0.05 },\n    { x: 25, y: 300, error: 0.1 },\n    { x: 30, y: 350, error: 0.2 },\n    { x: 35, y: 220, error: 0.15 },\n  ]}\n  errorX={(datum) =>\n    datum.error * datum.x\n  }\n  errorY={(datum) =>\n    datum.error * datum.y\n  }\n/>\n```\n\nThey can also be embeded in other SVG components by using the `standalone` prop.\n\n```jsx live\n<svg\n  width={300}\n  height={300}\n  style={{\n    display: \"block\",\n    margin: \"0 auto\",\n  }}\n>\n  <circle\n    cx={150}\n    cy={150}\n    r={150}\n    fill=\"#9ded91\"\n  />\n  <VictoryErrorBar\n    standalone={false}\n    theme={VictoryTheme.clean}\n    width={300}\n    height={300}\n    padding={{ left: 10, right: 10 }}\n    data={[\n      { x: 15, y: 350, error: 0.2 },\n      { x: 20, y: 420, error: 0.05 },\n      { x: 25, y: 300, error: 0.1 },\n      { x: 30, y: 350, error: 0.2 },\n      { x: 35, y: 220, error: 0.15 },\n    ]}\n    errorX={(datum) =>\n      datum.error * datum.x\n    }\n    errorY={(datum) =>\n      datum.error * datum.y\n    }\n  />\n</svg>\n```\n"
  },
  {
    "path": "website/docs/charts/histogram.mdx",
    "content": "---\ntitle: Histogram\n---\n\nRenders a dataset as series of bars representing \"bins\", allowing the ability to view distribution of the data. The data passed in will be \"binned\" according to the `bin` prop that is provided (if any), allowing for flexibility in how these bins are determined.\n\n:::info\nHistograms are intended to be used with quantitative data. Please use [Bar Charts](/docs/charts/bar) for qualitative or categorical data.\n:::\n\n## Basic\n\nSee the [full API here](/docs/api/victory-histogram). Typically composed with [`VictoryChart`](/docs/api/victory-chart) to create full charts.\n\n```jsx live\n<VictoryChart\n  domainPadding={20}\n  theme={VictoryTheme.clean}\n>\n  <VictoryHistogram\n    data={sampleHistogramData}\n  />\n</VictoryChart>\n```\n\n## Histogram - Date Bins\n\nHistograms can be used to visualize the distribution of data over time. `VictoryHistogram` will automatically bin data by date if the `x` prop is a date. Internally it uses `d3` to bin the data, so the behaviour reflects that of the [`d3.bin`](https://observablehq.com/@d3/d3-bin) function.\n\n```jsx live\n<VictoryChart\n  domainPadding={20}\n  theme={VictoryTheme.clean}\n>\n  <VictoryHistogram\n    data={sampleHistogramDateData}\n  />\n</VictoryChart>\n```\n\n## Histogram - Labels\n\nAdd labels to charts by setting the `labels` prop to the name of a property in the dataset, or a function that returns the label value. You can customize the display of the labels by using the [`labelComponent`](/docs/api/victory-histogram) prop.\n\n```jsx live\n<VictoryChart\n  domainPadding={20}\n  theme={VictoryTheme.clean}\n>\n  <VictoryHistogram\n    data={sampleHistogramData}\n    labels={({ datum }) =>\n      `Bin count:\\n ${datum.y}`\n    }\n  />\n</VictoryChart>\n```\n\n## Histogram - Tooltips\n\nTooltips can be added by using a [`VictoryTooltip`](/docs/api/victory-tooltip) component as the `labelComponent`.\n\n```jsx live\n<VictoryChart\n  domainPadding={20}\n  theme={VictoryTheme.clean}\n>\n  <VictoryHistogram\n    data={sampleHistogramData}\n    labels={({ datum }) =>\n      `Bin count:\\n ${datum.y}`\n    }\n    labelComponent={<VictoryTooltip />}\n  />\n</VictoryChart>\n```\n\n## Histogram - Horizontal\n\nHistograms can be rendered horizontally by setting the `horizontal` prop to `true`.\n\n```jsx live\n<VictoryChart\n  domainPadding={20}\n  theme={VictoryTheme.clean}\n>\n  <VictoryHistogram\n    horizontal\n    data={sampleHistogramData}\n  />\n</VictoryChart>\n```\n\n## Histogram - Combination\n\nHistograms can be composed with other Victory components to create more complex visualizations.\n\n```jsx live\n<VictoryChart\n  domainPadding={20}\n  theme={VictoryTheme.clean}\n>\n  <VictoryGroup\n    data={[\n      { x: 0, y: 0 },\n      { x: 1, y: 1 },\n      { x: 2, y: 3 },\n      { x: 3, y: 2 },\n      { x: 4, y: 5 },\n      { x: 5, y: 5 },\n      { x: 6, y: 4 },\n      { x: 7, y: 8 },\n      { x: 8, y: 6 },\n      { x: 9, y: 3 },\n      { x: 10, y: 7 },\n    ]}\n  >\n    <VictoryLine />\n    <VictoryScatter />\n  </VictoryGroup>\n  <VictoryHistogram\n    data={sampleHistogramData}\n  />\n</VictoryChart>\n```\n\n## Histogram - Stacked\n\nHistograms can be stacked to visualize the distribution of numerical data across different categories.\n\n```jsx live noInline\nconst startDate = new Date(\n  \"2020-01-01T00:00:00.000Z\",\n);\nconst endDate = new Date(\n  \"2020-12-31T11:59:59.000Z\",\n);\nconst genres = [\n  \"pop\",\n  \"rap\",\n  \"hip-hop\",\n  \"r&b\",\n  \"indie\",\n  \"alternative\",\n];\n\nconst listeningData = [];\nfor (let i = 0; i < 100; i++) {\n  listeningData.push({\n    day: new Date(\n      _.random(\n        startDate.getTime(),\n        endDate.getTime(),\n      ),\n    ),\n    genre:\n      genres[\n        _.random(0, genres.length - 1)\n      ],\n  });\n}\n\nconst groupedData = _.groupBy(\n  listeningData,\n  ({ genre }) => genre,\n);\n\nconst sharedAxisStyles = {\n  tickLabels: {\n    fontSize: 13,\n  },\n  axisLabel: {\n    padding: 39,\n    fontSize: 13,\n    fontStyle: \"italic\",\n  },\n};\n\nconst App = () => {\n  return (\n    <VictoryChart\n      height={450}\n      padding={70}\n      scale={{ x: \"time\" }}\n      containerComponent={\n        <VictoryVoronoiContainer\n          style={{}}\n          labels={({ datum }) =>\n            datum.y > 0\n              ? `${datum.y} ${datum.binnedData[0].genre} songs`\n              : null\n          }\n        />\n      }\n      theme={VictoryTheme.clean}\n    >\n      <VictoryLabel\n        x={225}\n        y={25}\n        textAnchor=\"middle\"\n        text=\"Songs listened to in 2020\"\n      />\n\n      <VictoryStack\n        colorScale={[\n          \"#003f5c\",\n          \"#2f4b7c\",\n          \"#665191\",\n          \"#a05195\",\n          \"#d45087\",\n          \"#f95d6a\",\n          \"#ff7c43\",\n          \"#ffa600\",\n        ]}\n      >\n        {Object.entries(\n          groupedData,\n        ).map(([key, dataGroup]) => {\n          return (\n            <VictoryHistogram\n              data={dataGroup}\n              key={key}\n              x=\"day\"\n              binSpacing={8}\n              style={{\n                data: {\n                  strokeWidth: 0,\n                },\n              }}\n            />\n          );\n        })}\n      </VictoryStack>\n\n      <VictoryAxis\n        tickCount={12}\n        tickFormat={(date) =>\n          date.toLocaleString(\n            \"default\",\n            { month: \"short\" },\n          )\n        }\n        style={sharedAxisStyles}\n      />\n\n      <VictoryAxis\n        dependentAxis\n        label=\"Total # of Songs\"\n        style={sharedAxisStyles}\n      />\n    </VictoryChart>\n  );\n};\n\nrender(<App />);\n```\n\n## Histogram - Animation\n\nHistogram charts can be animated by setting the `animate` prop.\n\n```jsx live noInline\nfunction App() {\n  const [data, setData] =\n    React.useState(getData());\n  const [bins, setBins] =\n    React.useState(getBins());\n\n  React.useState(() => {\n    const setStateInterval =\n      window.setInterval(() => {\n        setData(getData());\n        setBins(getBins());\n      }, 4000);\n\n    return () => {\n      window.clearInterval(\n        setStateInterval,\n      );\n    };\n  }, []);\n\n  return (\n    <VictoryChart\n      theme={VictoryTheme.clean}\n      domainPadding={{ x: 20 }}\n    >\n      <VictoryHistogram\n        animate={{ duration: 1000 }}\n        bins={bins}\n        data={data}\n      />\n    </VictoryChart>\n  );\n}\n\nfunction getData() {\n  return _.range(100).map(() => ({\n    x: _.random(0, 300),\n  }));\n}\n\nfunction getBins() {\n  return _.range(\n    0,\n    _.random(100, 300),\n    10,\n  );\n}\n\nrender(<App />);\n```\n\n## Histogram - Styles\n\nChart styling can be customized by using the theme or overriding the style prop on the component.\n\n```jsx live\n<VictoryChart\n  domainPadding={20}\n  theme={VictoryTheme.clean}\n>\n  <VictoryHistogram\n    style={{\n      data: {\n        fill: ({ datum }) =>\n          datum.y === 3\n            ? \"#000000\"\n            : \"#c43a31\",\n        stroke: ({ index }) =>\n          +index % 2 === 0\n            ? \"#000000\"\n            : \"#c43a31\",\n        fillOpacity: 0.7,\n        strokeWidth: 3,\n      },\n      labels: {\n        fontSize: 15,\n        fill: ({ datum }) =>\n          datum.y === 3\n            ? \"#000000\"\n            : \"#c43a31\",\n      },\n    }}\n    data={sampleHistogramData}\n    labels={({ datum }) => datum.y}\n  />\n</VictoryChart>\n```\n\n## Standalone Rendering\n\nHistogram charts can be rendered outside a VictoryChart.\n\n```jsx live\n<VictoryHistogram\n  theme={VictoryTheme.clean}\n  data={sampleHistogramData}\n/>\n```\n\nThey can also be embeded in other SVG components by using the `standalone` prop.\n\n```jsx live\n<div style={{ padding: \"20px\" }}>\n  <svg\n    width={300}\n    height={300}\n    style={{\n      display: \"block\",\n      margin: \"0 auto\",\n    }}\n  >\n    <circle\n      cx={150}\n      cy={150}\n      r={150}\n      fill=\"#9ded91\"\n    />\n    <VictoryHistogram\n      standalone={false}\n      theme={VictoryTheme.clean}\n      width={300}\n      height={300}\n      padding={{ left: 10, right: 10 }}\n      data={sampleData}\n    />\n  </svg>\n</div>\n```\n"
  },
  {
    "path": "website/docs/charts/line.mdx",
    "content": "---\ntitle: Line\n---\n\nLine charts are used for visualizing trends in data over a continuous interval.\n\n## Basic\n\nSee the [full API here](/docs/api/victory-line). Typically composed with [`VictoryChart`](/docs/api/victory-chart) to create full charts.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryLine\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Line Charts - Horizontal\n\nLine charts can be rendered with a flipped axis by setting the `horizontal` prop to `true`. This prop can be applied to either `VictoryChart` or `VictoryLine`.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n  horizontal\n>\n  <VictoryLine\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Line Charts - Interpolation\n\nLine charts can use interpolation to smooth the line between data points. See the [full list of interpolation options](/docs/api/victory-line#interpolation) in the common props section.\n\n```jsx live noInline\nconst data = [\n  { x: 0, y: 0 },\n  { x: 1, y: 2 },\n  { x: 2, y: 1 },\n  { x: 3, y: 4 },\n  { x: 4, y: 3 },\n  { x: 5, y: 5 },\n];\n\nconst cartesianInterpolations = [\n  \"basis\",\n  \"bundle\",\n  \"cardinal\",\n  \"catmullRom\",\n  \"linear\",\n  \"monotoneX\",\n  \"monotoneY\",\n  \"natural\",\n  \"step\",\n  \"stepAfter\",\n  \"stepBefore\",\n];\n\nconst InterpolationSelect = ({\n  currentValue,\n  values,\n  onChange,\n}) => (\n  <select\n    onChange={onChange}\n    value={currentValue}\n    className=\"w-[200px] mx-auto bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500\"\n  >\n    {values.map((value) => (\n      <option value={value} key={value}>\n        {value}\n      </option>\n    ))}\n  </select>\n);\n\nfunction App() {\n  const [state, setState] =\n    React.useState({\n      interpolation: \"natural\",\n    });\n\n  return (\n    <div className=\"pt-4\">\n      <InterpolationSelect\n        currentValue={\n          state.interpolation\n        }\n        values={\n          state.polar\n            ? polarInterpolations\n            : cartesianInterpolations\n        }\n        onChange={(event) =>\n          setState({\n            interpolation:\n              event.target.value,\n          })\n        }\n      />\n      <VictoryChart\n        height={390}\n        theme={VictoryTheme.clean}\n      >\n        <VictoryLine\n          interpolation={\n            state.interpolation\n          }\n          data={data}\n        />\n        <VictoryScatter\n          data={data}\n          size={5}\n        />\n      </VictoryChart>\n    </div>\n  );\n}\n\nrender(<App />);\n```\n\n## Line Charts - Sampling\n\nLine charts can be rendered with a specific number of samples across a range of values by setting the `samples` prop.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryGroup>\n    <VictoryLine\n      samples={25}\n      y={(d) =>\n        Math.sin(5 * Math.PI * d.x)\n      }\n    />\n    <VictoryLine\n      samples={100}\n      y={(d) =>\n        Math.cos(5 * Math.PI * d.x)\n      }\n    />\n  </VictoryGroup>\n</VictoryChart>\n```\n\n## Line Charts - Null Data\n\nLine charts can handle null data points by setting the `data` prop to an array of objects with `x` and `y` values. Null data points will be skipped.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryLine\n    data={[\n      { x: 1, y: 1 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 2 },\n      { x: 5, y: null },\n      { x: 6, y: null },\n      { x: 7, y: 6 },\n      { x: 8, y: 7 },\n      { x: 9, y: 8 },\n      { x: 10, y: 12 },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Line Charts - Discontinuous Scale\n\nLine charts can be rendered with a discontinuous scale by using the `scaleDiscontinuous` plugin from `@d3fc/d3fc-discontinuous-scale`.\n\n```jsx live noInline\nfunction App() {\n  const data = [\n    { x: new Date(2021, 5, 1), y: 8 },\n    { x: new Date(2021, 5, 2), y: 10 },\n    { x: new Date(2021, 5, 3), y: 7 },\n    { x: new Date(2021, 5, 4), y: 4 },\n    { x: new Date(2021, 5, 7), y: 6 },\n    { x: new Date(2021, 5, 8), y: 3 },\n    { x: new Date(2021, 5, 9), y: 7 },\n    { x: new Date(2021, 5, 10), y: 9 },\n    { x: new Date(2021, 5, 11), y: 6 },\n  ];\n\n  // scaleDiscontinuous and discontinuitySkipWeekends are both\n  // plugins imported from @d3fc/d3fc-discontinuous-scale\n  const discontinuousScale =\n    scaleDiscontinuous(\n      d3Scale.scaleTime(),\n    ).discontinuityProvider(\n      discontinuitySkipWeekends(),\n    );\n\n  return (\n    <VictoryChart\n      scale={{ x: discontinuousScale }}\n      theme={VictoryTheme.clean}\n    >\n      <VictoryLine data={data} />\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n\n## Line Charts - Combined\n\nLine charts can be combined into the same chart. Note that the order of the components will determine the rendering order.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryLine\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n    style={{\n      data: {\n        stroke: \"#8b46ff\",\n      },\n    }}\n  />\n  <VictoryLine\n    data={[\n      { x: 1, y: 4 },\n      { x: 2, y: 2 },\n      { x: 3, y: 7 },\n      { x: 4, y: 5 },\n      { x: 5, y: 3 },\n    ]}\n    style={{\n      data: {\n        stroke: \"#2d7ff9\",\n      },\n    }}\n  />\n</VictoryChart>\n```\n\n## Line Charts - Stacked\n\nLine charts can be stacked using the `VictoryStack` component. This will automatically adjust the baseline for each data point and apply a `colorScale`.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryStack colorScale=\"qualitative\">\n    <VictoryLine\n      data={[\n        { x: 1, y: 2 },\n        { x: 2, y: 3 },\n        { x: 3, y: 5 },\n        { x: 4, y: 4 },\n        { x: 5, y: 7 },\n      ]}\n    />\n    <VictoryLine\n      data={[\n        { x: 1, y: 4 },\n        { x: 2, y: 2 },\n        { x: 3, y: 7 },\n        { x: 4, y: 5 },\n        { x: 5, y: 3 },\n      ]}\n    />\n  </VictoryStack>\n</VictoryChart>\n```\n\n## Line Charts - Labels\n\nAdd labels to charts by setting the `labels` prop to the name of a property in the dataset, or a function that returns the label value. You can customize the display of the labels by using the [`labelComponent`](/docs/api/victory-line) prop.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryLine\n    data={sampleData}\n    labels={({ datum }) => datum.y}\n  />\n</VictoryChart>\n```\n\n## Line Charts - Tooltips\n\n`VictoryLine` only renders a single element to represent an entire dataset, so replacing its `labelComponent` with `VictoryTooltip` won't work as expected. Use `VictoryVoronoiContainer` to associate mouse position with the nearest data points.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n  containerComponent={\n    <VictoryVoronoiContainer\n      voronoiDimension=\"x\"\n      labels={({ datum }) =>\n        `y: ${datum.y}`\n      }\n      labelComponent={\n        <VictoryTooltip />\n      }\n    />\n  }\n>\n  <VictoryLine\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Line Charts - Animation\n\nCharts can be animated by setting the `animate` prop. See the [animations](/docs/guides/animations) guide for more information.\n\n```jsx live noInline\nfunction App() {\n  const [data, setData] =\n    React.useState(getData());\n\n  React.useState(() => {\n    const setStateInterval =\n      window.setInterval(() => {\n        setData(getData());\n      }, 4000);\n\n    return () => {\n      window.clearInterval(\n        setStateInterval,\n      );\n    };\n  }, []);\n\n  return (\n    <VictoryChart\n      theme={VictoryTheme.clean}\n    >\n      <VictoryLine\n        data={data}\n        interpolation=\"basis\"\n        animate={{\n          duration: 1000,\n        }}\n      />\n    </VictoryChart>\n  );\n}\n\nfunction getData() {\n  return _.range(1, 30).map((i) => ({\n    x: i,\n    y: _.random(1, 50),\n  }));\n}\n\nrender(<App />);\n```\n\n## Line Charts - Styles\n\nChart styling can be customized by using the theme or overriding the style prop on the component.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryLine\n    data={sampleData}\n    labels={({ datum }) => datum.y}\n    style={{\n      data: {\n        stroke: \"#c43a31\",\n        strokeWidth: ({ data }) =>\n          data.length,\n      },\n      labels: {\n        fontSize: 15,\n        fill: ({ datum }) =>\n          datum.x === 3\n            ? \"#000000\"\n            : \"#c43a31\",\n      },\n    }}\n  />\n</VictoryChart>\n```\n\n## Line Charts - Events\n\nEvents can be handled by passing an array of event objects to the `events` prop on the `VictoryLine` component. `VictoryLine` uses the special `all` key for the target prop to attach events to all data points. See the [events](/docs/guides/events) guide for more information.\n\n```jsx live noInline\nfunction App() {\n  const toggleFillColor = (stroke) => {\n    if (stroke === \"black\") {\n      return null;\n    } else {\n      return {\n        style: {\n          stroke: \"black\",\n          strokeWidth: 5,\n        },\n      };\n    }\n  };\n\n  return (\n    <VictoryChart\n      theme={VictoryTheme.clean}\n    >\n      <VictoryLine\n        data={sampleData}\n        labels={({ datum }) => datum.y}\n        events={[\n          {\n            target: \"data\",\n            eventHandlers: {\n              onClick: () => {\n                return [\n                  {\n                    eventKey: \"all\",\n                    mutation: (props) =>\n                      toggleFillColor(\n                        props.style\n                          ?.stroke,\n                      ),\n                  },\n                ];\n              },\n            },\n          },\n        ]}\n      />\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n\n## Polar Line Charts\n\nLine charts can be rendered in polar coordinates by setting the `polar` prop to `true` and using `VictoryPolarAxis` components.\n\n```jsx live\n<VictoryChart\n  polar\n  domain={{ y: [0, 7] }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryPolarAxis\n    dependentAxis\n    style={{ axis: { stroke: \"none\" } }}\n    tickFormat={() => null}\n  />\n  <VictoryPolarAxis />\n  <VictoryLine data={sampleData} />\n</VictoryChart>\n```\n\n## Polar Line Charts - Cardioid\n\nLine charts can be rendered in polar coordinates with a cardioid shape by setting the `polar` prop to `true` and using `VictoryPolarAxis` components.\n\n```jsx live noInline\nfunction App() {\n  return (\n    <VictoryChart\n      polar\n      theme={VictoryTheme.clean}\n      domain={{ y: [0, 10] }}\n    >\n      <VictoryPolarAxis\n        dependentAxis\n        style={{\n          axis: { stroke: \"none\" },\n        }}\n        tickFormat={() => \"\"}\n      />\n      <VictoryPolarAxis\n        tickValues={[\n          0,\n          Math.PI / 2,\n          Math.PI,\n          (3 * Math.PI) / 2,\n        ]}\n        tickFormat={[\n          \"2π\",\n          \"π/2\",\n          \"π\",\n          \"3π/2\",\n        ]}\n        labelPlacement=\"vertical\"\n      />\n      {[5, 4, 3, 2, 1].map((val, i) => {\n        return (\n          <VictoryLine\n            key={i}\n            samples={100}\n            style={{\n              data: {\n                stroke:\n                  VictoryTheme.clean\n                    .palette\n                    .qualitative[i],\n              },\n            }}\n            y={(d) =>\n              val * (1 - Math.cos(d.x))\n            }\n          />\n        );\n      })}\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n\n## Standalone Rendering\n\nBar charts can be rendered outside a VictoryChart.\n\n```jsx live\n<VictoryLine\n  theme={VictoryTheme.clean}\n  data={sampleData}\n/>\n```\n\nThey can also be embeded in other SVG components by using the `standalone` prop.\n\n```jsx live\n<div style={{ padding: \"20px\" }}>\n  <svg\n    width={300}\n    height={300}\n    style={{\n      display: \"block\",\n      margin: \"0 auto\",\n    }}\n  >\n    <circle\n      cx={150}\n      cy={150}\n      r={150}\n      fill=\"#9ded91\"\n    />\n    <VictoryLine\n      standalone={false}\n      theme={VictoryTheme.clean}\n      width={300}\n      height={300}\n      padding={{ left: 10, right: 10 }}\n      data={sampleData}\n    />\n  </svg>\n</div>\n```\n"
  },
  {
    "path": "website/docs/charts/pie.mdx",
    "content": "---\ntitle: Pie\n---\n\nPie charts can be used to visually represent proportions of a whole for a limited number of categories.\n\n## Basic\n\nSee the [full API here](/docs/api/victory-pie). Typically composed with [`VictoryChart`](/docs/api/victory-chart) to create full charts.\n\n```jsx live\n<VictoryPie\n  data={[\n    { x: \"Cats\", y: 35 },\n    { x: \"Dogs\", y: 40 },\n    { x: \"Birds\", y: 55 },\n  ]}\n  theme={VictoryTheme.clean}\n/>\n```\n\n## Pie Chart - Semi Circular\n\nPie charts can be rendered within a specific angle range.\n\n```jsx live\n<VictoryPie\n  startAngle={90}\n  endAngle={-90}\n  data={[\n    { x: \"Cats\", y: 35 },\n    { x: \"Dogs\", y: 40 },\n    { x: \"Birds\", y: 55 },\n  ]}\n  theme={VictoryTheme.clean}\n/>\n```\n\n## Pie Chart - Donut\n\nPie charts can be rendered as donuts by setting the `innerRadius` prop.\n\n```jsx live\n<VictoryPie\n  innerRadius={50}\n  data={[\n    { x: \"Cats\", y: 30 },\n    { x: \"Dogs\", y: 35 },\n    { x: \"Birds\", y: 25 },\n    { x: \"Rabbits\", y: 10 },\n  ]}\n  theme={VictoryTheme.clean}\n/>\n```\n\n## Pie Chart - Ring\n\nPie charts can be rendered as rings by adjusting various radius props.\n\n```jsx live\n<VictoryPie\n  theme={VictoryTheme.clean}\n  data={[\n    { x: \"Cats\", y: 70 },\n    { x: \"Dogs\", y: 30 },\n  ]}\n  labels={[]}\n  cornerRadius={20}\n  startAngle={-6}\n  innerRadius={80}\n/>\n```\n\n## Pie Chart - Exploded\n\nPie charts can be exploded to emphasize the categories.\n\n```jsx live\n<VictoryPie\n  innerRadius={50}\n  padAngle={5}\n  data={[\n    { x: \"Cats\", y: 30 },\n    { x: \"Dogs\", y: 35 },\n    { x: \"Birds\", y: 25 },\n    { x: \"Rabbits\", y: 10 },\n  ]}\n  theme={VictoryTheme.clean}\n/>\n```\n\n## Pie Chart - Ordered\n\nPie chart slices can be ordered using the standard `categories` prop.\n\n```jsx live\n<VictoryPie\n  innerRadius={50}\n  padAngle={5}\n  data={[\n    { x: \"Cats\", y: 30 },\n    { x: \"Dogs\", y: 35 },\n    { x: \"Birds\", y: 25 },\n    { x: \"Rabbits\", y: 10 },\n  ]}\n  categories={{\n    x: [\n      \"Cats\",\n      \"Birds\",\n      \"Dogs\",\n      \"Rabbits\",\n    ],\n  }}\n  theme={VictoryTheme.clean}\n/>\n```\n\n## Pie Chart - Variable radius\n\nPie charts can have variable radius by setting the `radius` prop to a function.\n\n```jsx live\n<VictoryPie\n  radius={({ datum }) => datum.y + 75}\n  data={[\n    { x: \"Cats\", y: 30 },\n    { x: \"Dogs\", y: 35 },\n    { x: \"Birds\", y: 25 },\n    { x: \"Rabbits\", y: 10 },\n  ]}\n  theme={VictoryTheme.clean}\n/>\n```\n\n## Pie Chart - Center Labels\n\nPie charts can have center labels by providing a custom label.\n\n```jsx live\n<svg viewBox=\"0 0 400 400\">\n  <VictoryPie\n    standalone={false}\n    width={400}\n    height={400}\n    data={[\n      { x: \"Cats\", y: 30 },\n      { x: \"Dogs\", y: 35 },\n      { x: \"Birds\", y: 25 },\n      { x: \"Rabbits\", y: 10 },\n    ]}\n    innerRadius={68}\n    labelRadius={100}\n    theme={VictoryTheme.clean}\n  />\n  <VictoryLabel\n    textAnchor=\"middle\"\n    style={{ fontSize: 20 }}\n    x={200}\n    y={200}\n    text=\"Pets\"\n  />\n</svg>\n```\n\n## Pie Chart - Independent Labels\n\nPie chart data can use independent labels in the dataset.\n\n```jsx live\n<VictoryPie\n  innerRadius={50}\n  data={[\n    { label: \"Cats\", x: 1, y: 30 },\n    { label: \"Dogs\", x: 2, y: 35 },\n    { label: \"Birds\", x: 3, y: 25 },\n    { label: \"Rabbits\", x: 4, y: 10 },\n  ]}\n  theme={VictoryTheme.clean}\n/>\n```\n\n## Pie Chart - Label Position\n\nPie chart labels can be positioned at different points along each slice by using the `labelPosition` prop.\n\n```jsx live\n<VictoryPie\n  theme={VictoryTheme.clean}\n  radius={100}\n  labelPosition=\"startAngle\"\n  labelPlacement=\"perpendicular\"\n  labels={({ datum }) =>\n    `${datum.l}\\ndegrees`\n  }\n  data={[\n    { x: 1, y: 1, l: 0 },\n    { x: 2, y: 1, l: 45 },\n    { x: 3, y: 1, l: 90 },\n    { x: 4, y: 1, l: 135 },\n    { x: 5, y: 1, l: 180 },\n    { x: 6, y: 1, l: 225 },\n    { x: 7, y: 1, l: 270 },\n    { x: 8, y: 1, l: 315 },\n  ]}\n/>\n```\n\n## Pie Chart - Label Indicator\n\nPie charts can show a label indicator by setting the `labelIndicator` prop.\n\n```jsx live\n<VictoryPie\n  theme={VictoryTheme.clean}\n  radius={100}\n  labelPlacement=\"perpendicular\"\n  labelIndicator\n  labels\n  data={[\n    { x: \"Cats\", y: 30 },\n    { x: \"Dogs\", y: 35 },\n    { x: \"Birds\", y: 25 },\n    { x: \"Rabbits\", y: 10 },\n  ]}\n/>\n```\n\n## Pie Chart - Custom Label Indicator\n\nPie charts can show a custom label indicator by setting the `labelIndicator` prop to a custom component.\n\n```jsx live\n<VictoryPie\n  theme={VictoryTheme.clean}\n  radius={100}\n  labelIndicator={\n    <LineSegment\n      style={{\n        stroke: \"blue\",\n        strokeDasharray: 8,\n      }}\n    />\n  }\n  labels\n  data={[\n    { x: \"Cats\", y: 30 },\n    { x: \"Dogs\", y: 35 },\n    { x: \"Birds\", y: 25 },\n    { x: \"Rabbits\", y: 10 },\n  ]}\n/>\n```\n\n## Pie Chart - Tooltips\n\nTooltips can be added by using a [`VictoryTooltip`](/docs/api/victory-tooltip) component as the `labelComponent`.\n\n```jsx live\n<VictoryPie\n  theme={VictoryTheme.clean}\n  radius={100}\n  labels={({ datum }) =>\n    `${datum.l}\\ndegrees`\n  }\n  labelComponent={<VictoryTooltip />}\n  data={[\n    { x: 1, y: 1, l: 0 },\n    { x: 2, y: 1, l: 45 },\n    { x: 3, y: 1, l: 90 },\n    { x: 4, y: 1, l: 135 },\n    { x: 5, y: 1, l: 180 },\n    { x: 6, y: 1, l: 225 },\n    { x: 7, y: 1, l: 270 },\n    { x: 8, y: 1, l: 315 },\n  ]}\n/>\n```\n\n## Pie Chart - Animation\n\nCharts can be animated by setting the `animate` prop. See the [animations](/docs/guides/animations) guide for more information.\n\n```jsx live noInline\nfunction App() {\n  const [data, setData] =\n    React.useState(getData());\n\n  React.useState(() => {\n    const setStateInterval =\n      window.setInterval(() => {\n        setData(getData());\n      }, 4000);\n\n    return () => {\n      window.clearInterval(\n        setStateInterval,\n      );\n    };\n  }, []);\n\n  return (\n    <VictoryPie\n      theme={VictoryTheme.clean}\n      animate={{ duration: 1000 }}\n      data={data}\n    />\n  );\n}\n\nfunction getData() {\n  const rand = () =>\n    Math.max(\n      Math.floor(Math.random() * 10000),\n      1000,\n    );\n  return [\n    { x: \"5-13\", y: rand() },\n    { x: \"14-17\", y: rand() },\n    { x: \"18-24\", y: rand() },\n    { x: \"25-44\", y: rand() },\n    { x: \"45-64\", y: rand() },\n    { x: \"≥65\", y: rand() },\n  ];\n}\n\nrender(<App />);\n```\n\n## Pie Chart - Styles\n\nChart styling can be customized by using the theme or overriding the style prop on the component.\n\n```jsx live\n<VictoryPie\n  data={[\n    { x: \"Cats\", y: 35 },\n    { x: \"Dogs\", y: 40 },\n    { x: \"Birds\", y: 55 },\n  ]}\n  theme={VictoryTheme.clean}\n  style={{\n    data: {\n      fillOpacity: 0.9,\n      stroke: \"#c43a31\",\n      strokeWidth: 3,\n    },\n    labels: {\n      fontSize: 25,\n      fill: \"#c43a31\",\n    },\n  }}\n/>\n```\n\n## Pie Chart - Events\n\nEvents can be handled by passing an array of event objects to the `events` prop on the component. Each event object should specify a `target` and an `eventHandlers` object. See the [events](/docs/guides/events) guide for more information.\n\n```jsx live\n<VictoryPie\n  data={[\n    { x: \"Cats\", y: 35 },\n    { x: \"Dogs\", y: 40 },\n    { x: \"Birds\", y: 55 },\n  ]}\n  theme={VictoryTheme.clean}\n  events={[\n    {\n      target: \"data\",\n      eventHandlers: {\n        onClick: () => {\n          return [\n            {\n              target: \"data\",\n              mutation: ({ style }) => {\n                return style.fill ===\n                  \"#c43a31\"\n                  ? null\n                  : {\n                      style: {\n                        fill: \"#c43a31\",\n                      },\n                    };\n              },\n            },\n            {\n              target: \"labels\",\n              mutation: ({ text }) => {\n                return text ===\n                  \"clicked\"\n                  ? null\n                  : { text: \"clicked\" };\n              },\n            },\n          ];\n        },\n      },\n    },\n  ]}\n/>\n```\n\n## Standalone Rendering\n\nPie charts can also be embeded in other SVG components by using the `standalone` prop.\n\n```jsx live\n<svg\n  width={300}\n  height={300}\n  className=\"block mx-auto\"\n>\n  <circle\n    cx={150}\n    cy={150}\n    r={50}\n    fill=\"#2d7ff9\"\n  />\n  <VictoryPie\n    standalone={false}\n    width={300}\n    height={300}\n    innerRadius={75}\n    data={[\n      { x: \"Cats\", y: 30 },\n      { x: \"Dogs\", y: 35 },\n      { x: \"Birds\", y: 25 },\n      { x: \"Rabbits\", y: 10 },\n    ]}\n    theme={VictoryTheme.clean}\n  />\n</svg>\n```\n"
  },
  {
    "path": "website/docs/charts/scatter.mdx",
    "content": "---\ntitle: Scatter\n---\n\nScatter charts render a dataset as a series of points.\n\n## Basic\n\nSee the [full API here](/docs/api/victory-scatter). Typically composed with [`VictoryChart`](/docs/api/victory-chart) to create full charts.\n\n```jsx live\n<VictoryChart\n  domain={{ x: [0, 5], y: [0, 7] }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryScatter\n    size={7}\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Scatter Charts - Labels\n\nAdd labels to charts by setting the `labels` prop to the name of a property in the dataset, or a function that returns the label value. You can customize the display of the labels by using the [`labelComponent`](/docs/api/victory-area#labelcomponent) prop. `VictoryScatter` will also preferentially use the `label` property from the data object.\n\n```jsx live\n<VictoryChart\n  domain={{ x: [0, 5], y: [0, 7] }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryScatter\n    size={7}\n    data={[\n      { x: 1, y: 2, label: \"bob\" },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n    labels={({ datum }) => datum.y}\n  />\n</VictoryChart>\n```\n\n#### Custom Labels\n\nCustom labels can be rendered by using the `labelComponent` prop. See the [VictoryLabel](/docs/api/victory-label) API for more information.\n\n```jsx live\n<VictoryChart\n  domain={{ x: [0, 5], y: [0, 7] }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryScatter\n    size={7}\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n    labels={({ datum }) => datum.y}\n    labelComponent={\n      <VictoryLabel\n        angle={15}\n        lineHeight={1.2}\n        style={{ fontSize: 20, fill: \"#2d7ff9\" }}\n      />\n    }\n  />\n</VictoryChart>\n```\n\n## Scatter Charts - Tooltips\n\nTooltips can be added by using a [`VictoryTooltip`](/docs/api/victory-tooltip) component as the `labelComponent`.\n\n```jsx live\n<VictoryChart\n  domain={{ x: [0, 5], y: [0, 7] }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryScatter\n    size={7}\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n    labels={({ datum }) => datum.y}\n    labelComponent={\n      <VictoryTooltip dy={-10} />\n    }\n  />\n</VictoryChart>\n```\n\n## Scatter Charts - Axis\n\nScatter charts support all four quadrants by default. You can customize the domain of the chart by setting the `domain` prop on `VictoryChart` or `VictoryScatter`.\n\n```jsx live\n<VictoryChart\n  domain={{\n    x: [-10, 10],\n    y: [-10, 10],\n  }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryScatter\n    size={7}\n    data={[\n      { x: -3, y: 2 },\n      { x: 0, y: -2 },\n      { x: -8, y: 1 },\n      { x: -2, y: -3 },\n      { x: 7, y: 5 },\n      { x: -8, y: 6 },\n      { x: -1, y: 3 },\n      { x: -4, y: -5 },\n      { x: -6, y: -5 },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Scatter Charts - Horizontal\n\nScatter charts can be rendered with a flipped axis by setting the `horizontal` prop to `true`. This prop can be applied to either `VictoryChart` or `VictoryLine`.\n\n```jsx live\n<VictoryChart\n  horizontal\n  theme={VictoryTheme.clean}\n>\n  <VictoryScatter\n    size={7}\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Scatter Charts - Null Data\n\nScatter charts can handle null data points by setting the `data` prop to an array of objects with `x` and `y` values. Null data points will be skipped.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryScatter\n    data={[\n      { x: 1, y: 1 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 2 },\n      { x: 5, y: null },\n      { x: 6, y: null },\n      { x: 7, y: 6 },\n      { x: 8, y: 7 },\n      { x: 9, y: 8 },\n      { x: 10, y: 12 },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Scatter Charts - Bubble\n\nScatter charts can render a dynamic bubble size by setting the `bubbleProperty` to a property of the data object.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n  domain={{ x: [0, 6], y: [0, 8] }}\n>\n  <VictoryScatter\n    bubbleProperty=\"amount\"\n    maxBubbleSize={25}\n    minBubbleSize={5}\n    data={[\n      { x: 1, y: 2, amount: 20 },\n      { x: 2, y: 3, amount: 40 },\n      { x: 3, y: 5, amount: 25 },\n      { x: 4, y: 4, amount: 10 },\n      { x: 5, y: 7, amount: 45 },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Scatter Charts - Symbols\n\nScatter chart bubbles can be customized by setting the `symbol` prop.\n\n```jsx live\n<VictoryChart\n  domain={{ x: [0, 5], y: [0, 7] }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryScatter\n    size={7}\n    data={[\n      { x: 1, y: 2, symbol: \"circle\" },\n      { x: 2, y: 3, symbol: \"star\" },\n      { x: 3, y: 5, symbol: \"square\" },\n      {\n        x: 4,\n        y: 4,\n        symbol: \"diamond\",\n      },\n      {\n        x: 5,\n        y: 7,\n        symbol: \"triangleDown\",\n      },\n    ]}\n    labels={({ datum }) => datum.y}\n  />\n</VictoryChart>\n```\n\n## Scatter Charts - Custom Icons\n\nScatter chart bubbles can also leverage SVG elements such as those from icon libraries like [react-icons](https://react-icons.github.io/react-icons/) by using the `dataComponent` property.\n\n```jsx live noInline\nconst { FaSun } = reactIconsFa;\n\nconst CustomIcon = (props) => {\n  return (\n    <FaSun\n      fill={props?.style?.fill}\n      x={props.x - 7}\n      y={props.y - 7}\n      size={15}\n    />\n  );\n};\n\nfunction App() {\n  return (\n    <VictoryChart\n      domain={{ x: [0, 5], y: [0, 7] }}\n      theme={VictoryTheme.clean}\n    >\n      <VictoryScatter\n        size={7}\n        data={[\n          { x: 1, y: 2 },\n          { x: 2, y: 3 },\n          { x: 3, y: 5 },\n          { x: 4, y: 4 },\n          { x: 5, y: 7 },\n        ]}\n        dataComponent={<CustomIcon />}\n      />\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n\n## Scatter Charts - Animation\n\nScatter charts support all four quadrants by default. You can customize the domain of the chart by setting the `domain` prop on `VictoryChart` or `VictoryScatter`.\n\n```jsx live noInline\nfunction App() {\n  const [data, setData] =\n    React.useState(getData());\n\n  React.useState(() => {\n    const setStateInterval =\n      window.setInterval(() => {\n        setData(getData());\n      }, 4000);\n\n    return () => {\n      window.clearInterval(\n        setStateInterval,\n      );\n    };\n  }, []);\n\n  return (\n    <VictoryChart\n      theme={VictoryTheme.clean}\n    >\n      <VictoryScatter\n        animate={{ duration: 2000 }}\n        groupComponent={\n          <VictoryClipContainer />\n        }\n        data={data}\n        style={{\n          data: {\n            fill: ({ datum }) =>\n              datum.fill,\n            opacity: ({ datum }) =>\n              datum.opacity,\n          },\n        }}\n        animate={{\n          onExit: {\n            duration: 500,\n            before: () => ({\n              opacity: 0.3,\n            }),\n          },\n          onEnter: {\n            duration: 500,\n            before: () => ({\n              opacity: 0.3,\n            }),\n            after: (datum) => ({\n              opacity:\n                datum.opacity || 1,\n            }),\n          },\n        }}\n      />\n    </VictoryChart>\n  );\n}\n\nfunction getData() {\n  const colors = [\n    \"violet\",\n    \"cornflowerblue\",\n    \"gold\",\n    \"orange\",\n    \"turquoise\",\n    \"tomato\",\n    \"greenyellow\",\n  ];\n  const symbols = [\n    \"circle\",\n    \"star\",\n    \"square\",\n    \"triangleUp\",\n    \"triangleDown\",\n    \"diamond\",\n    \"plus\",\n  ];\n  const elementNum = _.random(10, 40);\n  return _.range(elementNum).map(\n    (index) => {\n      const scaledIndex = Math.floor(\n        index % 7,\n      );\n      return {\n        x: _.random(10, 50),\n        y: _.random(2, 100),\n        size: _.random(8) + 3,\n        symbol: symbols[scaledIndex],\n        fill: colors[_.random(0, 6)],\n        opacity: 1,\n      };\n    },\n  );\n}\n\nrender(<App />);\n```\n\n## Scatter Charts - Styles\n\nChart styling can be customized by using the theme or overriding the style prop on the component.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryScatter\n    size={7}\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n    style={{\n      data: {\n        fill: ({ datum }) =>\n          datum.x === 3\n            ? \"#000000\"\n            : \"#c43a31\",\n        stroke: ({ datum }) =>\n          datum.x === 3\n            ? \"#000000\"\n            : \"#c43a31\",\n        fillOpacity: 0.7,\n        strokeWidth: 3,\n      },\n      labels: {\n        fontSize: 15,\n        fill: ({ datum }) =>\n          datum.x === 3\n            ? \"#000000\"\n            : \"#c43a31\",\n      },\n    }}\n  />\n</VictoryChart>\n```\n\n## Scatter Charts - Events\n\nEvents can be handled by passing an array of event objects to the `events` prop on the component. Each event object should specify a `target` and an `eventHandlers` object. See the [events](/docs/guides/events) guide for more information.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryScatter\n    size={7}\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n    events={[\n      {\n        target: \"data\",\n        eventHandlers: {\n          onClick: () => {\n            return [\n              {\n                target: \"data\",\n                mutation: (props) => {\n                  const fill =\n                    props.style &&\n                    props.style.fill;\n                  return fill ===\n                    \"black\"\n                    ? null\n                    : {\n                        style: {\n                          fill: \"black\",\n                        },\n                      };\n                },\n              },\n            ];\n          },\n        },\n      },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Polar Scatter Charts\n\nLine charts can be rendered in polar coordinates by setting the `polar` prop to `true` and using `VictoryPolarAxis` components.\n\n```jsx live\n<VictoryChart\n  polar\n  domain={{ y: [0, 7] }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryPolarAxis\n    dependentAxis\n    style={{ axis: { stroke: \"none\" } }}\n    tickFormat={() => null}\n  />\n  <VictoryPolarAxis />\n  <VictoryScatter size={5} />\n</VictoryChart>\n```\n\n## Standalone Rendering\n\nScatter charts can be rendered outside a VictoryChart.\n\n```jsx live\n<VictoryScatter\n  size={7}\n  theme={VictoryTheme.clean}\n  data={sampleData}\n/>\n```\n\nThey can also be embeded in other SVG components by using the `standalone` prop.\n\n```jsx live\n<div style={{ padding: \"20px\" }}>\n  <svg\n    width={300}\n    height={300}\n    style={{\n      display: \"block\",\n      margin: \"0 auto\",\n    }}\n  >\n    <circle\n      cx={150}\n      cy={150}\n      r={150}\n      fill=\"#9ded91\"\n    />\n    <VictoryScatter\n      standalone={false}\n      size={7}\n      theme={VictoryTheme.clean}\n      width={300}\n      height={300}\n      padding={{ left: 10, right: 10 }}\n      data={sampleData}\n    />\n  </svg>\n</div>\n```\n"
  },
  {
    "path": "website/docs/charts/voronoi.mdx",
    "content": "---\ntitle: Voronoi\n---\n\nVoronoi charts are used for visualizing proximity and influence by dividing space into distinct regions based on the distance to a set of points.\n\n## Basic\n\nSee the [full API here](/docs/api/victory-voronoi). Typically composed with [`VictoryChart`](/docs/api/victory-chart) to create full charts.\n\n```jsx live\n<VictoryChart\n  domain={{ x: [0, 5], y: [0, 7] }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryVoronoi\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Voronoi - Labels\n\nVoronoi charts can be used to display labels using a `label` property in the dataset or by specifying a function to the `labels` prop.\n\n```jsx live\n<VictoryChart\n  domain={{ x: [0, 5], y: [0, 7] }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryVoronoi\n    data={[\n      { x: 1, y: 2, label: \"Dogs\" },\n      { x: 2, y: 3, label: \"Cats\" },\n      { x: 3, y: 5, label: \"Snakes\" },\n      { x: 4, y: 4, label: \"Rabbits\" },\n      { x: 5, y: 7, label: \"Birds\" },\n    ]}\n  />\n</VictoryChart>\n```\n\n```jsx live\n<VictoryChart\n  domain={{ x: [0, 5], y: [0, 7] }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryVoronoi\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n    labels={({ datum }) =>\n      `y: ${datum.y}`\n    }\n  />\n</VictoryChart>\n```\n\n## Voronoi - Tooltips\n\nTooltips can be added by using a [`VictoryTooltip`](/docs/api/victory-tooltip) component as the `labelComponent`.\n\n```jsx live\n<VictoryChart\n  domain={{ x: [0, 5], y: [0, 7] }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryVoronoi\n    data={[\n      { x: 1, y: 2, label: \"Dogs\" },\n      { x: 2, y: 3, label: \"Cats\" },\n      { x: 3, y: 5, label: \"Snakes\" },\n      { x: 4, y: 4, label: \"Rabbits\" },\n      { x: 5, y: 7, label: \"Birds\" },\n    ]}\n    labels={({ datum }) => datum.y}\n    labelComponent={<VictoryTooltip />}\n  />\n</VictoryChart>\n```\n\n## Voronoi - Circles\n\nVoronoi charts can also be used to display circles around data points.\n\n```jsx live noInline\nconst data = [\n  { x: 1, y: 2 },\n  { x: 2, y: 3 },\n  { x: 3, y: 5 },\n  { x: 4, y: 4 },\n  { x: 5, y: 7 },\n];\n\nfunction App() {\n  return (\n    <VictoryChart\n      domain={{ x: [0, 5], y: [0, 7] }}\n      theme={VictoryTheme.clean}\n    >\n      <VictoryVoronoi\n        data={data}\n        size={50}\n      />\n      <VictoryLine data={data} />\n      <VictoryScatter data={data} />\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n\n## Voronoi - Animation\n\nCharts can be animated by setting the `animate` prop. See the [animations](/docs/guides/animations) guide for more information.\n\n```jsx live noInline\nfunction App() {\n  const [data, setData] =\n    React.useState(getData());\n\n  React.useState(() => {\n    const setStateInterval =\n      window.setInterval(() => {\n        setData(getData());\n      }, 4000);\n\n    return () => {\n      window.clearInterval(\n        setStateInterval,\n      );\n    };\n  }, []);\n\n  return (\n    <VictoryChart\n      theme={VictoryTheme.clean}\n    >\n      <VictoryVoronoi\n        theme={VictoryTheme.clean}\n        animate={{ duration: 1000 }}\n        data={data}\n      />\n      <VictoryScatter\n        theme={VictoryTheme.clean}\n        animate={{ duration: 1000 }}\n        data={data}\n      />\n    </VictoryChart>\n  );\n}\n\nfunction getData() {\n  return _.range(20).map((i: number) => {\n    return {\n      x: _.random(600),\n      y: _.random(600),\n      i,\n    };\n  });\n}\n\nrender(<App />);\n```\n\n## Voronoi - Styles\n\nChart styling can be customized by using the theme or overriding the style prop on the component.\n\n```jsx live\n<VictoryChart\n  domain={{ x: [0, 5], y: [0, 7] }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryVoronoi\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n    style={{\n      data: {\n        stroke: \"#ffffff\",\n        strokeWidth: 2,\n        fill: \"#2299ff\",\n        fillOpacity: 0.7,\n      },\n    }}\n  />\n</VictoryChart>\n```\n\n## Voronoi - Events\n\nEvents can be handled by passing an array of event objects to the `events` prop on the component. Each event object should specify a `target` and an `eventHandlers` object. See the [events](/docs/guides/events) guide for more information.\n\n```jsx live\n<VictoryChart\n  domain={{ x: [0, 5], y: [0, 7] }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryVoronoi\n    events={[\n      {\n        target: \"data\",\n        eventHandlers: {\n          onClick: () => {\n            return [\n              {\n                target: \"data\",\n                mutation: (props) => {\n                  const fill =\n                    props.style &&\n                    props.style.fill;\n                  return fill ===\n                    \"white\"\n                    ? null\n                    : {\n                        style: {\n                          fill: \"white\",\n                        },\n                      };\n                },\n              },\n            ];\n          },\n        },\n      },\n    ]}\n    data={sampleData}\n  />\n</VictoryChart>\n```\n\n## Standalone Rendering\n\nArea charts can be rendered outside a VictoryChart.\n\n```jsx live\n<VictoryVoronoi\n  theme={VictoryTheme.clean}\n  data={[\n    { x: 1, y: 2 },\n    { x: 2, y: 3 },\n    { x: 3, y: 5 },\n    { x: 4, y: 4 },\n    { x: 5, y: 7 },\n  ]}\n/>\n```\n\nThey can also be embeded in other SVG components by using the `standalone` prop.\n\n```jsx live\n<svg\n  width={300}\n  height={300}\n  style={{\n    display: \"block\",\n    margin: \"0 auto\",\n  }}\n>\n  <circle\n    cx={150}\n    cy={150}\n    r={150}\n    fill=\"#9ded91\"\n  />\n  <VictoryVoronoi\n    standalone={false}\n    theme={VictoryTheme.clean}\n    width={300}\n    height={300}\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n  />\n</svg>\n```\n"
  },
  {
    "path": "website/docs/examples/_category_.json",
    "content": "{\n  \"label\": \"Advanced Examples\",\n  \"position\": 4,\n  \"link\": null\n}\n"
  },
  {
    "path": "website/docs/examples/anim-happy-holidays.mdx",
    "content": "---\ntitle: Animation - Happy Holidays\ndescription: Happy Holidays from the Victory Team!\nimage: https://res.cloudinary.com/formidablelabs/image/upload/v1703017786/dotcom/victory/santa.gif\n---\n\n```jsx live noInline\nconst frameRate = 100;\nconst frameHeight = 64;\nconst frameWidth = 64;\nconst sceneHeight = 512;\nconst sceneWidth = 512;\nconst cellStyle = { data: { fill: (args) => args.datum.fill } };\nconst domain = {\n  x: [0, frameWidth],\n  y: [0, frameHeight],\n};\n\nconst santaData = [{\"x\":0,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":22,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":21,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":20,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":19,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":18,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":17,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":16,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":15,\"fill\":\"#0043bf\"},{\"x\":0,\"y\":14,\"fill\":\"#b1c2d1\"},{\"x\":0,\"y\":13,\"fill\":\"#adbecd\"},{\"x\":0,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":0,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":0,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":0,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":0,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":0,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":0,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":0,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":0,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":0,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":0,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":0,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":1,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":22,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":21,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":20,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":19,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":18,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":17,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":16,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":15,\"fill\":\"#0043bf\"},{\"x\":1,\"y\":14,\"fill\":\"#b1c2d1\"},{\"x\":1,\"y\":13,\"fill\":\"#adbecd\"},{\"x\":1,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":1,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":1,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":1,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":1,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":1,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":1,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":1,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":1,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":1,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":1,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":1,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":2,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":62,\"fill\":\"#ffffff\"},{\"x\":2,\"y\":61,\"fill\":\"#ffffff\"},{\"x\":2,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":22,\"fill\":\"#ffffff\"},{\"x\":2,\"y\":21,\"fill\":\"#ffffff\"},{\"x\":2,\"y\":20,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":19,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":18,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":17,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":16,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":15,\"fill\":\"#0043bf\"},{\"x\":2,\"y\":14,\"fill\":\"#b3c4d3\"},{\"x\":2,\"y\":13,\"fill\":\"#b3c4d3\"},{\"x\":2,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":2,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":2,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":2,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":2,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":2,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":2,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":2,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":2,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":2,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":2,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":2,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":3,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":62,\"fill\":\"#ffffff\"},{\"x\":3,\"y\":61,\"fill\":\"#ffffff\"},{\"x\":3,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":22,\"fill\":\"#ffffff\"},{\"x\":3,\"y\":21,\"fill\":\"#ffffff\"},{\"x\":3,\"y\":20,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":19,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":18,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":17,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":16,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":15,\"fill\":\"#0043bf\"},{\"x\":3,\"y\":14,\"fill\":\"#b3c4d3\"},{\"x\":3,\"y\":13,\"fill\":\"#b3c4d3\"},{\"x\":3,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":3,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":3,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":3,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":3,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":3,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":3,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":3,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":3,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":3,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":3,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":3,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":4,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":50,\"fill\":\"#ffffff\"},{\"x\":4,\"y\":49,\"fill\":\"#ffffff\"},{\"x\":4,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":40,\"fill\":\"#ffffff\"},{\"x\":4,\"y\":39,\"fill\":\"#ffffff\"},{\"x\":4,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":22,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":21,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":20,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":19,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":18,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":17,\"fill\":\"#0043bf\"},{\"x\":4,\"y\":16,\"fill\":\"#99b2d1\"},{\"x\":4,\"y\":15,\"fill\":\"#99b2d1\"},{\"x\":4,\"y\":14,\"fill\":\"#ced6d5\"},{\"x\":4,\"y\":13,\"fill\":\"#ced6d5\"},{\"x\":4,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":4,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":4,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":4,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":4,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":4,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":4,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":4,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":4,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":4,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":4,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":4,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":5,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":50,\"fill\":\"#ffffff\"},{\"x\":5,\"y\":49,\"fill\":\"#ffffff\"},{\"x\":5,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":40,\"fill\":\"#ffffff\"},{\"x\":5,\"y\":39,\"fill\":\"#ffffff\"},{\"x\":5,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":22,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":21,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":20,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":19,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":18,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":17,\"fill\":\"#0043bf\"},{\"x\":5,\"y\":16,\"fill\":\"#99b2d1\"},{\"x\":5,\"y\":15,\"fill\":\"#99b2d1\"},{\"x\":5,\"y\":14,\"fill\":\"#ced6d5\"},{\"x\":5,\"y\":13,\"fill\":\"#ced6d5\"},{\"x\":5,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":5,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":5,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":5,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":5,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":5,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":5,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":5,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":5,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":5,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":5,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":5,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":6,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":30,\"fill\":\"#ffffff\"},{\"x\":6,\"y\":29,\"fill\":\"#ffffff\"},{\"x\":6,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":22,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":21,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":20,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":19,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":18,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":17,\"fill\":\"#0043bf\"},{\"x\":6,\"y\":16,\"fill\":\"#b7c7d4\"},{\"x\":6,\"y\":15,\"fill\":\"#b7c7d4\"},{\"x\":6,\"y\":14,\"fill\":\"#e0e1d4\"},{\"x\":6,\"y\":13,\"fill\":\"#e0e1d4\"},{\"x\":6,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":6,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":6,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":6,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":6,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":6,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":6,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":6,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":6,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":6,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":6,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":6,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":7,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":30,\"fill\":\"#ffffff\"},{\"x\":7,\"y\":29,\"fill\":\"#ffffff\"},{\"x\":7,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":22,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":21,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":20,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":19,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":18,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":17,\"fill\":\"#0043bf\"},{\"x\":7,\"y\":16,\"fill\":\"#b7c7d4\"},{\"x\":7,\"y\":15,\"fill\":\"#b7c7d4\"},{\"x\":7,\"y\":14,\"fill\":\"#e0e1d4\"},{\"x\":7,\"y\":13,\"fill\":\"#e0e1d4\"},{\"x\":7,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":7,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":7,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":7,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":7,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":7,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":7,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":7,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":7,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":7,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":7,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":7,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":8,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":38,\"fill\":\"#ffffff\"},{\"x\":8,\"y\":37,\"fill\":\"#ffffff\"},{\"x\":8,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":22,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":21,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":20,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":19,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":18,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":17,\"fill\":\"#0043bf\"},{\"x\":8,\"y\":16,\"fill\":\"#b3c4d3\"},{\"x\":8,\"y\":15,\"fill\":\"#b3c4d3\"},{\"x\":8,\"y\":14,\"fill\":\"#e0e1d4\"},{\"x\":8,\"y\":13,\"fill\":\"#e0e1d4\"},{\"x\":8,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":8,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":8,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":8,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":8,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":8,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":8,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":8,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":8,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":8,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":8,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":8,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":9,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":38,\"fill\":\"#ffffff\"},{\"x\":9,\"y\":37,\"fill\":\"#ffffff\"},{\"x\":9,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":22,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":21,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":20,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":19,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":18,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":17,\"fill\":\"#0043bf\"},{\"x\":9,\"y\":16,\"fill\":\"#b3c4d3\"},{\"x\":9,\"y\":15,\"fill\":\"#b3c4d3\"},{\"x\":9,\"y\":14,\"fill\":\"#e0e1d4\"},{\"x\":9,\"y\":13,\"fill\":\"#e0e1d4\"},{\"x\":9,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":9,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":9,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":9,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":9,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":9,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":9,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":9,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":9,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":9,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":9,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":9,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":10,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":60,\"fill\":\"#ffffff\"},{\"x\":10,\"y\":59,\"fill\":\"#ffffff\"},{\"x\":10,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":22,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":21,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":20,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":19,\"fill\":\"#0043bf\"},{\"x\":10,\"y\":18,\"fill\":\"#99b2d1\"},{\"x\":10,\"y\":17,\"fill\":\"#99b2d1\"},{\"x\":10,\"y\":16,\"fill\":\"#ced6d5\"},{\"x\":10,\"y\":15,\"fill\":\"#ced6d5\"},{\"x\":10,\"y\":14,\"fill\":\"#e0e1d4\"},{\"x\":10,\"y\":13,\"fill\":\"#e0e1d4\"},{\"x\":10,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":10,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":10,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":10,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":10,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":10,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":10,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":10,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":10,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":10,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":10,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":10,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":11,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":60,\"fill\":\"#ffffff\"},{\"x\":11,\"y\":59,\"fill\":\"#ffffff\"},{\"x\":11,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":22,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":21,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":20,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":19,\"fill\":\"#0043bf\"},{\"x\":11,\"y\":18,\"fill\":\"#99b2d1\"},{\"x\":11,\"y\":17,\"fill\":\"#99b2d1\"},{\"x\":11,\"y\":16,\"fill\":\"#ced6d5\"},{\"x\":11,\"y\":15,\"fill\":\"#ced6d5\"},{\"x\":11,\"y\":14,\"fill\":\"#e0e1d4\"},{\"x\":11,\"y\":13,\"fill\":\"#e0e1d4\"},{\"x\":11,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":11,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":11,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":11,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":11,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":11,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":11,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":11,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":11,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":11,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":11,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":11,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":12,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":22,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":21,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":20,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":19,\"fill\":\"#0043bf\"},{\"x\":12,\"y\":18,\"fill\":\"#b7c7d4\"},{\"x\":12,\"y\":17,\"fill\":\"#b7c7d4\"},{\"x\":12,\"y\":16,\"fill\":\"#e0e1d4\"},{\"x\":12,\"y\":15,\"fill\":\"#e0e1d4\"},{\"x\":12,\"y\":14,\"fill\":\"#e0e1d4\"},{\"x\":12,\"y\":13,\"fill\":\"#e0e1d4\"},{\"x\":12,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":12,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":12,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":12,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":12,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":12,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":12,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":12,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":12,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":12,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":12,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":12,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":13,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":22,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":21,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":20,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":19,\"fill\":\"#0043bf\"},{\"x\":13,\"y\":18,\"fill\":\"#b7c7d4\"},{\"x\":13,\"y\":17,\"fill\":\"#b7c7d4\"},{\"x\":13,\"y\":16,\"fill\":\"#e0e1d4\"},{\"x\":13,\"y\":15,\"fill\":\"#e0e1d4\"},{\"x\":13,\"y\":14,\"fill\":\"#e0e1d4\"},{\"x\":13,\"y\":13,\"fill\":\"#e0e1d4\"},{\"x\":13,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":13,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":13,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":13,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":13,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":13,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":13,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":13,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":13,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":13,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":13,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":13,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":14,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":46,\"fill\":\"#ffffff\"},{\"x\":14,\"y\":45,\"fill\":\"#ffffff\"},{\"x\":14,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":22,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":21,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":20,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":19,\"fill\":\"#0043bf\"},{\"x\":14,\"y\":18,\"fill\":\"#b3c4d3\"},{\"x\":14,\"y\":17,\"fill\":\"#b3c4d3\"},{\"x\":14,\"y\":16,\"fill\":\"#000000\"},{\"x\":14,\"y\":15,\"fill\":\"#000000\"},{\"x\":14,\"y\":14,\"fill\":\"#000000\"},{\"x\":14,\"y\":13,\"fill\":\"#000000\"},{\"x\":14,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":14,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":14,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":14,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":14,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":14,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":14,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":14,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":14,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":14,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":14,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":14,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":15,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":46,\"fill\":\"#ffffff\"},{\"x\":15,\"y\":45,\"fill\":\"#ffffff\"},{\"x\":15,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":22,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":21,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":20,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":19,\"fill\":\"#0043bf\"},{\"x\":15,\"y\":18,\"fill\":\"#b3c4d3\"},{\"x\":15,\"y\":17,\"fill\":\"#b3c4d3\"},{\"x\":15,\"y\":16,\"fill\":\"#000000\"},{\"x\":15,\"y\":15,\"fill\":\"#000000\"},{\"x\":15,\"y\":14,\"fill\":\"#000000\"},{\"x\":15,\"y\":13,\"fill\":\"#000000\"},{\"x\":15,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":15,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":15,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":15,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":15,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":15,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":15,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":15,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":15,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":15,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":15,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":15,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":16,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":42,\"fill\":\"#000000\"},{\"x\":16,\"y\":41,\"fill\":\"#000000\"},{\"x\":16,\"y\":40,\"fill\":\"#000000\"},{\"x\":16,\"y\":39,\"fill\":\"#000000\"},{\"x\":16,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":32,\"fill\":\"#000000\"},{\"x\":16,\"y\":31,\"fill\":\"#000000\"},{\"x\":16,\"y\":30,\"fill\":\"#000000\"},{\"x\":16,\"y\":29,\"fill\":\"#000000\"},{\"x\":16,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":22,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":21,\"fill\":\"#0043bf\"},{\"x\":16,\"y\":20,\"fill\":\"#000000\"},{\"x\":16,\"y\":19,\"fill\":\"#000000\"},{\"x\":16,\"y\":18,\"fill\":\"#000000\"},{\"x\":16,\"y\":17,\"fill\":\"#000000\"},{\"x\":16,\"y\":16,\"fill\":\"#dadada\"},{\"x\":16,\"y\":15,\"fill\":\"#dadada\"},{\"x\":16,\"y\":14,\"fill\":\"#dadada\"},{\"x\":16,\"y\":13,\"fill\":\"#dadada\"},{\"x\":16,\"y\":12,\"fill\":\"#000000\"},{\"x\":16,\"y\":11,\"fill\":\"#000000\"},{\"x\":16,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":16,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":16,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":16,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":16,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":16,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":16,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":16,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":16,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":16,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":17,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":42,\"fill\":\"#000000\"},{\"x\":17,\"y\":41,\"fill\":\"#000000\"},{\"x\":17,\"y\":40,\"fill\":\"#000000\"},{\"x\":17,\"y\":39,\"fill\":\"#000000\"},{\"x\":17,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":32,\"fill\":\"#000000\"},{\"x\":17,\"y\":31,\"fill\":\"#000000\"},{\"x\":17,\"y\":30,\"fill\":\"#000000\"},{\"x\":17,\"y\":29,\"fill\":\"#000000\"},{\"x\":17,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":22,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":21,\"fill\":\"#0043bf\"},{\"x\":17,\"y\":20,\"fill\":\"#000000\"},{\"x\":17,\"y\":19,\"fill\":\"#000000\"},{\"x\":17,\"y\":18,\"fill\":\"#000000\"},{\"x\":17,\"y\":17,\"fill\":\"#000000\"},{\"x\":17,\"y\":16,\"fill\":\"#dadada\"},{\"x\":17,\"y\":15,\"fill\":\"#dadada\"},{\"x\":17,\"y\":14,\"fill\":\"#dadada\"},{\"x\":17,\"y\":13,\"fill\":\"#dadada\"},{\"x\":17,\"y\":12,\"fill\":\"#000000\"},{\"x\":17,\"y\":11,\"fill\":\"#000000\"},{\"x\":17,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":17,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":17,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":17,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":17,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":17,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":17,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":17,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":17,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":17,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":18,\"y\":64,\"fill\":\"#ffffff\"},{\"x\":18,\"y\":63,\"fill\":\"#ffffff\"},{\"x\":18,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":18,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":18,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":18,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":18,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":18,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":18,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":18,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":18,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":18,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":18,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":18,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":18,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":18,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":18,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":18,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":18,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":18,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":18,\"y\":44,\"fill\":\"#000000\"},{\"x\":18,\"y\":43,\"fill\":\"#000000\"},{\"x\":18,\"y\":42,\"fill\":\"#dcde99\"},{\"x\":18,\"y\":41,\"fill\":\"#dcde99\"},{\"x\":18,\"y\":40,\"fill\":\"#dcde99\"},{\"x\":18,\"y\":39,\"fill\":\"#dcde99\"},{\"x\":18,\"y\":38,\"fill\":\"#000000\"},{\"x\":18,\"y\":37,\"fill\":\"#000000\"},{\"x\":18,\"y\":36,\"fill\":\"#000000\"},{\"x\":18,\"y\":35,\"fill\":\"#000000\"},{\"x\":18,\"y\":34,\"fill\":\"#000000\"},{\"x\":18,\"y\":33,\"fill\":\"#000000\"},{\"x\":18,\"y\":32,\"fill\":\"#dcde99\"},{\"x\":18,\"y\":31,\"fill\":\"#dcde99\"},{\"x\":18,\"y\":30,\"fill\":\"#dcde99\"},{\"x\":18,\"y\":29,\"fill\":\"#dcde99\"},{\"x\":18,\"y\":28,\"fill\":\"#000000\"},{\"x\":18,\"y\":27,\"fill\":\"#000000\"},{\"x\":18,\"y\":26,\"fill\":\"#000000\"},{\"x\":18,\"y\":25,\"fill\":\"#000000\"},{\"x\":18,\"y\":24,\"fill\":\"#ffffff\"},{\"x\":18,\"y\":23,\"fill\":\"#ffffff\"},{\"x\":18,\"y\":22,\"fill\":\"#000000\"},{\"x\":18,\"y\":21,\"fill\":\"#000000\"},{\"x\":18,\"y\":20,\"fill\":\"#ff0000\"},{\"x\":18,\"y\":19,\"fill\":\"#ff0000\"},{\"x\":18,\"y\":18,\"fill\":\"#ff0000\"},{\"x\":18,\"y\":17,\"fill\":\"#ff0000\"},{\"x\":18,\"y\":16,\"fill\":\"#ffffff\"},{\"x\":18,\"y\":15,\"fill\":\"#ffffff\"},{\"x\":18,\"y\":14,\"fill\":\"#dadada\"},{\"x\":18,\"y\":13,\"fill\":\"#dadada\"},{\"x\":18,\"y\":12,\"fill\":\"#000000\"},{\"x\":18,\"y\":11,\"fill\":\"#000000\"},{\"x\":18,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":18,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":18,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":18,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":18,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":18,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":18,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":18,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":18,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":18,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":19,\"y\":64,\"fill\":\"#ffffff\"},{\"x\":19,\"y\":63,\"fill\":\"#ffffff\"},{\"x\":19,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":19,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":19,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":19,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":19,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":19,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":19,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":19,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":19,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":19,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":19,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":19,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":19,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":19,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":19,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":19,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":19,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":19,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":19,\"y\":44,\"fill\":\"#000000\"},{\"x\":19,\"y\":43,\"fill\":\"#000000\"},{\"x\":19,\"y\":42,\"fill\":\"#dcde99\"},{\"x\":19,\"y\":41,\"fill\":\"#dcde99\"},{\"x\":19,\"y\":40,\"fill\":\"#dcde99\"},{\"x\":19,\"y\":39,\"fill\":\"#dcde99\"},{\"x\":19,\"y\":38,\"fill\":\"#000000\"},{\"x\":19,\"y\":37,\"fill\":\"#000000\"},{\"x\":19,\"y\":36,\"fill\":\"#000000\"},{\"x\":19,\"y\":35,\"fill\":\"#000000\"},{\"x\":19,\"y\":34,\"fill\":\"#000000\"},{\"x\":19,\"y\":33,\"fill\":\"#000000\"},{\"x\":19,\"y\":32,\"fill\":\"#dcde99\"},{\"x\":19,\"y\":31,\"fill\":\"#dcde99\"},{\"x\":19,\"y\":30,\"fill\":\"#dcde99\"},{\"x\":19,\"y\":29,\"fill\":\"#dcde99\"},{\"x\":19,\"y\":28,\"fill\":\"#000000\"},{\"x\":19,\"y\":27,\"fill\":\"#000000\"},{\"x\":19,\"y\":26,\"fill\":\"#000000\"},{\"x\":19,\"y\":25,\"fill\":\"#000000\"},{\"x\":19,\"y\":24,\"fill\":\"#ffffff\"},{\"x\":19,\"y\":23,\"fill\":\"#ffffff\"},{\"x\":19,\"y\":22,\"fill\":\"#000000\"},{\"x\":19,\"y\":21,\"fill\":\"#000000\"},{\"x\":19,\"y\":20,\"fill\":\"#ff0000\"},{\"x\":19,\"y\":19,\"fill\":\"#ff0000\"},{\"x\":19,\"y\":18,\"fill\":\"#ff0000\"},{\"x\":19,\"y\":17,\"fill\":\"#ff0000\"},{\"x\":19,\"y\":16,\"fill\":\"#ffffff\"},{\"x\":19,\"y\":15,\"fill\":\"#ffffff\"},{\"x\":19,\"y\":14,\"fill\":\"#dadada\"},{\"x\":19,\"y\":13,\"fill\":\"#dadada\"},{\"x\":19,\"y\":12,\"fill\":\"#000000\"},{\"x\":19,\"y\":11,\"fill\":\"#000000\"},{\"x\":19,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":19,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":19,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":19,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":19,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":19,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":19,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":19,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":19,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":19,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":20,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":20,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":20,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":20,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":20,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":20,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":20,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":20,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":20,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":20,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":20,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":20,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":20,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":20,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":20,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":20,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":20,\"y\":48,\"fill\":\"#000000\"},{\"x\":20,\"y\":47,\"fill\":\"#000000\"},{\"x\":20,\"y\":46,\"fill\":\"#000000\"},{\"x\":20,\"y\":45,\"fill\":\"#000000\"},{\"x\":20,\"y\":44,\"fill\":\"#000000\"},{\"x\":20,\"y\":43,\"fill\":\"#000000\"},{\"x\":20,\"y\":42,\"fill\":\"#dcde99\"},{\"x\":20,\"y\":41,\"fill\":\"#dcde99\"},{\"x\":20,\"y\":40,\"fill\":\"#dcde99\"},{\"x\":20,\"y\":39,\"fill\":\"#dcde99\"},{\"x\":20,\"y\":38,\"fill\":\"#000000\"},{\"x\":20,\"y\":37,\"fill\":\"#000000\"},{\"x\":20,\"y\":36,\"fill\":\"#dcde99\"},{\"x\":20,\"y\":35,\"fill\":\"#dcde99\"},{\"x\":20,\"y\":34,\"fill\":\"#dcde99\"},{\"x\":20,\"y\":33,\"fill\":\"#dcde99\"},{\"x\":20,\"y\":32,\"fill\":\"#dcde99\"},{\"x\":20,\"y\":31,\"fill\":\"#dcde99\"},{\"x\":20,\"y\":30,\"fill\":\"#dcde99\"},{\"x\":20,\"y\":29,\"fill\":\"#dcde99\"},{\"x\":20,\"y\":28,\"fill\":\"#dcde99\"},{\"x\":20,\"y\":27,\"fill\":\"#dcde99\"},{\"x\":20,\"y\":26,\"fill\":\"#dcde99\"},{\"x\":20,\"y\":25,\"fill\":\"#dcde99\"},{\"x\":20,\"y\":24,\"fill\":\"#000000\"},{\"x\":20,\"y\":23,\"fill\":\"#000000\"},{\"x\":20,\"y\":22,\"fill\":\"#000000\"},{\"x\":20,\"y\":21,\"fill\":\"#000000\"},{\"x\":20,\"y\":20,\"fill\":\"#000000\"},{\"x\":20,\"y\":19,\"fill\":\"#000000\"},{\"x\":20,\"y\":18,\"fill\":\"#000000\"},{\"x\":20,\"y\":17,\"fill\":\"#000000\"},{\"x\":20,\"y\":16,\"fill\":\"#000000\"},{\"x\":20,\"y\":15,\"fill\":\"#000000\"},{\"x\":20,\"y\":14,\"fill\":\"#000000\"},{\"x\":20,\"y\":13,\"fill\":\"#000000\"},{\"x\":20,\"y\":12,\"fill\":\"#000000\"},{\"x\":20,\"y\":11,\"fill\":\"#000000\"},{\"x\":20,\"y\":10,\"fill\":\"#000000\"},{\"x\":20,\"y\":9,\"fill\":\"#000000\"},{\"x\":20,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":20,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":20,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":20,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":20,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":20,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":20,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":20,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":21,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":21,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":21,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":21,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":21,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":21,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":21,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":21,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":21,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":21,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":21,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":21,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":21,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":21,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":21,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":21,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":21,\"y\":48,\"fill\":\"#000000\"},{\"x\":21,\"y\":47,\"fill\":\"#000000\"},{\"x\":21,\"y\":46,\"fill\":\"#000000\"},{\"x\":21,\"y\":45,\"fill\":\"#000000\"},{\"x\":21,\"y\":44,\"fill\":\"#000000\"},{\"x\":21,\"y\":43,\"fill\":\"#000000\"},{\"x\":21,\"y\":42,\"fill\":\"#dcde99\"},{\"x\":21,\"y\":41,\"fill\":\"#dcde99\"},{\"x\":21,\"y\":40,\"fill\":\"#dcde99\"},{\"x\":21,\"y\":39,\"fill\":\"#dcde99\"},{\"x\":21,\"y\":38,\"fill\":\"#000000\"},{\"x\":21,\"y\":37,\"fill\":\"#000000\"},{\"x\":21,\"y\":36,\"fill\":\"#dcde99\"},{\"x\":21,\"y\":35,\"fill\":\"#dcde99\"},{\"x\":21,\"y\":34,\"fill\":\"#dcde99\"},{\"x\":21,\"y\":33,\"fill\":\"#dcde99\"},{\"x\":21,\"y\":32,\"fill\":\"#dcde99\"},{\"x\":21,\"y\":31,\"fill\":\"#dcde99\"},{\"x\":21,\"y\":30,\"fill\":\"#dcde99\"},{\"x\":21,\"y\":29,\"fill\":\"#dcde99\"},{\"x\":21,\"y\":28,\"fill\":\"#dcde99\"},{\"x\":21,\"y\":27,\"fill\":\"#dcde99\"},{\"x\":21,\"y\":26,\"fill\":\"#dcde99\"},{\"x\":21,\"y\":25,\"fill\":\"#dcde99\"},{\"x\":21,\"y\":24,\"fill\":\"#000000\"},{\"x\":21,\"y\":23,\"fill\":\"#000000\"},{\"x\":21,\"y\":22,\"fill\":\"#000000\"},{\"x\":21,\"y\":21,\"fill\":\"#000000\"},{\"x\":21,\"y\":20,\"fill\":\"#000000\"},{\"x\":21,\"y\":19,\"fill\":\"#000000\"},{\"x\":21,\"y\":18,\"fill\":\"#000000\"},{\"x\":21,\"y\":17,\"fill\":\"#000000\"},{\"x\":21,\"y\":16,\"fill\":\"#000000\"},{\"x\":21,\"y\":15,\"fill\":\"#000000\"},{\"x\":21,\"y\":14,\"fill\":\"#000000\"},{\"x\":21,\"y\":13,\"fill\":\"#000000\"},{\"x\":21,\"y\":12,\"fill\":\"#000000\"},{\"x\":21,\"y\":11,\"fill\":\"#000000\"},{\"x\":21,\"y\":10,\"fill\":\"#000000\"},{\"x\":21,\"y\":9,\"fill\":\"#000000\"},{\"x\":21,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":21,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":21,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":21,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":21,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":21,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":21,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":21,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":22,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":22,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":22,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":22,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":22,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":22,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":22,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":22,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":22,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":22,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":22,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":22,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":22,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":22,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":22,\"y\":50,\"fill\":\"#000000\"},{\"x\":22,\"y\":49,\"fill\":\"#000000\"},{\"x\":22,\"y\":48,\"fill\":\"#b33636\"},{\"x\":22,\"y\":47,\"fill\":\"#b33636\"},{\"x\":22,\"y\":46,\"fill\":\"#b33636\"},{\"x\":22,\"y\":45,\"fill\":\"#b33636\"},{\"x\":22,\"y\":44,\"fill\":\"#000000\"},{\"x\":22,\"y\":43,\"fill\":\"#000000\"},{\"x\":22,\"y\":42,\"fill\":\"#fcf9dc\"},{\"x\":22,\"y\":41,\"fill\":\"#fcf9dc\"},{\"x\":22,\"y\":40,\"fill\":\"#dcde99\"},{\"x\":22,\"y\":39,\"fill\":\"#dcde99\"},{\"x\":22,\"y\":38,\"fill\":\"#000000\"},{\"x\":22,\"y\":37,\"fill\":\"#000000\"},{\"x\":22,\"y\":36,\"fill\":\"#fedcb8\"},{\"x\":22,\"y\":35,\"fill\":\"#fedcb8\"},{\"x\":22,\"y\":34,\"fill\":\"#fedcb8\"},{\"x\":22,\"y\":33,\"fill\":\"#fedcb8\"},{\"x\":22,\"y\":32,\"fill\":\"#f8b976\"},{\"x\":22,\"y\":31,\"fill\":\"#f8b976\"},{\"x\":22,\"y\":30,\"fill\":\"#fedcb8\"},{\"x\":22,\"y\":29,\"fill\":\"#fedcb8\"},{\"x\":22,\"y\":28,\"fill\":\"#fcf9dc\"},{\"x\":22,\"y\":27,\"fill\":\"#fcf9dc\"},{\"x\":22,\"y\":26,\"fill\":\"#dcde99\"},{\"x\":22,\"y\":25,\"fill\":\"#dcde99\"},{\"x\":22,\"y\":24,\"fill\":\"#dcde99\"},{\"x\":22,\"y\":23,\"fill\":\"#dcde99\"},{\"x\":22,\"y\":22,\"fill\":\"#000000\"},{\"x\":22,\"y\":21,\"fill\":\"#000000\"},{\"x\":22,\"y\":20,\"fill\":\"#ff0000\"},{\"x\":22,\"y\":19,\"fill\":\"#ff0000\"},{\"x\":22,\"y\":18,\"fill\":\"#ff0000\"},{\"x\":22,\"y\":17,\"fill\":\"#ff0000\"},{\"x\":22,\"y\":16,\"fill\":\"#925c0e\"},{\"x\":22,\"y\":15,\"fill\":\"#925c0e\"},{\"x\":22,\"y\":14,\"fill\":\"#925c0e\"},{\"x\":22,\"y\":13,\"fill\":\"#925c0e\"},{\"x\":22,\"y\":12,\"fill\":\"#d8d5b3\"},{\"x\":22,\"y\":11,\"fill\":\"#d8d5b3\"},{\"x\":22,\"y\":10,\"fill\":\"#000000\"},{\"x\":22,\"y\":9,\"fill\":\"#000000\"},{\"x\":22,\"y\":8,\"fill\":\"#000000\"},{\"x\":22,\"y\":7,\"fill\":\"#000000\"},{\"x\":22,\"y\":6,\"fill\":\"#000000\"},{\"x\":22,\"y\":5,\"fill\":\"#000000\"},{\"x\":22,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":22,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":22,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":22,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":23,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":23,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":23,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":23,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":23,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":23,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":23,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":23,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":23,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":23,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":23,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":23,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":23,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":23,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":23,\"y\":50,\"fill\":\"#000000\"},{\"x\":23,\"y\":49,\"fill\":\"#000000\"},{\"x\":23,\"y\":48,\"fill\":\"#b33636\"},{\"x\":23,\"y\":47,\"fill\":\"#b33636\"},{\"x\":23,\"y\":46,\"fill\":\"#b33636\"},{\"x\":23,\"y\":45,\"fill\":\"#b33636\"},{\"x\":23,\"y\":44,\"fill\":\"#000000\"},{\"x\":23,\"y\":43,\"fill\":\"#000000\"},{\"x\":23,\"y\":42,\"fill\":\"#fcf9dc\"},{\"x\":23,\"y\":41,\"fill\":\"#fcf9dc\"},{\"x\":23,\"y\":40,\"fill\":\"#dcde99\"},{\"x\":23,\"y\":39,\"fill\":\"#dcde99\"},{\"x\":23,\"y\":38,\"fill\":\"#000000\"},{\"x\":23,\"y\":37,\"fill\":\"#000000\"},{\"x\":23,\"y\":36,\"fill\":\"#fedcb8\"},{\"x\":23,\"y\":35,\"fill\":\"#fedcb8\"},{\"x\":23,\"y\":34,\"fill\":\"#fedcb8\"},{\"x\":23,\"y\":33,\"fill\":\"#fedcb8\"},{\"x\":23,\"y\":32,\"fill\":\"#f8b976\"},{\"x\":23,\"y\":31,\"fill\":\"#f8b976\"},{\"x\":23,\"y\":30,\"fill\":\"#fedcb8\"},{\"x\":23,\"y\":29,\"fill\":\"#fedcb8\"},{\"x\":23,\"y\":28,\"fill\":\"#fcf9dc\"},{\"x\":23,\"y\":27,\"fill\":\"#fcf9dc\"},{\"x\":23,\"y\":26,\"fill\":\"#dcde99\"},{\"x\":23,\"y\":25,\"fill\":\"#dcde99\"},{\"x\":23,\"y\":24,\"fill\":\"#dcde99\"},{\"x\":23,\"y\":23,\"fill\":\"#dcde99\"},{\"x\":23,\"y\":22,\"fill\":\"#000000\"},{\"x\":23,\"y\":21,\"fill\":\"#000000\"},{\"x\":23,\"y\":20,\"fill\":\"#ff0000\"},{\"x\":23,\"y\":19,\"fill\":\"#ff0000\"},{\"x\":23,\"y\":18,\"fill\":\"#ff0000\"},{\"x\":23,\"y\":17,\"fill\":\"#ff0000\"},{\"x\":23,\"y\":16,\"fill\":\"#925c0e\"},{\"x\":23,\"y\":15,\"fill\":\"#925c0e\"},{\"x\":23,\"y\":14,\"fill\":\"#925c0e\"},{\"x\":23,\"y\":13,\"fill\":\"#925c0e\"},{\"x\":23,\"y\":12,\"fill\":\"#d8d5b3\"},{\"x\":23,\"y\":11,\"fill\":\"#d8d5b3\"},{\"x\":23,\"y\":10,\"fill\":\"#000000\"},{\"x\":23,\"y\":9,\"fill\":\"#000000\"},{\"x\":23,\"y\":8,\"fill\":\"#000000\"},{\"x\":23,\"y\":7,\"fill\":\"#000000\"},{\"x\":23,\"y\":6,\"fill\":\"#000000\"},{\"x\":23,\"y\":5,\"fill\":\"#000000\"},{\"x\":23,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":23,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":23,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":23,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":24,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":24,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":24,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":24,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":24,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":24,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":24,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":24,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":24,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":24,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":24,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":24,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":24,\"y\":52,\"fill\":\"#000000\"},{\"x\":24,\"y\":51,\"fill\":\"#000000\"},{\"x\":24,\"y\":50,\"fill\":\"#b33636\"},{\"x\":24,\"y\":49,\"fill\":\"#b33636\"},{\"x\":24,\"y\":48,\"fill\":\"#e17070\"},{\"x\":24,\"y\":47,\"fill\":\"#e17070\"},{\"x\":24,\"y\":46,\"fill\":\"#b33636\"},{\"x\":24,\"y\":45,\"fill\":\"#b33636\"},{\"x\":24,\"y\":44,\"fill\":\"#000000\"},{\"x\":24,\"y\":43,\"fill\":\"#000000\"},{\"x\":24,\"y\":42,\"fill\":\"#fcf9dc\"},{\"x\":24,\"y\":41,\"fill\":\"#fcf9dc\"},{\"x\":24,\"y\":40,\"fill\":\"#dcde99\"},{\"x\":24,\"y\":39,\"fill\":\"#dcde99\"},{\"x\":24,\"y\":38,\"fill\":\"#000000\"},{\"x\":24,\"y\":37,\"fill\":\"#000000\"},{\"x\":24,\"y\":36,\"fill\":\"#fedcb8\"},{\"x\":24,\"y\":35,\"fill\":\"#fedcb8\"},{\"x\":24,\"y\":34,\"fill\":\"#000000\"},{\"x\":24,\"y\":33,\"fill\":\"#000000\"},{\"x\":24,\"y\":32,\"fill\":\"#fedcb8\"},{\"x\":24,\"y\":31,\"fill\":\"#fedcb8\"},{\"x\":24,\"y\":30,\"fill\":\"#fcf9dc\"},{\"x\":24,\"y\":29,\"fill\":\"#fcf9dc\"},{\"x\":24,\"y\":28,\"fill\":\"#fcf9dc\"},{\"x\":24,\"y\":27,\"fill\":\"#fcf9dc\"},{\"x\":24,\"y\":26,\"fill\":\"#fcf9dc\"},{\"x\":24,\"y\":25,\"fill\":\"#fcf9dc\"},{\"x\":24,\"y\":24,\"fill\":\"#dcde99\"},{\"x\":24,\"y\":23,\"fill\":\"#dcde99\"},{\"x\":24,\"y\":22,\"fill\":\"#dcde99\"},{\"x\":24,\"y\":21,\"fill\":\"#dcde99\"},{\"x\":24,\"y\":20,\"fill\":\"#000000\"},{\"x\":24,\"y\":19,\"fill\":\"#000000\"},{\"x\":24,\"y\":18,\"fill\":\"#ff0000\"},{\"x\":24,\"y\":17,\"fill\":\"#ff0000\"},{\"x\":24,\"y\":16,\"fill\":\"#925c0e\"},{\"x\":24,\"y\":15,\"fill\":\"#925c0e\"},{\"x\":24,\"y\":14,\"fill\":\"#925c0e\"},{\"x\":24,\"y\":13,\"fill\":\"#925c0e\"},{\"x\":24,\"y\":12,\"fill\":\"#d8d5b3\"},{\"x\":24,\"y\":11,\"fill\":\"#d8d5b3\"},{\"x\":24,\"y\":10,\"fill\":\"#ff0000\"},{\"x\":24,\"y\":9,\"fill\":\"#ff0000\"},{\"x\":24,\"y\":8,\"fill\":\"#925c0e\"},{\"x\":24,\"y\":7,\"fill\":\"#925c0e\"},{\"x\":24,\"y\":6,\"fill\":\"#000000\"},{\"x\":24,\"y\":5,\"fill\":\"#000000\"},{\"x\":24,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":24,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":24,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":24,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":25,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":25,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":25,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":25,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":25,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":25,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":25,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":25,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":25,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":25,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":25,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":25,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":25,\"y\":52,\"fill\":\"#000000\"},{\"x\":25,\"y\":51,\"fill\":\"#000000\"},{\"x\":25,\"y\":50,\"fill\":\"#b33636\"},{\"x\":25,\"y\":49,\"fill\":\"#b33636\"},{\"x\":25,\"y\":48,\"fill\":\"#e17070\"},{\"x\":25,\"y\":47,\"fill\":\"#e17070\"},{\"x\":25,\"y\":46,\"fill\":\"#b33636\"},{\"x\":25,\"y\":45,\"fill\":\"#b33636\"},{\"x\":25,\"y\":44,\"fill\":\"#000000\"},{\"x\":25,\"y\":43,\"fill\":\"#000000\"},{\"x\":25,\"y\":42,\"fill\":\"#fcf9dc\"},{\"x\":25,\"y\":41,\"fill\":\"#fcf9dc\"},{\"x\":25,\"y\":40,\"fill\":\"#dcde99\"},{\"x\":25,\"y\":39,\"fill\":\"#dcde99\"},{\"x\":25,\"y\":38,\"fill\":\"#000000\"},{\"x\":25,\"y\":37,\"fill\":\"#000000\"},{\"x\":25,\"y\":36,\"fill\":\"#fedcb8\"},{\"x\":25,\"y\":35,\"fill\":\"#fedcb8\"},{\"x\":25,\"y\":34,\"fill\":\"#000000\"},{\"x\":25,\"y\":33,\"fill\":\"#000000\"},{\"x\":25,\"y\":32,\"fill\":\"#fedcb8\"},{\"x\":25,\"y\":31,\"fill\":\"#fedcb8\"},{\"x\":25,\"y\":30,\"fill\":\"#fcf9dc\"},{\"x\":25,\"y\":29,\"fill\":\"#fcf9dc\"},{\"x\":25,\"y\":28,\"fill\":\"#fcf9dc\"},{\"x\":25,\"y\":27,\"fill\":\"#fcf9dc\"},{\"x\":25,\"y\":26,\"fill\":\"#fcf9dc\"},{\"x\":25,\"y\":25,\"fill\":\"#fcf9dc\"},{\"x\":25,\"y\":24,\"fill\":\"#dcde99\"},{\"x\":25,\"y\":23,\"fill\":\"#dcde99\"},{\"x\":25,\"y\":22,\"fill\":\"#dcde99\"},{\"x\":25,\"y\":21,\"fill\":\"#dcde99\"},{\"x\":25,\"y\":20,\"fill\":\"#000000\"},{\"x\":25,\"y\":19,\"fill\":\"#000000\"},{\"x\":25,\"y\":18,\"fill\":\"#ff0000\"},{\"x\":25,\"y\":17,\"fill\":\"#ff0000\"},{\"x\":25,\"y\":16,\"fill\":\"#925c0e\"},{\"x\":25,\"y\":15,\"fill\":\"#925c0e\"},{\"x\":25,\"y\":14,\"fill\":\"#925c0e\"},{\"x\":25,\"y\":13,\"fill\":\"#925c0e\"},{\"x\":25,\"y\":12,\"fill\":\"#d8d5b3\"},{\"x\":25,\"y\":11,\"fill\":\"#d8d5b3\"},{\"x\":25,\"y\":10,\"fill\":\"#ff0000\"},{\"x\":25,\"y\":9,\"fill\":\"#ff0000\"},{\"x\":25,\"y\":8,\"fill\":\"#925c0e\"},{\"x\":25,\"y\":7,\"fill\":\"#925c0e\"},{\"x\":25,\"y\":6,\"fill\":\"#000000\"},{\"x\":25,\"y\":5,\"fill\":\"#000000\"},{\"x\":25,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":25,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":25,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":25,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":26,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":26,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":26,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":26,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":26,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":26,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":26,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":26,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":26,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":26,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":26,\"y\":54,\"fill\":\"#000000\"},{\"x\":26,\"y\":53,\"fill\":\"#000000\"},{\"x\":26,\"y\":52,\"fill\":\"#b33636\"},{\"x\":26,\"y\":51,\"fill\":\"#b33636\"},{\"x\":26,\"y\":50,\"fill\":\"#e17070\"},{\"x\":26,\"y\":49,\"fill\":\"#e17070\"},{\"x\":26,\"y\":48,\"fill\":\"#e17070\"},{\"x\":26,\"y\":47,\"fill\":\"#e17070\"},{\"x\":26,\"y\":46,\"fill\":\"#b33636\"},{\"x\":26,\"y\":45,\"fill\":\"#b33636\"},{\"x\":26,\"y\":44,\"fill\":\"#000000\"},{\"x\":26,\"y\":43,\"fill\":\"#000000\"},{\"x\":26,\"y\":42,\"fill\":\"#fcf9dc\"},{\"x\":26,\"y\":41,\"fill\":\"#fcf9dc\"},{\"x\":26,\"y\":40,\"fill\":\"#dcde99\"},{\"x\":26,\"y\":39,\"fill\":\"#dcde99\"},{\"x\":26,\"y\":38,\"fill\":\"#000000\"},{\"x\":26,\"y\":37,\"fill\":\"#000000\"},{\"x\":26,\"y\":36,\"fill\":\"#fedcb8\"},{\"x\":26,\"y\":35,\"fill\":\"#fedcb8\"},{\"x\":26,\"y\":34,\"fill\":\"#fedcb8\"},{\"x\":26,\"y\":33,\"fill\":\"#fedcb8\"},{\"x\":26,\"y\":32,\"fill\":\"#fcf9dc\"},{\"x\":26,\"y\":31,\"fill\":\"#fcf9dc\"},{\"x\":26,\"y\":30,\"fill\":\"#000000\"},{\"x\":26,\"y\":29,\"fill\":\"#000000\"},{\"x\":26,\"y\":28,\"fill\":\"#fedcb8\"},{\"x\":26,\"y\":27,\"fill\":\"#fedcb8\"},{\"x\":26,\"y\":26,\"fill\":\"#fcf9dc\"},{\"x\":26,\"y\":25,\"fill\":\"#fcf9dc\"},{\"x\":26,\"y\":24,\"fill\":\"#fcf9dc\"},{\"x\":26,\"y\":23,\"fill\":\"#fcf9dc\"},{\"x\":26,\"y\":22,\"fill\":\"#dcde99\"},{\"x\":26,\"y\":21,\"fill\":\"#dcde99\"},{\"x\":26,\"y\":20,\"fill\":\"#000000\"},{\"x\":26,\"y\":19,\"fill\":\"#000000\"},{\"x\":26,\"y\":18,\"fill\":\"#ff0000\"},{\"x\":26,\"y\":17,\"fill\":\"#ff0000\"},{\"x\":26,\"y\":16,\"fill\":\"#f5e975\"},{\"x\":26,\"y\":15,\"fill\":\"#f5e975\"},{\"x\":26,\"y\":14,\"fill\":\"#f5e975\"},{\"x\":26,\"y\":13,\"fill\":\"#f5e975\"},{\"x\":26,\"y\":12,\"fill\":\"#fcf9dc\"},{\"x\":26,\"y\":11,\"fill\":\"#fcf9dc\"},{\"x\":26,\"y\":10,\"fill\":\"#ff0000\"},{\"x\":26,\"y\":9,\"fill\":\"#ff0000\"},{\"x\":26,\"y\":8,\"fill\":\"#000000\"},{\"x\":26,\"y\":7,\"fill\":\"#000000\"},{\"x\":26,\"y\":6,\"fill\":\"#000000\"},{\"x\":26,\"y\":5,\"fill\":\"#000000\"},{\"x\":26,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":26,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":26,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":26,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":27,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":27,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":27,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":27,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":27,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":27,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":27,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":27,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":27,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":27,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":27,\"y\":54,\"fill\":\"#000000\"},{\"x\":27,\"y\":53,\"fill\":\"#000000\"},{\"x\":27,\"y\":52,\"fill\":\"#b33636\"},{\"x\":27,\"y\":51,\"fill\":\"#b33636\"},{\"x\":27,\"y\":50,\"fill\":\"#e17070\"},{\"x\":27,\"y\":49,\"fill\":\"#e17070\"},{\"x\":27,\"y\":48,\"fill\":\"#e17070\"},{\"x\":27,\"y\":47,\"fill\":\"#e17070\"},{\"x\":27,\"y\":46,\"fill\":\"#b33636\"},{\"x\":27,\"y\":45,\"fill\":\"#b33636\"},{\"x\":27,\"y\":44,\"fill\":\"#000000\"},{\"x\":27,\"y\":43,\"fill\":\"#000000\"},{\"x\":27,\"y\":42,\"fill\":\"#fcf9dc\"},{\"x\":27,\"y\":41,\"fill\":\"#fcf9dc\"},{\"x\":27,\"y\":40,\"fill\":\"#dcde99\"},{\"x\":27,\"y\":39,\"fill\":\"#dcde99\"},{\"x\":27,\"y\":38,\"fill\":\"#000000\"},{\"x\":27,\"y\":37,\"fill\":\"#000000\"},{\"x\":27,\"y\":36,\"fill\":\"#fedcb8\"},{\"x\":27,\"y\":35,\"fill\":\"#fedcb8\"},{\"x\":27,\"y\":34,\"fill\":\"#fedcb8\"},{\"x\":27,\"y\":33,\"fill\":\"#fedcb8\"},{\"x\":27,\"y\":32,\"fill\":\"#fcf9dc\"},{\"x\":27,\"y\":31,\"fill\":\"#fcf9dc\"},{\"x\":27,\"y\":30,\"fill\":\"#000000\"},{\"x\":27,\"y\":29,\"fill\":\"#000000\"},{\"x\":27,\"y\":28,\"fill\":\"#fedcb8\"},{\"x\":27,\"y\":27,\"fill\":\"#fedcb8\"},{\"x\":27,\"y\":26,\"fill\":\"#fcf9dc\"},{\"x\":27,\"y\":25,\"fill\":\"#fcf9dc\"},{\"x\":27,\"y\":24,\"fill\":\"#fcf9dc\"},{\"x\":27,\"y\":23,\"fill\":\"#fcf9dc\"},{\"x\":27,\"y\":22,\"fill\":\"#dcde99\"},{\"x\":27,\"y\":21,\"fill\":\"#dcde99\"},{\"x\":27,\"y\":20,\"fill\":\"#000000\"},{\"x\":27,\"y\":19,\"fill\":\"#000000\"},{\"x\":27,\"y\":18,\"fill\":\"#ff0000\"},{\"x\":27,\"y\":17,\"fill\":\"#ff0000\"},{\"x\":27,\"y\":16,\"fill\":\"#f5e975\"},{\"x\":27,\"y\":15,\"fill\":\"#f5e975\"},{\"x\":27,\"y\":14,\"fill\":\"#f5e975\"},{\"x\":27,\"y\":13,\"fill\":\"#f5e975\"},{\"x\":27,\"y\":12,\"fill\":\"#fcf9dc\"},{\"x\":27,\"y\":11,\"fill\":\"#fcf9dc\"},{\"x\":27,\"y\":10,\"fill\":\"#ff0000\"},{\"x\":27,\"y\":9,\"fill\":\"#ff0000\"},{\"x\":27,\"y\":8,\"fill\":\"#000000\"},{\"x\":27,\"y\":7,\"fill\":\"#000000\"},{\"x\":27,\"y\":6,\"fill\":\"#000000\"},{\"x\":27,\"y\":5,\"fill\":\"#000000\"},{\"x\":27,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":27,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":27,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":27,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":28,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":28,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":28,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":28,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":28,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":28,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":28,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":28,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":28,\"y\":56,\"fill\":\"#000000\"},{\"x\":28,\"y\":55,\"fill\":\"#000000\"},{\"x\":28,\"y\":54,\"fill\":\"#b33636\"},{\"x\":28,\"y\":53,\"fill\":\"#b33636\"},{\"x\":28,\"y\":52,\"fill\":\"#e17070\"},{\"x\":28,\"y\":51,\"fill\":\"#e17070\"},{\"x\":28,\"y\":50,\"fill\":\"#ff0000\"},{\"x\":28,\"y\":49,\"fill\":\"#ff0000\"},{\"x\":28,\"y\":48,\"fill\":\"#e17070\"},{\"x\":28,\"y\":47,\"fill\":\"#e17070\"},{\"x\":28,\"y\":46,\"fill\":\"#e17070\"},{\"x\":28,\"y\":45,\"fill\":\"#e17070\"},{\"x\":28,\"y\":44,\"fill\":\"#000000\"},{\"x\":28,\"y\":43,\"fill\":\"#000000\"},{\"x\":28,\"y\":42,\"fill\":\"#fcf9dc\"},{\"x\":28,\"y\":41,\"fill\":\"#fcf9dc\"},{\"x\":28,\"y\":40,\"fill\":\"#dcde99\"},{\"x\":28,\"y\":39,\"fill\":\"#dcde99\"},{\"x\":28,\"y\":38,\"fill\":\"#000000\"},{\"x\":28,\"y\":37,\"fill\":\"#000000\"},{\"x\":28,\"y\":36,\"fill\":\"#fedcb8\"},{\"x\":28,\"y\":35,\"fill\":\"#fedcb8\"},{\"x\":28,\"y\":34,\"fill\":\"#fedcb8\"},{\"x\":28,\"y\":33,\"fill\":\"#fedcb8\"},{\"x\":28,\"y\":32,\"fill\":\"#fcf9dc\"},{\"x\":28,\"y\":31,\"fill\":\"#fcf9dc\"},{\"x\":28,\"y\":30,\"fill\":\"#000000\"},{\"x\":28,\"y\":29,\"fill\":\"#000000\"},{\"x\":28,\"y\":28,\"fill\":\"#fedcb8\"},{\"x\":28,\"y\":27,\"fill\":\"#fedcb8\"},{\"x\":28,\"y\":26,\"fill\":\"#fcf9dc\"},{\"x\":28,\"y\":25,\"fill\":\"#fcf9dc\"},{\"x\":28,\"y\":24,\"fill\":\"#fcf9dc\"},{\"x\":28,\"y\":23,\"fill\":\"#fcf9dc\"},{\"x\":28,\"y\":22,\"fill\":\"#dcde99\"},{\"x\":28,\"y\":21,\"fill\":\"#dcde99\"},{\"x\":28,\"y\":20,\"fill\":\"#dcde99\"},{\"x\":28,\"y\":19,\"fill\":\"#dcde99\"},{\"x\":28,\"y\":18,\"fill\":\"#000000\"},{\"x\":28,\"y\":17,\"fill\":\"#000000\"},{\"x\":28,\"y\":16,\"fill\":\"#f5e975\"},{\"x\":28,\"y\":15,\"fill\":\"#f5e975\"},{\"x\":28,\"y\":14,\"fill\":\"#835108\"},{\"x\":28,\"y\":13,\"fill\":\"#835108\"},{\"x\":28,\"y\":12,\"fill\":\"#ff0000\"},{\"x\":28,\"y\":11,\"fill\":\"#ff0000\"},{\"x\":28,\"y\":10,\"fill\":\"#000000\"},{\"x\":28,\"y\":9,\"fill\":\"#000000\"},{\"x\":28,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":28,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":28,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":28,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":28,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":28,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":28,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":28,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":29,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":29,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":29,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":29,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":29,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":29,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":29,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":29,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":29,\"y\":56,\"fill\":\"#000000\"},{\"x\":29,\"y\":55,\"fill\":\"#000000\"},{\"x\":29,\"y\":54,\"fill\":\"#b33636\"},{\"x\":29,\"y\":53,\"fill\":\"#b33636\"},{\"x\":29,\"y\":52,\"fill\":\"#e17070\"},{\"x\":29,\"y\":51,\"fill\":\"#e17070\"},{\"x\":29,\"y\":50,\"fill\":\"#ff0000\"},{\"x\":29,\"y\":49,\"fill\":\"#ff0000\"},{\"x\":29,\"y\":48,\"fill\":\"#e17070\"},{\"x\":29,\"y\":47,\"fill\":\"#e17070\"},{\"x\":29,\"y\":46,\"fill\":\"#e17070\"},{\"x\":29,\"y\":45,\"fill\":\"#e17070\"},{\"x\":29,\"y\":44,\"fill\":\"#000000\"},{\"x\":29,\"y\":43,\"fill\":\"#000000\"},{\"x\":29,\"y\":42,\"fill\":\"#fcf9dc\"},{\"x\":29,\"y\":41,\"fill\":\"#fcf9dc\"},{\"x\":29,\"y\":40,\"fill\":\"#dcde99\"},{\"x\":29,\"y\":39,\"fill\":\"#dcde99\"},{\"x\":29,\"y\":38,\"fill\":\"#000000\"},{\"x\":29,\"y\":37,\"fill\":\"#000000\"},{\"x\":29,\"y\":36,\"fill\":\"#fedcb8\"},{\"x\":29,\"y\":35,\"fill\":\"#fedcb8\"},{\"x\":29,\"y\":34,\"fill\":\"#fedcb8\"},{\"x\":29,\"y\":33,\"fill\":\"#fedcb8\"},{\"x\":29,\"y\":32,\"fill\":\"#fcf9dc\"},{\"x\":29,\"y\":31,\"fill\":\"#fcf9dc\"},{\"x\":29,\"y\":30,\"fill\":\"#000000\"},{\"x\":29,\"y\":29,\"fill\":\"#000000\"},{\"x\":29,\"y\":28,\"fill\":\"#fedcb8\"},{\"x\":29,\"y\":27,\"fill\":\"#fedcb8\"},{\"x\":29,\"y\":26,\"fill\":\"#fcf9dc\"},{\"x\":29,\"y\":25,\"fill\":\"#fcf9dc\"},{\"x\":29,\"y\":24,\"fill\":\"#fcf9dc\"},{\"x\":29,\"y\":23,\"fill\":\"#fcf9dc\"},{\"x\":29,\"y\":22,\"fill\":\"#dcde99\"},{\"x\":29,\"y\":21,\"fill\":\"#dcde99\"},{\"x\":29,\"y\":20,\"fill\":\"#dcde99\"},{\"x\":29,\"y\":19,\"fill\":\"#dcde99\"},{\"x\":29,\"y\":18,\"fill\":\"#000000\"},{\"x\":29,\"y\":17,\"fill\":\"#000000\"},{\"x\":29,\"y\":16,\"fill\":\"#f5e975\"},{\"x\":29,\"y\":15,\"fill\":\"#f5e975\"},{\"x\":29,\"y\":14,\"fill\":\"#835108\"},{\"x\":29,\"y\":13,\"fill\":\"#835108\"},{\"x\":29,\"y\":12,\"fill\":\"#ff0000\"},{\"x\":29,\"y\":11,\"fill\":\"#ff0000\"},{\"x\":29,\"y\":10,\"fill\":\"#000000\"},{\"x\":29,\"y\":9,\"fill\":\"#000000\"},{\"x\":29,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":29,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":29,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":29,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":29,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":29,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":29,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":29,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":30,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":30,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":30,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":30,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":30,\"y\":60,\"fill\":\"#ffffff\"},{\"x\":30,\"y\":59,\"fill\":\"#ffffff\"},{\"x\":30,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":30,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":30,\"y\":56,\"fill\":\"#000000\"},{\"x\":30,\"y\":55,\"fill\":\"#000000\"},{\"x\":30,\"y\":54,\"fill\":\"#b33636\"},{\"x\":30,\"y\":53,\"fill\":\"#b33636\"},{\"x\":30,\"y\":52,\"fill\":\"#e17070\"},{\"x\":30,\"y\":51,\"fill\":\"#e17070\"},{\"x\":30,\"y\":50,\"fill\":\"#ff0000\"},{\"x\":30,\"y\":49,\"fill\":\"#ff0000\"},{\"x\":30,\"y\":48,\"fill\":\"#ff0000\"},{\"x\":30,\"y\":47,\"fill\":\"#ff0000\"},{\"x\":30,\"y\":46,\"fill\":\"#e17070\"},{\"x\":30,\"y\":45,\"fill\":\"#e17070\"},{\"x\":30,\"y\":44,\"fill\":\"#000000\"},{\"x\":30,\"y\":43,\"fill\":\"#000000\"},{\"x\":30,\"y\":42,\"fill\":\"#fcf9dc\"},{\"x\":30,\"y\":41,\"fill\":\"#fcf9dc\"},{\"x\":30,\"y\":40,\"fill\":\"#dcde99\"},{\"x\":30,\"y\":39,\"fill\":\"#dcde99\"},{\"x\":30,\"y\":38,\"fill\":\"#000000\"},{\"x\":30,\"y\":37,\"fill\":\"#000000\"},{\"x\":30,\"y\":36,\"fill\":\"#fedcb8\"},{\"x\":30,\"y\":35,\"fill\":\"#fedcb8\"},{\"x\":30,\"y\":34,\"fill\":\"#fedcb8\"},{\"x\":30,\"y\":33,\"fill\":\"#fedcb8\"},{\"x\":30,\"y\":32,\"fill\":\"#fcf9dc\"},{\"x\":30,\"y\":31,\"fill\":\"#fcf9dc\"},{\"x\":30,\"y\":30,\"fill\":\"#000000\"},{\"x\":30,\"y\":29,\"fill\":\"#000000\"},{\"x\":30,\"y\":28,\"fill\":\"#fedcb8\"},{\"x\":30,\"y\":27,\"fill\":\"#fedcb8\"},{\"x\":30,\"y\":26,\"fill\":\"#fcf9dc\"},{\"x\":30,\"y\":25,\"fill\":\"#fcf9dc\"},{\"x\":30,\"y\":24,\"fill\":\"#fcf9dc\"},{\"x\":30,\"y\":23,\"fill\":\"#fcf9dc\"},{\"x\":30,\"y\":22,\"fill\":\"#fcf9dc\"},{\"x\":30,\"y\":21,\"fill\":\"#fcf9dc\"},{\"x\":30,\"y\":20,\"fill\":\"#dcde99\"},{\"x\":30,\"y\":19,\"fill\":\"#dcde99\"},{\"x\":30,\"y\":18,\"fill\":\"#000000\"},{\"x\":30,\"y\":17,\"fill\":\"#000000\"},{\"x\":30,\"y\":16,\"fill\":\"#f5e975\"},{\"x\":30,\"y\":15,\"fill\":\"#f5e975\"},{\"x\":30,\"y\":14,\"fill\":\"#f5e975\"},{\"x\":30,\"y\":13,\"fill\":\"#f5e975\"},{\"x\":30,\"y\":12,\"fill\":\"#fcf9dc\"},{\"x\":30,\"y\":11,\"fill\":\"#fcf9dc\"},{\"x\":30,\"y\":10,\"fill\":\"#000000\"},{\"x\":30,\"y\":9,\"fill\":\"#000000\"},{\"x\":30,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":30,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":30,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":30,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":30,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":30,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":30,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":30,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":31,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":31,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":31,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":31,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":31,\"y\":60,\"fill\":\"#ffffff\"},{\"x\":31,\"y\":59,\"fill\":\"#ffffff\"},{\"x\":31,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":31,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":31,\"y\":56,\"fill\":\"#000000\"},{\"x\":31,\"y\":55,\"fill\":\"#000000\"},{\"x\":31,\"y\":54,\"fill\":\"#b33636\"},{\"x\":31,\"y\":53,\"fill\":\"#b33636\"},{\"x\":31,\"y\":52,\"fill\":\"#e17070\"},{\"x\":31,\"y\":51,\"fill\":\"#e17070\"},{\"x\":31,\"y\":50,\"fill\":\"#ff0000\"},{\"x\":31,\"y\":49,\"fill\":\"#ff0000\"},{\"x\":31,\"y\":48,\"fill\":\"#ff0000\"},{\"x\":31,\"y\":47,\"fill\":\"#ff0000\"},{\"x\":31,\"y\":46,\"fill\":\"#e17070\"},{\"x\":31,\"y\":45,\"fill\":\"#e17070\"},{\"x\":31,\"y\":44,\"fill\":\"#000000\"},{\"x\":31,\"y\":43,\"fill\":\"#000000\"},{\"x\":31,\"y\":42,\"fill\":\"#fcf9dc\"},{\"x\":31,\"y\":41,\"fill\":\"#fcf9dc\"},{\"x\":31,\"y\":40,\"fill\":\"#dcde99\"},{\"x\":31,\"y\":39,\"fill\":\"#dcde99\"},{\"x\":31,\"y\":38,\"fill\":\"#000000\"},{\"x\":31,\"y\":37,\"fill\":\"#000000\"},{\"x\":31,\"y\":36,\"fill\":\"#fedcb8\"},{\"x\":31,\"y\":35,\"fill\":\"#fedcb8\"},{\"x\":31,\"y\":34,\"fill\":\"#fedcb8\"},{\"x\":31,\"y\":33,\"fill\":\"#fedcb8\"},{\"x\":31,\"y\":32,\"fill\":\"#fcf9dc\"},{\"x\":31,\"y\":31,\"fill\":\"#fcf9dc\"},{\"x\":31,\"y\":30,\"fill\":\"#000000\"},{\"x\":31,\"y\":29,\"fill\":\"#000000\"},{\"x\":31,\"y\":28,\"fill\":\"#fedcb8\"},{\"x\":31,\"y\":27,\"fill\":\"#fedcb8\"},{\"x\":31,\"y\":26,\"fill\":\"#fcf9dc\"},{\"x\":31,\"y\":25,\"fill\":\"#fcf9dc\"},{\"x\":31,\"y\":24,\"fill\":\"#fcf9dc\"},{\"x\":31,\"y\":23,\"fill\":\"#fcf9dc\"},{\"x\":31,\"y\":22,\"fill\":\"#fcf9dc\"},{\"x\":31,\"y\":21,\"fill\":\"#fcf9dc\"},{\"x\":31,\"y\":20,\"fill\":\"#dcde99\"},{\"x\":31,\"y\":19,\"fill\":\"#dcde99\"},{\"x\":31,\"y\":18,\"fill\":\"#000000\"},{\"x\":31,\"y\":17,\"fill\":\"#000000\"},{\"x\":31,\"y\":16,\"fill\":\"#f5e975\"},{\"x\":31,\"y\":15,\"fill\":\"#f5e975\"},{\"x\":31,\"y\":14,\"fill\":\"#f5e975\"},{\"x\":31,\"y\":13,\"fill\":\"#f5e975\"},{\"x\":31,\"y\":12,\"fill\":\"#fcf9dc\"},{\"x\":31,\"y\":11,\"fill\":\"#fcf9dc\"},{\"x\":31,\"y\":10,\"fill\":\"#000000\"},{\"x\":31,\"y\":9,\"fill\":\"#000000\"},{\"x\":31,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":31,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":31,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":31,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":31,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":31,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":31,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":31,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":32,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":32,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":32,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":32,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":32,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":32,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":32,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":32,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":32,\"y\":56,\"fill\":\"#000000\"},{\"x\":32,\"y\":55,\"fill\":\"#000000\"},{\"x\":32,\"y\":54,\"fill\":\"#b33636\"},{\"x\":32,\"y\":53,\"fill\":\"#b33636\"},{\"x\":32,\"y\":52,\"fill\":\"#e17070\"},{\"x\":32,\"y\":51,\"fill\":\"#e17070\"},{\"x\":32,\"y\":50,\"fill\":\"#ff0000\"},{\"x\":32,\"y\":49,\"fill\":\"#ff0000\"},{\"x\":32,\"y\":48,\"fill\":\"#ff0000\"},{\"x\":32,\"y\":47,\"fill\":\"#ff0000\"},{\"x\":32,\"y\":46,\"fill\":\"#e17070\"},{\"x\":32,\"y\":45,\"fill\":\"#e17070\"},{\"x\":32,\"y\":44,\"fill\":\"#000000\"},{\"x\":32,\"y\":43,\"fill\":\"#000000\"},{\"x\":32,\"y\":42,\"fill\":\"#fcf9dc\"},{\"x\":32,\"y\":41,\"fill\":\"#fcf9dc\"},{\"x\":32,\"y\":40,\"fill\":\"#dcde99\"},{\"x\":32,\"y\":39,\"fill\":\"#dcde99\"},{\"x\":32,\"y\":38,\"fill\":\"#000000\"},{\"x\":32,\"y\":37,\"fill\":\"#000000\"},{\"x\":32,\"y\":36,\"fill\":\"#fedcb8\"},{\"x\":32,\"y\":35,\"fill\":\"#fedcb8\"},{\"x\":32,\"y\":34,\"fill\":\"#000000\"},{\"x\":32,\"y\":33,\"fill\":\"#000000\"},{\"x\":32,\"y\":32,\"fill\":\"#fedcb8\"},{\"x\":32,\"y\":31,\"fill\":\"#fedcb8\"},{\"x\":32,\"y\":30,\"fill\":\"#fcf9dc\"},{\"x\":32,\"y\":29,\"fill\":\"#fcf9dc\"},{\"x\":32,\"y\":28,\"fill\":\"#fcf9dc\"},{\"x\":32,\"y\":27,\"fill\":\"#fcf9dc\"},{\"x\":32,\"y\":26,\"fill\":\"#fcf9dc\"},{\"x\":32,\"y\":25,\"fill\":\"#fcf9dc\"},{\"x\":32,\"y\":24,\"fill\":\"#fcf9dc\"},{\"x\":32,\"y\":23,\"fill\":\"#fcf9dc\"},{\"x\":32,\"y\":22,\"fill\":\"#fcf9dc\"},{\"x\":32,\"y\":21,\"fill\":\"#fcf9dc\"},{\"x\":32,\"y\":20,\"fill\":\"#000000\"},{\"x\":32,\"y\":19,\"fill\":\"#000000\"},{\"x\":32,\"y\":18,\"fill\":\"#000000\"},{\"x\":32,\"y\":17,\"fill\":\"#000000\"},{\"x\":32,\"y\":16,\"fill\":\"#925c0e\"},{\"x\":32,\"y\":15,\"fill\":\"#925c0e\"},{\"x\":32,\"y\":14,\"fill\":\"#925c0e\"},{\"x\":32,\"y\":13,\"fill\":\"#925c0e\"},{\"x\":32,\"y\":12,\"fill\":\"#fcf9dc\"},{\"x\":32,\"y\":11,\"fill\":\"#fcf9dc\"},{\"x\":32,\"y\":10,\"fill\":\"#ff0000\"},{\"x\":32,\"y\":9,\"fill\":\"#ff0000\"},{\"x\":32,\"y\":8,\"fill\":\"#000000\"},{\"x\":32,\"y\":7,\"fill\":\"#000000\"},{\"x\":32,\"y\":6,\"fill\":\"#000000\"},{\"x\":32,\"y\":5,\"fill\":\"#000000\"},{\"x\":32,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":32,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":32,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":32,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":33,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":33,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":33,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":33,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":33,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":33,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":33,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":33,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":33,\"y\":56,\"fill\":\"#000000\"},{\"x\":33,\"y\":55,\"fill\":\"#000000\"},{\"x\":33,\"y\":54,\"fill\":\"#b33636\"},{\"x\":33,\"y\":53,\"fill\":\"#b33636\"},{\"x\":33,\"y\":52,\"fill\":\"#e17070\"},{\"x\":33,\"y\":51,\"fill\":\"#e17070\"},{\"x\":33,\"y\":50,\"fill\":\"#ff0000\"},{\"x\":33,\"y\":49,\"fill\":\"#ff0000\"},{\"x\":33,\"y\":48,\"fill\":\"#ff0000\"},{\"x\":33,\"y\":47,\"fill\":\"#ff0000\"},{\"x\":33,\"y\":46,\"fill\":\"#e17070\"},{\"x\":33,\"y\":45,\"fill\":\"#e17070\"},{\"x\":33,\"y\":44,\"fill\":\"#000000\"},{\"x\":33,\"y\":43,\"fill\":\"#000000\"},{\"x\":33,\"y\":42,\"fill\":\"#fcf9dc\"},{\"x\":33,\"y\":41,\"fill\":\"#fcf9dc\"},{\"x\":33,\"y\":40,\"fill\":\"#dcde99\"},{\"x\":33,\"y\":39,\"fill\":\"#dcde99\"},{\"x\":33,\"y\":38,\"fill\":\"#000000\"},{\"x\":33,\"y\":37,\"fill\":\"#000000\"},{\"x\":33,\"y\":36,\"fill\":\"#fedcb8\"},{\"x\":33,\"y\":35,\"fill\":\"#fedcb8\"},{\"x\":33,\"y\":34,\"fill\":\"#000000\"},{\"x\":33,\"y\":33,\"fill\":\"#000000\"},{\"x\":33,\"y\":32,\"fill\":\"#fedcb8\"},{\"x\":33,\"y\":31,\"fill\":\"#fedcb8\"},{\"x\":33,\"y\":30,\"fill\":\"#fcf9dc\"},{\"x\":33,\"y\":29,\"fill\":\"#fcf9dc\"},{\"x\":33,\"y\":28,\"fill\":\"#fcf9dc\"},{\"x\":33,\"y\":27,\"fill\":\"#fcf9dc\"},{\"x\":33,\"y\":26,\"fill\":\"#fcf9dc\"},{\"x\":33,\"y\":25,\"fill\":\"#fcf9dc\"},{\"x\":33,\"y\":24,\"fill\":\"#fcf9dc\"},{\"x\":33,\"y\":23,\"fill\":\"#fcf9dc\"},{\"x\":33,\"y\":22,\"fill\":\"#fcf9dc\"},{\"x\":33,\"y\":21,\"fill\":\"#fcf9dc\"},{\"x\":33,\"y\":20,\"fill\":\"#000000\"},{\"x\":33,\"y\":19,\"fill\":\"#000000\"},{\"x\":33,\"y\":18,\"fill\":\"#000000\"},{\"x\":33,\"y\":17,\"fill\":\"#000000\"},{\"x\":33,\"y\":16,\"fill\":\"#925c0e\"},{\"x\":33,\"y\":15,\"fill\":\"#925c0e\"},{\"x\":33,\"y\":14,\"fill\":\"#925c0e\"},{\"x\":33,\"y\":13,\"fill\":\"#925c0e\"},{\"x\":33,\"y\":12,\"fill\":\"#fcf9dc\"},{\"x\":33,\"y\":11,\"fill\":\"#fcf9dc\"},{\"x\":33,\"y\":10,\"fill\":\"#ff0000\"},{\"x\":33,\"y\":9,\"fill\":\"#ff0000\"},{\"x\":33,\"y\":8,\"fill\":\"#000000\"},{\"x\":33,\"y\":7,\"fill\":\"#000000\"},{\"x\":33,\"y\":6,\"fill\":\"#000000\"},{\"x\":33,\"y\":5,\"fill\":\"#000000\"},{\"x\":33,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":33,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":33,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":33,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":34,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":34,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":34,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":34,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":34,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":34,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":34,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":34,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":34,\"y\":56,\"fill\":\"#000000\"},{\"x\":34,\"y\":55,\"fill\":\"#000000\"},{\"x\":34,\"y\":54,\"fill\":\"#b33636\"},{\"x\":34,\"y\":53,\"fill\":\"#b33636\"},{\"x\":34,\"y\":52,\"fill\":\"#000000\"},{\"x\":34,\"y\":51,\"fill\":\"#000000\"},{\"x\":34,\"y\":50,\"fill\":\"#ff0000\"},{\"x\":34,\"y\":49,\"fill\":\"#ff0000\"},{\"x\":34,\"y\":48,\"fill\":\"#ff0000\"},{\"x\":34,\"y\":47,\"fill\":\"#ff0000\"},{\"x\":34,\"y\":46,\"fill\":\"#ff0000\"},{\"x\":34,\"y\":45,\"fill\":\"#ff0000\"},{\"x\":34,\"y\":44,\"fill\":\"#000000\"},{\"x\":34,\"y\":43,\"fill\":\"#000000\"},{\"x\":34,\"y\":42,\"fill\":\"#fcf9dc\"},{\"x\":34,\"y\":41,\"fill\":\"#fcf9dc\"},{\"x\":34,\"y\":40,\"fill\":\"#dcde99\"},{\"x\":34,\"y\":39,\"fill\":\"#dcde99\"},{\"x\":34,\"y\":38,\"fill\":\"#000000\"},{\"x\":34,\"y\":37,\"fill\":\"#000000\"},{\"x\":34,\"y\":36,\"fill\":\"#fedcb8\"},{\"x\":34,\"y\":35,\"fill\":\"#fedcb8\"},{\"x\":34,\"y\":34,\"fill\":\"#fedcb8\"},{\"x\":34,\"y\":33,\"fill\":\"#fedcb8\"},{\"x\":34,\"y\":32,\"fill\":\"#f8b976\"},{\"x\":34,\"y\":31,\"fill\":\"#f8b976\"},{\"x\":34,\"y\":30,\"fill\":\"#fedcb8\"},{\"x\":34,\"y\":29,\"fill\":\"#fedcb8\"},{\"x\":34,\"y\":28,\"fill\":\"#fcf9dc\"},{\"x\":34,\"y\":27,\"fill\":\"#fcf9dc\"},{\"x\":34,\"y\":26,\"fill\":\"#fcf9dc\"},{\"x\":34,\"y\":25,\"fill\":\"#fcf9dc\"},{\"x\":34,\"y\":24,\"fill\":\"#fcf9dc\"},{\"x\":34,\"y\":23,\"fill\":\"#fcf9dc\"},{\"x\":34,\"y\":22,\"fill\":\"#fcf9dc\"},{\"x\":34,\"y\":21,\"fill\":\"#fcf9dc\"},{\"x\":34,\"y\":20,\"fill\":\"#000000\"},{\"x\":34,\"y\":19,\"fill\":\"#000000\"},{\"x\":34,\"y\":18,\"fill\":\"#ff0000\"},{\"x\":34,\"y\":17,\"fill\":\"#ff0000\"},{\"x\":34,\"y\":16,\"fill\":\"#ae6f14\"},{\"x\":34,\"y\":15,\"fill\":\"#ae6f14\"},{\"x\":34,\"y\":14,\"fill\":\"#925c0e\"},{\"x\":34,\"y\":13,\"fill\":\"#925c0e\"},{\"x\":34,\"y\":12,\"fill\":\"#fcf9dc\"},{\"x\":34,\"y\":11,\"fill\":\"#fcf9dc\"},{\"x\":34,\"y\":10,\"fill\":\"#ff0000\"},{\"x\":34,\"y\":9,\"fill\":\"#ff0000\"},{\"x\":34,\"y\":8,\"fill\":\"#925c0e\"},{\"x\":34,\"y\":7,\"fill\":\"#925c0e\"},{\"x\":34,\"y\":6,\"fill\":\"#000000\"},{\"x\":34,\"y\":5,\"fill\":\"#000000\"},{\"x\":34,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":34,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":34,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":34,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":35,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":35,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":35,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":35,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":35,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":35,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":35,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":35,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":35,\"y\":56,\"fill\":\"#000000\"},{\"x\":35,\"y\":55,\"fill\":\"#000000\"},{\"x\":35,\"y\":54,\"fill\":\"#b33636\"},{\"x\":35,\"y\":53,\"fill\":\"#b33636\"},{\"x\":35,\"y\":52,\"fill\":\"#000000\"},{\"x\":35,\"y\":51,\"fill\":\"#000000\"},{\"x\":35,\"y\":50,\"fill\":\"#ff0000\"},{\"x\":35,\"y\":49,\"fill\":\"#ff0000\"},{\"x\":35,\"y\":48,\"fill\":\"#ff0000\"},{\"x\":35,\"y\":47,\"fill\":\"#ff0000\"},{\"x\":35,\"y\":46,\"fill\":\"#ff0000\"},{\"x\":35,\"y\":45,\"fill\":\"#ff0000\"},{\"x\":35,\"y\":44,\"fill\":\"#000000\"},{\"x\":35,\"y\":43,\"fill\":\"#000000\"},{\"x\":35,\"y\":42,\"fill\":\"#fcf9dc\"},{\"x\":35,\"y\":41,\"fill\":\"#fcf9dc\"},{\"x\":35,\"y\":40,\"fill\":\"#dcde99\"},{\"x\":35,\"y\":39,\"fill\":\"#dcde99\"},{\"x\":35,\"y\":38,\"fill\":\"#000000\"},{\"x\":35,\"y\":37,\"fill\":\"#000000\"},{\"x\":35,\"y\":36,\"fill\":\"#fedcb8\"},{\"x\":35,\"y\":35,\"fill\":\"#fedcb8\"},{\"x\":35,\"y\":34,\"fill\":\"#fedcb8\"},{\"x\":35,\"y\":33,\"fill\":\"#fedcb8\"},{\"x\":35,\"y\":32,\"fill\":\"#f8b976\"},{\"x\":35,\"y\":31,\"fill\":\"#f8b976\"},{\"x\":35,\"y\":30,\"fill\":\"#fedcb8\"},{\"x\":35,\"y\":29,\"fill\":\"#fedcb8\"},{\"x\":35,\"y\":28,\"fill\":\"#fcf9dc\"},{\"x\":35,\"y\":27,\"fill\":\"#fcf9dc\"},{\"x\":35,\"y\":26,\"fill\":\"#fcf9dc\"},{\"x\":35,\"y\":25,\"fill\":\"#fcf9dc\"},{\"x\":35,\"y\":24,\"fill\":\"#fcf9dc\"},{\"x\":35,\"y\":23,\"fill\":\"#fcf9dc\"},{\"x\":35,\"y\":22,\"fill\":\"#fcf9dc\"},{\"x\":35,\"y\":21,\"fill\":\"#fcf9dc\"},{\"x\":35,\"y\":20,\"fill\":\"#000000\"},{\"x\":35,\"y\":19,\"fill\":\"#000000\"},{\"x\":35,\"y\":18,\"fill\":\"#ff0000\"},{\"x\":35,\"y\":17,\"fill\":\"#ff0000\"},{\"x\":35,\"y\":16,\"fill\":\"#ae6f14\"},{\"x\":35,\"y\":15,\"fill\":\"#ae6f14\"},{\"x\":35,\"y\":14,\"fill\":\"#925c0e\"},{\"x\":35,\"y\":13,\"fill\":\"#925c0e\"},{\"x\":35,\"y\":12,\"fill\":\"#fcf9dc\"},{\"x\":35,\"y\":11,\"fill\":\"#fcf9dc\"},{\"x\":35,\"y\":10,\"fill\":\"#ff0000\"},{\"x\":35,\"y\":9,\"fill\":\"#ff0000\"},{\"x\":35,\"y\":8,\"fill\":\"#925c0e\"},{\"x\":35,\"y\":7,\"fill\":\"#925c0e\"},{\"x\":35,\"y\":6,\"fill\":\"#000000\"},{\"x\":35,\"y\":5,\"fill\":\"#000000\"},{\"x\":35,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":35,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":35,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":35,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":36,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":36,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":36,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":36,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":36,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":36,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":36,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":36,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":36,\"y\":56,\"fill\":\"#000000\"},{\"x\":36,\"y\":55,\"fill\":\"#000000\"},{\"x\":36,\"y\":54,\"fill\":\"#b33636\"},{\"x\":36,\"y\":53,\"fill\":\"#b33636\"},{\"x\":36,\"y\":52,\"fill\":\"#e17070\"},{\"x\":36,\"y\":51,\"fill\":\"#e17070\"},{\"x\":36,\"y\":50,\"fill\":\"#000000\"},{\"x\":36,\"y\":49,\"fill\":\"#000000\"},{\"x\":36,\"y\":48,\"fill\":\"#ff0000\"},{\"x\":36,\"y\":47,\"fill\":\"#ff0000\"},{\"x\":36,\"y\":46,\"fill\":\"#ff0000\"},{\"x\":36,\"y\":45,\"fill\":\"#ff0000\"},{\"x\":36,\"y\":44,\"fill\":\"#000000\"},{\"x\":36,\"y\":43,\"fill\":\"#000000\"},{\"x\":36,\"y\":42,\"fill\":\"#fcf9dc\"},{\"x\":36,\"y\":41,\"fill\":\"#fcf9dc\"},{\"x\":36,\"y\":40,\"fill\":\"#dcde99\"},{\"x\":36,\"y\":39,\"fill\":\"#dcde99\"},{\"x\":36,\"y\":38,\"fill\":\"#000000\"},{\"x\":36,\"y\":37,\"fill\":\"#000000\"},{\"x\":36,\"y\":36,\"fill\":\"#fcf9dc\"},{\"x\":36,\"y\":35,\"fill\":\"#fcf9dc\"},{\"x\":36,\"y\":34,\"fill\":\"#fcf9dc\"},{\"x\":36,\"y\":33,\"fill\":\"#fcf9dc\"},{\"x\":36,\"y\":32,\"fill\":\"#fcf9dc\"},{\"x\":36,\"y\":31,\"fill\":\"#fcf9dc\"},{\"x\":36,\"y\":30,\"fill\":\"#fcf9dc\"},{\"x\":36,\"y\":29,\"fill\":\"#fcf9dc\"},{\"x\":36,\"y\":28,\"fill\":\"#fcf9dc\"},{\"x\":36,\"y\":27,\"fill\":\"#fcf9dc\"},{\"x\":36,\"y\":26,\"fill\":\"#fcf9dc\"},{\"x\":36,\"y\":25,\"fill\":\"#fcf9dc\"},{\"x\":36,\"y\":24,\"fill\":\"#fcf9dc\"},{\"x\":36,\"y\":23,\"fill\":\"#fcf9dc\"},{\"x\":36,\"y\":22,\"fill\":\"#000000\"},{\"x\":36,\"y\":21,\"fill\":\"#000000\"},{\"x\":36,\"y\":20,\"fill\":\"#ff7f7f\"},{\"x\":36,\"y\":19,\"fill\":\"#ff7f7f\"},{\"x\":36,\"y\":18,\"fill\":\"#ff0000\"},{\"x\":36,\"y\":17,\"fill\":\"#ff0000\"},{\"x\":36,\"y\":16,\"fill\":\"#ae6f14\"},{\"x\":36,\"y\":15,\"fill\":\"#ae6f14\"},{\"x\":36,\"y\":14,\"fill\":\"#ae6f14\"},{\"x\":36,\"y\":13,\"fill\":\"#ae6f14\"},{\"x\":36,\"y\":12,\"fill\":\"#fcf9dc\"},{\"x\":36,\"y\":11,\"fill\":\"#fcf9dc\"},{\"x\":36,\"y\":10,\"fill\":\"#000000\"},{\"x\":36,\"y\":9,\"fill\":\"#000000\"},{\"x\":36,\"y\":8,\"fill\":\"#000000\"},{\"x\":36,\"y\":7,\"fill\":\"#000000\"},{\"x\":36,\"y\":6,\"fill\":\"#000000\"},{\"x\":36,\"y\":5,\"fill\":\"#000000\"},{\"x\":36,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":36,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":36,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":36,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":37,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":37,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":37,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":37,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":37,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":37,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":37,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":37,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":37,\"y\":56,\"fill\":\"#000000\"},{\"x\":37,\"y\":55,\"fill\":\"#000000\"},{\"x\":37,\"y\":54,\"fill\":\"#b33636\"},{\"x\":37,\"y\":53,\"fill\":\"#b33636\"},{\"x\":37,\"y\":52,\"fill\":\"#e17070\"},{\"x\":37,\"y\":51,\"fill\":\"#e17070\"},{\"x\":37,\"y\":50,\"fill\":\"#000000\"},{\"x\":37,\"y\":49,\"fill\":\"#000000\"},{\"x\":37,\"y\":48,\"fill\":\"#ff0000\"},{\"x\":37,\"y\":47,\"fill\":\"#ff0000\"},{\"x\":37,\"y\":46,\"fill\":\"#ff0000\"},{\"x\":37,\"y\":45,\"fill\":\"#ff0000\"},{\"x\":37,\"y\":44,\"fill\":\"#000000\"},{\"x\":37,\"y\":43,\"fill\":\"#000000\"},{\"x\":37,\"y\":42,\"fill\":\"#fcf9dc\"},{\"x\":37,\"y\":41,\"fill\":\"#fcf9dc\"},{\"x\":37,\"y\":40,\"fill\":\"#dcde99\"},{\"x\":37,\"y\":39,\"fill\":\"#dcde99\"},{\"x\":37,\"y\":38,\"fill\":\"#000000\"},{\"x\":37,\"y\":37,\"fill\":\"#000000\"},{\"x\":37,\"y\":36,\"fill\":\"#fcf9dc\"},{\"x\":37,\"y\":35,\"fill\":\"#fcf9dc\"},{\"x\":37,\"y\":34,\"fill\":\"#fcf9dc\"},{\"x\":37,\"y\":33,\"fill\":\"#fcf9dc\"},{\"x\":37,\"y\":32,\"fill\":\"#fcf9dc\"},{\"x\":37,\"y\":31,\"fill\":\"#fcf9dc\"},{\"x\":37,\"y\":30,\"fill\":\"#fcf9dc\"},{\"x\":37,\"y\":29,\"fill\":\"#fcf9dc\"},{\"x\":37,\"y\":28,\"fill\":\"#fcf9dc\"},{\"x\":37,\"y\":27,\"fill\":\"#fcf9dc\"},{\"x\":37,\"y\":26,\"fill\":\"#fcf9dc\"},{\"x\":37,\"y\":25,\"fill\":\"#fcf9dc\"},{\"x\":37,\"y\":24,\"fill\":\"#fcf9dc\"},{\"x\":37,\"y\":23,\"fill\":\"#fcf9dc\"},{\"x\":37,\"y\":22,\"fill\":\"#000000\"},{\"x\":37,\"y\":21,\"fill\":\"#000000\"},{\"x\":37,\"y\":20,\"fill\":\"#ff7f7f\"},{\"x\":37,\"y\":19,\"fill\":\"#ff7f7f\"},{\"x\":37,\"y\":18,\"fill\":\"#ff0000\"},{\"x\":37,\"y\":17,\"fill\":\"#ff0000\"},{\"x\":37,\"y\":16,\"fill\":\"#ae6f14\"},{\"x\":37,\"y\":15,\"fill\":\"#ae6f14\"},{\"x\":37,\"y\":14,\"fill\":\"#ae6f14\"},{\"x\":37,\"y\":13,\"fill\":\"#ae6f14\"},{\"x\":37,\"y\":12,\"fill\":\"#fcf9dc\"},{\"x\":37,\"y\":11,\"fill\":\"#fcf9dc\"},{\"x\":37,\"y\":10,\"fill\":\"#000000\"},{\"x\":37,\"y\":9,\"fill\":\"#000000\"},{\"x\":37,\"y\":8,\"fill\":\"#000000\"},{\"x\":37,\"y\":7,\"fill\":\"#000000\"},{\"x\":37,\"y\":6,\"fill\":\"#000000\"},{\"x\":37,\"y\":5,\"fill\":\"#000000\"},{\"x\":37,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":37,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":37,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":37,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":38,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":38,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":38,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":38,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":38,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":38,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":38,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":38,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":38,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":38,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":38,\"y\":54,\"fill\":\"#000000\"},{\"x\":38,\"y\":53,\"fill\":\"#000000\"},{\"x\":38,\"y\":52,\"fill\":\"#ff0000\"},{\"x\":38,\"y\":51,\"fill\":\"#ff0000\"},{\"x\":38,\"y\":50,\"fill\":\"#ff0000\"},{\"x\":38,\"y\":49,\"fill\":\"#ff0000\"},{\"x\":38,\"y\":48,\"fill\":\"#000000\"},{\"x\":38,\"y\":47,\"fill\":\"#000000\"},{\"x\":38,\"y\":46,\"fill\":\"#000000\"},{\"x\":38,\"y\":45,\"fill\":\"#000000\"},{\"x\":38,\"y\":44,\"fill\":\"#000000\"},{\"x\":38,\"y\":43,\"fill\":\"#000000\"},{\"x\":38,\"y\":42,\"fill\":\"#fcf9dc\"},{\"x\":38,\"y\":41,\"fill\":\"#fcf9dc\"},{\"x\":38,\"y\":40,\"fill\":\"#dcde99\"},{\"x\":38,\"y\":39,\"fill\":\"#dcde99\"},{\"x\":38,\"y\":38,\"fill\":\"#000000\"},{\"x\":38,\"y\":37,\"fill\":\"#000000\"},{\"x\":38,\"y\":36,\"fill\":\"#fcf9dc\"},{\"x\":38,\"y\":35,\"fill\":\"#fcf9dc\"},{\"x\":38,\"y\":34,\"fill\":\"#fcf9dc\"},{\"x\":38,\"y\":33,\"fill\":\"#fcf9dc\"},{\"x\":38,\"y\":32,\"fill\":\"#fcf9dc\"},{\"x\":38,\"y\":31,\"fill\":\"#fcf9dc\"},{\"x\":38,\"y\":30,\"fill\":\"#fcf9dc\"},{\"x\":38,\"y\":29,\"fill\":\"#fcf9dc\"},{\"x\":38,\"y\":28,\"fill\":\"#fcf9dc\"},{\"x\":38,\"y\":27,\"fill\":\"#fcf9dc\"},{\"x\":38,\"y\":26,\"fill\":\"#fcf9dc\"},{\"x\":38,\"y\":25,\"fill\":\"#fcf9dc\"},{\"x\":38,\"y\":24,\"fill\":\"#000000\"},{\"x\":38,\"y\":23,\"fill\":\"#000000\"},{\"x\":38,\"y\":22,\"fill\":\"#000000\"},{\"x\":38,\"y\":21,\"fill\":\"#000000\"},{\"x\":38,\"y\":20,\"fill\":\"#000000\"},{\"x\":38,\"y\":19,\"fill\":\"#000000\"},{\"x\":38,\"y\":18,\"fill\":\"#000000\"},{\"x\":38,\"y\":17,\"fill\":\"#000000\"},{\"x\":38,\"y\":16,\"fill\":\"#000000\"},{\"x\":38,\"y\":15,\"fill\":\"#000000\"},{\"x\":38,\"y\":14,\"fill\":\"#000000\"},{\"x\":38,\"y\":13,\"fill\":\"#000000\"},{\"x\":38,\"y\":12,\"fill\":\"#000000\"},{\"x\":38,\"y\":11,\"fill\":\"#000000\"},{\"x\":38,\"y\":10,\"fill\":\"#000000\"},{\"x\":38,\"y\":9,\"fill\":\"#000000\"},{\"x\":38,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":38,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":38,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":38,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":38,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":38,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":38,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":38,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":39,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":39,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":39,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":39,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":39,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":39,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":39,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":39,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":39,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":39,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":39,\"y\":54,\"fill\":\"#000000\"},{\"x\":39,\"y\":53,\"fill\":\"#000000\"},{\"x\":39,\"y\":52,\"fill\":\"#ff0000\"},{\"x\":39,\"y\":51,\"fill\":\"#ff0000\"},{\"x\":39,\"y\":50,\"fill\":\"#ff0000\"},{\"x\":39,\"y\":49,\"fill\":\"#ff0000\"},{\"x\":39,\"y\":48,\"fill\":\"#000000\"},{\"x\":39,\"y\":47,\"fill\":\"#000000\"},{\"x\":39,\"y\":46,\"fill\":\"#000000\"},{\"x\":39,\"y\":45,\"fill\":\"#000000\"},{\"x\":39,\"y\":44,\"fill\":\"#000000\"},{\"x\":39,\"y\":43,\"fill\":\"#000000\"},{\"x\":39,\"y\":42,\"fill\":\"#fcf9dc\"},{\"x\":39,\"y\":41,\"fill\":\"#fcf9dc\"},{\"x\":39,\"y\":40,\"fill\":\"#dcde99\"},{\"x\":39,\"y\":39,\"fill\":\"#dcde99\"},{\"x\":39,\"y\":38,\"fill\":\"#000000\"},{\"x\":39,\"y\":37,\"fill\":\"#000000\"},{\"x\":39,\"y\":36,\"fill\":\"#fcf9dc\"},{\"x\":39,\"y\":35,\"fill\":\"#fcf9dc\"},{\"x\":39,\"y\":34,\"fill\":\"#fcf9dc\"},{\"x\":39,\"y\":33,\"fill\":\"#fcf9dc\"},{\"x\":39,\"y\":32,\"fill\":\"#fcf9dc\"},{\"x\":39,\"y\":31,\"fill\":\"#fcf9dc\"},{\"x\":39,\"y\":30,\"fill\":\"#fcf9dc\"},{\"x\":39,\"y\":29,\"fill\":\"#fcf9dc\"},{\"x\":39,\"y\":28,\"fill\":\"#fcf9dc\"},{\"x\":39,\"y\":27,\"fill\":\"#fcf9dc\"},{\"x\":39,\"y\":26,\"fill\":\"#fcf9dc\"},{\"x\":39,\"y\":25,\"fill\":\"#fcf9dc\"},{\"x\":39,\"y\":24,\"fill\":\"#000000\"},{\"x\":39,\"y\":23,\"fill\":\"#000000\"},{\"x\":39,\"y\":22,\"fill\":\"#000000\"},{\"x\":39,\"y\":21,\"fill\":\"#000000\"},{\"x\":39,\"y\":20,\"fill\":\"#000000\"},{\"x\":39,\"y\":19,\"fill\":\"#000000\"},{\"x\":39,\"y\":18,\"fill\":\"#000000\"},{\"x\":39,\"y\":17,\"fill\":\"#000000\"},{\"x\":39,\"y\":16,\"fill\":\"#000000\"},{\"x\":39,\"y\":15,\"fill\":\"#000000\"},{\"x\":39,\"y\":14,\"fill\":\"#000000\"},{\"x\":39,\"y\":13,\"fill\":\"#000000\"},{\"x\":39,\"y\":12,\"fill\":\"#000000\"},{\"x\":39,\"y\":11,\"fill\":\"#000000\"},{\"x\":39,\"y\":10,\"fill\":\"#000000\"},{\"x\":39,\"y\":9,\"fill\":\"#000000\"},{\"x\":39,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":39,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":39,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":39,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":39,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":39,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":39,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":39,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":40,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":40,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":40,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":40,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":40,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":40,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":40,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":40,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":40,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":40,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":40,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":40,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":40,\"y\":52,\"fill\":\"#000000\"},{\"x\":40,\"y\":51,\"fill\":\"#000000\"},{\"x\":40,\"y\":50,\"fill\":\"#ff0000\"},{\"x\":40,\"y\":49,\"fill\":\"#ff0000\"},{\"x\":40,\"y\":48,\"fill\":\"#ff0000\"},{\"x\":40,\"y\":47,\"fill\":\"#ff0000\"},{\"x\":40,\"y\":46,\"fill\":\"#dcde99\"},{\"x\":40,\"y\":45,\"fill\":\"#dcde99\"},{\"x\":40,\"y\":44,\"fill\":\"#000000\"},{\"x\":40,\"y\":43,\"fill\":\"#000000\"},{\"x\":40,\"y\":42,\"fill\":\"#fcf9dc\"},{\"x\":40,\"y\":41,\"fill\":\"#fcf9dc\"},{\"x\":40,\"y\":40,\"fill\":\"#dcde99\"},{\"x\":40,\"y\":39,\"fill\":\"#dcde99\"},{\"x\":40,\"y\":38,\"fill\":\"#000000\"},{\"x\":40,\"y\":37,\"fill\":\"#000000\"},{\"x\":40,\"y\":36,\"fill\":\"#000000\"},{\"x\":40,\"y\":35,\"fill\":\"#000000\"},{\"x\":40,\"y\":34,\"fill\":\"#000000\"},{\"x\":40,\"y\":33,\"fill\":\"#000000\"},{\"x\":40,\"y\":32,\"fill\":\"#fcf9dc\"},{\"x\":40,\"y\":31,\"fill\":\"#fcf9dc\"},{\"x\":40,\"y\":30,\"fill\":\"#fcf9dc\"},{\"x\":40,\"y\":29,\"fill\":\"#fcf9dc\"},{\"x\":40,\"y\":28,\"fill\":\"#000000\"},{\"x\":40,\"y\":27,\"fill\":\"#000000\"},{\"x\":40,\"y\":26,\"fill\":\"#000000\"},{\"x\":40,\"y\":25,\"fill\":\"#000000\"},{\"x\":40,\"y\":24,\"fill\":\"#ae6a09\"},{\"x\":40,\"y\":23,\"fill\":\"#ae6a09\"},{\"x\":40,\"y\":22,\"fill\":\"#000000\"},{\"x\":40,\"y\":21,\"fill\":\"#000000\"},{\"x\":40,\"y\":20,\"fill\":\"#ff7f7f\"},{\"x\":40,\"y\":19,\"fill\":\"#ff7f7f\"},{\"x\":40,\"y\":18,\"fill\":\"#ff0000\"},{\"x\":40,\"y\":17,\"fill\":\"#ff0000\"},{\"x\":40,\"y\":16,\"fill\":\"#dadada\"},{\"x\":40,\"y\":15,\"fill\":\"#dadada\"},{\"x\":40,\"y\":14,\"fill\":\"#dadada\"},{\"x\":40,\"y\":13,\"fill\":\"#dadada\"},{\"x\":40,\"y\":12,\"fill\":\"#000000\"},{\"x\":40,\"y\":11,\"fill\":\"#000000\"},{\"x\":40,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":40,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":40,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":40,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":40,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":40,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":40,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":40,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":40,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":40,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":41,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":41,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":41,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":41,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":41,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":41,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":41,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":41,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":41,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":41,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":41,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":41,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":41,\"y\":52,\"fill\":\"#000000\"},{\"x\":41,\"y\":51,\"fill\":\"#000000\"},{\"x\":41,\"y\":50,\"fill\":\"#ff0000\"},{\"x\":41,\"y\":49,\"fill\":\"#ff0000\"},{\"x\":41,\"y\":48,\"fill\":\"#ff0000\"},{\"x\":41,\"y\":47,\"fill\":\"#ff0000\"},{\"x\":41,\"y\":46,\"fill\":\"#dcde99\"},{\"x\":41,\"y\":45,\"fill\":\"#dcde99\"},{\"x\":41,\"y\":44,\"fill\":\"#000000\"},{\"x\":41,\"y\":43,\"fill\":\"#000000\"},{\"x\":41,\"y\":42,\"fill\":\"#fcf9dc\"},{\"x\":41,\"y\":41,\"fill\":\"#fcf9dc\"},{\"x\":41,\"y\":40,\"fill\":\"#dcde99\"},{\"x\":41,\"y\":39,\"fill\":\"#dcde99\"},{\"x\":41,\"y\":38,\"fill\":\"#000000\"},{\"x\":41,\"y\":37,\"fill\":\"#000000\"},{\"x\":41,\"y\":36,\"fill\":\"#000000\"},{\"x\":41,\"y\":35,\"fill\":\"#000000\"},{\"x\":41,\"y\":34,\"fill\":\"#000000\"},{\"x\":41,\"y\":33,\"fill\":\"#000000\"},{\"x\":41,\"y\":32,\"fill\":\"#fcf9dc\"},{\"x\":41,\"y\":31,\"fill\":\"#fcf9dc\"},{\"x\":41,\"y\":30,\"fill\":\"#fcf9dc\"},{\"x\":41,\"y\":29,\"fill\":\"#fcf9dc\"},{\"x\":41,\"y\":28,\"fill\":\"#000000\"},{\"x\":41,\"y\":27,\"fill\":\"#000000\"},{\"x\":41,\"y\":26,\"fill\":\"#000000\"},{\"x\":41,\"y\":25,\"fill\":\"#000000\"},{\"x\":41,\"y\":24,\"fill\":\"#ae6a09\"},{\"x\":41,\"y\":23,\"fill\":\"#ae6a09\"},{\"x\":41,\"y\":22,\"fill\":\"#000000\"},{\"x\":41,\"y\":21,\"fill\":\"#000000\"},{\"x\":41,\"y\":20,\"fill\":\"#ff7f7f\"},{\"x\":41,\"y\":19,\"fill\":\"#ff7f7f\"},{\"x\":41,\"y\":18,\"fill\":\"#ff0000\"},{\"x\":41,\"y\":17,\"fill\":\"#ff0000\"},{\"x\":41,\"y\":16,\"fill\":\"#dadada\"},{\"x\":41,\"y\":15,\"fill\":\"#dadada\"},{\"x\":41,\"y\":14,\"fill\":\"#dadada\"},{\"x\":41,\"y\":13,\"fill\":\"#dadada\"},{\"x\":41,\"y\":12,\"fill\":\"#000000\"},{\"x\":41,\"y\":11,\"fill\":\"#000000\"},{\"x\":41,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":41,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":41,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":41,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":41,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":41,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":41,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":41,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":41,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":41,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":42,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":42,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":42,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":42,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":42,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":42,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":42,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":42,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":42,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":42,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":42,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":42,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":42,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":42,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":42,\"y\":50,\"fill\":\"#000000\"},{\"x\":42,\"y\":49,\"fill\":\"#000000\"},{\"x\":42,\"y\":48,\"fill\":\"#dcde99\"},{\"x\":42,\"y\":47,\"fill\":\"#dcde99\"},{\"x\":42,\"y\":46,\"fill\":\"#dcde99\"},{\"x\":42,\"y\":45,\"fill\":\"#dcde99\"},{\"x\":42,\"y\":44,\"fill\":\"#dcde99\"},{\"x\":42,\"y\":43,\"fill\":\"#dcde99\"},{\"x\":42,\"y\":42,\"fill\":\"#000000\"},{\"x\":42,\"y\":41,\"fill\":\"#000000\"},{\"x\":42,\"y\":40,\"fill\":\"#000000\"},{\"x\":42,\"y\":39,\"fill\":\"#000000\"},{\"x\":42,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":42,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":42,\"y\":36,\"fill\":\"#ffffff\"},{\"x\":42,\"y\":35,\"fill\":\"#ffffff\"},{\"x\":42,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":42,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":42,\"y\":32,\"fill\":\"#000000\"},{\"x\":42,\"y\":31,\"fill\":\"#000000\"},{\"x\":42,\"y\":30,\"fill\":\"#000000\"},{\"x\":42,\"y\":29,\"fill\":\"#000000\"},{\"x\":42,\"y\":28,\"fill\":\"#000000\"},{\"x\":42,\"y\":27,\"fill\":\"#000000\"},{\"x\":42,\"y\":26,\"fill\":\"#ae6a09\"},{\"x\":42,\"y\":25,\"fill\":\"#ae6a09\"},{\"x\":42,\"y\":24,\"fill\":\"#ae6a09\"},{\"x\":42,\"y\":23,\"fill\":\"#ae6a09\"},{\"x\":42,\"y\":22,\"fill\":\"#ae6a09\"},{\"x\":42,\"y\":21,\"fill\":\"#ae6a09\"},{\"x\":42,\"y\":20,\"fill\":\"#000000\"},{\"x\":42,\"y\":19,\"fill\":\"#000000\"},{\"x\":42,\"y\":18,\"fill\":\"#000000\"},{\"x\":42,\"y\":17,\"fill\":\"#000000\"},{\"x\":42,\"y\":16,\"fill\":\"#ffffff\"},{\"x\":42,\"y\":15,\"fill\":\"#ffffff\"},{\"x\":42,\"y\":14,\"fill\":\"#dadada\"},{\"x\":42,\"y\":13,\"fill\":\"#dadada\"},{\"x\":42,\"y\":12,\"fill\":\"#000000\"},{\"x\":42,\"y\":11,\"fill\":\"#000000\"},{\"x\":42,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":42,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":42,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":42,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":42,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":42,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":42,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":42,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":42,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":42,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":43,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":43,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":43,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":43,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":43,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":43,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":43,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":43,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":43,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":43,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":43,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":43,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":43,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":43,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":43,\"y\":50,\"fill\":\"#000000\"},{\"x\":43,\"y\":49,\"fill\":\"#000000\"},{\"x\":43,\"y\":48,\"fill\":\"#dcde99\"},{\"x\":43,\"y\":47,\"fill\":\"#dcde99\"},{\"x\":43,\"y\":46,\"fill\":\"#dcde99\"},{\"x\":43,\"y\":45,\"fill\":\"#dcde99\"},{\"x\":43,\"y\":44,\"fill\":\"#dcde99\"},{\"x\":43,\"y\":43,\"fill\":\"#dcde99\"},{\"x\":43,\"y\":42,\"fill\":\"#000000\"},{\"x\":43,\"y\":41,\"fill\":\"#000000\"},{\"x\":43,\"y\":40,\"fill\":\"#000000\"},{\"x\":43,\"y\":39,\"fill\":\"#000000\"},{\"x\":43,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":43,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":43,\"y\":36,\"fill\":\"#ffffff\"},{\"x\":43,\"y\":35,\"fill\":\"#ffffff\"},{\"x\":43,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":43,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":43,\"y\":32,\"fill\":\"#000000\"},{\"x\":43,\"y\":31,\"fill\":\"#000000\"},{\"x\":43,\"y\":30,\"fill\":\"#000000\"},{\"x\":43,\"y\":29,\"fill\":\"#000000\"},{\"x\":43,\"y\":28,\"fill\":\"#000000\"},{\"x\":43,\"y\":27,\"fill\":\"#000000\"},{\"x\":43,\"y\":26,\"fill\":\"#ae6a09\"},{\"x\":43,\"y\":25,\"fill\":\"#ae6a09\"},{\"x\":43,\"y\":24,\"fill\":\"#ae6a09\"},{\"x\":43,\"y\":23,\"fill\":\"#ae6a09\"},{\"x\":43,\"y\":22,\"fill\":\"#ae6a09\"},{\"x\":43,\"y\":21,\"fill\":\"#ae6a09\"},{\"x\":43,\"y\":20,\"fill\":\"#000000\"},{\"x\":43,\"y\":19,\"fill\":\"#000000\"},{\"x\":43,\"y\":18,\"fill\":\"#000000\"},{\"x\":43,\"y\":17,\"fill\":\"#000000\"},{\"x\":43,\"y\":16,\"fill\":\"#ffffff\"},{\"x\":43,\"y\":15,\"fill\":\"#ffffff\"},{\"x\":43,\"y\":14,\"fill\":\"#dadada\"},{\"x\":43,\"y\":13,\"fill\":\"#dadada\"},{\"x\":43,\"y\":12,\"fill\":\"#000000\"},{\"x\":43,\"y\":11,\"fill\":\"#000000\"},{\"x\":43,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":43,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":43,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":43,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":43,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":43,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":43,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":43,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":43,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":43,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":44,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":44,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":44,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":44,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":44,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":44,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":44,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":44,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":44,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":44,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":44,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":44,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":44,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":44,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":44,\"y\":50,\"fill\":\"#000000\"},{\"x\":44,\"y\":49,\"fill\":\"#000000\"},{\"x\":44,\"y\":48,\"fill\":\"#fcf9dc\"},{\"x\":44,\"y\":47,\"fill\":\"#fcf9dc\"},{\"x\":44,\"y\":46,\"fill\":\"#fcf9dc\"},{\"x\":44,\"y\":45,\"fill\":\"#fcf9dc\"},{\"x\":44,\"y\":44,\"fill\":\"#dcde99\"},{\"x\":44,\"y\":43,\"fill\":\"#dcde99\"},{\"x\":44,\"y\":42,\"fill\":\"#000000\"},{\"x\":44,\"y\":41,\"fill\":\"#000000\"},{\"x\":44,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":44,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":44,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":44,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":44,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":44,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":44,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":44,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":44,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":44,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":44,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":44,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":44,\"y\":28,\"fill\":\"#000000\"},{\"x\":44,\"y\":27,\"fill\":\"#000000\"},{\"x\":44,\"y\":26,\"fill\":\"#ae6a09\"},{\"x\":44,\"y\":25,\"fill\":\"#ae6a09\"},{\"x\":44,\"y\":24,\"fill\":\"#ae6a09\"},{\"x\":44,\"y\":23,\"fill\":\"#ae6a09\"},{\"x\":44,\"y\":22,\"fill\":\"#ae6a09\"},{\"x\":44,\"y\":21,\"fill\":\"#ae6a09\"},{\"x\":44,\"y\":20,\"fill\":\"#ae6a09\"},{\"x\":44,\"y\":19,\"fill\":\"#ae6a09\"},{\"x\":44,\"y\":18,\"fill\":\"#ae6a09\"},{\"x\":44,\"y\":17,\"fill\":\"#ae6a09\"},{\"x\":44,\"y\":16,\"fill\":\"#000000\"},{\"x\":44,\"y\":15,\"fill\":\"#000000\"},{\"x\":44,\"y\":14,\"fill\":\"#000000\"},{\"x\":44,\"y\":13,\"fill\":\"#000000\"},{\"x\":44,\"y\":12,\"fill\":\"#000000\"},{\"x\":44,\"y\":11,\"fill\":\"#000000\"},{\"x\":44,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":44,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":44,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":44,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":44,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":44,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":44,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":44,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":44,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":44,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":45,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":45,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":45,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":45,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":45,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":45,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":45,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":45,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":45,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":45,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":45,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":45,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":45,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":45,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":45,\"y\":50,\"fill\":\"#000000\"},{\"x\":45,\"y\":49,\"fill\":\"#000000\"},{\"x\":45,\"y\":48,\"fill\":\"#fcf9dc\"},{\"x\":45,\"y\":47,\"fill\":\"#fcf9dc\"},{\"x\":45,\"y\":46,\"fill\":\"#fcf9dc\"},{\"x\":45,\"y\":45,\"fill\":\"#fcf9dc\"},{\"x\":45,\"y\":44,\"fill\":\"#dcde99\"},{\"x\":45,\"y\":43,\"fill\":\"#dcde99\"},{\"x\":45,\"y\":42,\"fill\":\"#000000\"},{\"x\":45,\"y\":41,\"fill\":\"#000000\"},{\"x\":45,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":45,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":45,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":45,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":45,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":45,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":45,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":45,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":45,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":45,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":45,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":45,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":45,\"y\":28,\"fill\":\"#000000\"},{\"x\":45,\"y\":27,\"fill\":\"#000000\"},{\"x\":45,\"y\":26,\"fill\":\"#ae6a09\"},{\"x\":45,\"y\":25,\"fill\":\"#ae6a09\"},{\"x\":45,\"y\":24,\"fill\":\"#ae6a09\"},{\"x\":45,\"y\":23,\"fill\":\"#ae6a09\"},{\"x\":45,\"y\":22,\"fill\":\"#ae6a09\"},{\"x\":45,\"y\":21,\"fill\":\"#ae6a09\"},{\"x\":45,\"y\":20,\"fill\":\"#ae6a09\"},{\"x\":45,\"y\":19,\"fill\":\"#ae6a09\"},{\"x\":45,\"y\":18,\"fill\":\"#ae6a09\"},{\"x\":45,\"y\":17,\"fill\":\"#ae6a09\"},{\"x\":45,\"y\":16,\"fill\":\"#000000\"},{\"x\":45,\"y\":15,\"fill\":\"#000000\"},{\"x\":45,\"y\":14,\"fill\":\"#000000\"},{\"x\":45,\"y\":13,\"fill\":\"#000000\"},{\"x\":45,\"y\":12,\"fill\":\"#000000\"},{\"x\":45,\"y\":11,\"fill\":\"#000000\"},{\"x\":45,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":45,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":45,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":45,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":45,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":45,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":45,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":45,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":45,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":45,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":46,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":48,\"fill\":\"#000000\"},{\"x\":46,\"y\":47,\"fill\":\"#000000\"},{\"x\":46,\"y\":46,\"fill\":\"#000000\"},{\"x\":46,\"y\":45,\"fill\":\"#000000\"},{\"x\":46,\"y\":44,\"fill\":\"#000000\"},{\"x\":46,\"y\":43,\"fill\":\"#000000\"},{\"x\":46,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":46,\"y\":28,\"fill\":\"#000000\"},{\"x\":46,\"y\":27,\"fill\":\"#000000\"},{\"x\":46,\"y\":26,\"fill\":\"#cb7b09\"},{\"x\":46,\"y\":25,\"fill\":\"#cb7b09\"},{\"x\":46,\"y\":24,\"fill\":\"#ae6a09\"},{\"x\":46,\"y\":23,\"fill\":\"#ae6a09\"},{\"x\":46,\"y\":22,\"fill\":\"#ae6a09\"},{\"x\":46,\"y\":21,\"fill\":\"#ae6a09\"},{\"x\":46,\"y\":20,\"fill\":\"#ae6a09\"},{\"x\":46,\"y\":19,\"fill\":\"#ae6a09\"},{\"x\":46,\"y\":18,\"fill\":\"#ae6a09\"},{\"x\":46,\"y\":17,\"fill\":\"#ae6a09\"},{\"x\":46,\"y\":16,\"fill\":\"#ae6a09\"},{\"x\":46,\"y\":15,\"fill\":\"#ae6a09\"},{\"x\":46,\"y\":14,\"fill\":\"#ae6a09\"},{\"x\":46,\"y\":13,\"fill\":\"#ae6a09\"},{\"x\":46,\"y\":12,\"fill\":\"#000000\"},{\"x\":46,\"y\":11,\"fill\":\"#000000\"},{\"x\":46,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":46,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":46,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":46,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":46,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":46,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":46,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":46,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":46,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":46,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":47,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":48,\"fill\":\"#000000\"},{\"x\":47,\"y\":47,\"fill\":\"#000000\"},{\"x\":47,\"y\":46,\"fill\":\"#000000\"},{\"x\":47,\"y\":45,\"fill\":\"#000000\"},{\"x\":47,\"y\":44,\"fill\":\"#000000\"},{\"x\":47,\"y\":43,\"fill\":\"#000000\"},{\"x\":47,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":47,\"y\":28,\"fill\":\"#000000\"},{\"x\":47,\"y\":27,\"fill\":\"#000000\"},{\"x\":47,\"y\":26,\"fill\":\"#cb7b09\"},{\"x\":47,\"y\":25,\"fill\":\"#cb7b09\"},{\"x\":47,\"y\":24,\"fill\":\"#ae6a09\"},{\"x\":47,\"y\":23,\"fill\":\"#ae6a09\"},{\"x\":47,\"y\":22,\"fill\":\"#ae6a09\"},{\"x\":47,\"y\":21,\"fill\":\"#ae6a09\"},{\"x\":47,\"y\":20,\"fill\":\"#ae6a09\"},{\"x\":47,\"y\":19,\"fill\":\"#ae6a09\"},{\"x\":47,\"y\":18,\"fill\":\"#ae6a09\"},{\"x\":47,\"y\":17,\"fill\":\"#ae6a09\"},{\"x\":47,\"y\":16,\"fill\":\"#ae6a09\"},{\"x\":47,\"y\":15,\"fill\":\"#ae6a09\"},{\"x\":47,\"y\":14,\"fill\":\"#ae6a09\"},{\"x\":47,\"y\":13,\"fill\":\"#ae6a09\"},{\"x\":47,\"y\":12,\"fill\":\"#000000\"},{\"x\":47,\"y\":11,\"fill\":\"#000000\"},{\"x\":47,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":47,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":47,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":47,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":47,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":47,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":47,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":47,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":47,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":47,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":48,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":62,\"fill\":\"#ffffff\"},{\"x\":48,\"y\":61,\"fill\":\"#ffffff\"},{\"x\":48,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":34,\"fill\":\"#ffffff\"},{\"x\":48,\"y\":33,\"fill\":\"#ffffff\"},{\"x\":48,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":48,\"y\":28,\"fill\":\"#000000\"},{\"x\":48,\"y\":27,\"fill\":\"#000000\"},{\"x\":48,\"y\":26,\"fill\":\"#cb7b09\"},{\"x\":48,\"y\":25,\"fill\":\"#cb7b09\"},{\"x\":48,\"y\":24,\"fill\":\"#cb7b09\"},{\"x\":48,\"y\":23,\"fill\":\"#cb7b09\"},{\"x\":48,\"y\":22,\"fill\":\"#ae6a09\"},{\"x\":48,\"y\":21,\"fill\":\"#ae6a09\"},{\"x\":48,\"y\":20,\"fill\":\"#ae6a09\"},{\"x\":48,\"y\":19,\"fill\":\"#ae6a09\"},{\"x\":48,\"y\":18,\"fill\":\"#ae6a09\"},{\"x\":48,\"y\":17,\"fill\":\"#ae6a09\"},{\"x\":48,\"y\":16,\"fill\":\"#ae6a09\"},{\"x\":48,\"y\":15,\"fill\":\"#ae6a09\"},{\"x\":48,\"y\":14,\"fill\":\"#000000\"},{\"x\":48,\"y\":13,\"fill\":\"#000000\"},{\"x\":48,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":48,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":48,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":48,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":48,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":48,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":48,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":48,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":48,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":48,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":48,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":48,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":49,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":62,\"fill\":\"#ffffff\"},{\"x\":49,\"y\":61,\"fill\":\"#ffffff\"},{\"x\":49,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":34,\"fill\":\"#ffffff\"},{\"x\":49,\"y\":33,\"fill\":\"#ffffff\"},{\"x\":49,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":49,\"y\":28,\"fill\":\"#000000\"},{\"x\":49,\"y\":27,\"fill\":\"#000000\"},{\"x\":49,\"y\":26,\"fill\":\"#cb7b09\"},{\"x\":49,\"y\":25,\"fill\":\"#cb7b09\"},{\"x\":49,\"y\":24,\"fill\":\"#cb7b09\"},{\"x\":49,\"y\":23,\"fill\":\"#cb7b09\"},{\"x\":49,\"y\":22,\"fill\":\"#ae6a09\"},{\"x\":49,\"y\":21,\"fill\":\"#ae6a09\"},{\"x\":49,\"y\":20,\"fill\":\"#ae6a09\"},{\"x\":49,\"y\":19,\"fill\":\"#ae6a09\"},{\"x\":49,\"y\":18,\"fill\":\"#ae6a09\"},{\"x\":49,\"y\":17,\"fill\":\"#ae6a09\"},{\"x\":49,\"y\":16,\"fill\":\"#ae6a09\"},{\"x\":49,\"y\":15,\"fill\":\"#ae6a09\"},{\"x\":49,\"y\":14,\"fill\":\"#000000\"},{\"x\":49,\"y\":13,\"fill\":\"#000000\"},{\"x\":49,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":49,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":49,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":49,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":49,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":49,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":49,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":49,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":49,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":49,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":49,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":49,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":50,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":50,\"y\":26,\"fill\":\"#000000\"},{\"x\":50,\"y\":25,\"fill\":\"#000000\"},{\"x\":50,\"y\":24,\"fill\":\"#cb7b09\"},{\"x\":50,\"y\":23,\"fill\":\"#cb7b09\"},{\"x\":50,\"y\":22,\"fill\":\"#cb7b09\"},{\"x\":50,\"y\":21,\"fill\":\"#cb7b09\"},{\"x\":50,\"y\":20,\"fill\":\"#cb7b09\"},{\"x\":50,\"y\":19,\"fill\":\"#cb7b09\"},{\"x\":50,\"y\":18,\"fill\":\"#ae6a09\"},{\"x\":50,\"y\":17,\"fill\":\"#ae6a09\"},{\"x\":50,\"y\":16,\"fill\":\"#ae6a09\"},{\"x\":50,\"y\":15,\"fill\":\"#ae6a09\"},{\"x\":50,\"y\":14,\"fill\":\"#000000\"},{\"x\":50,\"y\":13,\"fill\":\"#000000\"},{\"x\":50,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":50,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":50,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":50,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":50,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":50,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":50,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":50,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":50,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":50,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":50,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":50,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":51,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":51,\"y\":26,\"fill\":\"#000000\"},{\"x\":51,\"y\":25,\"fill\":\"#000000\"},{\"x\":51,\"y\":24,\"fill\":\"#cb7b09\"},{\"x\":51,\"y\":23,\"fill\":\"#cb7b09\"},{\"x\":51,\"y\":22,\"fill\":\"#cb7b09\"},{\"x\":51,\"y\":21,\"fill\":\"#cb7b09\"},{\"x\":51,\"y\":20,\"fill\":\"#cb7b09\"},{\"x\":51,\"y\":19,\"fill\":\"#cb7b09\"},{\"x\":51,\"y\":18,\"fill\":\"#ae6a09\"},{\"x\":51,\"y\":17,\"fill\":\"#ae6a09\"},{\"x\":51,\"y\":16,\"fill\":\"#ae6a09\"},{\"x\":51,\"y\":15,\"fill\":\"#ae6a09\"},{\"x\":51,\"y\":14,\"fill\":\"#000000\"},{\"x\":51,\"y\":13,\"fill\":\"#000000\"},{\"x\":51,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":51,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":51,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":51,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":51,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":51,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":51,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":51,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":51,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":51,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":51,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":51,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":52,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":42,\"fill\":\"#ffffff\"},{\"x\":52,\"y\":41,\"fill\":\"#ffffff\"},{\"x\":52,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":52,\"y\":24,\"fill\":\"#000000\"},{\"x\":52,\"y\":23,\"fill\":\"#000000\"},{\"x\":52,\"y\":22,\"fill\":\"#000000\"},{\"x\":52,\"y\":21,\"fill\":\"#000000\"},{\"x\":52,\"y\":20,\"fill\":\"#000000\"},{\"x\":52,\"y\":19,\"fill\":\"#000000\"},{\"x\":52,\"y\":18,\"fill\":\"#000000\"},{\"x\":52,\"y\":17,\"fill\":\"#000000\"},{\"x\":52,\"y\":16,\"fill\":\"#000000\"},{\"x\":52,\"y\":15,\"fill\":\"#000000\"},{\"x\":52,\"y\":14,\"fill\":\"#e0e1d4\"},{\"x\":52,\"y\":13,\"fill\":\"#e0e1d4\"},{\"x\":52,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":52,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":52,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":52,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":52,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":52,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":52,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":52,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":52,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":52,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":52,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":52,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":53,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":42,\"fill\":\"#ffffff\"},{\"x\":53,\"y\":41,\"fill\":\"#ffffff\"},{\"x\":53,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":53,\"y\":24,\"fill\":\"#000000\"},{\"x\":53,\"y\":23,\"fill\":\"#000000\"},{\"x\":53,\"y\":22,\"fill\":\"#000000\"},{\"x\":53,\"y\":21,\"fill\":\"#000000\"},{\"x\":53,\"y\":20,\"fill\":\"#000000\"},{\"x\":53,\"y\":19,\"fill\":\"#000000\"},{\"x\":53,\"y\":18,\"fill\":\"#000000\"},{\"x\":53,\"y\":17,\"fill\":\"#000000\"},{\"x\":53,\"y\":16,\"fill\":\"#000000\"},{\"x\":53,\"y\":15,\"fill\":\"#000000\"},{\"x\":53,\"y\":14,\"fill\":\"#e0e1d4\"},{\"x\":53,\"y\":13,\"fill\":\"#e0e1d4\"},{\"x\":53,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":53,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":53,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":53,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":53,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":53,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":53,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":53,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":53,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":53,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":53,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":53,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":54,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":22,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":21,\"fill\":\"#0043bf\"},{\"x\":54,\"y\":20,\"fill\":\"#97b0d1\"},{\"x\":54,\"y\":19,\"fill\":\"#97b0d1\"},{\"x\":54,\"y\":18,\"fill\":\"#ced6d5\"},{\"x\":54,\"y\":17,\"fill\":\"#ced6d5\"},{\"x\":54,\"y\":16,\"fill\":\"#e0e1d4\"},{\"x\":54,\"y\":15,\"fill\":\"#e0e1d4\"},{\"x\":54,\"y\":14,\"fill\":\"#e0e1d4\"},{\"x\":54,\"y\":13,\"fill\":\"#e0e1d4\"},{\"x\":54,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":54,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":54,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":54,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":54,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":54,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":54,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":54,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":54,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":54,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":54,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":54,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":55,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":22,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":21,\"fill\":\"#0043bf\"},{\"x\":55,\"y\":20,\"fill\":\"#97b0d1\"},{\"x\":55,\"y\":19,\"fill\":\"#97b0d1\"},{\"x\":55,\"y\":18,\"fill\":\"#ced6d5\"},{\"x\":55,\"y\":17,\"fill\":\"#ced6d5\"},{\"x\":55,\"y\":16,\"fill\":\"#e0e1d4\"},{\"x\":55,\"y\":15,\"fill\":\"#e0e1d4\"},{\"x\":55,\"y\":14,\"fill\":\"#e0e1d4\"},{\"x\":55,\"y\":13,\"fill\":\"#e0e1d4\"},{\"x\":55,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":55,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":55,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":55,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":55,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":55,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":55,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":55,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":55,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":55,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":55,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":55,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":56,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":60,\"fill\":\"#ffffff\"},{\"x\":56,\"y\":59,\"fill\":\"#ffffff\"},{\"x\":56,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":22,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":21,\"fill\":\"#0043bf\"},{\"x\":56,\"y\":20,\"fill\":\"#b7c7d4\"},{\"x\":56,\"y\":19,\"fill\":\"#b7c7d4\"},{\"x\":56,\"y\":18,\"fill\":\"#e0e1d4\"},{\"x\":56,\"y\":17,\"fill\":\"#e0e1d4\"},{\"x\":56,\"y\":16,\"fill\":\"#e0e1d4\"},{\"x\":56,\"y\":15,\"fill\":\"#e0e1d4\"},{\"x\":56,\"y\":14,\"fill\":\"#e0e1d4\"},{\"x\":56,\"y\":13,\"fill\":\"#e0e1d4\"},{\"x\":56,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":56,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":56,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":56,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":56,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":56,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":56,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":56,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":56,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":56,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":56,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":56,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":57,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":60,\"fill\":\"#ffffff\"},{\"x\":57,\"y\":59,\"fill\":\"#ffffff\"},{\"x\":57,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":22,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":21,\"fill\":\"#0043bf\"},{\"x\":57,\"y\":20,\"fill\":\"#b7c7d4\"},{\"x\":57,\"y\":19,\"fill\":\"#b7c7d4\"},{\"x\":57,\"y\":18,\"fill\":\"#e0e1d4\"},{\"x\":57,\"y\":17,\"fill\":\"#e0e1d4\"},{\"x\":57,\"y\":16,\"fill\":\"#e0e1d4\"},{\"x\":57,\"y\":15,\"fill\":\"#e0e1d4\"},{\"x\":57,\"y\":14,\"fill\":\"#e0e1d4\"},{\"x\":57,\"y\":13,\"fill\":\"#e0e1d4\"},{\"x\":57,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":57,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":57,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":57,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":57,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":57,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":57,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":57,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":57,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":57,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":57,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":57,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":58,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":22,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":21,\"fill\":\"#0043bf\"},{\"x\":58,\"y\":20,\"fill\":\"#b3c4d3\"},{\"x\":58,\"y\":19,\"fill\":\"#b3c4d3\"},{\"x\":58,\"y\":18,\"fill\":\"#e0e1d4\"},{\"x\":58,\"y\":17,\"fill\":\"#e0e1d4\"},{\"x\":58,\"y\":16,\"fill\":\"#e0e1d4\"},{\"x\":58,\"y\":15,\"fill\":\"#e0e1d4\"},{\"x\":58,\"y\":14,\"fill\":\"#e0e1d4\"},{\"x\":58,\"y\":13,\"fill\":\"#e0e1d4\"},{\"x\":58,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":58,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":58,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":58,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":58,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":58,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":58,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":58,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":58,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":58,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":58,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":58,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":59,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":22,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":21,\"fill\":\"#0043bf\"},{\"x\":59,\"y\":20,\"fill\":\"#b3c4d3\"},{\"x\":59,\"y\":19,\"fill\":\"#b3c4d3\"},{\"x\":59,\"y\":18,\"fill\":\"#e0e1d4\"},{\"x\":59,\"y\":17,\"fill\":\"#e0e1d4\"},{\"x\":59,\"y\":16,\"fill\":\"#e0e1d4\"},{\"x\":59,\"y\":15,\"fill\":\"#e0e1d4\"},{\"x\":59,\"y\":14,\"fill\":\"#e0e1d4\"},{\"x\":59,\"y\":13,\"fill\":\"#e0e1d4\"},{\"x\":59,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":59,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":59,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":59,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":59,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":59,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":59,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":59,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":59,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":59,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":59,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":59,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":60,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":52,\"fill\":\"#ffffff\"},{\"x\":60,\"y\":51,\"fill\":\"#ffffff\"},{\"x\":60,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":22,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":21,\"fill\":\"#0043bf\"},{\"x\":60,\"y\":20,\"fill\":\"#b3c4d3\"},{\"x\":60,\"y\":19,\"fill\":\"#b3c4d3\"},{\"x\":60,\"y\":18,\"fill\":\"#e0e1d4\"},{\"x\":60,\"y\":17,\"fill\":\"#e0e1d4\"},{\"x\":60,\"y\":16,\"fill\":\"#e0e1d4\"},{\"x\":60,\"y\":15,\"fill\":\"#e0e1d4\"},{\"x\":60,\"y\":14,\"fill\":\"#e0e1d4\"},{\"x\":60,\"y\":13,\"fill\":\"#e0e1d4\"},{\"x\":60,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":60,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":60,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":60,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":60,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":60,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":60,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":60,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":60,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":60,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":60,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":60,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":61,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":52,\"fill\":\"#ffffff\"},{\"x\":61,\"y\":51,\"fill\":\"#ffffff\"},{\"x\":61,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":36,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":35,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":30,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":29,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":22,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":21,\"fill\":\"#0043bf\"},{\"x\":61,\"y\":20,\"fill\":\"#b3c4d3\"},{\"x\":61,\"y\":19,\"fill\":\"#b3c4d3\"},{\"x\":61,\"y\":18,\"fill\":\"#e0e1d4\"},{\"x\":61,\"y\":17,\"fill\":\"#e0e1d4\"},{\"x\":61,\"y\":16,\"fill\":\"#e0e1d4\"},{\"x\":61,\"y\":15,\"fill\":\"#e0e1d4\"},{\"x\":61,\"y\":14,\"fill\":\"#e0e1d4\"},{\"x\":61,\"y\":13,\"fill\":\"#e0e1d4\"},{\"x\":61,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":61,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":61,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":61,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":61,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":61,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":61,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":61,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":61,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":61,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":61,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":61,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":62,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":36,\"fill\":\"#ffffff\"},{\"x\":62,\"y\":35,\"fill\":\"#ffffff\"},{\"x\":62,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":30,\"fill\":\"#ffffff\"},{\"x\":62,\"y\":29,\"fill\":\"#ffffff\"},{\"x\":62,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":22,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":21,\"fill\":\"#0043bf\"},{\"x\":62,\"y\":20,\"fill\":\"#b1c2d1\"},{\"x\":62,\"y\":19,\"fill\":\"#adbecd\"},{\"x\":62,\"y\":18,\"fill\":\"#e0e1d4\"},{\"x\":62,\"y\":17,\"fill\":\"#e0e1d4\"},{\"x\":62,\"y\":16,\"fill\":\"#e0e1d4\"},{\"x\":62,\"y\":15,\"fill\":\"#e0e1d4\"},{\"x\":62,\"y\":14,\"fill\":\"#e0e1d4\"},{\"x\":62,\"y\":13,\"fill\":\"#e0e1d4\"},{\"x\":62,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":62,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":62,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":62,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":62,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":62,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":62,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":62,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":62,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":62,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":62,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":62,\"y\":1,\"fill\":\"#e0e1d4\"},{\"x\":63,\"y\":64,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":63,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":62,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":61,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":60,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":59,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":58,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":57,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":56,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":55,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":54,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":53,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":52,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":51,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":50,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":49,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":48,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":47,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":46,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":45,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":44,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":43,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":42,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":41,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":40,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":39,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":38,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":37,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":36,\"fill\":\"#ffffff\"},{\"x\":63,\"y\":35,\"fill\":\"#ffffff\"},{\"x\":63,\"y\":34,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":33,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":32,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":31,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":30,\"fill\":\"#ffffff\"},{\"x\":63,\"y\":29,\"fill\":\"#ffffff\"},{\"x\":63,\"y\":28,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":27,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":26,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":25,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":24,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":23,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":22,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":21,\"fill\":\"#0043bf\"},{\"x\":63,\"y\":20,\"fill\":\"#b1c2d1\"},{\"x\":63,\"y\":19,\"fill\":\"#adbecd\"},{\"x\":63,\"y\":18,\"fill\":\"#e0e1d4\"},{\"x\":63,\"y\":17,\"fill\":\"#e0e1d4\"},{\"x\":63,\"y\":16,\"fill\":\"#e0e1d4\"},{\"x\":63,\"y\":15,\"fill\":\"#e0e1d4\"},{\"x\":63,\"y\":14,\"fill\":\"#e0e1d4\"},{\"x\":63,\"y\":13,\"fill\":\"#e0e1d4\"},{\"x\":63,\"y\":12,\"fill\":\"#e0e1d4\"},{\"x\":63,\"y\":11,\"fill\":\"#e0e1d4\"},{\"x\":63,\"y\":10,\"fill\":\"#e0e1d4\"},{\"x\":63,\"y\":9,\"fill\":\"#e0e1d4\"},{\"x\":63,\"y\":8,\"fill\":\"#e0e1d4\"},{\"x\":63,\"y\":7,\"fill\":\"#e0e1d4\"},{\"x\":63,\"y\":6,\"fill\":\"#e0e1d4\"},{\"x\":63,\"y\":5,\"fill\":\"#e0e1d4\"},{\"x\":63,\"y\":4,\"fill\":\"#e0e1d4\"},{\"x\":63,\"y\":3,\"fill\":\"#e0e1d4\"},{\"x\":63,\"y\":2,\"fill\":\"#e0e1d4\"},{\"x\":63,\"y\":1,\"fill\":\"#e0e1d4\"}];\n\nfunction Santa() {\n  const santa = santaData;\n  return (\n    <VictoryScatter\n      style={cellStyle}\n      data={santa}\n      width={sceneWidth}\n      height={sceneHeight}\n      standalone={false}\n      domain={domain}\n    />\n  );\n}\n\nconst snowColor = \"#E0E1D4\";\nfunction getSnowFlake(x, y) {\n  return [\n    { x, y, fill: snowColor },\n    { x: x + 1, y, fill: snowColor },\n    { x, y: y - 1, fill: snowColor },\n    { x: x + 1, y: y - 1, fill: snowColor },\n  ];\n}\n\nconst snow = [\n  ...getSnowFlake(20, frameHeight),\n  ...getSnowFlake(6, frameHeight - 2),\n  ...getSnowFlake(50, frameHeight - 2),\n  ...getSnowFlake(12, frameHeight - 4),\n  ...getSnowFlake(24, frameHeight - 4),\n  ...getSnowFlake(52, frameHeight - 4),\n  ...getSnowFlake(58, frameHeight - 12),\n  ...getSnowFlake(14, frameHeight - 14),\n  ...getSnowFlake(18, frameHeight - 18),\n  ...getSnowFlake(50, frameHeight - 22),\n  ...getSnowFlake(0, frameHeight - 24),\n  ...getSnowFlake(10, frameHeight - 26),\n  ...getSnowFlake(36, frameHeight - 28),\n  ...getSnowFlake(60, frameHeight - 28),\n  ...getSnowFlake(50, frameHeight - 30),\n];\n\nfunction fall(flakes) {\n  return flakes.map((flake) => ({\n    ...flake,\n    y: flake.y - 1 < 14 ? frameHeight : flake.y - 1,\n  }));\n}\n\nfunction useSnowflakes() {\n  const prevTimestamp = React.useRef(0);\n  const accum = React.useRef(0);\n\n  const [snowFlakes, setSnowflakes] = React.useState(snow);\n\n  function update() {\n    setSnowflakes((snowFlakes) => [...fall(snowFlakes)]);\n  }\n\n  function tick(timestamp) {\n    const elapsed = timestamp - prevTimestamp.current;\n    prevTimestamp.current = timestamp;\n\n    accum.current += elapsed;\n    if (accum.current >= frameRate) {\n      accum.current -= frameRate;\n      update();\n    }\n\n    window.requestAnimationFrame(tick);\n  }\n\n  React.useEffect(() => {\n    tick(performance.now());\n  }, []);\n\n  return { snowFlakes };\n}\n\nfunction Snow() {\n  const { snowFlakes } = useSnowflakes();\n\n  return (\n    <VictoryScatter\n      style={cellStyle}\n      data={snowFlakes}\n      width={sceneWidth}\n      height={sceneHeight}\n      standalone={false}\n      domain={domain}\n    />\n  );\n}\n\nfunction App() {\n  return (\n    <div style={{ backgroundColor: '#242424' }}>\n      <svg width={sceneWidth} height={sceneHeight}>\n        <Santa />\n        <Snow />\n      </svg>\n    </div>\n  );\n}\n\nrender(<App/>);\n```\n"
  },
  {
    "path": "website/docs/examples/area-hover.mdx",
    "content": "---\ntitle: Area - Advanced Hover\n---\n\n```jsx live noInline\nfunction CustomArea(props) {\n  if (!props.active) {\n    return <Area {...props} />;\n  } else {\n    const { data, activeX, scale, style } = props;\n    const index = data.findIndex(val => val._x.getTime() === activeX.getTime());\n    const previousPoint = index === 0 ? activeX : data[index - 1]._x;\n    const nextPoint = index === data.length - 1 ? activeX : data[index + 1]._x;\n    // create a copy of the x dimension scale, and set the range to [0, 100] to easily calculate a percentage for the gradient offsets\n    const percentScale = scale.x.copy().range([0, 100]);\n    // calculate the percentages for current, previous, and next points\n    const currentPercent = percentScale(activeX);\n    const previousPercent = percentScale(previousPoint);\n    const nextPercent = percentScale(nextPoint);\n    const minPercent = currentPercent - (currentPercent - previousPercent) / 2;\n    const maxPercent = currentPercent + (nextPercent - currentPercent) / 2;\n\n    const gradientId = Math.random();\n    const isBrowser =\n      typeof window !== \"undefined\" && window.__STATIC_GENERATOR !== true;\n    const loc = isBrowser ? window.location.href : \"\";\n    const newStyle = Object.assign({}, style, {\n      fill: `url(${loc}#${gradientId})`,\n      stroke: \"none\"\n    });\n\n    return (\n      <g>\n        <defs>\n          <linearGradient id={gradientId}>\n            <stop offset=\"0%\" stopColor={style.fill} />\n            <stop offset={`${minPercent}%`} stopColor={style.fill} />\n            <stop offset={`${minPercent}%`} stopColor={\"tomato\"} />\n            <stop offset={`${maxPercent}%`} stopColor={\"tomato\"} />\n            <stop offset={`${maxPercent}%`} stopColor={style.fill} />\n            <stop offset=\"100%\" stopColor={style.fill} />\n          </linearGradient>\n        </defs>\n        <Area {...props} style={newStyle} />\n      </g>\n    );\n  }\n}\n\nfunction App() {\n  const [state, setState] = React.useState({\n    activeX: null\n  });\n\n  function onActivated(points, props) {\n    setState({ activeX: points[0]._x });\n  }\n\n  return (\n    <VictoryChart\n      scale={{ x: \"time\" }}\n      containerComponent={\n        <VictoryVoronoiContainer onActivated={onActivated} />\n      }\n      theme={VictoryTheme.clean}\n    >\n      <VictoryStack colorScale=\"blue\">\n        <VictoryArea\n          data={[\n            { x: new Date(1986, 1, 1), y: 2 },\n            { x: new Date(1996, 1, 1), y: 3 },\n            { x: new Date(2006, 1, 1), y: 5 },\n            { x: new Date(2016, 1, 1), y: 4 }\n          ]}\n          dataComponent={<CustomArea activeX={state.activeX} />}\n        />\n\n        <VictoryArea\n          data={[\n            { x: new Date(1986, 1, 1), y: 4 },\n            { x: new Date(1996, 1, 1), y: 3 },\n            { x: new Date(2006, 1, 1), y: 2 },\n            { x: new Date(2016, 1, 1), y: 5 }\n          ]}\n          dataComponent={<CustomArea activeX={state.activeX} />}\n        />\n        <VictoryArea\n          data={[\n            { x: new Date(1986, 1, 1), y: 3 },\n            { x: new Date(1996, 1, 1), y: 1 },\n            { x: new Date(2006, 1, 1), y: 4 },\n            { x: new Date(2016, 1, 1), y: 2 }\n          ]}\n          dataComponent={<CustomArea activeX={state.activeX} />}\n        />\n      </VictoryStack>\n    </VictoryChart>\n  );\n}\n\nrender(<App/>);\n```\n"
  },
  {
    "path": "website/docs/examples/area-stream-graph.mdx",
    "content": "---\ntitle: Area - Steam Graph\n---\n\n```jsx live noInline\n// This custom path component is supplied to `Area` as the `pathComponent` prop\nfunction GradientPath(props) {\n  const toGrayscale = color => {\n    const integerColor = parseInt(color.replace(\"#\", \"\"), 16);\n    const r = (integerColor >> 16) & 255; // eslint-disable-line no-bitwise\n    const g = (integerColor >> 8) & 255; // eslint-disable-line no-bitwise\n    const b = integerColor & 255; // eslint-disable-line no-bitwise\n    const gray = parseInt(0.299 * r + 0.587 * g + 0.114 * b, 10);\n    return `rgb(${gray}, ${gray}, ${gray})`;\n  };\n\n  const { percent, style = {}, ...rest } = props;\n\n  const gradientId = `gradient-${Math.random()}`;\n  const isBrowser =\n    typeof window !== \"undefined\" && window.__STATIC_GENERATOR !== true;\n  const loc = isBrowser ? window.location.href : \"\";\n  const areaStyle = Object.assign({}, style, {\n    fill: `url(${loc}#${gradientId})`,\n    stroke: \"none\"\n  });\n\n  return (\n    <g key=\"area\">\n      <defs>\n        <linearGradient id={gradientId}>\n          <stop offset=\"0%\" stopColor={style.fill} />\n          <stop offset={`${percent}%`} stopColor={style.fill} />\n          <stop offset={`${percent}%`} stopColor={toGrayscale(style.fill)} />\n          <stop offset=\"100%\" stopColor={toGrayscale(style.fill)} />\n        </linearGradient>\n      </defs>\n      <path key=\"area\" {...rest} style={areaStyle} />\n    </g>\n  );\n}\n\nfunction App() {\n  const [state, setState] = React.useState({ percent: 62 });\n\n  const streamData = getStreamData();\n\n  const colors = [\n    \"#006064\",\n    \"#00796B\",\n    \"#8BC34A\",\n    \"#DCE775\",\n    \"#FFF59D\",\n    \"#F4511E\",\n    \"#c33409\"\n  ];\n\n  return (\n    <VictoryChart\n      domain={{\n        x: [0, 25],\n        y: [-300, 300]\n      }}\n    >\n      <VictoryAxis\n        style={{\n          axis: { stroke: \"none\" },\n          tickLabels: { fill: \"none\" },\n          grid: { stroke: \"gray\" }\n        }}\n        tickValues={[2, 4, 6, 8, 10, 12, 14, 17, 19, 21, 23, 25]}\n      />\n      <VictoryAxis\n        dependentAxis\n        style={{ tickLabels: { fontSize: 15 } }}\n        crossAxis={false}\n      />\n\n      {streamData.map((d, i) => (\n        <VictoryArea\n          key={i}\n          interpolation=\"monotoneX\"\n          data={d}\n          style={{ data: { fill: colors[i] } }}\n          dataComponent={\n            <Area\n              pathComponent={<GradientPath percent={state.percent} />}\n            />\n          }\n        />\n      ))}\n      <VictoryLine\n        style={{\n          data: {\n            stroke: \"#c33409\",\n            strokeWidth: 3\n          }\n        }}\n        data={[\n          {\n            x: (25 * state.percent) / 100,\n            y: -300\n          },\n          {\n            x: (25 * state.percent) / 100,\n            y: 300\n          }\n        ]}\n      />\n    </VictoryChart>\n  );\n}\n\nfunction getStreamData() {\n  return _.range(7).map(i =>\n    _.range(26).map(j => ({\n      x: j,\n      y: (10 - i) * _.random(10 - i, 20 - 2 * i),\n      _y0: -1 * (10 - i) * _.random(10 - i, 20 - 2 * i)\n    }))\n  );\n}\n\nrender(<App/>);\n```\n"
  },
  {
    "path": "website/docs/examples/axis-parallel-brush.mdx",
    "content": "---\ntitle: Axis - Parallel Brush\n---\n\n```jsx live noInline\nconst data = [\n  {\n    name: \"Adrien\",\n    strength: 5,\n    intelligence: 30,\n    speed: 500,\n    luck: 3,\n  },\n  {\n    name: \"Brice\",\n    strength: 1,\n    intelligence: 13,\n    speed: 550,\n    luck: 2,\n  },\n  {\n    name: \"Casey\",\n    strength: 4,\n    intelligence: 15,\n    speed: 80,\n    luck: 1,\n  },\n  {\n    name: \"Drew\",\n    strength: 3,\n    intelligence: 25,\n    speed: 600,\n    luck: 5,\n  },\n  {\n    name: \"Erin\",\n    strength: 9,\n    intelligence: 50,\n    speed: 350,\n    luck: 4,\n  },\n  {\n    name: \"Francis\",\n    strength: 2,\n    intelligence: 40,\n    speed: 200,\n    luck: 2,\n  },\n];\nconst attributes = [\n  \"strength\",\n  \"intelligence\",\n  \"speed\",\n  \"luck\",\n];\nconst height = 500;\nconst width = 700;\nconst padding = {\n  top: 100,\n  left: 50,\n  right: 50,\n  bottom: 50,\n};\n\nfunction getMaximumValues() {\n  // Find the maximum value for each axis. This will be used to normalize data and re-scale axis ticks\n  return attributes.map((attribute) => {\n    return data.reduce(\n      (memo, datum) => {\n        return datum[attribute] > memo\n          ? datum[attribute]\n          : memo;\n      },\n      -Infinity,\n    );\n  });\n}\n\nfunction normalizeData(maximumValues) {\n  // construct normalized datasets by dividing the value for each attribute by the maximum value\n  return data?.map((datum) => ({\n    name: datum.name,\n    data: attributes.map(\n      (attribute, i) => ({\n        x: attribute,\n        y:\n          datum[attribute] /\n          maximumValues[i],\n      }),\n    ),\n  }));\n}\n\nfunction App() {\n  const maximumValues =\n    getMaximumValues();\n  const datasets = normalizeData(\n    maximumValues,\n  );\n\n  const [state, setState] =\n    React.useState({\n      maximumValues,\n      datasets,\n      filters: {},\n      activeDatasets: [],\n      isFiltered: false,\n    });\n\n  function addNewFilters(\n    domain,\n    props,\n  ) {\n    const filters = state.filters || {};\n    const extent =\n      domain &&\n      Math.abs(domain[1] - domain[0]);\n    const minVal =\n      1 / Number.MAX_SAFE_INTEGER;\n    filters[props.name] =\n      extent <= minVal\n        ? undefined\n        : domain;\n    return filters;\n  }\n\n  function getActiveDatasets(filters) {\n    // Return the names from all datasets that have values within all filters\n    const isActive = (dataset) => {\n      return _.keys(filters).reduce(\n        (memo, name) => {\n          if (\n            !memo ||\n            !Array.isArray(\n              filters[name],\n            )\n          ) {\n            return memo;\n          }\n          const point = _.find(\n            dataset.data,\n            (d) => d.x === name,\n          );\n          return (\n            point &&\n            Math.max(\n              ...filters[name],\n            ) >= point.y &&\n            Math.min(\n              ...filters[name],\n            ) <= point.y\n          );\n        },\n        true,\n      );\n    };\n\n    return state.datasets\n      .map((dataset) => {\n        return isActive(\n          dataset,\n          filters,\n        )\n          ? dataset.name\n          : null;\n      })\n      .filter(Boolean);\n  }\n\n  function onDomainChange(\n    domain,\n    props,\n  ) {\n    const filters = addNewFilters(\n      domain,\n      props,\n    );\n    const isFiltered = !_.isEmpty(\n      _.values(filters).filter(Boolean),\n    );\n    const activeDatasets = isFiltered\n      ? getActiveDatasets(filters)\n      : state.datasets;\n\n    setState((state) => ({\n      ...state,\n      activeDatasets,\n      filters,\n      isFiltered,\n    }));\n  }\n\n  function isActive(dataset) {\n    // Determine whether a given dataset is active\n    return !state.isFiltered\n      ? true\n      : _.includes(\n          state.activeDatasets,\n          dataset.name,\n        );\n  }\n\n  function getAxisOffset(index) {\n    const step =\n      (width -\n        padding.left -\n        padding.right) /\n      (attributes.length - 1);\n    return step * index + padding.left;\n  }\n\n  return (\n    <VictoryChart\n      domain={{ y: [0, 1.1] }}\n      height={height}\n      width={width}\n      padding={padding}\n      theme={VictoryTheme.clean}\n    >\n      <VictoryAxis\n        style={{\n          tickLabels: { fontSize: 20 },\n          axis: { stroke: \"none\" },\n        }}\n        tickLabelComponent={\n          <VictoryLabel\n            y={padding.top - 40}\n          />\n        }\n      />\n      {state.datasets.map((dataset) => (\n        <VictoryLine\n          key={dataset.name}\n          name={dataset.name}\n          data={dataset.data}\n          groupComponent={<g />}\n          style={{\n            data: {\n              opacity: isActive(dataset)\n                ? 1\n                : 0.2,\n            },\n          }}\n        />\n      ))}\n      {attributes.map(\n        (attribute, index) => (\n          <VictoryAxis\n            dependentAxis\n            key={index}\n            axisComponent={\n              <VictoryBrushLine\n                name={attribute}\n                width={20}\n                onBrushDomainChange={\n                  onDomainChange\n                }\n              />\n            }\n            offsetX={getAxisOffset(\n              index,\n            )}\n            style={{\n              tickLabels: {\n                fontSize: 15,\n                padding: 15,\n                pointerEvents: \"none\",\n              },\n            }}\n            tickValues={[\n              0.2, 0.4, 0.6, 0.8, 1,\n            ]}\n            tickFormat={(tick) =>\n              Math.round(\n                tick *\n                  state.maximumValues[\n                    index\n                  ],\n              )\n            }\n          />\n        ),\n      )}\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n"
  },
  {
    "path": "website/docs/examples/bar-horizontal-stacked.mdx",
    "content": "---\ntitle: Bar - Horizontal Stacked\ndescription: Horizontal Stacked Bars with Custom Tooltips\n---\n\n```jsx live noInline\nconst axisTickValues = [30, 100];\nconst data = [[{ x: 0, y: 29 }], [{ x: 0, y: 70 }], [{ x: 0, y: 30 }]];\nconst styles = [\n  { data: { fill: \"#f3d437\", stroke: \"#d1b322\", strokeWidth: 1 } },\n  { data: { fill: \"#0ca340\", stroke: \"#0ca340\", strokeWidth: 1 } },\n  { data: { fill: \"#f3d437\", stroke: \"#d1b322\", strokeWidth: 1 } },\n];\n\nconst labelFn = ({ datum }) =>\n  datum.y < axisTickValues[0] ? `${datum.y} Low` : `${datum.y} Normal`;\n\nfunction App() {\n  return (\n    <div>\n      <VictoryChart>\n        <VictoryAxis\n          dependentAxis\n          tickValues={axisTickValues}\n          style={{\n            tickLabels: { fontSize: 10, padding: 10 },\n          }}\n        />\n        <VictoryStack style={{ data: { width: 10 } }} horizontal>\n          {data.map((d, i) => (\n            <VictoryBar\n              style={styles[i]}\n              data={d}\n              labels={i === 0 ? labelFn : undefined}\n              labelComponent={\n                <VictoryTooltip\n                  active\n                  dy={-10}\n                  horizontal={false}\n                  flyoutStyle={{\n                    fill: \"#fbf2ca\",\n                    stroke: \"#ae9308\",\n                    strokeWidth: 0.5,\n                  }}\n                />\n              }\n            />\n          ))}\n        </VictoryStack>\n      </VictoryChart>\n    </div>\n  );\n}\n\nrender(<App/>);\n```\n"
  },
  {
    "path": "website/docs/examples/bar-linked-brushing.mdx",
    "content": "---\ntitle: Bar - Linked Brushing\n---\n\n```jsx live noInline\nconst barData = [\n  {\n    name: \"SEA\",\n    range: [\n      new Date(2013, 1, 1),\n      new Date(2019, 1, 1),\n    ],\n  },\n  {\n    name: \"HKG\",\n    range: [\n      new Date(2015, 1, 1),\n      new Date(2015, 5, 1),\n    ],\n  },\n  {\n    name: \"LHR\",\n    range: [\n      new Date(2016, 5, 1),\n      new Date(2019, 1, 1),\n    ],\n  },\n  {\n    name: \"DEN\",\n    range: [\n      new Date(2018, 8, 1),\n      new Date(2019, 1, 1),\n    ],\n  },\n];\n\nconst pointData = [\n  {\n    name: \"SEA\",\n    date: new Date(2012, 9, 1),\n  },\n  {\n    name: \"HKG\",\n    date: new Date(2014, 3, 1),\n  },\n  {\n    name: \"LHR\",\n    date: new Date(2015, 6, 1),\n  },\n  {\n    name: \"DEN\",\n    date: new Date(2018, 3, 1),\n  },\n];\n\nconst containerStyle = {\n  display: \"flex\",\n  flexDirection: \"row\",\n  flexWrap: \"wrap\",\n  alignItems: \"center\",\n  justifyContent: \"center\",\n  paddingBottom: 50\n};\n\nconst domain = {\n  y: [\n    new Date(2012, 1, 1),\n    new Date(2019, 1, 1),\n  ],\n  x: [0.5, 4.5],\n};\n\nconst sharedProps = {\n  width: 800,\n  domain,\n};\n\nclass DraggablePoint extends React.Component {\n  static defaultEvents = [\n    {\n      target: \"data\",\n      eventHandlers: {\n        onMouseOver: (\n          evt,\n          targetProps,\n        ) => {\n          return [\n            {\n              mutation: () =>\n                Object.assign(\n                  targetProps,\n                  { active: true },\n                ),\n            },\n          ];\n        },\n        onMouseDown: (\n          evt,\n          targetProps,\n        ) => {\n          return [\n            {\n              mutation: () =>\n                Object.assign(\n                  targetProps,\n                  { dragging: true },\n                ),\n            },\n          ];\n        },\n        onMouseMove: (\n          evt,\n          targetProps,\n        ) => {\n          const {\n            onPointChange,\n            datum,\n            scale,\n          } = targetProps;\n\n          if (targetProps.dragging) {\n            const { x } =\n              Selection.getSVGEventCoordinates(\n                evt,\n              );\n            const point =\n              scale.y.invert(x);\n            const name = datum.name;\n\n            onPointChange({\n              name,\n              date: point,\n            });\n\n            return [\n              {\n                mutation: () =>\n                  Object.assign(\n                    targetProps,\n                    { x },\n                  ),\n              },\n            ];\n          }\n          return null;\n        },\n        onMouseUp: (\n          evt,\n          targetProps,\n        ) => {\n          return [\n            {\n              mutation: () =>\n                Object.assign(\n                  targetProps,\n                  {\n                    dragging: false,\n                    active: false,\n                  },\n                ),\n            },\n          ];\n        },\n        onMouseLeave: (\n          evt,\n          targetProps,\n        ) => {\n          return [\n            {\n              mutation: () =>\n                Object.assign(\n                  targetProps,\n                  {\n                    dragging: false,\n                    active: false,\n                  },\n                ),\n            },\n          ];\n        },\n      },\n    },\n  ];\n\n  render() {\n    return <Point {...this.props} />;\n  }\n}\n\nfunction App() {\n  const [zoomDomain, setZoomDomain] =\n    React.useState({});\n  const [bars, setBars] =\n    React.useState(barData);\n  const [points, setPoints] =\n    React.useState(pointData);\n\n  function handleZoom(domain) {\n    setZoomDomain(domain);\n  }\n\n  function onDomainChange(\n    domain,\n    props,\n  ) {\n    const { name } = props;\n    const newBars = bars.map((bar) =>\n      bar.name === name\n        ? { name, range: domain }\n        : bar,\n    );\n\n    setBars(newBars);\n  }\n\n  function onPointChange(point) {\n    const newPoints = points.map((p) =>\n      p.name === point.name ? point : p,\n    );\n    setPoints(newPoints);\n  }\n\n  return (\n    <div style={containerStyle}>\n      <VictoryChart\n        theme={VictoryTheme.clean}\n        horizontal\n        {...sharedProps}\n        containerComponent={\n          <VictoryZoomContainer\n            responsive={false}\n            allowPan={false}\n            zoomDomain={zoomDomain}\n            zoomDimension=\"y\"\n            onZoomDomainChange={\n              handleZoom\n            }\n            clipContainerComponent={\n              <VictoryClipContainer\n                clipPadding={{\n                  top: 15,\n                  bottom: 15,\n                }}\n              />\n            }\n          />\n        }\n      >\n        <VictoryAxis\n          style={{\n            axis: { stroke: \"none\" },\n          }}\n        />\n\n        {bars.map((bar, index) => (\n          <VictoryAxis\n            dependentAxis\n            key={index}\n            axisComponent={\n              <VictoryBrushLine\n                name={bar.name}\n                width={20}\n                allowDraw={false}\n                brushDomain={bar.range}\n                onBrushDomainChange={\n                  onDomainChange\n                }\n                brushStyle={{\n                  fill: VictoryTheme\n                    .clean.palette\n                    ?.colors?.cyan,\n                  opacity: ({\n                    active,\n                  }) =>\n                    active ? 1 : 0.5,\n                }}\n              />\n            }\n            style={{\n              axis: { stroke: \"none\" },\n            }}\n            axisValue={bar.name}\n            tickFormat={() => \"\"}\n          />\n        ))}\n        <VictoryScatter\n          data={points}\n          dataComponent={\n            <DraggablePoint\n              onPointChange={\n                onPointChange\n              }\n            />\n          }\n          style={{\n            data: {\n              fill: VictoryTheme.clean\n                .palette?.colors?.cyan,\n              opacity: ({ active }) =>\n                active ? 1 : 0.5,\n              cursor: \"move\",\n            },\n          }}\n          x=\"name\"\n          y=\"date\"\n          size={10}\n        />\n      </VictoryChart>\n      <VictoryChart\n        theme={VictoryTheme.clean}\n        horizontal\n        {...sharedProps}\n        padding={{\n          top: 30,\n          left: 50,\n          right: 30,\n          bottom: 0,\n        }}\n        scale={{ y: \"time\" }}\n        height={120}\n        containerComponent={\n          <VictoryBrushContainer\n            responsive={false}\n            brushDomain={zoomDomain}\n            brushDimension=\"y\"\n            onBrushDomainChange={\n              handleZoom\n            }\n          />\n        }\n      >\n        <VictoryAxis\n          style={{\n            axis: { stroke: \"none\" },\n          }}\n        />\n        <VictoryAxis\n          dependentAxis\n          orientation=\"top\"\n          style={{\n            axis: { stroke: \"none\" },\n            tickLabels: {\n              fontSize: 20,\n            },\n          }}\n          tickCount={3}\n          tickFormat={(t) =>\n            t.getFullYear()\n          }\n        />\n        <VictoryScatter\n          data={points}\n          size={5}\n          style={{\n            data: {\n              fill: VictoryTheme.clean\n                .palette?.colors?.cyan,\n            },\n          }}\n          x=\"name\"\n          y=\"date\"\n        />\n        <VictoryBar\n          style={{\n            data: {\n              fill: VictoryTheme.clean\n                .palette?.colors?.cyan,\n            },\n          }}\n          data={bars}\n          x=\"name\"\n          y={(d) => d.range[0]}\n          y0={(d) => d.range[1]}\n        />\n      </VictoryChart>\n    </div>\n  );\n}\n\nrender(<App />);\n```\n"
  },
  {
    "path": "website/docs/examples/custom-charts.mdx",
    "content": "---\n---\n\n# Custom Charts\n\nVictory lets you create fully custom charts that integrate seamlessly with the look and feel of your project. The following guide demonstrates how custom styles and modular chart components are used to create a cohesive chart with distinctive branding.\n\nThe following example shows how to create a chart with multiple independent axes without using the `VictoryChart` wrapper. This example also includes functional styles and axis customization.\n\n```jsx live noInline\nfunction CustomTheme() {\n  const styles = getStyles();\n  const dataSetOne = getDataSetOne();\n  const dataSetTwo = getDataSetTwo();\n  const tickValues = getTickValues();\n\n  return (\n    <svg style={styles.parent} viewBox=\"0 0 450 350\">\n\n      {/* Create stylistic elements */}\n      <rect x=\"0\" y=\"0\" width=\"10\" height=\"30\" fill=\"#f01616\"/>\n      <rect x=\"420\" y=\"10\" width=\"20\" height=\"20\" fill=\"#458ca8\"/>\n\n      {/* Define labels */}\n      <VictoryLabel x={25} y={24} style={styles.title}\n        text=\"An outlook\"\n      />\n      <VictoryLabel x={430} y={20} style={styles.labelNumber}\n        text=\"1\"\n      />\n      <VictoryLabel x={25} y={55} style={styles.labelOne}\n        text={\"Economy \\n % change on a year earlier\"}\n      />\n      <VictoryLabel x={425} y={55} style={styles.labelTwo}\n        text={\"Dinosaur exports\\n $bn\"}\n      />\n\n      <g transform={\"translate(0, 40)\"}>\n        {/* Add shared independent axis */}\n        <VictoryAxis\n          scale=\"time\"\n          standalone={false}\n          style={styles.axisYears}\n          tickValues={tickValues}\n          tickFormat={\n            (x) => {\n              if (x.getFullYear() === 2000) {\n                return x.getFullYear();\n              }\n              if (x.getFullYear() % 5 === 0) {\n                return x.getFullYear().toString().slice(2);\n              }\n            }\n          }\n        />\n\n        {/*\n          Add the dependent axis for the first data set.\n          Note that all components plotted against this axis will have the same y domain\n        */}\n        <VictoryAxis dependentAxis\n          domain={[-10, 15]}\n          offsetX={50}\n          orientation=\"left\"\n          standalone={false}\n          style={styles.axisOne}\n        />\n\n        {/* Red annotation line */}\n        <VictoryLine\n          data={[\n            {x: new Date(1999, 1, 1), y: 0},\n            {x: new Date(2014, 6, 1), y: 0}\n          ]}\n          domain={{\n            x: [new Date(1999, 1, 1), new Date(2016, 1, 1)],\n            y: [-10, 15]\n          }}\n          scale={{x: \"time\", y: \"linear\"}}\n          standalone={false}\n          style={styles.lineThree}\n        />\n\n        {/* dataset one */}\n        <VictoryLine\n          data={dataSetOne}\n          domain={{\n            x: [new Date(1999, 1, 1), new Date(2016, 1, 1)],\n            y: [-10, 15]\n          }}\n          interpolation=\"monotoneX\"\n          scale={{x: \"time\", y: \"linear\"}}\n          standalone={false}\n          style={styles.lineOne}\n        />\n\n        {/*\n          Add the dependent axis for the second data set.\n          Note that all components plotted against this axis will have the same y domain\n        */}\n        <VictoryAxis dependentAxis\n          domain={[0, 50]}\n          orientation=\"right\"\n          standalone={false}\n          style={styles.axisTwo}\n        />\n\n        {/* dataset two */}\n        <VictoryLine\n          data={dataSetTwo}\n          domain={{\n            x: [new Date(1999, 1, 1), new Date(2016, 1, 1)],\n            y: [0, 50]\n          }}\n          interpolation=\"monotoneX\"\n          scale={{x: \"time\", y: \"linear\"}}\n          standalone={false}\n          style={styles.lineTwo}\n        />\n      </g>\n    </svg>\n  );\n}\n\nfunction getDataSetOne() {\n  return [\n    {x: new Date(2000, 1, 1), y: 12},\n    {x: new Date(2000, 6, 1), y: 10},\n    {x: new Date(2000, 12, 1), y: 11},\n    {x: new Date(2001, 1, 1), y: 5},\n    {x: new Date(2002, 1, 1), y: 4},\n    {x: new Date(2003, 1, 1), y: 6},\n    {x: new Date(2004, 1, 1), y: 5},\n    {x: new Date(2005, 1, 1), y: 7},\n    {x: new Date(2006, 1, 1), y: 8},\n    {x: new Date(2007, 1, 1), y: 9},\n    {x: new Date(2008, 1, 1), y: -8.5},\n    {x: new Date(2009, 1, 1), y: -9},\n    {x: new Date(2010, 1, 1), y: 5},\n    {x: new Date(2013, 1, 1), y: 1},\n    {x: new Date(2014, 1, 1), y: 2},\n    {x: new Date(2015, 1, 1), y: -5}\n  ];\n}\n\nfunction getDataSetTwo() {\n  return [\n    {x: new Date(2000, 1, 1), y: 5},\n    {x: new Date(2003, 1, 1), y: 6},\n    {x: new Date(2004, 1, 1), y: 4},\n    {x: new Date(2005, 1, 1), y: 10},\n    {x: new Date(2006, 1, 1), y: 12},\n    {x: new Date(2007, 2, 1), y: 48},\n    {x: new Date(2008, 1, 1), y: 19},\n    {x: new Date(2009, 1, 1), y: 31},\n    {x: new Date(2011, 1, 1), y: 49},\n    {x: new Date(2014, 1, 1), y: 40},\n    {x: new Date(2015, 1, 1), y: 21}\n  ];\n}\n\nfunction getTickValues() {\n  return [\n    new Date(1999, 1, 1),\n    new Date(2000, 1, 1),\n    new Date(2001, 1, 1),\n    new Date(2002, 1, 1),\n    new Date(2003, 1, 1),\n    new Date(2004, 1, 1),\n    new Date(2005, 1, 1),\n    new Date(2006, 1, 1),\n    new Date(2007, 1, 1),\n    new Date(2008, 1, 1),\n    new Date(2009, 1, 1),\n    new Date(2010, 1, 1),\n    new Date(2011, 1, 1),\n    new Date(2012, 1, 1),\n    new Date(2013, 1, 1),\n    new Date(2014, 1, 1),\n    new Date(2015, 1, 1),\n    new Date(2016, 1, 1)\n  ];\n}\n\nfunction getStyles() {\n  const BLUE_COLOR = \"#00a3de\";\n  const RED_COLOR = \"#7c270b\";\n\n  return {\n    parent: {\n      background: \"#ccdee8\",\n      boxSizing: \"border-box\",\n      display: \"inline\",\n      padding: 0,\n      fontFamily: \"'Fira Sans', sans-serif\"\n    },\n    title: {\n      textAnchor: \"start\",\n      verticalAnchor: \"end\",\n      fill: \"#000000\",\n      fontFamily: \"inherit\",\n      fontSize: \"18px\",\n      fontWeight: \"bold\"\n    },\n    labelNumber: {\n      textAnchor: \"middle\",\n      fill: \"#ffffff\",\n      fontFamily: \"inherit\",\n      fontSize: \"14px\"\n    },\n\n    // INDEPENDENT AXIS\n    axisYears: {\n      axis: { stroke: \"black\", strokeWidth: 1},\n      ticks: {\n        size: ({ tick }) => {\n          const tickSize =\n            tick.getFullYear() % 5 === 0 ? 10 : 5;\n          return tickSize;\n        },\n        stroke: \"black\",\n        strokeWidth: 1\n      },\n      tickLabels: {\n        fill: \"black\",\n        fontFamily: \"inherit\",\n        fontSize: 16\n      }\n    },\n\n    // DATA SET ONE\n    axisOne: {\n      grid: {\n        stroke: ({ tick }) =>\n          tick === -10 ? \"transparent\" : \"#ffffff\",\n        strokeWidth: 2\n      },\n      axis: { stroke: BLUE_COLOR, strokeWidth: 0 },\n      ticks: { strokeWidth: 0 },\n      tickLabels: {\n        fill: BLUE_COLOR,\n        fontFamily: \"inherit\",\n        fontSize: 16\n      }\n    },\n    labelOne: {\n      fill: BLUE_COLOR,\n      fontFamily: \"inherit\",\n      fontSize: 12,\n      fontStyle: \"italic\"\n    },\n    lineOne: {\n      data: { stroke: BLUE_COLOR, strokeWidth: 4.5 }\n    },\n    axisOneCustomLabel: {\n      fill: BLUE_COLOR,\n      fontFamily: \"inherit\",\n      fontWeight: 300,\n      fontSize: 21\n    },\n\n    // DATA SET TWO\n    axisTwo: {\n      axis: { stroke: RED_COLOR, strokeWidth: 0 },\n      tickLabels: {\n        fill: RED_COLOR,\n        fontFamily: \"inherit\",\n        fontSize: 16\n      }\n    },\n    labelTwo: {\n      textAnchor: \"end\",\n      fill: RED_COLOR,\n      fontFamily: \"inherit\",\n      fontSize: 12,\n      fontStyle: \"italic\"\n    },\n    lineTwo: {\n      data: { stroke: RED_COLOR, strokeWidth: 4.5 }\n    },\n\n    // HORIZONTAL LINE\n    lineThree: {\n      data: { stroke: \"#e95f46\", strokeWidth: 2 }\n    }\n  };\n}\n\nrender(<CustomTheme/>);\n```\n"
  },
  {
    "path": "website/docs/examples/histogram-with-slider.mdx",
    "content": "---\ntitle: Histogram - Slider\n---\n\n```jsx live noInline\nconst LIGHT_GREY = \"hsl(355, 20%, 90%)\";\nconst PRIMARY_COLOR =\n  \"hsl(355, 92%, 67%)\";\n\nconst yearToSeason = (year) =>\n  `${year}-${(year + 1 + \"\").slice(\n    2,\n    4,\n  )}`;\n\nconst basketballData = _.range(2000, 2020).reduce(\n  (accum, year) => {\n    accum[year] = _.range(1, 200).map(\n      (idx) => ({\n        player: `player ${idx}`,\n        \"3pa\": _.random(0, 100) / 12,\n      }),\n    );\n    return accum;\n  },\n  {},\n);\n\nconst YEARS = Object.keys(\n  basketballData,\n).map((year) => parseInt(year, 10));\nconst FIRST_YEAR = YEARS[0];\nconst LAST_YEAR =\n  YEARS[YEARS.length - 1];\nconst TOTAL_YEARS =\n  LAST_YEAR - FIRST_YEAR;\n\nconst getTooltipText = ({ datum }) => {\n  const { binnedData, x0, x1 } = datum;\n\n  const playerCount = binnedData.length;\n\n  if (!playerCount) {\n    return null;\n  }\n\n  const playerNames = binnedData\n    .slice(0, 2)\n    .map(({ player }) => {\n      const [firstName, lastName] =\n        player.split(\" \");\n      return lastName\n        ? `${firstName.slice(\n            0,\n            1,\n          )}. ${lastName}`\n        : firstName;\n    })\n    .join(\", \");\n\n  const playerNamesList = `\\n (${playerNames}${\n    playerCount > 2\n      ? `, and ${\n          playerCount - 2\n        } more players`\n      : \"\"\n  })`;\n\n  return `${playerCount} player${\n    playerCount === 1 ? \"\" : \"s\"\n  } averaged between ${x0}-${x1} 3PT attempts ${playerNamesList}`;\n};\n\nconst sharedAxisStyles = {\n  axis: {\n    stroke: \"transparent\",\n  },\n  tickLabels: {\n    fill: LIGHT_GREY,\n    fontSize: 14,\n  },\n  axisLabel: {\n    fill: LIGHT_GREY,\n    padding: 36,\n    fontSize: 15,\n    fontStyle: \"italic\",\n  },\n};\n\nconst App = () => {\n  const [year, setYear] =\n    React.useState(FIRST_YEAR);\n\n  return (\n    <div>\n      <svg className=\"fixed opacity-0\">\n        <defs>\n          <linearGradient\n            id=\"gradient1\"\n            x1=\"0%\"\n            y1=\"0%\"\n            x2=\"50%\"\n            y2=\"100%\"\n          >\n            <stop\n              offset=\"0%\"\n              stopColor=\"#FFE29F\"\n            />\n            <stop\n              offset=\"40%\"\n              stopColor=\"#FFA99F\"\n            />\n            <stop\n              offset=\"100%\"\n              stopColor={PRIMARY_COLOR}\n            />\n          </linearGradient>\n        </defs>\n      </svg>\n\n      <div className=\"xl:rounded-b-md pt-10 px-9 pb-8 bg-[#2b2a31]\">\n        <VictoryChart\n          containerComponent={\n            <VictoryVoronoiContainer\n              labels={getTooltipText}\n              voronoiDimension=\"x\"\n              labelComponent={\n                <VictoryTooltip\n                  constrainToVisibleArea\n                  style={{\n                    fill: LIGHT_GREY,\n                    fontSize: 11,\n                  }}\n                  flyoutStyle={{\n                    fill: \"#24232a\",\n                    stroke:\n                      PRIMARY_COLOR,\n                    strokeWidth: 0.5,\n                  }}\n                />\n              }\n            />\n          }\n          height={280}\n        >\n          <VictoryLabel\n            text={`3pt Attempts Per Game Averages (${yearToSeason(\n              year,\n            )})`}\n            x={225}\n            y={18}\n            textAnchor=\"middle\"\n            style={{\n              fill: LIGHT_GREY,\n              fontSize: 16,\n            }}\n          />\n          <VictoryAxis\n            style={{\n              ...sharedAxisStyles,\n              grid: {\n                fill: LIGHT_GREY,\n                stroke: LIGHT_GREY,\n                pointerEvents:\n                  \"painted\",\n                strokeWidth: 0.5,\n              },\n            }}\n            label=\"# of players\"\n            dependentAxis\n          />\n          <VictoryAxis\n            style={{\n              ...sharedAxisStyles,\n              axisLabel: {\n                ...sharedAxisStyles.axisLabel,\n                padding: 35,\n              },\n            }}\n            label=\"3pt attempts per game\"\n          />\n          <VictoryHistogram\n            cornerRadius={2}\n            domain={{ y: [0, 125] }}\n            animate={{ duration: 300 }}\n            data={basketballData[year]}\n            bins={_.range(0, 16, 2)}\n            style={{\n              data: {\n                stroke: \"transparent\",\n                fill: \"url(#gradient1)\",\n                strokeWidth: 1,\n              },\n              labels: {\n                fill: \"red\",\n              },\n            }}\n            x=\"3pa\"\n          />\n        </VictoryChart>\n\n        <YearSlider\n          year={year}\n          setYear={setYear}\n        />\n      </div>\n    </div>\n  );\n};\n\nconst getYear = (percent) =>\n  Math.round(\n    FIRST_YEAR +\n      TOTAL_YEARS * (percent / 100),\n  );\n\nconst SEASONS = YEARS.map((year) =>\n  yearToSeason(year),\n);\n\nconst YearSlider = ({\n  year,\n  setYear,\n}) => {\n  const [value, setValue] =\n    React.useState(0);\n\n  return (\n    <div className=\"pt-16 px-7 pb-2.5\">\n      <Slider\n        onChange={(newValue) => {\n          setValue(newValue);\n          const calculatedYear =\n            getYear(newValue);\n\n          if (year !== calculatedYear) {\n            setYear(calculatedYear);\n          }\n        }}\n        color={PRIMARY_COLOR}\n        value={value}\n        maxValue={100}\n        tooltipValues={SEASONS}\n      />\n    </div>\n  );\n};\n\nrender(<App />);\n```\n"
  },
  {
    "path": "website/docs/examples/polar-progress-bar.mdx",
    "content": "---\ntitle: Polar - Animated Progress Bar\n---\n\n```jsx live noInline\nfunction App() {\n  const [state, setState] = React.useState({\n    percent: 25, data: getData(0)\n  });\n\n  React.useState(() => {\n    const setStateInterval = window.setInterval(() => {\n      let percent = 25;\n      percent += (Math.random() * 25);\n      percent = (percent > 100) ? 0 : percent;\n      setState({\n        percent, data: getData(percent)\n      });\n    }, 2000);\n\n    return () => {\n      window.clearInterval(setStateInterval);\n    }\n  }, []);\n\n  return (\n    <div>\n      <svg viewBox=\"0 0 400 400\" width=\"100%\" height=\"100%\">\n        <VictoryPie\n          standalone={false}\n          animate={{ duration: 1000 }}\n          width={400} height={400}\n          data={state.data}\n          innerRadius={120}\n          cornerRadius={25}\n          labels={() => null}\n          style={{\n            data: { fill: ({ datum }) => {\n              const color = datum.y > 30 ? \"green\" : \"red\";\n              return datum.x === 1 ? color : \"transparent\";\n            }\n            }\n          }}\n        />\n        <VictoryAnimation duration={1000} data={state}>\n          {(newProps) => {\n            return (\n              <VictoryLabel\n                textAnchor=\"middle\" verticalAnchor=\"middle\"\n                x={200} y={200}\n                text={`${Math.round(newProps.percent)}%`}\n                style={{ fontSize: 45 }}\n              />\n            );\n          }}\n        </VictoryAnimation>\n      </svg>\n    </div>\n  );\n}\n\nfunction getData(percent) {\n  return [{ x: 1, y: percent }, { x: 2, y: 100 - percent }];\n}\n\nrender(<App/>);\n```\n"
  },
  {
    "path": "website/docs/examples/voronoi-tooltips-grouped.mdx",
    "content": "---\ntitle: Voronoi - Grouped Tooltips\n---\n\n```jsx live\n<VictoryChart \n  containerComponent={<VictoryVoronoiContainer/>}\n  theme={VictoryTheme.clean}\n>\n  <VictoryGroup\n    color=\"#c43a31\"\n    labels={({ datum }) => `y: ${datum.y}`}\n    labelComponent={\n      <VictoryTooltip\n        style={{ fontSize: 10 }}\n      />\n    }\n    data={[\n      { x: 1, y: -3 },\n      { x: 2, y: 5 },\n      { x: 3, y: 3 },\n      { x: 4, y: 0 },\n      { x: 5, y: -2 },\n      { x: 6, y: -2 },\n      { x: 7, y: 5 }\n    ]}\n  >\n    <VictoryLine/>\n    <VictoryScatter\n      size={({ active }) => active ? 8 : 3}\n    />\n  </VictoryGroup>\n  <VictoryGroup\n    labels={({ datum }) => `y: ${datum.y}`}\n    labelComponent={\n      <VictoryTooltip\n        style={{ fontSize: 10 }}\n      />\n    }\n    data={[\n      { x: 1, y: 3 },\n      { x: 2, y: 1 },\n      { x: 3, y: 2 },\n      { x: 4, y: -2 },\n      { x: 5, y: -1 },\n      { x: 6, y: 2 },\n      { x: 7, y: 3 }\n    ]}\n  >\n    <VictoryLine/>\n    <VictoryScatter\n      size={({ active }) => active ? 8 : 3}\n    />\n  </VictoryGroup>\n</VictoryChart>\n```\n"
  },
  {
    "path": "website/docs/guides/_category_.json",
    "content": "{\n  \"label\": \"Guides\",\n  \"position\": 2,\n  \"link\": null\n}\n"
  },
  {
    "path": "website/docs/guides/accessibility.mdx",
    "content": "---\ntitle: Accessibility\n---\n\nVictory provides a number of features to make your charts more accessible. This guide will walk you through some of the most important features.\n\n## Basic\n\nContainers like `VictoryChart` set the `role` attribute to `img` and expose the `desc` prop to provide a description of the chart for screen readers.\n\nChart types like `VictoryLine` and `VictoryBar` expose aria props like `aria-label` to provide additional context for screen readers. Adding a `tabIndex` attribute will make the data components focusable. (click on chart and press TAB key to focus)\n\n```jsx live\n<VictoryChart\n  aria-label=\"Simple Chart One\"\n  desc=\"Simple Chart One Description\"\n  domainPadding={{ x: 20 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar\n    ariaLabel=\"Bar Chart One\"\n    desc=\"Bar Chart One Description\"\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n    dataComponent={\n      <Bar\n        ariaLabel={({ datum }) =>\n          `x: ${datum.x}`\n        }\n        tabIndex={0}\n      />\n    }\n  />\n</VictoryChart>\n```\n\n## Groups\n\nUse `VictoryAccessibleGroup` to wrap a group of chart components. This will add a `role=\"group\"` attribute to the SVG element, which will make the chart more accessible to screen readers. Adding a `tabIndex` attribute will make the group focusable. (click on chart and press TAB key to focus)\n\n```jsx live\n<VictoryChart\n  desc=\"Simple Chart Two\"\n  domainPadding={{ x: 20 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryStack\n    groupComponent={\n      <VictoryAccessibleGroup\n        aria-label=\"Group Description Two\"\n        desc=\"Group Description Two Description\"\n      />\n    }\n  >\n    <VictoryBar\n      ariaLabel=\"Bar Chart Two\"\n      desc=\"Bar Chart Two Description\"\n      data={[\n        { x: 1, y: 2 },\n        { x: 2, y: 3 },\n        { x: 3, y: 5 },\n        { x: 4, y: 4 },\n        { x: 5, y: 7 },\n      ]}\n      dataComponent={\n      <Bar\n        ariaLabel={({ datum }) =>\n          `x: ${datum.x}`\n        }\n        tabIndex={0}\n      />\n      }\n    />\n    <VictoryBar\n      ariaLabel=\"Bar Chart Three\"\n      desc=\"Bar Chart Three Description\"\n      data={[\n        { x: 1, y: 2 },\n        { x: 2, y: 3 },\n        { x: 3, y: 5 },\n        { x: 4, y: 4 },\n        { x: 5, y: 7 },\n      ]}\n      dataComponent={\n      <Bar\n        ariaLabel={({ datum }) =>\n          `x: ${datum.x}`\n        }\n        tabIndex={0}\n      />\n      }\n    />\n  </VictoryGroup>\n</VictoryChart>\n```\n"
  },
  {
    "path": "website/docs/guides/animations.mdx",
    "content": "---\ntitle: Animations\n---\n\nVictory is able to animate changes in props using [d3-interpolate][]. Victory components define their animations via the `animate` prop. `duration`, `delay`, `easing` and `onEnd` functions may all be specified via the `animate` prop. An `animationWhitelist` may also be specified on the `animate` prop. When given, only props specified in the whitelist will animate.\n\n```jsx live noInline\nfunction App() {\n  const [state, setState] = React.useState({\n    scatterData: getScatterData()\n  });\n\n  React.useState(() => {\n    const setStateInterval = window.setInterval(() => {\n      setState({\n        scatterData: getScatterData()\n      });\n    }, 3000);\n\n    return () => {\n      window.clearInterval(setStateInterval);\n    }\n  }, []);\n\n  return (\n    <VictoryChart \n      animate={{ duration: 2000, easing: \"bounce\" }}\n      theme={VictoryTheme.clean}\n    >\n      <VictoryScatter\n        data={state.scatterData}\n        style={{\n          data: {\n            fill: ({ datum }) => datum.fill,\n            opacity: ({ datum }) => datum.opacity\n          }\n        }}\n      />\n    </VictoryChart>\n  );\n}\n\nfunction getScatterData() {\n  const colors =[\n    \"violet\", \"cornflowerblue\", \"gold\", \"orange\",\n    \"turquoise\", \"tomato\", \"greenyellow\"\n  ];\n  const symbols = [\n    \"circle\", \"star\", \"square\", \"triangleUp\",\n    \"triangleDown\", \"diamond\", \"plus\"\n  ];\n  return _.range(25).map((index) => {\n    const scaledIndex = Math.floor(index % 7);\n    return {\n      x: _.random(10, 50),\n      y: _.random(2, 100),\n      size: _.random(8) + 3,\n      symbol: symbols[scaledIndex],\n      fill: colors[_.random(0, 6)],\n      opacity: 0.6\n    };\n  });\n}\n\nrender(<App/>);\n```\n\n\n## Transitions\n\nVictory components define default transitions for entering and exiting nodes, but these may be overridden with the `onEnter` and `onExit` properties of the `animate` object. The `before` and `after` properties take functions whose return values alter the datum of the transitioning node before or after the transition. These functions are called with the original datum of the transitioning node, the index of that datum, and the entire data array.\n\n*note:* Use private variables `_x`, `_y`, `_y0` and `_y1` when altering position data during transitions.\n\n```jsx live noInline\nfunction App() {\n  const [state, setState] = React.useState({\n    data: getData()\n  });\n\n  React.useState(() => {\n    const setStateInterval = window.setInterval(() => {\n      setState({\n        data: getData()\n      });\n    }, 3000);\n\n    return () => {\n      window.clearInterval(setStateInterval);\n    }\n  }, []);\n\n  return (\n    <VictoryChart\n      animate={{duration: 500}}\n      domainPadding={{ x: 20 }}\n      theme={VictoryTheme.clean}\n    >\n      <VictoryBar\n        data={state.data}\n        style={{\n          data: { fill: \"tomato\", width: 12 }\n        }}\n        animate={{\n          onExit: {\n            duration: 500,\n            before: () => ({\n              _y: 0,\n              fill: \"orange\",\n              label: \"BYE\"\n            })\n          }\n        }}\n      />\n    </VictoryChart>\n  );\n}\n\nfunction getData() {\n  const bars = _.random(6, 10);\n  return _.range(bars).map((bar) => {\n    return {x: bar + 1, y: _.random(2, 10)};\n  });\n}\n\nrender(<App/>);\n```\n\n\n[d3-interpolate]: https://github.com/d3/d3-interpolate\n"
  },
  {
    "path": "website/docs/guides/annotations.mdx",
    "content": "---\ntitle: Annotations\n---\n\nWhen composing charts with `VictoryChart`, annotations can be added to your chart using `VictoryAnnotation`. This guide will cover the basic usage of `VictoryAnnotation` and its props.\n\n## Labels\n\nUse `VictoryLabel` as a child of `VictoryChart` to add arbitrary labels. Labels can be positioned with the `x` and `y` props, or with `datum` when used within `VictoryChart` or `VictoryGroup`.\n\n```jsx live\n<VictoryChart\n  domain={[0, 10]}\n  theme={VictoryTheme.clean}\n>\n  <VictoryLabel\n    text=\"Chart Title\"\n    x={225}\n    y={30}\n    textAnchor=\"middle\"\n  />\n  <VictoryLine y={(d) => d.x} />\n  <VictoryLabel\n    text=\"Annotation\"\n    datum={{ x: 4, y: 6 }}\n    textAnchor=\"middle\"\n  />\n</VictoryChart>\n```\n\n## Lines & Markers\n\nVictory doesn't have specific components for annotations. Instead, use standard components such as `VictoryLine` and `VictoryScatter` to add lines and markers to your chart.\n\n```jsx live\n<VictoryChart\n  domain={[0, 10]}\n  theme={VictoryTheme.clean}\n>\n  <VictoryLine y={(d) => d.x} />\n  <VictoryLine\n    style={{\n      data: {\n        stroke: \"red\",\n        strokeWidth: 1,\n      },\n      labels: {\n        angle: -90,\n        fill: \"red\",\n        fontSize: 20,\n      },\n    }}\n    labels={[\"Important\"]}\n    labelComponent={\n      <VictoryLabel y={100} />\n    }\n    x={() => 5}\n  />\n  <VictoryScatter\n    symbol=\"star\"\n    size={8}\n    style={{ data: { fill: \"red\" } }}\n    data={[{ x: 5, y: 5 }]}\n  />\n</VictoryChart>\n```\n"
  },
  {
    "path": "website/docs/guides/axis.mdx",
    "content": "---\ntitle: Axis\n---\n\nWhen composing charts with `VictoryChart`, axes will be automatically added to your chart.\n\nOptionally, you also can directly configure the axes using the [`VictoryAxis`](/docs/api/victory-axis) and [`VictoryPolarAxis`](/docs/api/victory-polar-axis) components by following this guide.\n\n## VictoryAxis\n\nCreates linear independent and dependent axes.\n\n:::info\nSee the full API for [`VictoryAxis`](/docs/api/victory-axis) for more details.\n:::\n\n---\n\n### Basic\n\nThe `VictoryAxis` component can be used to render a basic axis.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryAxis crossAxis />\n  <VictoryAxis dependentAxis />\n  <VictoryLine\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n  />\n</VictoryChart>\n```\n\n---\n\n### Axis - Single\n\nThe `crossAxis` prop can be used to render a horizontal axis, and the `dependentAxis` prop can be used to render a vertical axis.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryAxis crossAxis />\n  <VictoryLine\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n  />\n</VictoryChart>\n```\n\n### Axis - Gridlines\n\nGridlines can be shown by styling the axis component.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryAxis\n    crossAxis\n    style={{\n      grid: {\n        stroke: \"#CFD8DC\",\n        strokeDasharray: \"10, 5\",\n      },\n    }}\n  />\n  <VictoryAxis\n    dependentAxis\n    style={{\n      grid: {\n        stroke: ({ tick }) =>\n          tick === 5\n            ? \"#2d7ff9\"\n            : \"#CFD8DC\",\n        strokeDasharray: \"10, 5\",\n      },\n    }}\n  />\n  <VictoryLine\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n  />\n</VictoryChart>\n```\n\n---\n\n### Axis - Tick Values\n\nYou can specify the specific tick values you would like to display on the axis using the `tickValues` prop.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryAxis\n    crossAxis\n    tickValues={[0, 2, 4, 6]}\n  />\n  <VictoryLine\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n  />\n</VictoryChart>\n```\n\n---\n\n### Axis - Tick Label Format\n\nUse the `tickFormat` prop to customize axis labels. This prop can be given as an array of strings, or as a function that returns a string.\n\n:::caution\n`VictoryChart` automatically applies \"smart\" formatting to an axis for dates. When using a custom `VictoryAxis` or `VictoryPolarAxis`, you will need to format the tick values and labels manually as shown below.\n:::\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryAxis\n    crossAxis\n    tickFormat={(tick) =>\n      `$${Math.round(tick)}M`\n    }\n  />\n  <VictoryLine\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n  />\n</VictoryChart>\n```\n\n#### Multiline Label Support\n\nYou can also return an array of strings to create multiline labels.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryAxis\n    crossAxis\n    tickFormat={(tick) => [\n      `$${Math.round(tick)}`,\n      \"Million\",\n    ]}\n  />\n  <VictoryLine\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n  />\n</VictoryChart>\n```\n\n#### Time formats using `d3-time`\n\nTo replicate the behaviour of automatically formatting times in `VictoryChart`, you can use `d3-scale` to format the tick values and labels.\n\n```jsx live noInline\nconst data = [\n  { x: new Date(2021, 5, 1), y: 8 },\n  { x: new Date(2021, 5, 2), y: 10 },\n  { x: new Date(2021, 5, 3), y: 7 },\n  { x: new Date(2021, 5, 4), y: 4 },\n  { x: new Date(2021, 5, 7), y: 6 },\n  { x: new Date(2021, 5, 8), y: 3 },\n  { x: new Date(2021, 5, 9), y: 7 },\n  { x: new Date(2021, 5, 10), y: 9 },\n  { x: new Date(2021, 5, 11), y: 6 },\n];\n\nconst domain = {\n  x: [\n    Math.min(...data.map((d) => d.x)),\n    Math.max(...data.map((d) => d.x)),\n  ],\n};\n\n// ref: https://d3js.org/d3-scale/time\nconst timeScaledomain = d3Scale\n  .scaleTime()\n  .domain(domain.x);\n\n// ref: https://d3js.org/d3-scale/time#time_ticks\nconst ticks = timeScaledomain.ticks(6);\n\n// ref: https://d3js.org/d3-scale/time#time_tickFormat\nconst formatter =\n  timeScaledomain.tickFormat();\n\nfunction App() {\n  return (\n    <VictoryChart\n      theme={VictoryTheme.clean}\n    >\n      <VictoryAxis\n        crossAxis\n        tickValues={ticks}\n        tickFormat={formatter}\n      />\n      <VictoryLine data={data} />\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n\n### Axis - Offset Position\n\nYou can offset the position of the axis using the `offsetX` and `offsetY` props.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryAxis\n    dependentAxis\n    offsetX={225}\n  />\n  <VictoryLine\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n  />\n</VictoryChart>\n```\n\n---\n\n### Axis - Orientation\n\nThe axis orientation can be set to `top`, `bottom`, `left`, or `right` using the `orientation` prop.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryAxis\n    dependentAxis\n    orientation=\"right\"\n  />\n  <VictoryLine\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n  />\n</VictoryChart>\n```\n\n---\n\n### Axis - Labels\n\nThe axis supports labels using the `label` prop.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryAxis\n    dependentAxis\n    label=\"Sample Values\"\n  />\n  <VictoryAxis\n    crossAxis\n    label=\"Sample Input\"\n  />\n  <VictoryLine\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n  />\n</VictoryChart>\n```\n\n---\n\n### Axis - Multiple\n\nMultiple axes can be added to a chart by nesting `VictoryAxis` components within `VictoryChart`.\n\n:::info\nThe domain is shared between all dependent axes, so you need to normalize the data to fit the domain of each axis.\n:::\n\n```jsx live noInline\nconst data = [\n  { x: 1, amps: 4, temp: 44 },\n  { x: 2, amps: 6, temp: 51 },\n  { x: 3, amps: 11, temp: 65 },\n  { x: 4, amps: 12, temp: 71 },\n  { x: 5, amps: 10, temp: 71 },\n  { x: 6, amps: 13, temp: 71 },\n  { x: 7, amps: 11, temp: 71 },\n];\n\nconst ampRange = [0, 20];\nconst ampAxisColor =\n  VictoryTheme.clean.palette.blue[3];\n\nconst tempRange = [0, 100];\nconst tempAxisColor =\n  VictoryTheme.clean.palette.red[3];\n\nconst ticks = 10;\nconst tickValues = _.range(ticks + 1);\nconst domain = { y: [0, ticks] };\n\nconst tickFormat = (range) => (t) =>\n  (t * (range[1] - range[0])) / ticks;\n\nconst normalize =\n  (range, props) => (datum) =>\n    datum[props] /\n    ((range[1] - range[0]) / ticks);\n\nfunction App() {\n  return (\n    <VictoryChart\n      theme={VictoryTheme.clean}\n      domain={domain}\n    >\n      <VictoryAxis crossAxis />\n      <VictoryAxis\n        dependentAxis\n        orientation=\"left\"\n        tickValues={tickValues}\n        tickFormat={tickFormat(\n          ampRange,\n        )}\n        style={{\n          axis: {\n            stroke: ampAxisColor,\n          },\n          ticks: {\n            stroke: ampAxisColor,\n          },\n          tickLabels: {\n            fill: ampAxisColor,\n          },\n        }}\n      />\n      <VictoryAxis\n        dependentAxis\n        orientation=\"right\"\n        tickValues={tickValues}\n        tickFormat={tickFormat(\n          tempRange,\n        )}\n        style={{\n          axis: {\n            stroke: tempAxisColor,\n          },\n          ticks: {\n            stroke: tempAxisColor,\n          },\n          tickLabels: {\n            fill: tempAxisColor,\n          },\n        }}\n      />\n      <VictoryLine\n        data={data}\n        y={normalize(ampRange, \"amps\")}\n        style={{\n          data: {\n            stroke: ampAxisColor,\n          },\n        }}\n      />\n      <VictoryLine\n        data={data}\n        y={normalize(tempRange, \"temp\")}\n        style={{\n          data: {\n            stroke: tempAxisColor,\n          },\n        }}\n      />\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n\n---\n\n### Axis - Dependent\n\nDependent axes can be aligned to their corresponding data points by setting the `axisValue` prop.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar\n    data={[\n      { x: \"cat\", y: 10 },\n      { x: \"dog\", y: 25 },\n      { x: \"bird\", y: 40 },\n      { x: \"frog\", y: 50 },\n      { x: \"fish\", y: 50 },\n    ]}\n  />\n  <VictoryAxis />\n  {[\n    \"cat\",\n    \"dog\",\n    \"bird\",\n    \"dog\",\n    \"frog\",\n    \"fish\",\n  ].map((d, i) => {\n    return (\n      <VictoryAxis\n        dependentAxis\n        key={i}\n        label={d}\n        style={{\n          tickLabels: { fill: \"none\" },\n        }}\n        axisValue={d}\n      />\n    );\n  })}\n</VictoryChart>\n```\n\n---\n\n### Axis - Small Values\n\nWhen a dataset only has a single value, or when all values on an axis have the same value, the single-point domain for that axis will be converted to a two-point domain. Victory does this by offsetting the domain value by a very small number. To solve this, you will need to manually set sensible defaults on the domain of your chart.\n\n```jsx live\n<VictoryChart\n  domain={{ x: [0, 2] }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar data={[{ x: 1, y: 1 }]} />\n</VictoryChart>\n```\n\n---\n\n### Axis - Common Label Problems\n\nLong axis labels can be problematic. There are several ways to address the issue. The best solution will depend on the specific requirements of your project. The following examples demonstrate:\n\n:::info\nUsing `padding` properties can help to adjust the position of the axis labels.\n:::\n\n```jsx live\n<VictoryChart\n  padding={{\n    left: 90,\n    top: 50,\n    right: 10,\n    bottom: 50,\n  }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryAxis\n    dependentAxis\n    tickFormat={[\n      \"first label\",\n      \"second label\",\n      \"third label\",\n      \"forth label\",\n      \"fifth label\",\n    ]}\n  />\n  <VictoryAxis />\n  <VictoryLine />\n</VictoryChart>\n```\n\n:::info\nSplitting the labels onto multiple lines can help to make the labels more readable.\n:::\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryAxis\n    dependentAxis\n    tickFormat={[\n      `first\\nlabel`,\n      `second\\nlabel`,\n      `third\\nlabel`,\n      `forth\\nlabel`,\n      `fifth\\nlabel`,\n    ]}\n  />\n  <VictoryAxis />\n  <VictoryLine />\n</VictoryChart>\n```\n\n:::info\nUsing angled labels can help to make the labels more readable.\n:::\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryAxis\n    dependentAxis\n    style={{\n      tickLabels: { angle: -60 },\n    }}\n    tickFormat={[\n      \"first label\",\n      \"second label\",\n      \"third label\",\n      \"forth label\",\n      \"fifth label\",\n    ]}\n  />\n  <VictoryAxis />\n  <VictoryLine />\n</VictoryChart>\n```\n\n:::info\nFixing axis label and tick label overlap using the style prop.\n:::\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n  padding={{\n    left: 90,\n    top: 50,\n    right: 50,\n    bottom: 50,\n  }}\n>\n  <VictoryAxis\n    dependentAxis\n    style={{\n      axisLabel: { padding: 60 },\n    }}\n    label=\"Axis Label\"\n    tickFormat={[\n      \"1000K\",\n      \"2000k\",\n      \"3000k\",\n      \"4000k\",\n      \"5000k\",\n    ]}\n  />\n  <VictoryAxis />\n  <VictoryLine />\n</VictoryChart>\n```\n\n---\n\n### Axis - Brush Lines\n\nBrush lines can be added to the axis using the `VictoryBrushLine` component for selecting a range of the domain.\n\n:::info\nSee the full API for [`VictoryBrushLine`](/docs/api/victory-brush-line) for more details.\n:::\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar\n    data={[\n      { x: \"one\", y: 4 },\n      { x: \"two\", y: 5 },\n      { x: \"three\", y: 6 },\n    ]}\n  />\n  <VictoryAxis\n    axisComponent={\n      <VictoryBrushLine\n        brushWidth={20}\n      />\n    }\n  />\n</VictoryChart>\n```\n\n---\n\n## VictoryPolarAxis\n\nCreates a circular axis for a chart.\n\n:::info\nSee the full API for [`VictoryPolarAxis`](/docs/api/victory-polar-axis) for more details.\n:::\n\n---\n\n### Basic\n\nThe `VictoryPolarAxis` component can be used to render a basic axis for polar charts.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n  polar\n>\n  <VictoryPolarAxis crossAxis />\n  <VictoryPolarAxis dependentAxis />\n  <VictoryLine\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n  />\n</VictoryChart>\n```\n\n---\n\n### Axis - Angle\n\nThe dependent axis can be rendered at different angles.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n  polar\n>\n  <VictoryPolarAxis crossAxis />\n  <VictoryPolarAxis\n    dependentAxis\n    axisAngle={45}\n  />\n  <VictoryLine\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n  />\n</VictoryChart>\n```\n\n---\n\n### Axis - Labels\n\nThe label placement can be adjusted by using the [`labelPlacement`](/docs/api/victory-polar-axis#labelplacement) prop.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n  polar\n>\n  <VictoryPolarAxis\n    crossAxis\n    labelPlacement=\"vertical\"\n  />\n  <VictoryLine\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 5 },\n      { x: 4, y: 4 },\n      { x: 5, y: 7 },\n    ]}\n  />\n</VictoryChart>\n```\n\n---\n\n### Axis - Half Circle\n\nThe polar axis can also be rendered in a confined set of angles. When `VictoryPolarAxis` is a child of `VictoryChart`, the `startAngle` and `endAngle` props will be set by the domain data.\n\n```jsx live\n<div style={{ display: \"flex\" }}>\n  <VictoryPolarAxis\n    startAngle={90}\n    endAngle={450}\n    tickValues={[0, 90, 180, 270]}\n    labelPlacement=\"vertical\"\n  />\n  <VictoryPolarAxis\n    startAngle={0}\n    endAngle={180}\n    tickValues={[0, 45, 90, 135, 180]}\n  />\n</div>\n```\n"
  },
  {
    "path": "website/docs/guides/containers.mdx",
    "content": "---\ntitle: Containers\n---\n\n## Defaults\n\nVictory containers have default `width`, `height`, and `padding` props defined in the default [theme](/docs/guides/themes).\n\nVictory renders components into responsive `svg` containers by default using `VictoryContainer`. `VictoryContainer` is a responsive container with a `viewBox` attribute set to `viewBox={\"0 0 width, height\"}` and styles `width: \"100%\" height: \"auto\"` in addition to any styles provided via props. Because Victory renders responsive containers, the `width` and `height` props do not determine the width and height of the chart in number of pixels, but instead define an aspect ratio for the chart. The exact number of pixels will depend on the size of the container the chart is rendered into.\n\n## Fixed Size Containers\n\nResponsive containers are not appropriate for every application, so Victory provides a couple of options for rendering static containers. The easiest way to render a static container rather than a responsive one is by setting the `responsive` prop to false directly on the `containerComponent` instance.\n\n```jsx live\n<VictoryChart\n  height={200}\n  width={300}\n  containerComponent={\n    <VictoryContainer\n      responsive={false}\n    />\n  }\n  theme={VictoryTheme.clean}\n>\n  <VictoryLine\n    y={(data) =>\n      Math.sin(2 * Math.PI * data.x)\n    }\n  />\n</VictoryChart>\n```\n\n## Render Order\n\nVictory renders svg elements, so there is no concept of z-index. Instead the render order of components determines which elements will appear above others. Changing the order of rendered components can significantly alter the appearance of a chart. Compare the following charts.\n\n:::note\nThe difference is the order of the children in `VictoryChart`.\n:::\n\n```jsx live noInline\nconst sampleFn = (data) =>\n  Math.sin(2 * Math.PI * data.x);\n\nconst scatterStyle = {\n  data: { fill: \"red\" },\n};\n\nfunction App() {\n  return (\n    <>\n      <VictoryChart\n        theme={VictoryTheme.clean}\n      >\n        <VictoryScatter\n          y={sampleFn}\n          samples={25}\n          size={5}\n          style={scatterStyle}\n        />\n        <VictoryLine y={sampleFn} />\n      </VictoryChart>\n\n      <VictoryChart\n        theme={VictoryTheme.clean}\n      >\n        <VictoryLine y={sampleFn} />\n        <VictoryScatter\n          y={sampleFn}\n          samples={25}\n          size={5}\n          style={scatterStyle}\n        />\n      </VictoryChart>\n    </>\n  );\n}\n\nrender(<App />);\n```\n\n## Render on Top\n\nSome components should _always_ render above others. Use `VictoryPortal` to render components in a top level container so that they appear above all other elements. `VictoryTooltip` uses `VictoryPortal`, by default, but any component may be wrapped in `VictoryPortal` to alter its rendering.\n\n:::warning\n`VictoryPortal` only works with components that are rendered within a [Victory Container](/docs/guides/containers) component.\n:::\n\n```jsx live\n<VictoryChart\n  domainPadding={40}\n  theme={VictoryTheme.clean}\n>\n  <VictoryStack\n    colorScale=\"warm\"\n    style={{\n      data: { width: 30 },\n      labels: { padding: -20 },\n    }}\n    labelComponent={\n      <VictoryPortal>\n        <VictoryLabel />\n      </VictoryPortal>\n    }\n  >\n    <VictoryBar\n      data={[\n        { x: 1, y: 3, label: \"C\" },\n        { x: 2, y: 4, label: \"C\" },\n        { x: 3, y: 2, label: \"C\" },\n      ]}\n    />\n    <VictoryBar\n      data={[\n        { x: 1, y: 3, label: \"B\" },\n        { x: 2, y: 4, label: \"B\" },\n        { x: 3, y: 2, label: \"B\" },\n      ]}\n    />\n    <VictoryBar\n      data={[\n        { x: 1, y: 3, label: \"A\" },\n        { x: 2, y: 4, label: \"A\" },\n        { x: 3, y: 2, label: \"A\" },\n      ]}\n    />\n  </VictoryStack>\n  <VictoryAxis />\n</VictoryChart>\n```\n\n## Basic Container Types\n\nVictory renders charts into top-level container components. The most commonly used container is `VictoryChart`.\n\nContainers are responsible for rendering children into a responsive svg, and providing a portal component for rendering tooltips, or any other elements that should be rendered above everything else.\n\n### VictoryContainer\n\n`VictoryContainer` provides a top-level `<svg>` element for other Victory components to render within. Most containers extend `VictoryContainer` to add extra functionality.\n\nSee the [full API here](/docs/api/victory-container).\n\n### VictoryChart\n\n`VictoryChart` is a container that renders a set of children on a set of Cartesian or polar axes. `VictoryChart` reconciles the domain for all its children, controls the layout of the chart, and coordinates animations and shared events. If no children are provided, `VictoryChart` will render a set of empty default axes.\n\nSee the [full API here](/docs/api/victory-chart).\n\n## Advanced Container Types\n\n- [VictorySelectionContainer](#victoryselectioncontainer)\n- [VictoryZoomContainer](#victoryzoomcontainer)\n- [VictoryVoronoiContainer](#victoryvoronoicontainer)\n\n### VictoryGroup\n\n`VictoryGroup` is a container that renders a given set of children with shared props. This is useful for creating a group of components that share styles or data, or rendering multiple charts without axes.\n\nSee the [full API here](/docs/api/victory-group).\n\n### VictoryBrushContainer\n\n`VictoryBrushContainer` adds the ability to highlight a region of a chart, and interact with\nhighlighted regions, either by moving the region, expanding the region, or selecting a new region.\n\nSee the [Brush Selection](/docs/guides/data-selection) guide.\n\n### VictoryCursorContainer\n\n`VictoryCursorContainer` adds a cursor to a chart to inspect coordinates. The cursor can either be a 2-dimensional crosshair, or a 1-dimensional line. The cursor moves with the mouse (or on touch on mobile devices) along the visible domain of the chart.\n\nSee the [Cursor Tooltips](/docs/guides/tooltips) guide.\n\n### VictorySelectionContainer\n\n`VictorySelectionContainer` is used to enable selecting data points within a highlighted region.\nClicking and dragging will select an x-y region, and add the `active` prop to any elements\ncorresponding to data points within the region. Create a select-box control by tying the set of\nselected data points to other elements, such as a filtered table.\n\nSee the [Data Selection](/docs/guides/data-selection) guide.\n\n### VictoryZoomContainer\n\n`VictoryZoomContainer` provides pan and zoom behavior for any Victory component that works with an\nx, y axis. Zoom events are controlled by scrolling, and panning events are controlled by dragging.\n\nSee the [Pan and Zoom](/docs/guides/pan-and-zoom) guide.\n\n### VictoryVoronoiContainer\n\n`VictoryVoronoiContainer` adds the ability to associate a mouse position with the data point(s)\nclosest to it. When this container is added to a chart, changes in mouse position will add the `active`\nprop to data and label components closest to the current mouse position.\n\nSee the [Tooltips](/docs/guides/tooltips) guide.\n\n### Multiple Containers\n\nVictory includes a `createContainer` helper that is used to create hybrid containers. `createContainer` can be used to create a new container with behaviors from two existing Victory containers.\n\nIt allows you to effectively\ncombine any two of the following containers: `VictoryBrushContainer`,\n`VictoryCursorContainer`, `VictorySelectionContainer`, `VictoryVoronoiContainer`, or `VictoryZoomContainer`.\n\n```js\nconst VictoryZoomVoronoiContainer = createContainer(\"zoom\", \"voronoi\");\n```\n\n#### Arguments\n\nThe function takes two `behavior` arguments as strings:\n\n```js\ncreateContainer(behaviorA, behaviorB)\n```\n\n#### Behavior\n\nEach `behavior` must be one of the following strings:\n`\"brush\"`, `\"cursor\"`, `\"selection\"`, `\"voronoi\"`, and `\"zoom\"`.\nThe resulting container uses the events from both behaviors.\nFor example, if both behaviors use the click event (like zoom and selection) the combined container\nwill trigger both behaviors' events on each click.\n\n*Note*: Order of the behaviors matters in a few cases.\nIt is recommended to use `\"zoom\"` before any other behaviors: for example,\n`createContainer(\"zoom\", \"voronoi\")` instead of `createContainer(\"voronoi\", \"zoom\")`.\n\n#### Example\n\nThe following example creates a custom container that combines `VictoryVoronoiContainer` and\n`VictoryZoomContainer`. Hovering over the chart will use Voronoi to highlight data points,\nwhile scrolling and dragging will zoom and pan.\n\n```jsx live noInline\nconst VictoryZoomVoronoiContainer = createContainer(\"zoom\", \"voronoi\");\nconst data = _.range(100).map((x) => ({x, y: 100 + x + _.random(10)}));\n\nconst App = () => (\n  <VictoryChart\n    containerComponent={\n      <VictoryZoomVoronoiContainer\n        labels={({ datum }) => `${datum.x}, ${datum.y}`}\n      />\n    }\n    theme={VictoryTheme.clean}\n  >\n    <VictoryScatter data={data} />\n  </VictoryChart>\n);\n\nrender(<App/>);\n```\n"
  },
  {
    "path": "website/docs/guides/custom-components.mdx",
    "content": "---\ntitle: Custom Components\n---\n\nEvery element that a Victory component renders may be altered or completely replaced. Most components expose `dataComponent`, `labelComponent`, `groupComponent`, and `containerComponent` props. The primitive components that Victory components render by default are simple, stateless components with a consistent set of props whenever possible. These [primitive components][] are exported for users to alter, wrap, extend and reference when creating custom components.\n\n## Altering default components\n\nVictory components set props on their primitive components, but these may be overridden or augmented by setting props directly on the primitive component instances.\n\n```jsx live\n  <VictoryBar\n    data={[\n      {x: 1, y: 3, label: \"Alpha\"},\n      {x: 2, y: 4, label: \"Bravo\"},\n      {x: 3, y: 6, label: \"Charlie\"},\n      {x: 4, y: 3, label: \"Delta\"},\n      {x: 5, y: 7, label: \"Echo\"},\n    ]}\n    labelComponent={\n      <VictoryLabel angle={45} verticalAnchor=\"middle\" textAnchor=\"end\"/>\n    }\n    theme={VictoryTheme.clean}\n  />\n```\n\n## Wrapping components\n\nVictory components may be wrapped to customize or change behavior. Wrapper components should apply any props they receive from other Victory components to the components they render.\n\n```jsx live noInline\nfunction WrapperComponent(props) {\n  function renderChildren() {\n    const children = React.Children.toArray(props.children);\n    return children.map((child) => {\n      // children should be rendered with props from their parent Victory components assigned\n      // Components like `VictoryChart` expect to control props like `domain` for their children\n      // Some props should be merged rather than overridden\n      const style = _.merge(child.props.style, props.style);\n      return React.cloneElement(child, Object.assign({}, child.props, props, { style }));\n    });\n  }\n\n  return (\n    <g transform=\"translate(20, 40)\">\n      <VictoryLabel text={\"add labels\"} x={110} y={30}/>\n      <VictoryLabel text={\"offset data from axes\"} x={70} y={150}/>\n      <VictoryLabel text={\"alter props\"} x={280} y={150}/>\n      { renderChildren() }\n    </g>\n  );\n}\n\nfunction App() {\n  return (\n    <VictoryChart theme={VictoryTheme.clean}>\n      <WrapperComponent>\n        <VictoryScatter\n          y={(d) => Math.sin(2 * Math.PI * d.x)}\n          samples={15}\n          symbol=\"square\"\n          size={6}\n          style={{ data: { stroke: \"lightblue\", strokeWidth: 3 }}}\n        />\n      </WrapperComponent>\n    </VictoryChart>\n  );\n}\n\nrender(<App/>);\n```\n\n## Creating new components\n\nAny component that renders valid svg elements (or elements wrapped in `<foreignObject>`) may be used as a `dataComponent` or `labelComponent` in Victory components. Custom components will be provided with the same props as default components. In the following example, a custom `CatPoint` component is used in place of `Point` in `VictoryScatter`.\n\n```jsx live noInline\nfunction CatPoint(props) {\n  const {x, y, datum} = props;\n  const cat = datum._y >= 0 ? \"😻\" : \"😹\";\n\n  return (\n    <text x={x} y={y} fontSize={30}>\n      {cat}\n    </text>\n  );\n}\n\nfunction App() {\n  return (\n    <VictoryChart>\n      <VictoryScatter\n        y={(d) =>\n          Math.sin(2 * Math.PI * d.x)\n        }\n        samples={25}\n        dataComponent={<CatPoint/>}\n      />\n    </VictoryChart>\n  );\n}\nrender(<App/>);\n```\n\nMore complex components may be supplied as direct children of `VictoryChart`. These components will have access to shared chart props such as `scale`. In the example below, the custom `Polygon` components draws a polygon based on a collection of points. The scale provided by `VictoryChart` is used to correctly position the points within the chart.\n\n```jsx live noInline\nconst SAMPLE_DATA = [\n\t{x: 2, y: 1},\n\t{x: 3, y: 5},\n\t{x: 6, y: 3}\n];\n\nfunction getPoints(data, scale) {\n  return data.reduce((pointStr, {x, y}) =>\n    `${pointStr} ${scale.x(x)},${scale.y(y)}`\n  , '');\n}\n\nfunction Polygon(props) {\n  // data and style are explicitly supplied to the Polygon component\n  // scale is provided by VictoryChart\n  const { data, style, scale } = props;\n  const points = getPoints(data, scale);\n  return <polygon points={points} style={style}/>;\n}\n\nfunction App() {\n  return (\n    <VictoryChart domain={[-10, 10]} theme={VictoryTheme.clean}>\n      <Polygon\n        data={SAMPLE_DATA}\n        style={{ fill: \"lightblue\", opacity: 0.5 }}\n      />\n      <VictoryScatter\n        data={SAMPLE_DATA}\n      />\n    </VictoryChart>\n  );\n}\n\nrender(<App/>);\n```\n\nOther Victory components may even be used in creating custom components, as in the example below.\n\n```jsx live noInline\nfunction CustomPie(props) {\n  const {datum, x, y} = props;\n  const pieWidth = 120;\n\n  return (\n    <g transform={\n      `translate(${x - pieWidth / 2}, ${y - pieWidth / 2})`\n      }\n    >\n      <VictoryPie\n        standalone={false}\n        height={pieWidth}\n        width={pieWidth}\n        data={datum.pie}\n        style={{labels: {fontSize: 0}}}\n        colorScale={[\"#f77\", \"#55e\", \"#8af\"]}\n      />\n    </g>\n  );\n}\n\nfunction CustomDataComponent() {\n  const data = [\n    {x: \"Jan\", y: 30},\n    {x: \"Feb\", y: 32},\n    {x: \"Mar\", y: 65},\n    {x: \"Apr\", y: 38},\n    {x: \"May\", y: 50},\n    {x: \"Jun\", y: 47},\n    {x: \"Jul\", y: 38},\n    {x: \"Aug\", y: 48},\n    {x: \"Sep\", y: 80},\n    {x: \"Oct\", y: 73},\n    {x: \"Nov\", y: 76},\n    {x: \"Dec\", y: 100}\n  ];\n\n  const pieData = data.map((datum) => {\n    datum.pie = [\n      {x: \"Lions\", y: Math.round(Math.random() * 10)},\n      {x: \"Tigers\", y: Math.round(Math.random() * 10)},\n      {x: \"Bears\", y: Math.round(Math.random() * 10)}\n    ];\n    return datum;\n  });\n\n  return (\n    <VictoryChart domain={{y: [0, 100]}} theme={VictoryTheme.clean}>\n      <VictoryAxis/>\n      <VictoryGroup data={pieData}>\n        <VictoryLine/>\n        <VictoryScatter\n          dataComponent={<CustomPie />}\n        />\n      </VictoryGroup>\n    </VictoryChart>\n  );\n}\n\nrender(<CustomDataComponent/>);\n```\n\nSince any custom SVG element can be used as a Victory component, any styling system can be used to style custom components, including styled components, CSS modules, or inline styles.\n\nHere's an example using SVG + styled components.\n\n```jsx live noInline\nconst colors = [\"#A8E6CE\", \"#DCEDC2\", \"#FFD3B5\", \"#FFAAA6\", \"#FF8C94\"];\n\nconst ScatterPoint = ({ x, y, datum, min, max }) => {\n  const i = React.useMemo(() => {\n    return Math.floor(((datum.y - min) / (max - min)) * (colors.length - 1));\n  }, [datum, min, max]);\n\n  return <circle fill={colors[i]} cx={x} cy={y} r={6} />;\n};\n\nconst App = () => {\n  const data = [\n    { x: \"Jan\", y: 43 },\n    { x: \"Feb\", y: 44 },\n    { x: \"Mar\", y: 47 },\n    { x: \"Apr\", y: 51 },\n    { x: \"May\", y: 57 },\n    { x: \"Jun\", y: 62 },\n    { x: \"Jul\", y: 67 },\n    { x: \"Aug\", y: 68 },\n    { x: \"Sep\", y: 63 },\n    { x: \"Oct\", y: 54 },\n    { x: \"Nov\", y: 47 },\n    { x: \"Dec\", y: 42 }\n  ];\n\n  const temperatures = data.map(({ y }) => y);\n  const min = Math.min(...temperatures);\n  const max = Math.max(...temperatures);\n\n  return (\n    <VictoryChart theme={VictoryTheme.clean}>\n      <VictoryLine data={data} />\n      <VictoryScatter\n        data={data}\n        dataComponent={<ScatterPoint min={min} max={max} />}\n      />\n    </VictoryChart>\n  );\n}\n\nrender(<App/>);\n\n```\n\n[primitive components]: /docs/api/victory-primitives\n"
  },
  {
    "path": "website/docs/guides/data-accessors.mdx",
    "content": "---\ntitle: Data Accessors\n---\n\nMost Victory components expect data in the form of an array of data objects with values specified for `x` and `y`. Victory components expose data accessor props that may be used when data is not readily available in this format. Data accessor props may be used to specify how a data prop should be used, process a elements in a data array, or to plot math functions even when no data prop is given.\n\n## Specifying x and y data\n\nSome Victory components like `VictoryCandlestick` and `VictoryErrorBar` have unusual accessor props that match their expected data formats, but most Victory components expose standard `x` and `y` data accessor props. These props may be used to specify which properties or elements of the data array should be plotted on the x and y axes.\n\nWhen given as strings, these accessors will specify which properties of a data object to plot. The following example will plot employees on the x axis and salaries on the y axis:\n\n```jsx\n<VictoryBar\n  data={[\n    {employee: \"Jane Doe\", salary: 65000},\n    {employee: \"John Doe\", salary: 62000}\n    ...\n  ]}\n  x=\"employee\"\n  y=\"salary\"\n/>\n```\n\nIf data is given as an array of arrays, data accessors may be given as integers to specify the index of the nested array that should be plotted.\n\n```jsx\n<VictoryBar\n  data={[\n    [0, 1],\n    [1, 1],\n    [2, 3],\n    [3, 1],\n  ]}\n  x={0}\n  y={1}\n/>\n```\n\nData accessors may also be given as path strings or arrays to specify deeply nested data.\n\n```jsx\n<VictoryBar\n  data={[\n    {\n      employee: { firstName: \"Jane\", lastName: \"Doe\" },\n      salary: { base: 65000, bonus: 2000 }\n    },\n    {\n      employee: { firstName: \"John\", lastName: \"Doe\" },\n      salary: { base: 62000, bonus: 6000 }\n    },\n    ...\n  ]}\n  x=\"employee.firstName\"\n  y={[\"salary\", \"base\"]}\n/>\n```\n\n## Processing data\n\nData accessor props may be given as functions and used to process data, as in the following example.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 40 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar\n    data={[\n      {\n        experiment: \"trial 1\",\n        expected: 3.75,\n        actual: 3.21,\n      },\n      {\n        experiment: \"trial 2\",\n        expected: 3.75,\n        actual: 3.38,\n      },\n      {\n        experiment: \"trial 3\",\n        expected: 3.75,\n        actual: 2.05,\n      },\n      {\n        experiment: \"trial 4\",\n        expected: 3.75,\n        actual: 3.71,\n      },\n    ]}\n    x=\"experiment\"\n    y={(d) =>\n      (d.actual / d.expected) * 100\n    }\n  />\n  <VictoryAxis\n    label=\"experiment\"\n    style={{\n      axisLabel: { padding: 30 },\n    }}\n  />\n  <VictoryAxis\n    dependentAxis\n    label=\"percent yield\"\n    style={{\n      axisLabel: { padding: 40 },\n    }}\n  />\n</VictoryChart>\n```\n\n## Sorting data\n\nSorting can be applied to the final data via the sortKey prop. This prop\ncorresponds to the lodash [sortBy][] function.\n\nThis prop can be provided as a string, function, or array of either.\n\n```jsx live\n<VictoryLine\n  data={_.range(\n    0,\n    2 * Math.PI,\n    0.01,\n  ).map((t) => ({ t }))}\n  sortKey=\"t\"\n  theme={VictoryTheme.clean}\n  x={({ t }) =>\n    Math.sin(3 * t + 2 * Math.PI)\n  }\n  y={({ t }) => Math.sin(2 * t)}\n/>\n```\n\n## Plotting functions\n\nIf data is not given, data accessor props may be used to plot math functions. In this scenarios, initial data will be generated based on the domain and number of samples. Alter the `samples` and `domain` props to change how functions are plotted.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n>\n  <VictoryLine\n    samples={50}\n    style={{\n      data: {\n        stroke:\n          VictoryTheme.clean.palette\n            .cool[1],\n        strokeWidth: 4,\n      },\n    }}\n    y={(data) =>\n      Math.sin(2 * Math.PI * data.x)\n    }\n  />\n\n  <VictoryLine\n    samples={10}\n    style={{\n      data: {\n        stroke:\n          VictoryTheme.clean.palette\n            .cool[2],\n        strokeWidth: 4,\n      },\n    }}\n    y={(data) =>\n      Math.cos(2 * Math.PI * data.x)\n    }\n  />\n</VictoryChart>\n```\n\n[sortby]: https://lodash.com/docs/4.17.4#sortBy\n"
  },
  {
    "path": "website/docs/guides/data-selection.mdx",
    "content": "---\ntitle: Data Selection\n---\n\nVictory allows multiple ways to select data points on a chart. `VictorySelectionContainer` is a container component that allows users to select data points within a region of a chart. Use `VictoryBrushContainer` to identify the domain of a selected region.\n\n:::info\n`VictorySelectionContainer` is similar to `VictoryBrushContainer`. `VictoryBrushContainer` may be\nused to identify the domain of a selected region, whereas `VictorySelectionContainer` may be used to\nidentify a list of data points within a selected region. `VictoryBrushContainer` will also create\npersistent highlighted regions, whereas regions created by `VictorySelectionContainer`\ndisappear after `onMouseUp` events.\n:::\n\n## VictorySelectionContainer\n\nUse `VictorySelectionContainer` to add data selection behavior to any Victory components that work with an x-y coordinate system.\n\nSee the [full API here](/docs/api/victory-selection-container).\n\n### Basic\n\n`VictorySelectionContainer` may be used with any Victory component that works with an x-y coordinate\nsystem, and should be added as the `containerComponent` of the top-level component.\nHowever, the component that uses it must be standalone\n(`standalone={true}`), which is the default for all top-level Victory components.\n\n```jsx live\n<VictoryChart\n  containerComponent={\n    <VictorySelectionContainer />\n  }\n  theme={VictoryTheme.clean}\n>\n  <VictoryScatter\n    style={{\n      data: {\n        fill: ({ active }) =>\n          active ? \"tomato\" : \"gray\",\n      },\n    }}\n  />\n</VictoryChart>\n```\n\n### Active Points\n\nThe `VictorySelectionContainer` will automatically set an `active` prop on the data points that are within the selected region. This prop can be used to style the selected points differently.\n\n```jsx live\n<VictoryChart\n  horizontal\n  theme={VictoryTheme.clean}\n  containerComponent={\n    <VictorySelectionContainer\n      selectionDimension=\"x\"\n      selectionStyle={{\n        stroke: VictoryTheme.clean.palette?.colors.blue,\n        strokeWidth: 2,\n        fill: VictoryTheme.clean.palette?.colors.blue,\n        fillOpacity: 0.1,\n      }}\n    />\n  }\n>\n  <VictoryStack>\n    <VictoryBar\n      style={{\n        data: {\n          stroke: ({ active }) =>\n            active ? VictoryTheme.clean.palette?.colors.purple : \"none\",\n          strokeWidth: 2,\n        },\n      }}\n      data={[\n        { x: 1, y: -5 },\n        { x: 2, y: 4 },\n        { x: 3, y: 2 },\n        { x: 4, y: 3 },\n        { x: 5, y: 1 },\n        { x: 6, y: -3 },\n        { x: 7, y: 3 },\n      ]}\n    />\n    <VictoryBar\n      style={{\n        data: {\n          stroke: ({ active }) =>\n            active ? VictoryTheme.clean.palette?.colors.purple : \"none\",\n          strokeWidth: 2,\n        },\n      }}\n      data={[\n        { x: 1, y: -3 },\n        { x: 2, y: 5 },\n        { x: 3, y: 3 },\n        { x: 4, y: 0 },\n        { x: 5, y: -2 },\n        { x: 6, y: -2 },\n        { x: 7, y: 5 },\n      ]}\n    />\n    <VictoryBar\n      style={{\n        data: {\n          stroke: ({ active }) =>\n            active ? VictoryTheme.clean.palette?.colors.purple : \"none\",\n          strokeWidth: 2,\n        },\n      }}\n      data={[\n        { x: 1, y: 5 },\n        { x: 2, y: -4 },\n        { x: 3, y: -2 },\n        { x: 4, y: -3 },\n        { x: 5, y: -1 },\n        { x: 6, y: 3 },\n        { x: 7, y: -3 },\n      ]}\n    />\n  </VictoryStack>\n</VictoryChart>\n```\n\n### Selection Limits\n\nThe `selectionDimension` prop may be used to limit brushing behavior to a single dimension. In the example below, the `selectionDimension` prop is set to `\"y\"`, allowing users to select a region of the chart along the y-axis only.\n\n```jsx live\n<VictoryChart\n  containerComponent={\n    <VictorySelectionContainer selectionDimension=\"y\" />\n  }\n  theme={VictoryTheme.clean}\n>\n  <VictoryScatter\n    style={{\n      data: {\n        fill: ({ active }) =>\n          active ? \"tomato\" : \"gray\",\n      },\n    }}\n  />\n</VictoryChart>\n```\n\n### Events\n\nUse the `onSelection` prop to define a function that will be called with the selected domain\nwhen the selection area changes.\n\n```jsx live noInline\nfunction App() {\n  const [selection, setSelection] =\n    React.useState({});\n\n  const handleSelection = (\n    datasets,\n  ) => {\n    const points = datasets.reduce(\n      (memo, dataset) =>\n        memo.concat(dataset.data),\n      [],\n    );\n    setSelection({ points });\n  };\n\n  return (\n    <VictoryChart\n      theme={VictoryTheme.clean}\n      containerComponent={\n        <VictorySelectionContainer\n          selectionDimension=\"x\"\n          selectionStyle={{\n            stroke:\n              VictoryTheme.clean.palette\n                ?.colors.red,\n            strokeWidth: 2,\n            fill: VictoryTheme.clean\n              .palette?.colors.red,\n            fillOpacity: 0.1,\n          }}\n          onSelection={handleSelection}\n        />\n      }\n    >\n      <VictoryLine\n        style={{\n          data: {\n            stroke:\n              VictoryTheme.clean.palette\n                ?.colors.purple,\n          },\n        }}\n        data={[\n          { x: 1, y: -5 },\n          { x: 2, y: 4 },\n          { x: 3, y: 2 },\n          { x: 4, y: 3 },\n          { x: 5, y: 1 },\n          { x: 6, y: -3 },\n          { x: 7, y: 3 },\n        ]}\n      />\n      <VictoryLine\n        style={{\n          data: {\n            stroke:\n              VictoryTheme.clean.palette\n                ?.colors.green,\n          },\n        }}\n        data={[\n          { x: 1, y: -3 },\n          { x: 2, y: 5 },\n          { x: 3, y: 3 },\n          { x: 4, y: 0 },\n          { x: 5, y: -2 },\n          { x: 6, y: -2 },\n          { x: 7, y: 5 },\n        ]}\n      />\n      <VictoryLine\n        style={{\n          data: {\n            stroke:\n              VictoryTheme.clean.palette\n                ?.colors.blue,\n          },\n        }}\n        data={[\n          { x: 1, y: 5 },\n          { x: 2, y: -4 },\n          { x: 3, y: -2 },\n          { x: 4, y: -3 },\n          { x: 5, y: -1 },\n          { x: 6, y: 3 },\n          { x: 7, y: -3 },\n        ]}\n      />\n      {selection && (\n        <VictoryLabel\n          x={20}\n          y={20}\n          text={JSON.stringify(\n            selection.points?.map(\n              ({ x, y }) => ({ x, y }),\n            ),\n          )}\n        />\n      )}\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n\n## VictoryBrushContainer\n\nUse `VictoryBrushContainer` to add highlighting and selection to any Victory components that work with an x-y coordinate system.\n\nSee the [full API here](/docs/api/victory-brush-container).\n\n### Basic\n\nIn the example below, the `VictoryBrushContainer` component is used to highlight a region of a line chart. The brush behavior is unconstrained by default, allowing users to click and drag to select a region of the chart.\n\n```jsx live\n<VictoryLine\n  containerComponent={\n    <VictoryBrushContainer\n      brushStyle={{\n        fill: \"blue\",\n        opacity: 0.2,\n      }}\n    />\n  }\n  style={{\n    data: { stroke: \"lightblue\" },\n  }}\n  data={[\n    { x: 1, y: -3 },\n    { x: 2, y: 5 },\n    { x: 3, y: -3 },\n    { x: 4, y: 0 },\n    { x: 5, y: -5 },\n    { x: 6, y: 2 },\n    { x: 7, y: 0 },\n  ]}\n/>\n```\n\n### Selection Limits\n\nThe `brushDimension` prop may be used to limit brushing behavior to a single dimension. In the example below, the `brushDimension` prop is set to `\"y\"`, allowing users to select a region of the chart along the y-axis only and the `brushDomain` restricts the highlighted area to the specified range.\n\n```jsx live\n<VictoryLine\n  containerComponent={\n    <VictoryBrushContainer\n      brushDomain={{\n        x: [1, 7],\n        y: [-2, 2],\n      }}\n      brushDimension=\"y\"\n      brushStyle={{\n        fill: \"blue\",\n        opacity: 0.2,\n      }}\n    />\n  }\n  style={{\n    data: { stroke: \"lightblue\" },\n  }}\n  data={[\n    { x: 1, y: -3 },\n    { x: 2, y: 5 },\n    { x: 3, y: -3 },\n    { x: 4, y: 0 },\n    { x: 5, y: -5 },\n    { x: 6, y: 2 },\n    { x: 7, y: 0 },\n  ]}\n/>\n```\n\n### Events\n\n`VictoryBrushContainer` exposes several events you can use to access the selection range. In the example below, you can monitor your browser's console to see the events in action.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n  containerComponent={\n    <VictoryBrushContainer\n      onBrushCleared={(domain, props) =>\n        console.log(\n          \"[onBrushCleared]\",\n          { domain, props },\n        )\n      }\n      onBrushDomainChange={(\n        domain,\n        props,\n      ) =>\n        console.log(\n          \"[onBrushDomainChange]\",\n          { domain, props },\n        )\n      }\n      onBrushDomainChangeEnd={(\n        domain,\n        props,\n      ) =>\n        console.log(\n          \"[onBrushDomainChangeEnd]\",\n          { domain, props },\n        )\n      }\n    />\n  }\n>\n  <VictoryGroup>\n    <VictoryScatter\n      style={{\n        data: {\n          fill: VictoryTheme.clean\n            .palette?.colors.red,\n        },\n      }}\n      data={[\n        { x: 1, y: -5 },\n        { x: 2, y: 4 },\n        { x: 3, y: 2 },\n        { x: 4, y: 0 },\n        { x: 5, y: 1 },\n        { x: 6, y: -3 },\n        { x: 7, y: 3 },\n      ]}\n    />\n    <VictoryScatter\n      style={{\n        data: {\n          fill: VictoryTheme.clean\n            .palette?.colors.yellow,\n        },\n      }}\n      data={[\n        { x: 1, y: -3 },\n        { x: 2, y: 5 },\n        { x: 3, y: 3 },\n        { x: 4, y: 0 },\n        { x: 5, y: -2 },\n        { x: 6, y: -2 },\n        { x: 7, y: 5 },\n      ]}\n    />\n    <VictoryScatter\n      data={[\n        { x: 1, y: 5 },\n        { x: 2, y: -4 },\n        { x: 3, y: -2 },\n        { x: 4, y: -3 },\n        { x: 5, y: -1 },\n        { x: 6, y: 3 },\n        { x: 7, y: -3 },\n      ]}\n    />\n  </VictoryGroup>\n</VictoryChart>\n```\n"
  },
  {
    "path": "website/docs/guides/events.mdx",
    "content": "---\ntitle: Events\n---\n\nVictory uses a flexible event system that is agnostic of event type. Browser events like `onClick` are handled identically to mobile touch events like `onPressIn`. Victory's event system allows users to attach events to any rendered element, and trigger mutations on any other rendered element.\n\nThis guide will demonstrate how to use Victory's event system within a single component, between several components nested within wrapper components like `VictoryChart` or `VictoryGroup`, and between several components using the `VictorySharedEvents` wrapper. This guide will also explain how to bypass Victory's event system entirely, and attach simple events directly to rendered components.\n\n## Component Events\n\nEvents within a single component like `VictoryBar` may be defined by the `events` prop of the component. The component will be responsible for storing event-driven mutations on its state object. The `events` prop should be given as an array of event objects. Each object defines an event or set of events to attach to a particular target element, or set of target elements.\n\nTarget elements are specified by the `target` and `eventKey` properties. Valid `target` properties match the namespaces of the style element of any given component. For most components valid target properties are \"data\", \"labels\", and \"parent\". The `target` property is required. The optional `eventKey` property may be given as a value or array of values.\n\nEvents are defined by the `eventHandlers` property which should be given as an object whose properties are named events such as `onClick`, and whose values are event handlers. Event handlers are called with the event, the props defining the element that triggered the event, and the event key of the element that triggered the event.\n\nReturn values from event handlers are used to define mutations affecting rendered elements. Return values from event handlers should be given as an array of mutation objects. Mutation objects may have `target` and `eventKey` properties to specify an element to mutate. If these properties are not given, the mutation will effect the element that triggered the event. Mutation objects should also have a `mutation` property whose value is a function. The mutation function will be called with the event, the props defining the element that will be mutated, and the event key of the element that will be mutated. The mutation function should return an object of props to be modified, and the new values for those props.\n\n**In the example below, clicking on any of the bars will trigger a change in the text of the corresponding labels.**\n\n```jsx live\n<VictoryBar\n  theme={VictoryTheme.clean}\n  data={[\n    { x: 1, y: 2, label: \"A\" },\n    { x: 2, y: 4, label: \"B\" },\n    { x: 3, y: 7, label: \"C\" },\n    { x: 4, y: 3, label: \"D\" },\n    { x: 5, y: 5, label: \"E\" },\n  ]}\n  events={[\n    {\n      target: \"data\",\n      eventHandlers: {\n        onClick: () => {\n          return [\n            {\n              target: \"labels\",\n              mutation: (props) => {\n                return props.text ===\n                  \"clicked\"\n                  ? null\n                  : { text: \"clicked\" };\n              },\n            },\n          ];\n        },\n      },\n    },\n  ]}\n/>\n```\n\n## Nested Events\n\nWrapper components like `VictoryChart`, `VictoryGroup`, and `VictoryStack` may define events for their children. Component events defined by wrappers operate much the same as single component events, except that the events are defined on the parent component, and event-driven mutations are stored in the parent's state. Events on child components are specified with the `childName` property. Components that have a `name` prop specified will be referenced by name. If child components do not have a `name` specified they will be referenced by index. In the example below, clicking on either of the bottom two areas in the stack will change the color of the top area.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n  events={[\n    {\n      childName: [\"area-1\", \"area-2\"],\n      target: \"data\",\n      eventHandlers: {\n        onClick: () => {\n          return [\n            {\n              childName: \"area-4\",\n              mutation: (props) => {\n                const fill =\n                  props.style.fill;\n                return fill === \"tomato\"\n                  ? null\n                  : {\n                      style: {\n                        fill: \"tomato\",\n                      },\n                    };\n              },\n            },\n          ];\n        },\n      },\n    },\n  ]}\n>\n  <VictoryStack>\n    <VictoryArea\n      name=\"area-1\"\n      data={[\n        { x: \"a\", y: 2 },\n        { x: \"b\", y: 3 },\n        { x: \"c\", y: 5 },\n        { x: \"d\", y: 4 },\n      ]}\n    />\n    <VictoryArea\n      name=\"area-2\"\n      data={[\n        { x: \"a\", y: 1 },\n        { x: \"b\", y: 4 },\n        { x: \"c\", y: 5 },\n        { x: \"d\", y: 7 },\n      ]}\n    />\n    <VictoryArea\n      name=\"area-3\"\n      data={[\n        { x: \"a\", y: 3 },\n        { x: \"b\", y: 2 },\n        { x: \"c\", y: 6 },\n        { x: \"d\", y: 2 },\n      ]}\n    />\n    <VictoryArea\n      name=\"area-4\"\n      data={[\n        { x: \"a\", y: 2 },\n        { x: \"b\", y: 3 },\n        { x: \"c\", y: 3 },\n        { x: \"d\", y: 4 },\n      ]}\n    />\n  </VictoryStack>\n</VictoryChart>\n```\n\n## Target Events\n\nEvents can target specific elements within a component by using the `eventKey` property. The `eventKey` is a zero indexed integer that specifies the index of the element to target. The `eventKey` may also be given as an array of integers to target multiple elements. In the example below, clicking on the first bar will change the color of the second bar.\n\n```jsx live\n<VictoryBar\n  theme={VictoryTheme.clean}\n  labels={[\"a\", \"b\", \"c\", \"d\", \"e\"]}\n  data={[\n    { x: 1, y: 1 },\n    { x: 2, y: 2 },\n    { x: 3, y: 3, label: \"click me\" },\n    { x: 4, y: 2 },\n    { x: 5, y: 1 },\n  ]}\n  events={[\n    {\n      target: \"data\",\n      eventKey: [1, 2],\n      eventHandlers: {\n        onClick: (evt) => {\n          evt.stopPropagation();\n          return [\n            {\n              mutation: (props) => {\n                return {\n                  style: {\n                    ...props.style,\n                    fill: VictoryTheme\n                      .clean.palette\n                      ?.colors.teal,\n                  },\n                };\n              },\n            },\n            {\n              target: \"labels\",\n              eventKey: 3,\n              mutation: (props) => {\n                return {\n                  ...props.style,\n                  text: \"now click me\",\n                };\n              },\n            },\n          ];\n        },\n      },\n    },\n    {\n      target: \"parent\",\n      eventHandlers: {\n        onClick: () => {\n          return [\n            {\n              target: \"data\",\n              mutation: (props) => {\n                return {\n                  style: {\n                    ...props.style,\n                    fill: VictoryTheme\n                      .clean.palette\n                      ?.colors.red,\n                  },\n                };\n              },\n            },\n          ];\n        },\n      },\n    },\n  ]}\n/>\n```\n\n## Parent Events\n\nWrapper components like `VictoryChart`, `VictoryGroup`, and `VictoryStack` may also define events for themselves which can target child components for mutation.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n  domainPadding={20}\n  events={[\n    {\n      childName: \"bar\",\n      target: \"data\",\n      eventHandlers: {\n        onClick: (evt) => {\n          evt.stopPropagation();\n          return [\n            {\n              mutation: (props) => {\n                return {\n                  style: {\n                    ...props.style,\n                    fill: VictoryTheme\n                      .clean.palette\n                      ?.colors.yellow,\n                  },\n                };\n              },\n            },\n          ];\n        },\n      },\n    },\n    {\n      target: \"parent\",\n      eventHandlers: {\n        onClick: () => {\n          return [\n            {\n              childName: \"bar\",\n              target: \"labels\",\n              mutation: () => {\n                return {\n                  text: \"You Clicked Me!\",\n                };\n              },\n            },\n          ];\n        },\n      },\n    },\n  ]}\n>\n  <VictoryLabel\n    text=\"Click This Label\"\n    y={50}\n    x={150}\n    style={{\n      ...VictoryTheme.clean.label,\n      fontSize: 18,\n    }}\n  />\n  <VictoryBar\n    name=\"bar\"\n    labels={() => null}\n  />\n</VictoryChart>\n```\n\n## Shared Events\n\nComponents like `VictoryChart` use the `VictorySharedEvents` wrapper automatically, but the wrapper may also be used on its own. Nest child components within the `VictorySharedEvents` wrapper, and reference them as you would when using `VictoryChart`\n\n```jsx live\n<svg viewBox=\"0 0 450 350\">\n  <VictorySharedEvents\n    events={[\n      {\n        childName: [\"pie\", \"bar\"],\n        target: \"data\",\n        eventHandlers: {\n          onMouseOver: () => {\n            return [\n              {\n                childName: [\n                  \"pie\",\n                  \"bar\",\n                ],\n                mutation: (props) => {\n                  return {\n                    style:\n                      Object.assign(\n                        {},\n                        props.style,\n                        {\n                          fill: \"lightblue\",\n                        },\n                      ),\n                  };\n                },\n              },\n            ];\n          },\n          onMouseOut: () => {\n            return [\n              {\n                childName: [\n                  \"pie\",\n                  \"bar\",\n                ],\n                mutation: () => {\n                  return null;\n                },\n              },\n            ];\n          },\n        },\n      },\n    ]}\n  >\n    <g transform={\"translate(150, 50)\"}>\n      <VictoryBar\n        name=\"bar\"\n        width={300}\n        standalone={false}\n        style={{\n          data: { width: 20 },\n          labels: { fontSize: 25 },\n        }}\n        data={[\n          { x: \"a\", y: 2 },\n          { x: \"b\", y: 3 },\n          { x: \"c\", y: 5 },\n          { x: \"d\", y: 4 },\n        ]}\n        labels={[\"a\", \"b\", \"c\", \"d\"]}\n        labelComponent={\n          <VictoryLabel y={290} />\n        }\n      />\n    </g>\n    <g transform={\"translate(0, -75)\"}>\n      <VictoryPie\n        name=\"pie\"\n        width={250}\n        standalone={false}\n        style={{\n          labels: {\n            fontSize: 25,\n            padding: 10,\n          },\n        }}\n        data={[\n          { x: \"a\", y: 1 },\n          { x: \"b\", y: 4 },\n          { x: \"c\", y: 5 },\n          { x: \"d\", y: 7 },\n        ]}\n      />\n    </g>\n  </VictorySharedEvents>\n</svg>\n```\n\n## External Event Mutations\n\nOccasionally is it necessary to trigger events in Victory's event system from some external element such as a button or a form field. Use the `externalEventMutation` prop to specify a set of mutations to apply to a given chart. The `externalEventMutations` should be given in the following form:\n\n```jsx\nexternalEventMutations: PropTypes.arrayOf(\n  PropTypes.shape({\n    callback: PropTypes.func,\n    childName: PropTypes.oneOfType([\n      PropTypes.string,\n      PropTypes.array,\n    ]),\n    eventKey: PropTypes.oneOfType([\n      PropTypes.array,\n      CustomPropTypes.allOfType([\n        CustomPropTypes.integer,\n        CustomPropTypes.nonNegative,\n      ]),\n      PropTypes.string,\n    ]),\n    mutation: PropTypes.func,\n    target: PropTypes.oneOfType([\n      PropTypes.string,\n      PropTypes.array,\n    ]),\n  }),\n);\n```\n\nThe `target`, `eventKey`, and `childName` (when applicable) must always be specified. The `mutation` function will be called with the current props of the element specified by the `target`, `eventKey` and `childName` provided. The mutation function should return a mutation object for that element. The `callback` prop should be used to clear the `externalEventMutations` prop once the mutation has been applied. Clearing `externalEventMutations` is crucial for charts that animate.\n\n```jsx live noInline\nfunction App() {\n  const [state, setState] =\n    React.useState({\n      externalMutations: undefined,\n    });\n\n  function removeMutation() {\n    setState({\n      externalMutations: undefined,\n    });\n  }\n\n  function clearClicks() {\n    setState({\n      externalMutations: [\n        {\n          childName: \"Bar-1\",\n          target: [\"data\"],\n          eventKey: \"all\",\n          mutation: () => ({\n            style: undefined,\n          }),\n          callback: removeMutation,\n        },\n      ],\n    });\n  }\n\n  const buttonStyle = {\n    backgroundColor: \"black\",\n    color: \"white\",\n    padding: \"10px\",\n    marginTop: \"10px\",\n  };\n\n  return (\n    <div>\n      <button\n        onClick={clearClicks}\n        style={buttonStyle}\n      >\n        Reset\n      </button>\n      <VictoryChart\n        domain={{ x: [0, 5] }}\n        externalEventMutations={\n          state.externalMutations\n        }\n        events={[\n          {\n            target: \"data\",\n            childName: \"Bar-1\",\n            eventHandlers: {\n              onClick: () => ({\n                target: \"data\",\n                mutation: () => ({\n                  style: {\n                    fill: \"orange\",\n                  },\n                }),\n              }),\n            },\n          },\n        ]}\n        theme={VictoryTheme.clean}\n      >\n        <VictoryBar\n          name=\"Bar-1\"\n          style={{\n            data: { fill: \"grey\" },\n          }}\n          labels={() => \"click me!\"}\n          data={[\n            { x: 1, y: 2 },\n            { x: 2, y: 4 },\n            { x: 3, y: 1 },\n            { x: 4, y: 5 },\n          ]}\n        />\n      </VictoryChart>\n    </div>\n  );\n}\n\nrender(<App />);\n```\n\n_Note_ External mutations are applied to the same state object that is used to control events in Victory, so depending on the order in which they are triggered, external event mutations may override mutations caused by internal Victory events or vice versa.\n\n## Simple Events\n\nFor simple events, it may be desirable to bypass Victory's event system. To do so, specify `events` props directly on primitive components rather than using the `events` prop on Victory components. The simple `events` prop should be given as an object whose properties are event names like `onClick`, and whose values are event handlers. Events specified this way will only be called with the standard event objects.\n\n```jsx live\n<VictoryBar\n  data={[\n    { x: 1, y: 2 },\n    { x: 2, y: 4 },\n    { x: 3, y: 7 },\n    { x: 4, y: 3 },\n    { x: 5, y: 5 },\n  ]}\n  dataComponent={\n    <Bar\n      events={{\n        onClick: (evt) =>\n          alert(\n            `(${evt.clientX}, ${evt.clientY})`,\n          ),\n      }}\n    />\n  }\n  theme={VictoryTheme.clean}\n/>\n```\n\n## Events on Custom Components\n\nFor custom SVG components, Victory's event system is not the only option. It's possible to bypass it altogether in favor of using native React events on the custom SVG components. This might be preferable when lots of custom styling and interactions are needed.\n\nNotice how the `circle` component in this example is a basic SVG element with React event props rather than a Victory component.\n\n```jsx live noInline\nconst ScatterPoint = ({\n  x,\n  y,\n  datum,\n}) => {\n  const [selected, setSelected] =\n    React.useState(false);\n  const [hovered, setHovered] =\n    React.useState(false);\n\n  return (\n    <circle\n      cx={x}\n      cy={y}\n      r={datum.x * datum.y}\n      stroke={\n        hovered ? \"purple\" : \"white\"\n      }\n      strokeWidth={2}\n      fill={\n        selected ? \"cyan\" : \"magenta\"\n      }\n      onClick={() =>\n        setSelected(!selected)\n      }\n      onMouseEnter={() =>\n        setHovered(true)\n      }\n      onMouseLeave={() =>\n        setHovered(false)\n      }\n    />\n  );\n};\n\nconst App = () => {\n  return (\n    <VictoryChart\n      theme={VictoryTheme.clean}\n    >\n      <VictoryScatter\n        data={[\n          { x: 1, y: 7 },\n          { x: 2, y: 5 },\n          { x: 3, y: 2 },\n          { x: 4, y: 6 },\n          { x: 5, y: 3 },\n        ]}\n        dataComponent={<ScatterPoint />}\n      />\n    </VictoryChart>\n  );\n};\n\nrender(<App />);\n```\n"
  },
  {
    "path": "website/docs/guides/legends.mdx",
    "content": "---\ntitle: Legends\n---\n\nLegends can be added to any chart by nesting a `VictoryLegend` component within `VictoryChart`. The legend can be styled and positioned using props.\n\n## Basic\n\nSee the [full API here](/docs/api/victory-legend).\n\n```jsx live\n<VictoryChart\n  domainPadding={{ x: 30 }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryLegend\n    x={125}\n    y={20}\n    data={[\n      {\n        name: \"Dogs\",\n        symbol: { fill: \"tomato\" },\n      },\n      {\n        name: \"Cats\",\n        symbol: { fill: \"orange\" },\n      },\n      {\n        name: \"Rabbits\",\n        symbol: { fill: \"gold\" },\n      },\n    ]}\n  />\n  <VictoryBar\n    data={[\n      {\n        x: \"Dogs\",\n        y: 6,\n        fill: \"tomato\",\n      },\n      {\n        x: \"Cats\",\n        y: 4,\n        fill: \"orange\",\n      },\n      {\n        x: \"Rabbits\",\n        y: 2,\n        fill: \"gold\",\n      },\n    ]}\n    style={{\n      data: {\n        fill: ({ datum }) => datum.fill,\n      },\n    }}\n  />\n</VictoryChart>\n```\n\n## Legend - Titles\n\nThe legend can include multiline title by setting the `title` prop to an array.\n\n```jsx live\n<VictoryLegend\n  x={125}\n  y={20}\n  title={[\"Legend\", \"Subtitle\"]}\n  data={[\n    {\n      name: \"Dogs\",\n      symbol: { fill: \"tomato\" },\n    },\n    {\n      name: \"Cats\",\n      symbol: { fill: \"orange\" },\n    },\n    {\n      name: \"Rabbits\",\n      symbol: { fill: \"gold\" },\n    },\n  ]}\n  theme={VictoryTheme.clean}\n/>\n```\n\n## Legend - Symbols\n\nVictory includes basic symbols for legend items. The `symbol` prop can be used to specify the symbol type and fill color.\n\n```jsx live\n<VictoryLegend\n  x={125}\n  y={20}\n  title=\"Legend\"\n  data={[\n    {\n      name: \"Dogs\",\n      symbol: {\n        fill: \"tomato\",\n        type: \"circle\",\n        size: 8,\n      },\n    },\n    {\n      name: \"Cats\",\n      symbol: {\n        fill: \"orange\",\n        type: \"diamond\",\n        size: 8,\n      },\n    },\n    {\n      name: \"Rabbits\",\n      symbol: {\n        fill: \"gold\",\n        type: \"star\",\n        size: 8,\n      },\n    },\n  ]}\n  theme={VictoryTheme.clean}\n/>\n```\n\n## Legend - Custom Icons\n\nVictory supports custom icons for legend items such as React components from SVG libraries like [react-icons](https://react-icons.github.io/react-icons/).\n\n```jsx live noInline\nconst { FaSun, FaMoon } = reactIconsFa;\n\nconst CustomMoon = (props) => (\n  <FaMoon\n    fill={props.datum.fill}\n    x={props.x - 7}\n    y={props.y - 7}\n    size={15}\n  />\n);\n\nfunction App() {\n  return (\n    <VictoryLegend\n      x={125}\n      y={20}\n      title=\"Legend\"\n      data={[\n        {\n          name: \"One\",\n          fill: \"orange\",\n        },\n        {\n          name: \"Two\",\n          fill: \"blue\",\n        },\n        { name: \"Three\" },\n      ]}\n      dataComponent={<CustomMoon />}\n      theme={VictoryTheme.clean}\n    />\n  );\n}\n\nrender(<App />);\n```\n\n## Legend - Orientation\n\nThe legend also supports vertical orientations.\n\n```jsx live\n<VictoryLegend\n  x={25}\n  y={75}\n  title=\"Legend\"\n  orientation=\"vertical\"\n  centerTitle={false}\n  data={[\n    {\n      name: \"Dogs\",\n      symbol: {\n        fill: \"tomato\",\n        type: \"circle\",\n        size: 8,\n      },\n    },\n    {\n      name: \"Cats\",\n      symbol: {\n        fill: \"orange\",\n        type: \"diamond\",\n        size: 8,\n      },\n    },\n    {\n      name: \"Rabbits\",\n      symbol: {\n        fill: \"gold\",\n        type: \"star\",\n        size: 8,\n      },\n    },\n  ]}\n  theme={VictoryTheme.clean}\n/>\n```\n\n## Legend - Columns\n\nThe legend can be displayed in multiple rows by setting the `itemsPerRow` prop.\n\n```jsx live\n<VictoryLegend\n  x={100}\n  y={20}\n  title=\"Legend\"\n  itemsPerRow={3}\n  data={[\n    {\n      name: \"Dogs\",\n      symbol: {\n        fill: \"tomato\",\n        type: \"circle\",\n        size: 8,\n      },\n    },\n    {\n      name: \"Cats\",\n      symbol: {\n        fill: \"orange\",\n        type: \"diamond\",\n        size: 8,\n      },\n    },\n    {\n      name: \"Rabbits\",\n      symbol: {\n        fill: \"gold\",\n        type: \"star\",\n        size: 8,\n      },\n    },\n    {\n      name: \"Snakes\",\n      symbol: {\n        fill: \"green\",\n        type: \"triangleUp\",\n        size: 8,\n      },\n    },\n    {\n      name: \"Turtles\",\n      symbol: {\n        fill: \"purple\",\n        type: \"square\",\n        size: 8,\n      },\n    },\n    {\n      name: \"Llamas\",\n      symbol: {\n        fill: \"lightblue\",\n        type: \"triangleDown\",\n        size: 8,\n      },\n    },\n  ]}\n  theme={VictoryTheme.clean}\n/>\n```\n"
  },
  {
    "path": "website/docs/guides/localization.mdx",
    "content": "---\ntitle: Localization\n---\n\nVictory provides extensive support for localization, allowing you to customize your data visualizations to match local conventions for dates, numbers, and text direction. This ensures that your charts are easily understandable and culturally appropriate for users around the world.\n\n## Date and Number Formatting\n\nDifferent regions have varying conventions for displaying dates, numbers, and currencies. Victory components can be customized to respect these local preferences. The example below demonstrates French formatting conventions for dates (e.g., \"1 janvier 2023\") and currency values (e.g., \"1 234,56 €\").\n\n```jsx live noInline\nconst numbersData = [\n\t{ x: new Date(2023, 0, 1), y: 1500 },\n\t{ x: new Date(2023, 2, 15), y: 2800 },\n\t{ x: new Date(2023, 5, 1), y: 2200 },\n\t{ x: new Date(2023, 8, 20), y: 3100 },\n\t{ x: new Date(2023, 11, 31), y: 4000 }\n];\n\nconst dateFormatter = new Intl.DateTimeFormat(\"fr-FR\", {\n\tyear: \"numeric\",\n\tmonth: \"long\",\n\tday: \"numeric\",\n});\n\nconst numberFormatter = new Intl.NumberFormat(\"fr-FR\", {\n\tstyle: \"currency\",\n\tcurrency: \"EUR\"\n});\n\nfunction App() {\n\treturn (\n\t\t<VictoryChart\n\t\t\tpadding={{ top: 50, bottom: 80, left: 80, right: 50 }}\n\t\t\tscale={{ x: \"time\" }}\n\t\t\tdomainPadding={{ x: 10, y: 10 }}\n\t\t>\n\t\t\t<VictoryAxis\n\t\t\t\ttickFormat={(t) => dateFormatter.format(t)}\n\t\t\t\tstyle={{\n\t\t\t\t\ttickLabels: {\n\t\t\t\t\t\tfontSize: 10,\n\t\t\t\t\t\tpadding: 15,\n\t\t\t\t\t\tangle: -45,\n\t\t\t\t\t\ttextAnchor: \"end\"\n\t\t\t\t\t},\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t<VictoryAxis\n\t\t\t\tdependentAxis\n\t\t\t\ttickFormat={(t) => numberFormatter.format(t)}\n\t\t\t\tstyle={{\n\t\t\t\t\ttickLabels: { fontSize: 10, padding: 10 },\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t<VictoryLine\n\t\t\t\tdata={numbersData}\n\t\t\t\tstyle={{\n\t\t\t\t\tdata: { stroke: \"#c43a31\", strokeWidth: 2 }\n\t\t\t\t}}\n\t\t\t/>\n\t\t</VictoryChart>\n\t);\n}\n\nrender(<App />);\n```\n## Text Direction (LTR/RTL)\n\nVictory supports right-to-left (RTL) layouts for languages like Arabic, Hebrew, and Persian. The following example demonstrates an Arabic sales dashboard with RTL text direction and proper Arabic number formatting.\n\n```jsx live noInline\nconst rtlData = [\n\t{ x: \"المبيعات الشهرية\", y: 120 },\n\t{ x: \"إجمالي الإيرادات\", y: 250 },\n\t{ x: \"عدد العملاء\", y: 180 },\n\t{ x: \"المنتجات النشطة\", y: 90 }\n];\n\nfunction App() {\n\treturn (\n\t\t<VictoryChart\n\t\t\tdir=\"rtl\"\n\t\t\tdomainPadding={20}\n\t\t\tpadding={{ top: 20, bottom: 30, left: 50, right: 50 }}\n\t\t>\n\t\t\t<VictoryBar\n\t\t\t\tdata={rtlData}\n\t\t\t\tlabels={({ datum }) => `${datum.y}`}\n\t\t\t\tstyle={{\n\t\t\t\t\tdata: { fill: \"#c43a31\" }\n\t\t\t\t}}\n\t\t\t\tlabelComponent={\n\t\t\t\t\t<VictoryLabel\n\t\t\t\t\t\ttextAnchor=\"end\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdirection: \"rtl\",\n\t\t\t\t\t\t\tfontSize: 12,\n\t\t\t\t\t\t\tfill: \"#252525\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t/>\n\t\t</VictoryChart>\n\t);\n}\n\nrender(<App />);\n```\n\n## Custom Formatting for Labels and Tooltips\n\nLabels and tooltips often require specialized formatting to match local conventions. This example demonstrates a sales data visualization with Brazilian Portuguese formatting for dates and currency values, including interactive tooltips.\n\n```jsx live noInline\nconst salesData = [\n\t{ x: new Date(2023, 0, 1), y: 25000 },\n\t{ x: new Date(2023, 1, 1), y: 28000 },\n\t{ x: new Date(2023, 2, 1), y: 32000 },\n\t{ x: new Date(2023, 3, 1), y: 30000 },\n\t{ x: new Date(2023, 4, 1), y: 35000 },\n\t{ x: new Date(2023, 5, 1), y: 42000 },\n\t{ x: new Date(2023, 6, 1), y: 38000 },\n\t{ x: new Date(2023, 7, 1), y: 45000 },\n\t{ x: new Date(2023, 8, 1), y: 47000 },\n\t{ x: new Date(2023, 9, 1), y: 52000 },\n\t{ x: new Date(2023, 10, 1), y: 58000 },\n\t{ x: new Date(2023, 11, 1), y: 65000 }\n];\n\nconst dateFormatter = new Intl.DateTimeFormat(\"pt-BR\", {\n\tmonth: \"long\",\n\tyear: \"numeric\"\n});\n\nconst currencyFormatter = new Intl.NumberFormat(\"pt-BR\", {\n\tstyle: \"currency\",\n\tcurrency: \"BRL\"\n});\n\nconst formatTooltip = ({ datum }) => {\nconst date = new Intl.DateTimeFormat(\"pt-BR\", {\n\t\tday: \"2-digit\",\n\t\tmonth: \"2-digit\",\n\t\tyear: \"numeric\"\n\t}).format(datum.x);\n\n\treturn `\n\t\tData: ${date}\n\t\tValor: ${currencyFormatter.format(datum.y)}\n\t`;\n};\n\nfunction App() {\n\treturn (\n\t\t<VictoryChart\n\t\t\tpadding={{ top: 50, bottom: 50, left: 80, right: 50 }}\n\t\t\tscale={{ x: \"time\" }}\n\t\t>\n\t\t\t<VictoryAxis\n\t\t\t\ttickFormat={(t) => dateFormatter.format(t)}\n\t\t\t\tstyle={{\n\t\t\t\t\ttickLabels: { fontSize: 10, padding: 5 }\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t<VictoryAxis\n\t\t\t\tdependentAxis\n\t\t\t\ttickFormat={(t) => currencyFormatter.format(t)}\n\t\t\t\tstyle={{\n\t\t\t\t\ttickLabels: { fontSize: 10, padding: 5 }\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t<VictoryLine\n\t\t\t\tdata={salesData}\n\t\t\t\tstyle={{\n\t\t\t\t\tdata: { stroke: \"#2196F3\", strokeWidth: 2 }\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t<VictoryScatter\n\t\t\t\tdata={salesData}\n\t\t\t\tsize={4}\n\t\t\t\tstyle={{\n\t\t\t\t\tdata: { fill: \"#2196F3\" }\n\t\t\t\t}}\n\t\t\t\tlabels={formatTooltip}\n\t\t\t\tlabelComponent={\n\t\t\t\t\t<VictoryTooltip\n\t\t\t\t\t\tcornerRadius={5}\n\t\t\t\t\t\tflyoutStyle={{\n\t\t\t\t\t\t\tfill: \"white\",\n\t\t\t\t\t\t\tstroke: \"#d4d4d4\",\n\t\t\t\t\t\t\tstrokeWidth: 1,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t/>\n\t\t</VictoryChart>\n\t);\n}\n\nrender(<App />);\n```\n"
  },
  {
    "path": "website/docs/guides/pan-and-zoom.mdx",
    "content": "---\ntitle: Pan and Zoom\n---\n\nUse `VictoryZoomContainer` to add panning and zooming behavior to any Victory components that work with an x-y coordinate system.\n\nSee the [full API here](/docs/api/victory-zoom-container).\n\n## Basic\n\nIn the example below, an initial domain is set with the `zoomDomain` prop. This prop may also be used to trigger pan and zoom behavior from other components.\n\n```jsx live noInline\nfunction App() {\n  return (\n    <VictoryChart\n      theme={VictoryTheme.clean}\n      domain={{ y: [0, 100] }}\n      containerComponent={\n        <VictoryZoomContainer\n          zoomDomain={{\n            x: [5, 35],\n            y: [0, 100],\n          }}\n        />\n      }\n    >\n      <VictoryScatter\n        data={getScatterData()}\n        style={{\n          data: {\n            opacity: ({ datum }) =>\n              datum.y % 5 === 0\n                ? 1\n                : 0.7,\n            fill: ({ datum }) =>\n              datum.y % 5 === 0\n                ? \"lightblue\"\n                : \"lightgreen\",\n          },\n        }}\n      />\n    </VictoryChart>\n  );\n}\n\nfunction getScatterData() {\n  return _.range(50).map((index) => {\n    return {\n      x: _.random(1, 50),\n      y: _.random(10, 90),\n      size: _.random(8) + 3,\n    };\n  });\n}\n\nrender(<App />);\n```\n\n## Limits\n\nThe `allowZoom` and `allowPan` props may be used to restrict zooming and panning behavior. In the example below, zooming is disabled, but panning is allowed.\n\n```jsx live noInline\nfunction App() {\n  return (\n    <VictoryChart\n      theme={VictoryTheme.clean}\n      domain={{ y: [0, 100] }}\n      containerComponent={\n        <VictoryZoomContainer\n          allowZoom={false}\n          allowPan={true}\n          zoomDomain={{\n            x: [5, 35],\n            y: [0, 100],\n          }}\n        />\n      }\n    >\n      <VictoryScatter\n        data={getScatterData()}\n        style={{\n          data: {\n            opacity: ({ datum }) =>\n              datum.y % 5 === 0\n                ? 1\n                : 0.7,\n            fill: ({ datum }) =>\n              datum.y % 5 === 0\n                ? \"lightblue\"\n                : \"lightgreen\",\n          },\n        }}\n      />\n    </VictoryChart>\n  );\n}\n\nfunction getScatterData() {\n  return _.range(50).map((index) => {\n    return {\n      x: _.random(1, 50),\n      y: _.random(10, 90),\n      size: _.random(8) + 3,\n    };\n  });\n}\n\nrender(<App />);\n```\n\n## Combined with Brushing\n\nIn the next example, `VictoryZoomContainer` and `VictoryBrushContainer` are used to create a zoomable chart with a mini-map brush control.\nHere, the `onZoomDomainChange` prop on `VictoryZoomContainer` alters the `brushDomain` prop on `VictoryBrushContainer` tying highlighted brush region of the mini-map to the zoom level of the chart.\nThe `onBrushDomainChange` prop on `VictoryBrushContainer` alters the `zoomDomain` prop on `VictoryZoomContainer` so that the zoomed level of the chart matches the highlighted region of the mini-map.\n\n:::info\nFor more information on brushing, see the [Data Selection](/docs/guides/data-selection) guide.\n:::\n\n```jsx live noInline\nfunction App() {\n  const [state, setState] =\n    React.useState({});\n\n  function handleZoom(domain) {\n    setState({\n      selectedDomain: domain,\n    });\n  }\n\n  function handleBrush(domain) {\n    setState({ zoomDomain: domain });\n  }\n\n  return (\n    <div>\n      <VictoryChart\n        width={550}\n        height={300}\n        scale={{ x: \"time\" }}\n        theme={VictoryTheme.clean}\n        containerComponent={\n          <VictoryZoomContainer\n            responsive={false}\n            zoomDimension=\"x\"\n            zoomDomain={\n              state.zoomDomain\n            }\n            onZoomDomainChange={\n              handleZoom\n            }\n          />\n        }\n      >\n        <VictoryLine\n          data={[\n            {\n              x: new Date(1982, 1, 1),\n              y: 125,\n            },\n            {\n              x: new Date(1987, 1, 1),\n              y: 257,\n            },\n            {\n              x: new Date(1993, 1, 1),\n              y: 345,\n            },\n            {\n              x: new Date(1997, 1, 1),\n              y: 515,\n            },\n            {\n              x: new Date(2001, 1, 1),\n              y: 132,\n            },\n            {\n              x: new Date(2005, 1, 1),\n              y: 305,\n            },\n            {\n              x: new Date(2011, 1, 1),\n              y: 270,\n            },\n            {\n              x: new Date(2015, 1, 1),\n              y: 470,\n            },\n          ]}\n        />\n      </VictoryChart>\n\n      <VictoryChart\n        width={550}\n        height={90}\n        scale={{ x: \"time\" }}\n        theme={VictoryTheme.clean}\n        padding={{\n          top: 0,\n          left: 50,\n          right: 50,\n          bottom: 30,\n        }}\n        containerComponent={\n          <VictoryBrushContainer\n            responsive={false}\n            brushDimension=\"x\"\n            brushDomain={\n              state.selectedDomain\n            }\n            onBrushDomainChange={\n              handleBrush\n            }\n          />\n        }\n      >\n        <VictoryAxis\n          tickValues={[\n            new Date(1985, 1, 1),\n            new Date(1990, 1, 1),\n            new Date(1995, 1, 1),\n            new Date(2000, 1, 1),\n            new Date(2005, 1, 1),\n            new Date(2010, 1, 1),\n            new Date(2015, 1, 1),\n          ]}\n          tickFormat={(x) =>\n            new Date(x).getFullYear()\n          }\n        />\n        <VictoryLine\n          data={[\n            {\n              x: new Date(1982, 1, 1),\n              y: 125,\n            },\n            {\n              x: new Date(1987, 1, 1),\n              y: 257,\n            },\n            {\n              x: new Date(1993, 1, 1),\n              y: 345,\n            },\n            {\n              x: new Date(1997, 1, 1),\n              y: 515,\n            },\n            {\n              x: new Date(2001, 1, 1),\n              y: 132,\n            },\n            {\n              x: new Date(2005, 1, 1),\n              y: 305,\n            },\n            {\n              x: new Date(2011, 1, 1),\n              y: 270,\n            },\n            {\n              x: new Date(2015, 1, 1),\n              y: 470,\n            },\n          ]}\n        />\n      </VictoryChart>\n    </div>\n  );\n}\n\nrender(<App />);\n```\n"
  },
  {
    "path": "website/docs/guides/polar-charts.mdx",
    "content": "---\ntitle: Polar Charts\n---\n\nVictory supports polar charts for many of its chart types. Polar charts are a type of radial chart, where the data is displayed in a circular graph.\n\n## Bar Charts\n\nBar charts are a common type of polar chart. In the following example, we use a `VictoryPolarAxis` to create a polar chart with a bar series.\n\n```jsx live\n<VictoryChart\n  polar\n  theme={VictoryTheme.clean}\n>\n  <VictoryPolarAxis\n    dependentAxis\n    labelPlacement=\"vertical\"\n    style={{ axis: { stroke: \"none\" } }}\n    tickFormat={() => \"\"}\n  />\n  <VictoryPolarAxis labelPlacement=\"parallel\" />\n  <VictoryBar\n    style={{\n      data: {\n        fill: VictoryTheme.clean.palette\n          ?.colors.purple,\n      },\n    }}\n    data={[\n      { x: 12, y: 2 },\n      { x: 26, y: 2 },\n      { x: 30, y: 4 },\n      { x: 46, y: 8 },\n      { x: 58, y: 6 },\n      { x: 65, y: 6 },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Bar Charts - Events\n\nBar charts can be interactive with the use of events. In the following example, we use a `VictoryPolarAxis` to create a polar chart with a bar series that changes color on hover.\n\n```jsx live\n<VictoryChart\n  polar\n  theme={VictoryTheme.clean}\n  containerComponent={\n    <VictoryVoronoiContainer />\n  }\n>\n  <VictoryPolarAxis\n    dependentAxis\n    labelPlacement=\"vertical\"\n    axisAngle={90}\n    tickValues={[25, 50, 75]}\n  />\n  <VictoryPolarAxis labelPlacement=\"perpendicular\" />\n  <VictoryBar\n    style={{\n      data: {\n        fill: ({ active }) =>\n          active\n            ? VictoryTheme.clean.palette\n                ?.colors.blue || \"blue\"\n            : VictoryTheme.clean.palette\n                ?.colors.red || \"red\",\n      },\n    }}\n    labelComponent={<VictoryTooltip />}\n    data={[\n      {\n        x: \"strength\",\n        y: 10,\n        label: \"one\",\n      },\n      {\n        x: \"intelligence\",\n        y: 25,\n        label: \"two\",\n      },\n      {\n        x: \"stealth\",\n        y: 40,\n        label: \"three\",\n      },\n      {\n        x: \"luck\",\n        y: 50,\n        label: \"four\",\n      },\n      {\n        x: \"charisma\",\n        y: 50,\n        label: \"five\",\n      },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Bar Charts - Stacked\n\nBar charts can be stacked in a polar format. In the following example, we use a `VictoryPolarAxis` to create a polar chart with a stacked bar series.\n\n```jsx live\n<VictoryChart\n  polar\n  theme={VictoryTheme.clean}\n  domain={{ x: [0, 360] }}\n  innerRadius={50}\n  events={[\n    {\n      childName: \"all\",\n      target: \"data\",\n      eventHandlers: {\n        onMouseOver: (evt, props) => {\n          return [\n            {\n              childName: \"bar-2\",\n              mutation: () => {\n                return {\n                  style: Object.assign(\n                    {},\n                    props.style,\n                    {\n                      fill: VictoryTheme\n                        .clean.palette\n                        ?.colors.cyan,\n                    },\n                  ),\n                };\n              },\n            },\n            {\n              childName: \"bar-3\",\n              mutation: () => {\n                return {\n                  style: Object.assign(\n                    {},\n                    props.style,\n                    {\n                      fill: VictoryTheme\n                        .clean.palette\n                        ?.colors.blue,\n                    },\n                  ),\n                };\n              },\n            },\n          ];\n        },\n        onMouseOut: () => {\n          return [\n            {\n              childName: \"all\",\n              mutation: () => {\n                return {\n                  style: undefined,\n                };\n              },\n            },\n          ];\n        },\n      },\n    },\n  ]}\n>\n  <VictoryPolarAxis\n    dependentAxis\n    labelPlacement=\"vertical\"\n    style={{ axis: { stroke: \"none\" } }}\n    tickFormat={() => \"\"}\n  />\n  <VictoryPolarAxis\n    labelPlacement=\"parallel\"\n    tickValues={[\n      0, 45, 90, 135, 180, 225, 270,\n      315,\n    ]}\n  />\n  <VictoryStack>\n    <VictoryBar\n      name=\"bar-1\"\n      style={{\n        data: {\n          fill: VictoryTheme.clean\n            .palette?.colors.red,\n        },\n      }}\n      data={[\n        { x: 45, y: 20 },\n        { x: 90, y: 30 },\n        { x: 135, y: 65 },\n        { x: 180, y: 50 },\n        { x: 270, y: 40 },\n        { x: 315, y: 30 },\n      ]}\n    />\n    <VictoryBar\n      name=\"bar-2\"\n      style={{\n        data: {\n          fill: VictoryTheme.clean\n            .palette?.colors.orange,\n        },\n      }}\n      data={[\n        { x: 45, y: 20 },\n        { x: 90, y: 30 },\n        { x: 135, y: 65 },\n        { x: 180, y: 50 },\n        { x: 270, y: 40 },\n        { x: 315, y: 30 },\n      ]}\n    />\n    <VictoryBar\n      name=\"bar-3\"\n      style={{\n        data: {\n          fill: VictoryTheme.clean\n            .palette?.colors.yellow,\n        },\n      }}\n      data={[\n        { x: 45, y: 20 },\n        { x: 90, y: 30 },\n        { x: 135, y: 65 },\n        { x: 180, y: 50 },\n        { x: 270, y: 40 },\n        { x: 315, y: 30 },\n      ]}\n    />\n  </VictoryStack>\n</VictoryChart>\n```\n\n## Bar & Scatter - Combo\n\nBar and Scatter charts are another common combination for polar charts. In the following example, we use a `VictoryPolarAxis` to create a polar chart with a bar and scatter series, and a `VictoryGroup` to apply styles and data to both components.\n\n```jsx live\n<VictoryChart\n  polar\n  theme={VictoryTheme.clean}\n>\n  <VictoryPolarAxis\n    dependentAxis\n    labelPlacement=\"vertical\"\n    style={{ axis: { stroke: \"none\" } }}\n    axisAngle={270}\n    tickValues={[1, 3, 5, 7]}\n  />\n  <VictoryPolarAxis labelPlacement=\"parallel\" />\n  <VictoryBar\n    style={{\n      data: {\n        fill: ({ datum }) =>\n          VictoryTheme.clean.palette\n            ?.colors[datum.fill],\n      },\n    }}\n    data={[\n      {\n        x: 1,\n        y: 2,\n        label: 1,\n        fill: \"red\",\n      },\n      {\n        x: 2,\n        y: 3,\n        label: 2,\n        fill: \"orange\",\n      },\n      {\n        x: 3,\n        y: 6,\n        label: 3,\n        fill: \"yellow\",\n      },\n      {\n        x: 4,\n        y: 5,\n        label: 4,\n        fill: \"blue\",\n      },\n      {\n        x: 5,\n        y: 4,\n        label: 5,\n        fill: \"cyan\",\n      },\n      {\n        x: 6,\n        y: 3,\n        label: 6,\n        fill: \"green\",\n      },\n    ]}\n  />\n  <VictoryScatter\n    style={{ data: { fill: \"black\" } }}\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 3 },\n      { x: 3, y: 6 },\n      { x: 4, y: 5 },\n      { x: 5, y: 4 },\n      { x: 6, y: 3 },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Line Charts\n\nLine charts are another common type of polar chart. In the following example, we use a `VictoryPolarAxis` to create a polar chart with a line series.\n\n```jsx live\n<VictoryChart\n  polar\n  domain={{ y: [0, 10] }}\n  theme={VictoryTheme.clean}\n  containerComponent={\n    <VictoryVoronoiContainer />\n  }\n>\n  <VictoryPolarAxis\n    dependentAxis\n    labelPlacement=\"vertical\"\n    tickFormat={() => \"\"}\n  />\n  <VictoryPolarAxis labelPlacement=\"parallel\" />\n  <VictoryLine\n    labelComponent={\n      <VictoryLabel labelPlacement=\"parallel\" />\n    }\n    interpolation=\"linear\"\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 5 },\n      { x: 3, y: 9 },\n      { x: 4, y: 6 },\n      { x: 5, y: 8 },\n      { x: 6, y: 8 },\n      { x: 7, y: 2 },\n      { x: 8, y: 6 },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Line & Scatter Combo\n\nLine and Scatter charts are a common combination for polar charts. In the following example, we use a `VictoryPolarAxis` to create a polar chart with a line and scatter series, and a `VictoryGroup` to apply styles and data to both components.\n\n```jsx live\n<VictoryChart\n  polar\n  theme={VictoryTheme.clean}\n  containerComponent={\n    <VictorySelectionContainer />\n  }\n>\n  <VictoryPolarAxis labelPlacement=\"perpendicular\" />\n  <VictoryGroup\n    colorScale=\"red\"\n    data={[\n      { x: 1, y: 5 },\n      { x: 2, y: 3 },\n      { x: 3, y: 1 },\n      { x: 4, y: 2 },\n      { x: 5, y: 4 },\n    ]}\n  >\n    <VictoryLine />\n    <VictoryScatter\n      labels={({ datum }) => datum.y}\n      labelComponent={\n        <VictoryTooltip />\n      }\n    />\n  </VictoryGroup>\n\n  <VictoryGroup\n    colorScale=\"cool\"\n    data={[\n      { x: 1, y: 3 },\n      { x: 2, y: 5 },\n      { x: 3, y: 3 },\n      { x: 3, y: 2 },\n      { x: 4, y: 2 },\n      { x: 5, y: 1 },\n    ]}\n  >\n    <VictoryLine />\n    <VictoryScatter\n      labels={({ datum }) =>\n        `y: ${datum.y}`\n      }\n      labelComponent={\n        <VictoryTooltip />\n      }\n    />\n  </VictoryGroup>\n\n  <VictoryGroup\n    colorScale=\"warm\"\n    data={[\n      { x: 1, y: 5 },\n      { x: 2, y: 4 },\n      { x: 3, y: 2 },\n      { x: 4, y: 4 },\n      { x: 5, y: 2 },\n    ]}\n  >\n    <VictoryLine />\n    <VictoryScatter\n      labels={({ datum }) => datum.y}\n      labelComponent={\n        <VictoryTooltip />\n      }\n    />\n  </VictoryGroup>\n</VictoryChart>\n```\n\n## Area Charts\n\nArea charts can also be displayed in a polar format. In the following example, we use a `VictoryPolarAxis` to create a polar chart with an area series.\n\n```jsx live\n<VictoryChart\n  polar\n  theme={VictoryTheme.clean}\n  domain={{ y: [0, 10] }}\n>\n  <VictoryPolarAxis\n    dependentAxis\n    labelPlacement=\"vertical\"\n    tickFormat={() => \"\"}\n  />\n  <VictoryPolarAxis labelPlacement=\"parallel\" />\n  <VictoryArea\n    interpolation=\"catmullRom\"\n    data={[\n      { x: 1, y: 6 },\n      { x: 2, y: 8 },\n      { x: 3, y: 9 },\n      { x: 4, y: 5 },\n      { x: 5, y: 3 },\n      { x: 6, y: 8 },\n      { x: 7, y: 8 },\n      { x: 8, y: 2 },\n    ]}\n  />\n</VictoryChart>\n```\n\n## Area Charts - Events\n\nArea charts can be interactive with the use of events. In the following example, we use a `VictoryPolarAxis` to create a polar chart with an area series that changes color on hover.\n\n```jsx live\n<VictoryChart\n  polar\n  theme={VictoryTheme.clean}\n  domain={{ x: [0, 360] }}\n  events={[\n    {\n      childName: \"all\",\n      target: \"data\",\n      eventHandlers: {\n        onMouseOver: (evt, props) => {\n          return [\n            {\n              mutation: () => {\n                return {\n                  style: Object.assign(\n                    {},\n                    props.style,\n                    {\n                      fill: VictoryTheme\n                        .clean.palette\n                        ?.colors.cyan,\n                    },\n                  ),\n                };\n              },\n            },\n          ];\n        },\n        onMouseOut: () => {\n          return [\n            {\n              mutation: () => {\n                return {\n                  style: undefined,\n                };\n              },\n            },\n          ];\n        },\n      },\n    },\n  ]}\n>\n  <VictoryPolarAxis\n    dependentAxis\n    labelPlacement=\"vertical\"\n    style={{ axis: { stroke: \"none\" } }}\n    tickFormat={() => \"\"}\n  />\n  <VictoryPolarAxis\n    labelPlacement=\"parallel\"\n    tickValues={[\n      0, 45, 90, 135, 180, 225, 270,\n      315,\n    ]}\n  />\n  <VictoryStack>\n    <VictoryArea\n      name=\"area-1\"\n      interpolation=\"cardinal\"\n      style={{\n        data: {\n          fill: VictoryTheme.clean\n            .palette?.colors.red,\n        },\n      }}\n      data={[\n        { x: 45, y: 20 },\n        { x: 90, y: 30 },\n        { x: 135, y: 65 },\n        { x: 180, y: 50 },\n        { x: 270, y: 40 },\n        { x: 315, y: 30 },\n      ]}\n    />\n    <VictoryArea\n      name=\"area-2\"\n      interpolation=\"cardinal\"\n      style={{\n        data: {\n          fill: VictoryTheme.clean\n            .palette?.colors.orange,\n        },\n      }}\n      data={[\n        { x: 45, y: 20 },\n        { x: 90, y: 30 },\n        { x: 135, y: 65 },\n        { x: 180, y: 50 },\n        { x: 270, y: 40 },\n        { x: 315, y: 30 },\n      ]}\n    />\n    <VictoryArea\n      name=\"area-3\"\n      interpolation=\"cardinal\"\n      style={{\n        data: {\n          fill: VictoryTheme.clean\n            .palette?.colors.yellow,\n        },\n      }}\n      data={[\n        { x: 45, y: 20 },\n        { x: 90, y: 30 },\n        { x: 135, y: 65 },\n        { x: 180, y: 50 },\n        { x: 270, y: 40 },\n        { x: 315, y: 30 },\n      ]}\n    />\n  </VictoryStack>\n</VictoryChart>\n```\n\n## Area & Scatter Combo\n\nArea and Scatter charts are another common combination for polar charts. In the following example, we use a `VictoryPolarAxis` to create a polar chart with an area and scatter series, and a `VictoryGroup` to apply styles and data to both components.\n\n```jsx live\n<VictoryChart\n  polar\n  theme={VictoryTheme.clean}\n>\n  <VictoryPolarAxis\n    dependentAxis\n    labelPlacement=\"vertical\"\n    style={{ axis: { stroke: \"none\" } }}\n    axisAngle={90}\n    tickValues={[25, 50, 75]}\n  />\n  <VictoryPolarAxis\n    labelPlacement=\"perpendicular\"\n    tickFormat={[\n      \"strength\",\n      \"intelligence\",\n      \"stealth\",\n      \"luck\",\n      \"charisma\",\n    ]}\n  />\n  <VictoryArea\n    data={[\n      { x: 1, y: 10 },\n      { x: 2, y: 25 },\n      { x: 3, y: 40 },\n      { x: 4, y: 50 },\n      { x: 5, y: 50 },\n    ]}\n  />\n  <VictoryScatter\n    size={5}\n    data={[\n      { x: 1, y: 10 },\n      { x: 2, y: 25 },\n      { x: 3, y: 40 },\n      { x: 4, y: 50 },\n      { x: 5, y: 50 },\n    ]}\n  />\n</VictoryChart>\n```\n"
  },
  {
    "path": "website/docs/guides/themes.mdx",
    "content": "---\ntitle: Themes & Styling\n---\n\n## Themes\n\nVictory themes are reusable style configurations that enable you to standardize the appearance of charts across your application. Themes simplify chart development by reducing repetitive styling logic and ensuring visual consistency.\n\nThemes are applied at the chart level and automatically cascade to all child components, such as axes, bars, lines, and legends. Victory provides built-in themes like `clean`, `material` and `grayscale`, but you can also create custom themes to match your branding.\n\n### How Themes Work in Victory\n\nVictory themes are essentially JavaScript objects that define styling properties for various chart elements. These theme configurations enable consistent and reusable styling across charts. Each theme configuration variable corresponds to a specific chart element and takes props that define its styles.\n\nTheme configuration variables include:\n\n- [`.palette`](/docs/api/victory-theme#palette)\n  - Defines color schemes used across the theme.\n- [`.chart`](/docs/api/victory-chart)\n  - Global styles like background and padding.\n- [`.area`](/docs/api/victory-area)\n- [`.axis`](/docs/api/victory-axis)\n- [`.polarAxis`](/docs/api/victory-polar-axis)\n- [`.polarDependentAxis`](/docs/api/victory-polar-axis)\n- [`.bar`](/docs/api/victory-bar)\n- [`.boxplot`](/docs/api/victory-boxplot)\n- [`.candlestick`](/docs/api/victory-candlestick)\n- [`.errorbar`](/docs/api/victory-error-bar)\n- [`.group`](/docs/api/victory-group)\n- [`.histogram`](/docs/api/victory-histogram)\n- [`.legend`](/docs/api/victory-legend)\n- [`.line`](/docs/api/victory-line)\n- [`.pie`](/docs/api/victory-pie)\n- [`.scatter`](/docs/api/victory-scatter)\n- [`.stack`](/docs/api/victory-stack)\n- [`.tooltip`](/docs/api/victory-tooltip)\n- [`.voronoi`](/docs/api/victory-voronoi)\n\nEach configuration variable takes props specific to its chart element, allowing customization of styles like colors, padding, labels, and more. For detailed information about each variable, refer to the [VictoryTheme API page](/docs/api/victory-theme).\n\nWhen a theme is passed to a chart via the `theme` prop, the styles from the theme object are applied to the corresponding child components unless they are explicitly overridden by inline props.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.material}\n>\n  <VictoryBar />\n</VictoryChart>\n```\n\n### Predefined Themes\n\nVictory includes several built-in themes to help you quickly style your charts:\n\n| Theme                    | Description                                                                                         |\n| ------------------------ | --------------------------------------------------------------------------------------------------- |\n| `VictoryTheme.clean`     | A minimalist theme with no gridlines or extra styling, perfect for clean and modern visualizations. |\n| `VictoryTheme.material`  | Inspired by Google's Material Design, this theme includes bold colors and a structured grid.        |\n| `VictoryTheme.grayscale` | A neutral theme featuring grayscale tones, ideal for muted and professional-looking charts.         |\n\nEach of these themes can be applied to your Victory components by passing it into the `theme` prop.\n\n```jsx live noInline\nconst result = [...Array(10).keys()];\n\nconst scatterData = [\n  ...Array(20).keys(),\n].forEach((i) => ({\n  x: (i - 10) / 3,\n  y: i / 2 - 2 * Math.random() - 4,\n}));\n\nconst toInteger = (number) =>\n  parseInt(number).toString();\n\nconst DemoComponent = () => {\n  const [theme, setTheme] =\n    React.useState(\n      VictoryTheme.grayscale,\n    );\n\n  const positions = [\n    { transform: \"translate(0, -15)\" },\n    {\n      transform: \"translate(180, -40)\",\n    },\n    {\n      transform: \"translate(-10, 140)\",\n    },\n    {\n      transform: \"translate(180, 140)\",\n    },\n  ];\n  return (\n    <div>\n      <div className=\"mb-8 p-4 mx-auto flex justify-between w-full\">\n        <button\n          className=\"bg-blue-600 border-none rounded-md text-white uppercase py-3 px-6 hover:bg-blue-700 cursor-pointer\"\n          onClick={() =>\n            setTheme(VictoryTheme.clean)\n          }\n        >\n          clean\n        </button>\n        <button\n          className=\"bg-orange-600 border-none rounded-md text-white uppercase py-3 px-6 hover:bg-orange-700 cursor-pointer\"\n          onClick={() =>\n            setTheme(\n              VictoryTheme.material,\n            )\n          }\n        >\n          material\n        </button>\n        <button\n          className=\"bg-gray-600 border-none rounded-md text-white uppercase py-3 px-6 hover:bg-gray-700 cursor-pointer\"\n          onClick={() =>\n            setTheme(\n              VictoryTheme.grayscale,\n            )\n          }\n        >\n          grayscale\n        </button>\n      </div>\n      <svg\n        viewBox=\"0 0 400 400\"\n        role=\"img\"\n        aria-labelledby=\"title desc\"\n        style={{\n          height: \"auto\",\n          width: \"100%\",\n        }}\n      >\n        <g\n          transform={\n            positions[0].transform\n          }\n        >\n          <VictoryPie\n            theme={theme}\n            standalone={false}\n            style={{\n              labels: { padding: 10 },\n            }}\n            height={200}\n            width={200}\n          />\n        </g>\n        <g\n          transform={\n            positions[1].transform\n          }\n        >\n          <VictoryChart\n            theme={theme}\n            standalone={false}\n            height={250}\n            width={250}\n          >\n            <VictoryAxis\n              tickCount={3}\n              tickFormat={toInteger}\n            />\n            <VictoryAxis\n              tickCount={4}\n              dependentAxis\n            />\n            <VictoryScatter\n              size={2}\n              data={scatterData}\n            />\n          </VictoryChart>\n        </g>\n\n        <g\n          transform={\n            positions[2].transform\n          }\n        >\n          <VictoryChart\n            theme={theme}\n            standalone={false}\n            height={250}\n            width={250}\n          >\n            <VictoryAxis\n              tickCount={4}\n              domain={[0, 3]}\n              tickFormat={toInteger}\n            />\n            <VictoryAxis\n              tickCount={4}\n              dependentAxis\n              domain={[0, 10]}\n            />\n            <VictoryLine\n              y={(data) =>\n                data.x * data.x\n              }\n            />\n          </VictoryChart>\n        </g>\n\n        <g\n          transform={\n            positions[3].transform\n          }\n        >\n          <VictoryChart\n            standalone={false}\n            theme={theme}\n            height={250}\n            width={250}\n            domainPadding={{ x: 40 }}\n          >\n            <VictoryAxis\n              tickFormat={[\n                \"A\",\n                \"B\",\n                \"C\",\n              ]}\n            />\n            <VictoryAxis\n              tickCount={3}\n              dependentAxis\n            />\n            <VictoryStack>\n              <VictoryBar\n                data={[\n                  {\n                    x: \"A\",\n                    y: 1,\n                  },\n                  {\n                    x: \"B\",\n                    y: 3,\n                  },\n                  {\n                    x: \"C\",\n                    y: 3,\n                  },\n                ]}\n              />\n              <VictoryBar\n                data={[\n                  {\n                    x: \"A\",\n                    y: 2,\n                  },\n                  {\n                    x: \"B\",\n                    y: 1,\n                  },\n                  {\n                    x: \"C\",\n                    y: 3,\n                  },\n                ]}\n              />\n              <VictoryBar\n                data={[\n                  {\n                    x: \"A\",\n                    y: 3,\n                  },\n                  {\n                    x: \"B\",\n                    y: 1,\n                  },\n                  {\n                    x: \"C\",\n                    y: 1,\n                  },\n                ]}\n              />\n            </VictoryStack>\n          </VictoryChart>\n        </g>\n      </svg>\n    </div>\n  );\n};\n\nrender(<DemoComponent />);\n```\n\nYou can also customize these themes or use them as a base to create your own. To build upon a predefined theme, you can extend it using the spread operator:\n\n```jsx\nconst extendedTheme = {\n  ...VictoryTheme.material,\n  axis: {\n    ...VictoryTheme.material.axis,\n    style: {\n      ...VictoryTheme.material.axis\n        .style,\n      tickLabels: {\n        fill: \"#444\",\n        fontSize: 10,\n        fontStyle: \"italic\",\n      },\n    },\n  },\n};\n```\n\n### Creating a Custom Theme\n\nTo create a completely custom theme, define a JavaScript object that includes styles for the components you want to theme. You can omit components that use default styling.\n\n```jsx live noInline\nconst customTheme = {\n  axis: {\n    style: {\n      grid: { stroke: \"none\" },\n      axis: {\n        stroke: \"#333\",\n        strokeWidth: 2,\n      },\n      ticks: {\n        stroke: \"#555\",\n        size: 5,\n      },\n      tickLabels: {\n        fill: \"#222\",\n        fontSize: 12,\n        padding: 5,\n      },\n    },\n  },\n  bar: {\n    style: {\n      data: {\n        fill: \"#0074d9\",\n        width: 15,\n      },\n    },\n  },\n};\n\nrender(\n  <VictoryChart\n    theme={customTheme}\n    domainPadding={{ x: 40 }}\n  >\n    <VictoryBar\n      data={[\n        { x: 1, y: 2 },\n        { x: 2, y: 4 },\n        { x: 3, y: 6 },\n      ]}\n    />\n  </VictoryChart>,\n);\n```\n\nTo enhance the \"Styles\" section of the Victory Themes guide, consider incorporating the following detailed explanations and examples:\n\n## Styling Individual Components\n\nTo customize the appearance of Victory components, you can use the `style` prop, which accepts an object containing styles for various component elements like `data`, `labels`, and `parent`. For a detailed breakdown of the style options available, refer to the [Victory Style Interface](/docs/api/victory-style-interface).\n\n**Example: Customizing Bar and Line Colors**\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n  domain={{ x: [0, 4] }}\n>\n  <VictoryBar\n    style={{ data: { fill: \"red\" } }}\n    data={[\n      { x: 1, y: 2 },\n      { x: 2, y: 4 },\n      { x: 3, y: 6 },\n    ]}\n  />\n  <VictoryLine\n    style={{\n      data: {\n        stroke: \"blue\",\n        strokeWidth: 5,\n      },\n    }}\n    y={(d) => d.x}\n  />\n</VictoryChart>\n```\n\n### Styling Data\n\nTo style individual elements within a dataset, you can include style attributes directly in your data objects and utilize functional styles.\n\n**Note:** Continuous data components like `VictoryLine` and `VictoryArea` render a single SVG element for the entire dataset, so individual styling of data points within these components is not applicable.\n\n```jsx live\n<VictoryChart>\n  <VictoryBar\n    style={{\n      data: {\n        fill: ({ datum }) => datum.fill,\n      },\n    }}\n    data={[\n      { x: 1, y: 2, fill: \"red\" },\n      { x: 2, y: 4, fill: \"orange\" },\n      { x: 3, y: 6, fill: \"gold\" },\n    ]}\n  />\n  <VictoryScatter\n    style={{\n      data: {\n        fill: ({ index }) =>\n          index % 2 === 0\n            ? \"blue\"\n            : \"grey\",\n        stroke: ({ datum }) =>\n          datum.y < 6 ? \"red\" : \"black\",\n        strokeWidth: 2,\n      },\n    }}\n    symbol={({ datum }) =>\n      datum.x > 1 ? \"plus\" : \"square\"\n    }\n    size={({ datum }) => datum.y + 2}\n    data={[\n      { x: 0, y: 2 },\n      { x: 1, y: 4 },\n      { x: 2, y: 6 },\n      { x: 3, y: 8 },\n      { x: 4, y: 10 },\n    ]}\n  />\n</VictoryChart>\n```\n\n### Using Gradient Fills\n\nTo apply gradient fills to your charts, define a gradient in the SVG `defs` section and reference it by id in your component's style. Gradients can be used to give continuous charts (i.e. line or area charts) the appearance of discrete data elements and hover states.\n\n```jsx live\n<div>\n  <svg style={{ height: 0 }}>\n    <defs>\n      <linearGradient id=\"myGradient\">\n        <stop\n          offset=\"0%\"\n          stopColor=\"red\"\n        />\n        <stop\n          offset=\"25%\"\n          stopColor=\"orange\"\n        />\n        <stop\n          offset=\"50%\"\n          stopColor=\"gold\"\n        />\n        <stop\n          offset=\"75%\"\n          stopColor=\"yellow\"\n        />\n        <stop\n          offset=\"100%\"\n          stopColor=\"green\"\n        />\n      </linearGradient>\n    </defs>\n  </svg>\n  <VictoryChart\n    theme={VictoryTheme.clean}\n  >\n    <VictoryArea\n      style={{\n        data: {\n          fill: \"url(#myGradient)\",\n        },\n      }}\n      data={[\n        { x: 1, y: 2 },\n        { x: 2, y: 3 },\n        { x: 3, y: 7 },\n        { x: 4, y: 4 },\n        { x: 5, y: 5 },\n      ]}\n    />\n  </VictoryChart>\n</div>\n```\n"
  },
  {
    "path": "website/docs/guides/tooltips.mdx",
    "content": "---\ntitle: Tooltips\n---\n\nVictory supports multiple ways to show tooltips on your charts. Tooltips can be added to any Victory component, and can be customized to suit your needs. This guide will cover the basics of adding tooltips to your charts, as well as more advanced configurations.\n\n## Basic\n\nThe simplest way to add tooltips to a chart is to use `VictoryTooltip` as a `labelComponent`. By default, the `labelComponent` will display the `label` prop of the data point it is associated with, unless you specify a custom `labels` function.\n\n```jsx live\n<VictoryChart\n  domain={{ x: [0, 11], y: [-10, 10] }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar\n    labelComponent={<VictoryTooltip />}\n    data={[\n      { x: 2, y: 5 },\n      { x: 4, y: -6 },\n      { x: 6, y: 4 },\n      { x: 8, y: -5 },\n      { x: 10, y: 7 },\n    ]}\n    labels={({ datum }) => datum.y}\n  />\n</VictoryChart>\n```\n\n## Styles\n\n`VictoryTooltip` can be styled using the `style` prop. The `style` prop accepts an object with `data`, `labels`, and `flyout` keys. The `data` key styles the data point, the `labels` key styles the text of the tooltip, and the `flyout` key styles the background of the tooltip.\n\n```jsx live\n<VictoryChart\n  domain={{ x: [0, 11], y: [-10, 10] }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar\n    labelComponent={\n      <VictoryTooltip\n        cornerRadius={({ datum }) =>\n          datum.x > 6 ? 0 : 20\n        }\n        pointerLength={({ datum }) =>\n          datum.y > 0 ? 5 : 20\n        }\n        flyoutStyle={{\n          stroke: ({ datum }) =>\n            datum.x === 10\n              ? \"tomato\"\n              : \"black\",\n        }}\n      />\n    }\n    data={[\n      {\n        x: 2,\n        y: 5,\n        label: \"right-side-up\",\n      },\n      {\n        x: 4,\n        y: -6,\n        label: \"upside-down\",\n      },\n      { x: 6, y: 4, label: \"tiny\" },\n      {\n        x: 8,\n        y: -5,\n        label: \"or a little \\n BIGGER\",\n      },\n      {\n        x: 10,\n        y: 7,\n        label: \"automatically\",\n      },\n    ]}\n    style={{\n      data: { width: 20 },\n    }}\n  />\n</VictoryChart>\n```\n\n## Events\n\n`VictoryTooltip` automatically attaches events to data components. When events of the same type are specified for data components, it is necessary to reconcile events so that tooltips still work. For web, the default tooltip events are:\n\n```jsx\nstatic defaultEvents = [{\n  target: \"data\",\n  eventHandlers: {\n    onMouseOver: () => ({\n      target: \"labels\",\n      mutation: () => ({ active: true })\n    }),\n    onMouseOut: () => ({\n      target: \"labels\",\n      mutation: () => ({ active: undefined })\n    }),\n    onFocus: () => ({\n      target: \"labels\",\n      mutation: () => ({ active: true })\n    }),\n    onBlur: () => ({\n      target: \"labels\",\n      mutation: () => ({ active: undefined })\n    })\n  }\n}];\n```\n\n:::warning\nWhen other `onMouseOver` and `onMouseOut` events are specified for data, the event returns described above must be added to the events for tooltips to continue to work properly.\n:::\n\n```jsx live\n<VictoryChart\n  domain={{ x: [0, 11], y: [-10, 10] }}\n  theme={VictoryTheme.clean}\n>\n  <VictoryBar\n    labelComponent={<VictoryTooltip />}\n    data={[\n      { x: 2, y: 5, label: \"A\" },\n      { x: 4, y: -6, label: \"B\" },\n      { x: 6, y: 4, label: \"C\" },\n      { x: 8, y: -5, label: \"D\" },\n      { x: 10, y: 7, label: \"E\" },\n    ]}\n    style={{\n      data: { width: 20 },\n    }}\n    events={[\n      {\n        target: \"data\",\n        eventHandlers: {\n          onMouseOver: () => {\n            return [\n              {\n                target: \"data\",\n                mutation: () => ({\n                  style: {\n                    fill: \"gold\",\n                    width: 30,\n                  },\n                }),\n              },\n              {\n                target: \"labels\",\n                mutation: () => ({\n                  active: true,\n                }),\n              },\n            ];\n          },\n          onMouseOut: () => {\n            return [\n              {\n                target: \"data\",\n                mutation: () => {},\n              },\n              {\n                target: \"labels\",\n                mutation: () => ({\n                  active: false,\n                }),\n              },\n            ];\n          },\n        },\n      },\n    ]}\n  />\n</VictoryChart>\n```\n\n---\n\n## Voronoi\n\nUse `VictoryVoronoiContainer` to associate a mouse position with the data point(s)\nclosest to it. When this container is added to a chart, changes in mouse position will add the `active`\nprop to data and label components closest to the current mouse position. The closeness of data\npoints to a given position is determined by calculating a voronoi diagram based on the data of\nevery child `VictoryVoronoiContainer` renders. This container is useful for adding hover interactions,\nlike tooltips, to small data points, or charts with dense or overlapping data.\n\nSee the [full API here](/docs/api/victory-voronoi-container).\n\n### Basic\n\n`VictoryVoronoiContainer` may be used with any Victory component that works with an x-y coordinate\nsystem, and should be added as the `containerComponent` of the top-level component.\nHowever, the component that uses it must be standalone\n(`standalone={true}`), which is the default for all top-level Victory components.\n\n```jsx live\n<VictoryChart\n  domain={{ x: [0, 5], y: [-5, 5] }}\n  containerComponent={\n    <VictoryVoronoiContainer />\n  }\n  theme={VictoryTheme.clean}\n>\n  <VictoryScatter\n    size={({ active }) =>\n      active ? 5 : 3\n    }\n    labels={({ datum }) => datum.y}\n    labelComponent={<VictoryTooltip />}\n    data={[\n      { x: 1, y: -4 },\n      { x: 2, y: 4 },\n      { x: 3, y: 2 },\n      { x: 4, y: 1 },\n    ]}\n  />\n  <VictoryScatter\n    size={(datum, active) =>\n      active ? 5 : 3\n    }\n    labels={({ datum }) => datum.y}\n    labelComponent={<VictoryTooltip />}\n    data={[\n      { x: 1, y: -3 },\n      { x: 2, y: 3 },\n      { x: 3, y: 3 },\n      { x: 4, y: 0 },\n    ]}\n  />\n  <VictoryScatter\n    data={[\n      { x: 1, y: 4 },\n      { x: 2, y: -4 },\n      { x: 3, y: -2 },\n      { x: 4, y: -3 },\n    ]}\n    labels={({ datum }) => datum.y}\n    labelComponent={<VictoryTooltip />}\n    size={({ active }) =>\n      active ? 5 : 3\n    }\n  />\n</VictoryChart>\n```\n\n### Follow Tooltips\n\nWhen using `VictoryVoronoiContainer` with `VictoryTooltip`, you can add tooltips to your chart that follow the mouse position.\n\n```jsx live\n<VictoryChart\n  theme={VictoryTheme.clean}\n  domain={{ y: [0, 1] }}\n  containerComponent={\n    <VictoryVoronoiContainer\n      labels={({ datum }) =>\n        `Data ${datum.y}`\n      }\n      mouseFollowTooltips\n      labelComponent={\n        <VictoryTooltip\n          constrainToVisibleArea\n        />\n      }\n    />\n  }\n>\n  <VictoryScatter\n    data={[\n      { x: 1, y: 0 },\n      { x: 2, y: 0 },\n      { x: 3, y: 0 },\n      { x: 4, y: 0 },\n      { x: 5, y: 0 },\n      { x: 6, y: 0 },\n      { x: 7, y: 0 },\n    ]}\n    style={{\n      data: {\n        fill: VictoryTheme.clean.palette\n          ?.colors.blue,\n      },\n    }}\n    size={({ active }) =>\n      active ? 8 : 3\n    }\n  />\n  <VictoryScatter\n    data={[\n      { x: 1, y: 0 },\n      { x: 2, y: 0 },\n      { x: 3, y: 1 },\n      { x: 4, y: 0 },\n      { x: 5, y: 0 },\n      { x: 6, y: 0 },\n      { x: 7, y: 0 },\n    ]}\n    style={{\n      data: {\n        fill: VictoryTheme.clean.palette\n          ?.colors.red,\n      },\n    }}\n    size={({ active }) =>\n      active ? 5 : 3\n    }\n  />\n</VictoryChart>\n```\n\n### Active Points\n\n`VictoryVoronoiContainer` adds the `active` prop to any data point closest to the current mouse position. This prop can be used to style the active data point differently from the rest.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ y: 10 }}\n  containerComponent={\n    <VictoryVoronoiContainer\n      labels={({ datum }) =>\n        `${_.round(datum.x, 2)}, ${_.round(\n          datum.y,\n          2,\n        )}`\n      }\n    />\n  }\n  theme={VictoryTheme.clean}\n>\n  <VictoryScatter\n    y={(datum) =>\n      Math.sin(2 * Math.PI * datum.x)\n    }\n    style={{\n      data: {\n        fill: ({ active }) =>\n          active\n            ? VictoryTheme.clean.palette\n                ?.colors.red\n            : VictoryTheme.clean.palette\n                ?.colors.blue,\n      },\n    }}\n  />\n</VictoryChart>\n```\n\n### Multipoint Labels\n\n`VictoryVoronoiContainer` can also be used to create multi-point labels when the `labels` prop is\nprovided. In the example below the `voronoiDimension` prop indicates that the voronoi diagram\nwill only be specific to the x dimension. For a given mouse position, all data matching the\nassociated x value will be activated regardless of y value. In the following example, this leads to\nseveral tooltips being active at the same time. Provide a `labels` and (optionally) a\n`labelComponent` prop to configure multi-point labels.\n\n```jsx live\n<VictoryChart\n  domainPadding={{ y: 10 }}\n  containerComponent={\n    <VictoryVoronoiContainer\n      voronoiDimension=\"x\"\n      labels={({ datum }) =>\n        `y: ${datum.y}`\n      }\n      labelComponent={\n        <VictoryTooltip\n          cornerRadius={0}\n          flyoutStyle={{\n            fill: \"white\",\n          }}\n        />\n      }\n    />\n  }\n  theme={VictoryTheme.clean}\n>\n  <VictoryLine\n    data={[\n      { x: 1, y: 5, l: \"one\" },\n      {\n        x: 1.5,\n        y: 5,\n        l: \"one point five\",\n      },\n      { x: 2, y: 4, l: \"two\" },\n      { x: 3, y: -2, l: \"three\" },\n    ]}\n    style={{\n      data: {\n        stroke: \"tomato\",\n        strokeWidth: ({ active }) =>\n          active ? 4 : 2,\n      },\n      labels: { fill: \"tomato\" },\n    }}\n  />\n\n  <VictoryLine\n    data={[\n      { x: 1, y: -3, l: \"red\" },\n      { x: 2, y: 5, l: \"green\" },\n      { x: 3, y: 3, l: \"blue\" },\n    ]}\n    style={{\n      data: {\n        stroke: \"blue\",\n        strokeWidth: ({ active }) =>\n          active ? 4 : 2,\n      },\n      labels: { fill: \"blue\" },\n    }}\n  />\n\n  <VictoryLine\n    data={[\n      { x: 1, y: 5, l: \"cat\" },\n      { x: 2, y: -4, l: \"dog\" },\n      { x: 3, y: -2, l: \"bird\" },\n    ]}\n    style={{\n      data: {\n        stroke: \"black\",\n        strokeWidth: ({ active }) =>\n          active ? 4 : 2,\n      },\n      labels: { fill: \"black\" },\n    }}\n  />\n</VictoryChart>\n```\n\n---\n\n## Cursor\n\nUse `VictoryCursorContainer` to add a cursor to a chart to inspect coordinates.\nThe cursor can either be a 2-dimensional crosshair, or a 1-dimensional line.\nThe cursor moves with the mouse (or on touch on mobile devices) along the visible domain of the chart.\nThe cursor can also display a label for the active coordinates using the `cursorLabel` prop.\n\nSee the [full API here](/docs/api/victory-cursor-container).\n\n### Line Charts\n\nUsing the `VictoryCursorContainer` component, you can add a 2D cursor to a line chart.\n\n```jsx live\n<VictoryChart\n  containerComponent={\n    <VictoryCursorContainer\n      cursorLabel={({ datum }) =>\n        `${_.round(datum.x, 2)}, ${_.round(\n          datum.y,\n          2,\n        )}`\n      }\n    />\n  }\n  theme={VictoryTheme.clean}\n>\n  <VictoryScatter\n    y={(d) => d.x * d.x}\n  />\n</VictoryChart>\n```\n\n### Dimension Limits\n\nYou can also use the `cursorDimension` prop to create a 1D cursor. This is useful for line charts where you only want to inspect one dimension. Note you can also set a `defaultCursorValue` to set the initial position of the cursor.\n\n```jsx live\n<VictoryChart\n  containerComponent={\n    <VictoryCursorContainer\n      cursorLabel={({ datum }) =>\n        `${_.round(datum.x, 2)}, ${_.round(\n          datum.y,\n          2,\n        )}`\n      }\n      cursorDimension=\"x\"\n      defaultCursorValue={0.3}\n    />\n  }\n  theme={VictoryTheme.clean}\n>\n  <VictoryScatter\n    y={(d) => d.x * d.x}\n  />\n</VictoryChart>\n```\n\n### Bar Charts\n\nYou can also use the `VictoryCursorContainer` component with bar charts.\n\n```jsx live\n<VictoryChart\n  horizontal\n  theme={VictoryTheme.clean}\n  domainPadding={{ x: 15 }}\n  containerComponent={\n    <VictoryCursorContainer\n      cursorLabel={({ datum }) =>\n        _.round(datum.x, 2)\n      }\n      cursorDimension=\"y\"\n      defaultCursorValue={3}\n    />\n  }\n>\n  <VictoryGroup offset={10}>\n    <VictoryBar\n      data={[\n        { x: 1, y: 5, l: \"one\" },\n        { x: 2, y: 4, l: \"two\" },\n        { x: 3, y: -2, l: \"three\" },\n      ]}\n    />\n\n    <VictoryBar\n      data={[\n        { x: 1, y: -3, l: \"red\" },\n        { x: 2, y: 5, l: \"green\" },\n        { x: 3, y: 3, l: \"blue\" },\n      ]}\n    />\n\n    <VictoryBar\n      data={[\n        { x: 1, y: 5, l: \"cat\" },\n        { x: 2, y: -4, l: \"dog\" },\n        { x: 3, y: -2, l: \"bird\" },\n      ]}\n    />\n  </VictoryGroup>\n</VictoryChart>\n```\n\n### Scatter Charts\n\nYou can also use the `VictoryCursorContainer` component with scatter charts. Note how we can apply the container directly to the `VictoryScatter` component.\n\n```jsx live\n<VictoryScatter\n  theme={VictoryTheme.clean}\n  style={{\n    data: {\n      fill: ({ active }) =>\n        active\n          ? VictoryTheme.clean.palette\n              ?.colors.teal || \"teal\"\n          : VictoryTheme.clean.palette\n              ?.colors.purple ||\n            \"purple\",\n    },\n  }}\n  containerComponent={\n    <VictoryCursorContainer\n      theme={VictoryTheme.clean}\n      cursorLabel={({ datum }) =>\n        _.round(datum.x, 2)\n      }\n      defaultCursorValue={1}\n    />\n  }\n  data={[\n    { x: -3, y: 2 },\n    { x: 0, y: -2 },\n    { x: -8, y: 1 },\n    { x: -2, y: -3 },\n    { x: 7, y: 5 },\n    { x: -8, y: 6 },\n    { x: -1, y: 3 },\n    { x: -4, y: -5 },\n    { x: -6, y: -5 },\n  ]}\n/>\n```\n\n### Events\n\nYou can also use the `onCursorChange` prop to listen to cursor changes and inspect the values.\n\n```jsx live noInline\nfunction App() {\n  const [cursorValue, setCursorValue] =\n    React.useState(null);\n\n  function onCursorChange(value) {\n    setCursorValue(value);\n  }\n\n  return (\n    <VictoryChart\n      theme={VictoryTheme.clean}\n      containerComponent={\n        <VictoryCursorContainer\n          cursorLabel={({ datum }) =>\n            _.round(datum.x, 2)\n          }\n          cursorLabelOffset={15}\n          onCursorChange={\n            onCursorChange\n          }\n        />\n      }\n    >\n      <VictoryGroup>\n        <VictoryScatter\n          style={{\n            data: {\n              fill: VictoryTheme.clean\n                .palette?.colors.red,\n            },\n          }}\n          data={[\n            { x: 1, y: -5 },\n            { x: 2, y: 4 },\n            { x: 3, y: 2 },\n            { x: 4, y: 0 },\n            { x: 5, y: 1 },\n            { x: 6, y: -3 },\n            { x: 7, y: 3 },\n          ]}\n        />\n        <VictoryScatter\n          style={{\n            data: {\n              fill: VictoryTheme.clean\n                .palette?.colors.yellow,\n            },\n          }}\n          data={[\n            { x: 1, y: -3 },\n            { x: 2, y: 5 },\n            { x: 3, y: 3 },\n            { x: 4, y: 0 },\n            { x: 5, y: -2 },\n            { x: 6, y: -2 },\n            { x: 7, y: 5 },\n          ]}\n        />\n        <VictoryScatter\n          data={[\n            { x: 1, y: 5 },\n            { x: 2, y: -4 },\n            { x: 3, y: -2 },\n            { x: 4, y: -3 },\n            { x: 5, y: -1 },\n            { x: 6, y: 3 },\n            { x: 7, y: -3 },\n          ]}\n        />\n      </VictoryGroup>\n      {cursorValue && (\n        <VictoryLabel\n          x={20}\n          y={20}\n          text={JSON.stringify(\n            cursorValue,\n          )}\n        />\n      )}\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n\n---\n\n## Custom Components\n\n`VictoryTooltip` is composed of [`VictoryLabel`](/docs/api/victory-label) and the primitive [`Flyout`](/docs/api/victory-primitives#flyout) component. Both of these components are highly configurable, but may also be replaced if necessary.\n\n### Custom Flyout\n\nAn example of replacing the default `Flyout` component with a custom component.\n\n```jsx live noInline\nconst colors =\n  VictoryTheme.clean.palette.cool;\n\nfunction CustomFlyout(props) {\n  const { x, y, orientation } = props;\n  const newY =\n    orientation === \"bottom\"\n      ? y - 35\n      : y + 35;\n  return (\n    <g>\n      <circle\n        cx={x}\n        cy={newY}\n        r=\"20\"\n        stroke={colors[0]}\n        fill=\"none\"\n      />\n      <circle\n        cx={x}\n        cy={newY}\n        r=\"25\"\n        stroke={colors[1]}\n        fill=\"none\"\n      />\n      <circle\n        cx={x}\n        cy={newY}\n        r=\"30\"\n        stroke={colors[2]}\n        fill=\"none\"\n      />\n    </g>\n  );\n}\n\nfunction App() {\n  return (\n    <VictoryChart\n      domain={{\n        x: [0, 11],\n        y: [-10, 10],\n      }}\n      theme={VictoryTheme.clean}\n    >\n      <VictoryBar\n        labelComponent={\n          <VictoryTooltip\n            flyoutComponent={\n              <CustomFlyout />\n            }\n          />\n        }\n        data={[\n          { x: 2, y: 5, label: \"A\" },\n          { x: 4, y: -6, label: \"B\" },\n          { x: 6, y: 4, label: \"C\" },\n          { x: 8, y: -5, label: \"D\" },\n          { x: 10, y: 7, label: \"E\" },\n        ]}\n        style={{\n          data: { width: 20 },\n        }}\n      />\n    </VictoryChart>\n  );\n}\nrender(<App />);\n```\n\n### Custom Label\n\nAn example of using custom labels with a donut chart.\n\n```jsx live noInline\nfunction CustomLabel(props) {\n  return (\n    <g>\n      <VictoryLabel {...props} />\n      <VictoryTooltip\n        {...props}\n        x={226}\n        y={197}\n        orientation=\"top\"\n        pointerLength={0}\n        cornerRadius={50}\n        flyoutWidth={100}\n        flyoutHeight={100}\n        flyoutStyle={{\n          fill: \"#bdbdbd\",\n        }}\n      />\n    </g>\n  );\n}\n\nCustomLabel.defaultEvents =\n  VictoryTooltip.defaultEvents;\n\nfunction App() {\n  return (\n    <VictoryPie\n      theme={VictoryTheme.clean}\n      style={{\n        labels: { fill: \"white\" },\n      }}\n      innerRadius={80}\n      labelRadius={100}\n      radius={140}\n      labelComponent={<CustomLabel />}\n      data={[\n        { x: 1, y: 5, label: \"Dogs\" },\n        { x: 2, y: 4, label: \"Cats\" },\n        {\n          x: 3,\n          y: 2,\n          label: \"Rabbits\",\n        },\n        { x: 4, y: 3, label: \"Birds\" },\n        { x: 5, y: 1, label: \"Snakes\" },\n      ]}\n    />\n  );\n}\n\nrender(<App />);\n```\n\n### Custom Wrapping\n\nThe events that control `VictoryTooltip` are stored on the static `defaultEvents` property. Wrapped instances of `VictoryTooltip` will need to replicate or hoist this property in order to add automatic events to the components that use them.\n\n```jsx live noInline\nfunction CustomTooltip(props) {\n  const { x, y } = props;\n  const rotation = `rotate(45 ${x} ${y})`;\n  return (\n    <g transform={rotation}>\n      <VictoryTooltip\n        {...props}\n        renderInPortal={false}\n      />\n    </g>\n  );\n}\nCustomTooltip.defaultEvents =\n  VictoryTooltip.defaultEvents;\n\nfunction App() {\n  return (\n    <VictoryChart\n      domain={{\n        x: [0, 11],\n        y: [-10, 10],\n      }}\n      theme={VictoryTheme.clean}\n    >\n      <VictoryBar\n        labelComponent={\n          <CustomTooltip />\n        }\n        data={[\n          { x: 2, y: 5, label: \"A\" },\n          { x: 4, y: -6, label: \"B\" },\n          { x: 6, y: 4, label: \"C\" },\n          { x: 8, y: -5, label: \"D\" },\n          { x: 10, y: 7, label: \"E\" },\n        ]}\n      />\n    </VictoryChart>\n  );\n}\nrender(<App />);\n```\n\n## Victory Native\n\nIn Victory Native tooltips are much more reliable when using `VictoryVoronoiContainer`. Using `VictoryVoronoiContainer` registers all touch events on the container itself, which mitigates interference with other chart elements, which can be a problem on some platforms. Showing the closest data point with `VictoryVoronoiContainer` also increases the tap targets for the tooltip, which can otherwise be quite small. Set `VictoryVoronoiContainer` as the `containerComponent` prop on the outermost Victory component.\n\n```jsx\n<VictoryChart\n  containerComponent={\n    <VictoryVoronoiContainer />\n  }\n>\n  <VictoryScatter\n    labelComponent={<VictoryTooltip />}\n    labels={({ datum }) => datum.y}\n    style={{\n      data: {\n        fill: ({ datum }) => datum.fill,\n      },\n    }}\n    data={[\n      { x: 1, y: 3 },\n      { x: 3, y: 5 },\n    ]}\n  />\n</VictoryChart>\n```\n"
  },
  {
    "path": "website/docs/guides/zoom-large-data.mdx",
    "content": "---\ntitle: Zoom on Large Datasets\n---\n\nVictory can handle hundreds of data points, but what if you'd like chart thousands of points?\n[VictoryZoomContainer][] can be useful here, allowing the user to focus on the subset of data they are most interested in.\n\nBy default Victory will render all data points in a dataset.\nFor large datasets this behavior can be overridden, and this guide will show you how.\nIf you haven't used it before, read about the [VictoryZoomContainer][] first, then come back to this guide.\n\nIn a hurry? [Skip to the demo][].\n\n## Basic scenario: time-series data\n\nIn this guide, we'll be working with time-series data. We'll make a few basic assumptions:\n\n1.  zooming will be done only on the x (or time) dimension,\n2.  our data will be ordered by x, from earliest to latest, and\n3.  the dataset is static - no new data will arrive while the user is interacting with the chart.\n\nThese just serve to simplify the example. We'll start with a simple chart:\n\n```jsx\nfunction CustomChart(props) {\n  const [state, setState] = React.useState({});\n\n  return (\n    <VictoryChart containerComponent={<VictoryZoomContainer/>}\n      <VictoryScatter data={props.data} />\n    </VictoryChart>\n  );\n}\n```\n\n## Render only visible points\n\nRather than passing all our data to the `data` prop, we'll first remove any data that isn't currently visible.\nTo do this, we must keep track of the chart's visible domain;\n[VictoryZoomContainer][] has an `onZoomDomainChange` prop that will allow us to do exactly that:\n\n```jsx\n<VictoryChart\n  containerComponent={<VictoryZoomContainer\n    onZoomDomainChange={onDomainChange}\n  />}\n>\n  <VictoryScatter data={getData()} />\n</VictoryChart>\n```\n\nUpdate the state every time the domain changes (note that we are only keeping track of the `x` dimension):\n\n```js\nonDomainChange(domain) {\n  setState({\n    zoomedXDomain: domain.x,\n  });\n}\n```\n\nUse this `zoomedXDomain` state to filter out all data that isn't currently visible.\nHere we're making a simple `getData` method; note the data array's `filter` function:\n\n```js\nfunction getData() {\n  const { zoomedXDomain } = state;\n  const { data } = props;\n  return data.filter(\n    // is d \"between\" the ends of the visible x-domain?\n    (d) => (d.x >= zoomedXDomain[0] && d.x <= zoomedXDomain[1]));\n}\n```\n\nBecause we are dynamically changing the `data` prop on [VictoryChart][],\nwe must also explicitly set its `domain`.\nBy default `VictoryChart` will calculate a domain from `data`;\nin this case that would mean that the chart would \"forget\" about the rest of the data as the user zoomed in.\nIn fact, there would be no way to zoom back out!\n\nTo remedy this, we must calculate the domain of the entire dataset:\n\n```js\nfunction getEntireDomain(props) {\n  const { data } = props;\n  return {\n    y: [_.minBy(data, d => d.y).y, _.maxBy(data, d => d.y).y],\n    x: [ data[0].x, _.last(data).x ]\n  };\n}\n```\n\nWe use [Lodash][]'s `minBy` and `maxBy` functions to find the domain of `y`.\nBecause we assume that the data is ordered by `x`, we can use the first and last points for the `x` domain.\n\nBecause we are assuming the data is static we just need to call this function once, in the constructor of `CustomChart`.\nThe calculated `x` domain will also be used as the initial value for `state.zoomedXDomain`:\n\n```js\nconst entireDomain = getEntireDomain(props);\nconst [state, setState] = React.useState({\n  zoomedXDomain: entireDomain.x,\n});\n```\n\nThe static value `entireDomain` can then be used by `VictoryChart`:\n\n```jsx\n<VictoryChart\n  domain={entireDomain}\n  containerComponent={<VictoryZoomContainer\n    zoomDimension=\"x\"\n    onZoomDomainChange={onDomainChange}\n  />}\n>\n  <VictoryScatter data={getData()} />\n</VictoryChart>\n```\n\nNow we are only rendering the visible points, but this step isn't nearly enough:\nwhen the chart is zoomed out we still render all of the data points!\n\n## Render a small sample of points\n\nThere are a number of possible methods to reduce the number of visible data points rendered.\nWe'll use the simplest method: selecting only every `k`th point, and discarding all others.\n`k` is determined simply:\nif there are 5,000 points and we only want to show 100, then `k` is 50.\n\nWe'll add a `maxPoints` prop to `CustomChart`\nwhich will determine the maximum number of points returned by `getData`.\nAll of the existing logic in `getData` will stay\nand another `filter` will be added afterwards:\n\n```js\nfunction getData() {\n  const { zoomedXDomain } = state;\n  const { data, maxPoints } = props;\n  const filtered = data.filter(\n    (d) => (d.x >= zoomedXDomain[0] && d.x <= zoomedXDomain[1]));\n\n  // new code here...\n  if (filtered.length > maxPoints ) {\n    const k = Math.ceil(filtered.length / maxPoints);\n    return filtered.filter(\n      (d, i) => ((i % k) === 0)\n    );\n  }\n  return filtered;\n}\n```\n\nNow the chart will always render at most `maxPoints`,\nno matter the zoom level.\n\n## Demo\n\n```jsx live noInline\n// 10000 points (10 / 0.001 = 10000)\n// see what happens when you render 50k or 100k\nconst allData = _.range(0, 10, 0.001).map(x => ({\n\tx: x,\n  y: Math.sin(Math.PI*x/2) * x / 10\n}));\n\nfunction getEntireDomain(props) {\n  const { data } = props;\n  return {\n    y: [_.minBy(data, d => d.y).y, _.maxBy(data, d => d.y).y],\n    x: [ data[0].x, _.last(data).x ]\n  };\n}\n\nfunction CustomChart(props) {\n  const entireDomain = getEntireDomain(props);\n  const [state, setState] = React.useState({\n    zoomedXDomain: entireDomain.x,\n  });\n\n\tfunction onDomainChange(domain) {\n  \tsetState({\n    \tzoomedXDomain: domain.x,\n    });\n  }\n  \n  function getData() {\n  \tconst { zoomedXDomain } = state;\n    const { data, maxPoints } = props;\n  \tconst filtered = data.filter(\n    \t(d) => (d.x >= zoomedXDomain[0] && d.x <= zoomedXDomain[1]));\n\n    if (filtered.length > maxPoints ) {\n      const k = Math.ceil(filtered.length / maxPoints);\n    \treturn filtered.filter(\n      \t(d, i) => ((i % k) === 0)\n      );\n    }\n    return filtered;\n  }\n\n  function getZoomFactor() {\n    const { zoomedXDomain } = state;\n    const factor = 10 / (zoomedXDomain[1] - zoomedXDomain[0]);\n    return _.round(factor, factor < 3 ? 1 : 0);\n  }\n\t\n  const renderedData = getData();\n  return (\n    <div>\n      <VictoryChart\n        domain={entireDomain}\n        containerComponent={<VictoryZoomContainer\n          zoomDimension=\"x\"\n          onZoomDomainChange={onDomainChange}\n          minimumZoom={{x: 1/10000}}\n        />}\n        theme={VictoryTheme.clean}\n      >\n        <VictoryScatter data={renderedData} />\n      </VictoryChart>\n      <div>\n        {getZoomFactor()}x zoom;\n        rendering {renderedData.length} of {props.data.length}\n      </div>\n    </div>\n  );\n}\n\nrender(<CustomChart data={allData} maxPoints={120} />);\n```\n\n## Extending this Demo\n\nThis guide serves as a start, but you might have some questions:\n\n* _How big should `maxPoints` be?_ For most situations between 50 and 150 is ideal.\n* _What if I want to render millions of data points?_ This concept can be extended to millions of points, but you'll need the help of a library to handle the sampling. Try [Crossfilter][].\n* _Can I remove the \"flicker\" of points as I zoom in?_ Yes, but `getData()` will have to be a little more complex.\nThis apparent movement of the points while zooming happens because different points are chosen to be displayed.\nHere is an example that reduces flicker by reliably choosing the same data points to display:\n\n```js\nfunction getData() {\n  const { zoomedXDomain } = state;\n  const { data, maxPoints } = props;\n\n  const startIndex = data.findIndex((d) => d.x >= zoomedXDomain[0]);\n  const endIndex = data.findIndex((d) => d.x > zoomedXDomain[1]);\n  const filtered = data.slice(startIndex, endIndex);\n\n  if (filtered.length > maxPoints ) {\n    // limit k to powers of 2, e.g. 64, 128, 256\n    // so that the same points will be chosen reliably, reducing flicker\n    const k = Math.pow(2, Math.ceil(Math.log2(filtered.length / maxPoints)));\n    return filtered.filter(\n      // ensure modulo is always calculated from same reference: i + startIndex\n      (d, i) => (((i + startIndex) % k) === 0)\n    );\n  }\n  return filtered;\n}\n```\n\n[VictoryZoomContainer]: /docs/api/victory-zoom-container\n[VictoryChart]: /docs/api/victory-chart\n[Skip to the demo]: /docs/guides/zoom-large-data\n[Lodash]: https://lodash.com/\n[Crossfilter]: http://square.github.io/crossfilter/\n"
  },
  {
    "path": "website/docs/introduction/_category_.json",
    "content": "{\n  \"label\": \"Introduction\",\n  \"position\": 0,\n  \"link\": null\n}\n"
  },
  {
    "path": "website/docs/introduction/index.mdx",
    "content": "---\ntitle: Getting Started\nsidebar_position: 1\nhide_table_of_contents: true\n---\n\n# Getting Started with Victory\n\nVictory is an opinionated, but fully overridable, ecosystem of composable React components for building interactive data visualizations. The following tutorial explains how to set up a basic chart.\n\n```jsx live noInline\nconst series = [\n  {\n    name: \"Canada\",\n    data: [\n      3.9670002, 5.2650003, 6.201,\n      7.8010006, 9.694, 11.214001,\n      11.973001, 12.250001, 12.816001,\n      13.413001, 13.626961, 14.30356,\n      15.295461,\n    ],\n  },\n  {\n    name: \"Germany\",\n    data: [\n      26.903002, 28.712002, 30.979002,\n      33.477, 38.614002, 44.58, 49.435,\n      55.58, 58.721004, 60.742004,\n      62.201004, 63.833004, 66.315,\n    ],\n  },\n  {\n    name: \"India\",\n    data: [\n      13.184001, 16.179, 17.2997,\n      18.4204, 22.465302, 25.08819,\n      28.700441, 32.84846, 35.288105,\n      37.50518, 38.558605, 40.06727,\n      41.929783,\n    ],\n  },\n  {\n    name: \"United States\",\n    data: [\n      39.349697, 45.79497, 59.453304,\n      60.198166, 64.43019, 72.767235,\n      81.502365, 87.83079, 94.66619,\n      103.835556, 118.66354, 133.01929,\n      140.86162,\n    ],\n  },\n  {\n    name: \"Italy\",\n    data: [\n      5.794, 6.918, 8.102, 8.542001,\n      8.683001, 9.137, 9.384001,\n      9.736579, 10.230247, 10.679461,\n      10.870623, 11.253734, 11.779734,\n    ],\n  },\n  {\n    name: \"Japan\",\n    data: [\n      2.2940001, 2.4190001, 2.562,\n      2.6460001, 2.753, 2.808,\n      3.2470002, 3.4830003, 3.4980001,\n      3.9540002, 4.367, 4.467, 4.577,\n    ],\n  },\n  {\n    name: \"Spain\",\n    data: [\n      20.693, 21.529001, 22.789001,\n      22.958, 22.925001, 22.943,\n      22.990002, 23.12448, 23.405056,\n      25.590076, 26.819191, 27.907652,\n      29.307837,\n    ],\n  },\n];\n\nconst symbols = [\n  \"circle\",\n  \"diamond\",\n  \"plus\",\n  \"square\",\n  \"triangleUp\",\n];\n\nfunction App() {\n  return (\n    <VictoryChart\n      padding={{\n        top: 50,\n        left: 70,\n        right: 50,\n        bottom: 100,\n      }}\n      theme={VictoryTheme.clean}\n    >\n      <VictoryLabel\n        text=\"Installed Wind Capacity (GW)\"\n        style={{\n          ...VictoryTheme.clean.label,\n          fontSize: 10,\n        }}\n        dx={28}\n        dy={18}\n      />\n      <VictoryLabel\n        text=\"International Renewable Energy Agency (2023)\"\n        style={{\n          ...VictoryTheme.clean.label,\n          fontSize: 8,\n        }}\n        dx={28}\n        dy={30}\n      />\n      <VictoryAxis\n        tickValues={_.range(\n          2010,\n          2024,\n          2,\n        )}\n        style={{\n          tickLabels: {\n            fontSize: 8,\n          },\n          ticks: {\n            stroke: \"#757575\",\n            size: 5,\n          },\n        }}\n      />\n      <VictoryAxis\n        dependentAxis\n        label=\"Total Capacity\"\n        tickValues={_.range(0, 200, 40)}\n        tickFormat={(value) =>\n          `${value} GW`\n        }\n        style={{\n          axis: {\n            stroke: \"transparent\",\n          },\n          axisLabel: {\n            fontSize: 8,\n            padding: 50,\n          },\n          tickLabels: {\n            fontSize: 8,\n          },\n          grid: {\n            stroke: \"#d9d9d9\",\n            size: 5,\n          },\n        }}\n      />\n      {series.map((s, i) => (\n        <VictoryGroup\n          data={s.data.map((d, i) => ({\n            x: i + 2010,\n            y: d,\n          }))}\n          key={s.name}\n        >\n          <VictoryLine\n            style={{\n              data: {\n                stroke:\n                  VictoryTheme.clean\n                    .palette\n                    .qualitative[i],\n                strokeWidth: 1,\n              },\n            }}\n          />\n          <VictoryScatter\n            size={2}\n            symbol={symbols[i]}\n            style={{\n              data: {\n                fill: VictoryTheme.clean\n                  .palette.qualitative[\n                  i\n                ],\n              },\n            }}\n          />\n        </VictoryGroup>\n      ))}\n      <VictoryLegend\n        itemsPerRow={4}\n        x={50}\n        y={220}\n        data={series.map((s) => ({\n          name: s.name,\n          symbol: {\n            fill: VictoryTheme.clean\n              .palette.qualitative[\n              series.indexOf(s)\n            ],\n            type: symbols[\n              series.indexOf(s)\n            ],\n          },\n        }))}\n        style={{\n          data: {\n            fill: ({ datum }) =>\n              datum.symbol.fill,\n          },\n          labels: {\n            fontSize: 8,\n          },\n          border: {\n            stroke: \"transparent\",\n          },\n        }}\n      />\n      <Line\n        x1={25}\n        x2={425}\n        y1={270}\n        y2={270}\n        style={{\n          stroke: \"#d9d9d9\",\n        }}\n      />\n      <VictoryLabel\n        text={[\n          \"Hannah Ritchie, Max Roser and Pablo Rosado (2020) - “Renewable Energy”\",\n          \"https://ourworldindata.org/renewable-energy\",\n        ]}\n        style={{\n          fontSize: 8,\n          fontWeight: 300,\n          fontFamily: \"Inter\",\n        }}\n        dx={30}\n        dy={285}\n        theme={VictoryTheme.clean}\n      />\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n\n## Tutorial\n\nIn this guide, we’ll show you how to get started with Victory and walk you through the creation and customization of a composed chart.\n\n### 1. Import Victory\n\nAdd Victory to your project with the command `npm install victory`, then import it into your component. For now, let's start with a simple Line Chart.\n\n```jsx\nimport React from \"react\";\nimport {\n  VictoryChart,\n  VictoryLine,\n} from \"victory\";\n```\n\n### 2. Start with a basic chart\n\nComponents include sensible defaults, so even without data the chart will render with samples. To add some basic styling, we will use our built in `clean` theme. When a theme is applied to [`VictoryChart`](/docs/api/victory-chart), it will be inherited by all child components.\n\n```jsx live noInline\nfunction App() {\n  return (\n    <VictoryChart\n      theme={VictoryTheme.clean}\n    >\n      <VictoryLine />\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n\n### 3. Add your data\n\nLet's add some data. Victory cartesian charts look for `x` and `y` values in data points, which our data doesn't have. We can work around this by adding accessor props to our [`VictoryLine`](/docs/api/victory-line) component. Our data contains the country name, and an array of values from 2010 to 2022.\n\n```ts\ntype Data = {\n  name: string;\n  data: number[];\n};\n```\n\n```jsx live noInline\nconst series = [\n  {\n    name: \"Canada\",\n    data: [\n      3.9670002, 5.2650003, 6.201,\n      7.8010006, 9.694, 11.214001,\n      11.973001, 12.250001, 12.816001,\n      13.413001, 13.626961, 14.30356,\n      15.295461,\n    ],\n  },\n];\n\nfunction App() {\n  return (\n    <VictoryChart\n      theme={VictoryTheme.clean}\n    >\n      <VictoryLine\n        data={series[0].data.map(\n          (d, i) => ({\n            x: i + 2010,\n            y: d,\n          }),\n        )}\n      />\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n\n### 4. Customize the X axis\n\n[`VictoryChart`](/docs/api/victory-chart) is a wrapper component that plots all of its children on the same scale. The default axes may not always be what you need, but they can be customized with [`VictoryAxis`](/docs/api/victory-axis) components.\n\nWe will start by adding a dependent axis to our chart. This axis will be the vertical axis, and we will customize it with a label and tick values.\n\n```jsx\n<VictoryAxis\n  dependentAxis\n  tickValues={_.range(0, 200, 40)}\n  tickFormat={(value) => `${value} GW`}\n/>\n```\n\nOur data is an array of values from the year 2010 to 2022, so we will also add a horizontal axis with tick values.\n\n```tsx\n<VictoryAxis\n  tickValues={_.range(2010, 2024, 2)}\n/>\n```\n\nFinally, we will customize the axis styles to make it more readable. We will adjust the font size of the tick labels and the axis ticks, and add grid lines to the dependent axis.\n\n```jsx live noInline\nconst series = [\n  {\n    name: \"Canada\",\n    data: [\n      3.9670002, 5.2650003, 6.201,\n      7.8010006, 9.694, 11.214001,\n      11.973001, 12.250001, 12.816001,\n      13.413001, 13.626961, 14.30356,\n      15.295461,\n    ],\n  },\n];\n\nfunction App() {\n  return (\n    <VictoryChart\n      theme={VictoryTheme.clean}\n    >\n      <VictoryAxis\n        tickValues={_.range(\n          2010,\n          2024,\n          2,\n        )}\n        style={{\n          tickLabels: {\n            fontSize: 8,\n          },\n          ticks: {\n            stroke: \"#757575\",\n            size: 5,\n          },\n        }}\n      />\n      <VictoryAxis\n        dependentAxis\n        tickValues={_.range(0, 200, 40)}\n        tickFormat={(value) =>\n          `${value} GW`\n        }\n        style={{\n          axis: {\n            stroke: \"transparent\",\n          },\n          axisLabel: {\n            fontSize: 8,\n            padding: 50,\n          },\n          tickLabels: {\n            fontSize: 8,\n          },\n          grid: {\n            stroke: \"#d9d9d9\",\n            size: 5,\n          },\n        }}\n      />\n      <VictoryLine\n        data={series[0].data.map(\n          (d, i) => ({\n            x: i + 2010,\n            y: d,\n          }),\n        )}\n      />\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n\n### 5. Multiple Series\n\nLets expand our data to include multiple countries by iterating over the `series` array and adding a [`VictoryLine`](/docs/api/victory-line) component for each country. Since we need to identify the unique trend lines, we will also adjust the stroke color of each line.\n\n```jsx\n{\n  series.map((s, i) => (\n    <VictoryLine\n      key={s.name}\n      data={s.data.map((d, i) => ({\n        x: i + 2010,\n        y: d,\n      }))}\n      style={{\n        data: {\n          stroke:\n            VictoryTheme.clean.palette\n              .qualitative[i],\n          strokeWidth: 1,\n        },\n      }}\n    />\n  ));\n}\n```\n\n```jsx live noInline\nconst series = [\n  {\n    name: \"Canada\",\n    data: [\n      3.9670002, 5.2650003, 6.201,\n      7.8010006, 9.694, 11.214001,\n      11.973001, 12.250001, 12.816001,\n      13.413001, 13.626961, 14.30356,\n      15.295461,\n    ],\n  },\n  {\n    name: \"Germany\",\n    data: [\n      26.903002, 28.712002, 30.979002,\n      33.477, 38.614002, 44.58, 49.435,\n      55.58, 58.721004, 60.742004,\n      62.201004, 63.833004, 66.315,\n    ],\n  },\n  {\n    name: \"India\",\n    data: [\n      13.184001, 16.179, 17.2997,\n      18.4204, 22.465302, 25.08819,\n      28.700441, 32.84846, 35.288105,\n      37.50518, 38.558605, 40.06727,\n      41.929783,\n    ],\n  },\n  {\n    name: \"United States\",\n    data: [\n      39.349697, 45.79497, 59.453304,\n      60.198166, 64.43019, 72.767235,\n      81.502365, 87.83079, 94.66619,\n      103.835556, 118.66354, 133.01929,\n      140.86162,\n    ],\n  },\n  {\n    name: \"Italy\",\n    data: [\n      5.794, 6.918, 8.102, 8.542001,\n      8.683001, 9.137, 9.384001,\n      9.736579, 10.230247, 10.679461,\n      10.870623, 11.253734, 11.779734,\n    ],\n  },\n  {\n    name: \"Japan\",\n    data: [\n      2.2940001, 2.4190001, 2.562,\n      2.6460001, 2.753, 2.808,\n      3.2470002, 3.4830003, 3.4980001,\n      3.9540002, 4.367, 4.467, 4.577,\n    ],\n  },\n  {\n    name: \"Spain\",\n    data: [\n      20.693, 21.529001, 22.789001,\n      22.958, 22.925001, 22.943,\n      22.990002, 23.12448, 23.405056,\n      25.590076, 26.819191, 27.907652,\n      29.307837,\n    ],\n  },\n];\n\nfunction App() {\n  return (\n    <VictoryChart\n      theme={VictoryTheme.clean}\n    >\n      <VictoryAxis\n        tickValues={_.range(\n          2010,\n          2024,\n          2,\n        )}\n        style={{\n          tickLabels: {\n            fontSize: 8,\n          },\n          ticks: {\n            stroke: \"#757575\",\n            size: 5,\n          },\n        }}\n      />\n      <VictoryAxis\n        dependentAxis\n        tickValues={_.range(0, 200, 40)}\n        tickFormat={(value) =>\n          `${value} GW`\n        }\n        style={{\n          axis: {\n            stroke: \"transparent\",\n          },\n          axisLabel: {\n            fontSize: 8,\n            padding: 50,\n          },\n          tickLabels: {\n            fontSize: 8,\n          },\n          grid: {\n            stroke: \"#d9d9d9\",\n            size: 5,\n          },\n        }}\n      />\n      {series.map((s, i) => (\n        <VictoryLine\n          style={{\n            data: {\n              stroke:\n                VictoryTheme.clean\n                  .palette.qualitative[\n                  i\n                ],\n              strokeWidth: 1,\n            },\n          }}\n          data={s.data.map((d, i) => ({\n            x: i + 2010,\n            y: d,\n          }))}\n          key={s.name}\n        />\n      ))}\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n\n### 6. Combining Chart Types\n\nTo make each data point stand out more, we can combine our [`VictoryLine`](/docs/api/victory-line) chart with a [`VictoryScatter`](/docs/api/victory-scatter) chart. Victory provides a specialized wrapper component [`VictoryGroup`](/docs/api/victory-group) that helps us apply properties to multiple components at once.\n\n```jsx\n{\n  series.map((s, i) => (\n    <VictoryGroup\n      data={s.data.map((d, i) => ({\n        x: i + 2010,\n        y: d,\n      }))}\n      key={s.name}\n    >\n      <VictoryLine\n        style={{\n          data: {\n            stroke:\n              VictoryTheme.clean.palette\n                .qualitative[i],\n            strokeWidth: 1,\n          },\n        }}\n      />\n      <VictoryScatter\n        size={2}\n        symbol={symbols[i]}\n        style={{\n          data: {\n            fill: VictoryTheme.clean\n              .palette.qualitative[i],\n          },\n        }}\n      />\n    </VictoryGroup>\n  ));\n}\n```\n\n```jsx live noInline\nconst series = [\n  {\n    name: \"Canada\",\n    data: [\n      3.9670002, 5.2650003, 6.201,\n      7.8010006, 9.694, 11.214001,\n      11.973001, 12.250001, 12.816001,\n      13.413001, 13.626961, 14.30356,\n      15.295461,\n    ],\n  },\n  {\n    name: \"Germany\",\n    data: [\n      26.903002, 28.712002, 30.979002,\n      33.477, 38.614002, 44.58, 49.435,\n      55.58, 58.721004, 60.742004,\n      62.201004, 63.833004, 66.315,\n    ],\n  },\n  {\n    name: \"India\",\n    data: [\n      13.184001, 16.179, 17.2997,\n      18.4204, 22.465302, 25.08819,\n      28.700441, 32.84846, 35.288105,\n      37.50518, 38.558605, 40.06727,\n      41.929783,\n    ],\n  },\n  {\n    name: \"United States\",\n    data: [\n      39.349697, 45.79497, 59.453304,\n      60.198166, 64.43019, 72.767235,\n      81.502365, 87.83079, 94.66619,\n      103.835556, 118.66354, 133.01929,\n      140.86162,\n    ],\n  },\n  {\n    name: \"Italy\",\n    data: [\n      5.794, 6.918, 8.102, 8.542001,\n      8.683001, 9.137, 9.384001,\n      9.736579, 10.230247, 10.679461,\n      10.870623, 11.253734, 11.779734,\n    ],\n  },\n  {\n    name: \"Japan\",\n    data: [\n      2.2940001, 2.4190001, 2.562,\n      2.6460001, 2.753, 2.808,\n      3.2470002, 3.4830003, 3.4980001,\n      3.9540002, 4.367, 4.467, 4.577,\n    ],\n  },\n  {\n    name: \"Spain\",\n    data: [\n      20.693, 21.529001, 22.789001,\n      22.958, 22.925001, 22.943,\n      22.990002, 23.12448, 23.405056,\n      25.590076, 26.819191, 27.907652,\n      29.307837,\n    ],\n  },\n];\n\nconst symbols = [\n  \"circle\",\n  \"diamond\",\n  \"plus\",\n  \"square\",\n  \"triangleUp\",\n];\n\nfunction App() {\n  return (\n    <VictoryChart\n      theme={VictoryTheme.clean}\n    >\n      <VictoryAxis\n        tickValues={_.range(\n          2010,\n          2024,\n          2,\n        )}\n        style={{\n          tickLabels: {\n            fontSize: 8,\n          },\n          ticks: {\n            stroke: \"#757575\",\n            size: 5,\n          },\n        }}\n      />\n      <VictoryAxis\n        dependentAxis\n        tickValues={_.range(0, 200, 40)}\n        tickFormat={(value) =>\n          `${value} GW`\n        }\n        style={{\n          axis: {\n            stroke: \"transparent\",\n          },\n          axisLabel: {\n            fontSize: 8,\n            padding: 50,\n          },\n          tickLabels: {\n            fontSize: 8,\n          },\n          grid: {\n            stroke: \"#d9d9d9\",\n            size: 5,\n          },\n        }}\n      />\n      {series.map((s, i) => (\n        <VictoryGroup\n          data={s.data.map((d, i) => ({\n            x: i + 2010,\n            y: d,\n          }))}\n          key={s.name}\n        >\n          <VictoryLine\n            style={{\n              data: {\n                stroke:\n                  VictoryTheme.clean\n                    .palette\n                    .qualitative[i],\n                strokeWidth: 1,\n              },\n            }}\n          />\n          <VictoryScatter\n            size={2}\n            symbol={symbols[i]}\n            style={{\n              data: {\n                fill: VictoryTheme.clean\n                  .palette.qualitative[\n                  i\n                ],\n              },\n            }}\n          />\n        </VictoryGroup>\n      ))}\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n\n### 7. Adding a Legend\n\nTo make it easier to identify each country, we can add a legend to our chart. Victory provides a [`VictoryLegend`](/docs/api/victory-legend) component that can be used to display a legend for the chart.\n\n```jsx\n<VictoryLegend\n  itemsPerRow={4}\n  x={50}\n  y={220}\n  data={series.map((s, i) => ({\n    name: s.name,\n    symbol: {\n      fill: VictoryTheme.clean.palette\n        .qualitative[i],\n      type: symbols[i],\n    },\n  }))}\n/>\n```\n\nSince our Legend is going to take up some space in our chart, we also need to adjust the padding to provide enough space for the legend.\n\n```jsx\n<VictoryChart\n  padding={{\n    top: 50,\n    left: 70,\n    right: 50,\n    bottom: 100,\n  }}\n/>\n```\n\n```jsx live noInline\nconst series = [\n  {\n    name: \"Canada\",\n    data: [\n      3.9670002, 5.2650003, 6.201,\n      7.8010006, 9.694, 11.214001,\n      11.973001, 12.250001, 12.816001,\n      13.413001, 13.626961, 14.30356,\n      15.295461,\n    ],\n  },\n  {\n    name: \"Germany\",\n    data: [\n      26.903002, 28.712002, 30.979002,\n      33.477, 38.614002, 44.58, 49.435,\n      55.58, 58.721004, 60.742004,\n      62.201004, 63.833004, 66.315,\n    ],\n  },\n  {\n    name: \"India\",\n    data: [\n      13.184001, 16.179, 17.2997,\n      18.4204, 22.465302, 25.08819,\n      28.700441, 32.84846, 35.288105,\n      37.50518, 38.558605, 40.06727,\n      41.929783,\n    ],\n  },\n  {\n    name: \"United States\",\n    data: [\n      39.349697, 45.79497, 59.453304,\n      60.198166, 64.43019, 72.767235,\n      81.502365, 87.83079, 94.66619,\n      103.835556, 118.66354, 133.01929,\n      140.86162,\n    ],\n  },\n  {\n    name: \"Italy\",\n    data: [\n      5.794, 6.918, 8.102, 8.542001,\n      8.683001, 9.137, 9.384001,\n      9.736579, 10.230247, 10.679461,\n      10.870623, 11.253734, 11.779734,\n    ],\n  },\n  {\n    name: \"Japan\",\n    data: [\n      2.2940001, 2.4190001, 2.562,\n      2.6460001, 2.753, 2.808,\n      3.2470002, 3.4830003, 3.4980001,\n      3.9540002, 4.367, 4.467, 4.577,\n    ],\n  },\n  {\n    name: \"Spain\",\n    data: [\n      20.693, 21.529001, 22.789001,\n      22.958, 22.925001, 22.943,\n      22.990002, 23.12448, 23.405056,\n      25.590076, 26.819191, 27.907652,\n      29.307837,\n    ],\n  },\n];\n\nconst symbols = [\n  \"circle\",\n  \"diamond\",\n  \"plus\",\n  \"square\",\n  \"triangleUp\",\n];\n\nfunction App() {\n  return (\n    <VictoryChart\n      padding={{\n        top: 50,\n        left: 70,\n        right: 50,\n        bottom: 100,\n      }}\n      theme={VictoryTheme.clean}\n    >\n      <VictoryAxis\n        tickValues={_.range(\n          2010,\n          2024,\n          2,\n        )}\n        style={{\n          tickLabels: {\n            fontSize: 8,\n          },\n          ticks: {\n            stroke: \"#757575\",\n            size: 5,\n          },\n        }}\n      />\n      <VictoryAxis\n        dependentAxis\n        tickValues={_.range(0, 200, 40)}\n        tickFormat={(value) =>\n          `${value} GW`\n        }\n        style={{\n          axis: {\n            stroke: \"transparent\",\n          },\n          axisLabel: {\n            fontSize: 8,\n            padding: 50,\n          },\n          tickLabels: {\n            fontSize: 8,\n          },\n          grid: {\n            stroke: \"#d9d9d9\",\n            size: 5,\n          },\n        }}\n      />\n      {series.map((s, i) => (\n        <VictoryGroup\n          data={s.data.map((d, i) => ({\n            x: i + 2010,\n            y: d,\n          }))}\n          key={s.name}\n        >\n          <VictoryLine\n            style={{\n              data: {\n                stroke:\n                  VictoryTheme.clean\n                    .palette\n                    .qualitative[i],\n                strokeWidth: 1,\n              },\n            }}\n          />\n          <VictoryScatter\n            size={2}\n            symbol={symbols[i]}\n            style={{\n              data: {\n                fill: VictoryTheme.clean\n                  .palette.qualitative[\n                  i\n                ],\n              },\n            }}\n          />\n        </VictoryGroup>\n      ))}\n      <VictoryLegend\n        itemsPerRow={4}\n        x={50}\n        y={220}\n        data={series.map((s) => ({\n          name: s.name,\n          symbol: {\n            fill: VictoryTheme.clean\n              .palette.qualitative[\n              series.indexOf(s)\n            ],\n            type: symbols[\n              series.indexOf(s)\n            ],\n          },\n        }))}\n        style={{\n          data: {\n            fill: ({ datum }) =>\n              datum.symbol.fill,\n          },\n          labels: {\n            fontSize: 8,\n          },\n          border: {\n            stroke: \"transparent\",\n          },\n        }}\n      />\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n\n### 8. Adding Labels\n\nFinally, we can add labels to our chart to provide more context. We will add a title and a source link to our chart as well as axes labels.\n\n```jsx\n<VictoryLabel\n  text=\"Installed Wind Capacity (GW)\"\n  dx={28}\n  dy={18}\n/>\n```\n\n```jsx live noInline\nconst series = [\n  {\n    name: \"Canada\",\n    data: [\n      3.9670002, 5.2650003, 6.201,\n      7.8010006, 9.694, 11.214001,\n      11.973001, 12.250001, 12.816001,\n      13.413001, 13.626961, 14.30356,\n      15.295461,\n    ],\n  },\n  {\n    name: \"Germany\",\n    data: [\n      26.903002, 28.712002, 30.979002,\n      33.477, 38.614002, 44.58, 49.435,\n      55.58, 58.721004, 60.742004,\n      62.201004, 63.833004, 66.315,\n    ],\n  },\n  {\n    name: \"India\",\n    data: [\n      13.184001, 16.179, 17.2997,\n      18.4204, 22.465302, 25.08819,\n      28.700441, 32.84846, 35.288105,\n      37.50518, 38.558605, 40.06727,\n      41.929783,\n    ],\n  },\n  {\n    name: \"United States\",\n    data: [\n      39.349697, 45.79497, 59.453304,\n      60.198166, 64.43019, 72.767235,\n      81.502365, 87.83079, 94.66619,\n      103.835556, 118.66354, 133.01929,\n      140.86162,\n    ],\n  },\n  {\n    name: \"Italy\",\n    data: [\n      5.794, 6.918, 8.102, 8.542001,\n      8.683001, 9.137, 9.384001,\n      9.736579, 10.230247, 10.679461,\n      10.870623, 11.253734, 11.779734,\n    ],\n  },\n  {\n    name: \"Japan\",\n    data: [\n      2.2940001, 2.4190001, 2.562,\n      2.6460001, 2.753, 2.808,\n      3.2470002, 3.4830003, 3.4980001,\n      3.9540002, 4.367, 4.467, 4.577,\n    ],\n  },\n  {\n    name: \"Spain\",\n    data: [\n      20.693, 21.529001, 22.789001,\n      22.958, 22.925001, 22.943,\n      22.990002, 23.12448, 23.405056,\n      25.590076, 26.819191, 27.907652,\n      29.307837,\n    ],\n  },\n];\n\nconst symbols = [\n  \"circle\",\n  \"diamond\",\n  \"plus\",\n  \"square\",\n  \"triangleUp\",\n];\n\nfunction App() {\n  return (\n    <VictoryChart\n      padding={{\n        top: 50,\n        left: 70,\n        right: 50,\n        bottom: 100,\n      }}\n      theme={VictoryTheme.clean}\n    >\n      <VictoryLabel\n        text=\"Installed Wind Capacity (GW)\"\n        style={{\n          ...VictoryTheme.clean.label,\n          fontSize: 10,\n        }}\n        dx={28}\n        dy={18}\n      />\n      <VictoryLabel\n        text=\"International Renewable Energy Agency (2023)\"\n        style={{\n          ...VictoryTheme.clean.label,\n          fontSize: 8,\n        }}\n        dx={28}\n        dy={30}\n      />\n      <VictoryAxis\n        tickValues={_.range(\n          2010,\n          2024,\n          2,\n        )}\n        style={{\n          tickLabels: {\n            fontSize: 8,\n          },\n          ticks: {\n            stroke: \"#757575\",\n            size: 5,\n          },\n        }}\n      />\n      <VictoryAxis\n        dependentAxis\n        label=\"Total Capacity\"\n        tickValues={_.range(0, 200, 40)}\n        tickFormat={(value) =>\n          `${value} GW`\n        }\n        style={{\n          axis: {\n            stroke: \"transparent\",\n          },\n          axisLabel: {\n            fontSize: 8,\n            padding: 50,\n          },\n          tickLabels: {\n            fontSize: 8,\n          },\n          grid: {\n            stroke: \"#d9d9d9\",\n            size: 5,\n          },\n        }}\n      />\n      {series.map((s, i) => (\n        <VictoryGroup\n          data={s.data.map((d, i) => ({\n            x: i + 2010,\n            y: d,\n          }))}\n          key={s.name}\n        >\n          <VictoryLine\n            style={{\n              data: {\n                stroke:\n                  VictoryTheme.clean\n                    .palette\n                    .qualitative[i],\n                strokeWidth: 1,\n              },\n            }}\n          />\n          <VictoryScatter\n            size={2}\n            symbol={symbols[i]}\n            style={{\n              data: {\n                fill: VictoryTheme.clean\n                  .palette.qualitative[\n                  i\n                ],\n              },\n            }}\n          />\n        </VictoryGroup>\n      ))}\n      <VictoryLegend\n        itemsPerRow={4}\n        x={50}\n        y={220}\n        data={series.map((s) => ({\n          name: s.name,\n          symbol: {\n            fill: VictoryTheme.clean\n              .palette.qualitative[\n              series.indexOf(s)\n            ],\n            type: symbols[\n              series.indexOf(s)\n            ],\n          },\n        }))}\n        style={{\n          data: {\n            fill: ({ datum }) =>\n              datum.symbol.fill,\n          },\n          labels: {\n            fontSize: 8,\n          },\n          border: {\n            stroke: \"transparent\",\n          },\n        }}\n      />\n      <Line\n        x1={25}\n        x2={425}\n        y1={270}\n        y2={270}\n        style={{\n          stroke: \"#d9d9d9\",\n        }}\n      />\n      <VictoryLabel\n        text={[\n          \"Hannah Ritchie, Max Roser and Pablo Rosado (2020) - “Renewable Energy”\",\n          \"https://ourworldindata.org/renewable-energy\",\n        ]}\n        style={{\n          fontSize: 8,\n          fontWeight: 300,\n          fontFamily: \"Inter\",\n        }}\n        dx={30}\n        dy={285}\n        theme={VictoryTheme.clean}\n      />\n    </VictoryChart>\n  );\n}\n\nrender(<App />);\n```\n\n## Next Steps\n\nCongratulations! You’ve created your first chart with Victory. Happy charting.\n\n## Documentation, Contributing, and Source\n\nFor more information about Victory and its components, check out the docs - see [VictoryChart](/docs/api/victory-chart) to get started. Interested in helping out or seeing what's happening under the hood? Victory is maintained at [github.com/FormidableLabs/victory](https://github.com/FormidableLabs/victory), and you can [start contributing here](https://github.com/FormidableLabs/victory/#contributing).\n"
  },
  {
    "path": "website/docs/introduction/native.mdx",
    "content": "---\nsidebar_position: 2\ntitle: React Native\n---\n\n:::warning\nThese docs are for the legacy versions of Victory Native. Victory Native XL is our rewrite of Victory Native designed specifically for React Native. Please [see here for more information](https://commerce.nearform.com/open-source/victory-native/). If you would like to continue to use this version of Victory with React Native, follow the legacy guide below.\n:::\n\n## Getting Started\n\nIn this guide, we’ll show you how to get started with Victory Native and the React Native SVG dependency running in your React Native app for iOS and Android.\n\n### 1. Adding Victory Native to your React Native app\n\nVisit [the guide on getting started](https://reactnative.dev/docs/getting-started) with React Native if you’re just getting started with React Native.\n\nVictory Native is compatible with React Native 0.50 or higher.\n\nTo add Victory Native to your React Native app install `victory-native`.\n\n```bash\n$ yarn add victory-native@legacy # or npm install --save victory-native@legacy\n```\n\n### 2. Add React Native SVG to your app\n\nIf you are building a project with native code, you will need to link the native dependencies of React Native SVG to the iOS and Android projects.\n\nThis step is not required if you are using Expo (SDK 23.0.0 or higher) as it is already included.\n\nReact Native 0.60 or newer:\n```bash\n$ yarn add react-native-svg  # or npm install --save react-native-svg\n$ cd ios\n$ pod install\n```\n\nReact Native below 0.60:\n```bash\n$ react-native install react-native-svg\n```\n\n*note:* If you run the iOS app and see a linker error for `-lRNSVG-tvOS` you will need to remove `libRNSVG-tvOS.a` from the “Link Binary with Libraries” section within your iOS app’s target’s properties.\n\n### 3. Using Victory Native in your React Native app\n\nVictory Native behaves and functions the same way for React Native as it does for the web. Just import components from `victory-native` to get started. To learn more about how to use Victory visit the [Getting Started Guide][].\n\nThe example below shows how Victory Native easily integrates within your React Native app.\n\n```jsx\nimport React from \"react\";\nimport { StyleSheet, View } from \"react-native\";\nimport { VictoryBar, VictoryChart, VictoryTheme } from \"victory-native\";\n\nconst data = [\n  { quarter: 1, earnings: 13000 },\n  { quarter: 2, earnings: 16500 },\n  { quarter: 3, earnings: 14250 },\n  { quarter: 4, earnings: 19000 }\n];\n\nexport default function App() {\n  return (\n    <View style={styles.container}>\n      <VictoryChart width={350} theme={VictoryTheme.clean}>\n        <VictoryBar data={data} x=\"quarter\" y=\"earnings\" />\n      </VictoryChart>\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    backgroundColor: \"#f5fcff\"\n  }\n});\n```\n\n### 4. Ignoring require cycles\n\n- see [https://github.com/FormidableLabs/victory/issues/2230](https://github.com/FormidableLabs/victory/issues/2230)\n\nAs of victory@36.4.0, React Native apps (on both iOS and Android) will warn about require cycles.\n\nThese warnings will not affect the functionality of `victory-native` or your app, and can be safely disabled.\n\nTo disable the warnings, modify your app's entry point (usually `index.js`) to include\n\n```js\nLogBox.ignoreLogs([\n  \"Require cycle: node_modules/victory\",\n]);\n```\n\nas shown below\n\n```diff\n+import { AppRegistry, LogBox } from \"react-native\";\nimport App from \"./App\";\nimport { name as appName } from \"./app.json\";\n\n+LogBox.ignoreLogs(['Require cycle: node_modules/victory']);\n\nAppRegistry.registerComponent(appName, () => App);\n```\n\n### 5. Testing Components that use Victory Native\n\nYou can test your components that render Victory Native using Jest and React Test Renderer which is included out–of–the box with React Native. The `jest` configuration section in `package.json` will need to be modified to ensure dependencies are transformed otherwise you will see an error when tests are run.\n\n```json\n\"jest\": {\n  \"preset\": \"react-native\",\n  \"transformIgnorePatterns\": [\n    \"node_modules/(?!victory|react-native-svg|react-native)\"\n  ],\n  \"transform\": {\n    \"^.+\\\\.jsx?$\": \"babel-jest\"\n  }\n}\n```\n\nTo test the above `App` component you can simply do:\n\n```jsx\nimport \"react-native\";\nimport React from \"react\";\nimport App from \"../App.js\";\nimport renderer from \"react-test-renderer\";\n\nit(\"renders correctly\", () => {\n  const tree = renderer.create(<App />);\n  expect(tree).toMatchSnapshot();\n});\n```\n\n*note:* `renderer` must be imported _after_ `react-native` for tests to work.\n\n\n## Expo Web Apps\n\nWhilst using `victory-native` in Expo apps that target iOS & Android is fully supported, we do not support building for the web with `victory-native`.\n\nHowever as both `victory-native` and `victory` share the same public API, it's possible to configure your Expo project so that it automatically uses `victory-native` when building your native apps for iOS & Android, and `victory` when building your web app.\n\n> ☣️ Please note that while you can follow the instructions below to configure your Expo project to make this work, Victory does not officially support Expo Web apps.\n\n```sh\nyarn add -D @expo/webpack-config\n```\n\nThen, create a `webpack.config.js` file in the root of your Expo project\n\n```js\nconst createExpoWebpackConfigAsync = require('@expo/webpack-config');\n\nmodule.exports = async function(env, argv) {\n  const config = await createExpoWebpackConfigAsync(env, argv);\n\n  // resolve victory-native as victory for the Web app\n  config.resolve.alias['victory-native'] = 'victory';\n\n  return config;\n};\n```\n\n[getting started guide]: /docs/introduction\n"
  },
  {
    "path": "website/docs/introduction/ssr.mdx",
    "content": "---\nsidebar_position: 3\ntitle: Server Side Rendering\n---\n\n# Server Side Rendering\n\nIn frameworks such as Next.js 13+, context is fully supported within Client Components, but it cannot be created or consumed directly within Server Components. This is because Server Components have no React state (since they're not interactive), and context is primarily used for rerendering interactive components deep in the tree after some React state has been updated.\nVictory uses `createContext` to perform its operations and it must be rendered client side by adding the `use client` directive in your components when used in a framework with Server Side Component support.\n\n```jsx\n\"use client\";\nimport React from 'react';\nimport { VictoryBar, VictoryChart, VictoryTheme } from \"victory\";\n\nconst data = [\n  { quarter: 1, earnings: 13000 },\n  { quarter: 2, earnings: 16500 },\n  { quarter: 3, earnings: 14250 },\n  { quarter: 4, earnings: 19000 }\n];\n\nconst App = ()=>{\n  return (\n    <div style={styles.container}>\n      <VictoryChart width={350} theme={VictoryTheme.clean}>\n        <VictoryBar data={data} x=\"quarter\" y=\"earnings\" />\n      </VictoryChart>\n    </div>\n  );\n}\n\nexport default App;\n```\n"
  },
  {
    "path": "website/docusaurus.config.ts",
    "content": "import { themes as prismThemes } from \"prism-react-renderer\";\nimport { Config } from \"@docusaurus/types\";\n\nconst title = \"Victory\";\nconst tagline =\n  \"Intuitive React components for advanced charting and data visualization.\";\n\nconst config: Config = {\n  title,\n  tagline,\n  favicon: \"favicon.ico\",\n  url: \"https://commerce.nearform.com/\",\n  baseUrl: \"/open-source/victory\",\n  onBrokenAnchors: \"throw\",\n  onBrokenLinks: \"throw\",\n  onBrokenMarkdownLinks: \"throw\",\n  onDuplicateRoutes: \"throw\",\n  i18n: {\n    defaultLocale: \"en\",\n    locales: [\"en\"],\n  },\n  presets: [\n    [\n      \"classic\",\n      /** @type {import('@docusaurus/preset-classic').Options} */\n      {\n        docs: {\n          sidebarPath: \"./sidebars.ts\",\n          sidebarCollapsed: true,\n        },\n        theme: {\n          customCss: \"./src/css/custom.css\",\n        },\n        gtag: {\n          trackingID: \"G-M971D063B9\",\n        },\n        googleTagManager: {\n          containerId: \"GTM-MD32945\",\n        },\n      },\n    ],\n  ],\n  themes: [\n    [\n      \"@docusaurus/theme-live-codeblock\",\n      {\n        liveCodeBlock: {\n          playgroundPosition: \"top\",\n        },\n      },\n    ],\n    [\n      require.resolve(\"@easyops-cn/docusaurus-search-local\"),\n      /** @type {import(\"@easyops-cn/docusaurus-search-local\").PluginOptions} */\n      {\n        hashed: true,\n        indexBlog: false,\n      },\n    ],\n  ],\n  plugins: [\n    async function tailwindPlugin() {\n      return {\n        name: \"tailwind-plugin\",\n        configurePostCss(postcssOptions) {\n          postcssOptions.plugins = [\n            /* eslint-disable @typescript-eslint/no-require-imports */\n            require(\"postcss-import\"),\n            require(\"tailwindcss\"),\n            require(\"autoprefixer\"),\n            /* eslint-enable @typescript-eslint/no-require-imports */\n          ];\n          return postcssOptions;\n        },\n      };\n    },\n  ],\n  themeConfig: {\n    /** @type {import('@docusaurus/preset-classic').ThemeConfig} */\n    metadata: [\n      {\n        name: \"title\",\n        content: `${title} - React Charting Components`,\n      },\n      {\n        name: \"description\",\n        content: tagline,\n      },\n      {\n        name: \"viewport\",\n        content: \"width=device-width, initial-scale=1, maximum-scale=1\",\n      },\n      {\n        name: \"keywords\",\n        content:\n          \"victory, documentation, react, charts, charting, data, viz, d3\",\n      },\n      { property: \"og:type\", content: \"website\" },\n      {\n        property: \"og:url\",\n        content: \"https://commerce.nearform.com/open-source/victory/\",\n      },\n      { property: \"og:title\", content: `${title} - React Charting Components` },\n      {\n        property: \"og:description\",\n        content: tagline,\n      },\n      {\n        property: \"og:image\",\n        content:\n          \"https://commerce.nearform.com/open-source/victory/open-graph.png\",\n      },\n      { property: \"twitter:card\", content: \"summary_large_image\" },\n      {\n        property: \"twitter:url\",\n        content: \"https://commerce.nearform.com/open-source/victory/\",\n      },\n      {\n        property: \"twitter:title\",\n        content: `${title} - React Charting Components`,\n      },\n      {\n        property: \"twitter:description\",\n        content: tagline,\n      },\n      {\n        property: \"twitter:image\",\n        content:\n          \"https://commerce.nearform.com/open-source/victory/open-graph.png\",\n      },\n    ],\n    docs: {\n      sidebar: {\n        hideable: false,\n      },\n    },\n    navbar: {\n      title: \"VICTORY\",\n      logo: {\n        alt: \"Victory\",\n        src: \"favicon/favicon-32x32.png\",\n      },\n      items: [\n        {\n          type: \"docSidebar\",\n          sidebarId: \"sidebar\",\n          position: \"left\",\n          label: \"DOCS\",\n        },\n        {\n          to: \"/themes\",\n          label: \"THEMES\",\n          position: \"left\",\n        },\n        {\n          href: \"https://github.com/FormidableLabs/victory\",\n          \"aria-label\": \"GitHub Repository\",\n          className: \"header-github-link\",\n          position: \"right\",\n        },\n      ],\n    },\n    footer: {\n      logo: {\n        alt: \"Nearform logo\",\n        src: \"img/nearform-logo-white.svg\",\n        href: \"https://commerce.nearform.com\",\n        width: 100,\n        height: 100,\n      },\n      copyright: `Copyright © 2013-${new Date().getFullYear()} Nearform`,\n    },\n    prism: {\n      theme: prismThemes.github,\n      darkTheme: prismThemes.dracula,\n      additionalLanguages: [\"diff\", \"diff-ts\"],\n    },\n    colorMode: {\n      defaultMode: \"light\",\n      disableSwitch: true,\n    },\n  },\n  headTags: [\n    {\n      tagName: \"link\",\n      attributes: {\n        rel: \"preconnect\",\n        href: \"https://fonts.googleapis.com\",\n      },\n    },\n    {\n      tagName: \"link\",\n      attributes: {\n        rel: \"preconnect\",\n        href: \"https://fonts.gstatic.com\",\n        crossOriginIsolated: \"true\",\n      },\n    },\n    {\n      tagName: \"link\",\n      attributes: {\n        rel: \"stylesheet\",\n        href: 'https://fonts.googleapis.com/css2?family=Inter:opsz,wght@14..32,100..900&display=swap\" rel=\"stylesheet',\n      },\n    },\n  ],\n};\n\nexport default config;\n"
  },
  {
    "path": "website/package.json",
    "content": "{\n  \"name\": \"victory-docs\",\n  \"version\": \"1.0.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"docusaurus\": \"docusaurus\",\n    \"start\": \"docusaurus start --port 5855 --no-open\",\n    \"build\": \"docusaurus build --out-dir build/open-source/victory\",\n    \"swizzle\": \"docusaurus swizzle\",\n    \"deploy\": \"docusaurus deploy\",\n    \"clear\": \"docusaurus clear\",\n    \"serve\": \"docusaurus serve --dir build/open-source/victory\",\n    \"write-translations\": \"docusaurus write-translations\",\n    \"write-heading-ids\": \"docusaurus write-heading-ids\",\n    \"typecheck\": \"tsc\"\n  },\n  \"dependencies\": {\n    \"@algolia/client-search\": \"^5.3.1\",\n    \"@docusaurus/core\": \"^3.5.2\",\n    \"@docusaurus/plugin-content-docs\": \"^3.5.2\",\n    \"@docusaurus/plugin-google-gtag\": \"^3.5.2\",\n    \"@docusaurus/plugin-google-tag-manager\": \"^3.5.2\",\n    \"@docusaurus/preset-classic\": \"^3.5.2\",\n    \"@docusaurus/theme-common\": \"^3.5.2\",\n    \"@docusaurus/theme-live-codeblock\": \"^3.5.2\",\n    \"@easyops-cn/docusaurus-search-local\": \"^0.44.5\",\n    \"@mdx-js/react\": \"^3.0.0\",\n    \"@monaco-editor/react\": \"^4.6.0\",\n    \"axios\": \"^1.7.7\",\n    \"clsx\": \"^2.0.0\",\n    \"date-fns\": \"^3.6.0\",\n    \"formidable-oss-badges\": \"^1.6.0\",\n    \"prism-react-renderer\": \"^2.4.0\",\n    \"react\": \"^18.0.0\",\n    \"react-dom\": \"^18.0.0\",\n    \"react-icons\": \"^5.3.0\",\n    \"react-live\": \"^4.1.7\",\n    \"search-insights\": \"^2.17.1\"\n  },\n  \"devDependencies\": {\n    \"@d3fc/d3fc-discontinuous-scale\": \"^4.1.1\",\n    \"@docusaurus/module-type-aliases\": \"^3.5.2\",\n    \"@docusaurus/tsconfig\": \"^3.5.2\",\n    \"@docusaurus/types\": \"^3.5.2\",\n    \"@heroicons/react\": \"^2.2.0\",\n    \"@types/react\": \"^18.0.0\",\n    \"autoprefixer\": \"^10.4.20\",\n    \"d3-array\": \"^2.4.0\",\n    \"d3-scale\": \"^3.2.1\",\n    \"d3-time\": \"^1.1.0\",\n    \"find-cache-dir\": \"5.0.0\",\n    \"mdast-util-from-markdown\": \"^2.0.1\",\n    \"postcss\": \"^8.4.38\",\n    \"prismjs\": \"^1.29.0\",\n    \"tailwindcss\": \"^3.4.3\",\n    \"typedoc\": \"^0.26.10\",\n    \"typescript\": \"~5.2.2\",\n    \"victory\": \"workspace:*\"\n  },\n  \"browserslist\": {\n    \"production\": [\n      \">0.5%\",\n      \"not dead\",\n      \"not op_mini all\"\n    ],\n    \"development\": [\n      \"last 3 chrome version\",\n      \"last 3 firefox version\",\n      \"last 5 safari version\"\n    ]\n  }\n}\n"
  },
  {
    "path": "website/sidebars.ts",
    "content": "import { SidebarsConfig } from \"@docusaurus/plugin-content-docs\";\n\nconst sidebars: SidebarsConfig = {\n  sidebar: [{ type: \"autogenerated\", dirName: \".\" }],\n};\n\nexport default sidebars;\n"
  },
  {
    "path": "website/src/components/CalloutBanner.tsx",
    "content": "import React from \"react\";\nimport LearnMoreLink from \"./LearnMoreLink\";\n\nconst CalloutBanner = ({ fullWidth = false }) => {\n  return (\n    <div\n      className={`rounded-xl bg-[#202020] mb-24 ${!fullWidth ? \"w-[65%]\" : \"\"} m-auto py-6 px-8 border-solid border-[6px] border-[#8F4438] outline outline-[6px] outline-[#FF684F]`}\n    >\n      <p className=\"m-0 text-[var(--ifm-color-primary)] text-xl font-bold\">\n        Like this project? You&apos;ll love working with us.\n      </p>\n      <div className=\"flex flex-col sm:flex-row mt-2.5 items-end justify-between\">\n        <p className=\"m-0 text-white text-sm mb-6 sm:mb-0\">\n          Contact us to learn more about our full range of services and\n          offerings.\n        </p>\n        <LearnMoreLink className=\"text-white text-sm font-bold flex items-center justify-between min-w-[100px] gap-1.5 underline underline-offset-4 decoration-2 text-[var(--ifm-color-primary)] hover:text-white\" />\n      </div>\n    </div>\n  );\n};\n\nexport default CalloutBanner;\n"
  },
  {
    "path": "website/src/components/LearnMoreLink.tsx",
    "content": "import React from \"react\";\nimport { ComponentProps } from \"react\";\nimport { FaArrowRight } from \"react-icons/fa\";\n\nexport default function LearnMoreLink(\n  props: Omit<ComponentProps<\"a\">, \"href\">,\n) {\n  return (\n    <a\n      href=\"https://commerce.nearform.com/contact?lead_source_2_0=Open%20Source\"\n      target=\"_blank\"\n      rel=\"noreferrer\"\n      {...props}\n    >\n      Learn More\n      <FaArrowRight height={40} width={40} scale={5} />\n    </a>\n  );\n}\n"
  },
  {
    "path": "website/src/components/SidebarLeadBanner.tsx",
    "content": "import React from \"react\";\nimport LearnMoreLink from \"./LearnMoreLink\";\n\nexport default function SidebarLeadBanner() {\n  return (\n    <aside className=\"rounded-xl bg-[#f2f2f2] m-3 py-7 px-9 text-[#606770]\">\n      <p className=\"text-base font-bold\">\n        Like this project? You&apos;ll love working with us.\n      </p>\n      <p className=\"text-sm\">\n        Contact us to learn more about our full range of services and offerings.\n      </p>\n      <LearnMoreLink className=\"text-[#606770] hover:text-[var(--ifm-color-primary)] text-sm font-bold flex items-center justify-end min-w-[100px] gap-1.5 underline underline-offset-4 decoration-2\" />\n    </aside>\n  );\n}\n"
  },
  {
    "path": "website/src/components/badges.tsx",
    "content": "/* eslint-disable react/no-multi-comp */\nimport React from \"react\";\n\nexport function Badges({ children }) {\n  return <div className=\"flex flex-wrap gap-2 mb-5\">{children}</div>;\n}\n\nexport function Badge({ children, className }) {\n  return (\n    <span\n      className={`inline-flex items-center rounded-md px-2 py-1 text-xs font-mono ring-1 ring-inset ${className}`}\n    >\n      {children}\n    </span>\n  );\n}\n\nexport function TypeBadge({ value }) {\n  return (\n    <Badge className=\"bg-blue-50 text-blue-700 ring-blue-700/10\">\n      type: {value}\n    </Badge>\n  );\n}\n\nexport function OverriddenBadge() {\n  return (\n    <Badge className=\"bg-gray-50 text-gray-600 ring-gray-500/10\">\n      overridden\n    </Badge>\n  );\n}\n\nexport function RequiredBadge() {\n  return (\n    <Badge className=\"bg-red-50 text-red-700 ring-red-600/10\">Required</Badge>\n  );\n}\n\nexport function DefaultsBadge({ value }) {\n  return (\n    <Badge className=\"bg-green-50 text-green-700 ring-green-600/20\">\n      default: {value}\n    </Badge>\n  );\n}\n"
  },
  {
    "path": "website/src/components/button.tsx",
    "content": "import clsx from \"clsx\";\nimport React from \"react\";\n\ntype ButtonProps = {\n  onClick: () => void;\n  children: React.ReactNode;\n  className?: string;\n  ariaLabel?: string;\n  disabled?: boolean;\n  size?: \"sm\" | \"md\";\n};\n\nexport const Button = ({\n  onClick,\n  children,\n  className = \"\",\n  ariaLabel = \"\",\n  disabled = false,\n  size = \"md\",\n  ...props\n}: ButtonProps) => {\n  const baseClasses =\n    \"py-2 px-4 font-semibold rounded-md cursor-pointer text-sm border-2 border-solid border-button-border bg-button-bg text-button-fg hover:bg-button-bg-hover hover:text-button-fg-hover disabled:bg-grayscale-300 disabled:text-grayscale-400 disabled:cursor-not-allowed\";\n\n  return (\n    <button\n      onClick={onClick}\n      disabled={disabled}\n      aria-label={ariaLabel || undefined}\n      className={clsx(\n        baseClasses,\n        size === \"md\" && \"py-2 px-5 font-bold\",\n        size === \"sm\" && \"py-1.5 px-3 font-semibold\",\n        className,\n      )}\n      {...props}\n    >\n      {children}\n    </button>\n  );\n};\n"
  },
  {
    "path": "website/src/components/common-props.tsx",
    "content": "/* eslint-disable react/no-multi-comp */\nimport React from \"react\";\n\nimport { Badge, OverriddenBadge } from \"./badges\";\n\ntype Prop = {\n  name: string;\n  url?: string;\n  default?: string;\n};\n\ntype PropsMeta = {\n  name: string;\n  url: string;\n  props: Prop[];\n};\n\nfunction extend(meta: PropsMeta, props: PropsMeta): PropsMeta {\n  return {\n    ...props,\n    props: [\n      ...meta.props.map((x) => ({ ...x, url: `${meta.url}#${x.name}` })),\n      ...props.props,\n    ].sort((a, b) => a.name.localeCompare(b.name)),\n  };\n}\n\nconst VictoryAxisCommonProps: PropsMeta = {\n  name: \"VictoryAxisCommonProps\",\n  url: \"/open-source/victory/docs/api/victory-axis-common-props\",\n  props: [\n    { name: \"axisComponent\" },\n    { name: \"axisLabelComponent\" },\n    { name: \"axisValue\" },\n    { name: \"dependentAxis\" },\n    { name: \"disableInlineStyles\" },\n    { name: \"gridComponent\" },\n    { name: \"invertAxis\" },\n    { name: \"style\" },\n    { name: \"tickComponent\" },\n    { name: \"tickCount\" },\n    { name: \"tickFormat\" },\n    { name: \"tickLabelComponent\" },\n    { name: \"tickValues\" },\n  ],\n};\n\nconst VictoryContainerProps: PropsMeta = {\n  name: \"VictoryContainerProps\",\n  url: \"/open-source/victory/docs/api/victory-container-props\",\n  props: [\n    { name: \"aria-describedby\" },\n    { name: \"aria-labelledby\" },\n    { name: \"children\" },\n    { name: \"className\" },\n    { name: \"containerId\" },\n    { name: \"containerRef\" },\n    { name: \"desc\" },\n    { name: \"events\" },\n    { name: \"height\" },\n    { name: \"name\" },\n    { name: \"origin\" },\n    { name: \"ouiaId\" },\n    { name: \"ouiaSafe\" },\n    { name: \"ouiaType\" },\n    { name: \"polar\" },\n    { name: \"portalComponent\" },\n    { name: \"portalZIndex\" },\n    { name: \"preserveAspectRatio\" },\n    { name: \"responsive\" },\n    { name: \"role\" },\n    { name: \"scale\" },\n    { name: \"style\" },\n    { name: \"tabIndex\" },\n    { name: \"theme\" },\n    { name: \"title\" },\n    { name: \"width\" },\n  ],\n};\n\nconst VictoryLabelableProps: PropsMeta = {\n  name: \"VictoryLabelableProps\",\n  url: \"/open-source/victory/docs/api/victory-labelable-props\",\n  props: [{ name: \"labelComponent\" }],\n};\n\nconst VictoryMultiLabelableProps: PropsMeta = extend(VictoryLabelableProps, {\n  name: \"VictoryMultiLabelableProps\",\n  url: \"/open-source/victory/docs/api/victory-multi-labelable-props\",\n  props: [{ name: \"labels\" }],\n});\n\nconst VictorySingleLabelableProps: PropsMeta = extend(VictoryLabelableProps, {\n  name: \"VictorySingleLabelableProps\",\n  url: \"/open-source/victory/docs/api/victory-single-labelable-props\",\n  props: [{ name: \"label\" }],\n});\n\nconst VictoryEventProps: PropsMeta = {\n  name: \"VictoryEventProps\",\n  url: \"/open-source/victory/docs/api/victory-event-props\",\n  props: [{ name: \"eventKey\" }, { name: \"events\" }],\n};\n\nconst VictoryCommonThemeProps: PropsMeta = {\n  name: \"VictoryCommonThemeProps\",\n  url: \"/open-source/victory/docs/api/victory-common-theme-props\",\n  props: [\n    { name: \"animate\" },\n    { name: \"colorScale\" },\n    { name: \"containerComponent\", default: \"<VictoryContainer>\" },\n    { name: \"disableInlineStyles\" },\n    { name: \"domainPadding\" },\n    { name: \"externalEventMutations\" },\n    { name: \"groupComponent\" },\n    { name: \"height\" },\n    { name: \"horizontal\" },\n    { name: \"maxDomain\" },\n    { name: \"minDomain\" },\n    { name: \"name\" },\n    { name: \"origin\" },\n    { name: \"padding\" },\n    { name: \"polar\" },\n    { name: \"range\" },\n    { name: \"scale\" },\n    { name: \"sharedEvents\" },\n    { name: \"singleQuadrantDomainPadding\" },\n    { name: \"standalone\" },\n    { name: \"width\" },\n  ],\n};\n\nconst VictoryCommonProps: PropsMeta = extend(VictoryCommonThemeProps, {\n  name: \"VictoryCommonProps\",\n  url: \"/open-source/victory/docs/api/victory-common-props\",\n  props: [{ name: \"theme\" }],\n});\n\nconst VictoryDatableProps: PropsMeta = {\n  name: \"VictoryDatableProps\",\n  url: \"/open-source/victory/docs/api/victory-datatable-props\",\n  props: [\n    { name: \"categories\" },\n    { name: \"data\" },\n    { name: \"dataComponent\" },\n    { name: \"domain\" },\n    { name: \"domainPadding\" },\n    { name: \"samples\" },\n    { name: \"sortKey\" },\n    { name: \"sortOrder\" },\n    { name: \"x\" },\n    { name: \"y\" },\n    { name: \"y0\" },\n  ],\n};\n\nconst VictoryCommons = [\n  VictoryAxisCommonProps,\n  VictoryContainerProps,\n  VictoryDatableProps,\n  VictoryLabelableProps,\n  VictorySingleLabelableProps,\n  VictoryMultiLabelableProps,\n  VictoryCommonThemeProps,\n  VictoryCommonProps,\n  VictoryEventProps,\n];\n\nfunction PropertyListItem({ x, prop, overridden, notImplemented }) {\n  if (notImplemented) {\n    return (\n      <>\n        {prop.name}\n        <Badge className=\"bg-gray-50 text-gray-600 ring-gray-500/10\">\n          not-implemented\n        </Badge>\n      </>\n    );\n  }\n  if (overridden) {\n    return (\n      <>\n        <a href={`#${prop.name}`}>{prop.name}</a>\n        <OverriddenBadge />\n      </>\n    );\n  }\n  return (\n    <a href={prop.url ? prop.url : `${x.url}#${prop.name}`}>{prop.name}</a>\n  );\n}\n\nexport function CommonProps({ interfaces, overrides, notImplemented }) {\n  const result = VictoryCommons.filter((x) =>\n    (interfaces || []).includes(x.name),\n  );\n\n  return (\n    <div>\n      {result.map((x) => (\n        <div key={x.name}>\n          <h3 id={`#${x.name}`}>{x.name}</h3>\n          <ul>\n            {x.props.map((prop) => (\n              <li key={prop.name}>\n                <div className=\"flex flex-row items-center gap-2\">\n                  <PropertyListItem\n                    x={x}\n                    prop={prop}\n                    overridden={overrides && overrides.includes(prop.name)}\n                    notImplemented={\n                      notImplemented && notImplemented.includes(prop.name)\n                    }\n                  />\n                </div>\n              </li>\n            ))}\n          </ul>\n        </div>\n      ))}\n    </div>\n  );\n}\n"
  },
  {
    "path": "website/src/components/link-button.tsx",
    "content": "import clsx from \"clsx\";\nimport React from \"react\";\n\ninterface ButtonProps {\n  className?: string;\n  children: React.ReactNode;\n  link: string;\n  screenReaderLabel?: string;\n}\n\nexport const LinkButton = ({ children, link, className }: ButtonProps) => {\n  const classes = clsx(\n    \"bg-button-bg text-button-fg border-button-border hover:text-button-fg-hover after:bg-button-bg-hover border-2 font-bold rounded-full text-lg z-0 transition-colors delay-75 w-fit overflow-hidden py-[14px] px-[23px] relative flex gap-2.5 justify-between leading-[21px] after:absolute after:w-[200%] after:h-full after:bottom-0 after:transform-gpu after:-skew-x-[50deg] after:-right-[250%] after:-z-10 after:transition-transform after:duration-200 hover:after:-translate-x-[100%] hover:after:[-webkit-transform:translate3d(-100%,0,0)_!important]\",\n    className,\n  );\n  return (\n    <a className={classes} href={link}>\n      {children}\n    </a>\n  );\n};\n"
  },
  {
    "path": "website/src/components/slider.tsx",
    "content": "/* eslint no-magic-numbers: [\"error\", { \"ignore\": [0, 1, 100] }]*/\n\nimport React, { useLayoutEffect, useState, useRef, useCallback } from \"react\";\nimport clamp from \"lodash/clamp\";\n\nconst LIGHT_GREY = \"hsl(355, 32%, 87%)\";\n\nconst isTouchEvent = (event) => {\n  return event.touches !== undefined;\n};\n\nconst Slider = ({ tooltipValues, color, value, maxValue, onChange }) => {\n  const [dragging, setDragging] = useState(false);\n  const [percentage, setPercentage] = useState(value / maxValue);\n  const containerRef = useRef<HTMLDivElement>(null);\n\n  const handleDrag = useCallback(\n    (ev) => {\n      if (dragging && containerRef.current) {\n        const left = containerRef.current.getBoundingClientRect().left;\n        const sliderWidth = containerRef.current.clientWidth;\n        const location = isTouchEvent(ev)\n          ? ev.touches[0].clientX - left\n          : ev.clientX - left;\n\n        const newPercentage = clamp(location / sliderWidth, 0, 1);\n\n        window.requestAnimationFrame(() => {\n          setPercentage(newPercentage);\n          onChange(percentage * maxValue);\n        });\n      }\n    },\n    [dragging, maxValue, onChange, percentage],\n  );\n\n  const handleDragDone = useCallback(() => {\n    setDragging(false);\n    onChange(percentage * maxValue);\n  }, [maxValue, onChange, percentage]);\n\n  const handleDragStart = (ev) => {\n    if (!containerRef.current) {\n      return;\n    }\n    const left = containerRef.current.getBoundingClientRect().left;\n    const sliderWidth = containerRef.current.clientWidth;\n    const location = isTouchEvent(ev)\n      ? ev.touches[0].clientX - left\n      : ev.clientX - left;\n\n    const newPercentage = location / sliderWidth;\n\n    setPercentage(newPercentage);\n    setDragging(true);\n  };\n\n  const getTooltipText = () => {\n    const length = tooltipValues.length;\n\n    const index = Math.round((length - 1) * percentage);\n\n    return tooltipValues[index];\n  };\n\n  useLayoutEffect(() => {\n    window.addEventListener(\"mousemove\", handleDrag);\n    window.addEventListener(\"touchmove\", handleDrag);\n    window.addEventListener(\"touchend\", handleDragDone);\n    window.addEventListener(\"mouseup\", handleDragDone);\n\n    return () => {\n      window.removeEventListener(\"mousemove\", handleDrag);\n      window.removeEventListener(\"touchmove\", handleDrag);\n      window.removeEventListener(\"touchend\", handleDragDone);\n      window.removeEventListener(\"mouseup\", handleDragDone);\n    };\n  }, [handleDrag, handleDragDone]);\n\n  return (\n    <div\n      ref={containerRef}\n      onMouseDown={handleDragStart}\n      onTouchStart={handleDragStart}\n      className=\"w-full cursor-pointer select-none h-2 relative py-10\"\n      draggable=\"false\"\n    >\n      <div className=\"absolute h-2 w-full mt-2 rounded-md bg-[#A38F91]\" />\n      <div\n        style={{\n          transform: `scaleX(${percentage})`,\n          backgroundColor: color,\n          transition: \"transform 0.45s ease-out\",\n        }}\n        className=\"absolute h-2 w-full mt-2 cursor-pointer rounded-md origin-top-left\"\n      />\n\n      {tooltipValues.map((tooltip, index) => {\n        const tooltipPercentage = index / (tooltipValues.length - 1);\n\n        return (\n          <div\n            key={index}\n            className=\"absolute top-2/4 h-[12px] w-[12px] rounded-[50%] mt-[14px] -translate-x-1/2 -translate-y-1/2 [box-shadow:0_10px_20px_rgba(0,_0,_0,_0.19),_0_6px_6px_rgba(0,_0,_0,_0.23)] [transition:background-color_0.45s_ease-out]\"\n            style={{\n              backgroundColor:\n                tooltipPercentage <= percentage ? color : LIGHT_GREY,\n              left: `${tooltipPercentage * 100}%`,\n            }}\n          />\n        );\n      })}\n\n      <div\n        style={{\n          transform: `translateX(${percentage * 100}%)`,\n        }}\n        className=\"w-full h-[8px] relative mt-px\"\n      >\n        <div\n          style={{\n            background: color,\n            transform: `translate(-50%, ${dragging ? \"-36px\" : \"-25px\"})`,\n          }}\n          className=\"absolute left-[0] bottom-full flex justify-center text-[#fff] text-center p-[10px] pointer-events-none [box-shadow:2px_2px_6px_rgba(0,_0,_0,_0.28)] [transition:transform_0.3s_ease-out] rounded-[3px] font-bold text-[16px]\"\n        >\n          {getTooltipText()}\n        </div>\n        <div\n          style={{\n            transform: `translate(-50%, ${dragging ? \"-36px\" : \"-25px\"})`,\n            borderTop: `solid ${color} 14px`,\n          }}\n          className=\"absolute left-[0] border-solid border-[14px] border-l-[transparent] border-r-[transparent] [transition:color_0.3s_ease-out,_transform_0.3s_ease-out]\"\n        />\n      </div>\n\n      <div\n        style={{\n          transform: `translateX(${percentage * 100}%)`,\n        }}\n        className=\"w-full h-[8px] relative mt-px\"\n      >\n        <div\n          onMouseDown={handleDragStart}\n          onTouchStart={handleDragStart}\n          className=\"peer absolute left-[0] top-2/4 h-[25px] w-[25px] rounded-[50%] [box-shadow:0_14px_28px_rgba(0,_0,_0,_0.25),_0_10px_10px_rgba(0,_0,_0,_0.22)] select-none z-10 -translate-x-1/2 -translate-y-1/2\"\n          style={{\n            cursor: dragging ? \"grabbing\" : \"grab\",\n            backgroundColor: color,\n          }}\n        />\n        <div\n          onMouseDown={handleDragStart}\n          onTouchStart={handleDragStart}\n          style={{\n            backgroundColor: \"hsl(355, 32%, 87%)\",\n            cursor: dragging ? \"grabbing\" : \"grab\",\n          }}\n          className=\"opacity-0 peer-hover:opacity-30 hover:opacity-30 bigger-circle absolute left-[0] top-2/4 h-[42px] w-[42px] rounded-[50%] -translate-x-1/2 -translate-y-1/2 [transition:opacity_0.25s_ease-out] z-[9]\"\n        />\n      </div>\n    </div>\n  );\n};\n\nexport default Slider;\n"
  },
  {
    "path": "website/src/css/custom.css",
    "content": "/**\n * Any CSS included here will be global. The classic template\n * bundles Infima by default. Infima is a CSS framework designed to\n * work well for content-centric websites.\n */\n@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\nbody {\n  scroll-behavior: smooth;\n  text-rendering: optimizeSpeed;\n}\n\n@font-face {\n  font-family: \"Inter\";\n  src: url(\"/font/InterRegular.woff2\") format(\"woff2\");\n  font-weight: 400;\n  font-style: normal;\n  font-display: swap;\n}\n\n@font-face {\n  font-family: \"Inter\";\n  src: url(\"/font/InterMedium.woff2\") format(\"woff2\");\n  font-weight: 500;\n  font-style: normal;\n  font-display: swap;\n}\n\n@font-face {\n  font-family: \"Inter\";\n  src: url(\"/font/InterBold.woff2\") format(\"woff2\");\n  font-weight: 700;\n  font-style: normal;\n  font-display: swap;\n}\n\n.hero-pattern {\n  background-image: url(\"/img/hero-background.svg\");\n}\n\n:root {\n  --ifm-color-primary: #ff684f;\n  --ifm-color-primary-dark: #ff4b2e;\n  --ifm-color-primary-darker: #ff3d1d;\n  --ifm-color-primary-darkest: #ea2100;\n  --ifm-color-primary-light: #ff8570;\n  --ifm-color-primary-lighter: #ff9381;\n  --ifm-color-primary-lightest: #ffbeb3;\n  --ifm-code-font-size: 95%;\n  --ifm-list-item-margin: 0;\n  --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);\n  --ifm-navbar-background-color: #242526;\n  --ifm-footer-background-color: #242526;\n  --ifm-navbar-link-color: #ffffff;\n  --ifm-footer-padding-vertical: 1rem;\n}\n\n[data-theme=\"dark\"] {\n  --ifm-color-primary: #ff684f;\n  --ifm-color-primary-dark: #ff4b2e;\n  --ifm-color-primary-darker: #ff3d1d;\n  --ifm-color-primary-darkest: #ea2100;\n  --ifm-color-primary-light: #ff8570;\n  --ifm-color-primary-lighter: #ff9381;\n  --ifm-color-primary-lightest: #ffbeb3;\n  --ifm-list-item-margin: 0;\n  --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);\n  --ifm-navbar-background-color: #242526;\n  --ifm-footer-background-color: #242526;\n}\n\n/* Nav */\n.header-github-link::before {\n  content: \"\";\n  width: 24px;\n  height: 24px;\n  display: flex;\n  background: url(\"data:image/svg+xml;charset=utf-8,%3Csvg fill='white' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E\")\n    no-repeat;\n}\n\n.navbar__inner button svg {\n  color: white;\n}\n\n/* Override right margin on logo */\n.navbar__logo {\n  flex: 0 0 auto;\n  height: 2rem;\n  margin-right: 2rem;\n}\n\n/* Custom Footer */\n.footer__bottom.text--center {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n}\n\n.footer__bottom.text--center a {\n  opacity: 1 !important;\n}\n\n.footer__copyright {\n  color: white;\n}\n\n@layer base {\n  /* Needed for theme builder since we're disabling Tailwind's reset for docs */\n  .theme-builder * {\n    border-width: 0;\n    border-style: solid;\n\n    h1,\n    h2,\n    h3,\n    h4,\n    h5,\n    h6 {\n      font-family: Inter, Helvetica, Arial, sans-serif;\n    }\n  }\n}\n"
  },
  {
    "path": "website/src/hooks/useClickOutside.tsx",
    "content": "import { useEffect, useLayoutEffect, useRef } from \"react\";\n\nexport function useClickOutside(cb: (e: Event) => void) {\n  const ref = useRef<HTMLDivElement>(null);\n  const refCb = useRef(cb);\n\n  useLayoutEffect(() => {\n    refCb.current = cb;\n  });\n\n  useEffect(() => {\n    const handler = (e: Event) => {\n      const element = ref.current;\n      if (element && !element.contains(e.target as Node)) {\n        refCb.current(e);\n      }\n    };\n\n    document.addEventListener(\"mousedown\", handler);\n    document.addEventListener(\"touchstart\", handler);\n\n    return () => {\n      document.removeEventListener(\"mousedown\", handler);\n      document.removeEventListener(\"touchstart\", handler);\n    };\n  }, []);\n\n  return ref;\n}\n"
  },
  {
    "path": "website/src/hooks/useLocalStorage.tsx",
    "content": "import { useEffect, useState } from \"react\";\n\nexport const useLocalStorage = (key: string, initialValue: any) => {\n  const [storedValue, setStoredValue] = useState(() => {\n    if (typeof window === \"undefined\") return initialValue;\n\n    try {\n      const item = localStorage.getItem(key);\n      return item ? JSON.parse(item) : initialValue;\n    } catch {\n      return initialValue;\n    }\n  });\n\n  useEffect(() => {\n    if (typeof window !== \"undefined\") {\n      try {\n        localStorage.setItem(key, JSON.stringify(storedValue));\n      } catch (error) {\n        // eslint-disable-next-line no-console\n        console.error(\"Error saving to localStorage\", error);\n      }\n    }\n  }, [storedValue, key]);\n\n  return [storedValue, setStoredValue];\n};\n"
  },
  {
    "path": "website/src/pages/_components/data/downloads.js",
    "content": "const data = {\n  data: [\n    {\n      day: \"2015-11-28\",\n      downloads: 3,\n    },\n    {\n      day: \"2015-11-29\",\n      downloads: 4,\n    },\n    {\n      day: \"2015-11-30\",\n      downloads: 5,\n    },\n    {\n      day: \"2015-12-01\",\n      downloads: 4,\n    },\n    {\n      day: \"2015-12-02\",\n      downloads: 2,\n    },\n    {\n      day: \"2015-12-03\",\n      downloads: 6,\n    },\n    {\n      day: \"2015-12-04\",\n      downloads: 37,\n    },\n    {\n      day: \"2015-12-05\",\n      downloads: 14,\n    },\n    {\n      day: \"2015-12-06\",\n      downloads: 2,\n    },\n    {\n      day: \"2015-12-07\",\n      downloads: 14,\n    },\n    {\n      day: \"2015-12-08\",\n      downloads: 4,\n    },\n    {\n      day: \"2015-12-09\",\n      downloads: 13,\n    },\n    {\n      day: \"2015-12-10\",\n      downloads: 18,\n    },\n    {\n      day: \"2015-12-11\",\n      downloads: 10,\n    },\n    {\n      day: \"2015-12-12\",\n      downloads: 6,\n    },\n    {\n      day: \"2015-12-13\",\n      downloads: 7,\n    },\n    {\n      day: \"2015-12-14\",\n      downloads: 7,\n    },\n    {\n      day: \"2015-12-15\",\n      downloads: 14,\n    },\n    {\n      day: \"2015-12-16\",\n      downloads: 11,\n    },\n    {\n      day: \"2015-12-17\",\n      downloads: 12,\n    },\n    {\n      day: \"2015-12-18\",\n      downloads: 75,\n    },\n    {\n      day: \"2015-12-19\",\n      downloads: 14,\n    },\n    {\n      day: \"2015-12-20\",\n      downloads: 13,\n    },\n    {\n      day: \"2015-12-21\",\n      downloads: 20,\n    },\n    {\n      day: \"2015-12-22\",\n      downloads: 13,\n    },\n    {\n      day: \"2015-12-23\",\n      downloads: 9,\n    },\n    {\n      day: \"2015-12-24\",\n      downloads: 4,\n    },\n    {\n      day: \"2015-12-25\",\n      downloads: 3,\n    },\n    {\n      day: \"2015-12-26\",\n      downloads: 14,\n    },\n    {\n      day: \"2015-12-27\",\n      downloads: 1,\n    },\n    {\n      day: \"2015-12-28\",\n      downloads: 11,\n    },\n    {\n      day: \"2015-12-29\",\n      downloads: 36,\n    },\n    {\n      day: \"2015-12-30\",\n      downloads: 95,\n    },\n    {\n      day: \"2015-12-31\",\n      downloads: 12,\n    },\n    {\n      day: \"2016-01-01\",\n      downloads: 12,\n    },\n    {\n      day: \"2016-01-02\",\n      downloads: 15,\n    },\n    {\n      day: \"2016-01-03\",\n      downloads: 14,\n    },\n    {\n      day: \"2016-01-04\",\n      downloads: 35,\n    },\n    {\n      day: \"2016-01-05\",\n      downloads: 19,\n    },\n    {\n      day: \"2016-01-06\",\n      downloads: 33,\n    },\n    {\n      day: \"2016-01-07\",\n      downloads: 47,\n    },\n    {\n      day: \"2016-01-08\",\n      downloads: 29,\n    },\n    {\n      day: \"2016-01-09\",\n      downloads: 33,\n    },\n    {\n      day: \"2016-01-10\",\n      downloads: 19,\n    },\n    {\n      day: \"2016-01-11\",\n      downloads: 48,\n    },\n    {\n      day: \"2016-01-12\",\n      downloads: 38,\n    },\n    {\n      day: \"2016-01-13\",\n      downloads: 38,\n    },\n    {\n      day: \"2016-01-14\",\n      downloads: 21,\n    },\n    {\n      day: \"2016-01-15\",\n      downloads: 37,\n    },\n    {\n      day: \"2016-01-16\",\n      downloads: 45,\n    },\n    {\n      day: \"2016-01-17\",\n      downloads: 33,\n    },\n    {\n      day: \"2016-01-18\",\n      downloads: 14,\n    },\n    {\n      day: \"2016-01-19\",\n      downloads: 33,\n    },\n    {\n      day: \"2016-01-20\",\n      downloads: 48,\n    },\n    {\n      day: \"2016-01-21\",\n      downloads: 38,\n    },\n    {\n      day: \"2016-01-22\",\n      downloads: 36,\n    },\n    {\n      day: \"2016-01-23\",\n      downloads: 16,\n    },\n    {\n      day: \"2016-01-24\",\n      downloads: 48,\n    },\n    {\n      day: \"2016-01-25\",\n      downloads: 43,\n    },\n    {\n      day: \"2016-01-26\",\n      downloads: 61,\n    },\n    {\n      day: \"2016-01-27\",\n      downloads: 106,\n    },\n    {\n      day: \"2016-01-28\",\n      downloads: 73,\n    },\n    {\n      day: \"2016-01-29\",\n      downloads: 43,\n    },\n    {\n      day: \"2016-01-30\",\n      downloads: 34,\n    },\n    {\n      day: \"2016-01-31\",\n      downloads: 25,\n    },\n    {\n      day: \"2016-02-01\",\n      downloads: 124,\n    },\n    {\n      day: \"2016-02-02\",\n      downloads: 78,\n    },\n    {\n      day: \"2016-02-03\",\n      downloads: 64,\n    },\n    {\n      day: \"2016-02-04\",\n      downloads: 47,\n    },\n    {\n      day: \"2016-02-05\",\n      downloads: 57,\n    },\n    {\n      day: \"2016-02-06\",\n      downloads: 23,\n    },\n    {\n      day: \"2016-02-07\",\n      downloads: 27,\n    },\n    {\n      day: \"2016-02-08\",\n      downloads: 54,\n    },\n    {\n      day: \"2016-02-09\",\n      downloads: 68,\n    },\n    {\n      day: \"2016-02-10\",\n      downloads: 94,\n    },\n    {\n      day: \"2016-02-11\",\n      downloads: 54,\n    },\n    {\n      day: \"2016-02-12\",\n      downloads: 72,\n    },\n    {\n      day: \"2016-02-13\",\n      downloads: 4,\n    },\n    {\n      day: \"2016-02-14\",\n      downloads: 9,\n    },\n    {\n      day: \"2016-02-15\",\n      downloads: 53,\n    },\n    {\n      day: \"2016-02-16\",\n      downloads: 62,\n    },\n    {\n      day: \"2016-02-17\",\n      downloads: 74,\n    },\n    {\n      day: \"2016-02-18\",\n      downloads: 103,\n    },\n    {\n      day: \"2016-02-19\",\n      downloads: 70,\n    },\n    {\n      day: \"2016-02-20\",\n      downloads: 27,\n    },\n    {\n      day: \"2016-02-21\",\n      downloads: 41,\n    },\n    {\n      day: \"2016-02-22\",\n      downloads: 93,\n    },\n    {\n      day: \"2016-02-23\",\n      downloads: 124,\n    },\n    {\n      day: \"2016-02-24\",\n      downloads: 108,\n    },\n    {\n      day: \"2016-02-25\",\n      downloads: 72,\n    },\n    {\n      day: \"2016-02-26\",\n      downloads: 95,\n    },\n    {\n      day: \"2016-02-27\",\n      downloads: 36,\n    },\n    {\n      day: \"2016-02-28\",\n      downloads: 9,\n    },\n    {\n      day: \"2016-02-29\",\n      downloads: 118,\n    },\n    {\n      day: \"2016-03-01\",\n      downloads: 98,\n    },\n    {\n      day: \"2016-03-02\",\n      downloads: 112,\n    },\n    {\n      day: \"2016-03-03\",\n      downloads: 133,\n    },\n    {\n      day: \"2016-03-04\",\n      downloads: 105,\n    },\n    {\n      day: \"2016-03-05\",\n      downloads: 27,\n    },\n    {\n      day: \"2016-03-06\",\n      downloads: 34,\n    },\n    {\n      day: \"2016-03-07\",\n      downloads: 176,\n    },\n    {\n      day: \"2016-03-08\",\n      downloads: 134,\n    },\n    {\n      day: \"2016-03-09\",\n      downloads: 117,\n    },\n    {\n      day: \"2016-03-10\",\n      downloads: 89,\n    },\n    {\n      day: \"2016-03-11\",\n      downloads: 65,\n    },\n    {\n      day: \"2016-03-12\",\n      downloads: 8,\n    },\n    {\n      day: \"2016-03-13\",\n      downloads: 10,\n    },\n    {\n      day: \"2016-03-14\",\n      downloads: 63,\n    },\n    {\n      day: \"2016-03-15\",\n      downloads: 34,\n    },\n    {\n      day: \"2016-03-16\",\n      downloads: 66,\n    },\n    {\n      day: \"2016-03-17\",\n      downloads: 146,\n    },\n    {\n      day: \"2016-03-18\",\n      downloads: 63,\n    },\n    {\n      day: \"2016-03-19\",\n      downloads: 30,\n    },\n    {\n      day: \"2016-03-20\",\n      downloads: 19,\n    },\n    {\n      day: \"2016-03-21\",\n      downloads: 56,\n    },\n    {\n      day: \"2016-03-22\",\n      downloads: 49,\n    },\n    {\n      day: \"2016-03-23\",\n      downloads: 78,\n    },\n    {\n      day: \"2016-03-24\",\n      downloads: 61,\n    },\n    {\n      day: \"2016-03-25\",\n      downloads: 21,\n    },\n    {\n      day: \"2016-03-26\",\n      downloads: 12,\n    },\n    {\n      day: \"2016-03-27\",\n      downloads: 24,\n    },\n    {\n      day: \"2016-03-28\",\n      downloads: 68,\n    },\n    {\n      day: \"2016-03-29\",\n      downloads: 92,\n    },\n    {\n      day: \"2016-03-30\",\n      downloads: 77,\n    },\n    {\n      day: \"2016-03-31\",\n      downloads: 46,\n    },\n    {\n      day: \"2016-04-01\",\n      downloads: 47,\n    },\n    {\n      day: \"2016-04-02\",\n      downloads: 15,\n    },\n    {\n      day: \"2016-04-03\",\n      downloads: 6,\n    },\n    {\n      day: \"2016-04-04\",\n      downloads: 48,\n    },\n    {\n      day: \"2016-04-05\",\n      downloads: 29,\n    },\n    {\n      day: \"2016-04-06\",\n      downloads: 56,\n    },\n    {\n      day: \"2016-04-07\",\n      downloads: 47,\n    },\n    {\n      day: \"2016-04-08\",\n      downloads: 54,\n    },\n    {\n      day: \"2016-04-09\",\n      downloads: 8,\n    },\n    {\n      day: \"2016-04-10\",\n      downloads: 28,\n    },\n    {\n      day: \"2016-04-11\",\n      downloads: 88,\n    },\n    {\n      day: \"2016-04-12\",\n      downloads: 59,\n    },\n    {\n      day: \"2016-04-13\",\n      downloads: 73,\n    },\n    {\n      day: \"2016-04-14\",\n      downloads: 141,\n    },\n    {\n      day: \"2016-04-15\",\n      downloads: 222,\n    },\n    {\n      day: \"2016-04-16\",\n      downloads: 20,\n    },\n    {\n      day: \"2016-04-17\",\n      downloads: 11,\n    },\n    {\n      day: \"2016-04-18\",\n      downloads: 126,\n    },\n    {\n      day: \"2016-04-19\",\n      downloads: 160,\n    },\n    {\n      day: \"2016-04-20\",\n      downloads: 110,\n    },\n    {\n      day: \"2016-04-21\",\n      downloads: 80,\n    },\n    {\n      day: \"2016-04-22\",\n      downloads: 54,\n    },\n    {\n      day: \"2016-04-23\",\n      downloads: 39,\n    },\n    {\n      day: \"2016-04-24\",\n      downloads: 3,\n    },\n    {\n      day: \"2016-04-25\",\n      downloads: 59,\n    },\n    {\n      day: \"2016-04-26\",\n      downloads: 94,\n    },\n    {\n      day: \"2016-04-27\",\n      downloads: 61,\n    },\n    {\n      day: \"2016-04-28\",\n      downloads: 96,\n    },\n    {\n      day: \"2016-04-29\",\n      downloads: 64,\n    },\n    {\n      day: \"2016-04-30\",\n      downloads: 40,\n    },\n    {\n      day: \"2016-05-01\",\n      downloads: 9,\n    },\n    {\n      day: \"2016-05-02\",\n      downloads: 67,\n    },\n    {\n      day: \"2016-05-03\",\n      downloads: 145,\n    },\n    {\n      day: \"2016-05-04\",\n      downloads: 155,\n    },\n    {\n      day: \"2016-05-05\",\n      downloads: 102,\n    },\n    {\n      day: \"2016-05-06\",\n      downloads: 56,\n    },\n    {\n      day: \"2016-05-07\",\n      downloads: 34,\n    },\n    {\n      day: \"2016-05-08\",\n      downloads: 10,\n    },\n    {\n      day: \"2016-05-09\",\n      downloads: 65,\n    },\n    {\n      day: \"2016-05-10\",\n      downloads: 79,\n    },\n    {\n      day: \"2016-05-11\",\n      downloads: 79,\n    },\n    {\n      day: \"2016-05-12\",\n      downloads: 82,\n    },\n    {\n      day: \"2016-05-13\",\n      downloads: 231,\n    },\n    {\n      day: \"2016-05-14\",\n      downloads: 47,\n    },\n    {\n      day: \"2016-05-15\",\n      downloads: 40,\n    },\n    {\n      day: \"2016-05-16\",\n      downloads: 116,\n    },\n    {\n      day: \"2016-05-17\",\n      downloads: 180,\n    },\n    {\n      day: \"2016-05-18\",\n      downloads: 127,\n    },\n    {\n      day: \"2016-05-19\",\n      downloads: 145,\n    },\n    {\n      day: \"2016-05-20\",\n      downloads: 150,\n    },\n    {\n      day: \"2016-05-21\",\n      downloads: 44,\n    },\n    {\n      day: \"2016-05-22\",\n      downloads: 20,\n    },\n    {\n      day: \"2016-05-23\",\n      downloads: 90,\n    },\n    {\n      day: \"2016-05-24\",\n      downloads: 109,\n    },\n    {\n      day: \"2016-05-25\",\n      downloads: 105,\n    },\n    {\n      day: \"2016-05-26\",\n      downloads: 123,\n    },\n    {\n      day: \"2016-05-27\",\n      downloads: 161,\n    },\n    {\n      day: \"2016-05-28\",\n      downloads: 33,\n    },\n    {\n      day: \"2016-05-29\",\n      downloads: 20,\n    },\n    {\n      day: \"2016-05-30\",\n      downloads: 133,\n    },\n    {\n      day: \"2016-05-31\",\n      downloads: 148,\n    },\n    {\n      day: \"2016-06-01\",\n      downloads: 117,\n    },\n    {\n      day: \"2016-06-02\",\n      downloads: 347,\n    },\n    {\n      day: \"2016-06-03\",\n      downloads: 175,\n    },\n    {\n      day: \"2016-06-04\",\n      downloads: 44,\n    },\n    {\n      day: \"2016-06-05\",\n      downloads: 34,\n    },\n    {\n      day: \"2016-06-06\",\n      downloads: 188,\n    },\n    {\n      day: \"2016-06-07\",\n      downloads: 240,\n    },\n    {\n      day: \"2016-06-08\",\n      downloads: 252,\n    },\n    {\n      day: \"2016-06-09\",\n      downloads: 199,\n    },\n    {\n      day: \"2016-06-10\",\n      downloads: 138,\n    },\n    {\n      day: \"2016-06-11\",\n      downloads: 85,\n    },\n    {\n      day: \"2016-06-12\",\n      downloads: 106,\n    },\n    {\n      day: \"2016-06-13\",\n      downloads: 222,\n    },\n    {\n      day: \"2016-06-14\",\n      downloads: 187,\n    },\n    {\n      day: \"2016-06-15\",\n      downloads: 234,\n    },\n    {\n      day: \"2016-06-16\",\n      downloads: 212,\n    },\n    {\n      day: \"2016-06-17\",\n      downloads: 314,\n    },\n    {\n      day: \"2016-06-18\",\n      downloads: 76,\n    },\n    {\n      day: \"2016-06-19\",\n      downloads: 13,\n    },\n    {\n      day: \"2016-06-20\",\n      downloads: 171,\n    },\n    {\n      day: \"2016-06-21\",\n      downloads: 213,\n    },\n    {\n      day: \"2016-06-22\",\n      downloads: 360,\n    },\n    {\n      day: \"2016-06-23\",\n      downloads: 185,\n    },\n    {\n      day: \"2016-06-24\",\n      downloads: 144,\n    },\n    {\n      day: \"2016-06-25\",\n      downloads: 22,\n    },\n    {\n      day: \"2016-06-26\",\n      downloads: 25,\n    },\n    {\n      day: \"2016-06-27\",\n      downloads: 207,\n    },\n    {\n      day: \"2016-06-28\",\n      downloads: 575,\n    },\n    {\n      day: \"2016-06-29\",\n      downloads: 362,\n    },\n    {\n      day: \"2016-06-30\",\n      downloads: 358,\n    },\n    {\n      day: \"2016-07-01\",\n      downloads: 397,\n    },\n    {\n      day: \"2016-07-02\",\n      downloads: 33,\n    },\n    {\n      day: \"2016-07-03\",\n      downloads: 31,\n    },\n    {\n      day: \"2016-07-04\",\n      downloads: 96,\n    },\n    {\n      day: \"2016-07-05\",\n      downloads: 151,\n    },\n    {\n      day: \"2016-07-06\",\n      downloads: 315,\n    },\n    {\n      day: \"2016-07-07\",\n      downloads: 270,\n    },\n    {\n      day: \"2016-07-08\",\n      downloads: 213,\n    },\n    {\n      day: \"2016-07-09\",\n      downloads: 40,\n    },\n    {\n      day: \"2016-07-10\",\n      downloads: 24,\n    },\n    {\n      day: \"2016-07-11\",\n      downloads: 224,\n    },\n    {\n      day: \"2016-07-12\",\n      downloads: 199,\n    },\n    {\n      day: \"2016-07-13\",\n      downloads: 262,\n    },\n    {\n      day: \"2016-07-14\",\n      downloads: 287,\n    },\n    {\n      day: \"2016-07-15\",\n      downloads: 163,\n    },\n    {\n      day: \"2016-07-16\",\n      downloads: 47,\n    },\n    {\n      day: \"2016-07-17\",\n      downloads: 9,\n    },\n    {\n      day: \"2016-07-18\",\n      downloads: 173,\n    },\n    {\n      day: \"2016-07-19\",\n      downloads: 177,\n    },\n    {\n      day: \"2016-07-20\",\n      downloads: 321,\n    },\n    {\n      day: \"2016-07-21\",\n      downloads: 265,\n    },\n    {\n      day: \"2016-07-22\",\n      downloads: 104,\n    },\n    {\n      day: \"2016-07-23\",\n      downloads: 21,\n    },\n    {\n      day: \"2016-07-24\",\n      downloads: 26,\n    },\n    {\n      day: \"2016-07-25\",\n      downloads: 127,\n    },\n    {\n      day: \"2016-07-26\",\n      downloads: 172,\n    },\n    {\n      day: \"2016-07-27\",\n      downloads: 239,\n    },\n    {\n      day: \"2016-07-28\",\n      downloads: 196,\n    },\n    {\n      day: \"2016-07-29\",\n      downloads: 318,\n    },\n    {\n      day: \"2016-07-30\",\n      downloads: 25,\n    },\n    {\n      day: \"2016-07-31\",\n      downloads: 16,\n    },\n    {\n      day: \"2016-08-01\",\n      downloads: 383,\n    },\n    {\n      day: \"2016-08-02\",\n      downloads: 194,\n    },\n    {\n      day: \"2016-08-03\",\n      downloads: 418,\n    },\n    {\n      day: \"2016-08-04\",\n      downloads: 438,\n    },\n    {\n      day: \"2016-08-05\",\n      downloads: 385,\n    },\n    {\n      day: \"2016-08-06\",\n      downloads: 46,\n    },\n    {\n      day: \"2016-08-07\",\n      downloads: 29,\n    },\n    {\n      day: \"2016-08-08\",\n      downloads: 225,\n    },\n    {\n      day: \"2016-08-09\",\n      downloads: 241,\n    },\n    {\n      day: \"2016-08-10\",\n      downloads: 179,\n    },\n    {\n      day: \"2016-08-11\",\n      downloads: 146,\n    },\n    {\n      day: \"2016-08-12\",\n      downloads: 193,\n    },\n    {\n      day: \"2016-08-13\",\n      downloads: 62,\n    },\n    {\n      day: \"2016-08-14\",\n      downloads: 24,\n    },\n    {\n      day: \"2016-08-15\",\n      downloads: 217,\n    },\n    {\n      day: \"2016-08-16\",\n      downloads: 327,\n    },\n    {\n      day: \"2016-08-17\",\n      downloads: 317,\n    },\n    {\n      day: \"2016-08-18\",\n      downloads: 197,\n    },\n    {\n      day: \"2016-08-19\",\n      downloads: 420,\n    },\n    {\n      day: \"2016-08-20\",\n      downloads: 47,\n    },\n    {\n      day: \"2016-08-21\",\n      downloads: 25,\n    },\n    {\n      day: \"2016-08-22\",\n      downloads: 260,\n    },\n    {\n      day: \"2016-08-23\",\n      downloads: 321,\n    },\n    {\n      day: \"2016-08-24\",\n      downloads: 223,\n    },\n    {\n      day: \"2016-08-25\",\n      downloads: 237,\n    },\n    {\n      day: \"2016-08-26\",\n      downloads: 302,\n    },\n    {\n      day: \"2016-08-27\",\n      downloads: 33,\n    },\n    {\n      day: \"2016-08-28\",\n      downloads: 57,\n    },\n    {\n      day: \"2016-08-29\",\n      downloads: 294,\n    },\n    {\n      day: \"2016-08-30\",\n      downloads: 324,\n    },\n    {\n      day: \"2016-08-31\",\n      downloads: 283,\n    },\n    {\n      day: \"2016-09-01\",\n      downloads: 203,\n    },\n    {\n      day: \"2016-09-02\",\n      downloads: 237,\n    },\n    {\n      day: \"2016-09-03\",\n      downloads: 51,\n    },\n    {\n      day: \"2016-09-04\",\n      downloads: 26,\n    },\n    {\n      day: \"2016-09-05\",\n      downloads: 154,\n    },\n    {\n      day: \"2016-09-06\",\n      downloads: 230,\n    },\n    {\n      day: \"2016-09-07\",\n      downloads: 315,\n    },\n    {\n      day: \"2016-09-08\",\n      downloads: 248,\n    },\n    {\n      day: \"2016-09-09\",\n      downloads: 394,\n    },\n    {\n      day: \"2016-09-10\",\n      downloads: 35,\n    },\n    {\n      day: \"2016-09-11\",\n      downloads: 48,\n    },\n    {\n      day: \"2016-09-12\",\n      downloads: 188,\n    },\n    {\n      day: \"2016-09-13\",\n      downloads: 303,\n    },\n    {\n      day: \"2016-09-14\",\n      downloads: 270,\n    },\n    {\n      day: \"2016-09-15\",\n      downloads: 555,\n    },\n    {\n      day: \"2016-09-16\",\n      downloads: 256,\n    },\n    {\n      day: \"2016-09-17\",\n      downloads: 43,\n    },\n    {\n      day: \"2016-09-18\",\n      downloads: 38,\n    },\n    {\n      day: \"2016-09-19\",\n      downloads: 215,\n    },\n    {\n      day: \"2016-09-20\",\n      downloads: 235,\n    },\n    {\n      day: \"2016-09-21\",\n      downloads: 298,\n    },\n    {\n      day: \"2016-09-22\",\n      downloads: 277,\n    },\n    {\n      day: \"2016-09-23\",\n      downloads: 306,\n    },\n    {\n      day: \"2016-09-24\",\n      downloads: 31,\n    },\n    {\n      day: \"2016-09-25\",\n      downloads: 32,\n    },\n    {\n      day: \"2016-09-26\",\n      downloads: 225,\n    },\n    {\n      day: \"2016-09-27\",\n      downloads: 321,\n    },\n    {\n      day: \"2016-09-28\",\n      downloads: 275,\n    },\n    {\n      day: \"2016-09-29\",\n      downloads: 411,\n    },\n    {\n      day: \"2016-09-30\",\n      downloads: 641,\n    },\n    {\n      day: \"2016-10-01\",\n      downloads: 48,\n    },\n    {\n      day: \"2016-10-02\",\n      downloads: 36,\n    },\n    {\n      day: \"2016-10-03\",\n      downloads: 252,\n    },\n    {\n      day: \"2016-10-04\",\n      downloads: 349,\n    },\n    {\n      day: \"2016-10-05\",\n      downloads: 303,\n    },\n    {\n      day: \"2016-10-06\",\n      downloads: 415,\n    },\n    {\n      day: \"2016-10-07\",\n      downloads: 293,\n    },\n    {\n      day: \"2016-10-08\",\n      downloads: 47,\n    },\n    {\n      day: \"2016-10-09\",\n      downloads: 48,\n    },\n    {\n      day: \"2016-10-10\",\n      downloads: 232,\n    },\n    {\n      day: \"2016-10-11\",\n      downloads: 263,\n    },\n    {\n      day: \"2016-10-12\",\n      downloads: 331,\n    },\n    {\n      day: \"2016-10-13\",\n      downloads: 379,\n    },\n    {\n      day: \"2016-10-14\",\n      downloads: 654,\n    },\n    {\n      day: \"2016-10-15\",\n      downloads: 89,\n    },\n    {\n      day: \"2016-10-16\",\n      downloads: 57,\n    },\n    {\n      day: \"2016-10-17\",\n      downloads: 581,\n    },\n    {\n      day: \"2016-10-18\",\n      downloads: 379,\n    },\n    {\n      day: \"2016-10-19\",\n      downloads: 340,\n    },\n    {\n      day: \"2016-10-20\",\n      downloads: 342,\n    },\n    {\n      day: \"2016-10-21\",\n      downloads: 431,\n    },\n    {\n      day: \"2016-10-22\",\n      downloads: 94,\n    },\n    {\n      day: \"2016-10-23\",\n      downloads: 100,\n    },\n    {\n      day: \"2016-10-24\",\n      downloads: 444,\n    },\n    {\n      day: \"2016-10-25\",\n      downloads: 523,\n    },\n    {\n      day: \"2016-10-26\",\n      downloads: 635,\n    },\n    {\n      day: \"2016-10-27\",\n      downloads: 487,\n    },\n    {\n      day: \"2016-10-28\",\n      downloads: 669,\n    },\n    {\n      day: \"2016-10-29\",\n      downloads: 117,\n    },\n    {\n      day: \"2016-10-30\",\n      downloads: 123,\n    },\n    {\n      day: \"2016-10-31\",\n      downloads: 643,\n    },\n    {\n      day: \"2016-11-01\",\n      downloads: 578,\n    },\n    {\n      day: \"2016-11-02\",\n      downloads: 504,\n    },\n    {\n      day: \"2016-11-03\",\n      downloads: 431,\n    },\n    {\n      day: \"2016-11-04\",\n      downloads: 389,\n    },\n    {\n      day: \"2016-11-05\",\n      downloads: 92,\n    },\n    {\n      day: \"2016-11-06\",\n      downloads: 70,\n    },\n    {\n      day: \"2016-11-07\",\n      downloads: 283,\n    },\n    {\n      day: \"2016-11-08\",\n      downloads: 408,\n    },\n    {\n      day: \"2016-11-09\",\n      downloads: 720,\n    },\n    {\n      day: \"2016-11-10\",\n      downloads: 712,\n    },\n    {\n      day: \"2016-11-11\",\n      downloads: 701,\n    },\n    {\n      day: \"2016-11-12\",\n      downloads: 190,\n    },\n    {\n      day: \"2016-11-13\",\n      downloads: 135,\n    },\n    {\n      day: \"2016-11-14\",\n      downloads: 521,\n    },\n    {\n      day: \"2016-11-15\",\n      downloads: 562,\n    },\n    {\n      day: \"2016-11-16\",\n      downloads: 491,\n    },\n    {\n      day: \"2016-11-17\",\n      downloads: 619,\n    },\n    {\n      day: \"2016-11-18\",\n      downloads: 443,\n    },\n    {\n      day: \"2016-11-19\",\n      downloads: 168,\n    },\n    {\n      day: \"2016-11-20\",\n      downloads: 88,\n    },\n    {\n      day: \"2016-11-21\",\n      downloads: 388,\n    },\n    {\n      day: \"2016-11-22\",\n      downloads: 542,\n    },\n    {\n      day: \"2016-11-23\",\n      downloads: 504,\n    },\n    {\n      day: \"2016-11-24\",\n      downloads: 275,\n    },\n    {\n      day: \"2016-11-25\",\n      downloads: 197,\n    },\n    {\n      day: \"2016-11-26\",\n      downloads: 55,\n    },\n    {\n      day: \"2016-11-27\",\n      downloads: 50,\n    },\n    {\n      day: \"2016-11-28\",\n      downloads: 493,\n    },\n    {\n      day: \"2016-11-29\",\n      downloads: 642,\n    },\n    {\n      day: \"2016-11-30\",\n      downloads: 498,\n    },\n    {\n      day: \"2016-12-01\",\n      downloads: 472,\n    },\n    {\n      day: \"2016-12-02\",\n      downloads: 556,\n    },\n    {\n      day: \"2016-12-03\",\n      downloads: 265,\n    },\n    {\n      day: \"2016-12-04\",\n      downloads: 117,\n    },\n    {\n      day: \"2016-12-05\",\n      downloads: 527,\n    },\n    {\n      day: \"2016-12-06\",\n      downloads: 667,\n    },\n    {\n      day: \"2016-12-07\",\n      downloads: 601,\n    },\n    {\n      day: \"2016-12-08\",\n      downloads: 629,\n    },\n    {\n      day: \"2016-12-09\",\n      downloads: 689,\n    },\n    {\n      day: \"2016-12-10\",\n      downloads: 139,\n    },\n    {\n      day: \"2016-12-11\",\n      downloads: 80,\n    },\n    {\n      day: \"2016-12-12\",\n      downloads: 746,\n    },\n    {\n      day: \"2016-12-13\",\n      downloads: 843,\n    },\n    {\n      day: \"2016-12-14\",\n      downloads: 1045,\n    },\n    {\n      day: \"2016-12-15\",\n      downloads: 681,\n    },\n    {\n      day: \"2016-12-16\",\n      downloads: 671,\n    },\n    {\n      day: \"2016-12-17\",\n      downloads: 167,\n    },\n    {\n      day: \"2016-12-18\",\n      downloads: 108,\n    },\n    {\n      day: \"2016-12-19\",\n      downloads: 593,\n    },\n    {\n      day: \"2016-12-20\",\n      downloads: 697,\n    },\n    {\n      day: \"2016-12-21\",\n      downloads: 641,\n    },\n    {\n      day: \"2016-12-22\",\n      downloads: 645,\n    },\n    {\n      day: \"2016-12-23\",\n      downloads: 341,\n    },\n    {\n      day: \"2016-12-24\",\n      downloads: 77,\n    },\n    {\n      day: \"2016-12-25\",\n      downloads: 52,\n    },\n    {\n      day: \"2016-12-26\",\n      downloads: 151,\n    },\n    {\n      day: \"2016-12-27\",\n      downloads: 287,\n    },\n    {\n      day: \"2016-12-28\",\n      downloads: 294,\n    },\n    {\n      day: \"2016-12-29\",\n      downloads: 297,\n    },\n    {\n      day: \"2016-12-30\",\n      downloads: 163,\n    },\n    {\n      day: \"2016-12-31\",\n      downloads: 39,\n    },\n    {\n      day: \"2017-01-01\",\n      downloads: 70,\n    },\n    {\n      day: \"2017-01-02\",\n      downloads: 178,\n    },\n    {\n      day: \"2017-01-03\",\n      downloads: 475,\n    },\n    {\n      day: \"2017-01-04\",\n      downloads: 1037,\n    },\n    {\n      day: \"2017-01-05\",\n      downloads: 744,\n    },\n    {\n      day: \"2017-01-06\",\n      downloads: 681,\n    },\n    {\n      day: \"2017-01-07\",\n      downloads: 162,\n    },\n    {\n      day: \"2017-01-08\",\n      downloads: 109,\n    },\n    {\n      day: \"2017-01-09\",\n      downloads: 583,\n    },\n    {\n      day: \"2017-01-10\",\n      downloads: 718,\n    },\n    {\n      day: \"2017-01-11\",\n      downloads: 840,\n    },\n    {\n      day: \"2017-01-12\",\n      downloads: 730,\n    },\n    {\n      day: \"2017-01-13\",\n      downloads: 653,\n    },\n    {\n      day: \"2017-01-14\",\n      downloads: 410,\n    },\n    {\n      day: \"2017-01-15\",\n      downloads: 185,\n    },\n    {\n      day: \"2017-01-16\",\n      downloads: 450,\n    },\n    {\n      day: \"2017-01-17\",\n      downloads: 588,\n    },\n    {\n      day: \"2017-01-18\",\n      downloads: 786,\n    },\n    {\n      day: \"2017-01-19\",\n      downloads: 692,\n    },\n    {\n      day: \"2017-01-20\",\n      downloads: 648,\n    },\n    {\n      day: \"2017-01-21\",\n      downloads: 159,\n    },\n    {\n      day: \"2017-01-22\",\n      downloads: 114,\n    },\n    {\n      day: \"2017-01-23\",\n      downloads: 512,\n    },\n    {\n      day: \"2017-01-24\",\n      downloads: 1197,\n    },\n    {\n      day: \"2017-01-25\",\n      downloads: 731,\n    },\n    {\n      day: \"2017-01-26\",\n      downloads: 770,\n    },\n    {\n      day: \"2017-01-27\",\n      downloads: 679,\n    },\n    {\n      day: \"2017-01-28\",\n      downloads: 146,\n    },\n    {\n      day: \"2017-01-29\",\n      downloads: 155,\n    },\n    {\n      day: \"2017-01-30\",\n      downloads: 592,\n    },\n    {\n      day: \"2017-01-31\",\n      downloads: 1095,\n    },\n    {\n      day: \"2017-02-01\",\n      downloads: 775,\n    },\n    {\n      day: \"2017-02-02\",\n      downloads: 658,\n    },\n    {\n      day: \"2017-02-03\",\n      downloads: 670,\n    },\n    {\n      day: \"2017-02-04\",\n      downloads: 634,\n    },\n    {\n      day: \"2017-02-05\",\n      downloads: 110,\n    },\n    {\n      day: \"2017-02-06\",\n      downloads: 1141,\n    },\n    {\n      day: \"2017-02-07\",\n      downloads: 698,\n    },\n    {\n      day: \"2017-02-08\",\n      downloads: 833,\n    },\n    {\n      day: \"2017-02-09\",\n      downloads: 830,\n    },\n    {\n      day: \"2017-02-10\",\n      downloads: 1215,\n    },\n    {\n      day: \"2017-02-11\",\n      downloads: 120,\n    },\n    {\n      day: \"2017-02-12\",\n      downloads: 103,\n    },\n    {\n      day: \"2017-02-13\",\n      downloads: 724,\n    },\n    {\n      day: \"2017-02-14\",\n      downloads: 738,\n    },\n    {\n      day: \"2017-02-15\",\n      downloads: 686,\n    },\n    {\n      day: \"2017-02-16\",\n      downloads: 708,\n    },\n    {\n      day: \"2017-02-17\",\n      downloads: 1054,\n    },\n    {\n      day: \"2017-02-18\",\n      downloads: 154,\n    },\n    {\n      day: \"2017-02-19\",\n      downloads: 108,\n    },\n    {\n      day: \"2017-02-20\",\n      downloads: 540,\n    },\n    {\n      day: \"2017-02-21\",\n      downloads: 782,\n    },\n    {\n      day: \"2017-02-22\",\n      downloads: 899,\n    },\n    {\n      day: \"2017-02-23\",\n      downloads: 928,\n    },\n    {\n      day: \"2017-02-24\",\n      downloads: 925,\n    },\n    {\n      day: \"2017-02-25\",\n      downloads: 155,\n    },\n    {\n      day: \"2017-02-26\",\n      downloads: 163,\n    },\n    {\n      day: \"2017-02-27\",\n      downloads: 1259,\n    },\n    {\n      day: \"2017-02-28\",\n      downloads: 725,\n    },\n    {\n      day: \"2017-03-01\",\n      downloads: 848,\n    },\n    {\n      day: \"2017-03-02\",\n      downloads: 724,\n    },\n    {\n      day: \"2017-03-03\",\n      downloads: 859,\n    },\n    {\n      day: \"2017-03-04\",\n      downloads: 213,\n    },\n    {\n      day: \"2017-03-05\",\n      downloads: 149,\n    },\n    {\n      day: \"2017-03-06\",\n      downloads: 836,\n    },\n    {\n      day: \"2017-03-07\",\n      downloads: 861,\n    },\n    {\n      day: \"2017-03-08\",\n      downloads: 1001,\n    },\n    {\n      day: \"2017-03-09\",\n      downloads: 1027,\n    },\n    {\n      day: \"2017-03-10\",\n      downloads: 969,\n    },\n    {\n      day: \"2017-03-11\",\n      downloads: 157,\n    },\n    {\n      day: \"2017-03-12\",\n      downloads: 142,\n    },\n    {\n      day: \"2017-03-13\",\n      downloads: 987,\n    },\n    {\n      day: \"2017-03-14\",\n      downloads: 937,\n    },\n    {\n      day: \"2017-03-15\",\n      downloads: 1350,\n    },\n    {\n      day: \"2017-03-16\",\n      downloads: 1318,\n    },\n    {\n      day: \"2017-03-17\",\n      downloads: 767,\n    },\n    {\n      day: \"2017-03-18\",\n      downloads: 159,\n    },\n    {\n      day: \"2017-03-19\",\n      downloads: 102,\n    },\n    {\n      day: \"2017-03-20\",\n      downloads: 991,\n    },\n    {\n      day: \"2017-03-21\",\n      downloads: 1489,\n    },\n    {\n      day: \"2017-03-22\",\n      downloads: 1040,\n    },\n    {\n      day: \"2017-03-23\",\n      downloads: 964,\n    },\n    {\n      day: \"2017-03-24\",\n      downloads: 1036,\n    },\n    {\n      day: \"2017-03-25\",\n      downloads: 138,\n    },\n    {\n      day: \"2017-03-26\",\n      downloads: 167,\n    },\n    {\n      day: \"2017-03-27\",\n      downloads: 1207,\n    },\n    {\n      day: \"2017-03-28\",\n      downloads: 1466,\n    },\n    {\n      day: \"2017-03-29\",\n      downloads: 1264,\n    },\n    {\n      day: \"2017-03-30\",\n      downloads: 1037,\n    },\n    {\n      day: \"2017-03-31\",\n      downloads: 1252,\n    },\n    {\n      day: \"2017-04-01\",\n      downloads: 127,\n    },\n    {\n      day: \"2017-04-02\",\n      downloads: 200,\n    },\n    {\n      day: \"2017-04-03\",\n      downloads: 1140,\n    },\n    {\n      day: \"2017-04-04\",\n      downloads: 1600,\n    },\n    {\n      day: \"2017-04-05\",\n      downloads: 1399,\n    },\n    {\n      day: \"2017-04-06\",\n      downloads: 1366,\n    },\n    {\n      day: \"2017-04-07\",\n      downloads: 1307,\n    },\n    {\n      day: \"2017-04-08\",\n      downloads: 263,\n    },\n    {\n      day: \"2017-04-09\",\n      downloads: 153,\n    },\n    {\n      day: \"2017-04-10\",\n      downloads: 1338,\n    },\n    {\n      day: \"2017-04-11\",\n      downloads: 1406,\n    },\n    {\n      day: \"2017-04-12\",\n      downloads: 1181,\n    },\n    {\n      day: \"2017-04-13\",\n      downloads: 1252,\n    },\n    {\n      day: \"2017-04-14\",\n      downloads: 843,\n    },\n    {\n      day: \"2017-04-15\",\n      downloads: 172,\n    },\n    {\n      day: \"2017-04-16\",\n      downloads: 121,\n    },\n    {\n      day: \"2017-04-17\",\n      downloads: 836,\n    },\n    {\n      day: \"2017-04-18\",\n      downloads: 1226,\n    },\n    {\n      day: \"2017-04-19\",\n      downloads: 1317,\n    },\n    {\n      day: \"2017-04-20\",\n      downloads: 1497,\n    },\n    {\n      day: \"2017-04-21\",\n      downloads: 1208,\n    },\n    {\n      day: \"2017-04-22\",\n      downloads: 162,\n    },\n    {\n      day: \"2017-04-23\",\n      downloads: 126,\n    },\n    {\n      day: \"2017-04-24\",\n      downloads: 1339,\n    },\n    {\n      day: \"2017-04-25\",\n      downloads: 1510,\n    },\n    {\n      day: \"2017-04-26\",\n      downloads: 1417,\n    },\n    {\n      day: \"2017-04-27\",\n      downloads: 1323,\n    },\n    {\n      day: \"2017-04-28\",\n      downloads: 1970,\n    },\n    {\n      day: \"2017-04-29\",\n      downloads: 212,\n    },\n    {\n      day: \"2017-04-30\",\n      downloads: 180,\n    },\n    {\n      day: \"2017-05-01\",\n      downloads: 667,\n    },\n    {\n      day: \"2017-05-02\",\n      downloads: 1698,\n    },\n    {\n      day: \"2017-05-03\",\n      downloads: 1126,\n    },\n    {\n      day: \"2017-05-04\",\n      downloads: 1274,\n    },\n    {\n      day: \"2017-05-05\",\n      downloads: 1142,\n    },\n    {\n      day: \"2017-05-06\",\n      downloads: 179,\n    },\n    {\n      day: \"2017-05-07\",\n      downloads: 147,\n    },\n    {\n      day: \"2017-05-08\",\n      downloads: 1097,\n    },\n    {\n      day: \"2017-05-09\",\n      downloads: 1207,\n    },\n    {\n      day: \"2017-05-10\",\n      downloads: 1334,\n    },\n    {\n      day: \"2017-05-11\",\n      downloads: 1183,\n    },\n    {\n      day: \"2017-05-12\",\n      downloads: 1344,\n    },\n    {\n      day: \"2017-05-13\",\n      downloads: 232,\n    },\n    {\n      day: \"2017-05-14\",\n      downloads: 208,\n    },\n    {\n      day: \"2017-05-15\",\n      downloads: 976,\n    },\n    {\n      day: \"2017-05-16\",\n      downloads: 1078,\n    },\n    {\n      day: \"2017-05-17\",\n      downloads: 1033,\n    },\n    {\n      day: \"2017-05-18\",\n      downloads: 1257,\n    },\n    {\n      day: \"2017-05-19\",\n      downloads: 1069,\n    },\n    {\n      day: \"2017-05-20\",\n      downloads: 178,\n    },\n    {\n      day: \"2017-05-21\",\n      downloads: 112,\n    },\n    {\n      day: \"2017-05-22\",\n      downloads: 1036,\n    },\n    {\n      day: \"2017-05-23\",\n      downloads: 1084,\n    },\n    {\n      day: \"2017-05-24\",\n      downloads: 1646,\n    },\n    {\n      day: \"2017-05-25\",\n      downloads: 899,\n    },\n    {\n      day: \"2017-05-26\",\n      downloads: 1028,\n    },\n    {\n      day: \"2017-05-27\",\n      downloads: 293,\n    },\n    {\n      day: \"2017-05-28\",\n      downloads: 163,\n    },\n    {\n      day: \"2017-05-29\",\n      downloads: 619,\n    },\n    {\n      day: \"2017-05-30\",\n      downloads: 1051,\n    },\n    {\n      day: \"2017-05-31\",\n      downloads: 1318,\n    },\n    {\n      day: \"2017-06-01\",\n      downloads: 1195,\n    },\n    {\n      day: \"2017-06-02\",\n      downloads: 862,\n    },\n    {\n      day: \"2017-06-03\",\n      downloads: 903,\n    },\n    {\n      day: \"2017-06-04\",\n      downloads: 151,\n    },\n    {\n      day: \"2017-06-05\",\n      downloads: 872,\n    },\n    {\n      day: \"2017-06-06\",\n      downloads: 1710,\n    },\n    {\n      day: \"2017-06-07\",\n      downloads: 1504,\n    },\n    {\n      day: \"2017-06-08\",\n      downloads: 1267,\n    },\n    {\n      day: \"2017-06-09\",\n      downloads: 1169,\n    },\n    {\n      day: \"2017-06-10\",\n      downloads: 375,\n    },\n    {\n      day: \"2017-06-11\",\n      downloads: 190,\n    },\n    {\n      day: \"2017-06-12\",\n      downloads: 1035,\n    },\n    {\n      day: \"2017-06-13\",\n      downloads: 1254,\n    },\n    {\n      day: \"2017-06-14\",\n      downloads: 1236,\n    },\n    {\n      day: \"2017-06-15\",\n      downloads: 926,\n    },\n    {\n      day: \"2017-06-16\",\n      downloads: 1010,\n    },\n    {\n      day: \"2017-06-17\",\n      downloads: 217,\n    },\n    {\n      day: \"2017-06-18\",\n      downloads: 125,\n    },\n    {\n      day: \"2017-06-19\",\n      downloads: 1088,\n    },\n    {\n      day: \"2017-06-20\",\n      downloads: 1174,\n    },\n    {\n      day: \"2017-06-21\",\n      downloads: 1328,\n    },\n    {\n      day: \"2017-06-22\",\n      downloads: 1264,\n    },\n    {\n      day: \"2017-06-23\",\n      downloads: 1075,\n    },\n    {\n      day: \"2017-06-24\",\n      downloads: 271,\n    },\n    {\n      day: \"2017-06-25\",\n      downloads: 174,\n    },\n    {\n      day: \"2017-06-26\",\n      downloads: 1251,\n    },\n    {\n      day: \"2017-06-27\",\n      downloads: 1298,\n    },\n    {\n      day: \"2017-06-28\",\n      downloads: 1331,\n    },\n    {\n      day: \"2017-06-29\",\n      downloads: 1214,\n    },\n    {\n      day: \"2017-06-30\",\n      downloads: 1689,\n    },\n    {\n      day: \"2017-07-01\",\n      downloads: 212,\n    },\n    {\n      day: \"2017-07-02\",\n      downloads: 170,\n    },\n    {\n      day: \"2017-07-03\",\n      downloads: 819,\n    },\n    {\n      day: \"2017-07-04\",\n      downloads: 702,\n    },\n    {\n      day: \"2017-07-05\",\n      downloads: 1315,\n    },\n    {\n      day: \"2017-07-06\",\n      downloads: 1531,\n    },\n    {\n      day: \"2017-07-07\",\n      downloads: 1256,\n    },\n    {\n      day: \"2017-07-08\",\n      downloads: 230,\n    },\n    {\n      day: \"2017-07-09\",\n      downloads: 221,\n    },\n    {\n      day: \"2017-07-10\",\n      downloads: 1287,\n    },\n    {\n      day: \"2017-07-11\",\n      downloads: 1202,\n    },\n    {\n      day: \"2017-07-12\",\n      downloads: 1295,\n    },\n    {\n      day: \"2017-07-13\",\n      downloads: 2118,\n    },\n    {\n      day: \"2017-07-14\",\n      downloads: 1447,\n    },\n    {\n      day: \"2017-07-15\",\n      downloads: 348,\n    },\n    {\n      day: \"2017-07-16\",\n      downloads: 273,\n    },\n    {\n      day: \"2017-07-17\",\n      downloads: 1294,\n    },\n    {\n      day: \"2017-07-18\",\n      downloads: 1396,\n    },\n    {\n      day: \"2017-07-19\",\n      downloads: 1509,\n    },\n    {\n      day: \"2017-07-20\",\n      downloads: 1332,\n    },\n    {\n      day: \"2017-07-21\",\n      downloads: 1275,\n    },\n    {\n      day: \"2017-07-22\",\n      downloads: 216,\n    },\n    {\n      day: \"2017-07-23\",\n      downloads: 202,\n    },\n    {\n      day: \"2017-07-24\",\n      downloads: 2073,\n    },\n    {\n      day: \"2017-07-25\",\n      downloads: 1470,\n    },\n    {\n      day: \"2017-07-26\",\n      downloads: 1429,\n    },\n    {\n      day: \"2017-07-27\",\n      downloads: 1474,\n    },\n    {\n      day: \"2017-07-28\",\n      downloads: 1265,\n    },\n    {\n      day: \"2017-07-29\",\n      downloads: 196,\n    },\n    {\n      day: \"2017-07-30\",\n      downloads: 194,\n    },\n    {\n      day: \"2017-07-31\",\n      downloads: 1168,\n    },\n    {\n      day: \"2017-08-01\",\n      downloads: 1413,\n    },\n    {\n      day: \"2017-08-02\",\n      downloads: 1578,\n    },\n    {\n      day: \"2017-08-03\",\n      downloads: 1459,\n    },\n    {\n      day: \"2017-08-04\",\n      downloads: 1847,\n    },\n    {\n      day: \"2017-08-05\",\n      downloads: 581,\n    },\n    {\n      day: \"2017-08-06\",\n      downloads: 302,\n    },\n    {\n      day: \"2017-08-07\",\n      downloads: 1464,\n    },\n    {\n      day: \"2017-08-08\",\n      downloads: 2344,\n    },\n    {\n      day: \"2017-08-09\",\n      downloads: 1595,\n    },\n    {\n      day: \"2017-08-10\",\n      downloads: 1441,\n    },\n    {\n      day: \"2017-08-11\",\n      downloads: 1446,\n    },\n    {\n      day: \"2017-08-12\",\n      downloads: 323,\n    },\n    {\n      day: \"2017-08-13\",\n      downloads: 200,\n    },\n    {\n      day: \"2017-08-14\",\n      downloads: 1461,\n    },\n    {\n      day: \"2017-08-15\",\n      downloads: 1558,\n    },\n    {\n      day: \"2017-08-16\",\n      downloads: 1649,\n    },\n    {\n      day: \"2017-08-17\",\n      downloads: 2539,\n    },\n    {\n      day: \"2017-08-18\",\n      downloads: 1570,\n    },\n    {\n      day: \"2017-08-19\",\n      downloads: 318,\n    },\n    {\n      day: \"2017-08-20\",\n      downloads: 959,\n    },\n    {\n      day: \"2017-08-21\",\n      downloads: 1389,\n    },\n    {\n      day: \"2017-08-22\",\n      downloads: 1609,\n    },\n    {\n      day: \"2017-08-23\",\n      downloads: 1585,\n    },\n    {\n      day: \"2017-08-24\",\n      downloads: 1752,\n    },\n    {\n      day: \"2017-08-25\",\n      downloads: 1426,\n    },\n    {\n      day: \"2017-08-26\",\n      downloads: 292,\n    },\n    {\n      day: \"2017-08-27\",\n      downloads: 232,\n    },\n    {\n      day: \"2017-08-28\",\n      downloads: 1431,\n    },\n    {\n      day: \"2017-08-29\",\n      downloads: 1767,\n    },\n    {\n      day: \"2017-08-30\",\n      downloads: 1554,\n    },\n    {\n      day: \"2017-08-31\",\n      downloads: 1702,\n    },\n    {\n      day: \"2017-09-01\",\n      downloads: 1430,\n    },\n    {\n      day: \"2017-09-02\",\n      downloads: 225,\n    },\n    {\n      day: \"2017-09-03\",\n      downloads: 239,\n    },\n    {\n      day: \"2017-09-04\",\n      downloads: 865,\n    },\n    {\n      day: \"2017-09-05\",\n      downloads: 2541,\n    },\n    {\n      day: \"2017-09-06\",\n      downloads: 1884,\n    },\n    {\n      day: \"2017-09-07\",\n      downloads: 1536,\n    },\n    {\n      day: \"2017-09-08\",\n      downloads: 1414,\n    },\n    {\n      day: \"2017-09-09\",\n      downloads: 847,\n    },\n    {\n      day: \"2017-09-10\",\n      downloads: 790,\n    },\n    {\n      day: \"2017-09-11\",\n      downloads: 1669,\n    },\n    {\n      day: \"2017-09-12\",\n      downloads: 2323,\n    },\n    {\n      day: \"2017-09-13\",\n      downloads: 2511,\n    },\n    {\n      day: \"2017-09-14\",\n      downloads: 2041,\n    },\n    {\n      day: \"2017-09-15\",\n      downloads: 1738,\n    },\n    {\n      day: \"2017-09-16\",\n      downloads: 408,\n    },\n    {\n      day: \"2017-09-17\",\n      downloads: 303,\n    },\n    {\n      day: \"2017-09-18\",\n      downloads: 1606,\n    },\n    {\n      day: \"2017-09-19\",\n      downloads: 1852,\n    },\n    {\n      day: \"2017-09-20\",\n      downloads: 1878,\n    },\n    {\n      day: \"2017-09-21\",\n      downloads: 1826,\n    },\n    {\n      day: \"2017-09-22\",\n      downloads: 1718,\n    },\n    {\n      day: \"2017-09-23\",\n      downloads: 453,\n    },\n    {\n      day: \"2017-09-24\",\n      downloads: 292,\n    },\n    {\n      day: \"2017-09-25\",\n      downloads: 1834,\n    },\n    {\n      day: \"2017-09-26\",\n      downloads: 1886,\n    },\n    {\n      day: \"2017-09-27\",\n      downloads: 2829,\n    },\n    {\n      day: \"2017-09-28\",\n      downloads: 1844,\n    },\n    {\n      day: \"2017-09-29\",\n      downloads: 1828,\n    },\n    {\n      day: \"2017-09-30\",\n      downloads: 1208,\n    },\n    {\n      day: \"2017-10-01\",\n      downloads: 433,\n    },\n    {\n      day: \"2017-10-02\",\n      downloads: 1781,\n    },\n    {\n      day: \"2017-10-03\",\n      downloads: 1822,\n    },\n    {\n      day: \"2017-10-04\",\n      downloads: 2050,\n    },\n    {\n      day: \"2017-10-05\",\n      downloads: 2734,\n    },\n    {\n      day: \"2017-10-06\",\n      downloads: 1741,\n    },\n    {\n      day: \"2017-10-07\",\n      downloads: 469,\n    },\n    {\n      day: \"2017-10-08\",\n      downloads: 571,\n    },\n    {\n      day: \"2017-10-09\",\n      downloads: 1524,\n    },\n    {\n      day: \"2017-10-10\",\n      downloads: 1785,\n    },\n    {\n      day: \"2017-10-11\",\n      downloads: 1945,\n    },\n    {\n      day: \"2017-10-12\",\n      downloads: 1611,\n    },\n    {\n      day: \"2017-10-13\",\n      downloads: 1644,\n    },\n    {\n      day: \"2017-10-14\",\n      downloads: 326,\n    },\n    {\n      day: \"2017-10-15\",\n      downloads: 344,\n    },\n    {\n      day: \"2017-10-16\",\n      downloads: 1639,\n    },\n    {\n      day: \"2017-10-17\",\n      downloads: 1948,\n    },\n    {\n      day: \"2017-10-18\",\n      downloads: 2073,\n    },\n    {\n      day: \"2017-10-19\",\n      downloads: 1658,\n    },\n    {\n      day: \"2017-10-20\",\n      downloads: 2751,\n    },\n    {\n      day: \"2017-10-21\",\n      downloads: 1382,\n    },\n    {\n      day: \"2017-10-22\",\n      downloads: 540,\n    },\n    {\n      day: \"2017-10-23\",\n      downloads: 3575,\n    },\n    {\n      day: \"2017-10-24\",\n      downloads: 4549,\n    },\n    {\n      day: \"2017-10-25\",\n      downloads: 6032,\n    },\n    {\n      day: \"2017-10-26\",\n      downloads: 4673,\n    },\n    {\n      day: \"2017-10-27\",\n      downloads: 4633,\n    },\n    {\n      day: \"2017-10-28\",\n      downloads: 881,\n    },\n    {\n      day: \"2017-10-29\",\n      downloads: 601,\n    },\n    {\n      day: \"2017-10-30\",\n      downloads: 3815,\n    },\n    {\n      day: \"2017-10-31\",\n      downloads: 6860,\n    },\n    {\n      day: \"2017-11-01\",\n      downloads: 7947,\n    },\n    {\n      day: \"2017-11-02\",\n      downloads: 5549,\n    },\n    {\n      day: \"2017-11-03\",\n      downloads: 5317,\n    },\n    {\n      day: \"2017-11-04\",\n      downloads: 1301,\n    },\n    {\n      day: \"2017-11-05\",\n      downloads: 872,\n    },\n    {\n      day: \"2017-11-06\",\n      downloads: 5350,\n    },\n    {\n      day: \"2017-11-07\",\n      downloads: 6889,\n    },\n    {\n      day: \"2017-11-08\",\n      downloads: 7629,\n    },\n    {\n      day: \"2017-11-09\",\n      downloads: 6780,\n    },\n    {\n      day: \"2017-11-10\",\n      downloads: 5675,\n    },\n    {\n      day: \"2017-11-11\",\n      downloads: 1371,\n    },\n    {\n      day: \"2017-11-12\",\n      downloads: 707,\n    },\n    {\n      day: \"2017-11-13\",\n      downloads: 3836,\n    },\n    {\n      day: \"2017-11-14\",\n      downloads: 4810,\n    },\n    {\n      day: \"2017-11-15\",\n      downloads: 5942,\n    },\n    {\n      day: \"2017-11-16\",\n      downloads: 6317,\n    },\n    {\n      day: \"2017-11-17\",\n      downloads: 4852,\n    },\n    {\n      day: \"2017-11-18\",\n      downloads: 1204,\n    },\n    {\n      day: \"2017-11-19\",\n      downloads: 546,\n    },\n    {\n      day: \"2017-11-20\",\n      downloads: 4443,\n    },\n    {\n      day: \"2017-11-21\",\n      downloads: 4247,\n    },\n    {\n      day: \"2017-11-22\",\n      downloads: 5021,\n    },\n    {\n      day: \"2017-11-23\",\n      downloads: 1875,\n    },\n    {\n      day: \"2017-11-24\",\n      downloads: 1260,\n    },\n    {\n      day: \"2017-11-25\",\n      downloads: 324,\n    },\n    {\n      day: \"2017-11-26\",\n      downloads: 401,\n    },\n    {\n      day: \"2017-11-27\",\n      downloads: 4427,\n    },\n    {\n      day: \"2017-11-28\",\n      downloads: 6964,\n    },\n    {\n      day: \"2017-11-29\",\n      downloads: 5950,\n    },\n    {\n      day: \"2017-11-30\",\n      downloads: 6022,\n    },\n    {\n      day: \"2017-12-01\",\n      downloads: 5609,\n    },\n    {\n      day: \"2017-12-02\",\n      downloads: 1403,\n    },\n    {\n      day: \"2017-12-03\",\n      downloads: 278,\n    },\n    {\n      day: \"2017-12-04\",\n      downloads: 3381,\n    },\n    {\n      day: \"2017-12-05\",\n      downloads: 5355,\n    },\n    {\n      day: \"2017-12-06\",\n      downloads: 5407,\n    },\n    {\n      day: \"2017-12-07\",\n      downloads: 7059,\n    },\n    {\n      day: \"2017-12-08\",\n      downloads: 5473,\n    },\n    {\n      day: \"2017-12-09\",\n      downloads: 1557,\n    },\n    {\n      day: \"2017-12-10\",\n      downloads: 449,\n    },\n    {\n      day: \"2017-12-11\",\n      downloads: 4219,\n    },\n    {\n      day: \"2017-12-12\",\n      downloads: 7777,\n    },\n    {\n      day: \"2017-12-13\",\n      downloads: 6017,\n    },\n    {\n      day: \"2017-12-14\",\n      downloads: 4769,\n    },\n    {\n      day: \"2017-12-15\",\n      downloads: 4091,\n    },\n    {\n      day: \"2017-12-16\",\n      downloads: 1142,\n    },\n    {\n      day: \"2017-12-17\",\n      downloads: 390,\n    },\n    {\n      day: \"2017-12-18\",\n      downloads: 5491,\n    },\n    {\n      day: \"2017-12-19\",\n      downloads: 4739,\n    },\n    {\n      day: \"2017-12-20\",\n      downloads: 4151,\n    },\n    {\n      day: \"2017-12-21\",\n      downloads: 4487,\n    },\n    {\n      day: \"2017-12-22\",\n      downloads: 3059,\n    },\n    {\n      day: \"2017-12-23\",\n      downloads: 414,\n    },\n    {\n      day: \"2017-12-24\",\n      downloads: 344,\n    },\n    {\n      day: \"2017-12-25\",\n      downloads: 215,\n    },\n    {\n      day: \"2017-12-26\",\n      downloads: 620,\n    },\n    {\n      day: \"2017-12-27\",\n      downloads: 1267,\n    },\n    {\n      day: \"2017-12-28\",\n      downloads: 1134,\n    },\n    {\n      day: \"2017-12-29\",\n      downloads: 884,\n    },\n    {\n      day: \"2017-12-30\",\n      downloads: 266,\n    },\n    {\n      day: \"2017-12-31\",\n      downloads: 187,\n    },\n    {\n      day: \"2018-01-01\",\n      downloads: 211,\n    },\n    {\n      day: \"2018-01-02\",\n      downloads: 1914,\n    },\n    {\n      day: \"2018-01-03\",\n      downloads: 2492,\n    },\n    {\n      day: \"2018-01-04\",\n      downloads: 2596,\n    },\n    {\n      day: \"2018-01-05\",\n      downloads: 2442,\n    },\n    {\n      day: \"2018-01-06\",\n      downloads: 699,\n    },\n    {\n      day: \"2018-01-07\",\n      downloads: 306,\n    },\n    {\n      day: \"2018-01-08\",\n      downloads: 2415,\n    },\n    {\n      day: \"2018-01-09\",\n      downloads: 3682,\n    },\n    {\n      day: \"2018-01-10\",\n      downloads: 2527,\n    },\n    {\n      day: \"2018-01-11\",\n      downloads: 3055,\n    },\n    {\n      day: \"2018-01-12\",\n      downloads: 2940,\n    },\n    {\n      day: \"2018-01-13\",\n      downloads: 727,\n    },\n    {\n      day: \"2018-01-14\",\n      downloads: 362,\n    },\n    {\n      day: \"2018-01-15\",\n      downloads: 2051,\n    },\n    {\n      day: \"2018-01-16\",\n      downloads: 2906,\n    },\n    {\n      day: \"2018-01-17\",\n      downloads: 2859,\n    },\n    {\n      day: \"2018-01-18\",\n      downloads: 3230,\n    },\n    {\n      day: \"2018-01-19\",\n      downloads: 2559,\n    },\n    {\n      day: \"2018-01-20\",\n      downloads: 754,\n    },\n    {\n      day: \"2018-01-21\",\n      downloads: 685,\n    },\n    {\n      day: \"2018-01-22\",\n      downloads: 3913,\n    },\n    {\n      day: \"2018-01-23\",\n      downloads: 6981,\n    },\n    {\n      day: \"2018-01-24\",\n      downloads: 6739,\n    },\n    {\n      day: \"2018-01-25\",\n      downloads: 6194,\n    },\n    {\n      day: \"2018-01-26\",\n      downloads: 5618,\n    },\n    {\n      day: \"2018-01-27\",\n      downloads: 1357,\n    },\n    {\n      day: \"2018-01-28\",\n      downloads: 725,\n    },\n    {\n      day: \"2018-01-29\",\n      downloads: 3855,\n    },\n    {\n      day: \"2018-01-30\",\n      downloads: 6767,\n    },\n    {\n      day: \"2018-01-31\",\n      downloads: 7662,\n    },\n    {\n      day: \"2018-02-01\",\n      downloads: 7036,\n    },\n    {\n      day: \"2018-02-02\",\n      downloads: 6651,\n    },\n    {\n      day: \"2018-02-03\",\n      downloads: 2133,\n    },\n    {\n      day: \"2018-02-04\",\n      downloads: 785,\n    },\n    {\n      day: \"2018-02-05\",\n      downloads: 7072,\n    },\n    {\n      day: \"2018-02-06\",\n      downloads: 8457,\n    },\n    {\n      day: \"2018-02-07\",\n      downloads: 6671,\n    },\n    {\n      day: \"2018-02-08\",\n      downloads: 7440,\n    },\n    {\n      day: \"2018-02-09\",\n      downloads: 4771,\n    },\n    {\n      day: \"2018-02-10\",\n      downloads: 1108,\n    },\n    {\n      day: \"2018-02-11\",\n      downloads: 560,\n    },\n    {\n      day: \"2018-02-12\",\n      downloads: 5410,\n    },\n    {\n      day: \"2018-02-13\",\n      downloads: 6070,\n    },\n    {\n      day: \"2018-02-14\",\n      downloads: 5850,\n    },\n    {\n      day: \"2018-02-15\",\n      downloads: 8512,\n    },\n    {\n      day: \"2018-02-16\",\n      downloads: 5238,\n    },\n    {\n      day: \"2018-02-17\",\n      downloads: 1684,\n    },\n    {\n      day: \"2018-02-18\",\n      downloads: 761,\n    },\n    {\n      day: \"2018-02-19\",\n      downloads: 2615,\n    },\n    {\n      day: \"2018-02-20\",\n      downloads: 4697,\n    },\n    {\n      day: \"2018-02-21\",\n      downloads: 6387,\n    },\n    {\n      day: \"2018-02-22\",\n      downloads: 7082,\n    },\n    {\n      day: \"2018-02-23\",\n      downloads: 5738,\n    },\n    {\n      day: \"2018-02-24\",\n      downloads: 1420,\n    },\n    {\n      day: \"2018-02-25\",\n      downloads: 816,\n    },\n    {\n      day: \"2018-02-26\",\n      downloads: 5244,\n    },\n    {\n      day: \"2018-02-27\",\n      downloads: 6326,\n    },\n    {\n      day: \"2018-02-28\",\n      downloads: 6301,\n    },\n    {\n      day: \"2018-03-01\",\n      downloads: 6620,\n    },\n    {\n      day: \"2018-03-02\",\n      downloads: 6455,\n    },\n    {\n      day: \"2018-03-03\",\n      downloads: 3534,\n    },\n    {\n      day: \"2018-03-04\",\n      downloads: 1809,\n    },\n    {\n      day: \"2018-03-05\",\n      downloads: 4757,\n    },\n    {\n      day: \"2018-03-06\",\n      downloads: 6803,\n    },\n    {\n      day: \"2018-03-07\",\n      downloads: 7059,\n    },\n    {\n      day: \"2018-03-08\",\n      downloads: 6238,\n    },\n    {\n      day: \"2018-03-09\",\n      downloads: 6367,\n    },\n    {\n      day: \"2018-03-10\",\n      downloads: 2295,\n    },\n    {\n      day: \"2018-03-11\",\n      downloads: 1590,\n    },\n    {\n      day: \"2018-03-12\",\n      downloads: 6052,\n    },\n    {\n      day: \"2018-03-13\",\n      downloads: 5488,\n    },\n    {\n      day: \"2018-03-14\",\n      downloads: 7570,\n    },\n    {\n      day: \"2018-03-15\",\n      downloads: 5426,\n    },\n    {\n      day: \"2018-03-16\",\n      downloads: 7156,\n    },\n    {\n      day: \"2018-03-17\",\n      downloads: 1493,\n    },\n    {\n      day: \"2018-03-18\",\n      downloads: 1635,\n    },\n    {\n      day: \"2018-03-19\",\n      downloads: 5708,\n    },\n    {\n      day: \"2018-03-20\",\n      downloads: 8704,\n    },\n    {\n      day: \"2018-03-21\",\n      downloads: 7645,\n    },\n    {\n      day: \"2018-03-22\",\n      downloads: 8335,\n    },\n    {\n      day: \"2018-03-23\",\n      downloads: 5155,\n    },\n    {\n      day: \"2018-03-24\",\n      downloads: 1777,\n    },\n    {\n      day: \"2018-03-25\",\n      downloads: 830,\n    },\n    {\n      day: \"2018-03-26\",\n      downloads: 4850,\n    },\n    {\n      day: \"2018-03-27\",\n      downloads: 8277,\n    },\n    {\n      day: \"2018-03-28\",\n      downloads: 9242,\n    },\n    {\n      day: \"2018-03-29\",\n      downloads: 8332,\n    },\n    {\n      day: \"2018-03-30\",\n      downloads: 6233,\n    },\n    {\n      day: \"2018-03-31\",\n      downloads: 1448,\n    },\n    {\n      day: \"2018-04-01\",\n      downloads: 621,\n    },\n    {\n      day: \"2018-04-02\",\n      downloads: 6229,\n    },\n    {\n      day: \"2018-04-03\",\n      downloads: 8125,\n    },\n    {\n      day: \"2018-04-04\",\n      downloads: 6551,\n    },\n    {\n      day: \"2018-04-05\",\n      downloads: 6030,\n    },\n    {\n      day: \"2018-04-06\",\n      downloads: 6782,\n    },\n    {\n      day: \"2018-04-07\",\n      downloads: 1214,\n    },\n    {\n      day: \"2018-04-08\",\n      downloads: 977,\n    },\n    {\n      day: \"2018-04-09\",\n      downloads: 5590,\n    },\n    {\n      day: \"2018-04-10\",\n      downloads: 7797,\n    },\n    {\n      day: \"2018-04-11\",\n      downloads: 8438,\n    },\n    {\n      day: \"2018-04-12\",\n      downloads: 8590,\n    },\n    {\n      day: \"2018-04-13\",\n      downloads: 7080,\n    },\n    {\n      day: \"2018-04-14\",\n      downloads: 1357,\n    },\n    {\n      day: \"2018-04-15\",\n      downloads: 1039,\n    },\n    {\n      day: \"2018-04-16\",\n      downloads: 5618,\n    },\n    {\n      day: \"2018-04-17\",\n      downloads: 7038,\n    },\n    {\n      day: \"2018-04-18\",\n      downloads: 8400,\n    },\n    {\n      day: \"2018-04-19\",\n      downloads: 8058,\n    },\n    {\n      day: \"2018-04-20\",\n      downloads: 7715,\n    },\n    {\n      day: \"2018-04-21\",\n      downloads: 1704,\n    },\n    {\n      day: \"2018-04-22\",\n      downloads: 1605,\n    },\n    {\n      day: \"2018-04-23\",\n      downloads: 5176,\n    },\n    {\n      day: \"2018-04-24\",\n      downloads: 6399,\n    },\n    {\n      day: \"2018-04-25\",\n      downloads: 6148,\n    },\n    {\n      day: \"2018-04-26\",\n      downloads: 6690,\n    },\n    {\n      day: \"2018-04-27\",\n      downloads: 6312,\n    },\n    {\n      day: \"2018-04-28\",\n      downloads: 1271,\n    },\n    {\n      day: \"2018-04-29\",\n      downloads: 1201,\n    },\n    {\n      day: \"2018-04-30\",\n      downloads: 5597,\n    },\n    {\n      day: \"2018-05-01\",\n      downloads: 4773,\n    },\n    {\n      day: \"2018-05-02\",\n      downloads: 6543,\n    },\n    {\n      day: \"2018-05-03\",\n      downloads: 5549,\n    },\n    {\n      day: \"2018-05-04\",\n      downloads: 5652,\n    },\n    {\n      day: \"2018-05-05\",\n      downloads: 1275,\n    },\n    {\n      day: \"2018-05-06\",\n      downloads: 1243,\n    },\n    {\n      day: \"2018-05-07\",\n      downloads: 4962,\n    },\n    {\n      day: \"2018-05-08\",\n      downloads: 4973,\n    },\n    {\n      day: \"2018-05-09\",\n      downloads: 4023,\n    },\n    {\n      day: \"2018-05-10\",\n      downloads: 3837,\n    },\n    {\n      day: \"2018-05-11\",\n      downloads: 4218,\n    },\n    {\n      day: \"2018-05-12\",\n      downloads: 601,\n    },\n    {\n      day: \"2018-05-13\",\n      downloads: 481,\n    },\n    {\n      day: \"2018-05-14\",\n      downloads: 4296,\n    },\n    {\n      day: \"2018-05-15\",\n      downloads: 4020,\n    },\n    {\n      day: \"2018-05-16\",\n      downloads: 5063,\n    },\n    {\n      day: \"2018-05-17\",\n      downloads: 6956,\n    },\n    {\n      day: \"2018-05-18\",\n      downloads: 8227,\n    },\n    {\n      day: \"2018-05-19\",\n      downloads: 1879,\n    },\n    {\n      day: \"2018-05-20\",\n      downloads: 512,\n    },\n    {\n      day: \"2018-05-21\",\n      downloads: 4724,\n    },\n    {\n      day: \"2018-05-22\",\n      downloads: 4200,\n    },\n    {\n      day: \"2018-05-23\",\n      downloads: 4330,\n    },\n    {\n      day: \"2018-05-24\",\n      downloads: 4172,\n    },\n    {\n      day: \"2018-05-25\",\n      downloads: 2876,\n    },\n    {\n      day: \"2018-05-26\",\n      downloads: 231,\n    },\n    {\n      day: \"2018-05-27\",\n      downloads: 229,\n    },\n    {\n      day: \"2018-05-28\",\n      downloads: 970,\n    },\n    {\n      day: \"2018-05-29\",\n      downloads: 1834,\n    },\n    {\n      day: \"2018-05-30\",\n      downloads: 3401,\n    },\n    {\n      day: \"2018-05-31\",\n      downloads: 3790,\n    },\n    {\n      day: \"2018-06-01\",\n      downloads: 3412,\n    },\n    {\n      day: \"2018-06-02\",\n      downloads: 673,\n    },\n    {\n      day: \"2018-06-03\",\n      downloads: 384,\n    },\n    {\n      day: \"2018-06-04\",\n      downloads: 3588,\n    },\n    {\n      day: \"2018-06-05\",\n      downloads: 3834,\n    },\n    {\n      day: \"2018-06-06\",\n      downloads: 5116,\n    },\n    {\n      day: \"2018-06-07\",\n      downloads: 4671,\n    },\n    {\n      day: \"2018-06-08\",\n      downloads: 3407,\n    },\n    {\n      day: \"2018-06-09\",\n      downloads: 568,\n    },\n    {\n      day: \"2018-06-10\",\n      downloads: 496,\n    },\n    {\n      day: \"2018-06-11\",\n      downloads: 3534,\n    },\n    {\n      day: \"2018-06-12\",\n      downloads: 4143,\n    },\n    {\n      day: \"2018-06-13\",\n      downloads: 3974,\n    },\n    {\n      day: \"2018-06-14\",\n      downloads: 3946,\n    },\n    {\n      day: \"2018-06-15\",\n      downloads: 4943,\n    },\n    {\n      day: \"2018-06-16\",\n      downloads: 579,\n    },\n    {\n      day: \"2018-06-17\",\n      downloads: 474,\n    },\n    {\n      day: \"2018-06-18\",\n      downloads: 5291,\n    },\n    {\n      day: \"2018-06-19\",\n      downloads: 7801,\n    },\n    {\n      day: \"2018-06-20\",\n      downloads: 8307,\n    },\n    {\n      day: \"2018-06-21\",\n      downloads: 7982,\n    },\n    {\n      day: \"2018-06-22\",\n      downloads: 7059,\n    },\n    {\n      day: \"2018-06-23\",\n      downloads: 1115,\n    },\n    {\n      day: \"2018-06-24\",\n      downloads: 1464,\n    },\n    {\n      day: \"2018-06-25\",\n      downloads: 5828,\n    },\n    {\n      day: \"2018-06-26\",\n      downloads: 5157,\n    },\n    {\n      day: \"2018-06-27\",\n      downloads: 4471,\n    },\n    {\n      day: \"2018-06-28\",\n      downloads: 4240,\n    },\n    {\n      day: \"2018-06-29\",\n      downloads: 4926,\n    },\n    {\n      day: \"2018-06-30\",\n      downloads: 1173,\n    },\n    {\n      day: \"2018-07-01\",\n      downloads: 748,\n    },\n    {\n      day: \"2018-07-02\",\n      downloads: 4853,\n    },\n    {\n      day: \"2018-07-03\",\n      downloads: 5808,\n    },\n    {\n      day: \"2018-07-04\",\n      downloads: 2928,\n    },\n    {\n      day: \"2018-07-05\",\n      downloads: 4435,\n    },\n    {\n      day: \"2018-07-06\",\n      downloads: 6149,\n    },\n    {\n      day: \"2018-07-07\",\n      downloads: 1528,\n    },\n    {\n      day: \"2018-07-08\",\n      downloads: 598,\n    },\n    {\n      day: \"2018-07-09\",\n      downloads: 4376,\n    },\n    {\n      day: \"2018-07-10\",\n      downloads: 6020,\n    },\n    {\n      day: \"2018-07-11\",\n      downloads: 5696,\n    },\n    {\n      day: \"2018-07-12\",\n      downloads: 6153,\n    },\n    {\n      day: \"2018-07-13\",\n      downloads: 5077,\n    },\n    {\n      day: \"2018-07-14\",\n      downloads: 927,\n    },\n    {\n      day: \"2018-07-15\",\n      downloads: 448,\n    },\n    {\n      day: \"2018-07-16\",\n      downloads: 4003,\n    },\n    {\n      day: \"2018-07-17\",\n      downloads: 5905,\n    },\n    {\n      day: \"2018-07-18\",\n      downloads: 4686,\n    },\n    {\n      day: \"2018-07-19\",\n      downloads: 4443,\n    },\n    {\n      day: \"2018-07-20\",\n      downloads: 3998,\n    },\n    {\n      day: \"2018-07-21\",\n      downloads: 764,\n    },\n    {\n      day: \"2018-07-22\",\n      downloads: 734,\n    },\n    {\n      day: \"2018-07-23\",\n      downloads: 4390,\n    },\n    {\n      day: \"2018-07-24\",\n      downloads: 4102,\n    },\n    {\n      day: \"2018-07-25\",\n      downloads: 4234,\n    },\n    {\n      day: \"2018-07-26\",\n      downloads: 4099,\n    },\n    {\n      day: \"2018-07-27\",\n      downloads: 3841,\n    },\n    {\n      day: \"2018-07-28\",\n      downloads: 1403,\n    },\n    {\n      day: \"2018-07-29\",\n      downloads: 638,\n    },\n    {\n      day: \"2018-07-30\",\n      downloads: 4199,\n    },\n    {\n      day: \"2018-07-31\",\n      downloads: 4642,\n    },\n    {\n      day: \"2018-08-01\",\n      downloads: 4779,\n    },\n    {\n      day: \"2018-08-02\",\n      downloads: 4474,\n    },\n    {\n      day: \"2018-08-03\",\n      downloads: 3846,\n    },\n    {\n      day: \"2018-08-04\",\n      downloads: 1026,\n    },\n    {\n      day: \"2018-08-05\",\n      downloads: 773,\n    },\n    {\n      day: \"2018-08-06\",\n      downloads: 4880,\n    },\n    {\n      day: \"2018-08-07\",\n      downloads: 4831,\n    },\n    {\n      day: \"2018-08-08\",\n      downloads: 5363,\n    },\n    {\n      day: \"2018-08-09\",\n      downloads: 4851,\n    },\n    {\n      day: \"2018-08-10\",\n      downloads: 4640,\n    },\n    {\n      day: \"2018-08-11\",\n      downloads: 1083,\n    },\n    {\n      day: \"2018-08-12\",\n      downloads: 637,\n    },\n    {\n      day: \"2018-08-13\",\n      downloads: 4592,\n    },\n    {\n      day: \"2018-08-14\",\n      downloads: 4028,\n    },\n    {\n      day: \"2018-08-15\",\n      downloads: 5630,\n    },\n    {\n      day: \"2018-08-16\",\n      downloads: 4496,\n    },\n    {\n      day: \"2018-08-17\",\n      downloads: 4107,\n    },\n    {\n      day: \"2018-08-18\",\n      downloads: 856,\n    },\n    {\n      day: \"2018-08-19\",\n      downloads: 646,\n    },\n    {\n      day: \"2018-08-20\",\n      downloads: 3941,\n    },\n    {\n      day: \"2018-08-21\",\n      downloads: 5415,\n    },\n    {\n      day: \"2018-08-22\",\n      downloads: 4619,\n    },\n    {\n      day: \"2018-08-23\",\n      downloads: 5014,\n    },\n    {\n      day: \"2018-08-24\",\n      downloads: 4721,\n    },\n    {\n      day: \"2018-08-25\",\n      downloads: 1040,\n    },\n    {\n      day: \"2018-08-26\",\n      downloads: 709,\n    },\n    {\n      day: \"2018-08-27\",\n      downloads: 4289,\n    },\n    {\n      day: \"2018-08-28\",\n      downloads: 4826,\n    },\n    {\n      day: \"2018-08-29\",\n      downloads: 4676,\n    },\n    {\n      day: \"2018-08-30\",\n      downloads: 5856,\n    },\n    {\n      day: \"2018-08-31\",\n      downloads: 4563,\n    },\n    {\n      day: \"2018-09-01\",\n      downloads: 642,\n    },\n    {\n      day: \"2018-09-02\",\n      downloads: 782,\n    },\n    {\n      day: \"2018-09-03\",\n      downloads: 2812,\n    },\n    {\n      day: \"2018-09-04\",\n      downloads: 4800,\n    },\n    {\n      day: \"2018-09-05\",\n      downloads: 5509,\n    },\n    {\n      day: \"2018-09-06\",\n      downloads: 5294,\n    },\n    {\n      day: \"2018-09-07\",\n      downloads: 5088,\n    },\n    {\n      day: \"2018-09-08\",\n      downloads: 958,\n    },\n    {\n      day: \"2018-09-09\",\n      downloads: 763,\n    },\n    {\n      day: \"2018-09-10\",\n      downloads: 5647,\n    },\n    {\n      day: \"2018-09-11\",\n      downloads: 5910,\n    },\n    {\n      day: \"2018-09-12\",\n      downloads: 5907,\n    },\n    {\n      day: \"2018-09-13\",\n      downloads: 5246,\n    },\n    {\n      day: \"2018-09-14\",\n      downloads: 4963,\n    },\n    {\n      day: \"2018-09-15\",\n      downloads: 846,\n    },\n    {\n      day: \"2018-09-16\",\n      downloads: 722,\n    },\n    {\n      day: \"2018-09-17\",\n      downloads: 5702,\n    },\n    {\n      day: \"2018-09-18\",\n      downloads: 5422,\n    },\n    {\n      day: \"2018-09-19\",\n      downloads: 5933,\n    },\n    {\n      day: \"2018-09-20\",\n      downloads: 6065,\n    },\n    {\n      day: \"2018-09-21\",\n      downloads: 5221,\n    },\n    {\n      day: \"2018-09-22\",\n      downloads: 1208,\n    },\n    {\n      day: \"2018-09-23\",\n      downloads: 801,\n    },\n    {\n      day: \"2018-09-24\",\n      downloads: 6038,\n    },\n    {\n      day: \"2018-09-25\",\n      downloads: 5705,\n    },\n    {\n      day: \"2018-09-26\",\n      downloads: 7545,\n    },\n    {\n      day: \"2018-09-27\",\n      downloads: 6520,\n    },\n    {\n      day: \"2018-09-28\",\n      downloads: 5598,\n    },\n    {\n      day: \"2018-09-29\",\n      downloads: 820,\n    },\n    {\n      day: \"2018-09-30\",\n      downloads: 641,\n    },\n    {\n      day: \"2018-10-01\",\n      downloads: 5468,\n    },\n    {\n      day: \"2018-10-02\",\n      downloads: 5797,\n    },\n    {\n      day: \"2018-10-03\",\n      downloads: 6581,\n    },\n    {\n      day: \"2018-10-04\",\n      downloads: 6281,\n    },\n    {\n      day: \"2018-10-05\",\n      downloads: 5540,\n    },\n    {\n      day: \"2018-10-06\",\n      downloads: 785,\n    },\n    {\n      day: \"2018-10-07\",\n      downloads: 649,\n    },\n    {\n      day: \"2018-10-08\",\n      downloads: 4604,\n    },\n    {\n      day: \"2018-10-09\",\n      downloads: 5848,\n    },\n    {\n      day: \"2018-10-10\",\n      downloads: 5671,\n    },\n    {\n      day: \"2018-10-11\",\n      downloads: 5870,\n    },\n    {\n      day: \"2018-10-12\",\n      downloads: 5393,\n    },\n    {\n      day: \"2018-10-13\",\n      downloads: 829,\n    },\n    {\n      day: \"2018-10-14\",\n      downloads: 712,\n    },\n    {\n      day: \"2018-10-15\",\n      downloads: 5959,\n    },\n    {\n      day: \"2018-10-16\",\n      downloads: 7536,\n    },\n    {\n      day: \"2018-10-17\",\n      downloads: 5818,\n    },\n    {\n      day: \"2018-10-18\",\n      downloads: 5509,\n    },\n    {\n      day: \"2018-10-19\",\n      downloads: 5347,\n    },\n    {\n      day: \"2018-10-20\",\n      downloads: 845,\n    },\n    {\n      day: \"2018-10-21\",\n      downloads: 787,\n    },\n    {\n      day: \"2018-10-22\",\n      downloads: 4256,\n    },\n    {\n      day: \"2018-10-23\",\n      downloads: 6048,\n    },\n    {\n      day: \"2018-10-24\",\n      downloads: 6198,\n    },\n    {\n      day: \"2018-10-25\",\n      downloads: 6999,\n    },\n    {\n      day: \"2018-10-26\",\n      downloads: 6236,\n    },\n    {\n      day: \"2018-10-27\",\n      downloads: 1408,\n    },\n    {\n      day: \"2018-10-28\",\n      downloads: 909,\n    },\n    {\n      day: \"2018-10-29\",\n      downloads: 4912,\n    },\n    {\n      day: \"2018-10-30\",\n      downloads: 5795,\n    },\n    {\n      day: \"2018-10-31\",\n      downloads: 5548,\n    },\n    {\n      day: \"2018-11-01\",\n      downloads: 5143,\n    },\n    {\n      day: \"2018-11-02\",\n      downloads: 5515,\n    },\n    {\n      day: \"2018-11-03\",\n      downloads: 1330,\n    },\n    {\n      day: \"2018-11-04\",\n      downloads: 1217,\n    },\n    {\n      day: \"2018-11-05\",\n      downloads: 5680,\n    },\n    {\n      day: \"2018-11-06\",\n      downloads: 6727,\n    },\n    {\n      day: \"2018-11-07\",\n      downloads: 6633,\n    },\n    {\n      day: \"2018-11-08\",\n      downloads: 6633,\n    },\n    {\n      day: \"2018-11-09\",\n      downloads: 5769,\n    },\n    {\n      day: \"2018-11-10\",\n      downloads: 1931,\n    },\n    {\n      day: \"2018-11-11\",\n      downloads: 1633,\n    },\n    {\n      day: \"2018-11-12\",\n      downloads: 5538,\n    },\n    {\n      day: \"2018-11-13\",\n      downloads: 6509,\n    },\n    {\n      day: \"2018-11-14\",\n      downloads: 6413,\n    },\n    {\n      day: \"2018-11-15\",\n      downloads: 6038,\n    },\n    {\n      day: \"2018-11-16\",\n      downloads: 5552,\n    },\n    {\n      day: \"2018-11-17\",\n      downloads: 1222,\n    },\n    {\n      day: \"2018-11-18\",\n      downloads: 1671,\n    },\n    {\n      day: \"2018-11-19\",\n      downloads: 6140,\n    },\n    {\n      day: \"2018-11-20\",\n      downloads: 6349,\n    },\n    {\n      day: \"2018-11-21\",\n      downloads: 5798,\n    },\n    {\n      day: \"2018-11-22\",\n      downloads: 3995,\n    },\n    {\n      day: \"2018-11-23\",\n      downloads: 3441,\n    },\n    {\n      day: \"2018-11-24\",\n      downloads: 833,\n    },\n    {\n      day: \"2018-11-25\",\n      downloads: 896,\n    },\n    {\n      day: \"2018-11-26\",\n      downloads: 5919,\n    },\n    {\n      day: \"2018-11-27\",\n      downloads: 6722,\n    },\n    {\n      day: \"2018-11-28\",\n      downloads: 6369,\n    },\n    {\n      day: \"2018-11-29\",\n      downloads: 6378,\n    },\n    {\n      day: \"2018-11-30\",\n      downloads: 5657,\n    },\n    {\n      day: \"2018-12-01\",\n      downloads: 1195,\n    },\n    {\n      day: \"2018-12-02\",\n      downloads: 743,\n    },\n    {\n      day: \"2018-12-03\",\n      downloads: 5467,\n    },\n    {\n      day: \"2018-12-04\",\n      downloads: 5831,\n    },\n    {\n      day: \"2018-12-05\",\n      downloads: 6696,\n    },\n    {\n      day: \"2018-12-06\",\n      downloads: 6108,\n    },\n    {\n      day: \"2018-12-07\",\n      downloads: 5779,\n    },\n    {\n      day: \"2018-12-08\",\n      downloads: 897,\n    },\n    {\n      day: \"2018-12-09\",\n      downloads: 981,\n    },\n    {\n      day: \"2018-12-10\",\n      downloads: 5981,\n    },\n    {\n      day: \"2018-12-11\",\n      downloads: 6610,\n    },\n    {\n      day: \"2018-12-12\",\n      downloads: 7089,\n    },\n    {\n      day: \"2018-12-13\",\n      downloads: 6309,\n    },\n    {\n      day: \"2018-12-14\",\n      downloads: 6113,\n    },\n    {\n      day: \"2018-12-15\",\n      downloads: 1036,\n    },\n    {\n      day: \"2018-12-16\",\n      downloads: 976,\n    },\n    {\n      day: \"2018-12-17\",\n      downloads: 6081,\n    },\n    {\n      day: \"2018-12-18\",\n      downloads: 6544,\n    },\n    {\n      day: \"2018-12-19\",\n      downloads: 6581,\n    },\n    {\n      day: \"2018-12-20\",\n      downloads: 5759,\n    },\n    {\n      day: \"2018-12-21\",\n      downloads: 4976,\n    },\n    {\n      day: \"2018-12-22\",\n      downloads: 768,\n    },\n    {\n      day: \"2018-12-23\",\n      downloads: 357,\n    },\n    {\n      day: \"2018-12-24\",\n      downloads: 1190,\n    },\n    {\n      day: \"2018-12-25\",\n      downloads: 762,\n    },\n    {\n      day: \"2018-12-26\",\n      downloads: 1757,\n    },\n    {\n      day: \"2018-12-27\",\n      downloads: 2710,\n    },\n    {\n      day: \"2018-12-28\",\n      downloads: 2331,\n    },\n    {\n      day: \"2018-12-29\",\n      downloads: 574,\n    },\n    {\n      day: \"2018-12-30\",\n      downloads: 496,\n    },\n    {\n      day: \"2018-12-31\",\n      downloads: 1313,\n    },\n    {\n      day: \"2019-01-01\",\n      downloads: 584,\n    },\n    {\n      day: \"2019-01-02\",\n      downloads: 4097,\n    },\n    {\n      day: \"2019-01-03\",\n      downloads: 5156,\n    },\n    {\n      day: \"2019-01-04\",\n      downloads: 5287,\n    },\n    {\n      day: \"2019-01-05\",\n      downloads: 1550,\n    },\n    {\n      day: \"2019-01-06\",\n      downloads: 770,\n    },\n    {\n      day: \"2019-01-07\",\n      downloads: 6083,\n    },\n    {\n      day: \"2019-01-08\",\n      downloads: 7316,\n    },\n    {\n      day: \"2019-01-09\",\n      downloads: 7361,\n    },\n    {\n      day: \"2019-01-10\",\n      downloads: 6589,\n    },\n    {\n      day: \"2019-01-11\",\n      downloads: 6065,\n    },\n    {\n      day: \"2019-01-12\",\n      downloads: 1234,\n    },\n    {\n      day: \"2019-01-13\",\n      downloads: 777,\n    },\n    {\n      day: \"2019-01-14\",\n      downloads: 6487,\n    },\n    {\n      day: \"2019-01-15\",\n      downloads: 6983,\n    },\n    {\n      day: \"2019-01-16\",\n      downloads: 6797,\n    },\n    {\n      day: \"2019-01-17\",\n      downloads: 6923,\n    },\n    {\n      day: \"2019-01-18\",\n      downloads: 5947,\n    },\n    {\n      day: \"2019-01-19\",\n      downloads: 879,\n    },\n    {\n      day: \"2019-01-20\",\n      downloads: 860,\n    },\n    {\n      day: \"2019-01-21\",\n      downloads: 4918,\n    },\n    {\n      day: \"2019-01-22\",\n      downloads: 6807,\n    },\n    {\n      day: \"2019-01-23\",\n      downloads: 6987,\n    },\n    {\n      day: \"2019-01-24\",\n      downloads: 6859,\n    },\n    {\n      day: \"2019-01-25\",\n      downloads: 6373,\n    },\n    {\n      day: \"2019-01-26\",\n      downloads: 1241,\n    },\n    {\n      day: \"2019-01-27\",\n      downloads: 889,\n    },\n    {\n      day: \"2019-01-28\",\n      downloads: 6736,\n    },\n    {\n      day: \"2019-01-29\",\n      downloads: 8081,\n    },\n    {\n      day: \"2019-01-30\",\n      downloads: 7851,\n    },\n    {\n      day: \"2019-01-31\",\n      downloads: 7930,\n    },\n    {\n      day: \"2019-02-01\",\n      downloads: 6773,\n    },\n    {\n      day: \"2019-02-02\",\n      downloads: 1330,\n    },\n    {\n      day: \"2019-02-03\",\n      downloads: 1024,\n    },\n    {\n      day: \"2019-02-04\",\n      downloads: 6589,\n    },\n    {\n      day: \"2019-02-05\",\n      downloads: 7599,\n    },\n    {\n      day: \"2019-02-06\",\n      downloads: 7433,\n    },\n    {\n      day: \"2019-02-07\",\n      downloads: 7630,\n    },\n    {\n      day: \"2019-02-08\",\n      downloads: 7204,\n    },\n    {\n      day: \"2019-02-09\",\n      downloads: 1285,\n    },\n    {\n      day: \"2019-02-10\",\n      downloads: 1124,\n    },\n    {\n      day: \"2019-02-11\",\n      downloads: 7442,\n    },\n    {\n      day: \"2019-02-12\",\n      downloads: 7828,\n    },\n    {\n      day: \"2019-02-13\",\n      downloads: 7487,\n    },\n    {\n      day: \"2019-02-14\",\n      downloads: 7507,\n    },\n    {\n      day: \"2019-02-15\",\n      downloads: 6875,\n    },\n    {\n      day: \"2019-02-16\",\n      downloads: 1107,\n    },\n    {\n      day: \"2019-02-17\",\n      downloads: 946,\n    },\n    {\n      day: \"2019-02-18\",\n      downloads: 5972,\n    },\n    {\n      day: \"2019-02-19\",\n      downloads: 7389,\n    },\n    {\n      day: \"2019-02-20\",\n      downloads: 8001,\n    },\n    {\n      day: \"2019-02-21\",\n      downloads: 7766,\n    },\n    {\n      day: \"2019-02-22\",\n      downloads: 6721,\n    },\n    {\n      day: \"2019-02-23\",\n      downloads: 1654,\n    },\n    {\n      day: \"2019-02-24\",\n      downloads: 1264,\n    },\n    {\n      day: \"2019-02-25\",\n      downloads: 7087,\n    },\n    {\n      day: \"2019-02-26\",\n      downloads: 8629,\n    },\n    {\n      day: \"2019-02-27\",\n      downloads: 8059,\n    },\n    {\n      day: \"2019-02-28\",\n      downloads: 8784,\n    },\n    {\n      day: \"2019-03-01\",\n      downloads: 6905,\n    },\n    {\n      day: \"2019-03-02\",\n      downloads: 1194,\n    },\n    {\n      day: \"2019-03-03\",\n      downloads: 1099,\n    },\n    {\n      day: \"2019-03-04\",\n      downloads: 6462,\n    },\n    {\n      day: \"2019-03-05\",\n      downloads: 8892,\n    },\n    {\n      day: \"2019-03-06\",\n      downloads: 7016,\n    },\n    {\n      day: \"2019-03-07\",\n      downloads: 6823,\n    },\n    {\n      day: \"2019-03-08\",\n      downloads: 6134,\n    },\n    {\n      day: \"2019-03-09\",\n      downloads: 1166,\n    },\n    {\n      day: \"2019-03-10\",\n      downloads: 982,\n    },\n    {\n      day: \"2019-03-11\",\n      downloads: 7113,\n    },\n    {\n      day: \"2019-03-12\",\n      downloads: 9345,\n    },\n    {\n      day: \"2019-03-13\",\n      downloads: 9061,\n    },\n    {\n      day: \"2019-03-14\",\n      downloads: 8566,\n    },\n    {\n      day: \"2019-03-15\",\n      downloads: 6873,\n    },\n    {\n      day: \"2019-03-16\",\n      downloads: 971,\n    },\n    {\n      day: \"2019-03-17\",\n      downloads: 1145,\n    },\n    {\n      day: \"2019-03-18\",\n      downloads: 4916,\n    },\n    {\n      day: \"2019-03-19\",\n      downloads: 8099,\n    },\n    {\n      day: \"2019-03-20\",\n      downloads: 8327,\n    },\n    {\n      day: \"2019-03-21\",\n      downloads: 7607,\n    },\n    {\n      day: \"2019-03-22\",\n      downloads: 7096,\n    },\n    {\n      day: \"2019-03-23\",\n      downloads: 1247,\n    },\n    {\n      day: \"2019-03-24\",\n      downloads: 1086,\n    },\n    {\n      day: \"2019-03-25\",\n      downloads: 6877,\n    },\n    {\n      day: \"2019-03-26\",\n      downloads: 8001,\n    },\n    {\n      day: \"2019-03-27\",\n      downloads: 7844,\n    },\n    {\n      day: \"2019-03-28\",\n      downloads: 7327,\n    },\n    {\n      day: \"2019-03-29\",\n      downloads: 6237,\n    },\n    {\n      day: \"2019-03-30\",\n      downloads: 1665,\n    },\n    {\n      day: \"2019-03-31\",\n      downloads: 1098,\n    },\n    {\n      day: \"2019-04-01\",\n      downloads: 6794,\n    },\n    {\n      day: \"2019-04-02\",\n      downloads: 8300,\n    },\n    {\n      day: \"2019-04-03\",\n      downloads: 8124,\n    },\n    {\n      day: \"2019-04-04\",\n      downloads: 8019,\n    },\n    {\n      day: \"2019-04-05\",\n      downloads: 6419,\n    },\n    {\n      day: \"2019-04-06\",\n      downloads: 1270,\n    },\n    {\n      day: \"2019-04-07\",\n      downloads: 1027,\n    },\n    {\n      day: \"2019-04-08\",\n      downloads: 7117,\n    },\n    {\n      day: \"2019-04-09\",\n      downloads: 7751,\n    },\n    {\n      day: \"2019-04-10\",\n      downloads: 8231,\n    },\n    {\n      day: \"2019-04-11\",\n      downloads: 8084,\n    },\n    {\n      day: \"2019-04-12\",\n      downloads: 7041,\n    },\n    {\n      day: \"2019-04-13\",\n      downloads: 1296,\n    },\n    {\n      day: \"2019-04-14\",\n      downloads: 1315,\n    },\n    {\n      day: \"2019-04-15\",\n      downloads: 6645,\n    },\n    {\n      day: \"2019-04-16\",\n      downloads: 7763,\n    },\n    {\n      day: \"2019-04-17\",\n      downloads: 8020,\n    },\n    {\n      day: \"2019-04-18\",\n      downloads: 6994,\n    },\n    {\n      day: \"2019-04-19\",\n      downloads: 5056,\n    },\n    {\n      day: \"2019-04-20\",\n      downloads: 1202,\n    },\n    {\n      day: \"2019-04-21\",\n      downloads: 981,\n    },\n    {\n      day: \"2019-04-22\",\n      downloads: 5481,\n    },\n    {\n      day: \"2019-04-23\",\n      downloads: 7451,\n    },\n    {\n      day: \"2019-04-24\",\n      downloads: 7831,\n    },\n    {\n      day: \"2019-04-25\",\n      downloads: 7199,\n    },\n    {\n      day: \"2019-04-26\",\n      downloads: 6931,\n    },\n    {\n      day: \"2019-04-27\",\n      downloads: 1095,\n    },\n    {\n      day: \"2019-04-28\",\n      downloads: 1367,\n    },\n    {\n      day: \"2019-04-29\",\n      downloads: 6950,\n    },\n    {\n      day: \"2019-04-30\",\n      downloads: 7168,\n    },\n    {\n      day: \"2019-05-01\",\n      downloads: 5958,\n    },\n    {\n      day: \"2019-05-02\",\n      downloads: 7437,\n    },\n    {\n      day: \"2019-05-03\",\n      downloads: 7813,\n    },\n    {\n      day: \"2019-05-04\",\n      downloads: 1880,\n    },\n    {\n      day: \"2019-05-05\",\n      downloads: 977,\n    },\n    {\n      day: \"2019-05-06\",\n      downloads: 6387,\n    },\n    {\n      day: \"2019-05-07\",\n      downloads: 7783,\n    },\n    {\n      day: \"2019-05-08\",\n      downloads: 7592,\n    },\n    {\n      day: \"2019-05-09\",\n      downloads: 7870,\n    },\n    {\n      day: \"2019-05-10\",\n      downloads: 6915,\n    },\n    {\n      day: \"2019-05-11\",\n      downloads: 1476,\n    },\n    {\n      day: \"2019-05-12\",\n      downloads: 1068,\n    },\n    {\n      day: \"2019-05-13\",\n      downloads: 8013,\n    },\n    {\n      day: \"2019-05-14\",\n      downloads: 8696,\n    },\n    {\n      day: \"2019-05-15\",\n      downloads: 8476,\n    },\n    {\n      day: \"2019-05-16\",\n      downloads: 9274,\n    },\n    {\n      day: \"2019-05-17\",\n      downloads: 6872,\n    },\n    {\n      day: \"2019-05-18\",\n      downloads: 1073,\n    },\n    {\n      day: \"2019-05-19\",\n      downloads: 1119,\n    },\n    {\n      day: \"2019-05-20\",\n      downloads: 7004,\n    },\n    {\n      day: \"2019-05-21\",\n      downloads: 8720,\n    },\n    {\n      day: \"2019-05-22\",\n      downloads: 8184,\n    },\n    {\n      day: \"2019-05-23\",\n      downloads: 8670,\n    },\n    {\n      day: \"2019-05-24\",\n      downloads: 6742,\n    },\n    {\n      day: \"2019-05-25\",\n      downloads: 1306,\n    },\n    {\n      day: \"2019-05-26\",\n      downloads: 1308,\n    },\n    {\n      day: \"2019-05-27\",\n      downloads: 5080,\n    },\n    {\n      day: \"2019-05-28\",\n      downloads: 7611,\n    },\n    {\n      day: \"2019-05-29\",\n      downloads: 8854,\n    },\n    {\n      day: \"2019-05-30\",\n      downloads: 7248,\n    },\n    {\n      day: \"2019-05-31\",\n      downloads: 7158,\n    },\n    {\n      day: \"2019-06-01\",\n      downloads: 1313,\n    },\n    {\n      day: \"2019-06-02\",\n      downloads: 1132,\n    },\n    {\n      day: \"2019-06-03\",\n      downloads: 8199,\n    },\n    {\n      day: \"2019-06-04\",\n      downloads: 8517,\n    },\n    {\n      day: \"2019-06-05\",\n      downloads: 8383,\n    },\n    {\n      day: \"2019-06-06\",\n      downloads: 7889,\n    },\n    {\n      day: \"2019-06-07\",\n      downloads: 7549,\n    },\n    {\n      day: \"2019-06-08\",\n      downloads: 1123,\n    },\n    {\n      day: \"2019-06-09\",\n      downloads: 1082,\n    },\n    {\n      day: \"2019-06-10\",\n      downloads: 7658,\n    },\n    {\n      day: \"2019-06-11\",\n      downloads: 8377,\n    },\n    {\n      day: \"2019-06-12\",\n      downloads: 7601,\n    },\n    {\n      day: \"2019-06-13\",\n      downloads: 8047,\n    },\n    {\n      day: \"2019-06-14\",\n      downloads: 6791,\n    },\n    {\n      day: \"2019-06-15\",\n      downloads: 1013,\n    },\n    {\n      day: \"2019-06-16\",\n      downloads: 1129,\n    },\n    {\n      day: \"2019-06-17\",\n      downloads: 8086,\n    },\n    {\n      day: \"2019-06-18\",\n      downloads: 8814,\n    },\n    {\n      day: \"2019-06-19\",\n      downloads: 8850,\n    },\n    {\n      day: \"2019-06-20\",\n      downloads: 8872,\n    },\n    {\n      day: \"2019-06-21\",\n      downloads: 8155,\n    },\n    {\n      day: \"2019-06-22\",\n      downloads: 976,\n    },\n    {\n      day: \"2019-06-23\",\n      downloads: 1103,\n    },\n    {\n      day: \"2019-06-24\",\n      downloads: 9399,\n    },\n    {\n      day: \"2019-06-25\",\n      downloads: 9787,\n    },\n    {\n      day: \"2019-06-26\",\n      downloads: 9736,\n    },\n    {\n      day: \"2019-06-27\",\n      downloads: 9253,\n    },\n    {\n      day: \"2019-06-28\",\n      downloads: 8491,\n    },\n    {\n      day: \"2019-06-29\",\n      downloads: 1295,\n    },\n    {\n      day: \"2019-06-30\",\n      downloads: 952,\n    },\n    {\n      day: \"2019-07-01\",\n      downloads: 8370,\n    },\n    {\n      day: \"2019-07-02\",\n      downloads: 9632,\n    },\n    {\n      day: \"2019-07-03\",\n      downloads: 9369,\n    },\n    {\n      day: \"2019-07-04\",\n      downloads: 5893,\n    },\n    {\n      day: \"2019-07-05\",\n      downloads: 5263,\n    },\n    {\n      day: \"2019-07-06\",\n      downloads: 1099,\n    },\n    {\n      day: \"2019-07-07\",\n      downloads: 993,\n    },\n    {\n      day: \"2019-07-08\",\n      downloads: 7990,\n    },\n    {\n      day: \"2019-07-09\",\n      downloads: 9031,\n    },\n    {\n      day: \"2019-07-10\",\n      downloads: 8711,\n    },\n    {\n      day: \"2019-07-11\",\n      downloads: 8822,\n    },\n    {\n      day: \"2019-07-12\",\n      downloads: 7887,\n    },\n    {\n      day: \"2019-07-13\",\n      downloads: 1165,\n    },\n    {\n      day: \"2019-07-14\",\n      downloads: 1327,\n    },\n    {\n      day: \"2019-07-15\",\n      downloads: 8576,\n    },\n    {\n      day: \"2019-07-16\",\n      downloads: 10036,\n    },\n    {\n      day: \"2019-07-17\",\n      downloads: 9480,\n    },\n    {\n      day: \"2019-07-18\",\n      downloads: 9918,\n    },\n    {\n      day: \"2019-07-19\",\n      downloads: 8071,\n    },\n    {\n      day: \"2019-07-20\",\n      downloads: 1675,\n    },\n    {\n      day: \"2019-07-21\",\n      downloads: 1626,\n    },\n    {\n      day: \"2019-07-22\",\n      downloads: 8590,\n    },\n    {\n      day: \"2019-07-23\",\n      downloads: 9905,\n    },\n    {\n      day: \"2019-07-24\",\n      downloads: 9423,\n    },\n    {\n      day: \"2019-07-25\",\n      downloads: 9536,\n    },\n    {\n      day: \"2019-07-26\",\n      downloads: 8111,\n    },\n    {\n      day: \"2019-07-27\",\n      downloads: 1166,\n    },\n    {\n      day: \"2019-07-28\",\n      downloads: 1121,\n    },\n    {\n      day: \"2019-07-29\",\n      downloads: 9632,\n    },\n    {\n      day: \"2019-07-30\",\n      downloads: 8377,\n    },\n    {\n      day: \"2019-07-31\",\n      downloads: 9505,\n    },\n    {\n      day: \"2019-08-01\",\n      downloads: 8616,\n    },\n    {\n      day: \"2019-08-02\",\n      downloads: 8056,\n    },\n    {\n      day: \"2019-08-03\",\n      downloads: 1256,\n    },\n    {\n      day: \"2019-08-04\",\n      downloads: 1062,\n    },\n    {\n      day: \"2019-08-05\",\n      downloads: 9240,\n    },\n    {\n      day: \"2019-08-06\",\n      downloads: 9499,\n    },\n    {\n      day: \"2019-08-07\",\n      downloads: 10264,\n    },\n    {\n      day: \"2019-08-08\",\n      downloads: 10308,\n    },\n    {\n      day: \"2019-08-09\",\n      downloads: 8542,\n    },\n    {\n      day: \"2019-08-10\",\n      downloads: 1514,\n    },\n    {\n      day: \"2019-08-11\",\n      downloads: 1474,\n    },\n    {\n      day: \"2019-08-12\",\n      downloads: 9759,\n    },\n    {\n      day: \"2019-08-13\",\n      downloads: 10176,\n    },\n    {\n      day: \"2019-08-14\",\n      downloads: 10145,\n    },\n    {\n      day: \"2019-08-15\",\n      downloads: 8770,\n    },\n    {\n      day: \"2019-08-16\",\n      downloads: 8955,\n    },\n    {\n      day: \"2019-08-17\",\n      downloads: 1357,\n    },\n    {\n      day: \"2019-08-18\",\n      downloads: 1522,\n    },\n    {\n      day: \"2019-08-19\",\n      downloads: 9959,\n    },\n    {\n      day: \"2019-08-20\",\n      downloads: 10711,\n    },\n    {\n      day: \"2019-08-21\",\n      downloads: 10327,\n    },\n    {\n      day: \"2019-08-22\",\n      downloads: 11025,\n    },\n    {\n      day: \"2019-08-23\",\n      downloads: 9844,\n    },\n    {\n      day: \"2019-08-24\",\n      downloads: 1473,\n    },\n    {\n      day: \"2019-08-25\",\n      downloads: 1351,\n    },\n    {\n      day: \"2019-08-26\",\n      downloads: 10140,\n    },\n    {\n      day: \"2019-08-27\",\n      downloads: 10913,\n    },\n    {\n      day: \"2019-08-28\",\n      downloads: 10845,\n    },\n    {\n      day: \"2019-08-29\",\n      downloads: 11517,\n    },\n    {\n      day: \"2019-08-30\",\n      downloads: 9396,\n    },\n    {\n      day: \"2019-08-31\",\n      downloads: 1483,\n    },\n    {\n      day: \"2019-09-01\",\n      downloads: 1190,\n    },\n    {\n      day: \"2019-09-02\",\n      downloads: 5858,\n    },\n    {\n      day: \"2019-09-03\",\n      downloads: 9918,\n    },\n    {\n      day: \"2019-09-04\",\n      downloads: 10666,\n    },\n    {\n      day: \"2019-09-05\",\n      downloads: 9697,\n    },\n    {\n      day: \"2019-09-06\",\n      downloads: 8861,\n    },\n    {\n      day: \"2019-09-07\",\n      downloads: 1439,\n    },\n    {\n      day: \"2019-09-08\",\n      downloads: 1189,\n    },\n    {\n      day: \"2019-09-09\",\n      downloads: 10527,\n    },\n    {\n      day: \"2019-09-10\",\n      downloads: 14613,\n    },\n    {\n      day: \"2019-09-11\",\n      downloads: 13616,\n    },\n    {\n      day: \"2019-09-12\",\n      downloads: 13312,\n    },\n    {\n      day: \"2019-09-13\",\n      downloads: 11974,\n    },\n    {\n      day: \"2019-09-14\",\n      downloads: 2753,\n    },\n    {\n      day: \"2019-09-15\",\n      downloads: 3221,\n    },\n    {\n      day: \"2019-09-16\",\n      downloads: 13963,\n    },\n    {\n      day: \"2019-09-17\",\n      downloads: 15955,\n    },\n    {\n      day: \"2019-09-18\",\n      downloads: 14432,\n    },\n    {\n      day: \"2019-09-19\",\n      downloads: 14673,\n    },\n    {\n      day: \"2019-09-20\",\n      downloads: 13010,\n    },\n    {\n      day: \"2019-09-21\",\n      downloads: 2722,\n    },\n    {\n      day: \"2019-09-22\",\n      downloads: 2266,\n    },\n    {\n      day: \"2019-09-23\",\n      downloads: 13018,\n    },\n    {\n      day: \"2019-09-24\",\n      downloads: 15433,\n    },\n    {\n      day: \"2019-09-25\",\n      downloads: 16953,\n    },\n    {\n      day: \"2019-09-26\",\n      downloads: 19189,\n    },\n    {\n      day: \"2019-09-27\",\n      downloads: 16487,\n    },\n    {\n      day: \"2019-09-28\",\n      downloads: 4867,\n    },\n    {\n      day: \"2019-09-29\",\n      downloads: 4306,\n    },\n    {\n      day: \"2019-09-30\",\n      downloads: 15197,\n    },\n    {\n      day: \"2019-10-01\",\n      downloads: 18405,\n    },\n    {\n      day: \"2019-10-02\",\n      downloads: 14454,\n    },\n    {\n      day: \"2019-10-03\",\n      downloads: 14511,\n    },\n    {\n      day: \"2019-10-04\",\n      downloads: 12446,\n    },\n    {\n      day: \"2019-10-05\",\n      downloads: 1959,\n    },\n    {\n      day: \"2019-10-06\",\n      downloads: 1468,\n    },\n    {\n      day: \"2019-10-07\",\n      downloads: 13891,\n    },\n    {\n      day: \"2019-10-08\",\n      downloads: 15371,\n    },\n    {\n      day: \"2019-10-09\",\n      downloads: 13740,\n    },\n    {\n      day: \"2019-10-10\",\n      downloads: 13215,\n    },\n    {\n      day: \"2019-10-11\",\n      downloads: 12080,\n    },\n    {\n      day: \"2019-10-12\",\n      downloads: 1791,\n    },\n    {\n      day: \"2019-10-13\",\n      downloads: 1426,\n    },\n    {\n      day: \"2019-10-14\",\n      downloads: 10905,\n    },\n    {\n      day: \"2019-10-15\",\n      downloads: 13979,\n    },\n    {\n      day: \"2019-10-16\",\n      downloads: 15764,\n    },\n    {\n      day: \"2019-10-17\",\n      downloads: 15633,\n    },\n    {\n      day: \"2019-10-18\",\n      downloads: 12585,\n    },\n    {\n      day: \"2019-10-19\",\n      downloads: 1722,\n    },\n    {\n      day: \"2019-10-20\",\n      downloads: 1509,\n    },\n    {\n      day: \"2019-10-21\",\n      downloads: 13803,\n    },\n    {\n      day: \"2019-10-22\",\n      downloads: 16022,\n    },\n    {\n      day: \"2019-10-23\",\n      downloads: 17777,\n    },\n    {\n      day: \"2019-10-24\",\n      downloads: 18594,\n    },\n    {\n      day: \"2019-10-25\",\n      downloads: 14913,\n    },\n    {\n      day: \"2019-10-26\",\n      downloads: 1912,\n    },\n    {\n      day: \"2019-10-27\",\n      downloads: 1724,\n    },\n    {\n      day: \"2019-10-28\",\n      downloads: 15114,\n    },\n    {\n      day: \"2019-10-29\",\n      downloads: 16921,\n    },\n    {\n      day: \"2019-10-30\",\n      downloads: 16354,\n    },\n    {\n      day: \"2019-10-31\",\n      downloads: 16435,\n    },\n    {\n      day: \"2019-11-01\",\n      downloads: 13199,\n    },\n    {\n      day: \"2019-11-02\",\n      downloads: 2210,\n    },\n    {\n      day: \"2019-11-03\",\n      downloads: 1634,\n    },\n    {\n      day: \"2019-11-04\",\n      downloads: 15319,\n    },\n    {\n      day: \"2019-11-05\",\n      downloads: 19426,\n    },\n    {\n      day: \"2019-11-06\",\n      downloads: 19022,\n    },\n    {\n      day: \"2019-11-07\",\n      downloads: 19421,\n    },\n    {\n      day: \"2019-11-08\",\n      downloads: 16716,\n    },\n    {\n      day: \"2019-11-09\",\n      downloads: 3270,\n    },\n    {\n      day: \"2019-11-10\",\n      downloads: 2178,\n    },\n    {\n      day: \"2019-11-11\",\n      downloads: 13080,\n    },\n    {\n      day: \"2019-11-12\",\n      downloads: 18042,\n    },\n    {\n      day: \"2019-11-13\",\n      downloads: 19308,\n    },\n    {\n      day: \"2019-11-14\",\n      downloads: 19852,\n    },\n    {\n      day: \"2019-11-15\",\n      downloads: 17950,\n    },\n    {\n      day: \"2019-11-16\",\n      downloads: 3074,\n    },\n    {\n      day: \"2019-11-17\",\n      downloads: 2006,\n    },\n    {\n      day: \"2019-11-18\",\n      downloads: 16223,\n    },\n    {\n      day: \"2019-11-19\",\n      downloads: 21735,\n    },\n    {\n      day: \"2019-11-20\",\n      downloads: 21210,\n    },\n    {\n      day: \"2019-11-21\",\n      downloads: 23187,\n    },\n    {\n      day: \"2019-11-22\",\n      downloads: 19202,\n    },\n    {\n      day: \"2019-11-23\",\n      downloads: 3657,\n    },\n    {\n      day: \"2019-11-24\",\n      downloads: 2011,\n    },\n    {\n      day: \"2019-11-25\",\n      downloads: 18045,\n    },\n    {\n      day: \"2019-11-26\",\n      downloads: 18923,\n    },\n    {\n      day: \"2019-11-27\",\n      downloads: 17432,\n    },\n    {\n      day: \"2019-11-28\",\n      downloads: 9946,\n    },\n    {\n      day: \"2019-11-29\",\n      downloads: 8000,\n    },\n    {\n      day: \"2019-11-30\",\n      downloads: 2383,\n    },\n    {\n      day: \"2019-12-01\",\n      downloads: 2066,\n    },\n    {\n      day: \"2019-12-02\",\n      downloads: 17135,\n    },\n    {\n      day: \"2019-12-03\",\n      downloads: 21256,\n    },\n    {\n      day: \"2019-12-04\",\n      downloads: 18483,\n    },\n    {\n      day: \"2019-12-05\",\n      downloads: 18390,\n    },\n    {\n      day: \"2019-12-06\",\n      downloads: 16855,\n    },\n    {\n      day: \"2019-12-07\",\n      downloads: 3254,\n    },\n    {\n      day: \"2019-12-08\",\n      downloads: 2091,\n    },\n    {\n      day: \"2019-12-09\",\n      downloads: 16769,\n    },\n    {\n      day: \"2019-12-10\",\n      downloads: 18079,\n    },\n    {\n      day: \"2019-12-11\",\n      downloads: 17417,\n    },\n    {\n      day: \"2019-12-12\",\n      downloads: 18954,\n    },\n    {\n      day: \"2019-12-13\",\n      downloads: 18729,\n    },\n    {\n      day: \"2019-12-14\",\n      downloads: 2848,\n    },\n    {\n      day: \"2019-12-15\",\n      downloads: 1600,\n    },\n    {\n      day: \"2019-12-16\",\n      downloads: 16942,\n    },\n    {\n      day: \"2019-12-17\",\n      downloads: 18865,\n    },\n    {\n      day: \"2019-12-18\",\n      downloads: 17146,\n    },\n    {\n      day: \"2019-12-19\",\n      downloads: 17056,\n    },\n    {\n      day: \"2019-12-20\",\n      downloads: 15520,\n    },\n    {\n      day: \"2019-12-21\",\n      downloads: 2581,\n    },\n    {\n      day: \"2019-12-22\",\n      downloads: 1511,\n    },\n    {\n      day: \"2019-12-23\",\n      downloads: 7474,\n    },\n    {\n      day: \"2019-12-24\",\n      downloads: 3815,\n    },\n    {\n      day: \"2019-12-25\",\n      downloads: 1864,\n    },\n    {\n      day: \"2019-12-26\",\n      downloads: 3976,\n    },\n    {\n      day: \"2019-12-27\",\n      downloads: 4994,\n    },\n    {\n      day: \"2019-12-28\",\n      downloads: 1420,\n    },\n    {\n      day: \"2019-12-29\",\n      downloads: 1390,\n    },\n    {\n      day: \"2019-12-30\",\n      downloads: 6286,\n    },\n    {\n      day: \"2019-12-31\",\n      downloads: 4024,\n    },\n    {\n      day: \"2020-01-01\",\n      downloads: 1687,\n    },\n    {\n      day: \"2020-01-02\",\n      downloads: 10488,\n    },\n    {\n      day: \"2020-01-03\",\n      downloads: 10794,\n    },\n    {\n      day: \"2020-01-04\",\n      downloads: 2094,\n    },\n    {\n      day: \"2020-01-05\",\n      downloads: 1447,\n    },\n    {\n      day: \"2020-01-06\",\n      downloads: 13860,\n    },\n    {\n      day: \"2020-01-07\",\n      downloads: 15719,\n    },\n    {\n      day: \"2020-01-08\",\n      downloads: 15873,\n    },\n    {\n      day: \"2020-01-09\",\n      downloads: 16892,\n    },\n    {\n      day: \"2020-01-10\",\n      downloads: 14826,\n    },\n    {\n      day: \"2020-01-11\",\n      downloads: 2941,\n    },\n    {\n      day: \"2020-01-12\",\n      downloads: 1964,\n    },\n    {\n      day: \"2020-01-13\",\n      downloads: 13486,\n    },\n    {\n      day: \"2020-01-14\",\n      downloads: 17073,\n    },\n    {\n      day: \"2020-01-15\",\n      downloads: 20667,\n    },\n    {\n      day: \"2020-01-16\",\n      downloads: 18558,\n    },\n    {\n      day: \"2020-01-17\",\n      downloads: 15600,\n    },\n    {\n      day: \"2020-01-18\",\n      downloads: 2345,\n    },\n    {\n      day: \"2020-01-19\",\n      downloads: 2211,\n    },\n    {\n      day: \"2020-01-20\",\n      downloads: 12286,\n    },\n    {\n      day: \"2020-01-21\",\n      downloads: 16671,\n    },\n    {\n      day: \"2020-01-22\",\n      downloads: 17263,\n    },\n    {\n      day: \"2020-01-23\",\n      downloads: 17806,\n    },\n    {\n      day: \"2020-01-24\",\n      downloads: 17297,\n    },\n    {\n      day: \"2020-01-25\",\n      downloads: 2791,\n    },\n    {\n      day: \"2020-01-26\",\n      downloads: 1744,\n    },\n    {\n      day: \"2020-01-27\",\n      downloads: 15599,\n    },\n    {\n      day: \"2020-01-28\",\n      downloads: 19450,\n    },\n    {\n      day: \"2020-01-29\",\n      downloads: 19121,\n    },\n    {\n      day: \"2020-01-30\",\n      downloads: 19482,\n    },\n    {\n      day: \"2020-01-31\",\n      downloads: 16553,\n    },\n    {\n      day: \"2020-02-01\",\n      downloads: 2792,\n    },\n    {\n      day: \"2020-02-02\",\n      downloads: 2098,\n    },\n    {\n      day: \"2020-02-03\",\n      downloads: 17211,\n    },\n    {\n      day: \"2020-02-04\",\n      downloads: 20172,\n    },\n    {\n      day: \"2020-02-05\",\n      downloads: 21894,\n    },\n    {\n      day: \"2020-02-06\",\n      downloads: 19606,\n    },\n    {\n      day: \"2020-02-07\",\n      downloads: 19698,\n    },\n    {\n      day: \"2020-02-08\",\n      downloads: 2949,\n    },\n    {\n      day: \"2020-02-09\",\n      downloads: 1985,\n    },\n    {\n      day: \"2020-02-10\",\n      downloads: 17324,\n    },\n    {\n      day: \"2020-02-11\",\n      downloads: 22081,\n    },\n    {\n      day: \"2020-02-12\",\n      downloads: 20836,\n    },\n    {\n      day: \"2020-02-13\",\n      downloads: 22586,\n    },\n    {\n      day: \"2020-02-14\",\n      downloads: 25737,\n    },\n    {\n      day: \"2020-02-15\",\n      downloads: 3362,\n    },\n    {\n      day: \"2020-02-16\",\n      downloads: 2633,\n    },\n    {\n      day: \"2020-02-17\",\n      downloads: 14967,\n    },\n    {\n      day: \"2020-02-18\",\n      downloads: 20153,\n    },\n    {\n      day: \"2020-02-19\",\n      downloads: 23679,\n    },\n    {\n      day: \"2020-02-20\",\n      downloads: 27203,\n    },\n    {\n      day: \"2020-02-21\",\n      downloads: 20985,\n    },\n    {\n      day: \"2020-02-22\",\n      downloads: 3379,\n    },\n    {\n      day: \"2020-02-23\",\n      downloads: 2002,\n    },\n    {\n      day: \"2020-02-24\",\n      downloads: 19851,\n    },\n    {\n      day: \"2020-02-25\",\n      downloads: 22793,\n    },\n    {\n      day: \"2020-02-26\",\n      downloads: 21655,\n    },\n    {\n      day: \"2020-02-27\",\n      downloads: 21919,\n    },\n    {\n      day: \"2020-02-28\",\n      downloads: 22414,\n    },\n    {\n      day: \"2020-02-29\",\n      downloads: 3504,\n    },\n    {\n      day: \"2020-03-01\",\n      downloads: 2227,\n    },\n    {\n      day: \"2020-03-02\",\n      downloads: 20203,\n    },\n    {\n      day: \"2020-03-03\",\n      downloads: 21809,\n    },\n    {\n      day: \"2020-03-04\",\n      downloads: 22791,\n    },\n    {\n      day: \"2020-03-05\",\n      downloads: 22968,\n    },\n    {\n      day: \"2020-03-06\",\n      downloads: 20104,\n    },\n    {\n      day: \"2020-03-07\",\n      downloads: 3430,\n    },\n    {\n      day: \"2020-03-08\",\n      downloads: 2339,\n    },\n    {\n      day: \"2020-03-09\",\n      downloads: 18462,\n    },\n    {\n      day: \"2020-03-10\",\n      downloads: 19974,\n    },\n    {\n      day: \"2020-03-11\",\n      downloads: 20907,\n    },\n    {\n      day: \"2020-03-12\",\n      downloads: 20706,\n    },\n    {\n      day: \"2020-03-13\",\n      downloads: 17870,\n    },\n    {\n      day: \"2020-03-14\",\n      downloads: 3356,\n    },\n    {\n      day: \"2020-03-15\",\n      downloads: 2876,\n    },\n    {\n      day: \"2020-03-16\",\n      downloads: 18737,\n    },\n    {\n      day: \"2020-03-17\",\n      downloads: 23228,\n    },\n    {\n      day: \"2020-03-18\",\n      downloads: 22146,\n    },\n    {\n      day: \"2020-03-19\",\n      downloads: 21481,\n    },\n    {\n      day: \"2020-03-20\",\n      downloads: 20925,\n    },\n    {\n      day: \"2020-03-21\",\n      downloads: 3820,\n    },\n    {\n      day: \"2020-03-22\",\n      downloads: 2731,\n    },\n    {\n      day: \"2020-03-23\",\n      downloads: 20862,\n    },\n    {\n      day: \"2020-03-24\",\n      downloads: 22923,\n    },\n    {\n      day: \"2020-03-25\",\n      downloads: 22450,\n    },\n    {\n      day: \"2020-03-26\",\n      downloads: 24191,\n    },\n    {\n      day: \"2020-03-27\",\n      downloads: 21351,\n    },\n    {\n      day: \"2020-03-28\",\n      downloads: 4475,\n    },\n    {\n      day: \"2020-03-29\",\n      downloads: 3343,\n    },\n    {\n      day: \"2020-03-30\",\n      downloads: 20927,\n    },\n    {\n      day: \"2020-03-31\",\n      downloads: 26116,\n    },\n    {\n      day: \"2020-04-01\",\n      downloads: 24603,\n    },\n    {\n      day: \"2020-04-02\",\n      downloads: 23067,\n    },\n    {\n      day: \"2020-04-03\",\n      downloads: 23058,\n    },\n    {\n      day: \"2020-04-04\",\n      downloads: 4039,\n    },\n    {\n      day: \"2020-04-05\",\n      downloads: 3002,\n    },\n    {\n      day: \"2020-04-06\",\n      downloads: 20515,\n    },\n    {\n      day: \"2020-04-07\",\n      downloads: 26732,\n    },\n    {\n      day: \"2020-04-08\",\n      downloads: 24984,\n    },\n    {\n      day: \"2020-04-09\",\n      downloads: 25839,\n    },\n    {\n      day: \"2020-04-10\",\n      downloads: 15862,\n    },\n    {\n      day: \"2020-04-11\",\n      downloads: 3790,\n    },\n    {\n      day: \"2020-04-12\",\n      downloads: 2399,\n    },\n    {\n      day: \"2020-04-13\",\n      downloads: 16153,\n    },\n    {\n      day: \"2020-04-14\",\n      downloads: 24035,\n    },\n    {\n      day: \"2020-04-15\",\n      downloads: 16288,\n    },\n    {\n      day: \"2020-04-16\",\n      downloads: 23402,\n    },\n    {\n      day: \"2020-04-17\",\n      downloads: 25210,\n    },\n    {\n      day: \"2020-04-18\",\n      downloads: 4634,\n    },\n    {\n      day: \"2020-04-19\",\n      downloads: 3019,\n    },\n    {\n      day: \"2020-04-20\",\n      downloads: 20497,\n    },\n    {\n      day: \"2020-04-21\",\n      downloads: 22283,\n    },\n    {\n      day: \"2020-04-22\",\n      downloads: 25803,\n    },\n    {\n      day: \"2020-04-23\",\n      downloads: 23591,\n    },\n    {\n      day: \"2020-04-24\",\n      downloads: 21888,\n    },\n    {\n      day: \"2020-04-25\",\n      downloads: 3408,\n    },\n    {\n      day: \"2020-04-26\",\n      downloads: 3184,\n    },\n    {\n      day: \"2020-04-27\",\n      downloads: 19118,\n    },\n    {\n      day: \"2020-04-28\",\n      downloads: 22785,\n    },\n    {\n      day: \"2020-04-29\",\n      downloads: 24070,\n    },\n    {\n      day: \"2020-04-30\",\n      downloads: 22835,\n    },\n    {\n      day: \"2020-05-01\",\n      downloads: 13855,\n    },\n    {\n      day: \"2020-05-02\",\n      downloads: 3852,\n    },\n    {\n      day: \"2020-05-03\",\n      downloads: 2844,\n    },\n    {\n      day: \"2020-05-04\",\n      downloads: 18230,\n    },\n    {\n      day: \"2020-05-05\",\n      downloads: 23016,\n    },\n    {\n      day: \"2020-05-06\",\n      downloads: 24201,\n    },\n    {\n      day: \"2020-05-07\",\n      downloads: 28082,\n    },\n    {\n      day: \"2020-05-08\",\n      downloads: 21024,\n    },\n    {\n      day: \"2020-05-09\",\n      downloads: 4002,\n    },\n    {\n      day: \"2020-05-10\",\n      downloads: 3100,\n    },\n    {\n      day: \"2020-05-11\",\n      downloads: 18184,\n    },\n    {\n      day: \"2020-05-12\",\n      downloads: 23230,\n    },\n    {\n      day: \"2020-05-13\",\n      downloads: 22050,\n    },\n    {\n      day: \"2020-05-14\",\n      downloads: 26274,\n    },\n    {\n      day: \"2020-05-15\",\n      downloads: 22813,\n    },\n    {\n      day: \"2020-05-16\",\n      downloads: 3905,\n    },\n    {\n      day: \"2020-05-17\",\n      downloads: 2990,\n    },\n    {\n      day: \"2020-05-18\",\n      downloads: 21793,\n    },\n    {\n      day: \"2020-05-19\",\n      downloads: 24740,\n    },\n    {\n      day: \"2020-05-20\",\n      downloads: 27330,\n    },\n    {\n      day: \"2020-05-21\",\n      downloads: 22753,\n    },\n    {\n      day: \"2020-05-22\",\n      downloads: 21867,\n    },\n    {\n      day: \"2020-05-23\",\n      downloads: 3546,\n    },\n    {\n      day: \"2020-05-24\",\n      downloads: 2581,\n    },\n    {\n      day: \"2020-05-25\",\n      downloads: 11325,\n    },\n    {\n      day: \"2020-05-26\",\n      downloads: 22510,\n    },\n    {\n      day: \"2020-05-27\",\n      downloads: 25545,\n    },\n    {\n      day: \"2020-05-28\",\n      downloads: 27941,\n    },\n    {\n      day: \"2020-05-29\",\n      downloads: 22913,\n    },\n    {\n      day: \"2020-05-30\",\n      downloads: 4275,\n    },\n    {\n      day: \"2020-05-31\",\n      downloads: 2705,\n    },\n    {\n      day: \"2020-06-01\",\n      downloads: 20949,\n    },\n    {\n      day: \"2020-06-02\",\n      downloads: 24015,\n    },\n    {\n      day: \"2020-06-03\",\n      downloads: 25237,\n    },\n    {\n      day: \"2020-06-04\",\n      downloads: 25423,\n    },\n    {\n      day: \"2020-06-05\",\n      downloads: 24412,\n    },\n    {\n      day: \"2020-06-06\",\n      downloads: 3666,\n    },\n    {\n      day: \"2020-06-07\",\n      downloads: 2705,\n    },\n    {\n      day: \"2020-06-08\",\n      downloads: 22778,\n    },\n    {\n      day: \"2020-06-09\",\n      downloads: 23994,\n    },\n    {\n      day: \"2020-06-10\",\n      downloads: 23743,\n    },\n    {\n      day: \"2020-06-11\",\n      downloads: 25748,\n    },\n    {\n      day: \"2020-06-12\",\n      downloads: 23180,\n    },\n    {\n      day: \"2020-06-13\",\n      downloads: 3417,\n    },\n    {\n      day: \"2020-06-14\",\n      downloads: 2655,\n    },\n    {\n      day: \"2020-06-15\",\n      downloads: 22394,\n    },\n    {\n      day: \"2020-06-16\",\n      downloads: 27796,\n    },\n    {\n      day: \"2020-06-17\",\n      downloads: 28363,\n    },\n    {\n      day: \"2020-06-18\",\n      downloads: 24122,\n    },\n    {\n      day: \"2020-06-19\",\n      downloads: 16152,\n    },\n    {\n      day: \"2020-06-20\",\n      downloads: 2951,\n    },\n    {\n      day: \"2020-06-21\",\n      downloads: 2264,\n    },\n    {\n      day: \"2020-06-22\",\n      downloads: 0,\n    },\n    {\n      day: \"2020-06-23\",\n      downloads: 24597,\n    },\n    {\n      day: \"2020-06-24\",\n      downloads: 24228,\n    },\n    {\n      day: \"2020-06-25\",\n      downloads: 22184,\n    },\n    {\n      day: \"2020-06-26\",\n      downloads: 21386,\n    },\n    {\n      day: \"2020-06-27\",\n      downloads: 3216,\n    },\n    {\n      day: \"2020-06-28\",\n      downloads: 3008,\n    },\n    {\n      day: \"2020-06-29\",\n      downloads: 19263,\n    },\n    {\n      day: \"2020-06-30\",\n      downloads: 19689,\n    },\n    {\n      day: \"2020-07-01\",\n      downloads: 19382,\n    },\n    {\n      day: \"2020-07-02\",\n      downloads: 20049,\n    },\n    {\n      day: \"2020-07-03\",\n      downloads: 11366,\n    },\n    {\n      day: \"2020-07-04\",\n      downloads: 1883,\n    },\n    {\n      day: \"2020-07-05\",\n      downloads: 2362,\n    },\n    {\n      day: \"2020-07-06\",\n      downloads: 17119,\n    },\n    {\n      day: \"2020-07-07\",\n      downloads: 20842,\n    },\n    {\n      day: \"2020-07-08\",\n      downloads: 22178,\n    },\n    {\n      day: \"2020-07-09\",\n      downloads: 21173,\n    },\n    {\n      day: \"2020-07-10\",\n      downloads: 19394,\n    },\n    {\n      day: \"2020-07-11\",\n      downloads: 3107,\n    },\n    {\n      day: \"2020-07-12\",\n      downloads: 2298,\n    },\n    {\n      day: \"2020-07-13\",\n      downloads: 20032,\n    },\n    {\n      day: \"2020-07-14\",\n      downloads: 22931,\n    },\n    {\n      day: \"2020-07-15\",\n      downloads: 23363,\n    },\n    {\n      day: \"2020-07-16\",\n      downloads: 20549,\n    },\n    {\n      day: \"2020-07-17\",\n      downloads: 20131,\n    },\n    {\n      day: \"2020-07-18\",\n      downloads: 3905,\n    },\n    {\n      day: \"2020-07-19\",\n      downloads: 2873,\n    },\n    {\n      day: \"2020-07-20\",\n      downloads: 21029,\n    },\n    {\n      day: \"2020-07-21\",\n      downloads: 25744,\n    },\n    {\n      day: \"2020-07-22\",\n      downloads: 26425,\n    },\n    {\n      day: \"2020-07-23\",\n      downloads: 26327,\n    },\n    {\n      day: \"2020-07-24\",\n      downloads: 22406,\n    },\n    {\n      day: \"2020-07-25\",\n      downloads: 3731,\n    },\n    {\n      day: \"2020-07-26\",\n      downloads: 2640,\n    },\n    {\n      day: \"2020-07-27\",\n      downloads: 22817,\n    },\n    {\n      day: \"2020-07-28\",\n      downloads: 28301,\n    },\n    {\n      day: \"2020-07-29\",\n      downloads: 34708,\n    },\n    {\n      day: \"2020-07-30\",\n      downloads: 28440,\n    },\n    {\n      day: \"2020-07-31\",\n      downloads: 24499,\n    },\n    {\n      day: \"2020-08-01\",\n      downloads: 4322,\n    },\n    {\n      day: \"2020-08-02\",\n      downloads: 3161,\n    },\n    {\n      day: \"2020-08-03\",\n      downloads: 20310,\n    },\n    {\n      day: \"2020-08-04\",\n      downloads: 28116,\n    },\n    {\n      day: \"2020-08-05\",\n      downloads: 28249,\n    },\n    {\n      day: \"2020-08-06\",\n      downloads: 28280,\n    },\n    {\n      day: \"2020-08-07\",\n      downloads: 26644,\n    },\n    {\n      day: \"2020-08-08\",\n      downloads: 3781,\n    },\n    {\n      day: \"2020-08-09\",\n      downloads: 2847,\n    },\n    {\n      day: \"2020-08-10\",\n      downloads: 21851,\n    },\n    {\n      day: \"2020-08-11\",\n      downloads: 26203,\n    },\n    {\n      day: \"2020-08-12\",\n      downloads: 29309,\n    },\n    {\n      day: \"2020-08-13\",\n      downloads: 25998,\n    },\n    {\n      day: \"2020-08-14\",\n      downloads: 21486,\n    },\n    {\n      day: \"2020-08-15\",\n      downloads: 4267,\n    },\n    {\n      day: \"2020-08-16\",\n      downloads: 3132,\n    },\n    {\n      day: \"2020-08-17\",\n      downloads: 22108,\n    },\n    {\n      day: \"2020-08-18\",\n      downloads: 26636,\n    },\n    {\n      day: \"2020-08-19\",\n      downloads: 25378,\n    },\n    {\n      day: \"2020-08-20\",\n      downloads: 27712,\n    },\n    {\n      day: \"2020-08-21\",\n      downloads: 24817,\n    },\n    {\n      day: \"2020-08-22\",\n      downloads: 5051,\n    },\n    {\n      day: \"2020-08-23\",\n      downloads: 3844,\n    },\n    {\n      day: \"2020-08-24\",\n      downloads: 23969,\n    },\n    {\n      day: \"2020-08-25\",\n      downloads: 27679,\n    },\n    {\n      day: \"2020-08-26\",\n      downloads: 25802,\n    },\n    {\n      day: \"2020-08-27\",\n      downloads: 28646,\n    },\n    {\n      day: \"2020-08-28\",\n      downloads: 23846,\n    },\n    {\n      day: \"2020-08-29\",\n      downloads: 3596,\n    },\n    {\n      day: \"2020-08-30\",\n      downloads: 2358,\n    },\n    {\n      day: \"2020-08-31\",\n      downloads: 21461,\n    },\n    {\n      day: \"2020-09-01\",\n      downloads: 25638,\n    },\n    {\n      day: \"2020-09-02\",\n      downloads: 27440,\n    },\n    {\n      day: \"2020-09-03\",\n      downloads: 28224,\n    },\n    {\n      day: \"2020-09-04\",\n      downloads: 23206,\n    },\n    {\n      day: \"2020-09-05\",\n      downloads: 3716,\n    },\n    {\n      day: \"2020-09-06\",\n      downloads: 2753,\n    },\n    {\n      day: \"2020-09-07\",\n      downloads: 13642,\n    },\n    {\n      day: \"2020-09-08\",\n      downloads: 15119,\n    },\n    {\n      day: \"2020-09-09\",\n      downloads: 30345,\n    },\n    {\n      day: \"2020-09-10\",\n      downloads: 28454,\n    },\n    {\n      day: \"2020-09-11\",\n      downloads: 23577,\n    },\n    {\n      day: \"2020-09-12\",\n      downloads: 4874,\n    },\n    {\n      day: \"2020-09-13\",\n      downloads: 4486,\n    },\n    {\n      day: \"2020-09-14\",\n      downloads: 27685,\n    },\n    {\n      day: \"2020-09-15\",\n      downloads: 27995,\n    },\n    {\n      day: \"2020-09-16\",\n      downloads: 28597,\n    },\n    {\n      day: \"2020-09-17\",\n      downloads: 27243,\n    },\n    {\n      day: \"2020-09-18\",\n      downloads: 27698,\n    },\n    {\n      day: \"2020-09-19\",\n      downloads: 4509,\n    },\n    {\n      day: \"2020-09-20\",\n      downloads: 3852,\n    },\n    {\n      day: \"2020-09-21\",\n      downloads: 26742,\n    },\n    {\n      day: \"2020-09-22\",\n      downloads: 27919,\n    },\n    {\n      day: \"2020-09-23\",\n      downloads: 28407,\n    },\n    {\n      day: \"2020-09-24\",\n      downloads: 33461,\n    },\n    {\n      day: \"2020-09-25\",\n      downloads: 25505,\n    },\n    {\n      day: \"2020-09-26\",\n      downloads: 4438,\n    },\n    {\n      day: \"2020-09-27\",\n      downloads: 3177,\n    },\n    {\n      day: \"2020-09-28\",\n      downloads: 25917,\n    },\n    {\n      day: \"2020-09-29\",\n      downloads: 30358,\n    },\n    {\n      day: \"2020-09-30\",\n      downloads: 29025,\n    },\n    {\n      day: \"2020-10-01\",\n      downloads: 29003,\n    },\n    {\n      day: \"2020-10-02\",\n      downloads: 23925,\n    },\n    {\n      day: \"2020-10-03\",\n      downloads: 3432,\n    },\n    {\n      day: \"2020-10-04\",\n      downloads: 2717,\n    },\n    {\n      day: \"2020-10-05\",\n      downloads: 23278,\n    },\n    {\n      day: \"2020-10-06\",\n      downloads: 25427,\n    },\n    {\n      day: \"2020-10-07\",\n      downloads: 28855,\n    },\n    {\n      day: \"2020-10-08\",\n      downloads: 26360,\n    },\n    {\n      day: \"2020-10-09\",\n      downloads: 23015,\n    },\n    {\n      day: \"2020-10-10\",\n      downloads: 3767,\n    },\n    {\n      day: \"2020-10-11\",\n      downloads: 3630,\n    },\n    {\n      day: \"2020-10-12\",\n      downloads: 21221,\n    },\n    {\n      day: \"2020-10-13\",\n      downloads: 24768,\n    },\n    {\n      day: \"2020-10-14\",\n      downloads: 26983,\n    },\n    {\n      day: \"2020-10-15\",\n      downloads: 27399,\n    },\n    {\n      day: \"2020-10-16\",\n      downloads: 23322,\n    },\n    {\n      day: \"2020-10-17\",\n      downloads: 3708,\n    },\n    {\n      day: \"2020-10-18\",\n      downloads: 3721,\n    },\n    {\n      day: \"2020-10-19\",\n      downloads: 23683,\n    },\n    {\n      day: \"2020-10-20\",\n      downloads: 28595,\n    },\n    {\n      day: \"2020-10-21\",\n      downloads: 28623,\n    },\n    {\n      day: \"2020-10-22\",\n      downloads: 28578,\n    },\n    {\n      day: \"2020-10-23\",\n      downloads: 24420,\n    },\n    {\n      day: \"2020-10-24\",\n      downloads: 4218,\n    },\n    {\n      day: \"2020-10-25\",\n      downloads: 2676,\n    },\n    {\n      day: \"2020-10-26\",\n      downloads: 21008,\n    },\n    {\n      day: \"2020-10-27\",\n      downloads: 27569,\n    },\n    {\n      day: \"2020-10-28\",\n      downloads: 25879,\n    },\n    {\n      day: \"2020-10-29\",\n      downloads: 25993,\n    },\n    {\n      day: \"2020-10-30\",\n      downloads: 24205,\n    },\n    {\n      day: \"2020-10-31\",\n      downloads: 3379,\n    },\n    {\n      day: \"2020-11-01\",\n      downloads: 3498,\n    },\n    {\n      day: \"2020-11-02\",\n      downloads: 21892,\n    },\n    {\n      day: \"2020-11-03\",\n      downloads: 28203,\n    },\n    {\n      day: \"2020-11-04\",\n      downloads: 28098,\n    },\n    {\n      day: \"2020-11-05\",\n      downloads: 29013,\n    },\n    {\n      day: \"2020-11-06\",\n      downloads: 23640,\n    },\n    {\n      day: \"2020-11-07\",\n      downloads: 4566,\n    },\n    {\n      day: \"2020-11-08\",\n      downloads: 3427,\n    },\n    {\n      day: \"2020-11-09\",\n      downloads: 25389,\n    },\n    {\n      day: \"2020-11-10\",\n      downloads: 28607,\n    },\n    {\n      day: \"2020-11-11\",\n      downloads: 24849,\n    },\n    {\n      day: \"2020-11-12\",\n      downloads: 30534,\n    },\n    {\n      day: \"2020-11-13\",\n      downloads: 23527,\n    },\n    {\n      day: \"2020-11-14\",\n      downloads: 4064,\n    },\n    {\n      day: \"2020-11-15\",\n      downloads: 3698,\n    },\n    {\n      day: \"2020-11-16\",\n      downloads: 21454,\n    },\n    {\n      day: \"2020-11-17\",\n      downloads: 27200,\n    },\n    {\n      day: \"2020-11-18\",\n      downloads: 26017,\n    },\n    {\n      day: \"2020-11-19\",\n      downloads: 25590,\n    },\n    {\n      day: \"2020-11-20\",\n      downloads: 24675,\n    },\n    {\n      day: \"2020-11-21\",\n      downloads: 4322,\n    },\n    {\n      day: \"2020-11-22\",\n      downloads: 3093,\n    },\n    {\n      day: \"2020-11-23\",\n      downloads: 22160,\n    },\n    {\n      day: \"2020-11-24\",\n      downloads: 25496,\n    },\n    {\n      day: \"2020-11-25\",\n      downloads: 22037,\n    },\n    {\n      day: \"2020-11-26\",\n      downloads: 16461,\n    },\n    {\n      day: \"2020-11-27\",\n      downloads: 13860,\n    },\n    {\n      day: \"2020-11-28\",\n      downloads: 2856,\n    },\n    {\n      day: \"2020-11-29\",\n      downloads: 2699,\n    },\n    {\n      day: \"2020-11-30\",\n      downloads: 22686,\n    },\n    {\n      day: \"2020-12-01\",\n      downloads: 26124,\n    },\n    {\n      day: \"2020-12-02\",\n      downloads: 29348,\n    },\n    {\n      day: \"2020-12-03\",\n      downloads: 24431,\n    },\n    {\n      day: \"2020-12-04\",\n      downloads: 21863,\n    },\n    {\n      day: \"2020-12-05\",\n      downloads: 5563,\n    },\n    {\n      day: \"2020-12-06\",\n      downloads: 3003,\n    },\n    {\n      day: \"2020-12-07\",\n      downloads: 24656,\n    },\n    {\n      day: \"2020-12-08\",\n      downloads: 27685,\n    },\n    {\n      day: \"2020-12-09\",\n      downloads: 30244,\n    },\n    {\n      day: \"2020-12-10\",\n      downloads: 29699,\n    },\n    {\n      day: \"2020-12-11\",\n      downloads: 24734,\n    },\n    {\n      day: \"2020-12-12\",\n      downloads: 4215,\n    },\n    {\n      day: \"2020-12-13\",\n      downloads: 3116,\n    },\n    {\n      day: \"2020-12-14\",\n      downloads: 25042,\n    },\n    {\n      day: \"2020-12-15\",\n      downloads: 27624,\n    },\n    {\n      day: \"2020-12-16\",\n      downloads: 28764,\n    },\n    {\n      day: \"2020-12-17\",\n      downloads: 27682,\n    },\n    {\n      day: \"2020-12-18\",\n      downloads: 24661,\n    },\n    {\n      day: \"2020-12-19\",\n      downloads: 4752,\n    },\n    {\n      day: \"2020-12-20\",\n      downloads: 3367,\n    },\n    {\n      day: \"2020-12-21\",\n      downloads: 18149,\n    },\n    {\n      day: \"2020-12-22\",\n      downloads: 18563,\n    },\n    {\n      day: \"2020-12-23\",\n      downloads: 15593,\n    },\n    {\n      day: \"2020-12-24\",\n      downloads: 7745,\n    },\n    {\n      day: \"2020-12-25\",\n      downloads: 3165,\n    },\n    {\n      day: \"2020-12-26\",\n      downloads: 1606,\n    },\n    {\n      day: \"2020-12-27\",\n      downloads: 1810,\n    },\n    {\n      day: \"2020-12-28\",\n      downloads: 11328,\n    },\n    {\n      day: \"2020-12-29\",\n      downloads: 11404,\n    },\n    {\n      day: \"2020-12-30\",\n      downloads: 11603,\n    },\n    {\n      day: \"2020-12-31\",\n      downloads: 7662,\n    },\n    {\n      day: \"2021-01-01\",\n      downloads: 2719,\n    },\n    {\n      day: \"2021-01-02\",\n      downloads: 2222,\n    },\n    {\n      day: \"2021-01-03\",\n      downloads: 2999,\n    },\n    {\n      day: \"2021-01-04\",\n      downloads: 23508,\n    },\n    {\n      day: \"2021-01-05\",\n      downloads: 25139,\n    },\n    {\n      day: \"2021-01-06\",\n      downloads: 22741,\n    },\n    {\n      day: \"2021-01-07\",\n      downloads: 24462,\n    },\n    {\n      day: \"2021-01-08\",\n      downloads: 22456,\n    },\n    {\n      day: \"2021-01-09\",\n      downloads: 3793,\n    },\n    {\n      day: \"2021-01-10\",\n      downloads: 2861,\n    },\n    {\n      day: \"2021-01-11\",\n      downloads: 24932,\n    },\n    {\n      day: \"2021-01-12\",\n      downloads: 28190,\n    },\n    {\n      day: \"2021-01-13\",\n      downloads: 28990,\n    },\n    {\n      day: \"2021-01-14\",\n      downloads: 25711,\n    },\n    {\n      day: \"2021-01-15\",\n      downloads: 23836,\n    },\n    {\n      day: \"2021-01-16\",\n      downloads: 3807,\n    },\n    {\n      day: \"2021-01-17\",\n      downloads: 3588,\n    },\n    {\n      day: \"2021-01-18\",\n      downloads: 18286,\n    },\n    {\n      day: \"2021-01-19\",\n      downloads: 24055,\n    },\n    {\n      day: \"2021-01-20\",\n      downloads: 26921,\n    },\n    {\n      day: \"2021-01-21\",\n      downloads: 28608,\n    },\n    {\n      day: \"2021-01-22\",\n      downloads: 16587,\n    },\n    {\n      day: \"2021-01-23\",\n      downloads: 4197,\n    },\n    {\n      day: \"2021-01-24\",\n      downloads: 3222,\n    },\n    {\n      day: \"2021-01-25\",\n      downloads: 24115,\n    },\n    {\n      day: \"2021-01-26\",\n      downloads: 27400,\n    },\n    {\n      day: \"2021-01-27\",\n      downloads: 30881,\n    },\n    {\n      day: \"2021-01-28\",\n      downloads: 28594,\n    },\n    {\n      day: \"2021-01-29\",\n      downloads: 23670,\n    },\n    {\n      day: \"2021-01-30\",\n      downloads: 3779,\n    },\n    {\n      day: \"2021-01-31\",\n      downloads: 5639,\n    },\n    {\n      day: \"2021-02-01\",\n      downloads: 26726,\n    },\n    {\n      day: \"2021-02-02\",\n      downloads: 31456,\n    },\n    {\n      day: \"2021-02-03\",\n      downloads: 29737,\n    },\n    {\n      day: \"2021-02-04\",\n      downloads: 30134,\n    },\n    {\n      day: \"2021-02-05\",\n      downloads: 27124,\n    },\n    {\n      day: \"2021-02-06\",\n      downloads: 3902,\n    },\n    {\n      day: \"2021-02-07\",\n      downloads: 2660,\n    },\n    {\n      day: \"2021-02-08\",\n      downloads: 25226,\n    },\n    {\n      day: \"2021-02-09\",\n      downloads: 28695,\n    },\n    {\n      day: \"2021-02-10\",\n      downloads: 31700,\n    },\n    {\n      day: \"2021-02-11\",\n      downloads: 31367,\n    },\n    {\n      day: \"2021-02-12\",\n      downloads: 30522,\n    },\n    {\n      day: \"2021-02-13\",\n      downloads: 5085,\n    },\n    {\n      day: \"2021-02-14\",\n      downloads: 3161,\n    },\n    {\n      day: \"2021-02-15\",\n      downloads: 18898,\n    },\n    {\n      day: \"2021-02-16\",\n      downloads: 26520,\n    },\n    {\n      day: \"2021-02-17\",\n      downloads: 30999,\n    },\n    {\n      day: \"2021-02-18\",\n      downloads: 32560,\n    },\n    {\n      day: \"2021-02-19\",\n      downloads: 25035,\n    },\n    {\n      day: \"2021-02-20\",\n      downloads: 5889,\n    },\n    {\n      day: \"2021-02-21\",\n      downloads: 4197,\n    },\n    {\n      day: \"2021-02-22\",\n      downloads: 25908,\n    },\n    {\n      day: \"2021-02-23\",\n      downloads: 31709,\n    },\n    {\n      day: \"2021-02-24\",\n      downloads: 31478,\n    },\n    {\n      day: \"2021-02-25\",\n      downloads: 30675,\n    },\n    {\n      day: \"2021-02-26\",\n      downloads: 26998,\n    },\n    {\n      day: \"2021-02-27\",\n      downloads: 4194,\n    },\n    {\n      day: \"2021-02-28\",\n      downloads: 3192,\n    },\n    {\n      day: \"2021-03-01\",\n      downloads: 31670,\n    },\n    {\n      day: \"2021-03-02\",\n      downloads: 35314,\n    },\n    {\n      day: \"2021-03-03\",\n      downloads: 34541,\n    },\n    {\n      day: \"2021-03-04\",\n      downloads: 35989,\n    },\n    {\n      day: \"2021-03-05\",\n      downloads: 32976,\n    },\n    {\n      day: \"2021-03-06\",\n      downloads: 5435,\n    },\n    {\n      day: \"2021-03-07\",\n      downloads: 4178,\n    },\n    {\n      day: \"2021-03-08\",\n      downloads: 29242,\n    },\n    {\n      day: \"2021-03-09\",\n      downloads: 35265,\n    },\n    {\n      day: \"2021-03-10\",\n      downloads: 37370,\n    },\n    {\n      day: \"2021-03-11\",\n      downloads: 35769,\n    },\n    {\n      day: \"2021-03-12\",\n      downloads: 32236,\n    },\n    {\n      day: \"2021-03-13\",\n      downloads: 4722,\n    },\n    {\n      day: \"2021-03-14\",\n      downloads: 4567,\n    },\n    {\n      day: \"2021-03-15\",\n      downloads: 30791,\n    },\n    {\n      day: \"2021-03-16\",\n      downloads: 41017,\n    },\n    {\n      day: \"2021-03-17\",\n      downloads: 37429,\n    },\n    {\n      day: \"2021-03-18\",\n      downloads: 34438,\n    },\n    {\n      day: \"2021-03-19\",\n      downloads: 32432,\n    },\n    {\n      day: \"2021-03-20\",\n      downloads: 3987,\n    },\n    {\n      day: \"2021-03-21\",\n      downloads: 3503,\n    },\n    {\n      day: \"2021-03-22\",\n      downloads: 31901,\n    },\n    {\n      day: \"2021-03-23\",\n      downloads: 38687,\n    },\n    {\n      day: \"2021-03-24\",\n      downloads: 40143,\n    },\n    {\n      day: \"2021-03-25\",\n      downloads: 37150,\n    },\n    {\n      day: \"2021-03-26\",\n      downloads: 29342,\n    },\n    {\n      day: \"2021-03-27\",\n      downloads: 3493,\n    },\n    {\n      day: \"2021-03-28\",\n      downloads: 3751,\n    },\n    {\n      day: \"2021-03-29\",\n      downloads: 29782,\n    },\n    {\n      day: \"2021-03-30\",\n      downloads: 31226,\n    },\n    {\n      day: \"2021-03-31\",\n      downloads: 29908,\n    },\n    {\n      day: \"2021-04-01\",\n      downloads: 32087,\n    },\n    {\n      day: \"2021-04-02\",\n      downloads: 25834,\n    },\n    {\n      day: \"2021-04-03\",\n      downloads: 4112,\n    },\n    {\n      day: \"2021-04-04\",\n      downloads: 2930,\n    },\n    {\n      day: \"2021-04-05\",\n      downloads: 19721,\n    },\n    {\n      day: \"2021-04-06\",\n      downloads: 34884,\n    },\n    {\n      day: \"2021-04-07\",\n      downloads: 34513,\n    },\n    {\n      day: \"2021-04-08\",\n      downloads: 31378,\n    },\n    {\n      day: \"2021-04-09\",\n      downloads: 27712,\n    },\n    {\n      day: \"2021-04-10\",\n      downloads: 3947,\n    },\n    {\n      day: \"2021-04-11\",\n      downloads: 2999,\n    },\n    {\n      day: \"2021-04-12\",\n      downloads: 28900,\n    },\n    {\n      day: \"2021-04-13\",\n      downloads: 29758,\n    },\n    {\n      day: \"2021-04-14\",\n      downloads: 31373,\n    },\n    {\n      day: \"2021-04-15\",\n      downloads: 30633,\n    },\n    {\n      day: \"2021-04-16\",\n      downloads: 25806,\n    },\n    {\n      day: \"2021-04-17\",\n      downloads: 3326,\n    },\n    {\n      day: \"2021-04-18\",\n      downloads: 3236,\n    },\n    {\n      day: \"2021-04-19\",\n      downloads: 27906,\n    },\n    {\n      day: \"2021-04-20\",\n      downloads: 30473,\n    },\n    {\n      day: \"2021-04-21\",\n      downloads: 27207,\n    },\n    {\n      day: \"2021-04-22\",\n      downloads: 30079,\n    },\n    {\n      day: \"2021-04-23\",\n      downloads: 27766,\n    },\n    {\n      day: \"2021-04-24\",\n      downloads: 4245,\n    },\n    {\n      day: \"2021-04-25\",\n      downloads: 4867,\n    },\n    {\n      day: \"2021-04-26\",\n      downloads: 30020,\n    },\n    {\n      day: \"2021-04-27\",\n      downloads: 30847,\n    },\n    {\n      day: \"2021-04-28\",\n      downloads: 26309,\n    },\n    {\n      day: \"2021-04-29\",\n      downloads: 28663,\n    },\n    {\n      day: \"2021-04-30\",\n      downloads: 26306,\n    },\n    {\n      day: \"2021-05-01\",\n      downloads: 4367,\n    },\n    {\n      day: \"2021-05-02\",\n      downloads: 3848,\n    },\n    {\n      day: \"2021-05-03\",\n      downloads: 24057,\n    },\n    {\n      day: \"2021-05-04\",\n      downloads: 30155,\n    },\n    {\n      day: \"2021-05-05\",\n      downloads: 31752,\n    },\n    {\n      day: \"2021-05-06\",\n      downloads: 31915,\n    },\n    {\n      day: \"2021-05-07\",\n      downloads: 26207,\n    },\n    {\n      day: \"2021-05-08\",\n      downloads: 5227,\n    },\n    {\n      day: \"2021-05-09\",\n      downloads: 4971,\n    },\n    {\n      day: \"2021-05-10\",\n      downloads: 30286,\n    },\n    {\n      day: \"2021-05-11\",\n      downloads: 33980,\n    },\n    {\n      day: \"2021-05-12\",\n      downloads: 28147,\n    },\n    {\n      day: \"2021-05-13\",\n      downloads: 22746,\n    },\n    {\n      day: \"2021-05-14\",\n      downloads: 19249,\n    },\n    {\n      day: \"2021-05-15\",\n      downloads: 3536,\n    },\n    {\n      day: \"2021-05-16\",\n      downloads: 3364,\n    },\n    {\n      day: \"2021-05-17\",\n      downloads: 23352,\n    },\n    {\n      day: \"2021-05-18\",\n      downloads: 24909,\n    },\n    {\n      day: \"2021-05-19\",\n      downloads: 26653,\n    },\n    {\n      day: \"2021-05-20\",\n      downloads: 27526,\n    },\n    {\n      day: \"2021-05-21\",\n      downloads: 22579,\n    },\n    {\n      day: \"2021-05-22\",\n      downloads: 3402,\n    },\n    {\n      day: \"2021-05-23\",\n      downloads: 3143,\n    },\n    {\n      day: \"2021-05-24\",\n      downloads: 21027,\n    },\n    {\n      day: \"2021-05-25\",\n      downloads: 26073,\n    },\n    {\n      day: \"2021-05-26\",\n      downloads: 26605,\n    },\n    {\n      day: \"2021-05-27\",\n      downloads: 25544,\n    },\n    {\n      day: \"2021-05-28\",\n      downloads: 21428,\n    },\n    {\n      day: \"2021-05-29\",\n      downloads: 3890,\n    },\n    {\n      day: \"2021-05-30\",\n      downloads: 3087,\n    },\n    {\n      day: \"2021-05-31\",\n      downloads: 15917,\n    },\n    {\n      day: \"2021-06-01\",\n      downloads: 25438,\n    },\n    {\n      day: \"2021-06-02\",\n      downloads: 24553,\n    },\n    {\n      day: \"2021-06-03\",\n      downloads: 22469,\n    },\n    {\n      day: \"2021-06-04\",\n      downloads: 21182,\n    },\n    {\n      day: \"2021-06-05\",\n      downloads: 3919,\n    },\n    {\n      day: \"2021-06-06\",\n      downloads: 3233,\n    },\n    {\n      day: \"2021-06-07\",\n      downloads: 23575,\n    },\n    {\n      day: \"2021-06-08\",\n      downloads: 24918,\n    },\n    {\n      day: \"2021-06-09\",\n      downloads: 26959,\n    },\n    {\n      day: \"2021-06-10\",\n      downloads: 26749,\n    },\n    {\n      day: \"2021-06-11\",\n      downloads: 24817,\n    },\n    {\n      day: \"2021-06-12\",\n      downloads: 4117,\n    },\n    {\n      day: \"2021-06-13\",\n      downloads: 3609,\n    },\n    {\n      day: \"2021-06-14\",\n      downloads: 23817,\n    },\n    {\n      day: \"2021-06-15\",\n      downloads: 24946,\n    },\n    {\n      day: \"2021-06-16\",\n      downloads: 25975,\n    },\n    {\n      day: \"2021-06-17\",\n      downloads: 25221,\n    },\n    {\n      day: \"2021-06-18\",\n      downloads: 22787,\n    },\n    {\n      day: \"2021-06-19\",\n      downloads: 4227,\n    },\n    {\n      day: \"2021-06-20\",\n      downloads: 4338,\n    },\n    {\n      day: \"2021-06-21\",\n      downloads: 24645,\n    },\n    {\n      day: \"2021-06-22\",\n      downloads: 26500,\n    },\n    {\n      day: \"2021-06-23\",\n      downloads: 26154,\n    },\n    {\n      day: \"2021-06-24\",\n      downloads: 26479,\n    },\n    {\n      day: \"2021-06-25\",\n      downloads: 23179,\n    },\n    {\n      day: \"2021-06-26\",\n      downloads: 3683,\n    },\n    {\n      day: \"2021-06-27\",\n      downloads: 3358,\n    },\n    {\n      day: \"2021-06-28\",\n      downloads: 25043,\n    },\n    {\n      day: \"2021-06-29\",\n      downloads: 26293,\n    },\n    {\n      day: \"2021-06-30\",\n      downloads: 26195,\n    },\n    {\n      day: \"2021-07-01\",\n      downloads: 24491,\n    },\n    {\n      day: \"2021-07-02\",\n      downloads: 20381,\n    },\n    {\n      day: \"2021-07-03\",\n      downloads: 4260,\n    },\n    {\n      day: \"2021-07-04\",\n      downloads: 3325,\n    },\n    {\n      day: \"2021-07-05\",\n      downloads: 18108,\n    },\n    {\n      day: \"2021-07-06\",\n      downloads: 25962,\n    },\n    {\n      day: \"2021-07-07\",\n      downloads: 27048,\n    },\n    {\n      day: \"2021-07-08\",\n      downloads: 26933,\n    },\n    {\n      day: \"2021-07-09\",\n      downloads: 22873,\n    },\n    {\n      day: \"2021-07-10\",\n      downloads: 4408,\n    },\n    {\n      day: \"2021-07-11\",\n      downloads: 3676,\n    },\n    {\n      day: \"2021-07-12\",\n      downloads: 24152,\n    },\n    {\n      day: \"2021-07-13\",\n      downloads: 26186,\n    },\n    {\n      day: \"2021-07-14\",\n      downloads: 25141,\n    },\n    {\n      day: \"2021-07-15\",\n      downloads: 22874,\n    },\n    {\n      day: \"2021-07-16\",\n      downloads: 22030,\n    },\n    {\n      day: \"2021-07-17\",\n      downloads: 3650,\n    },\n    {\n      day: \"2021-07-18\",\n      downloads: 3174,\n    },\n    {\n      day: \"2021-07-19\",\n      downloads: 24223,\n    },\n    {\n      day: \"2021-07-20\",\n      downloads: 24614,\n    },\n    {\n      day: \"2021-07-21\",\n      downloads: 24809,\n    },\n    {\n      day: \"2021-07-22\",\n      downloads: 24410,\n    },\n    {\n      day: \"2021-07-23\",\n      downloads: 21708,\n    },\n    {\n      day: \"2021-07-24\",\n      downloads: 3629,\n    },\n    {\n      day: \"2021-07-25\",\n      downloads: 3550,\n    },\n    {\n      day: \"2021-07-26\",\n      downloads: 23185,\n    },\n    {\n      day: \"2021-07-27\",\n      downloads: 24284,\n    },\n    {\n      day: \"2021-07-28\",\n      downloads: 25888,\n    },\n    {\n      day: \"2021-07-29\",\n      downloads: 28905,\n    },\n    {\n      day: \"2021-07-30\",\n      downloads: 26884,\n    },\n    {\n      day: \"2021-07-31\",\n      downloads: 5251,\n    },\n    {\n      day: \"2021-08-01\",\n      downloads: 3795,\n    },\n    {\n      day: \"2021-08-02\",\n      downloads: 26195,\n    },\n    {\n      day: \"2021-08-03\",\n      downloads: 26706,\n    },\n    {\n      day: \"2021-08-04\",\n      downloads: 25725,\n    },\n    {\n      day: \"2021-08-05\",\n      downloads: 26992,\n    },\n    {\n      day: \"2021-08-06\",\n      downloads: 23452,\n    },\n    {\n      day: \"2021-08-07\",\n      downloads: 4380,\n    },\n    {\n      day: \"2021-08-08\",\n      downloads: 4038,\n    },\n    {\n      day: \"2021-08-09\",\n      downloads: 24752,\n    },\n    {\n      day: \"2021-08-10\",\n      downloads: 25231,\n    },\n    {\n      day: \"2021-08-11\",\n      downloads: 26137,\n    },\n    {\n      day: \"2021-08-12\",\n      downloads: 24445,\n    },\n    {\n      day: \"2021-08-13\",\n      downloads: 22626,\n    },\n    {\n      day: \"2021-08-14\",\n      downloads: 4343,\n    },\n    {\n      day: \"2021-08-15\",\n      downloads: 3710,\n    },\n    {\n      day: \"2021-08-16\",\n      downloads: 24076,\n    },\n    {\n      day: \"2021-08-17\",\n      downloads: 27186,\n    },\n    {\n      day: \"2021-08-18\",\n      downloads: 27041,\n    },\n    {\n      day: \"2021-08-19\",\n      downloads: 26628,\n    },\n    {\n      day: \"2021-08-20\",\n      downloads: 23355,\n    },\n    {\n      day: \"2021-08-21\",\n      downloads: 4657,\n    },\n    {\n      day: \"2021-08-22\",\n      downloads: 4398,\n    },\n    {\n      day: \"2021-08-23\",\n      downloads: 25731,\n    },\n    {\n      day: \"2021-08-24\",\n      downloads: 28138,\n    },\n    {\n      day: \"2021-08-25\",\n      downloads: 29933,\n    },\n    {\n      day: \"2021-08-26\",\n      downloads: 28361,\n    },\n    {\n      day: \"2021-08-27\",\n      downloads: 24021,\n    },\n    {\n      day: \"2021-08-28\",\n      downloads: 6471,\n    },\n    {\n      day: \"2021-08-29\",\n      downloads: 5731,\n    },\n    {\n      day: \"2021-08-30\",\n      downloads: 26783,\n    },\n    {\n      day: \"2021-08-31\",\n      downloads: 30867,\n    },\n    {\n      day: \"2021-09-01\",\n      downloads: 30372,\n    },\n    {\n      day: \"2021-09-02\",\n      downloads: 28224,\n    },\n    {\n      day: \"2021-09-03\",\n      downloads: 24120,\n    },\n    {\n      day: \"2021-09-04\",\n      downloads: 5786,\n    },\n    {\n      day: \"2021-09-05\",\n      downloads: 5155,\n    },\n    {\n      day: \"2021-09-06\",\n      downloads: 18380,\n    },\n    {\n      day: \"2021-09-07\",\n      downloads: 26666,\n    },\n    {\n      day: \"2021-09-08\",\n      downloads: 29606,\n    },\n    {\n      day: \"2021-09-09\",\n      downloads: 29147,\n    },\n    {\n      day: \"2021-09-10\",\n      downloads: 27082,\n    },\n    {\n      day: \"2021-09-11\",\n      downloads: 5947,\n    },\n    {\n      day: \"2021-09-12\",\n      downloads: 4814,\n    },\n    {\n      day: \"2021-09-13\",\n      downloads: 28199,\n    },\n    {\n      day: \"2021-09-14\",\n      downloads: 29068,\n    },\n    {\n      day: \"2021-09-15\",\n      downloads: 29344,\n    },\n    {\n      day: \"2021-09-16\",\n      downloads: 28970,\n    },\n    {\n      day: \"2021-09-17\",\n      downloads: 27469,\n    },\n    {\n      day: \"2021-09-18\",\n      downloads: 5295,\n    },\n    {\n      day: \"2021-09-19\",\n      downloads: 5045,\n    },\n    {\n      day: \"2021-09-20\",\n      downloads: 30775,\n    },\n    {\n      day: \"2021-09-21\",\n      downloads: 31773,\n    },\n    {\n      day: \"2021-09-22\",\n      downloads: 30680,\n    },\n    {\n      day: \"2021-09-23\",\n      downloads: 29019,\n    },\n    {\n      day: \"2021-09-24\",\n      downloads: 25788,\n    },\n    {\n      day: \"2021-09-25\",\n      downloads: 5323,\n    },\n    {\n      day: \"2021-09-26\",\n      downloads: 4622,\n    },\n    {\n      day: \"2021-09-27\",\n      downloads: 29998,\n    },\n    {\n      day: \"2021-09-28\",\n      downloads: 32915,\n    },\n    {\n      day: \"2021-09-29\",\n      downloads: 32136,\n    },\n    {\n      day: \"2021-09-30\",\n      downloads: 29062,\n    },\n    {\n      day: \"2021-10-01\",\n      downloads: 24783,\n    },\n    {\n      day: \"2021-10-02\",\n      downloads: 5330,\n    },\n    {\n      day: \"2021-10-03\",\n      downloads: 4473,\n    },\n    {\n      day: \"2021-10-04\",\n      downloads: 28509,\n    },\n    {\n      day: \"2021-10-05\",\n      downloads: 29521,\n    },\n    {\n      day: \"2021-10-06\",\n      downloads: 29758,\n    },\n    {\n      day: \"2021-10-07\",\n      downloads: 30932,\n    },\n    {\n      day: \"2021-10-08\",\n      downloads: 24567,\n    },\n    {\n      day: \"2021-10-09\",\n      downloads: 4374,\n    },\n    {\n      day: \"2021-10-10\",\n      downloads: 4679,\n    },\n    {\n      day: \"2021-10-11\",\n      downloads: 25573,\n    },\n    {\n      day: \"2021-10-12\",\n      downloads: 31253,\n    },\n    {\n      day: \"2021-10-13\",\n      downloads: 33742,\n    },\n    {\n      day: \"2021-10-14\",\n      downloads: 30057,\n    },\n    {\n      day: \"2021-10-15\",\n      downloads: 24808,\n    },\n    {\n      day: \"2021-10-16\",\n      downloads: 5353,\n    },\n    {\n      day: \"2021-10-17\",\n      downloads: 4364,\n    },\n    {\n      day: \"2021-10-18\",\n      downloads: 29847,\n    },\n    {\n      day: \"2021-10-19\",\n      downloads: 31155,\n    },\n    {\n      day: \"2021-10-20\",\n      downloads: 32267,\n    },\n    {\n      day: \"2021-10-21\",\n      downloads: 31259,\n    },\n    {\n      day: \"2021-10-22\",\n      downloads: 29982,\n    },\n    {\n      day: \"2021-10-23\",\n      downloads: 4841,\n    },\n    {\n      day: \"2021-10-24\",\n      downloads: 4280,\n    },\n    {\n      day: \"2021-10-25\",\n      downloads: 31353,\n    },\n    {\n      day: \"2021-10-26\",\n      downloads: 32130,\n    },\n    {\n      day: \"2021-10-27\",\n      downloads: 32900,\n    },\n    {\n      day: \"2021-10-28\",\n      downloads: 32738,\n    },\n    {\n      day: \"2021-10-29\",\n      downloads: 28951,\n    },\n    {\n      day: \"2021-10-30\",\n      downloads: 5449,\n    },\n    {\n      day: \"2021-10-31\",\n      downloads: 4387,\n    },\n    {\n      day: \"2021-11-01\",\n      downloads: 26904,\n    },\n    {\n      day: \"2021-11-02\",\n      downloads: 31336,\n    },\n    {\n      day: \"2021-11-03\",\n      downloads: 33930,\n    },\n    {\n      day: \"2021-11-04\",\n      downloads: 30517,\n    },\n    {\n      day: \"2021-11-05\",\n      downloads: 27212,\n    },\n    {\n      day: \"2021-11-06\",\n      downloads: 5034,\n    },\n    {\n      day: \"2021-11-07\",\n      downloads: 4490,\n    },\n    {\n      day: \"2021-11-08\",\n      downloads: 30058,\n    },\n    {\n      day: \"2021-11-09\",\n      downloads: 31402,\n    },\n    {\n      day: \"2021-11-10\",\n      downloads: 31601,\n    },\n    {\n      day: \"2021-11-11\",\n      downloads: 29523,\n    },\n    {\n      day: \"2021-11-12\",\n      downloads: 25841,\n    },\n    {\n      day: \"2021-11-13\",\n      downloads: 6386,\n    },\n    {\n      day: \"2021-11-14\",\n      downloads: 4883,\n    },\n    {\n      day: \"2021-11-15\",\n      downloads: 28717,\n    },\n    {\n      day: \"2021-11-16\",\n      downloads: 32391,\n    },\n    {\n      day: \"2021-11-17\",\n      downloads: 31931,\n    },\n    {\n      day: \"2021-11-18\",\n      downloads: 33460,\n    },\n    {\n      day: \"2021-11-19\",\n      downloads: 27633,\n    },\n    {\n      day: \"2021-11-20\",\n      downloads: 5843,\n    },\n    {\n      day: \"2021-11-21\",\n      downloads: 4523,\n    },\n    {\n      day: \"2021-11-22\",\n      downloads: 29115,\n    },\n    {\n      day: \"2021-11-23\",\n      downloads: 29312,\n    },\n    {\n      day: \"2021-11-24\",\n      downloads: 27447,\n    },\n    {\n      day: \"2021-11-25\",\n      downloads: 22083,\n    },\n    {\n      day: \"2021-11-26\",\n      downloads: 16675,\n    },\n    {\n      day: \"2021-11-27\",\n      downloads: 4423,\n    },\n    {\n      day: \"2021-11-28\",\n      downloads: 4979,\n    },\n    {\n      day: \"2021-11-29\",\n      downloads: 29415,\n    },\n    {\n      day: \"2021-11-30\",\n      downloads: 33020,\n    },\n    {\n      day: \"2021-12-01\",\n      downloads: 31935,\n    },\n    {\n      day: \"2021-12-02\",\n      downloads: 32590,\n    },\n    {\n      day: \"2021-12-03\",\n      downloads: 28653,\n    },\n    {\n      day: \"2021-12-04\",\n      downloads: 6306,\n    },\n    {\n      day: \"2021-12-05\",\n      downloads: 6678,\n    },\n    {\n      day: \"2021-12-06\",\n      downloads: 31237,\n    },\n    {\n      day: \"2021-12-07\",\n      downloads: 32491,\n    },\n    {\n      day: \"2021-12-08\",\n      downloads: 33283,\n    },\n    {\n      day: \"2021-12-09\",\n      downloads: 33460,\n    },\n    {\n      day: \"2021-12-10\",\n      downloads: 29339,\n    },\n    {\n      day: \"2021-12-11\",\n      downloads: 6802,\n    },\n    {\n      day: \"2021-12-12\",\n      downloads: 6911,\n    },\n    {\n      day: \"2021-12-13\",\n      downloads: 32203,\n    },\n    {\n      day: \"2021-12-14\",\n      downloads: 34974,\n    },\n    {\n      day: \"2021-12-15\",\n      downloads: 33808,\n    },\n    {\n      day: \"2021-12-16\",\n      downloads: 33713,\n    },\n    {\n      day: \"2021-12-17\",\n      downloads: 28698,\n    },\n    {\n      day: \"2021-12-18\",\n      downloads: 5625,\n    },\n    {\n      day: \"2021-12-19\",\n      downloads: 4923,\n    },\n    {\n      day: \"2021-12-20\",\n      downloads: 25686,\n    },\n    {\n      day: \"2021-12-21\",\n      downloads: 26888,\n    },\n    {\n      day: \"2021-12-22\",\n      downloads: 25426,\n    },\n    {\n      day: \"2021-12-23\",\n      downloads: 19446,\n    },\n    {\n      day: \"2021-12-24\",\n      downloads: 9413,\n    },\n    {\n      day: \"2021-12-25\",\n      downloads: 3030,\n    },\n    {\n      day: \"2021-12-26\",\n      downloads: 3132,\n    },\n    {\n      day: \"2021-12-27\",\n      downloads: 11147,\n    },\n    {\n      day: \"2021-12-28\",\n      downloads: 14420,\n    },\n    {\n      day: \"2021-12-29\",\n      downloads: 14452,\n    },\n    {\n      day: \"2021-12-30\",\n      downloads: 12949,\n    },\n    {\n      day: \"2021-12-31\",\n      downloads: 7184,\n    },\n    {\n      day: \"2022-01-01\",\n      downloads: 3118,\n    },\n    {\n      day: \"2022-01-02\",\n      downloads: 3604,\n    },\n    {\n      day: \"2022-01-03\",\n      downloads: 20470,\n    },\n    {\n      day: \"2022-01-04\",\n      downloads: 29029,\n    },\n    {\n      day: \"2022-01-05\",\n      downloads: 28776,\n    },\n    {\n      day: \"2022-01-06\",\n      downloads: 27127,\n    },\n    {\n      day: \"2022-01-07\",\n      downloads: 24480,\n    },\n    {\n      day: \"2022-01-08\",\n      downloads: 5290,\n    },\n    {\n      day: \"2022-01-09\",\n      downloads: 4188,\n    },\n    {\n      day: \"2022-01-10\",\n      downloads: 28812,\n    },\n    {\n      day: \"2022-01-11\",\n      downloads: 33299,\n    },\n    {\n      day: \"2022-01-12\",\n      downloads: 34467,\n    },\n    {\n      day: \"2022-01-13\",\n      downloads: 34583,\n    },\n    {\n      day: \"2022-01-14\",\n      downloads: 27741,\n    },\n    {\n      day: \"2022-01-15\",\n      downloads: 5907,\n    },\n    {\n      day: \"2022-01-16\",\n      downloads: 4765,\n    },\n    {\n      day: \"2022-01-17\",\n      downloads: 26521,\n    },\n    {\n      day: \"2022-01-18\",\n      downloads: 32249,\n    },\n    {\n      day: \"2022-01-19\",\n      downloads: 34598,\n    },\n    {\n      day: \"2022-01-20\",\n      downloads: 33340,\n    },\n    {\n      day: \"2022-01-21\",\n      downloads: 29744,\n    },\n    {\n      day: \"2022-01-22\",\n      downloads: 6624,\n    },\n    {\n      day: \"2022-01-23\",\n      downloads: 4290,\n    },\n    {\n      day: \"2022-01-24\",\n      downloads: 34056,\n    },\n    {\n      day: \"2022-01-25\",\n      downloads: 32797,\n    },\n    {\n      day: \"2022-01-26\",\n      downloads: 33913,\n    },\n    {\n      day: \"2022-01-27\",\n      downloads: 38714,\n    },\n    {\n      day: \"2022-01-28\",\n      downloads: 30729,\n    },\n    {\n      day: \"2022-01-29\",\n      downloads: 5324,\n    },\n    {\n      day: \"2022-01-30\",\n      downloads: 4060,\n    },\n    {\n      day: \"2022-01-31\",\n      downloads: 31703,\n    },\n    {\n      day: \"2022-02-01\",\n      downloads: 34845,\n    },\n    {\n      day: \"2022-02-02\",\n      downloads: 35008,\n    },\n    {\n      day: \"2022-02-03\",\n      downloads: 34967,\n    },\n    {\n      day: \"2022-02-04\",\n      downloads: 28915,\n    },\n    {\n      day: \"2022-02-05\",\n      downloads: 4886,\n    },\n    {\n      day: \"2022-02-06\",\n      downloads: 4832,\n    },\n    {\n      day: \"2022-02-07\",\n      downloads: 32543,\n    },\n    {\n      day: \"2022-02-08\",\n      downloads: 35441,\n    },\n    {\n      day: \"2022-02-09\",\n      downloads: 34281,\n    },\n    {\n      day: \"2022-02-10\",\n      downloads: 36041,\n    },\n    {\n      day: \"2022-02-11\",\n      downloads: 28274,\n    },\n    {\n      day: \"2022-02-12\",\n      downloads: 5564,\n    },\n    {\n      day: \"2022-02-13\",\n      downloads: 4111,\n    },\n    {\n      day: \"2022-02-14\",\n      downloads: 32527,\n    },\n    {\n      day: \"2022-02-15\",\n      downloads: 35180,\n    },\n    {\n      day: \"2022-02-16\",\n      downloads: 34349,\n    },\n    {\n      day: \"2022-02-17\",\n      downloads: 36914,\n    },\n    {\n      day: \"2022-02-18\",\n      downloads: 30285,\n    },\n    {\n      day: \"2022-02-19\",\n      downloads: 7269,\n    },\n    {\n      day: \"2022-02-20\",\n      downloads: 4638,\n    },\n    {\n      day: \"2022-02-21\",\n      downloads: 26407,\n    },\n    {\n      day: \"2022-02-22\",\n      downloads: 34958,\n    },\n    {\n      day: \"2022-02-23\",\n      downloads: 33622,\n    },\n    {\n      day: \"2022-02-24\",\n      downloads: 35327,\n    },\n    {\n      day: \"2022-02-25\",\n      downloads: 29819,\n    },\n    {\n      day: \"2022-02-26\",\n      downloads: 6291,\n    },\n    {\n      day: \"2022-02-27\",\n      downloads: 4509,\n    },\n    {\n      day: \"2022-02-28\",\n      downloads: 33077,\n    },\n    {\n      day: \"2022-03-01\",\n      downloads: 33009,\n    },\n    {\n      day: \"2022-03-02\",\n      downloads: 32440,\n    },\n    {\n      day: \"2022-03-03\",\n      downloads: 32676,\n    },\n    {\n      day: \"2022-03-04\",\n      downloads: 26693,\n    },\n    {\n      day: \"2022-03-05\",\n      downloads: 5165,\n    },\n    {\n      day: \"2022-03-06\",\n      downloads: 4877,\n    },\n    {\n      day: \"2022-03-07\",\n      downloads: 31707,\n    },\n    {\n      day: \"2022-03-08\",\n      downloads: 31208,\n    },\n    {\n      day: \"2022-03-09\",\n      downloads: 33411,\n    },\n    {\n      day: \"2022-03-10\",\n      downloads: 38113,\n    },\n    {\n      day: \"2022-03-11\",\n      downloads: 28466,\n    },\n    {\n      day: \"2022-03-12\",\n      downloads: 6198,\n    },\n    {\n      day: \"2022-03-13\",\n      downloads: 5437,\n    },\n    {\n      day: \"2022-03-14\",\n      downloads: 36306,\n    },\n    {\n      day: \"2022-03-15\",\n      downloads: 38970,\n    },\n    {\n      day: \"2022-03-16\",\n      downloads: 40928,\n    },\n    {\n      day: \"2022-03-17\",\n      downloads: 35769,\n    },\n    {\n      day: \"2022-03-18\",\n      downloads: 28626,\n    },\n    {\n      day: \"2022-03-19\",\n      downloads: 8104,\n    },\n    {\n      day: \"2022-03-20\",\n      downloads: 8060,\n    },\n    {\n      day: \"2022-03-21\",\n      downloads: 32369,\n    },\n    {\n      day: \"2022-03-22\",\n      downloads: 34206,\n    },\n    {\n      day: \"2022-03-23\",\n      downloads: 36696,\n    },\n    {\n      day: \"2022-03-24\",\n      downloads: 34328,\n    },\n    {\n      day: \"2022-03-25\",\n      downloads: 30198,\n    },\n    {\n      day: \"2022-03-26\",\n      downloads: 7089,\n    },\n    {\n      day: \"2022-03-27\",\n      downloads: 5900,\n    },\n    {\n      day: \"2022-03-28\",\n      downloads: 33273,\n    },\n    {\n      day: \"2022-03-29\",\n      downloads: 37640,\n    },\n    {\n      day: \"2022-03-30\",\n      downloads: 33853,\n    },\n    {\n      day: \"2022-03-31\",\n      downloads: 32614,\n    },\n    {\n      day: \"2022-04-01\",\n      downloads: 29479,\n    },\n    {\n      day: \"2022-04-02\",\n      downloads: 5385,\n    },\n    {\n      day: \"2022-04-03\",\n      downloads: 5451,\n    },\n    {\n      day: \"2022-04-04\",\n      downloads: 34536,\n    },\n    {\n      day: \"2022-04-05\",\n      downloads: 33116,\n    },\n    {\n      day: \"2022-04-06\",\n      downloads: 31740,\n    },\n    {\n      day: \"2022-04-07\",\n      downloads: 34734,\n    },\n    {\n      day: \"2022-04-08\",\n      downloads: 27016,\n    },\n    {\n      day: \"2022-04-09\",\n      downloads: 5232,\n    },\n    {\n      day: \"2022-04-10\",\n      downloads: 4152,\n    },\n    {\n      day: \"2022-04-11\",\n      downloads: 32506,\n    },\n    {\n      day: \"2022-04-12\",\n      downloads: 34010,\n    },\n    {\n      day: \"2022-04-13\",\n      downloads: 31986,\n    },\n    {\n      day: \"2022-04-14\",\n      downloads: 28088,\n    },\n    {\n      day: \"2022-04-15\",\n      downloads: 16898,\n    },\n    {\n      day: \"2022-04-16\",\n      downloads: 4223,\n    },\n    {\n      day: \"2022-04-17\",\n      downloads: 3583,\n    },\n    {\n      day: \"2022-04-18\",\n      downloads: 20529,\n    },\n    {\n      day: \"2022-04-19\",\n      downloads: 31380,\n    },\n    {\n      day: \"2022-04-20\",\n      downloads: 32003,\n    },\n    {\n      day: \"2022-04-21\",\n      downloads: 30714,\n    },\n    {\n      day: \"2022-04-22\",\n      downloads: 25825,\n    },\n    {\n      day: \"2022-04-23\",\n      downloads: 4818,\n    },\n    {\n      day: \"2022-04-24\",\n      downloads: 4187,\n    },\n    {\n      day: \"2022-04-25\",\n      downloads: 30863,\n    },\n    {\n      day: \"2022-04-26\",\n      downloads: 33634,\n    },\n    {\n      day: \"2022-04-27\",\n      downloads: 33711,\n    },\n    {\n      day: \"2022-04-28\",\n      downloads: 32792,\n    },\n    {\n      day: \"2022-04-29\",\n      downloads: 27600,\n    },\n    {\n      day: \"2022-04-30\",\n      downloads: 4814,\n    },\n    {\n      day: \"2022-05-01\",\n      downloads: 4321,\n    },\n    {\n      day: \"2022-05-02\",\n      downloads: 26992,\n    },\n    {\n      day: \"2022-05-03\",\n      downloads: 29006,\n    },\n    {\n      day: \"2022-05-04\",\n      downloads: 34627,\n    },\n    {\n      day: \"2022-05-05\",\n      downloads: 31922,\n    },\n    {\n      day: \"2022-05-06\",\n      downloads: 26094,\n    },\n    {\n      day: \"2022-05-07\",\n      downloads: 5032,\n    },\n    {\n      day: \"2022-05-08\",\n      downloads: 3028,\n    },\n    {\n      day: \"2022-05-09\",\n      downloads: 33664,\n    },\n    {\n      day: \"2022-05-10\",\n      downloads: 36511,\n    },\n    {\n      day: \"2022-05-11\",\n      downloads: 36027,\n    },\n    {\n      day: \"2022-05-12\",\n      downloads: 32437,\n    },\n    {\n      day: \"2022-05-13\",\n      downloads: 27629,\n    },\n    {\n      day: \"2022-05-14\",\n      downloads: 4436,\n    },\n    {\n      day: \"2022-05-15\",\n      downloads: 5321,\n    },\n    {\n      day: \"2022-05-16\",\n      downloads: 31644,\n    },\n    {\n      day: \"2022-05-17\",\n      downloads: 33423,\n    },\n    {\n      day: \"2022-05-18\",\n      downloads: 33364,\n    },\n    {\n      day: \"2022-05-19\",\n      downloads: 32081,\n    },\n    {\n      day: \"2022-05-20\",\n      downloads: 30859,\n    },\n    {\n      day: \"2022-05-21\",\n      downloads: 4566,\n    },\n    {\n      day: \"2022-05-22\",\n      downloads: 4406,\n    },\n    {\n      day: \"2022-05-23\",\n      downloads: 32104,\n    },\n    {\n      day: \"2022-05-24\",\n      downloads: 35070,\n    },\n    {\n      day: \"2022-05-25\",\n      downloads: 33185,\n    },\n    {\n      day: \"2022-05-26\",\n      downloads: 27032,\n    },\n    {\n      day: \"2022-05-27\",\n      downloads: 25326,\n    },\n    {\n      day: \"2022-05-28\",\n      downloads: 4942,\n    },\n    {\n      day: \"2022-05-29\",\n      downloads: 4297,\n    },\n    {\n      day: \"2022-05-30\",\n      downloads: 23139,\n    },\n    {\n      day: \"2022-05-31\",\n      downloads: 30981,\n    },\n    {\n      day: \"2022-06-01\",\n      downloads: 31128,\n    },\n    {\n      day: \"2022-06-02\",\n      downloads: 31662,\n    },\n    {\n      day: \"2022-06-03\",\n      downloads: 27633,\n    },\n    {\n      day: \"2022-06-04\",\n      downloads: 4508,\n    },\n    {\n      day: \"2022-06-05\",\n      downloads: 3767,\n    },\n    {\n      day: \"2022-06-06\",\n      downloads: 28382,\n    },\n    {\n      day: \"2022-06-07\",\n      downloads: 33045,\n    },\n    {\n      day: \"2022-06-08\",\n      downloads: 34015,\n    },\n    {\n      day: \"2022-06-09\",\n      downloads: 33627,\n    },\n    {\n      day: \"2022-06-10\",\n      downloads: 29459,\n    },\n    {\n      day: \"2022-06-11\",\n      downloads: 4004,\n    },\n    {\n      day: \"2022-06-12\",\n      downloads: 3895,\n    },\n    {\n      day: \"2022-06-13\",\n      downloads: 31946,\n    },\n    {\n      day: \"2022-06-14\",\n      downloads: 34077,\n    },\n    {\n      day: \"2022-06-15\",\n      downloads: 33895,\n    },\n    {\n      day: \"2022-06-16\",\n      downloads: 31219,\n    },\n    {\n      day: \"2022-06-17\",\n      downloads: 26839,\n    },\n    {\n      day: \"2022-06-18\",\n      downloads: 4861,\n    },\n    {\n      day: \"2022-06-19\",\n      downloads: 4077,\n    },\n    {\n      day: \"2022-06-20\",\n      downloads: 26044,\n    },\n    {\n      day: \"2022-06-21\",\n      downloads: 32907,\n    },\n    {\n      day: \"2022-06-22\",\n      downloads: 35392,\n    },\n    {\n      day: \"2022-06-23\",\n      downloads: 33762,\n    },\n    {\n      day: \"2022-06-24\",\n      downloads: 27607,\n    },\n    {\n      day: \"2022-06-25\",\n      downloads: 4459,\n    },\n    {\n      day: \"2022-06-26\",\n      downloads: 4282,\n    },\n    {\n      day: \"2022-06-27\",\n      downloads: 31653,\n    },\n    {\n      day: \"2022-06-28\",\n      downloads: 34577,\n    },\n    {\n      day: \"2022-06-29\",\n      downloads: 32631,\n    },\n    {\n      day: \"2022-06-30\",\n      downloads: 31553,\n    },\n    {\n      day: \"2022-07-01\",\n      downloads: 25990,\n    },\n    {\n      day: \"2022-07-02\",\n      downloads: 4444,\n    },\n    {\n      day: \"2022-07-03\",\n      downloads: 4249,\n    },\n    {\n      day: \"2022-07-04\",\n      downloads: 23629,\n    },\n    {\n      day: \"2022-07-05\",\n      downloads: 31009,\n    },\n    {\n      day: \"2022-07-06\",\n      downloads: 33613,\n    },\n    {\n      day: \"2022-07-07\",\n      downloads: 32788,\n    },\n    {\n      day: \"2022-07-08\",\n      downloads: 25598,\n    },\n    {\n      day: \"2022-07-09\",\n      downloads: 4267,\n    },\n    {\n      day: \"2022-07-10\",\n      downloads: 3751,\n    },\n    {\n      day: \"2022-07-11\",\n      downloads: 31858,\n    },\n    {\n      day: \"2022-07-12\",\n      downloads: 35614,\n    },\n    {\n      day: \"2022-07-13\",\n      downloads: 38198,\n    },\n    {\n      day: \"2022-07-14\",\n      downloads: 37070,\n    },\n    {\n      day: \"2022-07-15\",\n      downloads: 31904,\n    },\n    {\n      day: \"2022-07-16\",\n      downloads: 4863,\n    },\n    {\n      day: \"2022-07-17\",\n      downloads: 4348,\n    },\n    {\n      day: \"2022-07-18\",\n      downloads: 33765,\n    },\n    {\n      day: \"2022-07-19\",\n      downloads: 39552,\n    },\n    {\n      day: \"2022-07-20\",\n      downloads: 40217,\n    },\n    {\n      day: \"2022-07-21\",\n      downloads: 41991,\n    },\n    {\n      day: \"2022-07-22\",\n      downloads: 0,\n    },\n    {\n      day: \"2022-07-23\",\n      downloads: 5208,\n    },\n    {\n      day: \"2022-07-24\",\n      downloads: 4934,\n    },\n    {\n      day: \"2022-07-25\",\n      downloads: 39569,\n    },\n    {\n      day: \"2022-07-26\",\n      downloads: 37316,\n    },\n    {\n      day: \"2022-07-27\",\n      downloads: 36886,\n    },\n    {\n      day: \"2022-07-28\",\n      downloads: 35124,\n    },\n    {\n      day: \"2022-07-29\",\n      downloads: 28415,\n    },\n    {\n      day: \"2022-07-30\",\n      downloads: 4811,\n    },\n    {\n      day: \"2022-07-31\",\n      downloads: 4614,\n    },\n    {\n      day: \"2022-08-01\",\n      downloads: 31594,\n    },\n    {\n      day: \"2022-08-02\",\n      downloads: 31977,\n    },\n    {\n      day: \"2022-08-03\",\n      downloads: 33965,\n    },\n    {\n      day: \"2022-08-04\",\n      downloads: 40292,\n    },\n    {\n      day: \"2022-08-05\",\n      downloads: 34754,\n    },\n    {\n      day: \"2022-08-06\",\n      downloads: 4822,\n    },\n    {\n      day: \"2022-08-07\",\n      downloads: 4592,\n    },\n    {\n      day: \"2022-08-08\",\n      downloads: 38984,\n    },\n    {\n      day: \"2022-08-09\",\n      downloads: 39890,\n    },\n    {\n      day: \"2022-08-10\",\n      downloads: 46371,\n    },\n    {\n      day: \"2022-08-11\",\n      downloads: 40800,\n    },\n    {\n      day: \"2022-08-12\",\n      downloads: 32867,\n    },\n    {\n      day: \"2022-08-13\",\n      downloads: 4566,\n    },\n    {\n      day: \"2022-08-14\",\n      downloads: 4479,\n    },\n    {\n      day: \"2022-08-15\",\n      downloads: 28211,\n    },\n    {\n      day: \"2022-08-16\",\n      downloads: 38135,\n    },\n    {\n      day: \"2022-08-17\",\n      downloads: 42099,\n    },\n    {\n      day: \"2022-08-18\",\n      downloads: 40740,\n    },\n    {\n      day: \"2022-08-19\",\n      downloads: 31223,\n    },\n    {\n      day: \"2022-08-20\",\n      downloads: 4997,\n    },\n    {\n      day: \"2022-08-21\",\n      downloads: 4982,\n    },\n    {\n      day: \"2022-08-22\",\n      downloads: 39473,\n    },\n    {\n      day: \"2022-08-23\",\n      downloads: 40580,\n    },\n    {\n      day: \"2022-08-24\",\n      downloads: 36946,\n    },\n    {\n      day: \"2022-08-25\",\n      downloads: 35167,\n    },\n    {\n      day: \"2022-08-26\",\n      downloads: 31099,\n    },\n    {\n      day: \"2022-08-27\",\n      downloads: 4626,\n    },\n    {\n      day: \"2022-08-28\",\n      downloads: 4177,\n    },\n    {\n      day: \"2022-08-29\",\n      downloads: 31517,\n    },\n    {\n      day: \"2022-08-30\",\n      downloads: 36843,\n    },\n    {\n      day: \"2022-08-31\",\n      downloads: 37416,\n    },\n    {\n      day: \"2022-09-01\",\n      downloads: 40967,\n    },\n    {\n      day: \"2022-09-02\",\n      downloads: 32936,\n    },\n    {\n      day: \"2022-09-03\",\n      downloads: 5451,\n    },\n    {\n      day: \"2022-09-04\",\n      downloads: 4173,\n    },\n    {\n      day: \"2022-09-05\",\n      downloads: 25348,\n    },\n    {\n      day: \"2022-09-06\",\n      downloads: 38304,\n    },\n    {\n      day: \"2022-09-07\",\n      downloads: 40670,\n    },\n    {\n      day: \"2022-09-08\",\n      downloads: 37948,\n    },\n    {\n      day: \"2022-09-09\",\n      downloads: 33688,\n    },\n    {\n      day: \"2022-09-10\",\n      downloads: 4778,\n    },\n    {\n      day: \"2022-09-11\",\n      downloads: 4974,\n    },\n    {\n      day: \"2022-09-12\",\n      downloads: 35847,\n    },\n    {\n      day: \"2022-09-13\",\n      downloads: 38571,\n    },\n    {\n      day: \"2022-09-14\",\n      downloads: 40244,\n    },\n    {\n      day: \"2022-09-15\",\n      downloads: 39516,\n    },\n    {\n      day: \"2022-09-16\",\n      downloads: 32187,\n    },\n    {\n      day: \"2022-09-17\",\n      downloads: 5064,\n    },\n    {\n      day: \"2022-09-18\",\n      downloads: 4873,\n    },\n    {\n      day: \"2022-09-19\",\n      downloads: 37674,\n    },\n    {\n      day: \"2022-09-20\",\n      downloads: 40593,\n    },\n    {\n      day: \"2022-09-21\",\n      downloads: 38164,\n    },\n    {\n      day: \"2022-09-22\",\n      downloads: 35140,\n    },\n    {\n      day: \"2022-09-23\",\n      downloads: 31200,\n    },\n    {\n      day: \"2022-09-24\",\n      downloads: 4917,\n    },\n    {\n      day: \"2022-09-25\",\n      downloads: 4132,\n    },\n    {\n      day: \"2022-09-26\",\n      downloads: 34996,\n    },\n    {\n      day: \"2022-09-27\",\n      downloads: 38293,\n    },\n    {\n      day: \"2022-09-28\",\n      downloads: 37519,\n    },\n    {\n      day: \"2022-09-29\",\n      downloads: 39666,\n    },\n    {\n      day: \"2022-09-30\",\n      downloads: 32197,\n    },\n    {\n      day: \"2022-10-01\",\n      downloads: 6067,\n    },\n    {\n      day: \"2022-10-02\",\n      downloads: 4960,\n    },\n    {\n      day: \"2022-10-03\",\n      downloads: 34454,\n    },\n    {\n      day: \"2022-10-04\",\n      downloads: 38047,\n    },\n    {\n      day: \"2022-10-05\",\n      downloads: 36417,\n    },\n    {\n      day: \"2022-10-06\",\n      downloads: 38492,\n    },\n    {\n      day: \"2022-10-07\",\n      downloads: 32427,\n    },\n    {\n      day: \"2022-10-08\",\n      downloads: 4832,\n    },\n    {\n      day: \"2022-10-09\",\n      downloads: 4778,\n    },\n    {\n      day: \"2022-10-10\",\n      downloads: 32671,\n    },\n    {\n      day: \"2022-10-11\",\n      downloads: 37877,\n    },\n    {\n      day: \"2022-10-12\",\n      downloads: 36881,\n    },\n    {\n      day: \"2022-10-13\",\n      downloads: 38875,\n    },\n    {\n      day: \"2022-10-14\",\n      downloads: 34397,\n    },\n    {\n      day: \"2022-10-15\",\n      downloads: 5108,\n    },\n    {\n      day: \"2022-10-16\",\n      downloads: 4279,\n    },\n    {\n      day: \"2022-10-17\",\n      downloads: 38700,\n    },\n    {\n      day: \"2022-10-18\",\n      downloads: 42548,\n    },\n    {\n      day: \"2022-10-19\",\n      downloads: 41881,\n    },\n    {\n      day: \"2022-10-20\",\n      downloads: 40615,\n    },\n    {\n      day: \"2022-10-21\",\n      downloads: 34599,\n    },\n    {\n      day: \"2022-10-22\",\n      downloads: 5674,\n    },\n    {\n      day: \"2022-10-23\",\n      downloads: 4639,\n    },\n    {\n      day: \"2022-10-24\",\n      downloads: 35157,\n    },\n    {\n      day: \"2022-10-25\",\n      downloads: 38776,\n    },\n    {\n      day: \"2022-10-26\",\n      downloads: 38820,\n    },\n    {\n      day: \"2022-10-27\",\n      downloads: 39645,\n    },\n    {\n      day: \"2022-10-28\",\n      downloads: 34826,\n    },\n    {\n      day: \"2022-10-29\",\n      downloads: 6998,\n    },\n    {\n      day: \"2022-10-30\",\n      downloads: 5425,\n    },\n    {\n      day: \"2022-10-31\",\n      downloads: 33325,\n    },\n    {\n      day: \"2022-11-01\",\n      downloads: 33623,\n    },\n    {\n      day: \"2022-11-02\",\n      downloads: 37272,\n    },\n    {\n      day: \"2022-11-03\",\n      downloads: 40107,\n    },\n    {\n      day: \"2022-11-04\",\n      downloads: 32908,\n    },\n    {\n      day: \"2022-11-05\",\n      downloads: 7709,\n    },\n    {\n      day: \"2022-11-06\",\n      downloads: 5614,\n    },\n    {\n      day: \"2022-11-07\",\n      downloads: 39589,\n    },\n    {\n      day: \"2022-11-08\",\n      downloads: 43175,\n    },\n    {\n      day: \"2022-11-09\",\n      downloads: 41296,\n    },\n    {\n      day: \"2022-11-10\",\n      downloads: 41358,\n    },\n    {\n      day: \"2022-11-11\",\n      downloads: 27929,\n    },\n    {\n      day: \"2022-11-12\",\n      downloads: 5167,\n    },\n    {\n      day: \"2022-11-13\",\n      downloads: 5241,\n    },\n    {\n      day: \"2022-11-14\",\n      downloads: 39861,\n    },\n    {\n      day: \"2022-11-15\",\n      downloads: 44073,\n    },\n    {\n      day: \"2022-11-16\",\n      downloads: 41174,\n    },\n    {\n      day: \"2022-11-17\",\n      downloads: 40983,\n    },\n    {\n      day: \"2022-11-18\",\n      downloads: 33878,\n    },\n    {\n      day: \"2022-11-19\",\n      downloads: 5930,\n    },\n    {\n      day: \"2022-11-20\",\n      downloads: 4699,\n    },\n    {\n      day: \"2022-11-21\",\n      downloads: 36805,\n    },\n    {\n      day: \"2022-11-22\",\n      downloads: 38327,\n    },\n    {\n      day: \"2022-11-23\",\n      downloads: 37672,\n    },\n    {\n      day: \"2022-11-24\",\n      downloads: 28050,\n    },\n    {\n      day: \"2022-11-25\",\n      downloads: 20966,\n    },\n    {\n      day: \"2022-11-26\",\n      downloads: 4732,\n    },\n    {\n      day: \"2022-11-27\",\n      downloads: 5279,\n    },\n    {\n      day: \"2022-11-28\",\n      downloads: 35279,\n    },\n    {\n      day: \"2022-11-29\",\n      downloads: 39366,\n    },\n    {\n      day: \"2022-11-30\",\n      downloads: 36538,\n    },\n    {\n      day: \"2022-12-01\",\n      downloads: 38181,\n    },\n    {\n      day: \"2022-12-02\",\n      downloads: 34167,\n    },\n    {\n      day: \"2022-12-03\",\n      downloads: 6649,\n    },\n    {\n      day: \"2022-12-04\",\n      downloads: 5214,\n    },\n    {\n      day: \"2022-12-05\",\n      downloads: 37614,\n    },\n    {\n      day: \"2022-12-06\",\n      downloads: 38648,\n    },\n    {\n      day: \"2022-12-07\",\n      downloads: 38484,\n    },\n    {\n      day: \"2022-12-08\",\n      downloads: 36338,\n    },\n    {\n      day: \"2022-12-09\",\n      downloads: 30251,\n    },\n    {\n      day: \"2022-12-10\",\n      downloads: 5879,\n    },\n    {\n      day: \"2022-12-11\",\n      downloads: 5098,\n    },\n    {\n      day: \"2022-12-12\",\n      downloads: 36820,\n    },\n    {\n      day: \"2022-12-13\",\n      downloads: 39797,\n    },\n    {\n      day: \"2022-12-14\",\n      downloads: 39771,\n    },\n    {\n      day: \"2022-12-15\",\n      downloads: 37667,\n    },\n    {\n      day: \"2022-12-16\",\n      downloads: 30347,\n    },\n    {\n      day: \"2022-12-17\",\n      downloads: 5894,\n    },\n    {\n      day: \"2022-12-18\",\n      downloads: 4857,\n    },\n    {\n      day: \"2022-12-19\",\n      downloads: 32703,\n    },\n    {\n      day: \"2022-12-20\",\n      downloads: 34754,\n    },\n    {\n      day: \"2022-12-21\",\n      downloads: 33208,\n    },\n    {\n      day: \"2022-12-22\",\n      downloads: 31557,\n    },\n    {\n      day: \"2022-12-23\",\n      downloads: 20475,\n    },\n    {\n      day: \"2022-12-24\",\n      downloads: 4216,\n    },\n    {\n      day: \"2022-12-25\",\n      downloads: 3378,\n    },\n    {\n      day: \"2022-12-26\",\n      downloads: 10833,\n    },\n    {\n      day: \"2022-12-27\",\n      downloads: 16636,\n    },\n    {\n      day: \"2022-12-28\",\n      downloads: 18144,\n    },\n    {\n      day: \"2022-12-29\",\n      downloads: 17490,\n    },\n    {\n      day: \"2022-12-30\",\n      downloads: 13564,\n    },\n    {\n      day: \"2022-12-31\",\n      downloads: 3794,\n    },\n    {\n      day: \"2023-01-01\",\n      downloads: 4139,\n    },\n    {\n      day: \"2023-01-02\",\n      downloads: 15161,\n    },\n    {\n      day: \"2023-01-03\",\n      downloads: 31155,\n    },\n    {\n      day: \"2023-01-04\",\n      downloads: 34187,\n    },\n    {\n      day: \"2023-01-05\",\n      downloads: 33164,\n    },\n    {\n      day: \"2023-01-06\",\n      downloads: 26417,\n    },\n    {\n      day: \"2023-01-07\",\n      downloads: 5514,\n    },\n    {\n      day: \"2023-01-08\",\n      downloads: 4619,\n    },\n    {\n      day: \"2023-01-09\",\n      downloads: 36398,\n    },\n    {\n      day: \"2023-01-10\",\n      downloads: 37812,\n    },\n    {\n      day: \"2023-01-11\",\n      downloads: 37515,\n    },\n    {\n      day: \"2023-01-12\",\n      downloads: 39090,\n    },\n    {\n      day: \"2023-01-13\",\n      downloads: 34165,\n    },\n    {\n      day: \"2023-01-14\",\n      downloads: 5864,\n    },\n    {\n      day: \"2023-01-15\",\n      downloads: 5456,\n    },\n    {\n      day: \"2023-01-16\",\n      downloads: 29712,\n    },\n    {\n      day: \"2023-01-17\",\n      downloads: 37651,\n    },\n    {\n      day: \"2023-01-18\",\n      downloads: 37138,\n    },\n    {\n      day: \"2023-01-19\",\n      downloads: 34241,\n    },\n    {\n      day: \"2023-01-20\",\n      downloads: 31019,\n    },\n    {\n      day: \"2023-01-21\",\n      downloads: 6312,\n    },\n    {\n      day: \"2023-01-22\",\n      downloads: 5676,\n    },\n    {\n      day: \"2023-01-23\",\n      downloads: 36498,\n    },\n    {\n      day: \"2023-01-24\",\n      downloads: 34749,\n    },\n    {\n      day: \"2023-01-25\",\n      downloads: 35075,\n    },\n    {\n      day: \"2023-01-26\",\n      downloads: 33229,\n    },\n    {\n      day: \"2023-01-27\",\n      downloads: 30432,\n    },\n    {\n      day: \"2023-01-28\",\n      downloads: 5804,\n    },\n    {\n      day: \"2023-01-29\",\n      downloads: 5592,\n    },\n    {\n      day: \"2023-01-30\",\n      downloads: 33627,\n    },\n    {\n      day: \"2023-01-31\",\n      downloads: 38561,\n    },\n    {\n      day: \"2023-02-01\",\n      downloads: 36553,\n    },\n    {\n      day: \"2023-02-02\",\n      downloads: 36416,\n    },\n    {\n      day: \"2023-02-03\",\n      downloads: 32195,\n    },\n    {\n      day: \"2023-02-04\",\n      downloads: 6158,\n    },\n    {\n      day: \"2023-02-05\",\n      downloads: 5277,\n    },\n    {\n      day: \"2023-02-06\",\n      downloads: 34466,\n    },\n    {\n      day: \"2023-02-07\",\n      downloads: 38201,\n    },\n    {\n      day: \"2023-02-08\",\n      downloads: 36752,\n    },\n    {\n      day: \"2023-02-09\",\n      downloads: 36118,\n    },\n    {\n      day: \"2023-02-10\",\n      downloads: 30709,\n    },\n    {\n      day: \"2023-02-11\",\n      downloads: 6141,\n    },\n    {\n      day: \"2023-02-12\",\n      downloads: 5516,\n    },\n    {\n      day: \"2023-02-13\",\n      downloads: 33565,\n    },\n    {\n      day: \"2023-02-14\",\n      downloads: 38580,\n    },\n    {\n      day: \"2023-02-15\",\n      downloads: 37636,\n    },\n    {\n      day: \"2023-02-16\",\n      downloads: 36047,\n    },\n    {\n      day: \"2023-02-17\",\n      downloads: 32172,\n    },\n    {\n      day: \"2023-02-18\",\n      downloads: 6804,\n    },\n    {\n      day: \"2023-02-19\",\n      downloads: 5846,\n    },\n    {\n      day: \"2023-02-20\",\n      downloads: 29032,\n    },\n    {\n      day: \"2023-02-21\",\n      downloads: 36983,\n    },\n    {\n      day: \"2023-02-22\",\n      downloads: 39959,\n    },\n    {\n      day: \"2023-02-23\",\n      downloads: 37131,\n    },\n    {\n      day: \"2023-02-24\",\n      downloads: 33259,\n    },\n    {\n      day: \"2023-02-25\",\n      downloads: 6110,\n    },\n    {\n      day: \"2023-02-26\",\n      downloads: 5706,\n    },\n    {\n      day: \"2023-02-27\",\n      downloads: 35556,\n    },\n    {\n      day: \"2023-02-28\",\n      downloads: 38491,\n    },\n    {\n      day: \"2023-03-01\",\n      downloads: 41047,\n    },\n    {\n      day: \"2023-03-02\",\n      downloads: 37515,\n    },\n    {\n      day: \"2023-03-03\",\n      downloads: 31578,\n    },\n    {\n      day: \"2023-03-04\",\n      downloads: 6980,\n    },\n    {\n      day: \"2023-03-05\",\n      downloads: 5447,\n    },\n    {\n      day: \"2023-03-06\",\n      downloads: 35573,\n    },\n    {\n      day: \"2023-03-07\",\n      downloads: 38076,\n    },\n    {\n      day: \"2023-03-08\",\n      downloads: 33708,\n    },\n    {\n      day: \"2023-03-09\",\n      downloads: 37520,\n    },\n    {\n      day: \"2023-03-10\",\n      downloads: 32108,\n    },\n    {\n      day: \"2023-03-11\",\n      downloads: 5788,\n    },\n    {\n      day: \"2023-03-12\",\n      downloads: 5342,\n    },\n    {\n      day: \"2023-03-13\",\n      downloads: 34805,\n    },\n    {\n      day: \"2023-03-14\",\n      downloads: 36822,\n    },\n    {\n      day: \"2023-03-15\",\n      downloads: 39404,\n    },\n    {\n      day: \"2023-03-16\",\n      downloads: 35612,\n    },\n    {\n      day: \"2023-03-17\",\n      downloads: 31099,\n    },\n    {\n      day: \"2023-03-18\",\n      downloads: 5150,\n    },\n    {\n      day: \"2023-03-19\",\n      downloads: 5413,\n    },\n    {\n      day: \"2023-03-20\",\n      downloads: 36060,\n    },\n    {\n      day: \"2023-03-21\",\n      downloads: 38001,\n    },\n    {\n      day: \"2023-03-22\",\n      downloads: 36587,\n    },\n    {\n      day: \"2023-03-23\",\n      downloads: 35442,\n    },\n    {\n      day: \"2023-03-24\",\n      downloads: 29387,\n    },\n    {\n      day: \"2023-03-25\",\n      downloads: 4884,\n    },\n    {\n      day: \"2023-03-26\",\n      downloads: 5453,\n    },\n    {\n      day: \"2023-03-27\",\n      downloads: 33913,\n    },\n    {\n      day: \"2023-03-28\",\n      downloads: 36777,\n    },\n    {\n      day: \"2023-03-29\",\n      downloads: 0,\n    },\n    {\n      day: \"2023-03-30\",\n      downloads: 37871,\n    },\n    {\n      day: \"2023-03-31\",\n      downloads: 30736,\n    },\n    {\n      day: \"2023-04-01\",\n      downloads: 6005,\n    },\n    {\n      day: \"2023-04-02\",\n      downloads: 5313,\n    },\n    {\n      day: \"2023-04-03\",\n      downloads: 34877,\n    },\n    {\n      day: \"2023-04-04\",\n      downloads: 37588,\n    },\n    {\n      day: \"2023-04-05\",\n      downloads: 36490,\n    },\n    {\n      day: \"2023-04-06\",\n      downloads: 32947,\n    },\n    {\n      day: \"2023-04-07\",\n      downloads: 20388,\n    },\n    {\n      day: \"2023-04-08\",\n      downloads: 4398,\n    },\n    {\n      day: \"2023-04-09\",\n      downloads: 3934,\n    },\n    {\n      day: \"2023-04-10\",\n      downloads: 24043,\n    },\n    {\n      day: \"2023-04-11\",\n      downloads: 38119,\n    },\n    {\n      day: \"2023-04-12\",\n      downloads: 35943,\n    },\n    {\n      day: \"2023-04-13\",\n      downloads: 37331,\n    },\n    {\n      day: \"2023-04-14\",\n      downloads: 31630,\n    },\n    {\n      day: \"2023-04-15\",\n      downloads: 4933,\n    },\n    {\n      day: \"2023-04-16\",\n      downloads: 4726,\n    },\n    {\n      day: \"2023-04-17\",\n      downloads: 37000,\n    },\n    {\n      day: \"2023-04-18\",\n      downloads: 40640,\n    },\n    {\n      day: \"2023-04-19\",\n      downloads: 39340,\n    },\n    {\n      day: \"2023-04-20\",\n      downloads: 37948,\n    },\n    {\n      day: \"2023-04-21\",\n      downloads: 31050,\n    },\n    {\n      day: \"2023-04-22\",\n      downloads: 5372,\n    },\n    {\n      day: \"2023-04-23\",\n      downloads: 5310,\n    },\n    {\n      day: \"2023-04-24\",\n      downloads: 39292,\n    },\n    {\n      day: \"2023-04-25\",\n      downloads: 38776,\n    },\n    {\n      day: \"2023-04-26\",\n      downloads: 40695,\n    },\n    {\n      day: \"2023-04-27\",\n      downloads: 39129,\n    },\n    {\n      day: \"2023-04-28\",\n      downloads: 33466,\n    },\n    {\n      day: \"2023-04-29\",\n      downloads: 5324,\n    },\n    {\n      day: \"2023-04-30\",\n      downloads: 4282,\n    },\n    {\n      day: \"2023-05-01\",\n      downloads: 24531,\n    },\n    {\n      day: \"2023-05-02\",\n      downloads: 39738,\n    },\n    {\n      day: \"2023-05-03\",\n      downloads: 39732,\n    },\n    {\n      day: \"2023-05-04\",\n      downloads: 41082,\n    },\n    {\n      day: \"2023-05-05\",\n      downloads: 35119,\n    },\n    {\n      day: \"2023-05-06\",\n      downloads: 5741,\n    },\n    {\n      day: \"2023-05-07\",\n      downloads: 5651,\n    },\n    {\n      day: \"2023-05-08\",\n      downloads: 36849,\n    },\n    {\n      day: \"2023-05-09\",\n      downloads: 39868,\n    },\n    {\n      day: \"2023-05-10\",\n      downloads: 36512,\n    },\n    {\n      day: \"2023-05-11\",\n      downloads: 38502,\n    },\n    {\n      day: \"2023-05-12\",\n      downloads: 33260,\n    },\n    {\n      day: \"2023-05-13\",\n      downloads: 5303,\n    },\n    {\n      day: \"2023-05-14\",\n      downloads: 5373,\n    },\n    {\n      day: \"2023-05-15\",\n      downloads: 37206,\n    },\n    {\n      day: \"2023-05-16\",\n      downloads: 41038,\n    },\n    {\n      day: \"2023-05-17\",\n      downloads: 39702,\n    },\n    {\n      day: \"2023-05-18\",\n      downloads: 32397,\n    },\n    {\n      day: \"2023-05-19\",\n      downloads: 30730,\n    },\n    {\n      day: \"2023-05-20\",\n      downloads: 4879,\n    },\n    {\n      day: \"2023-05-21\",\n      downloads: 4552,\n    },\n    {\n      day: \"2023-05-22\",\n      downloads: 35783,\n    },\n    {\n      day: \"2023-05-23\",\n      downloads: 40767,\n    },\n    {\n      day: \"2023-05-24\",\n      downloads: 41342,\n    },\n    {\n      day: \"2023-05-25\",\n      downloads: 38415,\n    },\n    {\n      day: \"2023-05-26\",\n      downloads: 31889,\n    },\n    {\n      day: \"2023-05-27\",\n      downloads: 4533,\n    },\n    {\n      day: \"2023-05-28\",\n      downloads: 4196,\n    },\n    {\n      day: \"2023-05-29\",\n      downloads: 22728,\n    },\n    {\n      day: \"2023-05-30\",\n      downloads: 35568,\n    },\n    {\n      day: \"2023-05-31\",\n      downloads: 39694,\n    },\n    {\n      day: \"2023-06-01\",\n      downloads: 37264,\n    },\n    {\n      day: \"2023-06-02\",\n      downloads: 32466,\n    },\n    {\n      day: \"2023-06-03\",\n      downloads: 5311,\n    },\n    {\n      day: \"2023-06-04\",\n      downloads: 5766,\n    },\n    {\n      day: \"2023-06-05\",\n      downloads: 36412,\n    },\n    {\n      day: \"2023-06-06\",\n      downloads: 39325,\n    },\n    {\n      day: \"2023-06-07\",\n      downloads: 40969,\n    },\n    {\n      day: \"2023-06-08\",\n      downloads: 38163,\n    },\n    {\n      day: \"2023-06-09\",\n      downloads: 34397,\n    },\n    {\n      day: \"2023-06-10\",\n      downloads: 6196,\n    },\n    {\n      day: \"2023-06-11\",\n      downloads: 4743,\n    },\n    {\n      day: \"2023-06-12\",\n      downloads: 37845,\n    },\n    {\n      day: \"2023-06-13\",\n      downloads: 42043,\n    },\n    {\n      day: \"2023-06-14\",\n      downloads: 41011,\n    },\n    {\n      day: \"2023-06-15\",\n      downloads: 39248,\n    },\n    {\n      day: \"2023-06-16\",\n      downloads: 34490,\n    },\n    {\n      day: \"2023-06-17\",\n      downloads: 5140,\n    },\n    {\n      day: \"2023-06-18\",\n      downloads: 5071,\n    },\n    {\n      day: \"2023-06-19\",\n      downloads: 32493,\n    },\n    {\n      day: \"2023-06-20\",\n      downloads: 38150,\n    },\n    {\n      day: \"2023-06-21\",\n      downloads: 38395,\n    },\n    {\n      day: \"2023-06-22\",\n      downloads: 38171,\n    },\n    {\n      day: \"2023-06-23\",\n      downloads: 34663,\n    },\n    {\n      day: \"2023-06-24\",\n      downloads: 5422,\n    },\n    {\n      day: \"2023-06-25\",\n      downloads: 5376,\n    },\n    {\n      day: \"2023-06-26\",\n      downloads: 37878,\n    },\n    {\n      day: \"2023-06-27\",\n      downloads: 39680,\n    },\n    {\n      day: \"2023-06-28\",\n      downloads: 37314,\n    },\n    {\n      day: \"2023-06-29\",\n      downloads: 35597,\n    },\n    {\n      day: \"2023-06-30\",\n      downloads: 32117,\n    },\n    {\n      day: \"2023-07-01\",\n      downloads: 0,\n    },\n    {\n      day: \"2023-07-02\",\n      downloads: 4654,\n    },\n    {\n      day: \"2023-07-03\",\n      downloads: 31363,\n    },\n    {\n      day: \"2023-07-04\",\n      downloads: 28835,\n    },\n    {\n      day: \"2023-07-05\",\n      downloads: 37381,\n    },\n    {\n      day: \"2023-07-06\",\n      downloads: 39977,\n    },\n    {\n      day: \"2023-07-07\",\n      downloads: 35191,\n    },\n    {\n      day: \"2023-07-08\",\n      downloads: 6754,\n    },\n    {\n      day: \"2023-07-09\",\n      downloads: 5965,\n    },\n    {\n      day: \"2023-07-10\",\n      downloads: 40388,\n    },\n    {\n      day: \"2023-07-11\",\n      downloads: 43661,\n    },\n    {\n      day: \"2023-07-12\",\n      downloads: 41249,\n    },\n    {\n      day: \"2023-07-13\",\n      downloads: 39141,\n    },\n    {\n      day: \"2023-07-14\",\n      downloads: 32866,\n    },\n    {\n      day: \"2023-07-15\",\n      downloads: 5011,\n    },\n    {\n      day: \"2023-07-16\",\n      downloads: 5470,\n    },\n    {\n      day: \"2023-07-17\",\n      downloads: 37968,\n    },\n    {\n      day: \"2023-07-18\",\n      downloads: 41998,\n    },\n    {\n      day: \"2023-07-19\",\n      downloads: 40055,\n    },\n    {\n      day: \"2023-07-20\",\n      downloads: 37709,\n    },\n    {\n      day: \"2023-07-21\",\n      downloads: 31701,\n    },\n    {\n      day: \"2023-07-22\",\n      downloads: 5554,\n    },\n    {\n      day: \"2023-07-23\",\n      downloads: 5110,\n    },\n    {\n      day: \"2023-07-24\",\n      downloads: 37098,\n    },\n    {\n      day: \"2023-07-25\",\n      downloads: 37941,\n    },\n    {\n      day: \"2023-07-26\",\n      downloads: 38245,\n    },\n    {\n      day: \"2023-07-27\",\n      downloads: 35873,\n    },\n    {\n      day: \"2023-07-28\",\n      downloads: 31305,\n    },\n    {\n      day: \"2023-07-29\",\n      downloads: 5294,\n    },\n    {\n      day: \"2023-07-30\",\n      downloads: 5083,\n    },\n    {\n      day: \"2023-07-31\",\n      downloads: 36647,\n    },\n    {\n      day: \"2023-08-01\",\n      downloads: 39219,\n    },\n    {\n      day: \"2023-08-02\",\n      downloads: 39659,\n    },\n    {\n      day: \"2023-08-03\",\n      downloads: 37983,\n    },\n    {\n      day: \"2023-08-04\",\n      downloads: 31218,\n    },\n    {\n      day: \"2023-08-05\",\n      downloads: 5493,\n    },\n    {\n      day: \"2023-08-06\",\n      downloads: 5700,\n    },\n    {\n      day: \"2023-08-07\",\n      downloads: 35960,\n    },\n    {\n      day: \"2023-08-08\",\n      downloads: 40288,\n    },\n    {\n      day: \"2023-08-09\",\n      downloads: 39572,\n    },\n    {\n      day: \"2023-08-10\",\n      downloads: 40725,\n    },\n    {\n      day: \"2023-08-11\",\n      downloads: 32408,\n    },\n    {\n      day: \"2023-08-12\",\n      downloads: 5700,\n    },\n    {\n      day: \"2023-08-13\",\n      downloads: 5725,\n    },\n    {\n      day: \"2023-08-14\",\n      downloads: 37604,\n    },\n    {\n      day: \"2023-08-15\",\n      downloads: 35762,\n    },\n    {\n      day: \"2023-08-16\",\n      downloads: 42059,\n    },\n    {\n      day: \"2023-08-17\",\n      downloads: 39557,\n    },\n    {\n      day: \"2023-08-18\",\n      downloads: 33749,\n    },\n    {\n      day: \"2023-08-19\",\n      downloads: 5545,\n    },\n    {\n      day: \"2023-08-20\",\n      downloads: 5578,\n    },\n    {\n      day: \"2023-08-21\",\n      downloads: 39058,\n    },\n    {\n      day: \"2023-08-22\",\n      downloads: 40394,\n    },\n    {\n      day: \"2023-08-23\",\n      downloads: 39224,\n    },\n    {\n      day: \"2023-08-24\",\n      downloads: 39327,\n    },\n    {\n      day: \"2023-08-25\",\n      downloads: 33640,\n    },\n    {\n      day: \"2023-08-26\",\n      downloads: 5568,\n    },\n    {\n      day: \"2023-08-27\",\n      downloads: 5452,\n    },\n    {\n      day: \"2023-08-28\",\n      downloads: 36824,\n    },\n    {\n      day: \"2023-08-29\",\n      downloads: 39073,\n    },\n    {\n      day: \"2023-08-30\",\n      downloads: 39323,\n    },\n    {\n      day: \"2023-08-31\",\n      downloads: 41019,\n    },\n    {\n      day: \"2023-09-01\",\n      downloads: 33004,\n    },\n    {\n      day: \"2023-09-02\",\n      downloads: 5603,\n    },\n    {\n      day: \"2023-09-03\",\n      downloads: 6058,\n    },\n    {\n      day: \"2023-09-04\",\n      downloads: 25503,\n    },\n    {\n      day: \"2023-09-05\",\n      downloads: 39039,\n    },\n    {\n      day: \"2023-09-06\",\n      downloads: 39465,\n    },\n    {\n      day: \"2023-09-07\",\n      downloads: 37695,\n    },\n    {\n      day: \"2023-09-08\",\n      downloads: 33268,\n    },\n    {\n      day: \"2023-09-09\",\n      downloads: 5515,\n    },\n    {\n      day: \"2023-09-10\",\n      downloads: 5720,\n    },\n    {\n      day: \"2023-09-11\",\n      downloads: 37737,\n    },\n    {\n      day: \"2023-09-12\",\n      downloads: 38926,\n    },\n    {\n      day: \"2023-09-13\",\n      downloads: 0,\n    },\n    {\n      day: \"2023-09-14\",\n      downloads: 0,\n    },\n    {\n      day: \"2023-09-15\",\n      downloads: 33854,\n    },\n    {\n      day: \"2023-09-16\",\n      downloads: 5678,\n    },\n    {\n      day: \"2023-09-17\",\n      downloads: 5551,\n    },\n    {\n      day: \"2023-09-18\",\n      downloads: 36439,\n    },\n    {\n      day: \"2023-09-19\",\n      downloads: 39031,\n    },\n    {\n      day: \"2023-09-20\",\n      downloads: 39950,\n    },\n    {\n      day: \"2023-09-21\",\n      downloads: 38461,\n    },\n    {\n      day: \"2023-09-22\",\n      downloads: 33511,\n    },\n    {\n      day: \"2023-09-23\",\n      downloads: 5157,\n    },\n    {\n      day: \"2023-09-24\",\n      downloads: 5253,\n    },\n    {\n      day: \"2023-09-25\",\n      downloads: 37626,\n    },\n    {\n      day: \"2023-09-26\",\n      downloads: 40204,\n    },\n    {\n      day: \"2023-09-27\",\n      downloads: 40193,\n    },\n    {\n      day: \"2023-09-28\",\n      downloads: 34834,\n    },\n    {\n      day: \"2023-09-29\",\n      downloads: 31401,\n    },\n    {\n      day: \"2023-09-30\",\n      downloads: 5459,\n    },\n    {\n      day: \"2023-10-01\",\n      downloads: 6581,\n    },\n    {\n      day: \"2023-10-02\",\n      downloads: 34473,\n    },\n    {\n      day: \"2023-10-03\",\n      downloads: 38246,\n    },\n    {\n      day: \"2023-10-04\",\n      downloads: 40662,\n    },\n    {\n      day: \"2023-10-05\",\n      downloads: 38160,\n    },\n    {\n      day: \"2023-10-06\",\n      downloads: 33333,\n    },\n    {\n      day: \"2023-10-07\",\n      downloads: 5845,\n    },\n    {\n      day: \"2023-10-08\",\n      downloads: 5461,\n    },\n    {\n      day: \"2023-10-09\",\n      downloads: 30981,\n    },\n    {\n      day: \"2023-10-10\",\n      downloads: 38352,\n    },\n    {\n      day: \"2023-10-11\",\n      downloads: 39837,\n    },\n    {\n      day: \"2023-10-12\",\n      downloads: 39334,\n    },\n    {\n      day: \"2023-10-13\",\n      downloads: 32103,\n    },\n    {\n      day: \"2023-10-14\",\n      downloads: 4948,\n    },\n    {\n      day: \"2023-10-15\",\n      downloads: 5399,\n    },\n    {\n      day: \"2023-10-16\",\n      downloads: 38939,\n    },\n    {\n      day: \"2023-10-17\",\n      downloads: 41498,\n    },\n    {\n      day: \"2023-10-18\",\n      downloads: 40133,\n    },\n    {\n      day: \"2023-10-19\",\n      downloads: 41696,\n    },\n    {\n      day: \"2023-10-20\",\n      downloads: 35038,\n    },\n    {\n      day: \"2023-10-21\",\n      downloads: 5862,\n    },\n    {\n      day: \"2023-10-22\",\n      downloads: 5394,\n    },\n    {\n      day: \"2023-10-23\",\n      downloads: 39043,\n    },\n    {\n      day: \"2023-10-24\",\n      downloads: 38789,\n    },\n    {\n      day: \"2023-10-25\",\n      downloads: 43376,\n    },\n    {\n      day: \"2023-10-26\",\n      downloads: 38491,\n    },\n    {\n      day: \"2023-10-27\",\n      downloads: 35056,\n    },\n    {\n      day: \"2023-10-28\",\n      downloads: 5020,\n    },\n    {\n      day: \"2023-10-29\",\n      downloads: 6042,\n    },\n    {\n      day: \"2023-10-30\",\n      downloads: 39269,\n    },\n    {\n      day: \"2023-10-31\",\n      downloads: 41735,\n    },\n    {\n      day: \"2023-11-01\",\n      downloads: 37687,\n    },\n    {\n      day: \"2023-11-02\",\n      downloads: 13650,\n    },\n    {\n      day: \"2023-11-03\",\n      downloads: 0,\n    },\n    {\n      day: \"2023-11-04\",\n      downloads: 6617,\n    },\n    {\n      day: \"2023-11-05\",\n      downloads: 6054,\n    },\n    {\n      day: \"2023-11-06\",\n      downloads: 42700,\n    },\n    {\n      day: \"2023-11-07\",\n      downloads: 44486,\n    },\n    {\n      day: \"2023-11-08\",\n      downloads: 43884,\n    },\n    {\n      day: \"2023-11-09\",\n      downloads: 40849,\n    },\n    {\n      day: \"2023-11-10\",\n      downloads: 35183,\n    },\n    {\n      day: \"2023-11-11\",\n      downloads: 5803,\n    },\n    {\n      day: \"2023-11-12\",\n      downloads: 6003,\n    },\n    {\n      day: \"2023-11-13\",\n      downloads: 39412,\n    },\n    {\n      day: \"2023-11-14\",\n      downloads: 41653,\n    },\n    {\n      day: \"2023-11-15\",\n      downloads: 41824,\n    },\n    {\n      day: \"2023-11-16\",\n      downloads: 42578,\n    },\n    {\n      day: \"2023-11-17\",\n      downloads: 37206,\n    },\n    {\n      day: \"2023-11-18\",\n      downloads: 6360,\n    },\n    {\n      day: \"2023-11-19\",\n      downloads: 6583,\n    },\n    {\n      day: \"2023-11-20\",\n      downloads: 38234,\n    },\n    {\n      day: \"2023-11-21\",\n      downloads: 42480,\n    },\n    {\n      day: \"2023-11-22\",\n      downloads: 38974,\n    },\n    {\n      day: \"2023-11-23\",\n      downloads: 30813,\n    },\n    {\n      day: \"2023-11-24\",\n      downloads: 26554,\n    },\n    {\n      day: \"2023-11-25\",\n      downloads: 4994,\n    },\n    {\n      day: \"2023-11-26\",\n      downloads: 5757,\n    },\n    {\n      day: \"2023-11-27\",\n      downloads: 40732,\n    },\n    {\n      day: \"2023-11-28\",\n      downloads: 43418,\n    },\n    {\n      day: \"2023-11-29\",\n      downloads: 43964,\n    },\n    {\n      day: \"2023-11-30\",\n      downloads: 43138,\n    },\n    {\n      day: \"2023-12-01\",\n      downloads: 38634,\n    },\n    {\n      day: \"2023-12-02\",\n      downloads: 8195,\n    },\n    {\n      day: \"2023-12-03\",\n      downloads: 7629,\n    },\n    {\n      day: \"2023-12-04\",\n      downloads: 43429,\n    },\n    {\n      day: \"2023-12-05\",\n      downloads: 45672,\n    },\n    {\n      day: \"2023-12-06\",\n      downloads: 45945,\n    },\n    {\n      day: \"2023-12-07\",\n      downloads: 42395,\n    },\n    {\n      day: \"2023-12-08\",\n      downloads: 37113,\n    },\n    {\n      day: \"2023-12-09\",\n      downloads: 8245,\n    },\n    {\n      day: \"2023-12-10\",\n      downloads: 7508,\n    },\n    {\n      day: \"2023-12-11\",\n      downloads: 45494,\n    },\n    {\n      day: \"2023-12-12\",\n      downloads: 49548,\n    },\n    {\n      day: \"2023-12-13\",\n      downloads: 46740,\n    },\n    {\n      day: \"2023-12-14\",\n      downloads: 45794,\n    },\n    {\n      day: \"2023-12-15\",\n      downloads: 39743,\n    },\n    {\n      day: \"2023-12-16\",\n      downloads: 6932,\n    },\n    {\n      day: \"2023-12-17\",\n      downloads: 6192,\n    },\n    {\n      day: \"2023-12-18\",\n      downloads: 38450,\n    },\n    {\n      day: \"2023-12-19\",\n      downloads: 41548,\n    },\n    {\n      day: \"2023-12-20\",\n      downloads: 40992,\n    },\n    {\n      day: \"2023-12-21\",\n      downloads: 37864,\n    },\n    {\n      day: \"2023-12-22\",\n      downloads: 26212,\n    },\n    {\n      day: \"2023-12-23\",\n      downloads: 6303,\n    },\n    {\n      day: \"2023-12-24\",\n      downloads: 5024,\n    },\n    {\n      day: \"2023-12-25\",\n      downloads: 9872,\n    },\n    {\n      day: \"2023-12-26\",\n      downloads: 14261,\n    },\n    {\n      day: \"2023-12-27\",\n      downloads: 18809,\n    },\n    {\n      day: \"2023-12-28\",\n      downloads: 19870,\n    },\n    {\n      day: \"2023-12-29\",\n      downloads: 15239,\n    },\n    {\n      day: \"2023-12-30\",\n      downloads: 5522,\n    },\n    {\n      day: \"2023-12-31\",\n      downloads: 4864,\n    },\n    {\n      day: \"2024-01-01\",\n      downloads: 7638,\n    },\n    {\n      day: \"2024-01-02\",\n      downloads: 33013,\n    },\n    {\n      day: \"2024-01-03\",\n      downloads: 36147,\n    },\n    {\n      day: \"2024-01-04\",\n      downloads: 38681,\n    },\n    {\n      day: \"2024-01-05\",\n      downloads: 34532,\n    },\n    {\n      day: \"2024-01-06\",\n      downloads: 6397,\n    },\n    {\n      day: \"2024-01-07\",\n      downloads: 5425,\n    },\n    {\n      day: \"2024-01-08\",\n      downloads: 39356,\n    },\n    {\n      day: \"2024-01-09\",\n      downloads: 46544,\n    },\n    {\n      day: \"2024-01-10\",\n      downloads: 45818,\n    },\n    {\n      day: \"2024-01-11\",\n      downloads: 45322,\n    },\n    {\n      day: \"2024-01-12\",\n      downloads: 39774,\n    },\n    {\n      day: \"2024-01-13\",\n      downloads: 6236,\n    },\n    {\n      day: \"2024-01-14\",\n      downloads: 5572,\n    },\n    {\n      day: \"2024-01-15\",\n      downloads: 32852,\n    },\n    {\n      day: \"2024-01-16\",\n      downloads: 42961,\n    },\n    {\n      day: \"2024-01-17\",\n      downloads: 45820,\n    },\n    {\n      day: \"2024-01-18\",\n      downloads: 43314,\n    },\n    {\n      day: \"2024-01-19\",\n      downloads: 39618,\n    },\n    {\n      day: \"2024-01-20\",\n      downloads: 6970,\n    },\n    {\n      day: \"2024-01-21\",\n      downloads: 5690,\n    },\n    {\n      day: \"2024-01-22\",\n      downloads: 42138,\n    },\n    {\n      day: \"2024-01-23\",\n      downloads: 45260,\n    },\n    {\n      day: \"2024-01-24\",\n      downloads: 43959,\n    },\n    {\n      day: \"2024-01-25\",\n      downloads: 42333,\n    },\n    {\n      day: \"2024-01-26\",\n      downloads: 36125,\n    },\n    {\n      day: \"2024-01-27\",\n      downloads: 6015,\n    },\n    {\n      day: \"2024-01-28\",\n      downloads: 5956,\n    },\n    {\n      day: \"2024-01-29\",\n      downloads: 43201,\n    },\n    {\n      day: \"2024-01-30\",\n      downloads: 45225,\n    },\n    {\n      day: \"2024-01-31\",\n      downloads: 45249,\n    },\n    {\n      day: \"2024-02-01\",\n      downloads: 45552,\n    },\n    {\n      day: \"2024-02-02\",\n      downloads: 38488,\n    },\n    {\n      day: \"2024-02-03\",\n      downloads: 6521,\n    },\n    {\n      day: \"2024-02-04\",\n      downloads: 5891,\n    },\n    {\n      day: \"2024-02-05\",\n      downloads: 42720,\n    },\n    {\n      day: \"2024-02-06\",\n      downloads: 49491,\n    },\n    {\n      day: \"2024-02-07\",\n      downloads: 49868,\n    },\n    {\n      day: \"2024-02-08\",\n      downloads: 48491,\n    },\n    {\n      day: \"2024-02-09\",\n      downloads: 38858,\n    },\n    {\n      day: \"2024-02-10\",\n      downloads: 6406,\n    },\n    {\n      day: \"2024-02-11\",\n      downloads: 6581,\n    },\n    {\n      day: \"2024-02-12\",\n      downloads: 38601,\n    },\n    {\n      day: \"2024-02-13\",\n      downloads: 45052,\n    },\n    {\n      day: \"2024-02-14\",\n      downloads: 43539,\n    },\n    {\n      day: \"2024-02-15\",\n      downloads: 43567,\n    },\n    {\n      day: \"2024-02-16\",\n      downloads: 38064,\n    },\n    {\n      day: \"2024-02-17\",\n      downloads: 5992,\n    },\n    {\n      day: \"2024-02-18\",\n      downloads: 6255,\n    },\n    {\n      day: \"2024-02-19\",\n      downloads: 35208,\n    },\n    {\n      day: \"2024-02-20\",\n      downloads: 46191,\n    },\n    {\n      day: \"2024-02-21\",\n      downloads: 46609,\n    },\n    {\n      day: \"2024-02-22\",\n      downloads: 45749,\n    },\n    {\n      day: \"2024-02-23\",\n      downloads: 40484,\n    },\n    {\n      day: \"2024-02-24\",\n      downloads: 6768,\n    },\n    {\n      day: \"2024-02-25\",\n      downloads: 5713,\n    },\n    {\n      day: \"2024-02-26\",\n      downloads: 43896,\n    },\n    {\n      day: \"2024-02-27\",\n      downloads: 47491,\n    },\n    {\n      day: \"2024-02-28\",\n      downloads: 47424,\n    },\n    {\n      downloads: 49239,\n      day: \"2024-02-29\",\n    },\n    {\n      downloads: 39884,\n      day: \"2024-03-01\",\n    },\n    {\n      downloads: 6220,\n      day: \"2024-03-02\",\n    },\n    {\n      downloads: 6061,\n      day: \"2024-03-03\",\n    },\n    {\n      downloads: 46081,\n      day: \"2024-03-04\",\n    },\n    {\n      downloads: 49144,\n      day: \"2024-03-05\",\n    },\n    {\n      downloads: 48793,\n      day: \"2024-03-06\",\n    },\n    {\n      downloads: 47389,\n      day: \"2024-03-07\",\n    },\n    {\n      downloads: 39255,\n      day: \"2024-03-08\",\n    },\n    {\n      downloads: 6167,\n      day: \"2024-03-09\",\n    },\n    {\n      downloads: 5542,\n      day: \"2024-03-10\",\n    },\n    {\n      downloads: 44753,\n      day: \"2024-03-11\",\n    },\n    {\n      downloads: 48370,\n      day: \"2024-03-12\",\n    },\n    {\n      downloads: 49478,\n      day: \"2024-03-13\",\n    },\n    {\n      downloads: 50510,\n      day: \"2024-03-14\",\n    },\n    {\n      downloads: 43521,\n      day: \"2024-03-15\",\n    },\n    {\n      downloads: 7275,\n      day: \"2024-03-16\",\n    },\n    {\n      downloads: 6394,\n      day: \"2024-03-17\",\n    },\n    {\n      downloads: 48566,\n      day: \"2024-03-18\",\n    },\n    {\n      downloads: 49237,\n      day: \"2024-03-19\",\n    },\n    {\n      downloads: 49200,\n      day: \"2024-03-20\",\n    },\n    {\n      downloads: 49033,\n      day: \"2024-03-21\",\n    },\n    {\n      downloads: 41682,\n      day: \"2024-03-22\",\n    },\n    {\n      downloads: 6968,\n      day: \"2024-03-23\",\n    },\n    {\n      downloads: 6719,\n      day: \"2024-03-24\",\n    },\n    {\n      downloads: 44236,\n      day: \"2024-03-25\",\n    },\n    {\n      downloads: 33246,\n      day: \"2024-03-26\",\n    },\n    {\n      downloads: 49165,\n      day: \"2024-03-27\",\n    },\n    {\n      downloads: 45089,\n      day: \"2024-03-28\",\n    },\n    {\n      downloads: 27262,\n      day: \"2024-03-29\",\n    },\n    {\n      downloads: 5361,\n      day: \"2024-03-30\",\n    },\n    {\n      downloads: 4404,\n      day: \"2024-03-31\",\n    },\n    {\n      downloads: 34165,\n      day: \"2024-04-01\",\n    },\n    {\n      downloads: 48032,\n      day: \"2024-04-02\",\n    },\n    {\n      downloads: 48322,\n      day: \"2024-04-03\",\n    },\n    {\n      downloads: 46982,\n      day: \"2024-04-04\",\n    },\n    {\n      downloads: 38882,\n      day: \"2024-04-05\",\n    },\n    {\n      downloads: 5921,\n      day: \"2024-04-06\",\n    },\n    {\n      downloads: 5241,\n      day: \"2024-04-07\",\n    },\n    {\n      downloads: 42581,\n      day: \"2024-04-08\",\n    },\n    {\n      downloads: 46718,\n      day: \"2024-04-09\",\n    },\n    {\n      downloads: 45241,\n      day: \"2024-04-10\",\n    },\n    {\n      downloads: 45361,\n      day: \"2024-04-11\",\n    },\n    {\n      downloads: 40250,\n      day: \"2024-04-12\",\n    },\n    {\n      downloads: 5674,\n      day: \"2024-04-13\",\n    },\n    {\n      downloads: 5593,\n      day: \"2024-04-14\",\n    },\n    {\n      downloads: 45283,\n      day: \"2024-04-15\",\n    },\n    {\n      downloads: 48065,\n      day: \"2024-04-16\",\n    },\n    {\n      downloads: 46433,\n      day: \"2024-04-17\",\n    },\n    {\n      downloads: 46132,\n      day: \"2024-04-18\",\n    },\n    {\n      downloads: 41685,\n      day: \"2024-04-19\",\n    },\n    {\n      downloads: 5661,\n      day: \"2024-04-20\",\n    },\n    {\n      downloads: 5183,\n      day: \"2024-04-21\",\n    },\n    {\n      downloads: 45976,\n      day: \"2024-04-22\",\n    },\n    {\n      downloads: 50162,\n      day: \"2024-04-23\",\n    },\n    {\n      downloads: 47458,\n      day: \"2024-04-24\",\n    },\n    {\n      downloads: 46622,\n      day: \"2024-04-25\",\n    },\n    {\n      downloads: 41179,\n      day: \"2024-04-26\",\n    },\n    {\n      downloads: 5984,\n      day: \"2024-04-27\",\n    },\n    {\n      downloads: 5298,\n      day: \"2024-04-28\",\n    },\n    {\n      downloads: 48055,\n      day: \"2024-04-29\",\n    },\n    {\n      downloads: 46840,\n      day: \"2024-04-30\",\n    },\n    {\n      downloads: 33984,\n      day: \"2024-05-01\",\n    },\n    {\n      downloads: 46678,\n      day: \"2024-05-02\",\n    },\n    {\n      downloads: 39210,\n      day: \"2024-05-03\",\n    },\n    {\n      downloads: 5899,\n      day: \"2024-05-04\",\n    },\n    {\n      downloads: 5540,\n      day: \"2024-05-05\",\n    },\n    {\n      downloads: 42105,\n      day: \"2024-05-06\",\n    },\n    {\n      downloads: 45909,\n      day: \"2024-05-07\",\n    },\n    {\n      downloads: 42852,\n      day: \"2024-05-08\",\n    },\n    {\n      downloads: 38213,\n      day: \"2024-05-09\",\n    },\n    {\n      downloads: 35724,\n      day: \"2024-05-10\",\n    },\n    {\n      downloads: 5303,\n      day: \"2024-05-11\",\n    },\n    {\n      downloads: 5558,\n      day: \"2024-05-12\",\n    },\n    {\n      downloads: 44588,\n      day: \"2024-05-13\",\n    },\n    {\n      downloads: 46534,\n      day: \"2024-05-14\",\n    },\n    {\n      downloads: 47102,\n      day: \"2024-05-15\",\n    },\n    {\n      downloads: 46515,\n      day: \"2024-05-16\",\n    },\n    {\n      downloads: 38810,\n      day: \"2024-05-17\",\n    },\n    {\n      downloads: 5013,\n      day: \"2024-05-18\",\n    },\n    {\n      downloads: 5954,\n      day: \"2024-05-19\",\n    },\n    {\n      downloads: 37309,\n      day: \"2024-05-20\",\n    },\n    {\n      downloads: 44657,\n      day: \"2024-05-21\",\n    },\n    {\n      downloads: 46921,\n      day: \"2024-05-22\",\n    },\n    {\n      downloads: 47061,\n      day: \"2024-05-23\",\n    },\n    {\n      downloads: 38988,\n      day: \"2024-05-24\",\n    },\n    {\n      downloads: 5276,\n      day: \"2024-05-25\",\n    },\n    {\n      downloads: 4754,\n      day: \"2024-05-26\",\n    },\n    {\n      downloads: 30522,\n      day: \"2024-05-27\",\n    },\n    {\n      downloads: 45589,\n      day: \"2024-05-28\",\n    },\n    {\n      downloads: 47540,\n      day: \"2024-05-29\",\n    },\n    {\n      downloads: 43133,\n      day: \"2024-05-30\",\n    },\n    {\n      downloads: 38887,\n      day: \"2024-05-31\",\n    },\n    {\n      downloads: 6145,\n      day: \"2024-06-01\",\n    },\n    {\n      downloads: 5426,\n      day: \"2024-06-02\",\n    },\n    {\n      downloads: 44660,\n      day: \"2024-06-03\",\n    },\n    {\n      downloads: 47120,\n      day: \"2024-06-04\",\n    },\n    {\n      downloads: 46757,\n      day: \"2024-06-05\",\n    },\n    {\n      downloads: 46916,\n      day: \"2024-06-06\",\n    },\n    {\n      downloads: 40849,\n      day: \"2024-06-07\",\n    },\n    {\n      downloads: 5565,\n      day: \"2024-06-08\",\n    },\n    {\n      downloads: 6179,\n      day: \"2024-06-09\",\n    },\n    {\n      downloads: 43356,\n      day: \"2024-06-10\",\n    },\n    {\n      downloads: 48334,\n      day: \"2024-06-11\",\n    },\n    {\n      downloads: 47498,\n      day: \"2024-06-12\",\n    },\n    {\n      downloads: 45685,\n      day: \"2024-06-13\",\n    },\n    {\n      downloads: 38268,\n      day: \"2024-06-14\",\n    },\n    {\n      downloads: 5606,\n      day: \"2024-06-15\",\n    },\n    {\n      downloads: 5519,\n      day: \"2024-06-16\",\n    },\n    {\n      downloads: 41621,\n      day: \"2024-06-17\",\n    },\n    {\n      downloads: 45827,\n      day: \"2024-06-18\",\n    },\n    {\n      downloads: 37623,\n      day: \"2024-06-19\",\n    },\n    {\n      downloads: 43190,\n      day: \"2024-06-20\",\n    },\n    {\n      downloads: 36501,\n      day: \"2024-06-21\",\n    },\n    {\n      downloads: 5143,\n      day: \"2024-06-22\",\n    },\n    {\n      downloads: 5799,\n      day: \"2024-06-23\",\n    },\n    {\n      downloads: 43650,\n      day: \"2024-06-24\",\n    },\n    {\n      downloads: 45294,\n      day: \"2024-06-25\",\n    },\n    {\n      downloads: 44611,\n      day: \"2024-06-26\",\n    },\n    {\n      downloads: 41220,\n      day: \"2024-06-27\",\n    },\n    {\n      downloads: 34980,\n      day: \"2024-06-28\",\n    },\n    {\n      downloads: 5426,\n      day: \"2024-06-29\",\n    },\n    {\n      downloads: 5282,\n      day: \"2024-06-30\",\n    },\n    {\n      downloads: 40917,\n      day: \"2024-07-01\",\n    },\n    {\n      downloads: 43207,\n      day: \"2024-07-02\",\n    },\n    {\n      downloads: 43875,\n      day: \"2024-07-03\",\n    },\n    {\n      downloads: 32981,\n      day: \"2024-07-04\",\n    },\n    {\n      downloads: 34079,\n      day: \"2024-07-05\",\n    },\n    {\n      downloads: 4986,\n      day: \"2024-07-06\",\n    },\n    {\n      downloads: 4925,\n      day: \"2024-07-07\",\n    },\n    {\n      downloads: 40505,\n      day: \"2024-07-08\",\n    },\n    {\n      downloads: 44622,\n      day: \"2024-07-09\",\n    },\n    {\n      downloads: 45252,\n      day: \"2024-07-10\",\n    },\n    {\n      downloads: 46270,\n      day: \"2024-07-11\",\n    },\n    {\n      downloads: 38030,\n      day: \"2024-07-12\",\n    },\n    {\n      downloads: 5732,\n      day: \"2024-07-13\",\n    },\n    {\n      downloads: 5599,\n      day: \"2024-07-14\",\n    },\n    {\n      downloads: 42252,\n      day: \"2024-07-15\",\n    },\n    {\n      downloads: 48567,\n      day: \"2024-07-16\",\n    },\n    {\n      downloads: 46149,\n      day: \"2024-07-17\",\n    },\n    {\n      downloads: 45142,\n      day: \"2024-07-18\",\n    },\n    {\n      downloads: 39962,\n      day: \"2024-07-19\",\n    },\n    {\n      downloads: 5959,\n      day: \"2024-07-20\",\n    },\n    {\n      downloads: 5693,\n      day: \"2024-07-21\",\n    },\n    {\n      downloads: 44320,\n      day: \"2024-07-22\",\n    },\n    {\n      downloads: 46739,\n      day: \"2024-07-23\",\n    },\n    {\n      downloads: 45086,\n      day: \"2024-07-24\",\n    },\n    {\n      downloads: 43962,\n      day: \"2024-07-25\",\n    },\n    {\n      downloads: 38304,\n      day: \"2024-07-26\",\n    },\n    {\n      downloads: 6148,\n      day: \"2024-07-27\",\n    },\n    {\n      downloads: 5211,\n      day: \"2024-07-28\",\n    },\n    {\n      downloads: 43683,\n      day: \"2024-07-29\",\n    },\n    {\n      downloads: 46547,\n      day: \"2024-07-30\",\n    },\n    {\n      downloads: 45681,\n      day: \"2024-07-31\",\n    },\n    {\n      downloads: 45254,\n      day: \"2024-08-01\",\n    },\n    {\n      downloads: 37873,\n      day: \"2024-08-02\",\n    },\n    {\n      downloads: 5173,\n      day: \"2024-08-03\",\n    },\n    {\n      downloads: 4845,\n      day: \"2024-08-04\",\n    },\n    {\n      downloads: 39743,\n      day: \"2024-08-05\",\n    },\n    {\n      downloads: 46228,\n      day: \"2024-08-06\",\n    },\n    {\n      downloads: 45960,\n      day: \"2024-08-07\",\n    },\n    {\n      downloads: 44605,\n      day: \"2024-08-08\",\n    },\n    {\n      downloads: 38148,\n      day: \"2024-08-09\",\n    },\n    {\n      downloads: 5604,\n      day: \"2024-08-10\",\n    },\n    {\n      downloads: 5359,\n      day: \"2024-08-11\",\n    },\n    {\n      downloads: 42823,\n      day: \"2024-08-12\",\n    },\n    {\n      downloads: 45127,\n      day: \"2024-08-13\",\n    },\n    {\n      downloads: 44558,\n      day: \"2024-08-14\",\n    },\n    {\n      downloads: 35090,\n      day: \"2024-08-15\",\n    },\n    {\n      downloads: 35105,\n      day: \"2024-08-16\",\n    },\n    {\n      downloads: 5786,\n      day: \"2024-08-17\",\n    },\n    {\n      downloads: 5216,\n      day: \"2024-08-18\",\n    },\n    {\n      downloads: 41373,\n      day: \"2024-08-19\",\n    },\n    {\n      downloads: 47721,\n      day: \"2024-08-20\",\n    },\n    {\n      downloads: 44648,\n      day: \"2024-08-21\",\n    },\n    {\n      downloads: 45633,\n      day: \"2024-08-22\",\n    },\n    {\n      downloads: 38839,\n      day: \"2024-08-23\",\n    },\n    {\n      downloads: 5329,\n      day: \"2024-08-24\",\n    },\n    {\n      downloads: 6474,\n      day: \"2024-08-25\",\n    },\n    {\n      downloads: 42413,\n      day: \"2024-08-26\",\n    },\n    {\n      downloads: 47317,\n      day: \"2024-08-27\",\n    },\n    {\n      downloads: 47835,\n      day: \"2024-08-28\",\n    },\n    {\n      downloads: 47226,\n      day: \"2024-08-29\",\n    },\n    {\n      downloads: 38174,\n      day: \"2024-08-30\",\n    },\n    {\n      downloads: 5673,\n      day: \"2024-08-31\",\n    },\n    {\n      downloads: 7728,\n      day: \"2024-09-01\",\n    },\n    {\n      downloads: 30962,\n      day: \"2024-09-02\",\n    },\n    {\n      downloads: 45510,\n      day: \"2024-09-03\",\n    },\n    {\n      downloads: 46652,\n      day: \"2024-09-04\",\n    },\n    {\n      downloads: 46372,\n      day: \"2024-09-05\",\n    },\n    {\n      downloads: 40206,\n      day: \"2024-09-06\",\n    },\n    {\n      downloads: 5808,\n      day: \"2024-09-07\",\n    },\n    {\n      downloads: 5342,\n      day: \"2024-09-08\",\n    },\n    {\n      downloads: 44284,\n      day: \"2024-09-09\",\n    },\n    {\n      downloads: 44202,\n      day: \"2024-09-10\",\n    },\n    {\n      downloads: 46610,\n      day: \"2024-09-11\",\n    },\n    {\n      downloads: 47516,\n      day: \"2024-09-12\",\n    },\n    {\n      downloads: 38615,\n      day: \"2024-09-13\",\n    },\n    {\n      downloads: 6077,\n      day: \"2024-09-14\",\n    },\n    {\n      downloads: 6061,\n      day: \"2024-09-15\",\n    },\n    {\n      downloads: 44724,\n      day: \"2024-09-16\",\n    },\n    {\n      downloads: 47418,\n      day: \"2024-09-17\",\n    },\n    {\n      downloads: 46723,\n      day: \"2024-09-18\",\n    },\n    {\n      downloads: 46057,\n      day: \"2024-09-19\",\n    },\n    {\n      downloads: 40847,\n      day: \"2024-09-20\",\n    },\n    {\n      downloads: 5834,\n      day: \"2024-09-21\",\n    },\n    {\n      downloads: 6161,\n      day: \"2024-09-22\",\n    },\n    {\n      downloads: 44940,\n      day: \"2024-09-23\",\n    },\n    {\n      downloads: 47685,\n      day: \"2024-09-24\",\n    },\n    {\n      downloads: 47290,\n      day: \"2024-09-25\",\n    },\n    {\n      downloads: 46442,\n      day: \"2024-09-26\",\n    },\n    {\n      downloads: 39081,\n      day: \"2024-09-27\",\n    },\n    {\n      downloads: 5223,\n      day: \"2024-09-28\",\n    },\n    {\n      downloads: 6654,\n      day: \"2024-09-29\",\n    },\n    {\n      downloads: 44609,\n      day: \"2024-09-30\",\n    },\n    {\n      downloads: 44796,\n      day: \"2024-10-01\",\n    },\n  ],\n};\n\nexport default data;\n"
  },
  {
    "path": "website/src/pages/_components/data/update-downloads.js",
    "content": "const fs = require(\"fs\");\nconst path = require(\"path\");\n\nconst data = d().victory;\n\nconst downloads = Object.keys(data).map((day) => ({\n  day,\n  downloads: data[day],\n}));\n\nconst contents = `\nconst data = {\n  data: ${JSON.stringify(downloads, null, 2)}\n};\n\nexport default data;\n`;\n\nfs.writeFileSync(\n  path.resolve(__dirname, \"..\", \"downloads.js\"),\n  contents,\n  \"utf8\",\n);\n\n// HACK: data from npm stats\nfunction d() {\n  return {\n    victory: {\n      \"2015-11-28\": 3,\n      \"2015-11-29\": 4,\n      \"2015-11-30\": 5,\n      \"2015-12-01\": 4,\n      \"2015-12-02\": 2,\n      \"2015-12-03\": 6,\n      \"2015-12-04\": 37,\n      \"2015-12-05\": 14,\n      \"2015-12-06\": 2,\n      \"2015-12-07\": 14,\n      \"2015-12-08\": 4,\n      \"2015-12-09\": 13,\n      \"2015-12-10\": 18,\n      \"2015-12-11\": 10,\n      \"2015-12-12\": 6,\n      \"2015-12-13\": 7,\n      \"2015-12-14\": 7,\n      \"2015-12-15\": 14,\n      \"2015-12-16\": 11,\n      \"2015-12-17\": 12,\n      \"2015-12-18\": 75,\n      \"2015-12-19\": 14,\n      \"2015-12-20\": 13,\n      \"2015-12-21\": 20,\n      \"2015-12-22\": 13,\n      \"2015-12-23\": 9,\n      \"2015-12-24\": 4,\n      \"2015-12-25\": 3,\n      \"2015-12-26\": 14,\n      \"2015-12-27\": 1,\n      \"2015-12-28\": 11,\n      \"2015-12-29\": 36,\n      \"2015-12-30\": 95,\n      \"2015-12-31\": 12,\n      \"2016-01-01\": 12,\n      \"2016-01-02\": 15,\n      \"2016-01-03\": 14,\n      \"2016-01-04\": 35,\n      \"2016-01-05\": 19,\n      \"2016-01-06\": 33,\n      \"2016-01-07\": 47,\n      \"2016-01-08\": 29,\n      \"2016-01-09\": 33,\n      \"2016-01-10\": 19,\n      \"2016-01-11\": 48,\n      \"2016-01-12\": 38,\n      \"2016-01-13\": 38,\n      \"2016-01-14\": 21,\n      \"2016-01-15\": 37,\n      \"2016-01-16\": 45,\n      \"2016-01-17\": 33,\n      \"2016-01-18\": 14,\n      \"2016-01-19\": 33,\n      \"2016-01-20\": 48,\n      \"2016-01-21\": 38,\n      \"2016-01-22\": 36,\n      \"2016-01-23\": 16,\n      \"2016-01-24\": 48,\n      \"2016-01-25\": 43,\n      \"2016-01-26\": 61,\n      \"2016-01-27\": 106,\n      \"2016-01-28\": 73,\n      \"2016-01-29\": 43,\n      \"2016-01-30\": 34,\n      \"2016-01-31\": 25,\n      \"2016-02-01\": 124,\n      \"2016-02-02\": 78,\n      \"2016-02-03\": 64,\n      \"2016-02-04\": 47,\n      \"2016-02-05\": 57,\n      \"2016-02-06\": 23,\n      \"2016-02-07\": 27,\n      \"2016-02-08\": 54,\n      \"2016-02-09\": 68,\n      \"2016-02-10\": 94,\n      \"2016-02-11\": 54,\n      \"2016-02-12\": 72,\n      \"2016-02-13\": 4,\n      \"2016-02-14\": 9,\n      \"2016-02-15\": 53,\n      \"2016-02-16\": 62,\n      \"2016-02-17\": 74,\n      \"2016-02-18\": 103,\n      \"2016-02-19\": 70,\n      \"2016-02-20\": 27,\n      \"2016-02-21\": 41,\n      \"2016-02-22\": 93,\n      \"2016-02-23\": 124,\n      \"2016-02-24\": 108,\n      \"2016-02-25\": 72,\n      \"2016-02-26\": 95,\n      \"2016-02-27\": 36,\n      \"2016-02-28\": 9,\n      \"2016-02-29\": 118,\n      \"2016-03-01\": 98,\n      \"2016-03-02\": 112,\n      \"2016-03-03\": 133,\n      \"2016-03-04\": 105,\n      \"2016-03-05\": 27,\n      \"2016-03-06\": 34,\n      \"2016-03-07\": 176,\n      \"2016-03-08\": 134,\n      \"2016-03-09\": 117,\n      \"2016-03-10\": 89,\n      \"2016-03-11\": 65,\n      \"2016-03-12\": 8,\n      \"2016-03-13\": 10,\n      \"2016-03-14\": 63,\n      \"2016-03-15\": 34,\n      \"2016-03-16\": 66,\n      \"2016-03-17\": 146,\n      \"2016-03-18\": 63,\n      \"2016-03-19\": 30,\n      \"2016-03-20\": 19,\n      \"2016-03-21\": 56,\n      \"2016-03-22\": 49,\n      \"2016-03-23\": 78,\n      \"2016-03-24\": 61,\n      \"2016-03-25\": 21,\n      \"2016-03-26\": 12,\n      \"2016-03-27\": 24,\n      \"2016-03-28\": 68,\n      \"2016-03-29\": 92,\n      \"2016-03-30\": 77,\n      \"2016-03-31\": 46,\n      \"2016-04-01\": 47,\n      \"2016-04-02\": 15,\n      \"2016-04-03\": 6,\n      \"2016-04-04\": 48,\n      \"2016-04-05\": 29,\n      \"2016-04-06\": 56,\n      \"2016-04-07\": 47,\n      \"2016-04-08\": 54,\n      \"2016-04-09\": 8,\n      \"2016-04-10\": 28,\n      \"2016-04-11\": 88,\n      \"2016-04-12\": 59,\n      \"2016-04-13\": 73,\n      \"2016-04-14\": 141,\n      \"2016-04-15\": 222,\n      \"2016-04-16\": 20,\n      \"2016-04-17\": 11,\n      \"2016-04-18\": 126,\n      \"2016-04-19\": 160,\n      \"2016-04-20\": 110,\n      \"2016-04-21\": 80,\n      \"2016-04-22\": 54,\n      \"2016-04-23\": 39,\n      \"2016-04-24\": 3,\n      \"2016-04-25\": 59,\n      \"2016-04-26\": 94,\n      \"2016-04-27\": 61,\n      \"2016-04-28\": 96,\n      \"2016-04-29\": 64,\n      \"2016-04-30\": 40,\n      \"2016-05-01\": 9,\n      \"2016-05-02\": 67,\n      \"2016-05-03\": 145,\n      \"2016-05-04\": 155,\n      \"2016-05-05\": 102,\n      \"2016-05-06\": 56,\n      \"2016-05-07\": 34,\n      \"2016-05-08\": 10,\n      \"2016-05-09\": 65,\n      \"2016-05-10\": 79,\n      \"2016-05-11\": 79,\n      \"2016-05-12\": 82,\n      \"2016-05-13\": 231,\n      \"2016-05-14\": 47,\n      \"2016-05-15\": 40,\n      \"2016-05-16\": 116,\n      \"2016-05-17\": 180,\n      \"2016-05-18\": 127,\n      \"2016-05-19\": 145,\n      \"2016-05-20\": 150,\n      \"2016-05-21\": 44,\n      \"2016-05-22\": 20,\n      \"2016-05-23\": 90,\n      \"2016-05-24\": 109,\n      \"2016-05-25\": 105,\n      \"2016-05-26\": 123,\n      \"2016-05-27\": 161,\n      \"2016-05-28\": 33,\n      \"2016-05-29\": 20,\n      \"2016-05-30\": 133,\n      \"2016-05-31\": 148,\n      \"2016-06-01\": 117,\n      \"2016-06-02\": 347,\n      \"2016-06-03\": 175,\n      \"2016-06-04\": 44,\n      \"2016-06-05\": 34,\n      \"2016-06-06\": 188,\n      \"2016-06-07\": 240,\n      \"2016-06-08\": 252,\n      \"2016-06-09\": 199,\n      \"2016-06-10\": 138,\n      \"2016-06-11\": 85,\n      \"2016-06-12\": 106,\n      \"2016-06-13\": 222,\n      \"2016-06-14\": 187,\n      \"2016-06-15\": 234,\n      \"2016-06-16\": 212,\n      \"2016-06-17\": 314,\n      \"2016-06-18\": 76,\n      \"2016-06-19\": 13,\n      \"2016-06-20\": 171,\n      \"2016-06-21\": 213,\n      \"2016-06-22\": 360,\n      \"2016-06-23\": 185,\n      \"2016-06-24\": 144,\n      \"2016-06-25\": 22,\n      \"2016-06-26\": 25,\n      \"2016-06-27\": 207,\n      \"2016-06-28\": 575,\n      \"2016-06-29\": 362,\n      \"2016-06-30\": 358,\n      \"2016-07-01\": 397,\n      \"2016-07-02\": 33,\n      \"2016-07-03\": 31,\n      \"2016-07-04\": 96,\n      \"2016-07-05\": 151,\n      \"2016-07-06\": 315,\n      \"2016-07-07\": 270,\n      \"2016-07-08\": 213,\n      \"2016-07-09\": 40,\n      \"2016-07-10\": 24,\n      \"2016-07-11\": 224,\n      \"2016-07-12\": 199,\n      \"2016-07-13\": 262,\n      \"2016-07-14\": 287,\n      \"2016-07-15\": 163,\n      \"2016-07-16\": 47,\n      \"2016-07-17\": 9,\n      \"2016-07-18\": 173,\n      \"2016-07-19\": 177,\n      \"2016-07-20\": 321,\n      \"2016-07-21\": 265,\n      \"2016-07-22\": 104,\n      \"2016-07-23\": 21,\n      \"2016-07-24\": 26,\n      \"2016-07-25\": 127,\n      \"2016-07-26\": 172,\n      \"2016-07-27\": 239,\n      \"2016-07-28\": 196,\n      \"2016-07-29\": 318,\n      \"2016-07-30\": 25,\n      \"2016-07-31\": 16,\n      \"2016-08-01\": 383,\n      \"2016-08-02\": 194,\n      \"2016-08-03\": 418,\n      \"2016-08-04\": 438,\n      \"2016-08-05\": 385,\n      \"2016-08-06\": 46,\n      \"2016-08-07\": 29,\n      \"2016-08-08\": 225,\n      \"2016-08-09\": 241,\n      \"2016-08-10\": 179,\n      \"2016-08-11\": 146,\n      \"2016-08-12\": 193,\n      \"2016-08-13\": 62,\n      \"2016-08-14\": 24,\n      \"2016-08-15\": 217,\n      \"2016-08-16\": 327,\n      \"2016-08-17\": 317,\n      \"2016-08-18\": 197,\n      \"2016-08-19\": 420,\n      \"2016-08-20\": 47,\n      \"2016-08-21\": 25,\n      \"2016-08-22\": 260,\n      \"2016-08-23\": 321,\n      \"2016-08-24\": 223,\n      \"2016-08-25\": 237,\n      \"2016-08-26\": 302,\n      \"2016-08-27\": 33,\n      \"2016-08-28\": 57,\n      \"2016-08-29\": 294,\n      \"2016-08-30\": 324,\n      \"2016-08-31\": 283,\n      \"2016-09-01\": 203,\n      \"2016-09-02\": 237,\n      \"2016-09-03\": 51,\n      \"2016-09-04\": 26,\n      \"2016-09-05\": 154,\n      \"2016-09-06\": 230,\n      \"2016-09-07\": 315,\n      \"2016-09-08\": 248,\n      \"2016-09-09\": 394,\n      \"2016-09-10\": 35,\n      \"2016-09-11\": 48,\n      \"2016-09-12\": 188,\n      \"2016-09-13\": 303,\n      \"2016-09-14\": 270,\n      \"2016-09-15\": 555,\n      \"2016-09-16\": 256,\n      \"2016-09-17\": 43,\n      \"2016-09-18\": 38,\n      \"2016-09-19\": 215,\n      \"2016-09-20\": 235,\n      \"2016-09-21\": 298,\n      \"2016-09-22\": 277,\n      \"2016-09-23\": 306,\n      \"2016-09-24\": 31,\n      \"2016-09-25\": 32,\n      \"2016-09-26\": 225,\n      \"2016-09-27\": 321,\n      \"2016-09-28\": 275,\n      \"2016-09-29\": 411,\n      \"2016-09-30\": 641,\n      \"2016-10-01\": 48,\n      \"2016-10-02\": 36,\n      \"2016-10-03\": 252,\n      \"2016-10-04\": 349,\n      \"2016-10-05\": 303,\n      \"2016-10-06\": 415,\n      \"2016-10-07\": 293,\n      \"2016-10-08\": 47,\n      \"2016-10-09\": 48,\n      \"2016-10-10\": 232,\n      \"2016-10-11\": 263,\n      \"2016-10-12\": 331,\n      \"2016-10-13\": 379,\n      \"2016-10-14\": 654,\n      \"2016-10-15\": 89,\n      \"2016-10-16\": 57,\n      \"2016-10-17\": 581,\n      \"2016-10-18\": 379,\n      \"2016-10-19\": 340,\n      \"2016-10-20\": 342,\n      \"2016-10-21\": 431,\n      \"2016-10-22\": 94,\n      \"2016-10-23\": 100,\n      \"2016-10-24\": 444,\n      \"2016-10-25\": 523,\n      \"2016-10-26\": 635,\n      \"2016-10-27\": 487,\n      \"2016-10-28\": 669,\n      \"2016-10-29\": 117,\n      \"2016-10-30\": 123,\n      \"2016-10-31\": 643,\n      \"2016-11-01\": 578,\n      \"2016-11-02\": 504,\n      \"2016-11-03\": 431,\n      \"2016-11-04\": 389,\n      \"2016-11-05\": 92,\n      \"2016-11-06\": 70,\n      \"2016-11-07\": 283,\n      \"2016-11-08\": 408,\n      \"2016-11-09\": 720,\n      \"2016-11-10\": 712,\n      \"2016-11-11\": 701,\n      \"2016-11-12\": 190,\n      \"2016-11-13\": 135,\n      \"2016-11-14\": 521,\n      \"2016-11-15\": 562,\n      \"2016-11-16\": 491,\n      \"2016-11-17\": 619,\n      \"2016-11-18\": 443,\n      \"2016-11-19\": 168,\n      \"2016-11-20\": 88,\n      \"2016-11-21\": 388,\n      \"2016-11-22\": 542,\n      \"2016-11-23\": 504,\n      \"2016-11-24\": 275,\n      \"2016-11-25\": 197,\n      \"2016-11-26\": 55,\n      \"2016-11-27\": 50,\n      \"2016-11-28\": 493,\n      \"2016-11-29\": 642,\n      \"2016-11-30\": 498,\n      \"2016-12-01\": 472,\n      \"2016-12-02\": 556,\n      \"2016-12-03\": 265,\n      \"2016-12-04\": 117,\n      \"2016-12-05\": 527,\n      \"2016-12-06\": 667,\n      \"2016-12-07\": 601,\n      \"2016-12-08\": 629,\n      \"2016-12-09\": 689,\n      \"2016-12-10\": 139,\n      \"2016-12-11\": 80,\n      \"2016-12-12\": 746,\n      \"2016-12-13\": 843,\n      \"2016-12-14\": 1045,\n      \"2016-12-15\": 681,\n      \"2016-12-16\": 671,\n      \"2016-12-17\": 167,\n      \"2016-12-18\": 108,\n      \"2016-12-19\": 593,\n      \"2016-12-20\": 697,\n      \"2016-12-21\": 641,\n      \"2016-12-22\": 645,\n      \"2016-12-23\": 341,\n      \"2016-12-24\": 77,\n      \"2016-12-25\": 52,\n      \"2016-12-26\": 151,\n      \"2016-12-27\": 287,\n      \"2016-12-28\": 294,\n      \"2016-12-29\": 297,\n      \"2016-12-30\": 163,\n      \"2016-12-31\": 39,\n      \"2017-01-01\": 70,\n      \"2017-01-02\": 178,\n      \"2017-01-03\": 475,\n      \"2017-01-04\": 1037,\n      \"2017-01-05\": 744,\n      \"2017-01-06\": 681,\n      \"2017-01-07\": 162,\n      \"2017-01-08\": 109,\n      \"2017-01-09\": 583,\n      \"2017-01-10\": 718,\n      \"2017-01-11\": 840,\n      \"2017-01-12\": 730,\n      \"2017-01-13\": 653,\n      \"2017-01-14\": 410,\n      \"2017-01-15\": 185,\n      \"2017-01-16\": 450,\n      \"2017-01-17\": 588,\n      \"2017-01-18\": 786,\n      \"2017-01-19\": 692,\n      \"2017-01-20\": 648,\n      \"2017-01-21\": 159,\n      \"2017-01-22\": 114,\n      \"2017-01-23\": 512,\n      \"2017-01-24\": 1197,\n      \"2017-01-25\": 731,\n      \"2017-01-26\": 770,\n      \"2017-01-27\": 679,\n      \"2017-01-28\": 146,\n      \"2017-01-29\": 155,\n      \"2017-01-30\": 592,\n      \"2017-01-31\": 1095,\n      \"2017-02-01\": 775,\n      \"2017-02-02\": 658,\n      \"2017-02-03\": 670,\n      \"2017-02-04\": 634,\n      \"2017-02-05\": 110,\n      \"2017-02-06\": 1141,\n      \"2017-02-07\": 698,\n      \"2017-02-08\": 833,\n      \"2017-02-09\": 830,\n      \"2017-02-10\": 1215,\n      \"2017-02-11\": 120,\n      \"2017-02-12\": 103,\n      \"2017-02-13\": 724,\n      \"2017-02-14\": 738,\n      \"2017-02-15\": 686,\n      \"2017-02-16\": 708,\n      \"2017-02-17\": 1054,\n      \"2017-02-18\": 154,\n      \"2017-02-19\": 108,\n      \"2017-02-20\": 540,\n      \"2017-02-21\": 782,\n      \"2017-02-22\": 899,\n      \"2017-02-23\": 928,\n      \"2017-02-24\": 925,\n      \"2017-02-25\": 155,\n      \"2017-02-26\": 163,\n      \"2017-02-27\": 1259,\n      \"2017-02-28\": 725,\n      \"2017-03-01\": 848,\n      \"2017-03-02\": 724,\n      \"2017-03-03\": 859,\n      \"2017-03-04\": 213,\n      \"2017-03-05\": 149,\n      \"2017-03-06\": 836,\n      \"2017-03-07\": 861,\n      \"2017-03-08\": 1001,\n      \"2017-03-09\": 1027,\n      \"2017-03-10\": 969,\n      \"2017-03-11\": 157,\n      \"2017-03-12\": 142,\n      \"2017-03-13\": 987,\n      \"2017-03-14\": 937,\n      \"2017-03-15\": 1350,\n      \"2017-03-16\": 1318,\n      \"2017-03-17\": 767,\n      \"2017-03-18\": 159,\n      \"2017-03-19\": 102,\n      \"2017-03-20\": 991,\n      \"2017-03-21\": 1489,\n      \"2017-03-22\": 1040,\n      \"2017-03-23\": 964,\n      \"2017-03-24\": 1036,\n      \"2017-03-25\": 138,\n      \"2017-03-26\": 167,\n      \"2017-03-27\": 1207,\n      \"2017-03-28\": 1466,\n      \"2017-03-29\": 1264,\n      \"2017-03-30\": 1037,\n      \"2017-03-31\": 1252,\n      \"2017-04-01\": 127,\n      \"2017-04-02\": 200,\n      \"2017-04-03\": 1140,\n      \"2017-04-04\": 1600,\n      \"2017-04-05\": 1399,\n      \"2017-04-06\": 1366,\n      \"2017-04-07\": 1307,\n      \"2017-04-08\": 263,\n      \"2017-04-09\": 153,\n      \"2017-04-10\": 1338,\n      \"2017-04-11\": 1406,\n      \"2017-04-12\": 1181,\n      \"2017-04-13\": 1252,\n      \"2017-04-14\": 843,\n      \"2017-04-15\": 172,\n      \"2017-04-16\": 121,\n      \"2017-04-17\": 836,\n      \"2017-04-18\": 1226,\n      \"2017-04-19\": 1317,\n      \"2017-04-20\": 1497,\n      \"2017-04-21\": 1208,\n      \"2017-04-22\": 162,\n      \"2017-04-23\": 126,\n      \"2017-04-24\": 1339,\n      \"2017-04-25\": 1510,\n      \"2017-04-26\": 1417,\n      \"2017-04-27\": 1323,\n      \"2017-04-28\": 1970,\n      \"2017-04-29\": 212,\n      \"2017-04-30\": 180,\n      \"2017-05-01\": 667,\n      \"2017-05-02\": 1698,\n      \"2017-05-03\": 1126,\n      \"2017-05-04\": 1274,\n      \"2017-05-05\": 1142,\n      \"2017-05-06\": 179,\n      \"2017-05-07\": 147,\n      \"2017-05-08\": 1097,\n      \"2017-05-09\": 1207,\n      \"2017-05-10\": 1334,\n      \"2017-05-11\": 1183,\n      \"2017-05-12\": 1344,\n      \"2017-05-13\": 232,\n      \"2017-05-14\": 208,\n      \"2017-05-15\": 976,\n      \"2017-05-16\": 1078,\n      \"2017-05-17\": 1033,\n      \"2017-05-18\": 1257,\n      \"2017-05-19\": 1069,\n      \"2017-05-20\": 178,\n      \"2017-05-21\": 112,\n      \"2017-05-22\": 1036,\n      \"2017-05-23\": 1084,\n      \"2017-05-24\": 1646,\n      \"2017-05-25\": 899,\n      \"2017-05-26\": 1028,\n      \"2017-05-27\": 293,\n      \"2017-05-28\": 163,\n      \"2017-05-29\": 619,\n      \"2017-05-30\": 1051,\n      \"2017-05-31\": 1318,\n      \"2017-06-01\": 1195,\n      \"2017-06-02\": 862,\n      \"2017-06-03\": 903,\n      \"2017-06-04\": 151,\n      \"2017-06-05\": 872,\n      \"2017-06-06\": 1710,\n      \"2017-06-07\": 1504,\n      \"2017-06-08\": 1267,\n      \"2017-06-09\": 1169,\n      \"2017-06-10\": 375,\n      \"2017-06-11\": 190,\n      \"2017-06-12\": 1035,\n      \"2017-06-13\": 1254,\n      \"2017-06-14\": 1236,\n      \"2017-06-15\": 926,\n      \"2017-06-16\": 1010,\n      \"2017-06-17\": 217,\n      \"2017-06-18\": 125,\n      \"2017-06-19\": 1088,\n      \"2017-06-20\": 1174,\n      \"2017-06-21\": 1328,\n      \"2017-06-22\": 1264,\n      \"2017-06-23\": 1075,\n      \"2017-06-24\": 271,\n      \"2017-06-25\": 174,\n      \"2017-06-26\": 1251,\n      \"2017-06-27\": 1298,\n      \"2017-06-28\": 1331,\n      \"2017-06-29\": 1214,\n      \"2017-06-30\": 1689,\n      \"2017-07-01\": 212,\n      \"2017-07-02\": 170,\n      \"2017-07-03\": 819,\n      \"2017-07-04\": 702,\n      \"2017-07-05\": 1315,\n      \"2017-07-06\": 1531,\n      \"2017-07-07\": 1256,\n      \"2017-07-08\": 230,\n      \"2017-07-09\": 221,\n      \"2017-07-10\": 1287,\n      \"2017-07-11\": 1202,\n      \"2017-07-12\": 1295,\n      \"2017-07-13\": 2118,\n      \"2017-07-14\": 1447,\n      \"2017-07-15\": 348,\n      \"2017-07-16\": 273,\n      \"2017-07-17\": 1294,\n      \"2017-07-18\": 1396,\n      \"2017-07-19\": 1509,\n      \"2017-07-20\": 1332,\n      \"2017-07-21\": 1275,\n      \"2017-07-22\": 216,\n      \"2017-07-23\": 202,\n      \"2017-07-24\": 2073,\n      \"2017-07-25\": 1470,\n      \"2017-07-26\": 1429,\n      \"2017-07-27\": 1474,\n      \"2017-07-28\": 1265,\n      \"2017-07-29\": 196,\n      \"2017-07-30\": 194,\n      \"2017-07-31\": 1168,\n      \"2017-08-01\": 1413,\n      \"2017-08-02\": 1578,\n      \"2017-08-03\": 1459,\n      \"2017-08-04\": 1847,\n      \"2017-08-05\": 581,\n      \"2017-08-06\": 302,\n      \"2017-08-07\": 1464,\n      \"2017-08-08\": 2344,\n      \"2017-08-09\": 1595,\n      \"2017-08-10\": 1441,\n      \"2017-08-11\": 1446,\n      \"2017-08-12\": 323,\n      \"2017-08-13\": 200,\n      \"2017-08-14\": 1461,\n      \"2017-08-15\": 1558,\n      \"2017-08-16\": 1649,\n      \"2017-08-17\": 2539,\n      \"2017-08-18\": 1570,\n      \"2017-08-19\": 318,\n      \"2017-08-20\": 959,\n      \"2017-08-21\": 1389,\n      \"2017-08-22\": 1609,\n      \"2017-08-23\": 1585,\n      \"2017-08-24\": 1752,\n      \"2017-08-25\": 1426,\n      \"2017-08-26\": 292,\n      \"2017-08-27\": 232,\n      \"2017-08-28\": 1431,\n      \"2017-08-29\": 1767,\n      \"2017-08-30\": 1554,\n      \"2017-08-31\": 1702,\n      \"2017-09-01\": 1430,\n      \"2017-09-02\": 225,\n      \"2017-09-03\": 239,\n      \"2017-09-04\": 865,\n      \"2017-09-05\": 2541,\n      \"2017-09-06\": 1884,\n      \"2017-09-07\": 1536,\n      \"2017-09-08\": 1414,\n      \"2017-09-09\": 847,\n      \"2017-09-10\": 790,\n      \"2017-09-11\": 1669,\n      \"2017-09-12\": 2323,\n      \"2017-09-13\": 2511,\n      \"2017-09-14\": 2041,\n      \"2017-09-15\": 1738,\n      \"2017-09-16\": 408,\n      \"2017-09-17\": 303,\n      \"2017-09-18\": 1606,\n      \"2017-09-19\": 1852,\n      \"2017-09-20\": 1878,\n      \"2017-09-21\": 1826,\n      \"2017-09-22\": 1718,\n      \"2017-09-23\": 453,\n      \"2017-09-24\": 292,\n      \"2017-09-25\": 1834,\n      \"2017-09-26\": 1886,\n      \"2017-09-27\": 2829,\n      \"2017-09-28\": 1844,\n      \"2017-09-29\": 1828,\n      \"2017-09-30\": 1208,\n      \"2017-10-01\": 433,\n      \"2017-10-02\": 1781,\n      \"2017-10-03\": 1822,\n      \"2017-10-04\": 2050,\n      \"2017-10-05\": 2734,\n      \"2017-10-06\": 1741,\n      \"2017-10-07\": 469,\n      \"2017-10-08\": 571,\n      \"2017-10-09\": 1524,\n      \"2017-10-10\": 1785,\n      \"2017-10-11\": 1945,\n      \"2017-10-12\": 1611,\n      \"2017-10-13\": 1644,\n      \"2017-10-14\": 326,\n      \"2017-10-15\": 344,\n      \"2017-10-16\": 1639,\n      \"2017-10-17\": 1948,\n      \"2017-10-18\": 2073,\n      \"2017-10-19\": 1658,\n      \"2017-10-20\": 2751,\n      \"2017-10-21\": 1382,\n      \"2017-10-22\": 540,\n      \"2017-10-23\": 3575,\n      \"2017-10-24\": 4549,\n      \"2017-10-25\": 6032,\n      \"2017-10-26\": 4673,\n      \"2017-10-27\": 4633,\n      \"2017-10-28\": 881,\n      \"2017-10-29\": 601,\n      \"2017-10-30\": 3815,\n      \"2017-10-31\": 6860,\n      \"2017-11-01\": 7947,\n      \"2017-11-02\": 5549,\n      \"2017-11-03\": 5317,\n      \"2017-11-04\": 1301,\n      \"2017-11-05\": 872,\n      \"2017-11-06\": 5350,\n      \"2017-11-07\": 6889,\n      \"2017-11-08\": 7629,\n      \"2017-11-09\": 6780,\n      \"2017-11-10\": 5675,\n      \"2017-11-11\": 1371,\n      \"2017-11-12\": 707,\n      \"2017-11-13\": 3836,\n      \"2017-11-14\": 4810,\n      \"2017-11-15\": 5942,\n      \"2017-11-16\": 6317,\n      \"2017-11-17\": 4852,\n      \"2017-11-18\": 1204,\n      \"2017-11-19\": 546,\n      \"2017-11-20\": 4443,\n      \"2017-11-21\": 4247,\n      \"2017-11-22\": 5021,\n      \"2017-11-23\": 1875,\n      \"2017-11-24\": 1260,\n      \"2017-11-25\": 324,\n      \"2017-11-26\": 401,\n      \"2017-11-27\": 4427,\n      \"2017-11-28\": 6964,\n      \"2017-11-29\": 5950,\n      \"2017-11-30\": 6022,\n      \"2017-12-01\": 5609,\n      \"2017-12-02\": 1403,\n      \"2017-12-03\": 278,\n      \"2017-12-04\": 3381,\n      \"2017-12-05\": 5355,\n      \"2017-12-06\": 5407,\n      \"2017-12-07\": 7059,\n      \"2017-12-08\": 5473,\n      \"2017-12-09\": 1557,\n      \"2017-12-10\": 449,\n      \"2017-12-11\": 4219,\n      \"2017-12-12\": 7777,\n      \"2017-12-13\": 6017,\n      \"2017-12-14\": 4769,\n      \"2017-12-15\": 4091,\n      \"2017-12-16\": 1142,\n      \"2017-12-17\": 390,\n      \"2017-12-18\": 5491,\n      \"2017-12-19\": 4739,\n      \"2017-12-20\": 4151,\n      \"2017-12-21\": 4487,\n      \"2017-12-22\": 3059,\n      \"2017-12-23\": 414,\n      \"2017-12-24\": 344,\n      \"2017-12-25\": 215,\n      \"2017-12-26\": 620,\n      \"2017-12-27\": 1267,\n      \"2017-12-28\": 1134,\n      \"2017-12-29\": 884,\n      \"2017-12-30\": 266,\n      \"2017-12-31\": 187,\n      \"2018-01-01\": 211,\n      \"2018-01-02\": 1914,\n      \"2018-01-03\": 2492,\n      \"2018-01-04\": 2596,\n      \"2018-01-05\": 2442,\n      \"2018-01-06\": 699,\n      \"2018-01-07\": 306,\n      \"2018-01-08\": 2415,\n      \"2018-01-09\": 3682,\n      \"2018-01-10\": 2527,\n      \"2018-01-11\": 3055,\n      \"2018-01-12\": 2940,\n      \"2018-01-13\": 727,\n      \"2018-01-14\": 362,\n      \"2018-01-15\": 2051,\n      \"2018-01-16\": 2906,\n      \"2018-01-17\": 2859,\n      \"2018-01-18\": 3230,\n      \"2018-01-19\": 2559,\n      \"2018-01-20\": 754,\n      \"2018-01-21\": 685,\n      \"2018-01-22\": 3913,\n      \"2018-01-23\": 6981,\n      \"2018-01-24\": 6739,\n      \"2018-01-25\": 6194,\n      \"2018-01-26\": 5618,\n      \"2018-01-27\": 1357,\n      \"2018-01-28\": 725,\n      \"2018-01-29\": 3855,\n      \"2018-01-30\": 6767,\n      \"2018-01-31\": 7662,\n      \"2018-02-01\": 7036,\n      \"2018-02-02\": 6651,\n      \"2018-02-03\": 2133,\n      \"2018-02-04\": 785,\n      \"2018-02-05\": 7072,\n      \"2018-02-06\": 8457,\n      \"2018-02-07\": 6671,\n      \"2018-02-08\": 7440,\n      \"2018-02-09\": 4771,\n      \"2018-02-10\": 1108,\n      \"2018-02-11\": 560,\n      \"2018-02-12\": 5410,\n      \"2018-02-13\": 6070,\n      \"2018-02-14\": 5850,\n      \"2018-02-15\": 8512,\n      \"2018-02-16\": 5238,\n      \"2018-02-17\": 1684,\n      \"2018-02-18\": 761,\n      \"2018-02-19\": 2615,\n      \"2018-02-20\": 4697,\n      \"2018-02-21\": 6387,\n      \"2018-02-22\": 7082,\n      \"2018-02-23\": 5738,\n      \"2018-02-24\": 1420,\n      \"2018-02-25\": 816,\n      \"2018-02-26\": 5244,\n      \"2018-02-27\": 6326,\n      \"2018-02-28\": 6301,\n      \"2018-03-01\": 6620,\n      \"2018-03-02\": 6455,\n      \"2018-03-03\": 3534,\n      \"2018-03-04\": 1809,\n      \"2018-03-05\": 4757,\n      \"2018-03-06\": 6803,\n      \"2018-03-07\": 7059,\n      \"2018-03-08\": 6238,\n      \"2018-03-09\": 6367,\n      \"2018-03-10\": 2295,\n      \"2018-03-11\": 1590,\n      \"2018-03-12\": 6052,\n      \"2018-03-13\": 5488,\n      \"2018-03-14\": 7570,\n      \"2018-03-15\": 5426,\n      \"2018-03-16\": 7156,\n      \"2018-03-17\": 1493,\n      \"2018-03-18\": 1635,\n      \"2018-03-19\": 5708,\n      \"2018-03-20\": 8704,\n      \"2018-03-21\": 7645,\n      \"2018-03-22\": 8335,\n      \"2018-03-23\": 5155,\n      \"2018-03-24\": 1777,\n      \"2018-03-25\": 830,\n      \"2018-03-26\": 4850,\n      \"2018-03-27\": 8277,\n      \"2018-03-28\": 9242,\n      \"2018-03-29\": 8332,\n      \"2018-03-30\": 6233,\n      \"2018-03-31\": 1448,\n      \"2018-04-01\": 621,\n      \"2018-04-02\": 6229,\n      \"2018-04-03\": 8125,\n      \"2018-04-04\": 6551,\n      \"2018-04-05\": 6030,\n      \"2018-04-06\": 6782,\n      \"2018-04-07\": 1214,\n      \"2018-04-08\": 977,\n      \"2018-04-09\": 5590,\n      \"2018-04-10\": 7797,\n      \"2018-04-11\": 8438,\n      \"2018-04-12\": 8590,\n      \"2018-04-13\": 7080,\n      \"2018-04-14\": 1357,\n      \"2018-04-15\": 1039,\n      \"2018-04-16\": 5618,\n      \"2018-04-17\": 7038,\n      \"2018-04-18\": 8400,\n      \"2018-04-19\": 8058,\n      \"2018-04-20\": 7715,\n      \"2018-04-21\": 1704,\n      \"2018-04-22\": 1605,\n      \"2018-04-23\": 5176,\n      \"2018-04-24\": 6399,\n      \"2018-04-25\": 6148,\n      \"2018-04-26\": 6690,\n      \"2018-04-27\": 6312,\n      \"2018-04-28\": 1271,\n      \"2018-04-29\": 1201,\n      \"2018-04-30\": 5597,\n      \"2018-05-01\": 4773,\n      \"2018-05-02\": 6543,\n      \"2018-05-03\": 5549,\n      \"2018-05-04\": 5652,\n      \"2018-05-05\": 1275,\n      \"2018-05-06\": 1243,\n      \"2018-05-07\": 4962,\n      \"2018-05-08\": 4973,\n      \"2018-05-09\": 4023,\n      \"2018-05-10\": 3837,\n      \"2018-05-11\": 4218,\n      \"2018-05-12\": 601,\n      \"2018-05-13\": 481,\n      \"2018-05-14\": 4296,\n      \"2018-05-15\": 4020,\n      \"2018-05-16\": 5063,\n      \"2018-05-17\": 6956,\n      \"2018-05-18\": 8227,\n      \"2018-05-19\": 1879,\n      \"2018-05-20\": 512,\n      \"2018-05-21\": 4724,\n      \"2018-05-22\": 4200,\n      \"2018-05-23\": 4330,\n      \"2018-05-24\": 4172,\n      \"2018-05-25\": 2876,\n      \"2018-05-26\": 231,\n      \"2018-05-27\": 229,\n      \"2018-05-28\": 970,\n      \"2018-05-29\": 1834,\n      \"2018-05-30\": 3401,\n      \"2018-05-31\": 3790,\n      \"2018-06-01\": 3412,\n      \"2018-06-02\": 673,\n      \"2018-06-03\": 384,\n      \"2018-06-04\": 3588,\n      \"2018-06-05\": 3834,\n      \"2018-06-06\": 5116,\n      \"2018-06-07\": 4671,\n      \"2018-06-08\": 3407,\n      \"2018-06-09\": 568,\n      \"2018-06-10\": 496,\n      \"2018-06-11\": 3534,\n      \"2018-06-12\": 4143,\n      \"2018-06-13\": 3974,\n      \"2018-06-14\": 3946,\n      \"2018-06-15\": 4943,\n      \"2018-06-16\": 579,\n      \"2018-06-17\": 474,\n      \"2018-06-18\": 5291,\n      \"2018-06-19\": 7801,\n      \"2018-06-20\": 8307,\n      \"2018-06-21\": 7982,\n      \"2018-06-22\": 7059,\n      \"2018-06-23\": 1115,\n      \"2018-06-24\": 1464,\n      \"2018-06-25\": 5828,\n      \"2018-06-26\": 5157,\n      \"2018-06-27\": 4471,\n      \"2018-06-28\": 4240,\n      \"2018-06-29\": 4926,\n      \"2018-06-30\": 1173,\n      \"2018-07-01\": 748,\n      \"2018-07-02\": 4853,\n      \"2018-07-03\": 5808,\n      \"2018-07-04\": 2928,\n      \"2018-07-05\": 4435,\n      \"2018-07-06\": 6149,\n      \"2018-07-07\": 1528,\n      \"2018-07-08\": 598,\n      \"2018-07-09\": 4376,\n      \"2018-07-10\": 6020,\n      \"2018-07-11\": 5696,\n      \"2018-07-12\": 6153,\n      \"2018-07-13\": 5077,\n      \"2018-07-14\": 927,\n      \"2018-07-15\": 448,\n      \"2018-07-16\": 4003,\n      \"2018-07-17\": 5905,\n      \"2018-07-18\": 4686,\n      \"2018-07-19\": 4443,\n      \"2018-07-20\": 3998,\n      \"2018-07-21\": 764,\n      \"2018-07-22\": 734,\n      \"2018-07-23\": 4390,\n      \"2018-07-24\": 4102,\n      \"2018-07-25\": 4234,\n      \"2018-07-26\": 4099,\n      \"2018-07-27\": 3841,\n      \"2018-07-28\": 1403,\n      \"2018-07-29\": 638,\n      \"2018-07-30\": 4199,\n      \"2018-07-31\": 4642,\n      \"2018-08-01\": 4779,\n      \"2018-08-02\": 4474,\n      \"2018-08-03\": 3846,\n      \"2018-08-04\": 1026,\n      \"2018-08-05\": 773,\n      \"2018-08-06\": 4880,\n      \"2018-08-07\": 4831,\n      \"2018-08-08\": 5363,\n      \"2018-08-09\": 4851,\n      \"2018-08-10\": 4640,\n      \"2018-08-11\": 1083,\n      \"2018-08-12\": 637,\n      \"2018-08-13\": 4592,\n      \"2018-08-14\": 4028,\n      \"2018-08-15\": 5630,\n      \"2018-08-16\": 4496,\n      \"2018-08-17\": 4107,\n      \"2018-08-18\": 856,\n      \"2018-08-19\": 646,\n      \"2018-08-20\": 3941,\n      \"2018-08-21\": 5415,\n      \"2018-08-22\": 4619,\n      \"2018-08-23\": 5014,\n      \"2018-08-24\": 4721,\n      \"2018-08-25\": 1040,\n      \"2018-08-26\": 709,\n      \"2018-08-27\": 4289,\n      \"2018-08-28\": 4826,\n      \"2018-08-29\": 4676,\n      \"2018-08-30\": 5856,\n      \"2018-08-31\": 4563,\n      \"2018-09-01\": 642,\n      \"2018-09-02\": 782,\n      \"2018-09-03\": 2812,\n      \"2018-09-04\": 4800,\n      \"2018-09-05\": 5509,\n      \"2018-09-06\": 5294,\n      \"2018-09-07\": 5088,\n      \"2018-09-08\": 958,\n      \"2018-09-09\": 763,\n      \"2018-09-10\": 5647,\n      \"2018-09-11\": 5910,\n      \"2018-09-12\": 5907,\n      \"2018-09-13\": 5246,\n      \"2018-09-14\": 4963,\n      \"2018-09-15\": 846,\n      \"2018-09-16\": 722,\n      \"2018-09-17\": 5702,\n      \"2018-09-18\": 5422,\n      \"2018-09-19\": 5933,\n      \"2018-09-20\": 6065,\n      \"2018-09-21\": 5221,\n      \"2018-09-22\": 1208,\n      \"2018-09-23\": 801,\n      \"2018-09-24\": 6038,\n      \"2018-09-25\": 5705,\n      \"2018-09-26\": 7545,\n      \"2018-09-27\": 6520,\n      \"2018-09-28\": 5598,\n      \"2018-09-29\": 820,\n      \"2018-09-30\": 641,\n      \"2018-10-01\": 5468,\n      \"2018-10-02\": 5797,\n      \"2018-10-03\": 6581,\n      \"2018-10-04\": 6281,\n      \"2018-10-05\": 5540,\n      \"2018-10-06\": 785,\n      \"2018-10-07\": 649,\n      \"2018-10-08\": 4604,\n      \"2018-10-09\": 5848,\n      \"2018-10-10\": 5671,\n      \"2018-10-11\": 5870,\n      \"2018-10-12\": 5393,\n      \"2018-10-13\": 829,\n      \"2018-10-14\": 712,\n      \"2018-10-15\": 5959,\n      \"2018-10-16\": 7536,\n      \"2018-10-17\": 5818,\n      \"2018-10-18\": 5509,\n      \"2018-10-19\": 5347,\n      \"2018-10-20\": 845,\n      \"2018-10-21\": 787,\n      \"2018-10-22\": 4256,\n      \"2018-10-23\": 6048,\n      \"2018-10-24\": 6198,\n      \"2018-10-25\": 6999,\n      \"2018-10-26\": 6236,\n      \"2018-10-27\": 1408,\n      \"2018-10-28\": 909,\n      \"2018-10-29\": 4912,\n      \"2018-10-30\": 5795,\n      \"2018-10-31\": 5548,\n      \"2018-11-01\": 5143,\n      \"2018-11-02\": 5515,\n      \"2018-11-03\": 1330,\n      \"2018-11-04\": 1217,\n      \"2018-11-05\": 5680,\n      \"2018-11-06\": 6727,\n      \"2018-11-07\": 6633,\n      \"2018-11-08\": 6633,\n      \"2018-11-09\": 5769,\n      \"2018-11-10\": 1931,\n      \"2018-11-11\": 1633,\n      \"2018-11-12\": 5538,\n      \"2018-11-13\": 6509,\n      \"2018-11-14\": 6413,\n      \"2018-11-15\": 6038,\n      \"2018-11-16\": 5552,\n      \"2018-11-17\": 1222,\n      \"2018-11-18\": 1671,\n      \"2018-11-19\": 6140,\n      \"2018-11-20\": 6349,\n      \"2018-11-21\": 5798,\n      \"2018-11-22\": 3995,\n      \"2018-11-23\": 3441,\n      \"2018-11-24\": 833,\n      \"2018-11-25\": 896,\n      \"2018-11-26\": 5919,\n      \"2018-11-27\": 6722,\n      \"2018-11-28\": 6369,\n      \"2018-11-29\": 6378,\n      \"2018-11-30\": 5657,\n      \"2018-12-01\": 1195,\n      \"2018-12-02\": 743,\n      \"2018-12-03\": 5467,\n      \"2018-12-04\": 5831,\n      \"2018-12-05\": 6696,\n      \"2018-12-06\": 6108,\n      \"2018-12-07\": 5779,\n      \"2018-12-08\": 897,\n      \"2018-12-09\": 981,\n      \"2018-12-10\": 5981,\n      \"2018-12-11\": 6610,\n      \"2018-12-12\": 7089,\n      \"2018-12-13\": 6309,\n      \"2018-12-14\": 6113,\n      \"2018-12-15\": 1036,\n      \"2018-12-16\": 976,\n      \"2018-12-17\": 6081,\n      \"2018-12-18\": 6544,\n      \"2018-12-19\": 6581,\n      \"2018-12-20\": 5759,\n      \"2018-12-21\": 4976,\n      \"2018-12-22\": 768,\n      \"2018-12-23\": 357,\n      \"2018-12-24\": 1190,\n      \"2018-12-25\": 762,\n      \"2018-12-26\": 1757,\n      \"2018-12-27\": 2710,\n      \"2018-12-28\": 2331,\n      \"2018-12-29\": 574,\n      \"2018-12-30\": 496,\n      \"2018-12-31\": 1313,\n      \"2019-01-01\": 584,\n      \"2019-01-02\": 4097,\n      \"2019-01-03\": 5156,\n      \"2019-01-04\": 5287,\n      \"2019-01-05\": 1550,\n      \"2019-01-06\": 770,\n      \"2019-01-07\": 6083,\n      \"2019-01-08\": 7316,\n      \"2019-01-09\": 7361,\n      \"2019-01-10\": 6589,\n      \"2019-01-11\": 6065,\n      \"2019-01-12\": 1234,\n      \"2019-01-13\": 777,\n      \"2019-01-14\": 6487,\n      \"2019-01-15\": 6983,\n      \"2019-01-16\": 6797,\n      \"2019-01-17\": 6923,\n      \"2019-01-18\": 5947,\n      \"2019-01-19\": 879,\n      \"2019-01-20\": 860,\n      \"2019-01-21\": 4918,\n      \"2019-01-22\": 6807,\n      \"2019-01-23\": 6987,\n      \"2019-01-24\": 6859,\n      \"2019-01-25\": 6373,\n      \"2019-01-26\": 1241,\n      \"2019-01-27\": 889,\n      \"2019-01-28\": 6736,\n      \"2019-01-29\": 8081,\n      \"2019-01-30\": 7851,\n      \"2019-01-31\": 7930,\n      \"2019-02-01\": 6773,\n      \"2019-02-02\": 1330,\n      \"2019-02-03\": 1024,\n      \"2019-02-04\": 6589,\n      \"2019-02-05\": 7599,\n      \"2019-02-06\": 7433,\n      \"2019-02-07\": 7630,\n      \"2019-02-08\": 7204,\n      \"2019-02-09\": 1285,\n      \"2019-02-10\": 1124,\n      \"2019-02-11\": 7442,\n      \"2019-02-12\": 7828,\n      \"2019-02-13\": 7487,\n      \"2019-02-14\": 7507,\n      \"2019-02-15\": 6875,\n      \"2019-02-16\": 1107,\n      \"2019-02-17\": 946,\n      \"2019-02-18\": 5972,\n      \"2019-02-19\": 7389,\n      \"2019-02-20\": 8001,\n      \"2019-02-21\": 7766,\n      \"2019-02-22\": 6721,\n      \"2019-02-23\": 1654,\n      \"2019-02-24\": 1264,\n      \"2019-02-25\": 7087,\n      \"2019-02-26\": 8629,\n      \"2019-02-27\": 8059,\n      \"2019-02-28\": 8784,\n      \"2019-03-01\": 6905,\n      \"2019-03-02\": 1194,\n      \"2019-03-03\": 1099,\n      \"2019-03-04\": 6462,\n      \"2019-03-05\": 8892,\n      \"2019-03-06\": 7016,\n      \"2019-03-07\": 6823,\n      \"2019-03-08\": 6134,\n      \"2019-03-09\": 1166,\n      \"2019-03-10\": 982,\n      \"2019-03-11\": 7113,\n      \"2019-03-12\": 9345,\n      \"2019-03-13\": 9061,\n      \"2019-03-14\": 8566,\n      \"2019-03-15\": 6873,\n      \"2019-03-16\": 971,\n      \"2019-03-17\": 1145,\n      \"2019-03-18\": 4916,\n      \"2019-03-19\": 8099,\n      \"2019-03-20\": 8327,\n      \"2019-03-21\": 7607,\n      \"2019-03-22\": 7096,\n      \"2019-03-23\": 1247,\n      \"2019-03-24\": 1086,\n      \"2019-03-25\": 6877,\n      \"2019-03-26\": 8001,\n      \"2019-03-27\": 7844,\n      \"2019-03-28\": 7327,\n      \"2019-03-29\": 6237,\n      \"2019-03-30\": 1665,\n      \"2019-03-31\": 1098,\n      \"2019-04-01\": 6794,\n      \"2019-04-02\": 8300,\n      \"2019-04-03\": 8124,\n      \"2019-04-04\": 8019,\n      \"2019-04-05\": 6419,\n      \"2019-04-06\": 1270,\n      \"2019-04-07\": 1027,\n      \"2019-04-08\": 7117,\n      \"2019-04-09\": 7751,\n      \"2019-04-10\": 8231,\n      \"2019-04-11\": 8084,\n      \"2019-04-12\": 7041,\n      \"2019-04-13\": 1296,\n      \"2019-04-14\": 1315,\n      \"2019-04-15\": 6645,\n      \"2019-04-16\": 7763,\n      \"2019-04-17\": 8020,\n      \"2019-04-18\": 6994,\n      \"2019-04-19\": 5056,\n      \"2019-04-20\": 1202,\n      \"2019-04-21\": 981,\n      \"2019-04-22\": 5481,\n      \"2019-04-23\": 7451,\n      \"2019-04-24\": 7831,\n      \"2019-04-25\": 7199,\n      \"2019-04-26\": 6931,\n      \"2019-04-27\": 1095,\n      \"2019-04-28\": 1367,\n      \"2019-04-29\": 6950,\n      \"2019-04-30\": 7168,\n      \"2019-05-01\": 5958,\n      \"2019-05-02\": 7437,\n      \"2019-05-03\": 7813,\n      \"2019-05-04\": 1880,\n      \"2019-05-05\": 977,\n      \"2019-05-06\": 6387,\n      \"2019-05-07\": 7783,\n      \"2019-05-08\": 7592,\n      \"2019-05-09\": 7870,\n      \"2019-05-10\": 6915,\n      \"2019-05-11\": 1476,\n      \"2019-05-12\": 1068,\n      \"2019-05-13\": 8013,\n      \"2019-05-14\": 8696,\n      \"2019-05-15\": 8476,\n      \"2019-05-16\": 9274,\n      \"2019-05-17\": 6872,\n      \"2019-05-18\": 1073,\n      \"2019-05-19\": 1119,\n      \"2019-05-20\": 7004,\n      \"2019-05-21\": 8720,\n      \"2019-05-22\": 8184,\n      \"2019-05-23\": 8670,\n      \"2019-05-24\": 6742,\n      \"2019-05-25\": 1306,\n      \"2019-05-26\": 1308,\n      \"2019-05-27\": 5080,\n      \"2019-05-28\": 7611,\n      \"2019-05-29\": 8854,\n      \"2019-05-30\": 7248,\n      \"2019-05-31\": 7158,\n      \"2019-06-01\": 1313,\n      \"2019-06-02\": 1132,\n      \"2019-06-03\": 8199,\n      \"2019-06-04\": 8517,\n      \"2019-06-05\": 8383,\n      \"2019-06-06\": 7889,\n      \"2019-06-07\": 7549,\n      \"2019-06-08\": 1123,\n      \"2019-06-09\": 1082,\n      \"2019-06-10\": 7658,\n      \"2019-06-11\": 8377,\n      \"2019-06-12\": 7601,\n      \"2019-06-13\": 8047,\n      \"2019-06-14\": 6791,\n      \"2019-06-15\": 1013,\n      \"2019-06-16\": 1129,\n      \"2019-06-17\": 8086,\n      \"2019-06-18\": 8814,\n      \"2019-06-19\": 8850,\n      \"2019-06-20\": 8872,\n      \"2019-06-21\": 8155,\n      \"2019-06-22\": 976,\n      \"2019-06-23\": 1103,\n      \"2019-06-24\": 9399,\n      \"2019-06-25\": 9787,\n      \"2019-06-26\": 9736,\n      \"2019-06-27\": 9253,\n      \"2019-06-28\": 8491,\n      \"2019-06-29\": 1295,\n      \"2019-06-30\": 952,\n      \"2019-07-01\": 8370,\n      \"2019-07-02\": 9632,\n      \"2019-07-03\": 9369,\n      \"2019-07-04\": 5893,\n      \"2019-07-05\": 5263,\n      \"2019-07-06\": 1099,\n      \"2019-07-07\": 993,\n      \"2019-07-08\": 7990,\n      \"2019-07-09\": 9031,\n      \"2019-07-10\": 8711,\n      \"2019-07-11\": 8822,\n      \"2019-07-12\": 7887,\n      \"2019-07-13\": 1165,\n      \"2019-07-14\": 1327,\n      \"2019-07-15\": 8576,\n      \"2019-07-16\": 10036,\n      \"2019-07-17\": 9480,\n      \"2019-07-18\": 9918,\n      \"2019-07-19\": 8071,\n      \"2019-07-20\": 1675,\n      \"2019-07-21\": 1626,\n      \"2019-07-22\": 8590,\n      \"2019-07-23\": 9905,\n      \"2019-07-24\": 9423,\n      \"2019-07-25\": 9536,\n      \"2019-07-26\": 8111,\n      \"2019-07-27\": 1166,\n      \"2019-07-28\": 1121,\n      \"2019-07-29\": 9632,\n      \"2019-07-30\": 8377,\n      \"2019-07-31\": 9505,\n      \"2019-08-01\": 8616,\n      \"2019-08-02\": 8056,\n      \"2019-08-03\": 1256,\n      \"2019-08-04\": 1062,\n      \"2019-08-05\": 9240,\n      \"2019-08-06\": 9499,\n      \"2019-08-07\": 10264,\n      \"2019-08-08\": 10308,\n      \"2019-08-09\": 8542,\n      \"2019-08-10\": 1514,\n      \"2019-08-11\": 1474,\n      \"2019-08-12\": 9759,\n      \"2019-08-13\": 10176,\n      \"2019-08-14\": 10145,\n      \"2019-08-15\": 8770,\n      \"2019-08-16\": 8955,\n      \"2019-08-17\": 1357,\n      \"2019-08-18\": 1522,\n      \"2019-08-19\": 9959,\n      \"2019-08-20\": 10711,\n      \"2019-08-21\": 10327,\n      \"2019-08-22\": 11025,\n      \"2019-08-23\": 9844,\n      \"2019-08-24\": 1473,\n      \"2019-08-25\": 1351,\n      \"2019-08-26\": 10140,\n      \"2019-08-27\": 10913,\n      \"2019-08-28\": 10845,\n      \"2019-08-29\": 11517,\n      \"2019-08-30\": 9396,\n      \"2019-08-31\": 1483,\n      \"2019-09-01\": 1190,\n      \"2019-09-02\": 5858,\n      \"2019-09-03\": 9918,\n      \"2019-09-04\": 10666,\n      \"2019-09-05\": 9697,\n      \"2019-09-06\": 8861,\n      \"2019-09-07\": 1439,\n      \"2019-09-08\": 1189,\n      \"2019-09-09\": 10527,\n      \"2019-09-10\": 14613,\n      \"2019-09-11\": 13616,\n      \"2019-09-12\": 13312,\n      \"2019-09-13\": 11974,\n      \"2019-09-14\": 2753,\n      \"2019-09-15\": 3221,\n      \"2019-09-16\": 13963,\n      \"2019-09-17\": 15955,\n      \"2019-09-18\": 14432,\n      \"2019-09-19\": 14673,\n      \"2019-09-20\": 13010,\n      \"2019-09-21\": 2722,\n      \"2019-09-22\": 2266,\n      \"2019-09-23\": 13018,\n      \"2019-09-24\": 15433,\n      \"2019-09-25\": 16953,\n      \"2019-09-26\": 19189,\n      \"2019-09-27\": 16487,\n      \"2019-09-28\": 4867,\n      \"2019-09-29\": 4306,\n      \"2019-09-30\": 15197,\n      \"2019-10-01\": 18405,\n      \"2019-10-02\": 14454,\n      \"2019-10-03\": 14511,\n      \"2019-10-04\": 12446,\n      \"2019-10-05\": 1959,\n      \"2019-10-06\": 1468,\n      \"2019-10-07\": 13891,\n      \"2019-10-08\": 15371,\n      \"2019-10-09\": 13740,\n      \"2019-10-10\": 13215,\n      \"2019-10-11\": 12080,\n      \"2019-10-12\": 1791,\n      \"2019-10-13\": 1426,\n      \"2019-10-14\": 10905,\n      \"2019-10-15\": 13979,\n      \"2019-10-16\": 15764,\n      \"2019-10-17\": 15633,\n      \"2019-10-18\": 12585,\n      \"2019-10-19\": 1722,\n      \"2019-10-20\": 1509,\n      \"2019-10-21\": 13803,\n      \"2019-10-22\": 16022,\n      \"2019-10-23\": 17777,\n      \"2019-10-24\": 18594,\n      \"2019-10-25\": 14913,\n      \"2019-10-26\": 1912,\n      \"2019-10-27\": 1724,\n      \"2019-10-28\": 15114,\n      \"2019-10-29\": 16921,\n      \"2019-10-30\": 16354,\n      \"2019-10-31\": 16435,\n      \"2019-11-01\": 13199,\n      \"2019-11-02\": 2210,\n      \"2019-11-03\": 1634,\n      \"2019-11-04\": 15319,\n      \"2019-11-05\": 19426,\n      \"2019-11-06\": 19022,\n      \"2019-11-07\": 19421,\n      \"2019-11-08\": 16716,\n      \"2019-11-09\": 3270,\n      \"2019-11-10\": 2178,\n      \"2019-11-11\": 13080,\n      \"2019-11-12\": 18042,\n      \"2019-11-13\": 19308,\n      \"2019-11-14\": 19852,\n      \"2019-11-15\": 17950,\n      \"2019-11-16\": 3074,\n      \"2019-11-17\": 2006,\n      \"2019-11-18\": 16223,\n      \"2019-11-19\": 21735,\n      \"2019-11-20\": 21210,\n      \"2019-11-21\": 23187,\n      \"2019-11-22\": 19202,\n      \"2019-11-23\": 3657,\n      \"2019-11-24\": 2011,\n      \"2019-11-25\": 18045,\n      \"2019-11-26\": 18923,\n      \"2019-11-27\": 17432,\n      \"2019-11-28\": 9946,\n      \"2019-11-29\": 8000,\n      \"2019-11-30\": 2383,\n      \"2019-12-01\": 2066,\n      \"2019-12-02\": 17135,\n      \"2019-12-03\": 21256,\n      \"2019-12-04\": 18483,\n      \"2019-12-05\": 18390,\n      \"2019-12-06\": 16855,\n      \"2019-12-07\": 3254,\n      \"2019-12-08\": 2091,\n      \"2019-12-09\": 16769,\n      \"2019-12-10\": 18079,\n      \"2019-12-11\": 17417,\n      \"2019-12-12\": 18954,\n      \"2019-12-13\": 18729,\n      \"2019-12-14\": 2848,\n      \"2019-12-15\": 1600,\n      \"2019-12-16\": 16942,\n      \"2019-12-17\": 18865,\n      \"2019-12-18\": 17146,\n      \"2019-12-19\": 17056,\n      \"2019-12-20\": 15520,\n      \"2019-12-21\": 2581,\n      \"2019-12-22\": 1511,\n      \"2019-12-23\": 7474,\n      \"2019-12-24\": 3815,\n      \"2019-12-25\": 1864,\n      \"2019-12-26\": 3976,\n      \"2019-12-27\": 4994,\n      \"2019-12-28\": 1420,\n      \"2019-12-29\": 1390,\n      \"2019-12-30\": 6286,\n      \"2019-12-31\": 4024,\n      \"2020-01-01\": 1687,\n      \"2020-01-02\": 10488,\n      \"2020-01-03\": 10794,\n      \"2020-01-04\": 2094,\n      \"2020-01-05\": 1447,\n      \"2020-01-06\": 13860,\n      \"2020-01-07\": 15719,\n      \"2020-01-08\": 15873,\n      \"2020-01-09\": 16892,\n      \"2020-01-10\": 14826,\n      \"2020-01-11\": 2941,\n      \"2020-01-12\": 1964,\n      \"2020-01-13\": 13486,\n      \"2020-01-14\": 17073,\n      \"2020-01-15\": 20667,\n      \"2020-01-16\": 18558,\n      \"2020-01-17\": 15600,\n      \"2020-01-18\": 2345,\n      \"2020-01-19\": 2211,\n      \"2020-01-20\": 12286,\n      \"2020-01-21\": 16671,\n      \"2020-01-22\": 17263,\n      \"2020-01-23\": 17806,\n      \"2020-01-24\": 17297,\n      \"2020-01-25\": 2791,\n      \"2020-01-26\": 1744,\n      \"2020-01-27\": 15599,\n      \"2020-01-28\": 19450,\n      \"2020-01-29\": 19121,\n      \"2020-01-30\": 19482,\n      \"2020-01-31\": 16553,\n      \"2020-02-01\": 2792,\n      \"2020-02-02\": 2098,\n      \"2020-02-03\": 17211,\n      \"2020-02-04\": 20172,\n      \"2020-02-05\": 21894,\n      \"2020-02-06\": 19606,\n      \"2020-02-07\": 19698,\n      \"2020-02-08\": 2949,\n      \"2020-02-09\": 1985,\n      \"2020-02-10\": 17324,\n      \"2020-02-11\": 22081,\n      \"2020-02-12\": 20836,\n      \"2020-02-13\": 22586,\n      \"2020-02-14\": 25737,\n      \"2020-02-15\": 3362,\n      \"2020-02-16\": 2633,\n      \"2020-02-17\": 14967,\n      \"2020-02-18\": 20153,\n      \"2020-02-19\": 23679,\n      \"2020-02-20\": 27203,\n      \"2020-02-21\": 20985,\n      \"2020-02-22\": 3379,\n      \"2020-02-23\": 2002,\n      \"2020-02-24\": 19851,\n      \"2020-02-25\": 22793,\n      \"2020-02-26\": 21655,\n      \"2020-02-27\": 21919,\n      \"2020-02-28\": 22414,\n      \"2020-02-29\": 3504,\n      \"2020-03-01\": 2227,\n      \"2020-03-02\": 20203,\n      \"2020-03-03\": 21809,\n      \"2020-03-04\": 22791,\n      \"2020-03-05\": 22968,\n      \"2020-03-06\": 20104,\n      \"2020-03-07\": 3430,\n      \"2020-03-08\": 2339,\n      \"2020-03-09\": 18462,\n      \"2020-03-10\": 19974,\n      \"2020-03-11\": 20907,\n      \"2020-03-12\": 20706,\n      \"2020-03-13\": 17870,\n      \"2020-03-14\": 3356,\n      \"2020-03-15\": 2876,\n      \"2020-03-16\": 18737,\n      \"2020-03-17\": 23228,\n      \"2020-03-18\": 22146,\n      \"2020-03-19\": 21481,\n      \"2020-03-20\": 20925,\n      \"2020-03-21\": 3820,\n      \"2020-03-22\": 2731,\n      \"2020-03-23\": 20862,\n      \"2020-03-24\": 22923,\n      \"2020-03-25\": 22450,\n      \"2020-03-26\": 24191,\n      \"2020-03-27\": 21351,\n      \"2020-03-28\": 4475,\n      \"2020-03-29\": 3343,\n      \"2020-03-30\": 20927,\n      \"2020-03-31\": 26116,\n      \"2020-04-01\": 24603,\n      \"2020-04-02\": 23067,\n      \"2020-04-03\": 23058,\n      \"2020-04-04\": 4039,\n      \"2020-04-05\": 3002,\n      \"2020-04-06\": 20515,\n      \"2020-04-07\": 26732,\n      \"2020-04-08\": 24984,\n      \"2020-04-09\": 25839,\n      \"2020-04-10\": 15862,\n      \"2020-04-11\": 3790,\n      \"2020-04-12\": 2399,\n      \"2020-04-13\": 16153,\n      \"2020-04-14\": 24035,\n      \"2020-04-15\": 16288,\n      \"2020-04-16\": 23402,\n      \"2020-04-17\": 25210,\n      \"2020-04-18\": 4634,\n      \"2020-04-19\": 3019,\n      \"2020-04-20\": 20497,\n      \"2020-04-21\": 22283,\n      \"2020-04-22\": 25803,\n      \"2020-04-23\": 23591,\n      \"2020-04-24\": 21888,\n      \"2020-04-25\": 3408,\n      \"2020-04-26\": 3184,\n      \"2020-04-27\": 19118,\n      \"2020-04-28\": 22785,\n      \"2020-04-29\": 24070,\n      \"2020-04-30\": 22835,\n      \"2020-05-01\": 13855,\n      \"2020-05-02\": 3852,\n      \"2020-05-03\": 2844,\n      \"2020-05-04\": 18230,\n      \"2020-05-05\": 23016,\n      \"2020-05-06\": 24201,\n      \"2020-05-07\": 28082,\n      \"2020-05-08\": 21024,\n      \"2020-05-09\": 4002,\n      \"2020-05-10\": 3100,\n      \"2020-05-11\": 18184,\n      \"2020-05-12\": 23230,\n      \"2020-05-13\": 22050,\n      \"2020-05-14\": 26274,\n      \"2020-05-15\": 22813,\n      \"2020-05-16\": 3905,\n      \"2020-05-17\": 2990,\n      \"2020-05-18\": 21793,\n      \"2020-05-19\": 24740,\n      \"2020-05-20\": 27330,\n      \"2020-05-21\": 22753,\n      \"2020-05-22\": 21867,\n      \"2020-05-23\": 3546,\n      \"2020-05-24\": 2581,\n      \"2020-05-25\": 11325,\n      \"2020-05-26\": 22510,\n      \"2020-05-27\": 25545,\n      \"2020-05-28\": 27941,\n      \"2020-05-29\": 22913,\n      \"2020-05-30\": 4275,\n      \"2020-05-31\": 2705,\n      \"2020-06-01\": 20949,\n      \"2020-06-02\": 24015,\n      \"2020-06-03\": 25237,\n      \"2020-06-04\": 25423,\n      \"2020-06-05\": 24412,\n      \"2020-06-06\": 3666,\n      \"2020-06-07\": 2705,\n      \"2020-06-08\": 22778,\n      \"2020-06-09\": 23994,\n      \"2020-06-10\": 23743,\n      \"2020-06-11\": 25748,\n      \"2020-06-12\": 23180,\n      \"2020-06-13\": 3417,\n      \"2020-06-14\": 2655,\n      \"2020-06-15\": 22394,\n      \"2020-06-16\": 27796,\n      \"2020-06-17\": 28363,\n      \"2020-06-18\": 24122,\n      \"2020-06-19\": 16152,\n      \"2020-06-20\": 2951,\n      \"2020-06-21\": 2264,\n      \"2020-06-22\": 0,\n      \"2020-06-23\": 24597,\n      \"2020-06-24\": 24228,\n      \"2020-06-25\": 22184,\n      \"2020-06-26\": 21386,\n      \"2020-06-27\": 3216,\n      \"2020-06-28\": 3008,\n      \"2020-06-29\": 19263,\n      \"2020-06-30\": 19689,\n      \"2020-07-01\": 19382,\n      \"2020-07-02\": 20049,\n      \"2020-07-03\": 11366,\n      \"2020-07-04\": 1883,\n      \"2020-07-05\": 2362,\n      \"2020-07-06\": 17119,\n      \"2020-07-07\": 20842,\n      \"2020-07-08\": 22178,\n      \"2020-07-09\": 21173,\n      \"2020-07-10\": 19394,\n      \"2020-07-11\": 3107,\n      \"2020-07-12\": 2298,\n      \"2020-07-13\": 20032,\n      \"2020-07-14\": 22931,\n      \"2020-07-15\": 23363,\n      \"2020-07-16\": 20549,\n      \"2020-07-17\": 20131,\n      \"2020-07-18\": 3905,\n      \"2020-07-19\": 2873,\n      \"2020-07-20\": 21029,\n      \"2020-07-21\": 25744,\n      \"2020-07-22\": 26425,\n      \"2020-07-23\": 26327,\n      \"2020-07-24\": 22406,\n      \"2020-07-25\": 3731,\n      \"2020-07-26\": 2640,\n      \"2020-07-27\": 22817,\n      \"2020-07-28\": 28301,\n      \"2020-07-29\": 34708,\n      \"2020-07-30\": 28440,\n      \"2020-07-31\": 24499,\n      \"2020-08-01\": 4322,\n      \"2020-08-02\": 3161,\n      \"2020-08-03\": 20310,\n      \"2020-08-04\": 28116,\n      \"2020-08-05\": 28249,\n      \"2020-08-06\": 28280,\n      \"2020-08-07\": 26644,\n      \"2020-08-08\": 3781,\n      \"2020-08-09\": 2847,\n      \"2020-08-10\": 21851,\n      \"2020-08-11\": 26203,\n      \"2020-08-12\": 29309,\n      \"2020-08-13\": 25998,\n      \"2020-08-14\": 21486,\n      \"2020-08-15\": 4267,\n      \"2020-08-16\": 3132,\n      \"2020-08-17\": 22108,\n      \"2020-08-18\": 26636,\n      \"2020-08-19\": 25378,\n      \"2020-08-20\": 27712,\n      \"2020-08-21\": 24817,\n      \"2020-08-22\": 5051,\n      \"2020-08-23\": 3844,\n      \"2020-08-24\": 23969,\n      \"2020-08-25\": 27679,\n      \"2020-08-26\": 25802,\n      \"2020-08-27\": 28646,\n      \"2020-08-28\": 23846,\n      \"2020-08-29\": 3596,\n      \"2020-08-30\": 2358,\n      \"2020-08-31\": 21461,\n      \"2020-09-01\": 25638,\n      \"2020-09-02\": 27440,\n      \"2020-09-03\": 28224,\n      \"2020-09-04\": 23206,\n      \"2020-09-05\": 3716,\n      \"2020-09-06\": 2753,\n      \"2020-09-07\": 13642,\n      \"2020-09-08\": 15119,\n      \"2020-09-09\": 30345,\n      \"2020-09-10\": 28454,\n      \"2020-09-11\": 23577,\n      \"2020-09-12\": 4874,\n      \"2020-09-13\": 4486,\n      \"2020-09-14\": 27685,\n      \"2020-09-15\": 27995,\n      \"2020-09-16\": 28597,\n      \"2020-09-17\": 27243,\n      \"2020-09-18\": 27698,\n      \"2020-09-19\": 4509,\n      \"2020-09-20\": 3852,\n      \"2020-09-21\": 26742,\n      \"2020-09-22\": 27919,\n      \"2020-09-23\": 28407,\n      \"2020-09-24\": 33461,\n      \"2020-09-25\": 25505,\n      \"2020-09-26\": 4438,\n      \"2020-09-27\": 3177,\n      \"2020-09-28\": 25917,\n      \"2020-09-29\": 30358,\n      \"2020-09-30\": 29025,\n      \"2020-10-01\": 29003,\n      \"2020-10-02\": 23925,\n      \"2020-10-03\": 3432,\n      \"2020-10-04\": 2717,\n      \"2020-10-05\": 23278,\n      \"2020-10-06\": 25427,\n      \"2020-10-07\": 28855,\n      \"2020-10-08\": 26360,\n      \"2020-10-09\": 23015,\n      \"2020-10-10\": 3767,\n      \"2020-10-11\": 3630,\n      \"2020-10-12\": 21221,\n      \"2020-10-13\": 24768,\n      \"2020-10-14\": 26983,\n      \"2020-10-15\": 27399,\n      \"2020-10-16\": 23322,\n      \"2020-10-17\": 3708,\n      \"2020-10-18\": 3721,\n      \"2020-10-19\": 23683,\n      \"2020-10-20\": 28595,\n      \"2020-10-21\": 28623,\n      \"2020-10-22\": 28578,\n      \"2020-10-23\": 24420,\n      \"2020-10-24\": 4218,\n      \"2020-10-25\": 2676,\n      \"2020-10-26\": 21008,\n      \"2020-10-27\": 27569,\n      \"2020-10-28\": 25879,\n      \"2020-10-29\": 25993,\n      \"2020-10-30\": 24205,\n      \"2020-10-31\": 3379,\n      \"2020-11-01\": 3498,\n      \"2020-11-02\": 21892,\n      \"2020-11-03\": 28203,\n      \"2020-11-04\": 28098,\n      \"2020-11-05\": 29013,\n      \"2020-11-06\": 23640,\n      \"2020-11-07\": 4566,\n      \"2020-11-08\": 3427,\n      \"2020-11-09\": 25389,\n      \"2020-11-10\": 28607,\n      \"2020-11-11\": 24849,\n      \"2020-11-12\": 30534,\n      \"2020-11-13\": 23527,\n      \"2020-11-14\": 4064,\n      \"2020-11-15\": 3698,\n      \"2020-11-16\": 21454,\n      \"2020-11-17\": 27200,\n      \"2020-11-18\": 26017,\n      \"2020-11-19\": 25590,\n      \"2020-11-20\": 24675,\n      \"2020-11-21\": 4322,\n      \"2020-11-22\": 3093,\n      \"2020-11-23\": 22160,\n      \"2020-11-24\": 25496,\n      \"2020-11-25\": 22037,\n      \"2020-11-26\": 16461,\n      \"2020-11-27\": 13860,\n      \"2020-11-28\": 2856,\n      \"2020-11-29\": 2699,\n      \"2020-11-30\": 22686,\n      \"2020-12-01\": 26124,\n      \"2020-12-02\": 29348,\n      \"2020-12-03\": 24431,\n      \"2020-12-04\": 21863,\n      \"2020-12-05\": 5563,\n      \"2020-12-06\": 3003,\n      \"2020-12-07\": 24656,\n      \"2020-12-08\": 27685,\n      \"2020-12-09\": 30244,\n      \"2020-12-10\": 29699,\n      \"2020-12-11\": 24734,\n      \"2020-12-12\": 4215,\n      \"2020-12-13\": 3116,\n      \"2020-12-14\": 25042,\n      \"2020-12-15\": 27624,\n      \"2020-12-16\": 28764,\n      \"2020-12-17\": 27682,\n      \"2020-12-18\": 24661,\n      \"2020-12-19\": 4752,\n      \"2020-12-20\": 3367,\n      \"2020-12-21\": 18149,\n      \"2020-12-22\": 18563,\n      \"2020-12-23\": 15593,\n      \"2020-12-24\": 7745,\n      \"2020-12-25\": 3165,\n      \"2020-12-26\": 1606,\n      \"2020-12-27\": 1810,\n      \"2020-12-28\": 11328,\n      \"2020-12-29\": 11404,\n      \"2020-12-30\": 11603,\n      \"2020-12-31\": 7662,\n      \"2021-01-01\": 2719,\n      \"2021-01-02\": 2222,\n      \"2021-01-03\": 2999,\n      \"2021-01-04\": 23508,\n      \"2021-01-05\": 25139,\n      \"2021-01-06\": 22741,\n      \"2021-01-07\": 24462,\n      \"2021-01-08\": 22456,\n      \"2021-01-09\": 3793,\n      \"2021-01-10\": 2861,\n      \"2021-01-11\": 24932,\n      \"2021-01-12\": 28190,\n      \"2021-01-13\": 28990,\n      \"2021-01-14\": 25711,\n      \"2021-01-15\": 23836,\n      \"2021-01-16\": 3807,\n      \"2021-01-17\": 3588,\n      \"2021-01-18\": 18286,\n      \"2021-01-19\": 24055,\n      \"2021-01-20\": 26921,\n      \"2021-01-21\": 28608,\n      \"2021-01-22\": 16587,\n      \"2021-01-23\": 4197,\n      \"2021-01-24\": 3222,\n      \"2021-01-25\": 24115,\n      \"2021-01-26\": 27400,\n      \"2021-01-27\": 30881,\n      \"2021-01-28\": 28594,\n      \"2021-01-29\": 23670,\n      \"2021-01-30\": 3779,\n      \"2021-01-31\": 5639,\n      \"2021-02-01\": 26726,\n      \"2021-02-02\": 31456,\n      \"2021-02-03\": 29737,\n      \"2021-02-04\": 30134,\n      \"2021-02-05\": 27124,\n      \"2021-02-06\": 3902,\n      \"2021-02-07\": 2660,\n      \"2021-02-08\": 25226,\n      \"2021-02-09\": 28695,\n      \"2021-02-10\": 31700,\n      \"2021-02-11\": 31367,\n      \"2021-02-12\": 30522,\n      \"2021-02-13\": 5085,\n      \"2021-02-14\": 3161,\n      \"2021-02-15\": 18898,\n      \"2021-02-16\": 26520,\n      \"2021-02-17\": 30999,\n      \"2021-02-18\": 32560,\n      \"2021-02-19\": 25035,\n      \"2021-02-20\": 5889,\n      \"2021-02-21\": 4197,\n      \"2021-02-22\": 25908,\n      \"2021-02-23\": 31709,\n      \"2021-02-24\": 31478,\n      \"2021-02-25\": 30675,\n      \"2021-02-26\": 26998,\n      \"2021-02-27\": 4194,\n      \"2021-02-28\": 3192,\n      \"2021-03-01\": 31670,\n      \"2021-03-02\": 35314,\n      \"2021-03-03\": 34541,\n      \"2021-03-04\": 35989,\n      \"2021-03-05\": 32976,\n      \"2021-03-06\": 5435,\n      \"2021-03-07\": 4178,\n      \"2021-03-08\": 29242,\n      \"2021-03-09\": 35265,\n      \"2021-03-10\": 37370,\n      \"2021-03-11\": 35769,\n      \"2021-03-12\": 32236,\n      \"2021-03-13\": 4722,\n      \"2021-03-14\": 4567,\n      \"2021-03-15\": 30791,\n      \"2021-03-16\": 41017,\n      \"2021-03-17\": 37429,\n      \"2021-03-18\": 34438,\n      \"2021-03-19\": 32432,\n      \"2021-03-20\": 3987,\n      \"2021-03-21\": 3503,\n      \"2021-03-22\": 31901,\n      \"2021-03-23\": 38687,\n      \"2021-03-24\": 40143,\n      \"2021-03-25\": 37150,\n      \"2021-03-26\": 29342,\n      \"2021-03-27\": 3493,\n      \"2021-03-28\": 3751,\n      \"2021-03-29\": 29782,\n      \"2021-03-30\": 31226,\n      \"2021-03-31\": 29908,\n      \"2021-04-01\": 32087,\n      \"2021-04-02\": 25834,\n      \"2021-04-03\": 4112,\n      \"2021-04-04\": 2930,\n      \"2021-04-05\": 19721,\n      \"2021-04-06\": 34884,\n      \"2021-04-07\": 34513,\n      \"2021-04-08\": 31378,\n      \"2021-04-09\": 27712,\n      \"2021-04-10\": 3947,\n      \"2021-04-11\": 2999,\n      \"2021-04-12\": 28900,\n      \"2021-04-13\": 29758,\n      \"2021-04-14\": 31373,\n      \"2021-04-15\": 30633,\n      \"2021-04-16\": 25806,\n      \"2021-04-17\": 3326,\n      \"2021-04-18\": 3236,\n      \"2021-04-19\": 27906,\n      \"2021-04-20\": 30473,\n      \"2021-04-21\": 27207,\n      \"2021-04-22\": 30079,\n      \"2021-04-23\": 27766,\n      \"2021-04-24\": 4245,\n      \"2021-04-25\": 4867,\n      \"2021-04-26\": 30020,\n      \"2021-04-27\": 30847,\n      \"2021-04-28\": 26309,\n      \"2021-04-29\": 28663,\n      \"2021-04-30\": 26306,\n      \"2021-05-01\": 4367,\n      \"2021-05-02\": 3848,\n      \"2021-05-03\": 24057,\n      \"2021-05-04\": 30155,\n      \"2021-05-05\": 31752,\n      \"2021-05-06\": 31915,\n      \"2021-05-07\": 26207,\n      \"2021-05-08\": 5227,\n      \"2021-05-09\": 4971,\n      \"2021-05-10\": 30286,\n      \"2021-05-11\": 33980,\n      \"2021-05-12\": 28147,\n      \"2021-05-13\": 22746,\n      \"2021-05-14\": 19249,\n      \"2021-05-15\": 3536,\n      \"2021-05-16\": 3364,\n      \"2021-05-17\": 23352,\n      \"2021-05-18\": 24909,\n      \"2021-05-19\": 26653,\n      \"2021-05-20\": 27526,\n      \"2021-05-21\": 22579,\n      \"2021-05-22\": 3402,\n      \"2021-05-23\": 3143,\n      \"2021-05-24\": 21027,\n      \"2021-05-25\": 26073,\n      \"2021-05-26\": 26605,\n      \"2021-05-27\": 25544,\n      \"2021-05-28\": 21428,\n      \"2021-05-29\": 3890,\n      \"2021-05-30\": 3087,\n      \"2021-05-31\": 15917,\n      \"2021-06-01\": 25438,\n      \"2021-06-02\": 24553,\n      \"2021-06-03\": 22469,\n      \"2021-06-04\": 21182,\n      \"2021-06-05\": 3919,\n      \"2021-06-06\": 3233,\n      \"2021-06-07\": 23575,\n      \"2021-06-08\": 24918,\n      \"2021-06-09\": 26959,\n      \"2021-06-10\": 26749,\n      \"2021-06-11\": 24817,\n      \"2021-06-12\": 4117,\n      \"2021-06-13\": 3609,\n      \"2021-06-14\": 23817,\n      \"2021-06-15\": 24946,\n      \"2021-06-16\": 25975,\n      \"2021-06-17\": 25221,\n      \"2021-06-18\": 22787,\n      \"2021-06-19\": 4227,\n      \"2021-06-20\": 4338,\n      \"2021-06-21\": 24645,\n      \"2021-06-22\": 26500,\n      \"2021-06-23\": 26154,\n      \"2021-06-24\": 26479,\n      \"2021-06-25\": 23179,\n      \"2021-06-26\": 3683,\n      \"2021-06-27\": 3358,\n      \"2021-06-28\": 25043,\n      \"2021-06-29\": 26293,\n      \"2021-06-30\": 26195,\n      \"2021-07-01\": 24491,\n      \"2021-07-02\": 20381,\n      \"2021-07-03\": 4260,\n      \"2021-07-04\": 3325,\n      \"2021-07-05\": 18108,\n      \"2021-07-06\": 25962,\n      \"2021-07-07\": 27048,\n      \"2021-07-08\": 26933,\n      \"2021-07-09\": 22873,\n      \"2021-07-10\": 4408,\n      \"2021-07-11\": 3676,\n      \"2021-07-12\": 24152,\n      \"2021-07-13\": 26186,\n      \"2021-07-14\": 25141,\n      \"2021-07-15\": 22874,\n      \"2021-07-16\": 22030,\n      \"2021-07-17\": 3650,\n      \"2021-07-18\": 3174,\n      \"2021-07-19\": 24223,\n      \"2021-07-20\": 24614,\n      \"2021-07-21\": 24809,\n      \"2021-07-22\": 24410,\n      \"2021-07-23\": 21708,\n      \"2021-07-24\": 3629,\n      \"2021-07-25\": 3550,\n      \"2021-07-26\": 23185,\n      \"2021-07-27\": 24284,\n      \"2021-07-28\": 25888,\n      \"2021-07-29\": 28905,\n      \"2021-07-30\": 26884,\n      \"2021-07-31\": 5251,\n      \"2021-08-01\": 3795,\n      \"2021-08-02\": 26195,\n      \"2021-08-03\": 26706,\n      \"2021-08-04\": 25725,\n      \"2021-08-05\": 26992,\n      \"2021-08-06\": 23452,\n      \"2021-08-07\": 4380,\n      \"2021-08-08\": 4038,\n      \"2021-08-09\": 24752,\n      \"2021-08-10\": 25231,\n      \"2021-08-11\": 26137,\n      \"2021-08-12\": 24445,\n      \"2021-08-13\": 22626,\n      \"2021-08-14\": 4343,\n      \"2021-08-15\": 3710,\n      \"2021-08-16\": 24076,\n      \"2021-08-17\": 27186,\n      \"2021-08-18\": 27041,\n      \"2021-08-19\": 26628,\n      \"2021-08-20\": 23355,\n      \"2021-08-21\": 4657,\n      \"2021-08-22\": 4398,\n      \"2021-08-23\": 25731,\n      \"2021-08-24\": 28138,\n      \"2021-08-25\": 29933,\n      \"2021-08-26\": 28361,\n      \"2021-08-27\": 24021,\n      \"2021-08-28\": 6471,\n      \"2021-08-29\": 5731,\n      \"2021-08-30\": 26783,\n      \"2021-08-31\": 30867,\n      \"2021-09-01\": 30372,\n      \"2021-09-02\": 28224,\n      \"2021-09-03\": 24120,\n      \"2021-09-04\": 5786,\n      \"2021-09-05\": 5155,\n      \"2021-09-06\": 18380,\n      \"2021-09-07\": 26666,\n      \"2021-09-08\": 29606,\n      \"2021-09-09\": 29147,\n      \"2021-09-10\": 27082,\n      \"2021-09-11\": 5947,\n      \"2021-09-12\": 4814,\n      \"2021-09-13\": 28199,\n      \"2021-09-14\": 29068,\n      \"2021-09-15\": 29344,\n      \"2021-09-16\": 28970,\n      \"2021-09-17\": 27469,\n      \"2021-09-18\": 5295,\n      \"2021-09-19\": 5045,\n      \"2021-09-20\": 30775,\n      \"2021-09-21\": 31773,\n      \"2021-09-22\": 30680,\n      \"2021-09-23\": 29019,\n      \"2021-09-24\": 25788,\n      \"2021-09-25\": 5323,\n      \"2021-09-26\": 4622,\n      \"2021-09-27\": 29998,\n      \"2021-09-28\": 32915,\n      \"2021-09-29\": 32136,\n      \"2021-09-30\": 29062,\n      \"2021-10-01\": 24783,\n      \"2021-10-02\": 5330,\n      \"2021-10-03\": 4473,\n      \"2021-10-04\": 28509,\n      \"2021-10-05\": 29521,\n      \"2021-10-06\": 29758,\n      \"2021-10-07\": 30932,\n      \"2021-10-08\": 24567,\n      \"2021-10-09\": 4374,\n      \"2021-10-10\": 4679,\n      \"2021-10-11\": 25573,\n      \"2021-10-12\": 31253,\n      \"2021-10-13\": 33742,\n      \"2021-10-14\": 30057,\n      \"2021-10-15\": 24808,\n      \"2021-10-16\": 5353,\n      \"2021-10-17\": 4364,\n      \"2021-10-18\": 29847,\n      \"2021-10-19\": 31155,\n      \"2021-10-20\": 32267,\n      \"2021-10-21\": 31259,\n      \"2021-10-22\": 29982,\n      \"2021-10-23\": 4841,\n      \"2021-10-24\": 4280,\n      \"2021-10-25\": 31353,\n      \"2021-10-26\": 32130,\n      \"2021-10-27\": 32900,\n      \"2021-10-28\": 32738,\n      \"2021-10-29\": 28951,\n      \"2021-10-30\": 5449,\n      \"2021-10-31\": 4387,\n      \"2021-11-01\": 26904,\n      \"2021-11-02\": 31336,\n      \"2021-11-03\": 33930,\n      \"2021-11-04\": 30517,\n      \"2021-11-05\": 27212,\n      \"2021-11-06\": 5034,\n      \"2021-11-07\": 4490,\n      \"2021-11-08\": 30058,\n      \"2021-11-09\": 31402,\n      \"2021-11-10\": 31601,\n      \"2021-11-11\": 29523,\n      \"2021-11-12\": 25841,\n      \"2021-11-13\": 6386,\n      \"2021-11-14\": 4883,\n      \"2021-11-15\": 28717,\n      \"2021-11-16\": 32391,\n      \"2021-11-17\": 31931,\n      \"2021-11-18\": 33460,\n      \"2021-11-19\": 27633,\n      \"2021-11-20\": 5843,\n      \"2021-11-21\": 4523,\n      \"2021-11-22\": 29115,\n      \"2021-11-23\": 29312,\n      \"2021-11-24\": 27447,\n      \"2021-11-25\": 22083,\n      \"2021-11-26\": 16675,\n      \"2021-11-27\": 4423,\n      \"2021-11-28\": 4979,\n      \"2021-11-29\": 29415,\n      \"2021-11-30\": 33020,\n      \"2021-12-01\": 31935,\n      \"2021-12-02\": 32590,\n      \"2021-12-03\": 28653,\n      \"2021-12-04\": 6306,\n      \"2021-12-05\": 6678,\n      \"2021-12-06\": 31237,\n      \"2021-12-07\": 32491,\n      \"2021-12-08\": 33283,\n      \"2021-12-09\": 33460,\n      \"2021-12-10\": 29339,\n      \"2021-12-11\": 6802,\n      \"2021-12-12\": 6911,\n      \"2021-12-13\": 32203,\n      \"2021-12-14\": 34974,\n      \"2021-12-15\": 33808,\n      \"2021-12-16\": 33713,\n      \"2021-12-17\": 28698,\n      \"2021-12-18\": 5625,\n      \"2021-12-19\": 4923,\n      \"2021-12-20\": 25686,\n      \"2021-12-21\": 26888,\n      \"2021-12-22\": 25426,\n      \"2021-12-23\": 19446,\n      \"2021-12-24\": 9413,\n      \"2021-12-25\": 3030,\n      \"2021-12-26\": 3132,\n      \"2021-12-27\": 11147,\n      \"2021-12-28\": 14420,\n      \"2021-12-29\": 14452,\n      \"2021-12-30\": 12949,\n      \"2021-12-31\": 7184,\n      \"2022-01-01\": 3118,\n      \"2022-01-02\": 3604,\n      \"2022-01-03\": 20470,\n      \"2022-01-04\": 29029,\n      \"2022-01-05\": 28776,\n      \"2022-01-06\": 27127,\n      \"2022-01-07\": 24480,\n      \"2022-01-08\": 5290,\n      \"2022-01-09\": 4188,\n      \"2022-01-10\": 28812,\n      \"2022-01-11\": 33299,\n      \"2022-01-12\": 34467,\n      \"2022-01-13\": 34583,\n      \"2022-01-14\": 27741,\n      \"2022-01-15\": 5907,\n      \"2022-01-16\": 4765,\n      \"2022-01-17\": 26521,\n      \"2022-01-18\": 32249,\n      \"2022-01-19\": 34598,\n      \"2022-01-20\": 33340,\n      \"2022-01-21\": 29744,\n      \"2022-01-22\": 6624,\n      \"2022-01-23\": 4290,\n      \"2022-01-24\": 34056,\n      \"2022-01-25\": 32797,\n      \"2022-01-26\": 33913,\n      \"2022-01-27\": 38714,\n      \"2022-01-28\": 30729,\n      \"2022-01-29\": 5324,\n      \"2022-01-30\": 4060,\n      \"2022-01-31\": 31703,\n      \"2022-02-01\": 34845,\n      \"2022-02-02\": 35008,\n      \"2022-02-03\": 34967,\n      \"2022-02-04\": 28915,\n      \"2022-02-05\": 4886,\n      \"2022-02-06\": 4832,\n      \"2022-02-07\": 32543,\n      \"2022-02-08\": 35441,\n      \"2022-02-09\": 34281,\n      \"2022-02-10\": 36041,\n      \"2022-02-11\": 28274,\n      \"2022-02-12\": 5564,\n      \"2022-02-13\": 4111,\n      \"2022-02-14\": 32527,\n      \"2022-02-15\": 35180,\n      \"2022-02-16\": 34349,\n      \"2022-02-17\": 36914,\n      \"2022-02-18\": 30285,\n      \"2022-02-19\": 7269,\n      \"2022-02-20\": 4638,\n      \"2022-02-21\": 26407,\n      \"2022-02-22\": 34958,\n      \"2022-02-23\": 33622,\n      \"2022-02-24\": 35327,\n      \"2022-02-25\": 29819,\n      \"2022-02-26\": 6291,\n      \"2022-02-27\": 4509,\n      \"2022-02-28\": 33077,\n      \"2022-03-01\": 33009,\n      \"2022-03-02\": 32440,\n      \"2022-03-03\": 32676,\n      \"2022-03-04\": 26693,\n      \"2022-03-05\": 5165,\n      \"2022-03-06\": 4877,\n      \"2022-03-07\": 31707,\n      \"2022-03-08\": 31208,\n      \"2022-03-09\": 33411,\n      \"2022-03-10\": 38113,\n      \"2022-03-11\": 28466,\n      \"2022-03-12\": 6198,\n      \"2022-03-13\": 5437,\n      \"2022-03-14\": 36306,\n      \"2022-03-15\": 38970,\n      \"2022-03-16\": 40928,\n      \"2022-03-17\": 35769,\n      \"2022-03-18\": 28626,\n      \"2022-03-19\": 8104,\n      \"2022-03-20\": 8060,\n      \"2022-03-21\": 32369,\n      \"2022-03-22\": 34206,\n      \"2022-03-23\": 36696,\n      \"2022-03-24\": 34328,\n      \"2022-03-25\": 30198,\n      \"2022-03-26\": 7089,\n      \"2022-03-27\": 5900,\n      \"2022-03-28\": 33273,\n      \"2022-03-29\": 37640,\n      \"2022-03-30\": 33853,\n      \"2022-03-31\": 32614,\n      \"2022-04-01\": 29479,\n      \"2022-04-02\": 5385,\n      \"2022-04-03\": 5451,\n      \"2022-04-04\": 34536,\n      \"2022-04-05\": 33116,\n      \"2022-04-06\": 31740,\n      \"2022-04-07\": 34734,\n      \"2022-04-08\": 27016,\n      \"2022-04-09\": 5232,\n      \"2022-04-10\": 4152,\n      \"2022-04-11\": 32506,\n      \"2022-04-12\": 34010,\n      \"2022-04-13\": 31986,\n      \"2022-04-14\": 28088,\n      \"2022-04-15\": 16898,\n      \"2022-04-16\": 4223,\n      \"2022-04-17\": 3583,\n      \"2022-04-18\": 20529,\n      \"2022-04-19\": 31380,\n      \"2022-04-20\": 32003,\n      \"2022-04-21\": 30714,\n      \"2022-04-22\": 25825,\n      \"2022-04-23\": 4818,\n      \"2022-04-24\": 4187,\n      \"2022-04-25\": 30863,\n      \"2022-04-26\": 33634,\n      \"2022-04-27\": 33711,\n      \"2022-04-28\": 32792,\n      \"2022-04-29\": 27600,\n      \"2022-04-30\": 4814,\n      \"2022-05-01\": 4321,\n      \"2022-05-02\": 26992,\n      \"2022-05-03\": 29006,\n      \"2022-05-04\": 34627,\n      \"2022-05-05\": 31922,\n      \"2022-05-06\": 26094,\n      \"2022-05-07\": 5032,\n      \"2022-05-08\": 3028,\n      \"2022-05-09\": 33664,\n      \"2022-05-10\": 36511,\n      \"2022-05-11\": 36027,\n      \"2022-05-12\": 32437,\n      \"2022-05-13\": 27629,\n      \"2022-05-14\": 4436,\n      \"2022-05-15\": 5321,\n      \"2022-05-16\": 31644,\n      \"2022-05-17\": 33423,\n      \"2022-05-18\": 33364,\n      \"2022-05-19\": 32081,\n      \"2022-05-20\": 30859,\n      \"2022-05-21\": 4566,\n      \"2022-05-22\": 4406,\n      \"2022-05-23\": 32104,\n      \"2022-05-24\": 35070,\n      \"2022-05-25\": 33185,\n      \"2022-05-26\": 27032,\n      \"2022-05-27\": 25326,\n      \"2022-05-28\": 4942,\n      \"2022-05-29\": 4297,\n      \"2022-05-30\": 23139,\n      \"2022-05-31\": 30981,\n      \"2022-06-01\": 31128,\n      \"2022-06-02\": 31662,\n      \"2022-06-03\": 27633,\n      \"2022-06-04\": 4508,\n      \"2022-06-05\": 3767,\n      \"2022-06-06\": 28382,\n      \"2022-06-07\": 33045,\n      \"2022-06-08\": 34015,\n      \"2022-06-09\": 33627,\n      \"2022-06-10\": 29459,\n      \"2022-06-11\": 4004,\n      \"2022-06-12\": 3895,\n      \"2022-06-13\": 31946,\n      \"2022-06-14\": 34077,\n      \"2022-06-15\": 33895,\n      \"2022-06-16\": 31219,\n      \"2022-06-17\": 26839,\n      \"2022-06-18\": 4861,\n      \"2022-06-19\": 4077,\n      \"2022-06-20\": 26044,\n      \"2022-06-21\": 32907,\n      \"2022-06-22\": 35392,\n      \"2022-06-23\": 33762,\n      \"2022-06-24\": 27607,\n      \"2022-06-25\": 4459,\n      \"2022-06-26\": 4282,\n      \"2022-06-27\": 31653,\n      \"2022-06-28\": 34577,\n      \"2022-06-29\": 32631,\n      \"2022-06-30\": 31553,\n      \"2022-07-01\": 25990,\n      \"2022-07-02\": 4444,\n      \"2022-07-03\": 4249,\n      \"2022-07-04\": 23629,\n      \"2022-07-05\": 31009,\n      \"2022-07-06\": 33613,\n      \"2022-07-07\": 32788,\n      \"2022-07-08\": 25598,\n      \"2022-07-09\": 4267,\n      \"2022-07-10\": 3751,\n      \"2022-07-11\": 31858,\n      \"2022-07-12\": 35614,\n      \"2022-07-13\": 38198,\n      \"2022-07-14\": 37070,\n      \"2022-07-15\": 31904,\n      \"2022-07-16\": 4863,\n      \"2022-07-17\": 4348,\n      \"2022-07-18\": 33765,\n      \"2022-07-19\": 39552,\n      \"2022-07-20\": 40217,\n      \"2022-07-21\": 41991,\n      \"2022-07-22\": 0,\n      \"2022-07-23\": 5208,\n      \"2022-07-24\": 4934,\n      \"2022-07-25\": 39569,\n      \"2022-07-26\": 37316,\n      \"2022-07-27\": 36886,\n      \"2022-07-28\": 35124,\n      \"2022-07-29\": 28415,\n      \"2022-07-30\": 4811,\n      \"2022-07-31\": 4614,\n      \"2022-08-01\": 31594,\n      \"2022-08-02\": 31977,\n      \"2022-08-03\": 33965,\n      \"2022-08-04\": 40292,\n      \"2022-08-05\": 34754,\n      \"2022-08-06\": 4822,\n      \"2022-08-07\": 4592,\n      \"2022-08-08\": 38984,\n      \"2022-08-09\": 39890,\n      \"2022-08-10\": 46371,\n      \"2022-08-11\": 40800,\n      \"2022-08-12\": 32867,\n      \"2022-08-13\": 4566,\n      \"2022-08-14\": 4479,\n      \"2022-08-15\": 28211,\n      \"2022-08-16\": 38135,\n      \"2022-08-17\": 42099,\n      \"2022-08-18\": 40740,\n      \"2022-08-19\": 31223,\n      \"2022-08-20\": 4997,\n      \"2022-08-21\": 4982,\n      \"2022-08-22\": 39473,\n      \"2022-08-23\": 40580,\n      \"2022-08-24\": 36946,\n      \"2022-08-25\": 35167,\n      \"2022-08-26\": 31099,\n      \"2022-08-27\": 4626,\n      \"2022-08-28\": 4177,\n      \"2022-08-29\": 31517,\n      \"2022-08-30\": 36843,\n      \"2022-08-31\": 37416,\n      \"2022-09-01\": 40967,\n      \"2022-09-02\": 32936,\n      \"2022-09-03\": 5451,\n      \"2022-09-04\": 4173,\n      \"2022-09-05\": 25348,\n      \"2022-09-06\": 38304,\n      \"2022-09-07\": 40670,\n      \"2022-09-08\": 37948,\n      \"2022-09-09\": 33688,\n      \"2022-09-10\": 4778,\n      \"2022-09-11\": 4974,\n      \"2022-09-12\": 35847,\n      \"2022-09-13\": 38571,\n      \"2022-09-14\": 40244,\n      \"2022-09-15\": 39516,\n      \"2022-09-16\": 32187,\n      \"2022-09-17\": 5064,\n      \"2022-09-18\": 4873,\n      \"2022-09-19\": 37674,\n      \"2022-09-20\": 40593,\n      \"2022-09-21\": 38164,\n      \"2022-09-22\": 35140,\n      \"2022-09-23\": 31200,\n      \"2022-09-24\": 4917,\n      \"2022-09-25\": 4132,\n      \"2022-09-26\": 34996,\n      \"2022-09-27\": 38293,\n      \"2022-09-28\": 37519,\n      \"2022-09-29\": 39666,\n      \"2022-09-30\": 32197,\n      \"2022-10-01\": 6067,\n      \"2022-10-02\": 4960,\n      \"2022-10-03\": 34454,\n      \"2022-10-04\": 38047,\n      \"2022-10-05\": 36417,\n      \"2022-10-06\": 38492,\n      \"2022-10-07\": 32427,\n      \"2022-10-08\": 4832,\n      \"2022-10-09\": 4778,\n      \"2022-10-10\": 32671,\n      \"2022-10-11\": 37877,\n      \"2022-10-12\": 36881,\n      \"2022-10-13\": 38875,\n      \"2022-10-14\": 34397,\n      \"2022-10-15\": 5108,\n      \"2022-10-16\": 4279,\n      \"2022-10-17\": 38700,\n      \"2022-10-18\": 42548,\n      \"2022-10-19\": 41881,\n      \"2022-10-20\": 40615,\n      \"2022-10-21\": 34599,\n      \"2022-10-22\": 5674,\n      \"2022-10-23\": 4639,\n      \"2022-10-24\": 35157,\n      \"2022-10-25\": 38776,\n      \"2022-10-26\": 38820,\n      \"2022-10-27\": 39645,\n      \"2022-10-28\": 34826,\n      \"2022-10-29\": 6998,\n      \"2022-10-30\": 5425,\n      \"2022-10-31\": 33325,\n      \"2022-11-01\": 33623,\n      \"2022-11-02\": 37272,\n      \"2022-11-03\": 40107,\n      \"2022-11-04\": 32908,\n      \"2022-11-05\": 7709,\n      \"2022-11-06\": 5614,\n      \"2022-11-07\": 39589,\n      \"2022-11-08\": 43175,\n      \"2022-11-09\": 41296,\n      \"2022-11-10\": 41358,\n      \"2022-11-11\": 27929,\n      \"2022-11-12\": 5167,\n      \"2022-11-13\": 5241,\n      \"2022-11-14\": 39861,\n      \"2022-11-15\": 44073,\n      \"2022-11-16\": 41174,\n      \"2022-11-17\": 40983,\n      \"2022-11-18\": 33878,\n      \"2022-11-19\": 5930,\n      \"2022-11-20\": 4699,\n      \"2022-11-21\": 36805,\n      \"2022-11-22\": 38327,\n      \"2022-11-23\": 37672,\n      \"2022-11-24\": 28050,\n      \"2022-11-25\": 20966,\n      \"2022-11-26\": 4732,\n      \"2022-11-27\": 5279,\n      \"2022-11-28\": 35279,\n      \"2022-11-29\": 39366,\n      \"2022-11-30\": 36538,\n      \"2022-12-01\": 38181,\n      \"2022-12-02\": 34167,\n      \"2022-12-03\": 6649,\n      \"2022-12-04\": 5214,\n      \"2022-12-05\": 37614,\n      \"2022-12-06\": 38648,\n      \"2022-12-07\": 38484,\n      \"2022-12-08\": 36338,\n      \"2022-12-09\": 30251,\n      \"2022-12-10\": 5879,\n      \"2022-12-11\": 5098,\n      \"2022-12-12\": 36820,\n      \"2022-12-13\": 39797,\n      \"2022-12-14\": 39771,\n      \"2022-12-15\": 37667,\n      \"2022-12-16\": 30347,\n      \"2022-12-17\": 5894,\n      \"2022-12-18\": 4857,\n      \"2022-12-19\": 32703,\n      \"2022-12-20\": 34754,\n      \"2022-12-21\": 33208,\n      \"2022-12-22\": 31557,\n      \"2022-12-23\": 20475,\n      \"2022-12-24\": 4216,\n      \"2022-12-25\": 3378,\n      \"2022-12-26\": 10833,\n      \"2022-12-27\": 16636,\n      \"2022-12-28\": 18144,\n      \"2022-12-29\": 17490,\n      \"2022-12-30\": 13564,\n      \"2022-12-31\": 3794,\n      \"2023-01-01\": 4139,\n      \"2023-01-02\": 15161,\n      \"2023-01-03\": 31155,\n      \"2023-01-04\": 34187,\n      \"2023-01-05\": 33164,\n      \"2023-01-06\": 26417,\n      \"2023-01-07\": 5514,\n      \"2023-01-08\": 4619,\n      \"2023-01-09\": 36398,\n      \"2023-01-10\": 37812,\n      \"2023-01-11\": 37515,\n      \"2023-01-12\": 39090,\n      \"2023-01-13\": 34165,\n      \"2023-01-14\": 5864,\n      \"2023-01-15\": 5456,\n      \"2023-01-16\": 29712,\n      \"2023-01-17\": 37651,\n      \"2023-01-18\": 37138,\n      \"2023-01-19\": 34241,\n      \"2023-01-20\": 31019,\n      \"2023-01-21\": 6312,\n      \"2023-01-22\": 5676,\n      \"2023-01-23\": 36498,\n      \"2023-01-24\": 34749,\n      \"2023-01-25\": 35075,\n      \"2023-01-26\": 33229,\n      \"2023-01-27\": 30432,\n      \"2023-01-28\": 5804,\n      \"2023-01-29\": 5592,\n      \"2023-01-30\": 33627,\n      \"2023-01-31\": 38561,\n      \"2023-02-01\": 36553,\n      \"2023-02-02\": 36416,\n      \"2023-02-03\": 32195,\n      \"2023-02-04\": 6158,\n      \"2023-02-05\": 5277,\n      \"2023-02-06\": 34466,\n      \"2023-02-07\": 38201,\n      \"2023-02-08\": 36752,\n      \"2023-02-09\": 36118,\n      \"2023-02-10\": 30709,\n      \"2023-02-11\": 6141,\n      \"2023-02-12\": 5516,\n      \"2023-02-13\": 33565,\n      \"2023-02-14\": 38580,\n      \"2023-02-15\": 37636,\n      \"2023-02-16\": 36047,\n      \"2023-02-17\": 32172,\n      \"2023-02-18\": 6804,\n      \"2023-02-19\": 5846,\n      \"2023-02-20\": 29032,\n      \"2023-02-21\": 36983,\n      \"2023-02-22\": 39959,\n      \"2023-02-23\": 37131,\n      \"2023-02-24\": 33259,\n      \"2023-02-25\": 6110,\n      \"2023-02-26\": 5706,\n      \"2023-02-27\": 35556,\n      \"2023-02-28\": 38491,\n      \"2023-03-01\": 41047,\n      \"2023-03-02\": 37515,\n      \"2023-03-03\": 31578,\n      \"2023-03-04\": 6980,\n      \"2023-03-05\": 5447,\n      \"2023-03-06\": 35573,\n      \"2023-03-07\": 38076,\n      \"2023-03-08\": 33708,\n      \"2023-03-09\": 37520,\n      \"2023-03-10\": 32108,\n      \"2023-03-11\": 5788,\n      \"2023-03-12\": 5342,\n      \"2023-03-13\": 34805,\n      \"2023-03-14\": 36822,\n      \"2023-03-15\": 39404,\n      \"2023-03-16\": 35612,\n      \"2023-03-17\": 31099,\n      \"2023-03-18\": 5150,\n      \"2023-03-19\": 5413,\n      \"2023-03-20\": 36060,\n      \"2023-03-21\": 38001,\n      \"2023-03-22\": 36587,\n      \"2023-03-23\": 35442,\n      \"2023-03-24\": 29387,\n      \"2023-03-25\": 4884,\n      \"2023-03-26\": 5453,\n      \"2023-03-27\": 33913,\n      \"2023-03-28\": 36777,\n      \"2023-03-29\": 0,\n      \"2023-03-30\": 37871,\n      \"2023-03-31\": 30736,\n      \"2023-04-01\": 6005,\n      \"2023-04-02\": 5313,\n      \"2023-04-03\": 34877,\n      \"2023-04-04\": 37588,\n      \"2023-04-05\": 36490,\n      \"2023-04-06\": 32947,\n      \"2023-04-07\": 20388,\n      \"2023-04-08\": 4398,\n      \"2023-04-09\": 3934,\n      \"2023-04-10\": 24043,\n      \"2023-04-11\": 38119,\n      \"2023-04-12\": 35943,\n      \"2023-04-13\": 37331,\n      \"2023-04-14\": 31630,\n      \"2023-04-15\": 4933,\n      \"2023-04-16\": 4726,\n      \"2023-04-17\": 37000,\n      \"2023-04-18\": 40640,\n      \"2023-04-19\": 39340,\n      \"2023-04-20\": 37948,\n      \"2023-04-21\": 31050,\n      \"2023-04-22\": 5372,\n      \"2023-04-23\": 5310,\n      \"2023-04-24\": 39292,\n      \"2023-04-25\": 38776,\n      \"2023-04-26\": 40695,\n      \"2023-04-27\": 39129,\n      \"2023-04-28\": 33466,\n      \"2023-04-29\": 5324,\n      \"2023-04-30\": 4282,\n      \"2023-05-01\": 24531,\n      \"2023-05-02\": 39738,\n      \"2023-05-03\": 39732,\n      \"2023-05-04\": 41082,\n      \"2023-05-05\": 35119,\n      \"2023-05-06\": 5741,\n      \"2023-05-07\": 5651,\n      \"2023-05-08\": 36849,\n      \"2023-05-09\": 39868,\n      \"2023-05-10\": 36512,\n      \"2023-05-11\": 38502,\n      \"2023-05-12\": 33260,\n      \"2023-05-13\": 5303,\n      \"2023-05-14\": 5373,\n      \"2023-05-15\": 37206,\n      \"2023-05-16\": 41038,\n      \"2023-05-17\": 39702,\n      \"2023-05-18\": 32397,\n      \"2023-05-19\": 30730,\n      \"2023-05-20\": 4879,\n      \"2023-05-21\": 4552,\n      \"2023-05-22\": 35783,\n      \"2023-05-23\": 40767,\n      \"2023-05-24\": 41342,\n      \"2023-05-25\": 38415,\n      \"2023-05-26\": 31889,\n      \"2023-05-27\": 4533,\n      \"2023-05-28\": 4196,\n      \"2023-05-29\": 22728,\n      \"2023-05-30\": 35568,\n      \"2023-05-31\": 39694,\n      \"2023-06-01\": 37264,\n      \"2023-06-02\": 32466,\n      \"2023-06-03\": 5311,\n      \"2023-06-04\": 5766,\n      \"2023-06-05\": 36412,\n      \"2023-06-06\": 39325,\n      \"2023-06-07\": 40969,\n      \"2023-06-08\": 38163,\n      \"2023-06-09\": 34397,\n      \"2023-06-10\": 6196,\n      \"2023-06-11\": 4743,\n      \"2023-06-12\": 37845,\n      \"2023-06-13\": 42043,\n      \"2023-06-14\": 41011,\n      \"2023-06-15\": 39248,\n      \"2023-06-16\": 34490,\n      \"2023-06-17\": 5140,\n      \"2023-06-18\": 5071,\n      \"2023-06-19\": 32493,\n      \"2023-06-20\": 38150,\n      \"2023-06-21\": 38395,\n      \"2023-06-22\": 38171,\n      \"2023-06-23\": 34663,\n      \"2023-06-24\": 5422,\n      \"2023-06-25\": 5376,\n      \"2023-06-26\": 37878,\n      \"2023-06-27\": 39680,\n      \"2023-06-28\": 37314,\n      \"2023-06-29\": 35597,\n      \"2023-06-30\": 32117,\n      \"2023-07-01\": 0,\n      \"2023-07-02\": 4654,\n      \"2023-07-03\": 31363,\n      \"2023-07-04\": 28835,\n      \"2023-07-05\": 37381,\n      \"2023-07-06\": 39977,\n      \"2023-07-07\": 35191,\n      \"2023-07-08\": 6754,\n      \"2023-07-09\": 5965,\n      \"2023-07-10\": 40388,\n      \"2023-07-11\": 43661,\n      \"2023-07-12\": 41249,\n      \"2023-07-13\": 39141,\n      \"2023-07-14\": 32866,\n      \"2023-07-15\": 5011,\n      \"2023-07-16\": 5470,\n      \"2023-07-17\": 37968,\n      \"2023-07-18\": 41998,\n      \"2023-07-19\": 40055,\n      \"2023-07-20\": 37709,\n      \"2023-07-21\": 31701,\n      \"2023-07-22\": 5554,\n      \"2023-07-23\": 5110,\n      \"2023-07-24\": 37098,\n      \"2023-07-25\": 37941,\n      \"2023-07-26\": 38245,\n      \"2023-07-27\": 35873,\n      \"2023-07-28\": 31305,\n      \"2023-07-29\": 5294,\n      \"2023-07-30\": 5083,\n      \"2023-07-31\": 36647,\n      \"2023-08-01\": 39219,\n      \"2023-08-02\": 39659,\n      \"2023-08-03\": 37983,\n      \"2023-08-04\": 31218,\n      \"2023-08-05\": 5493,\n      \"2023-08-06\": 5700,\n      \"2023-08-07\": 35960,\n      \"2023-08-08\": 40288,\n      \"2023-08-09\": 39572,\n      \"2023-08-10\": 40725,\n      \"2023-08-11\": 32408,\n      \"2023-08-12\": 5700,\n      \"2023-08-13\": 5725,\n      \"2023-08-14\": 37604,\n      \"2023-08-15\": 35762,\n      \"2023-08-16\": 42059,\n      \"2023-08-17\": 39557,\n      \"2023-08-18\": 33749,\n      \"2023-08-19\": 5545,\n      \"2023-08-20\": 5578,\n      \"2023-08-21\": 39058,\n      \"2023-08-22\": 40394,\n      \"2023-08-23\": 39224,\n      \"2023-08-24\": 39327,\n      \"2023-08-25\": 33640,\n      \"2023-08-26\": 5568,\n      \"2023-08-27\": 5452,\n      \"2023-08-28\": 36824,\n      \"2023-08-29\": 39073,\n      \"2023-08-30\": 39323,\n      \"2023-08-31\": 41019,\n      \"2023-09-01\": 33004,\n      \"2023-09-02\": 5603,\n      \"2023-09-03\": 6058,\n      \"2023-09-04\": 25503,\n      \"2023-09-05\": 39039,\n      \"2023-09-06\": 39465,\n      \"2023-09-07\": 37695,\n      \"2023-09-08\": 33268,\n      \"2023-09-09\": 5515,\n      \"2023-09-10\": 5720,\n      \"2023-09-11\": 37737,\n      \"2023-09-12\": 38926,\n      \"2023-09-13\": 0,\n      \"2023-09-14\": 0,\n      \"2023-09-15\": 33854,\n      \"2023-09-16\": 5678,\n      \"2023-09-17\": 5551,\n      \"2023-09-18\": 36439,\n      \"2023-09-19\": 39031,\n      \"2023-09-20\": 39950,\n      \"2023-09-21\": 38461,\n      \"2023-09-22\": 33511,\n      \"2023-09-23\": 5157,\n      \"2023-09-24\": 5253,\n      \"2023-09-25\": 37626,\n      \"2023-09-26\": 40204,\n      \"2023-09-27\": 40193,\n      \"2023-09-28\": 34834,\n      \"2023-09-29\": 31401,\n      \"2023-09-30\": 5459,\n      \"2023-10-01\": 6581,\n      \"2023-10-02\": 34473,\n      \"2023-10-03\": 38246,\n      \"2023-10-04\": 40662,\n      \"2023-10-05\": 38160,\n      \"2023-10-06\": 33333,\n      \"2023-10-07\": 5845,\n      \"2023-10-08\": 5461,\n      \"2023-10-09\": 30981,\n      \"2023-10-10\": 38352,\n      \"2023-10-11\": 39837,\n      \"2023-10-12\": 39334,\n      \"2023-10-13\": 32103,\n      \"2023-10-14\": 4948,\n      \"2023-10-15\": 5399,\n      \"2023-10-16\": 38939,\n      \"2023-10-17\": 41498,\n      \"2023-10-18\": 40133,\n      \"2023-10-19\": 41696,\n      \"2023-10-20\": 35038,\n      \"2023-10-21\": 5862,\n      \"2023-10-22\": 5394,\n      \"2023-10-23\": 39043,\n      \"2023-10-24\": 38789,\n      \"2023-10-25\": 43376,\n      \"2023-10-26\": 38491,\n      \"2023-10-27\": 35056,\n      \"2023-10-28\": 5020,\n      \"2023-10-29\": 6042,\n      \"2023-10-30\": 39269,\n      \"2023-10-31\": 41735,\n      \"2023-11-01\": 37687,\n      \"2023-11-02\": 13650,\n      \"2023-11-03\": 0,\n      \"2023-11-04\": 6617,\n      \"2023-11-05\": 6054,\n      \"2023-11-06\": 42700,\n      \"2023-11-07\": 44486,\n      \"2023-11-08\": 43884,\n      \"2023-11-09\": 40849,\n      \"2023-11-10\": 35183,\n      \"2023-11-11\": 5803,\n      \"2023-11-12\": 6003,\n      \"2023-11-13\": 39412,\n      \"2023-11-14\": 41653,\n      \"2023-11-15\": 41824,\n      \"2023-11-16\": 42578,\n      \"2023-11-17\": 37206,\n      \"2023-11-18\": 6360,\n      \"2023-11-19\": 6583,\n      \"2023-11-20\": 38234,\n      \"2023-11-21\": 42480,\n      \"2023-11-22\": 38974,\n      \"2023-11-23\": 30813,\n      \"2023-11-24\": 26554,\n      \"2023-11-25\": 4994,\n      \"2023-11-26\": 5757,\n      \"2023-11-27\": 40732,\n      \"2023-11-28\": 43418,\n      \"2023-11-29\": 43964,\n      \"2023-11-30\": 43138,\n      \"2023-12-01\": 38634,\n      \"2023-12-02\": 8195,\n      \"2023-12-03\": 7629,\n      \"2023-12-04\": 43429,\n      \"2023-12-05\": 45672,\n      \"2023-12-06\": 45945,\n      \"2023-12-07\": 42395,\n      \"2023-12-08\": 37113,\n      \"2023-12-09\": 8245,\n      \"2023-12-10\": 7508,\n      \"2023-12-11\": 45494,\n      \"2023-12-12\": 49548,\n      \"2023-12-13\": 46740,\n      \"2023-12-14\": 45794,\n      \"2023-12-15\": 39743,\n      \"2023-12-16\": 6932,\n      \"2023-12-17\": 6192,\n      \"2023-12-18\": 38450,\n      \"2023-12-19\": 41548,\n      \"2023-12-20\": 40992,\n      \"2023-12-21\": 37864,\n      \"2023-12-22\": 26212,\n      \"2023-12-23\": 6303,\n      \"2023-12-24\": 5024,\n      \"2023-12-25\": 9872,\n      \"2023-12-26\": 14261,\n      \"2023-12-27\": 18809,\n      \"2023-12-28\": 19870,\n      \"2023-12-29\": 15239,\n      \"2023-12-30\": 5522,\n      \"2023-12-31\": 4864,\n      \"2024-01-01\": 7638,\n      \"2024-01-02\": 33013,\n      \"2024-01-03\": 36147,\n      \"2024-01-04\": 38681,\n      \"2024-01-05\": 34532,\n      \"2024-01-06\": 6397,\n      \"2024-01-07\": 5425,\n      \"2024-01-08\": 39356,\n      \"2024-01-09\": 46544,\n      \"2024-01-10\": 45818,\n      \"2024-01-11\": 45322,\n      \"2024-01-12\": 39774,\n      \"2024-01-13\": 6236,\n      \"2024-01-14\": 5572,\n      \"2024-01-15\": 32852,\n      \"2024-01-16\": 42961,\n      \"2024-01-17\": 45820,\n      \"2024-01-18\": 43314,\n      \"2024-01-19\": 39618,\n      \"2024-01-20\": 6970,\n      \"2024-01-21\": 5690,\n      \"2024-01-22\": 42138,\n      \"2024-01-23\": 45260,\n      \"2024-01-24\": 43959,\n      \"2024-01-25\": 42333,\n      \"2024-01-26\": 36125,\n      \"2024-01-27\": 6015,\n      \"2024-01-28\": 5956,\n      \"2024-01-29\": 43201,\n      \"2024-01-30\": 45225,\n      \"2024-01-31\": 45249,\n      \"2024-02-01\": 45552,\n      \"2024-02-02\": 38488,\n      \"2024-02-03\": 6521,\n      \"2024-02-04\": 5891,\n      \"2024-02-05\": 42720,\n      \"2024-02-06\": 49491,\n      \"2024-02-07\": 49868,\n      \"2024-02-08\": 48491,\n      \"2024-02-09\": 38858,\n      \"2024-02-10\": 6406,\n      \"2024-02-11\": 6581,\n      \"2024-02-12\": 38601,\n      \"2024-02-13\": 45052,\n      \"2024-02-14\": 43539,\n      \"2024-02-15\": 43567,\n      \"2024-02-16\": 38064,\n      \"2024-02-17\": 5992,\n      \"2024-02-18\": 6255,\n      \"2024-02-19\": 35208,\n      \"2024-02-20\": 46191,\n      \"2024-02-21\": 46609,\n      \"2024-02-22\": 45749,\n      \"2024-02-23\": 40484,\n      \"2024-02-24\": 6768,\n      \"2024-02-25\": 5713,\n      \"2024-02-26\": 43896,\n      \"2024-02-27\": 47491,\n      \"2024-02-28\": 47424,\n      \"2024-02-29\": 49239,\n    },\n  };\n}\n"
  },
  {
    "path": "website/src/pages/_components/data/update-versions.js",
    "content": "const fs = require(\"fs\");\nconst path = require(\"path\");\nconst { execSync } = require(\"child_process\");\n\nconst sortByVersion = (a, b) => {\n  let i = 0;\n  const aVersionParts = a.version.split(\".\");\n  const bVersionParts = b.version.split(\".\");\n\n  // Compare each part of the version number\n  while (i < aVersionParts.length || i < bVersionParts.length) {\n    const aPart = Number(aVersionParts[i] || \"0\");\n    const bPart = Number(bVersionParts[i] || \"0\");\n\n    if (aPart < bPart) return 1;\n    if (aPart > bPart) return -1;\n\n    i++;\n  }\n\n  return 0;\n};\n\nconst output = execSync(\"npm view victory time --json\");\nconst data = JSON.parse(output.toString());\n\ndelete data.modified;\ndelete data.created;\n\nconst downloads = Object.keys(data)\n  .map((version) => ({\n    version,\n    // eslint-disable-next-line no-magic-numbers\n    date: data[version].substr(0, 10),\n  }))\n  .filter((v) => !(v.version.includes(\"next\") || v.version.includes(\"alpha\")))\n  .sort(sortByVersion);\n\nconst contents = `\nconst data = {\n  data: ${JSON.stringify(downloads, null, 2)}\n};\n\nexport default data;\n`;\n\nfs.writeFileSync(path.resolve(__dirname, \"versions.js\"), contents, \"utf8\");\n"
  },
  {
    "path": "website/src/pages/_components/data/versions.js",
    "content": "const data = {\n  data: [\n    {\n      version: \"37.1.1\",\n      date: \"2024-09-05\",\n    },\n    {\n      version: \"37.1.0\",\n      date: \"2024-08-29\",\n    },\n    {\n      version: \"37.0.2\",\n      date: \"2024-04-04\",\n    },\n    {\n      version: \"37.0.1\",\n      date: \"2024-03-25\",\n    },\n    {\n      version: \"37.0.0\",\n      date: \"2024-03-18\",\n    },\n    {\n      version: \"36.9.2\",\n      date: \"2024-03-13\",\n    },\n    {\n      version: \"36.9.1\",\n      date: \"2024-02-06\",\n    },\n    {\n      version: \"36.9.0\",\n      date: \"2024-02-05\",\n    },\n    {\n      version: \"36.8.6\",\n      date: \"2024-02-01\",\n    },\n    {\n      version: \"36.8.5\",\n      date: \"2024-01-31\",\n    },\n    {\n      version: \"36.8.4\",\n      date: \"2024-01-29\",\n    },\n    {\n      version: \"36.8.3\",\n      date: \"2024-01-29\",\n    },\n    {\n      version: \"36.8.2\",\n      date: \"2024-01-16\",\n    },\n    {\n      version: \"36.8.1\",\n      date: \"2024-01-09\",\n    },\n    {\n      version: \"36.7.0\",\n      date: \"2023-11-28\",\n    },\n    {\n      version: \"36.6.12\",\n      date: \"2023-11-02\",\n    },\n    {\n      version: \"36.6.11\",\n      date: \"2023-06-13\",\n    },\n    {\n      version: \"36.6.10\",\n      date: \"2023-05-01\",\n    },\n    {\n      version: \"36.6.8\",\n      date: \"2022-09-26\",\n    },\n    {\n      version: \"36.6.7\",\n      date: \"2022-09-14\",\n    },\n    {\n      version: \"36.6.6\",\n      date: \"2022-08-31\",\n    },\n    {\n      version: \"36.6.5\",\n      date: \"2022-08-23\",\n    },\n    {\n      version: \"36.6.4\",\n      date: \"2022-08-19\",\n    },\n    {\n      version: \"36.6.3\",\n      date: \"2022-08-19\",\n    },\n    {\n      version: \"36.6.2\",\n      date: \"2022-08-17\",\n    },\n    {\n      version: \"36.6.1\",\n      date: \"2022-08-16\",\n    },\n    {\n      version: \"36.6.0\",\n      date: \"2022-08-04\",\n    },\n    {\n      version: \"36.5.3\",\n      date: \"2022-06-27\",\n    },\n    {\n      version: \"36.5.2\",\n      date: \"2022-06-23\",\n    },\n    {\n      version: \"36.5.1\",\n      date: \"2022-06-23\",\n    },\n    {\n      version: \"36.5.0\",\n      date: \"2022-06-07\",\n    },\n    {\n      version: \"36.4.1\",\n      date: \"2022-05-25\",\n    },\n    {\n      version: \"36.4.0\",\n      date: \"2022-05-10\",\n    },\n    {\n      version: \"36.3.2\",\n      date: \"2022-04-14\",\n    },\n    {\n      version: \"36.3.1\",\n      date: \"2022-03-14\",\n    },\n    {\n      version: \"36.3.0\",\n      date: \"2022-02-14\",\n    },\n    {\n      version: \"36.2.2\",\n      date: \"2022-02-14\",\n    },\n    {\n      version: \"36.2.1\",\n      date: \"2022-01-28\",\n    },\n    {\n      version: \"36.2.0\",\n      date: \"2021-11-03\",\n    },\n    {\n      version: \"36.1.0\",\n      date: \"2021-10-26\",\n    },\n    {\n      version: \"36.0.1\",\n      date: \"2021-09-18\",\n    },\n    {\n      version: \"36.0.0\",\n      date: \"2021-09-07\",\n    },\n    {\n      version: \"35.11.4\",\n      date: \"2021-09-02\",\n    },\n    {\n      version: \"35.11.3\",\n      date: \"2021-08-31\",\n    },\n    {\n      version: \"35.11.2\",\n      date: \"2021-08-30\",\n    },\n    {\n      version: \"35.11.0\",\n      date: \"2021-08-23\",\n    },\n    {\n      version: \"35.10.1\",\n      date: \"2021-08-13\",\n    },\n    {\n      version: \"35.10.0\",\n      date: \"2021-08-04\",\n    },\n    {\n      version: \"35.9.3\",\n      date: \"2021-07-23\",\n    },\n    {\n      version: \"35.9.2\",\n      date: \"2021-07-22\",\n    },\n    {\n      version: \"35.9.1\",\n      date: \"2021-07-14\",\n    },\n    {\n      version: \"35.9.0\",\n      date: \"2021-06-24\",\n    },\n    {\n      version: \"35.8.6\",\n      date: \"2021-06-11\",\n    },\n    {\n      version: \"35.8.5\",\n      date: \"2021-06-09\",\n    },\n    {\n      version: \"35.8.4\",\n      date: \"2021-06-01\",\n    },\n    {\n      version: \"35.8.3\",\n      date: \"2021-05-31\",\n    },\n    {\n      version: \"35.8.2\",\n      date: \"2021-05-26\",\n    },\n    {\n      version: \"35.8.1\",\n      date: \"2021-05-24\",\n    },\n    {\n      version: \"35.8.0\",\n      date: \"2021-05-19\",\n    },\n    {\n      version: \"35.7.2\",\n      date: \"2021-05-18\",\n    },\n    {\n      version: \"35.7.1\",\n      date: \"2021-05-14\",\n    },\n    {\n      version: \"35.7.0\",\n      date: \"2021-05-12\",\n    },\n    {\n      version: \"35.6.4\",\n      date: \"2021-05-12\",\n    },\n    {\n      version: \"35.6.3\",\n      date: \"2021-05-10\",\n    },\n    {\n      version: \"35.6.2\",\n      date: \"2021-05-07\",\n    },\n    {\n      version: \"35.6.1\",\n      date: \"2021-05-05\",\n    },\n    {\n      version: \"35.6.0\",\n      date: \"2021-05-04\",\n    },\n    {\n      version: \"35.5.1\",\n      date: \"2021-04-12\",\n    },\n    {\n      version: \"35.5.0\",\n      date: \"2021-04-08\",\n    },\n    {\n      version: \"35.4.13\",\n      date: \"2021-04-02\",\n    },\n    {\n      version: \"35.4.12\",\n      date: \"2021-03-19\",\n    },\n    {\n      version: \"35.4.11\",\n      date: \"2021-03-04\",\n    },\n    {\n      version: \"35.4.10\",\n      date: \"2021-03-02\",\n    },\n    {\n      version: \"35.4.9\",\n      date: \"2021-02-13\",\n    },\n    {\n      version: \"35.4.8\",\n      date: \"2021-02-01\",\n    },\n    {\n      version: \"35.4.7\",\n      date: \"2021-01-27\",\n    },\n    {\n      version: \"35.4.6\",\n      date: \"2021-01-05\",\n    },\n    {\n      version: \"35.4.5\",\n      date: \"2021-01-05\",\n    },\n    {\n      version: \"35.4.4\",\n      date: \"2020-12-25\",\n    },\n    {\n      version: \"35.4.3\",\n      date: \"2020-12-07\",\n    },\n    {\n      version: \"35.4.2\",\n      date: \"2020-12-01\",\n    },\n    {\n      version: \"35.4.1\",\n      date: \"2020-12-01\",\n    },\n    {\n      version: \"35.4.0\",\n      date: \"2020-11-25\",\n    },\n    {\n      version: \"35.3.5\",\n      date: \"2020-11-09\",\n    },\n    {\n      version: \"35.3.4\",\n      date: \"2020-11-07\",\n    },\n    {\n      version: \"35.3.3\",\n      date: \"2020-11-02\",\n    },\n    {\n      version: \"35.3.2\",\n      date: \"2020-10-29\",\n    },\n    {\n      version: \"35.3.1\",\n      date: \"2020-10-20\",\n    },\n    {\n      version: \"35.3.0\",\n      date: \"2020-10-14\",\n    },\n    {\n      version: \"35.2.0\",\n      date: \"2020-10-08\",\n    },\n    {\n      version: \"35.1.1\",\n      date: \"2020-09-28\",\n    },\n    {\n      version: \"35.1.0\",\n      date: \"2020-09-25\",\n    },\n    {\n      version: \"35.0.9\",\n      date: \"2020-09-08\",\n    },\n    {\n      version: \"35.0.8\",\n      date: \"2020-07-30\",\n    },\n    {\n      version: \"35.0.7\",\n      date: \"2020-07-29\",\n    },\n    {\n      version: \"35.0.6\",\n      date: \"2020-07-28\",\n    },\n    {\n      version: \"35.0.5\",\n      date: \"2020-07-17\",\n    },\n    {\n      version: \"35.0.4\",\n      date: \"2020-07-16\",\n    },\n    {\n      version: \"35.0.3\",\n      date: \"2020-07-08\",\n    },\n    {\n      version: \"35.0.2\",\n      date: \"2020-07-01\",\n    },\n    {\n      version: \"35.0.1\",\n      date: \"2020-06-28\",\n    },\n    {\n      version: \"35.0.0\",\n      date: \"2020-06-27\",\n    },\n    {\n      version: \"34.3.12\",\n      date: \"2020-06-22\",\n    },\n    {\n      version: \"34.3.11\",\n      date: \"2020-06-09\",\n    },\n    {\n      version: \"34.3.10\",\n      date: \"2020-06-07\",\n    },\n    {\n      version: \"34.3.9\",\n      date: \"2020-05-30\",\n    },\n    {\n      version: \"34.3.8\",\n      date: \"2020-05-26\",\n    },\n    {\n      version: \"34.3.7\",\n      date: \"2020-05-22\",\n    },\n    {\n      version: \"34.3.6\",\n      date: \"2020-05-18\",\n    },\n    {\n      version: \"34.3.5\",\n      date: \"2020-05-15\",\n    },\n    {\n      version: \"34.3.4\",\n      date: \"2020-05-14\",\n    },\n    {\n      version: \"34.3.3\",\n      date: \"2020-05-14\",\n    },\n    {\n      version: \"34.3.2\",\n      date: \"2020-05-13\",\n    },\n    {\n      version: \"34.3.1\",\n      date: \"2020-05-13\",\n    },\n    {\n      version: \"34.3.0\",\n      date: \"2020-05-12\",\n    },\n    {\n      version: \"34.2.2\",\n      date: \"2020-05-11\",\n    },\n    {\n      version: \"34.2.1\",\n      date: \"2020-05-09\",\n    },\n    {\n      version: \"34.2.0\",\n      date: \"2020-05-06\",\n    },\n    {\n      version: \"34.1.3\",\n      date: \"2020-03-09\",\n    },\n    {\n      version: \"34.1.2\",\n      date: \"2020-03-03\",\n    },\n    {\n      version: \"34.1.1\",\n      date: \"2020-02-06\",\n    },\n    {\n      version: \"34.1.0\",\n      date: \"2020-02-04\",\n    },\n    {\n      version: \"34.0.1\",\n      date: \"2020-01-23\",\n    },\n    {\n      version: \"34.0.0\",\n      date: \"2019-12-21\",\n    },\n    {\n      version: \"33.1.7\",\n      date: \"2019-12-06\",\n    },\n    {\n      version: \"33.1.6\",\n      date: \"2019-12-01\",\n    },\n    {\n      version: \"33.1.5\",\n      date: \"2019-11-27\",\n    },\n    {\n      version: \"33.1.4\",\n      date: \"2019-11-26\",\n    },\n    {\n      version: \"33.1.3\",\n      date: \"2019-11-08\",\n    },\n    {\n      version: \"33.1.2\",\n      date: \"2019-11-01\",\n    },\n    {\n      version: \"33.1.1\",\n      date: \"2019-10-08\",\n    },\n    {\n      version: \"33.1.0\",\n      date: \"2019-09-25\",\n    },\n    {\n      version: \"33.0.6\",\n      date: \"2019-09-20\",\n    },\n    {\n      version: \"33.0.5\",\n      date: \"2019-08-29\",\n    },\n    {\n      version: \"33.0.4\",\n      date: \"2019-08-28\",\n    },\n    {\n      version: \"33.0.3\",\n      date: \"2019-08-26\",\n    },\n    {\n      version: \"33.0.2\",\n      date: \"2019-08-26\",\n    },\n    {\n      version: \"33.0.1\",\n      date: \"2019-08-23\",\n    },\n    {\n      version: \"33.0.0\",\n      date: \"2019-08-22\",\n    },\n    {\n      version: \"32.3.7\",\n      date: \"2019-08-20\",\n    },\n    {\n      version: \"32.3.6\",\n      date: \"2019-08-08\",\n    },\n    {\n      version: \"32.3.5\",\n      date: \"2019-08-07\",\n    },\n    {\n      version: \"32.3.4\",\n      date: \"2019-08-05\",\n    },\n    {\n      version: \"32.3.3\",\n      date: \"2019-07-03\",\n    },\n    {\n      version: \"32.3.2\",\n      date: \"2019-07-02\",\n    },\n    {\n      version: \"32.3.1\",\n      date: \"2019-06-28\",\n    },\n    {\n      version: \"32.3.0\",\n      date: \"2019-06-20\",\n    },\n    {\n      version: \"32.2.3\",\n      date: \"2019-05-14\",\n    },\n    {\n      version: \"32.2.2\",\n      date: \"2019-05-04\",\n    },\n    {\n      version: \"32.2.1\",\n      date: \"2019-05-03\",\n    },\n    {\n      version: \"32.2.0\",\n      date: \"2019-04-10\",\n    },\n    {\n      version: \"32.1.0\",\n      date: \"2019-03-18\",\n    },\n    {\n      version: \"32.0.2\",\n      date: \"2019-03-12\",\n    },\n    {\n      version: \"32.0.1\",\n      date: \"2019-03-12\",\n    },\n    {\n      version: \"32.0.0\",\n      date: \"2019-02-28\",\n    },\n    {\n      version: \"31.3.0\",\n      date: \"2019-02-23\",\n    },\n    {\n      version: \"31.2.0\",\n      date: \"2019-01-28\",\n    },\n    {\n      version: \"31.1.0\",\n      date: \"2019-01-08\",\n    },\n    {\n      version: \"31.0.2\",\n      date: \"2018-12-12\",\n    },\n    {\n      version: \"31.0.1\",\n      date: \"2018-11-18\",\n    },\n    {\n      version: \"31.0.0\",\n      date: \"2018-11-11\",\n    },\n    {\n      version: \"30.6.1\",\n      date: \"2018-11-10\",\n    },\n    {\n      version: \"30.6.0\",\n      date: \"2018-10-27\",\n    },\n    {\n      version: \"30.5.1\",\n      date: \"2018-10-19\",\n    },\n    {\n      version: \"30.5.0\",\n      date: \"2018-10-03\",\n    },\n    {\n      version: \"30.4.1\",\n      date: \"2018-09-26\",\n    },\n    {\n      version: \"30.4.0\",\n      date: \"2018-09-24\",\n    },\n    {\n      version: \"30.3.1\",\n      date: \"2018-08-30\",\n    },\n    {\n      version: \"30.3.0\",\n      date: \"2018-08-24\",\n    },\n    {\n      version: \"30.2.0\",\n      date: \"2018-08-06\",\n    },\n    {\n      version: \"30.1.0\",\n      date: \"2018-07-28\",\n    },\n    {\n      version: \"30.0.0\",\n      date: \"2018-07-17\",\n    },\n    {\n      version: \"0.27.2\",\n      date: \"2018-06-24\",\n    },\n    {\n      version: \"0.27.1\",\n      date: \"2018-06-22\",\n    },\n    {\n      version: \"0.27.0\",\n      date: \"2018-06-06\",\n    },\n    {\n      version: \"0.26.1\",\n      date: \"2018-05-17\",\n    },\n    {\n      version: \"0.26.0\",\n      date: \"2018-04-22\",\n    },\n    {\n      version: \"0.25.7\",\n      date: \"2018-03-27\",\n    },\n    {\n      version: \"0.25.6\",\n      date: \"2018-02-15\",\n    },\n    {\n      version: \"0.25.5\",\n      date: \"2018-02-13\",\n    },\n    {\n      version: \"0.25.4\",\n      date: \"2018-02-08\",\n    },\n    {\n      version: \"0.25.3\",\n      date: \"2018-02-06\",\n    },\n    {\n      version: \"0.25.1\",\n      date: \"2018-02-05\",\n    },\n    {\n      version: \"0.25.0\",\n      date: \"2018-02-05\",\n    },\n    {\n      version: \"0.24.5\",\n      date: \"2018-01-09\",\n    },\n    {\n      version: \"0.24.3\",\n      date: \"2017-12-18\",\n    },\n    {\n      version: \"0.24.2\",\n      date: \"2017-11-15\",\n    },\n    {\n      version: \"0.24.1\",\n      date: \"2017-11-08\",\n    },\n    {\n      version: \"0.24.0\",\n      date: \"2017-10-20\",\n    },\n    {\n      version: \"0.23.1\",\n      date: \"2017-10-05\",\n    },\n    {\n      version: \"0.23.0\",\n      date: \"2017-09-30\",\n    },\n    {\n      version: \"0.22.2\",\n      date: \"2017-09-12\",\n    },\n    {\n      version: \"0.22.1\",\n      date: \"2017-09-10\",\n    },\n    {\n      version: \"0.22.0\",\n      date: \"2017-09-09\",\n    },\n    {\n      version: \"0.21.5\",\n      date: \"2017-08-17\",\n    },\n    {\n      version: \"0.21.4\",\n      date: \"2017-08-08\",\n    },\n    {\n      version: \"0.21.3\",\n      date: \"2017-07-24\",\n    },\n    {\n      version: \"0.21.2\",\n      date: \"2017-07-13\",\n    },\n    {\n      version: \"0.21.1\",\n      date: \"2017-06-30\",\n    },\n    {\n      version: \"0.21.0\",\n      date: \"2017-06-06\",\n    },\n    {\n      version: \"0.20.0\",\n      date: \"2017-05-24\",\n    },\n    {\n      version: \"0.19.1\",\n      date: \"2017-05-12\",\n    },\n    {\n      version: \"0.19.0\",\n      date: \"2017-05-02\",\n    },\n    {\n      version: \"0.18.4\",\n      date: \"2017-04-04\",\n    },\n    {\n      version: \"0.18.3\",\n      date: \"2017-03-21\",\n    },\n    {\n      version: \"0.18.2\",\n      date: \"2017-03-16\",\n    },\n    {\n      version: \"0.18.1\",\n      date: \"2017-03-15\",\n    },\n    {\n      version: \"0.18.0\",\n      date: \"2017-02-27\",\n    },\n    {\n      version: \"0.17.0\",\n      date: \"2017-02-06\",\n    },\n    {\n      version: \"0.16.1\",\n      date: \"2017-02-04\",\n    },\n    {\n      version: \"0.16.0\",\n      date: \"2017-01-31\",\n    },\n    {\n      version: \"0.15.0\",\n      date: \"2017-01-04\",\n    },\n    {\n      version: \"0.14.2\",\n      date: \"2016-12-14\",\n    },\n    {\n      version: \"0.14.1\",\n      date: \"2016-12-13\",\n    },\n    {\n      version: \"0.14.0\",\n      date: \"2016-12-03\",\n    },\n    {\n      version: \"0.13.7\",\n      date: \"2016-11-11\",\n    },\n    {\n      version: \"0.13.6\",\n      date: \"2016-11-10\",\n    },\n    {\n      version: \"0.13.5\",\n      date: \"2016-11-09\",\n    },\n    {\n      version: \"0.13.4\",\n      date: \"2016-11-09\",\n    },\n    {\n      version: \"0.13.3\",\n      date: \"2016-10-31\",\n    },\n    {\n      version: \"0.13.2\",\n      date: \"2016-10-28\",\n    },\n    {\n      version: \"0.13.1\",\n      date: \"2016-10-26\",\n    },\n    {\n      version: \"0.13.0\",\n      date: \"2016-10-14\",\n    },\n    {\n      version: \"0.12.1\",\n      date: \"2016-09-15\",\n    },\n    {\n      version: \"0.12.0\",\n      date: \"2016-09-09\",\n    },\n    {\n      version: \"0.11.0\",\n      date: \"2016-08-19\",\n    },\n    {\n      version: \"0.10.4\",\n      date: \"2016-08-05\",\n    },\n    {\n      version: \"0.10.3\",\n      date: \"2016-08-04\",\n    },\n    {\n      version: \"0.10.2\",\n      date: \"2016-08-03\",\n    },\n    {\n      version: \"0.10.1\",\n      date: \"2016-08-01\",\n    },\n    {\n      version: \"0.10.0\",\n      date: \"2016-07-29\",\n    },\n    {\n      version: \"0.9.0\",\n      date: \"2016-06-17\",\n    },\n    {\n      version: \"0.8.0\",\n      date: \"2016-06-02\",\n    },\n    {\n      version: \"0.7.0\",\n      date: \"2016-05-13\",\n    },\n    {\n      version: \"0.6.1\",\n      date: \"2016-04-19\",\n    },\n    {\n      version: \"0.6.0\",\n      date: \"2016-04-15\",\n    },\n    {\n      version: \"0.5.1\",\n      date: \"2016-03-17\",\n    },\n    {\n      version: \"0.5.0\",\n      date: \"2016-03-17\",\n    },\n    {\n      version: \"0.4.2\",\n      date: \"2016-03-07\",\n    },\n    {\n      version: \"0.4.1\",\n      date: \"2016-03-03\",\n    },\n    {\n      version: \"0.4.0\",\n      date: \"2016-02-01\",\n    },\n    {\n      version: \"0.3.0\",\n      date: \"2016-01-27\",\n    },\n    {\n      version: \"0.2.0\",\n      date: \"2016-01-16\",\n    },\n    {\n      version: \"0.1.3\",\n      date: \"2015-12-30\",\n    },\n    {\n      version: \"0.1.2\",\n      date: \"2015-12-30\",\n    },\n    {\n      version: \"0.1.1\",\n      date: \"2015-12-29\",\n    },\n    {\n      version: \"0.1.0\",\n      date: \"2015-12-18\",\n    },\n    {\n      version: \"0.0.4\",\n      date: \"2015-12-18\",\n    },\n    {\n      version: \"0.0.3\",\n      date: \"2015-12-04\",\n    },\n    {\n      version: \"0.0.2\",\n      date: \"2015-11-13\",\n    },\n    {\n      version: \"0.0.1\",\n      date: \"2015-07-02\",\n    },\n  ],\n};\n\nexport default data;\n"
  },
  {
    "path": "website/src/pages/_components/landing-banner.tsx",
    "content": "import React from \"react\";\nimport LearnMoreLink from \"../../components/LearnMoreLink\";\n\nexport const LandingBanner = () => (\n  <div className=\"bg-[#4589FF] text-white py-7 px-5 sm:py-2 sm:px-4\">\n    <div className=\"lg:max-w-[90%] flex flex-col sm:flex-row justify-between sm:items-center m-auto\">\n      <div className=\"flex flex-col sm:flex-row gap-2.5\">\n        <p className=\"m-0 text-sm font-bold\">\n          Like this project? You&apos;ll love working with us.\n        </p>\n        <p className=\"m-0 text-sm\">\n          Contact us to learn more{\" \"}\n          <span className=\"hidden lg:inline\">\n            about our full range of services and offerings.\n          </span>\n        </p>\n      </div>\n      <LearnMoreLink className=\"text-white text-sm font-bold flex items-center justify-end gap-1.5 underline underline-offset-4 decoration-2 hover:text-white mt-2.5 sm:mt-0\" />\n    </div>\n  </div>\n);\n"
  },
  {
    "path": "website/src/pages/_components/landing-demo.tsx",
    "content": "/* eslint-disable no-magic-numbers */\nimport React, { useState, useEffect } from \"react\";\n\nimport axios from \"axios\";\nimport last from \"lodash/last\";\nimport { format, startOfWeek, parse, subDays } from \"date-fns\";\n\nimport {\n  VictoryLine,\n  VictoryChart,\n  VictoryLabel,\n  VictoryAxis,\n  VictoryScatter,\n  VictoryVoronoiContainer,\n  Point,\n} from \"victory\";\n\nimport downloads from \"./data/downloads\";\nimport versions from \"./data/versions\";\nimport { theme } from \"./theme\";\n\nconst font = (color = theme.color.brown) => ({\n  fill: color,\n  fontSize: 20,\n  fontFamily: \"Helvetica\",\n});\n\nconst numberWithCommas = (x) =>\n  x.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n\nconst groupDownloadsByWeek = (dates) => {\n  const downloadsGroupedByPeriod = {};\n  const today = new Date();\n\n  dates.forEach((date) => {\n    const start = format(\n      startOfWeek(parse(date.day, \"yyyy-MM-dd\", today)),\n      \"yyyy-MM-dd\",\n    );\n\n    downloadsGroupedByPeriod[start] = downloadsGroupedByPeriod[start]\n      ? downloadsGroupedByPeriod[start] + date.downloads\n      : date.downloads;\n  });\n\n  const weeklyDownloads = Object.entries(downloadsGroupedByPeriod).map(\n    ([key, value]) => ({\n      date: key,\n      downloads: value,\n    }),\n  );\n  // remove the last element in the array, as it may not be a full week\n  weeklyDownloads.pop();\n  return weeklyDownloads;\n};\n\nconst minorVersions = versions.data.filter((v) => v.version.endsWith(\"0\"));\nconst latestVersion = versions.data[0].version;\nconst voronoiBlacklist = minorVersions.map((v) => `ignore-${v.version}`);\n\nconst LinkLabel = (props) => {\n  const { x, index, version } = props;\n  if (Number(index) || !version.label) {\n    return null;\n  }\n  const versionDate = `${version.version}-${version.date}`;\n  const hash = versionDate.replace(/[^\\w-]+/g, \"\");\n  const linkStyle = font(theme.color.red);\n  return (\n    <foreignObject x={x - 25} y={5} width={50} height={50}>\n      <a\n        href={`https://github.com/FormidableLabs/victory/blob/main/CHANGELOG.md#${hash}`}\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n        style={linkStyle}\n      >\n        {version.label}\n      </a>\n    </foreignObject>\n  );\n};\n\n// eslint-disable-next-line react/no-multi-comp\nconst VoronoiLabel = (props) => {\n  const { datum, x, y, data } = props;\n  if (last<any>(data).downloads === datum.downloads) {\n    return null;\n  }\n  const labelStyles = {\n    fill: theme.color.white,\n    fontSize: 20,\n    fontFamily: \"Helvetica\",\n    textAnchor: \"middle\",\n    fontWeight: \"bold\",\n  };\n  return (\n    <g>\n      <Point x={x} y={y} size={6} style={{ fill: \"white\" }} />\n      <VictoryLabel\n        {...props}\n        style={labelStyles}\n        dy={-30}\n        backgroundStyle={{ fill: theme.color.deepBrown }}\n        backgroundPadding={3}\n      />\n    </g>\n  );\n};\n\nconst lastDate = last(downloads.data)!.day;\nconst recentDate = format(subDays(new Date(), 2), \"yyyy-MM-dd\");\nconst oldDownloads = groupDownloadsByWeek(downloads.data);\n\nasync function fetchData(url) {\n  try {\n    const result = await axios(url);\n    const freshData = result.data;\n    const allDownloads = downloads.data.concat(freshData.downloads);\n    return groupDownloadsByWeek(allDownloads);\n  } catch {\n    return oldDownloads;\n  }\n}\n\n// eslint-disable-next-line react/no-multi-comp\nexport const LandingDemo = () => {\n  const [downloadsPerWeek, setData] = useState(oldDownloads);\n  const url = `https://api.npmjs.org/downloads/range/${lastDate}:${recentDate}/victory`;\n\n  useEffect(() => {\n    void fetchData(url).then(setData);\n  }, [url]);\n\n  return (\n    <div className=\"bg-[#4a1b13] hidden md:block\">\n      <VictoryChart\n        height={250}\n        width={1900}\n        padding={{ top: 50, bottom: 50, left: 200, right: 200 }}\n        style={{\n          parent: {\n            boxSizing: \"border-box\",\n            display: \"flex\",\n            justifyContent: \"center\",\n            paddingTop: \"2rem\",\n            cursor: \"crosshair\",\n          },\n        }}\n        containerComponent={\n          <VictoryVoronoiContainer\n            labels={({ datum }) => numberWithCommas(datum.downloads)}\n            voronoiBlacklist={voronoiBlacklist}\n            labelComponent={<VoronoiLabel data={downloadsPerWeek} />}\n          />\n        }\n      >\n        <VictoryLabel\n          text=\"DEC 2015\"\n          textAnchor=\"end\"\n          style={font(theme.color.white)}\n          x={190}\n          y={190}\n        />\n        <VictoryLabel\n          text=\"PROJECT START\"\n          textAnchor=\"end\"\n          style={font(theme.color.white)}\n          x={190}\n          y={215}\n        />\n        <VictoryLabel\n          text=\"TODAY\"\n          textAnchor=\"start\"\n          style={font(theme.color.white)}\n          x={1710}\n          y={190}\n        />\n        <VictoryLabel\n          text={`v${latestVersion}`}\n          textAnchor=\"start\"\n          style={font(theme.color.white)}\n          x={1710}\n          y={215}\n        />\n        <VictoryAxis\n          tickFormat={() => \"\"}\n          style={{\n            axis: { stroke: theme.color.white, strokeWidth: 3 },\n          }}\n          scale={{ x: \"time\" }}\n        />\n\n        {minorVersions.map((v) => (\n          <VictoryLine\n            name={`ignore-${v.version}`}\n            key={v.version}\n            x={() => new Date(v.date)}\n            style={{\n              data: {\n                stroke: theme.color.red,\n                strokeWidth: v.label ? 3 : 1,\n              },\n            }}\n            labels={() => v.label}\n            labelComponent={<LinkLabel version={v} />}\n            groupComponent={<g />}\n            samples={2}\n          />\n        ))}\n        <VictoryLine\n          data={downloadsPerWeek}\n          groupComponent={<g />}\n          y=\"downloads\"\n          x={(d) => new Date(d.date)}\n          style={{\n            data: { stroke: theme.color.white, strokeWidth: 4 },\n          }}\n        />\n        <VictoryScatter\n          name=\"ignore-scatter\"\n          data={[last(downloadsPerWeek)]}\n          y=\"downloads\"\n          x={(d) => new Date(d.date)}\n          size={6}\n          style={{\n            data: { fill: theme.color.white },\n            labels: { verticalAnchor: \"start\" },\n          }}\n          labelComponent={\n            <VictoryLabel\n              dx={15}\n              dy={-15}\n              lineHeight={1.3}\n              style={[\n                {\n                  fill: theme.color.white,\n                  fontSize: 20,\n                  fontWeight: \"bold\",\n                  fontFamily: \"Helvetica\",\n                  textAnchor: \"start\",\n                },\n                {\n                  fill: theme.color.white,\n                  fontSize: 15,\n                  fontFamily: \"Helvetica\",\n                  textAnchor: \"start\",\n                },\n              ]}\n            />\n          }\n          labels={({ datum }) =>\n            `${numberWithCommas(datum.downloads)}\\nDOWNLOADS / WEEK`\n          }\n        />\n      </VictoryChart>\n    </div>\n  );\n};\n"
  },
  {
    "path": "website/src/pages/_components/landing-divider.tsx",
    "content": "import React from \"react\";\n\nexport const LandingDivider = () => (\n  <div className=\"mt-8 h-px bg-grayscale-300\" />\n);\n"
  },
  {
    "path": "website/src/pages/_components/landing-featured-projects.tsx",
    "content": "import React, { FunctionComponent, SVGProps, CSSProperties } from \"react\";\nimport {\n  SpectacleBadge,\n  FigLogBadge,\n  EnvyBadge,\n  UrqlBadge,\n} from \"formidable-oss-badges\";\n\nimport { LinkButton } from \"../../components/link-button\";\n\ntype BadgeProps = SVGProps<SVGElement> & {\n  className?: string;\n  isHoverable?: boolean;\n  style?: CSSProperties;\n  simple?: boolean;\n};\ntype Projects = {\n  name: string;\n  Component: FunctionComponent<BadgeProps>;\n  link: string;\n  description: string;\n  title?: string;\n};\n\nconst projects: Projects[] = [\n  {\n    name: \"spectacle\",\n    Component: SpectacleBadge,\n    link: \"https://commerce.nearform.com/open-source/spectacle\",\n    description:\n      \"A React.js based library for creating sleek presentations using JSX syntax with the ability to live demo your code!\",\n  },\n  {\n    name: \"figlog\",\n    Component: FigLogBadge,\n    link: \"https://github.com/FormidableLabs/FigLog\",\n    description:\n      \"FigLog is the easiest and most efficient way to document team decisions and the evolution of your changes in Figma.\",\n    title: \"FigLog\",\n  },\n  {\n    name: \"envy\",\n    Component: EnvyBadge,\n    link: \"https://github.com/FormidableLabs/envy\",\n    description:\n      \"Envy will trace the network calls from every application in your stack and allow you to view them in a central place.\",\n  },\n  {\n    name: \"urql\",\n    Component: UrqlBadge,\n    link: \"https://commerce.nearform.com/open-source/urql/\",\n    description:\n      \"The highly customizable and versatile GraphQL client with which you add on features like normalized caching as you grow.\",\n  },\n];\n\nexport const LandingFeaturedProjects = () => (\n  <div className=\"flex flex-col text-left mx-16 lg:mx-32 xl:mx-64 mt-6 py-6\">\n    <h2 className=\"my-12 text-4xl font-semibold text-center\">\n      More Open Source from Nearform Commerce\n    </h2>\n    <div className=\"grid grid-cols-2 gap-8\">\n      {projects.map(({ name, Component, link, description, title }) => (\n        <a\n          href={link}\n          key={link}\n          className=\"col-span-2 sm:col-span-1 grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 align-center items-center text-theme-2 hover:text-theme-2 dark:text-white dark:hover:text-white\"\n        >\n          <Component isHoverable className=\"col-span-1 max-w-full\" />\n          <span className=\"flex flex-col col-span-1 lg:col-span-2\">\n            <span className=\"text-xl font-semibold capitalize\">\n              {title || name}\n            </span>\n            <span className=\"text-sm \">{description}</span>\n          </span>\n        </a>\n      ))}\n    </div>\n\n    <div className=\"my-8 pt-8 align-center\">\n      <LinkButton\n        link=\"https://commerce.nearform.com/open-source\"\n        className=\"mx-auto\"\n      >\n        View All Projects\n      </LinkButton>\n    </div>\n  </div>\n);\n"
  },
  {
    "path": "website/src/pages/_components/landing-features.tsx",
    "content": "import React from \"react\";\nimport { LinkButton } from \"../../components/link-button\";\n\nimport robustFeature from \"./assets/feature-robust.png\";\nimport flexibleFeature from \"./assets/feature-flexible.png\";\nimport nativeFeature from \"./assets/feature-native.png\";\n\nconst list = [\n  {\n    imgSrc: robustFeature,\n    alt: \"Robust\",\n    title: \"Robust\",\n    body: \"Area charts. Scatter plots. Voronoi polygons. Easy-to-use components for complex charting.\",\n  },\n  {\n    imgSrc: flexibleFeature,\n    alt: \"Flexible\",\n    title: \"Flexible\",\n    body: \"Fully contained, reusable data visualization elements are responsible for their own styles and behaviors.\",\n  },\n  {\n    imgSrc: nativeFeature,\n    alt: \"Native\",\n    title: \"Native\",\n    body: \"Extend the Victory experience on Android and iOS platforms with an identical API.\",\n  },\n];\n\nexport const LandingFeatures = () => (\n  <div className=\"flex flex-col text-left mx-16 lg:mx-32 xl:mx-64 my-6\">\n    <h2 className=\"my-8 text-4xl font-semibold text-center\">Features</h2>\n    <ul className=\"grid grid-cols-3 items-start content-start justify-items-start justify-between gap-12 list-none pl-0\">\n      {list.map(({ alt, body, imgSrc, title }) => (\n        <li\n          className=\"col-span-3 md:col-span-1 flex flex-col items-center text-center\"\n          key={alt}\n        >\n          <img src={imgSrc} alt={alt} className=\"max-h-72\" />\n          <span className=\"mt-8 text-2xl font-semibold\">{title}</span>\n          <span className=\"mt-2 text-lg leading-8 mx-3\">{body}</span>\n        </li>\n      ))}\n    </ul>\n    <LinkButton\n      link=\"/open-source/victory/docs/introduction\"\n      className=\"mx-auto my-6\"\n    >\n      Documentation\n    </LinkButton>\n  </div>\n);\n"
  },
  {
    "path": "website/src/pages/_components/landing-hero.tsx",
    "content": "import React from \"react\";\nimport { VictoryBadge } from \"formidable-oss-badges\";\n\nimport useDocusaurusContext from \"@docusaurus/useDocusaurusContext\";\n\nexport const LandingHero = () => {\n  const { siteConfig } = useDocusaurusContext();\n  return (\n    <div className=\"hero-pattern w-fill bg-cover bg-no-repeat\">\n      <div className=\"py-12 lg:py-24 mx-16 lg:mx-32 xl:mx-64 relative\">\n        <div className=\"flex-col md:flex-row flex justify-between gap-16 lg:gap-24 mx-auto\">\n          <div className=\"self-center md:self-left\">\n            <VictoryBadge className=\"h-[320px] w-[320px]\" />\n          </div>\n          <div className=\"text-left lg:w-6/12 text-white\">\n            <h1 className=\"text-4xl font-bold tracking-tight sm:text-6xl\">\n              {siteConfig.title}\n            </h1>\n            <p className=\"mt-6 text-lg leading-8\">{siteConfig.tagline}</p>\n            <div className=\"mt-10 flex flex-wrap flex-col xl:flex-row xl:items-center justify-start gap-6\">\n              <button\n                className=\"overflow-hidden grid-rows-2 md:grid-rows-1 lg:max-w-fit grid lg:grid-cols-6 align-center rounded-md shadow-sm border-none bg-white my-0 py-0 px-0 text-sm font-semibold text-theme-2  cursor-pointer\"\n                onClick={() =>\n                  navigator.clipboard.writeText(\"npm install victory\")\n                }\n              >\n                <code className=\"max-w-fit py-2.5 pl-3.5 content-center grid-span-12 lg:col-span-4 border-0 bg-white\">\n                  npm install victory\n                </code>\n                <span className=\"w-full lg:min-w-fit col-span-2 capitalize rounded-b-md lg:rounded-l-none lg:!rounded-r-md text-theme-2 bg-theme-1 lg:ml-2 pr-3.5 lg:pl-2.5 py-2.5 h-full\">\n                  Copy\n                </span>\n              </button>\n            </div>\n            <nav className=\"mt-6\">\n              <ul className=\"list-none flex pl-0 gap-2 lg:gap-4\">\n                <li>\n                  <img\n                    alt=\"GitHub Repo stars\"\n                    src=\"https://img.shields.io/github/stars/FormidableLabs/Victory?style=for-the-badge&color=%23ffffff\"\n                  />\n                </li>\n                <li>\n                  <img\n                    alt=\"GitHub Repo watchers\"\n                    src=\"https://img.shields.io/github/watchers/FormidableLabs/Victory?style=for-the-badge&color=%23ffffff\"\n                  />\n                </li>\n                <li>\n                  <img\n                    alt=\"GitHub Repo forks\"\n                    src=\"https://img.shields.io/github/forks/FormidableLabs/Victory?style=for-the-badge&color=%23ffffff\"\n                  />\n                </li>\n              </ul>\n            </nav>\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n};\n"
  },
  {
    "path": "website/src/pages/_components/landing-showcase.tsx",
    "content": "import React from \"react\";\n\nimport AirbnbLogo from \"../../../static/logos/logo-airbnb.svg\";\nimport ViacomLogo from \"../../../static/logos/logo-viacom.svg\";\nimport FiveThirtyEightLogo from \"../../../static/logos/logo-fivethirtyeight.svg\";\nimport UsaFactsLogo from \"../../../static/logos/logo-usafacts.svg\";\nimport RedfinLogo from \"../../../static/logos/logo-redfin.svg\";\nimport TuneLogo from \"../../../static/logos/logo-tune.svg\";\nimport ZillowLogo from \"../../../static/logos/logo-zillow.svg\";\nimport BenaroyaLogo from \"../../../static/logos/logo-benaroya.svg\";\n\nconst logoClass = \"max-h-[100px] max-w-[200px] self-center justify-self-center\";\n\nexport function LandingShowcase() {\n  return (\n    <div className=\"px-8 lg:px-16 pt-6 pb-16 bg-[#f0f0f0]\">\n      <h2 className=\"my-8 text-4xl font-semibold text-center dark:text-black\">\n        A Few of Our Fans\n      </h2>\n      <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-8 sm:gap-4\">\n        <AirbnbLogo className={logoClass} />\n        <FiveThirtyEightLogo className={logoClass} />\n        <RedfinLogo className={logoClass} />\n        <UsaFactsLogo className={logoClass} />\n        <ViacomLogo className={logoClass} />\n        <BenaroyaLogo className={logoClass} />\n        <ZillowLogo className={logoClass} />\n        <TuneLogo className={logoClass} />\n      </div>\n    </div>\n  );\n}\n"
  },
  {
    "path": "website/src/pages/_components/theme.ts",
    "content": "export const theme = {\n  color: {\n    paleRed: \"#ffad9f\",\n    red: \"#ff684f\",\n    darkRed: \"#ad1b11\",\n    brown: \"#bc5240\",\n    deepBrown: \"#4a1b13\",\n    otherBrown: \"#793d33\",\n    accentBrown: \"#531f17\",\n    darkBrown: \"#4c2e29\",\n\n    white: \"#ffffff\",\n    nearWhite: \"#f2f2f2\",\n    lightGray: \"#f0f0f0\",\n    gray: \"#999999\",\n    darkGray: \"#DDD\",\n    darkestGray: \"#4d4d4d\",\n    nearBlack: \"#242121\",\n    black: \"#1f1f1f\",\n  },\n};\n"
  },
  {
    "path": "website/src/pages/index.tsx",
    "content": "import React from \"react\";\nimport Layout from \"@theme/Layout\";\n\nimport { LandingHero } from \"./_components/landing-hero\";\nimport { LandingFeaturedProjects } from \"./_components/landing-featured-projects\";\nimport { LandingFeatures } from \"./_components/landing-features\";\nimport { LandingDemo } from \"./_components/landing-demo\";\nimport { LandingShowcase } from \"./_components/landing-showcase\";\nimport CalloutBanner from \"../components/CalloutBanner\";\n\n// eslint-disable-next-line no-undef\nexport default function Home(): JSX.Element {\n  return (\n    <Layout>\n      <LandingHero />\n      <LandingDemo />\n      <LandingFeatures />\n      <LandingShowcase />\n      <LandingFeaturedProjects />\n      <CalloutBanner />\n    </Layout>\n  );\n}\n"
  },
  {
    "path": "website/src/pages/themes/_components/accordion.tsx",
    "content": "import React from \"react\";\nimport clsx from \"clsx\";\nimport { FaChevronDown } from \"react-icons/fa\";\n\ntype AccordionProps = {\n  id: string;\n  title: string;\n  children: React.ReactNode;\n  defaultOpen?: boolean;\n  className?: string;\n};\n\nconst Accordion = ({\n  id,\n  title,\n  children,\n  defaultOpen = false,\n  className,\n}: AccordionProps) => {\n  const [isOpen, setIsOpen] = React.useState(defaultOpen);\n\n  const toggleAccordion = () => {\n    setIsOpen(!isOpen);\n  };\n\n  return (\n    <div id={id} className={clsx(\"group\", className)}>\n      <h2 id={`${id}-heading`} className=\"mb-0\">\n        <button\n          type=\"button\"\n          className={clsx(\n            \"bg-white flex items-center justify-between w-full px-5 py-3 text-base font-bold rtl:text-right text-grayscale-500 border border-b-0 border-grayscale-300 gap-3 group-last:border-b cursor-pointer\",\n            { \"group-last:border-b-0\": isOpen },\n          )}\n          aria-expanded=\"true\"\n          aria-controls={`${id}-body`}\n          onClick={toggleAccordion}\n        >\n          <span>{title}</span>\n          <FaChevronDown\n            className={clsx(\"w-3 h-3 shrink-0\", { \"rotate-180 \": isOpen })}\n          />\n        </button>\n      </h2>\n      <div\n        id={`${id}-body`}\n        className={isOpen ? \"block\" : \"hidden\"}\n        aria-labelledby={`${id}-heading`}\n      >\n        <div className=\"p-5 border border-b-0 border-grayscale-300 group-last:border-b\">\n          {children}\n        </div>\n      </div>\n    </div>\n  );\n};\nexport default Accordion;\n"
  },
  {
    "path": "website/src/pages/themes/_components/alert.tsx",
    "content": "import clsx from \"clsx\";\nimport React, { useEffect, useState } from \"react\";\nimport { IoClose } from \"react-icons/io5\";\nimport {\n  FaCircleCheck,\n  FaCircleInfo,\n  FaCircleXmark,\n  FaTriangleExclamation,\n} from \"react-icons/fa6\";\n\nexport enum AlertType {\n  SUCCESS = \"success\",\n  ERROR = \"error\",\n  INFO = \"info\",\n  WARNING = \"warning\",\n}\n\nexport type AlertProps = {\n  id: string;\n  type: AlertType;\n  title: string;\n  message?: string;\n  duration?: number;\n};\n\ntype AlertComponentProps = Omit<AlertProps, \"id\"> & {\n  onClose: () => void;\n};\n\nconst alertStyles: Record<\n  AlertComponentProps[\"type\"],\n  {\n    iconStyle: string;\n    typeStyle: string;\n    buttonStyle: string;\n    Icon: React.ComponentType<React.SVGProps<SVGSVGElement>>;\n  }\n> = {\n  success: {\n    iconStyle: \"text-green-400\",\n    typeStyle: \"bg-green-50 text-green-800\",\n    buttonStyle: \"hover:bg-green-100\",\n    Icon: FaCircleCheck,\n  },\n  error: {\n    iconStyle: \"text-red-400\",\n    typeStyle: \"bg-red-50 text-red-800\",\n    buttonStyle: \"hover:bg-red-100\",\n    Icon: FaCircleXmark,\n  },\n  info: {\n    iconStyle: \"text-blue-400\",\n    typeStyle: \"bg-blue-50 text-blue-800\",\n    buttonStyle: \"hover:bg-blue-100\",\n    Icon: FaCircleInfo,\n  },\n  warning: {\n    iconStyle: \"text-yellow-400\",\n    typeStyle: \"bg-yellow-50 text-yellow-800\",\n    buttonStyle: \"hover:bg-yellow-100\",\n    Icon: FaTriangleExclamation,\n  },\n};\n\nconst DEFAULT_DURATION = 5000;\n\nconst Alert = ({\n  type,\n  title,\n  message,\n  onClose,\n  duration = DEFAULT_DURATION,\n}: AlertComponentProps) => {\n  const [isVisible, setIsVisible] = useState(false);\n\n  useEffect(() => {\n    setIsVisible(true);\n\n    if (duration) {\n      const timer = setTimeout(() => setIsVisible(false), duration);\n      return () => clearTimeout(timer);\n    }\n  }, [onClose, duration]);\n\n  const handleClose = () => {\n    setIsVisible(false);\n  };\n\n  const { Icon, typeStyle, iconStyle, buttonStyle } = alertStyles[type];\n\n  return (\n    <div\n      className={clsx(\n        \"flex items-start p-4 mb-4 rounded shadow-md gap-3 min-w-[500px] transform transition-all duration-500\",\n        typeStyle,\n        isVisible ? \"translate-x-0 opacity-100\" : \"translate-x-full opacity-0\",\n      )}\n      onTransitionEnd={() => !isVisible && onClose()}\n    >\n      <Icon className={clsx(\"pt-0.5 h-5 w-5\", iconStyle)} />\n      <div className=\"flex-1\">\n        <h4 className=\"text-sm font-medium m-0\">{title}</h4>\n        {message && <p className=\"text-sm font-normal mt-2 mb-0\">{message}</p>}\n      </div>\n      <button\n        onClick={handleClose}\n        className={clsx(\n          \"bg-transparent border-none cursor-pointer p-1.5 -m-1.5 rounded-md\",\n          iconStyle,\n          buttonStyle,\n        )}\n      >\n        <IoClose className=\"h-5 w-5\" />\n      </button>\n    </div>\n  );\n};\n\nexport default Alert;\n"
  },
  {
    "path": "website/src/pages/themes/_components/base-theme-panel.tsx",
    "content": "import React from \"react\";\nimport Select from \"./select\";\nimport { CUSTOM_THEME, themes, useTheme } from \"../_providers/themeProvider\";\nimport { usePreviewOptions } from \"../_providers/previewOptionsProvider\";\nimport PanelHeader from \"./panel-header\";\nimport Card from \"./card\";\nimport { codeItem } from \"./sidenav\";\nimport { TiArrowRight } from \"react-icons/ti\";\nimport { useSideNavContext } from \"../_providers/sideNavProvider\";\n\nconst themeOptions = themes.map((theme) => ({\n  label: theme.name,\n  value: theme.name,\n}));\n\nconst BaseThemePanel = () => {\n  const { baseTheme, onBaseThemeSelect } = useTheme();\n  const { resetPreviewOptions } = usePreviewOptions();\n  const { setActiveSideNavItem } = useSideNavContext();\n\n  const handleThemeSelect = (themeName?: string) => {\n    onBaseThemeSelect(themeName);\n    resetPreviewOptions();\n  };\n\n  const isCustomTheme = baseTheme?.name === CUSTOM_THEME.name;\n\n  return (\n    <>\n      <PanelHeader\n        title=\"Base Theme\"\n        description='Select a theme to begin customizing. Choose from pre-defined themes or select \"Custom\" to import your own theme.'\n      />\n      <Card>\n        <Select\n          id=\"theme-select\"\n          value={baseTheme?.name || \"\"}\n          onChange={handleThemeSelect}\n          options={themeOptions}\n          label=\"Theme\"\n        />\n      </Card>\n      {isCustomTheme && (\n        <Card className=\"mt-6\">\n          <h3 className=\"text-sm font-bold mb-3\">Theme Code</h3>\n          <p className=\"text-sm mb-3\">\n            Extend the theme object to apply your own theme configuration. Any\n            modifications will change the base theme to &quot;Custom&quot;.\n          </p>\n          <button\n            onClick={() => setActiveSideNavItem(codeItem)}\n            className=\"text-blue-600 bg-transparent p-0 m-0 flex items-center cursor-pointer\"\n          >\n            Theme Code <TiArrowRight className=\"h-4 w-4\" />\n          </button>\n        </Card>\n      )}\n    </>\n  );\n};\nexport default BaseThemePanel;\n"
  },
  {
    "path": "website/src/pages/themes/_components/card.tsx",
    "content": "import clsx from \"clsx\";\nimport React from \"react\";\n\ntype CardProps = {\n  children: React.ReactNode;\n  className?: string;\n};\n\nconst Card = ({ children, className }: CardProps) => {\n  return (\n    <div className={clsx(\"bg-white p-4 rounded-md\", className)}>{children}</div>\n  );\n};\n\nexport default Card;\n"
  },
  {
    "path": "website/src/pages/themes/_components/chart-panel.tsx",
    "content": "import React, { useEffect, useMemo } from \"react\";\nimport Control from \"./control\";\nimport Select from \"./select\";\nimport { usePreviewOptions } from \"../_providers/previewOptionsProvider\";\nimport { ChartPanelConfig } from \"../_config\";\nimport PanelHeader from \"./panel-header\";\n\ntype ChartPanelProps = {\n  config: ChartPanelConfig;\n};\n\nconst ChartPanel = ({\n  config: { title, description, selectLabel, types },\n}: ChartPanelProps) => {\n  const { activeChartType, setActiveChartType, setExampleContent } =\n    usePreviewOptions();\n\n  useEffect(() => {\n    const newChartType = Object.keys(types)[0];\n    setActiveChartType((prevChartType) =>\n      prevChartType === null ? newChartType : prevChartType,\n    );\n  }, [types, setActiveChartType]);\n\n  useEffect(() => {\n    const examples = types[activeChartType]?.content ?? [];\n    setExampleContent(examples);\n  }, [types, activeChartType, setExampleContent]);\n\n  const options = useMemo(\n    () =>\n      Object.keys(types).map((key) => ({\n        label: types[key].label,\n        value: key,\n      })),\n    [types],\n  );\n  const controls = useMemo(\n    () => types[activeChartType]?.controls || [],\n    [types, activeChartType],\n  );\n\n  const onChartTypeChange = (newValue: string) => {\n    setActiveChartType(newValue);\n  };\n\n  return (\n    <>\n      <PanelHeader title={title} description={description} />\n      <Select\n        id=\"chart-type-select\"\n        value={activeChartType}\n        onChange={onChartTypeChange}\n        options={options}\n        label={selectLabel}\n        className=\"mt-4 mb-8\"\n      />\n      {controls.map((control, i) => {\n        return (\n          <Control\n            key={control.label + i}\n            type={control.type}\n            control={control}\n          />\n        );\n      })}\n    </>\n  );\n};\nexport default ChartPanel;\n"
  },
  {
    "path": "website/src/pages/themes/_components/checkbox.tsx",
    "content": "import clsx from \"clsx\";\nimport React, { useId } from \"react\";\n\ntype CheckboxProps = {\n  label?: string;\n  isChecked?: boolean;\n  onChange?: (isChecked: boolean) => void;\n  className?: string;\n};\n\nconst Checkbox = ({\n  label = \"Checkbox\",\n  isChecked = false,\n  onChange,\n  className,\n}: CheckboxProps) => {\n  const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n    if (onChange) {\n      onChange(event.target.checked);\n    }\n  };\n\n  const id = useId();\n\n  return (\n    <label\n      htmlFor={id}\n      className={clsx(\"p-0 m-0 flex items-center justify-start\", className)}\n    >\n      <input\n        type=\"checkbox\"\n        id={id}\n        name=\"checkbox\"\n        checked={isChecked}\n        onChange={handleChange}\n        className=\"mr-2\"\n      />\n      <span className=\"text-sm\">{label}</span>\n    </label>\n  );\n};\nexport default Checkbox;\n"
  },
  {
    "path": "website/src/pages/themes/_components/code-block.tsx",
    "content": "import clsx from \"clsx\";\nimport { Highlight } from \"prism-react-renderer\";\nimport React from \"react\";\nimport { FiCheck, FiCopy } from \"react-icons/fi\";\n\ntype CodeBlock = {\n  title?: string;\n  code: string;\n  language: string;\n};\n\ntype CodeBlockProps = {\n  className?: string;\n} & (CodeBlock | { blocks: CodeBlock[] });\n\nconst CodeBlock = (props: CodeBlockProps) => {\n  const { className: classes } = props;\n  const [copyStatus, setCopyStatus] = React.useState<string | null>(null);\n  const [activeBlockIndex, setActiveBlockIndex] = React.useState(0);\n\n  const code =\n    \"blocks\" in props ? props.blocks[activeBlockIndex].code : props.code;\n  const language =\n    \"blocks\" in props\n      ? props.blocks[activeBlockIndex].language\n      : props.language;\n\n  const handleCopyThemeConfig = () => {\n    navigator.clipboard\n      .writeText(code)\n      // eslint-disable-next-line promise/always-return\n      .then(() => {\n        setCopyStatus(\"Copied successfully.\");\n      })\n      .catch(() => {\n        setCopyStatus(\"Failed to copy.\");\n      });\n  };\n\n  const handleBlockChange = (index: number) => {\n    setActiveBlockIndex(index);\n    setCopyStatus(null);\n  };\n\n  return (\n    <div className=\"bg-code-bg rounded-xl\">\n      {\"blocks\" in props && (\n        <div className=\"flex pt-2\">\n          {props.blocks.map(({ title }, index) => (\n            <button\n              key={index}\n              className={clsx(\n                \"py-1.5 px-5 text-sm font-medium text-grayscale-600\",\n                activeBlockIndex === index\n                  ? \"bg-code-bg text-theme-1 border-b border-theme-1\"\n                  : \"bg-grayscale-400 text-grayscale-800 border-grayscale-800 border-y border-l cursor-pointer hover:text-white\",\n                index === activeBlockIndex - 1 && \"rounded-tr-lg border-r\",\n                index === activeBlockIndex + 1 && \"rounded-tl-lg\",\n              )}\n              onClick={() => handleBlockChange(index)}\n            >\n              {title || \"Terminal\"}\n            </button>\n          ))}\n          <div\n            className={clsx(\n              \"flex-auto px-5 bg-grayscale-400 border-grayscale-800 border-y border-l flex justify-end items-center\",\n              \"blocks\" in props &&\n                activeBlockIndex === props.blocks.length - 1 &&\n                \"rounded-tl\",\n            )}\n          >\n            <div className=\"flex items-center justify-end gap-2\">\n              {copyStatus && (\n                <span className=\"text-grayscale-200 text-xs italic\">\n                  {copyStatus}\n                </span>\n              )}\n              <button\n                onClick={handleCopyThemeConfig}\n                className=\"bg-transparent text-lg text-grayscale-800 cursor-pointer hover:text-grayscale-200 flex items-center justify-center p-1 rounded-md\"\n              >\n                {copyStatus ? <FiCheck className=\"text-theme-1\" /> : <FiCopy />}\n              </button>\n            </div>\n          </div>\n        </div>\n      )}\n      <div className=\"text-sm\">\n        <Highlight code={code} language={language}>\n          {({ className, style, tokens, getLineProps, getTokenProps }) => (\n            <pre className={clsx(classes, className)} style={style}>\n              {tokens.map((line, i) => (\n                <div {...getLineProps({ line, key: i })} key={i}>\n                  {line.map((token, key) => (\n                    <span {...getTokenProps({ token, key })} key={key} />\n                  ))}\n                </div>\n              ))}\n            </pre>\n          )}\n        </Highlight>\n      </div>\n    </div>\n  );\n};\n\nexport default CodeBlock;\n"
  },
  {
    "path": "website/src/pages/themes/_components/code-panel.tsx",
    "content": "import React, { useEffect, useState } from \"react\";\nimport Editor from \"@monaco-editor/react\";\nimport { CUSTOM_THEME, useTheme } from \"../_providers/themeProvider\";\nimport { stringifyWithoutQuotes } from \"../_utils\";\nimport { Button } from \"@site/src/components/button\";\nimport { useAlert } from \"../_providers/alertProvider\";\nimport { AlertType } from \"./alert\";\n\nconst EDITOR_OPTIONS = {\n  minimap: { enabled: false },\n  fontSize: 12,\n};\n\nconst CodePanel = () => {\n  const { onBaseThemeSelect, customThemeConfig } = useTheme();\n  const { addAlert } = useAlert();\n  const [customTheme, setCustomTheme] = useState<string>(() =>\n    stringifyWithoutQuotes(customThemeConfig),\n  );\n\n  useEffect(() => {\n    setCustomTheme(stringifyWithoutQuotes(customThemeConfig));\n  }, [customThemeConfig]);\n\n  const handleCustomThemeChange = (value: string | undefined) => {\n    setCustomTheme(value || \"\");\n  };\n\n  const applyCustomTheme = () => {\n    try {\n      const parsedTheme = new Function(`return (${customTheme.trim()});`)();\n      if (typeof parsedTheme !== \"object\" || Array.isArray(parsedTheme)) {\n        addAlert({\n          type: AlertType.ERROR,\n          title: \"Invalid theme structure.\",\n          message: \"Must be an object.\",\n        });\n        return;\n      }\n      addAlert({\n        type: AlertType.SUCCESS,\n        title: \"Changes applied successfully.\",\n      });\n      onBaseThemeSelect(CUSTOM_THEME.name, parsedTheme);\n    } catch {\n      addAlert({\n        type: AlertType.ERROR,\n        title: \"Invalid JavaScript object.\",\n        message: \"Please check your theme configuration.\",\n      });\n    }\n  };\n\n  const handleEditorMount = (_, monaco) => {\n    monaco.languages.json.jsonDefaults.setDiagnosticsOptions({\n      validate: false,\n      enableSchemaRequest: false,\n      schemas: [],\n    });\n  };\n\n  return (\n    <div className=\"max-w-screen-lg mx-auto p-10 w-full-panel flex-1 flex flex-col justify-start\">\n      <h1 className=\"text-3xl\">Theme Code</h1>\n      <p className=\"text-sm text-grayscale-400 mb-2\">\n        You can <strong>import your code</strong> by pasting your custom theme\n        here or <strong>edit the existing theme</strong> configuration.\n      </p>\n      <div className=\"flex justify-between items-center mb-4 gap-4\">\n        <p className=\"text-sm bg-yellow-100 text-yellow-800 py-0.5 px-1.5 m-0\">\n          <code className=\"align-baseline font-bold bg-transparent\">\n            `candlestick.style.labels.padding`\n          </code>{\" \"}\n          and{\" \"}\n          <code className=\"align-baseline font-bold bg-transparent\">\n            `errorbar.borderWidth`\n          </code>{\" \"}\n          are required for proper theme functionality.\n        </p>\n        <Button onClick={applyCustomTheme} className=\"flex-shrink-0\">\n          Apply Changes\n        </Button>\n      </div>\n      <div className=\"w-full flex-1 border rounded\">\n        <Editor\n          height={650}\n          defaultLanguage=\"json\"\n          theme=\"vs-dark\"\n          value={customTheme}\n          onChange={handleCustomThemeChange}\n          onMount={handleEditorMount}\n          options={EDITOR_OPTIONS}\n        />\n      </div>\n    </div>\n  );\n};\nexport default CodePanel;\n"
  },
  {
    "path": "website/src/pages/themes/_components/color-palette-selector.tsx",
    "content": "import React from \"react\";\nimport { VictoryThemeDefinition } from \"victory\";\nimport clsx from \"clsx\";\nimport { usePreviewOptions } from \"../_providers/previewOptionsProvider\";\nimport ColorPickerList from \"./color-picker-list\";\n\ntype ColorPaletteSelectorProps = {\n  label: string;\n  value: string;\n  palette?: VictoryThemeDefinition[\"palette\"];\n  className?: string;\n  onColorsChange: (newColors: string[]) => void;\n};\n\nconst ColorPaletteSelector = ({\n  label,\n  value,\n  palette,\n  className,\n  onColorsChange,\n}: ColorPaletteSelectorProps) => {\n  const { colorScale, updateColorScale } = usePreviewOptions();\n\n  const handleRadioChange = () => {\n    updateColorScale(value);\n  };\n\n  const handleColorsChange = (newColors) => {\n    onColorsChange(newColors);\n    updateColorScale(value);\n  };\n\n  const isSelected = colorScale === value;\n\n  return (\n    <label\n      className={clsx(\n        \"flex items-start gap-2 border-2 rounded-md p-4 cursor-pointer\",\n        isSelected ? \"border-blue-500 bg-blue-100\" : \"border-gray-200\",\n        className,\n      )}\n    >\n      <input\n        type=\"radio\"\n        name={label}\n        value={value}\n        checked={isSelected}\n        onChange={handleRadioChange}\n      />\n      <ColorPickerList\n        label={label}\n        colors={palette?.[value as string]}\n        onColorsChange={handleColorsChange}\n      />\n    </label>\n  );\n};\nexport default ColorPaletteSelector;\n"
  },
  {
    "path": "website/src/pages/themes/_components/color-picker-list.tsx",
    "content": "import React from \"react\";\nimport ColorPicker, { PLACEHOLDER_COLOR } from \"./color-picker\";\nimport clsx from \"clsx\";\nimport { TiPlus } from \"react-icons/ti\";\n\ntype ColorPickerListProps = {\n  label?: string;\n  colors?: string[];\n  onColorsChange: (newColors: string[]) => void;\n  className?: string;\n};\n\nconst ColorPickerList = ({\n  label,\n  colors = [],\n  onColorsChange,\n  className,\n}: ColorPickerListProps) => {\n  const handleColorChange = (newColor, i) => {\n    const updatedColors = [...colors];\n    updatedColors[i] = newColor;\n    onColorsChange(updatedColors);\n  };\n\n  const handleRemoveColor = (i) => {\n    const updatedColors = [...colors];\n    updatedColors.splice(i, 1);\n    onColorsChange(updatedColors);\n  };\n\n  const handleAddColor = () => {\n    const updatedColors = [...colors, PLACEHOLDER_COLOR];\n    onColorsChange(updatedColors);\n  };\n\n  return (\n    <div className={clsx(\"p-0 m-0\", className)}>\n      {label && (\n        <span className=\"block mb-3 text-sm font-semibold text-gray-800\">\n          {label}\n        </span>\n      )}\n      <div className=\"flex flex-wrap gap-3\">\n        {colors.map((color, i) => (\n          <ColorPicker\n            key={i}\n            color={color}\n            onColorChange={(newColor) => handleColorChange(newColor, i)}\n            onColorRemove={() => handleRemoveColor(i)}\n          />\n        ))}\n        <button\n          onClick={handleAddColor}\n          className=\"flex w-[35px] h-[35px] p-0.5 rounded-full cursor-pointer justify-center items-center border-2 border-grayscale-300\"\n        >\n          <TiPlus />\n        </button>\n      </div>\n    </div>\n  );\n};\nexport default ColorPickerList;\n"
  },
  {
    "path": "website/src/pages/themes/_components/color-picker.tsx",
    "content": "import React, { useId } from \"react\";\nimport { IoMdClose } from \"react-icons/io\";\nimport clsx from \"clsx\";\nimport Select from \"./select\";\n\ntype ColorPickerProps = {\n  label?: string;\n  color: string;\n  onColorChange: (color?: string) => void;\n  onColorRemove?: () => void;\n  showSelectOptions?: boolean;\n  className?: string;\n};\n\nexport const PLACEHOLDER_COLOR = \"#000000\";\nconst DEFAULT_COLOR = undefined;\nenum ColorPickerOptions {\n  NONE = \"none\",\n  CUSTOM = \"custom\",\n}\n\nconst ColorPicker = ({\n  label,\n  color,\n  onColorChange,\n  onColorRemove,\n  showSelectOptions = false,\n  className,\n}: ColorPickerProps) => {\n  const [isPickerOpen, setIsPickerOpen] = React.useState(false);\n  const [colorOption, setColorOption] = React.useState<string | undefined>(\n    () => {\n      if (color === ColorPickerOptions.NONE || color === \"transparent\") {\n        return ColorPickerOptions.NONE;\n      }\n      if (color === DEFAULT_COLOR) {\n        return DEFAULT_COLOR;\n      }\n      return ColorPickerOptions.CUSTOM;\n    },\n  );\n\n  const handleColorOptionChange = (value?: string) => {\n    setColorOption(value);\n    if (value === ColorPickerOptions.NONE) {\n      onColorChange(ColorPickerOptions.NONE);\n    } else if (value === ColorPickerOptions.CUSTOM) {\n      onColorChange(PLACEHOLDER_COLOR);\n    } else {\n      onColorChange(DEFAULT_COLOR);\n    }\n  };\n\n  const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n    if (onColorChange) {\n      onColorChange(event.target.value);\n    }\n  };\n\n  const handleRemoveColor = () => {\n    if (onColorRemove) onColorRemove();\n  };\n\n  const id = useId();\n\n  return (\n    <div className={clsx(\"p-0 m-0\", className)}>\n      {label && (\n        <label\n          htmlFor={id}\n          className=\"block mb-1 text-sm font-semibold text-gray-800 dark:text-white\"\n        >\n          {label}\n        </label>\n      )}\n      <div className=\"flex items-center justify-between gap-2\">\n        {showSelectOptions && (\n          <div className=\"flex items-center flex-1\">\n            <Select\n              id={id}\n              value={colorOption}\n              options={[\n                { label: \"None\", value: ColorPickerOptions.NONE },\n                { label: \"Custom\", value: ColorPickerOptions.CUSTOM },\n              ]}\n              onChange={handleColorOptionChange}\n              className=\"w-full\"\n              includeDefault\n            />\n          </div>\n        )}\n        {colorOption === ColorPickerOptions.CUSTOM && (\n          <div className=\"relative inline-flex rounded-full group/swatch\">\n            <div className=\"flex items-center\">\n              <div className=\"relative\">\n                {onColorRemove && (\n                  <div className=\"absolute -top-1 -right-1 z-20 group/remove\">\n                    <button\n                      onClick={handleRemoveColor}\n                      className=\"w-4 h-4 text-white bg-red-500 flex justify-center items-center text-2xl font-bold rounded-full p-0.5 cursor-pointer opacity-0 group-hover/swatch:opacity-100 group-hover/remove:bg-red-800\"\n                    >\n                      <IoMdClose />\n                    </button>\n                  </div>\n                )}\n                <div\n                  className={clsx(\n                    \"block w-[35px] h-[35px] rounded-full cursor-pointer transition-all justify-center items-center after:content-[''] after:block after:w-full after:h-full after:rounded-[inherit] after:bg-currentColor outline-2 border-2 border-white outline outline-grayscale-300\",\n                    isPickerOpen\n                      ? \"outline-currentColor\"\n                      : \"outline-grayscale-300\",\n                  )}\n                  style={{\n                    color,\n                  }}\n                />\n              </div>\n            </div>\n            <input\n              id={id}\n              className={`absolute top-0 left-0 w-full h-full cursor-pointer opacity-0 z-10 group-hover/swatch:border-currentColor ${\n                isPickerOpen ? \"border-currentColor\" : \"\"\n              }`}\n              type=\"color\"\n              value={color}\n              onChange={handleChange}\n              onFocus={() => setIsPickerOpen(true)}\n              onBlur={() => setIsPickerOpen(false)}\n            />\n          </div>\n        )}\n      </div>\n    </div>\n  );\n};\n\nexport default ColorPicker;\n"
  },
  {
    "path": "website/src/pages/themes/_components/color-scale-override-selector.tsx",
    "content": "import React, { useCallback } from \"react\";\nimport clsx from \"clsx\";\nimport Toggle from \"./toggle\";\nimport {\n  defaultColorScale,\n  usePreviewOptions,\n} from \"../_providers/previewOptionsProvider\";\nimport ColorPickerList from \"./color-picker-list\";\n\ntype ColorScaleOverrideSelectorProps = {\n  id: string;\n  label?: string;\n  colors?: string | string[];\n  onColorsChange: (colors: string[] | undefined) => void;\n  hideDefaultToggle?: boolean;\n  className?: string;\n};\n\nconst ColorScaleOverrideSelector = ({\n  id,\n  label = \"Color Scale\",\n  colors,\n  onColorsChange,\n  hideDefaultToggle = false,\n  className,\n}: ColorScaleOverrideSelectorProps) => {\n  const { colorScale, updateColorScale } = usePreviewOptions();\n  const [showCustomColors, setShowCustomColors] = React.useState(\n    () => !!colors && Array.isArray(colors),\n  );\n  const [prevColors, setPrevColors] = React.useState<string[]>(\n    Array.isArray(colors) ? colors : [],\n  );\n\n  const setColorScaleToDefault = useCallback(() => {\n    if (colorScale !== defaultColorScale) {\n      updateColorScale(defaultColorScale);\n    }\n  }, [colorScale, updateColorScale]);\n\n  const onCheckboxChange = (isChecked) => {\n    setShowCustomColors(isChecked);\n    onColorsChange(!isChecked ? undefined : prevColors);\n    setColorScaleToDefault();\n  };\n\n  const handleColorsChange = (newColors) => {\n    onColorsChange(newColors);\n    setPrevColors(newColors);\n    setColorScaleToDefault();\n  };\n\n  return (\n    <div className={clsx(\"p-0 m-0\", className)}>\n      <label htmlFor={id} className=\"block mb-3 text-sm font-bold\">\n        {label}\n      </label>\n      {!hideDefaultToggle && (\n        <Toggle\n          id={id}\n          label=\"Use custom color scale\"\n          checked={showCustomColors}\n          onChange={onCheckboxChange}\n          className=\"mb-3\"\n          size=\"xs\"\n        />\n      )}\n      {showCustomColors && typeof colors !== \"string\" && (\n        <ColorPickerList colors={colors} onColorsChange={handleColorsChange} />\n      )}\n    </div>\n  );\n};\nexport default ColorScaleOverrideSelector;\n"
  },
  {
    "path": "website/src/pages/themes/_components/control.tsx",
    "content": "import React, { useId } from \"react\";\nimport Select from \"./select\";\nimport Slider from \"./slider\";\nimport ColorPicker from \"./color-picker\";\nimport ColorPaletteSelector from \"./color-palette-selector\";\nimport { getConfigValue } from \"../_utils\";\nimport { useTheme } from \"../_providers/themeProvider\";\nimport Accordion from \"./accordion\";\nimport ColorScaleOverrideSelector from \"./color-scale-override-selector\";\nimport PreviewColorScaleSelect from \"./theme-preview/preview-color-scale-select\";\n\nexport type ColorChangeArgs = {\n  newColor?: string;\n  index: number;\n  colorScale: string;\n};\n\ntype ControlProps = {\n  type: string;\n  control: any;\n  className?: string;\n};\n\nconst Control = ({ type, control, className }: ControlProps) => {\n  const { customThemeConfig, updateCustomThemeConfig } = useTheme();\n\n  const handleChange = (newValue) => {\n    updateCustomThemeConfig(control.path, newValue);\n  };\n\n  const configValue = getConfigValue(customThemeConfig, control.path);\n  const id = useId();\n\n  switch (type) {\n    case \"accordion\":\n      return (\n        <Accordion\n          key={control.label}\n          title={control.label}\n          id={id}\n          defaultOpen={control.defaultOpen}\n          className=\"!my-0\"\n        >\n          {control.controls?.map((nestedControl, i) => (\n            <Control\n              key={nestedControl.label + i}\n              type={nestedControl.type}\n              control={nestedControl}\n              className={className}\n            />\n          ))}\n        </Accordion>\n      );\n    case \"colorPalette\":\n      return (\n        <ColorPaletteSelector\n          label={control.label}\n          value={control.value}\n          palette={customThemeConfig?.palette}\n          onColorsChange={handleChange}\n          className=\"my-4\"\n        />\n      );\n    case \"section\":\n      return (\n        <section className=\"mb-6 bg-white p-4 rounded-md space-y-4\">\n          <div className=\"mb-4\">\n            <h3 className=\"text-lg font-bold text-secondary mb-0 text-gray-800\">\n              {control.label}\n            </h3>\n            {control.description && (\n              <p className=\"text-sm text-grayscale-400\">\n                {control.description}\n              </p>\n            )}\n          </div>\n          {control.controls?.map((nestedControl, i) => (\n            <Control\n              key={nestedControl.label + i}\n              type={nestedControl.type}\n              control={nestedControl}\n              className={className}\n            />\n          ))}\n        </section>\n      );\n    case \"slider\":\n      return (\n        <Slider\n          id={id}\n          key={control.label}\n          label={control.label}\n          value={configValue as number}\n          defaultValue={control.default}\n          unit={control.unit}\n          onChange={handleChange}\n          min={control.min}\n          max={control.max}\n          step={control.step}\n          className={className}\n        />\n      );\n    case \"select\":\n      return (\n        <Select\n          id={id}\n          key={control.label}\n          label={control.label}\n          value={configValue as string}\n          onChange={handleChange}\n          options={control.options}\n          className={className}\n          includeDefault\n        />\n      );\n    case \"colorScale\":\n      return (\n        <ColorScaleOverrideSelector\n          id={id}\n          label={control.label}\n          colors={configValue as string}\n          onColorsChange={handleChange}\n          className={className}\n          hideDefaultToggle={control.hideDefaultToggle}\n        />\n      );\n    case \"colorScalePreview\":\n      return (\n        <PreviewColorScaleSelect\n          key={control.label}\n          label={control.label}\n          className={className}\n        />\n      );\n    case \"colorPicker\":\n      return (\n        <ColorPicker\n          key={control.label}\n          label={control.label}\n          color={configValue as string}\n          onColorChange={handleChange}\n          className={className}\n          showSelectOptions\n        />\n      );\n    default:\n      return null;\n  }\n};\n\nexport default Control;\n"
  },
  {
    "path": "website/src/pages/themes/_components/examples/area.tsx",
    "content": "import React from \"react\";\nimport { VictoryArea, VictoryAxis, VictoryChart } from \"victory\";\n\nimport { ExampleConfig } from \"./example\";\nimport { VictoryComponentType } from \"../../_const\";\n\nexport const AreaExamples: ExampleConfig[] = [\n  {\n    key: VictoryComponentType.AREA,\n    title: \"VictoryArea\",\n    content: (props) => (\n      <VictoryChart theme={props.theme} domainPadding={20}>\n        <VictoryAxis label=\"X Axis\" />\n        <VictoryAxis dependentAxis label=\"Y Axis\" />\n        <VictoryArea\n          {...props}\n          data={[\n            { x: 1, y: 2, label: \"A\" },\n            { x: 2, y: 3, label: \"B\" },\n            { x: 3, y: 5, label: \"C\" },\n            { x: 4, y: 4, label: \"D\" },\n            { x: 5, y: 7, label: \"E\" },\n          ]}\n        />\n      </VictoryChart>\n    ),\n  },\n];\n"
  },
  {
    "path": "website/src/pages/themes/_components/examples/axis.tsx",
    "content": "import React from \"react\";\nimport { VictoryAxis, VictoryChart } from \"victory\";\n\nimport { ExampleConfig } from \"./example\";\nimport { VictoryComponentType } from \"../../_const\";\n\nexport const AxisExamples: ExampleConfig[] = [\n  {\n    key: VictoryComponentType.AXIS,\n    title: \"VictoryAxis\",\n    content: (props) => (\n      <VictoryChart theme={props.theme} domainPadding={20}>\n        <VictoryAxis label=\"X Axis\" {...props} />\n        <VictoryAxis dependentAxis label=\"Y Axis\" {...props} />\n      </VictoryChart>\n    ),\n  },\n];\n"
  },
  {
    "path": "website/src/pages/themes/_components/examples/bar.tsx",
    "content": "import React from \"react\";\nimport { VictoryBar, VictoryAxis, VictoryChart } from \"victory\";\n\nimport { ExampleConfig } from \"./example\";\nimport { VictoryComponentType } from \"../../_const\";\n\nexport const BarExamples: ExampleConfig[] = [\n  {\n    key: VictoryComponentType.BAR,\n    title: \"VictoryBar\",\n    content: (props) => (\n      <VictoryChart theme={props.theme} domainPadding={20}>\n        <VictoryAxis label=\"X Axis\" />\n        <VictoryAxis dependentAxis label=\"Y Axis\" />\n        <VictoryBar\n          {...props}\n          data={[\n            {\n              x: 1,\n              y: 2,\n            },\n            {\n              x: 2,\n              y: 3,\n            },\n            {\n              x: 3,\n              y: 5,\n            },\n            {\n              x: 4,\n              y: 4,\n            },\n            {\n              x: 5,\n              y: 7,\n            },\n          ]}\n        />\n      </VictoryChart>\n    ),\n  },\n];\n"
  },
  {
    "path": "website/src/pages/themes/_components/examples/box-plot.tsx",
    "content": "/* eslint-disable no-magic-numbers */\n\nimport React from \"react\";\nimport { VictoryBoxPlot } from \"victory\";\n\nimport { ExampleConfig } from \"./example\";\nimport { VictoryComponentType } from \"../../_const\";\n\nexport const BoxPlotExamples: ExampleConfig[] = [\n  {\n    key: VictoryComponentType.BOX_PLOT,\n    title: \"VictoryBoxPlot\",\n    content: (props) => (\n      <VictoryBoxPlot\n        {...props}\n        data={[\n          { x: 1, y: [1, 2, 3, 5, 8] },\n          { x: 2, y: [3, 2, 8, 10, 12] },\n          { x: 3, y: [2, 8, 6, 5, 10] },\n          { x: 4, y: [1, 3, 2, 9, 5] },\n          { x: 5, y: [3, 2, 9, 5, 7] },\n        ]}\n        labels\n        labelOrientation=\"right\"\n      />\n    ),\n  },\n];\n"
  },
  {
    "path": "website/src/pages/themes/_components/examples/candlestick.tsx",
    "content": "import React from \"react\";\nimport { VictoryCandlestick } from \"victory\";\n\nimport { ExampleConfig } from \"./example\";\nimport { VictoryComponentType } from \"../../_const\";\n\nexport const CandlestickExamples: ExampleConfig[] = [\n  {\n    key: VictoryComponentType.CANDLESTICK,\n    title: \"VictoryCandlestick\",\n    content: (props) => (\n      <VictoryCandlestick\n        {...props}\n        data={[\n          {\n            x: \"3/1/23\",\n            open: 5,\n            close: 10,\n            high: 15,\n            low: 0,\n            label: \"A\",\n          },\n          {\n            x: \"3/2/23\",\n            open: 10,\n            close: 15,\n            high: 20,\n            low: 5,\n            label: \"B\",\n          },\n          {\n            x: \"3/3/23\",\n            open: 15,\n            close: 20,\n            high: 22,\n            low: 10,\n            label: \"C\",\n          },\n          {\n            x: \"3/4/23\",\n            open: 20,\n            close: 10,\n            high: 25,\n            low: 7,\n            label: \"D\",\n          },\n          {\n            x: \"3/5/23\",\n            open: 10,\n            close: 8,\n            high: 15,\n            low: 5,\n            label: \"E\",\n          },\n        ]}\n      />\n    ),\n  },\n];\n"
  },
  {
    "path": "website/src/pages/themes/_components/examples/errorbar.tsx",
    "content": "/* eslint-disable no-magic-numbers */\nimport React from \"react\";\nimport { VictoryErrorBar } from \"victory\";\n\nimport { ExampleConfig } from \"./example\";\nimport { VictoryComponentType } from \"../../_const\";\n\nexport const ErrorBarExamples: ExampleConfig[] = [\n  {\n    key: VictoryComponentType.ERROR_BAR,\n    title: \"VictoryErrorBar\",\n    content: (props) => (\n      <VictoryErrorBar\n        {...props}\n        data={[\n          { x: 1, y: 1, errorX: [1, 0.5], errorY: 0.1 },\n          { x: 2, y: 2, errorX: [1, 3], errorY: 0.1 },\n          { x: 3, y: 3, errorX: [1, 3], errorY: [0.2, 0.3] },\n          { x: 4, y: 2, errorX: [1, 0.5], errorY: 0.1 },\n          { x: 5, y: 1, errorX: [1, 0.5], errorY: 0.2 },\n        ]}\n      />\n    ),\n  },\n];\n"
  },
  {
    "path": "website/src/pages/themes/_components/examples/example.ts",
    "content": "import { ReactElement } from \"react\";\nimport { ColorScalePropType, VictoryThemeDefinition } from \"victory\";\nimport { VictoryComponentType } from \"../../_const\";\n\ntype ExampleRenderProps = {\n  colorScale: ColorScalePropType;\n  labels: ({ datum }: { datum: any }) => string;\n  labelComponent?: ReactElement | undefined;\n  theme: VictoryThemeDefinition;\n};\n\nexport type ExampleConfig = {\n  key: VictoryComponentType;\n  title: string;\n  content: (props: ExampleRenderProps) => ReactElement;\n  hasVictoryChart?: boolean;\n};\n"
  },
  {
    "path": "website/src/pages/themes/_components/examples/group.tsx",
    "content": "import React from \"react\";\nimport { VictoryAxis, VictoryBar, VictoryChart, VictoryGroup } from \"victory\";\n\nimport { ExampleConfig } from \"./example\";\nimport { VictoryComponentType } from \"../../_const\";\n\nexport const GroupExamples: ExampleConfig[] = [\n  {\n    key: VictoryComponentType.GROUP,\n    title: \"VictoryGroup\",\n    content: (props) => (\n      <VictoryChart theme={props.theme} domainPadding={20}>\n        <VictoryAxis label=\"X Axis\" />\n        <VictoryAxis dependentAxis label=\"Y Axis\" />\n        <VictoryGroup domainPadding={{ x: 20 }} offset={20}>\n          <VictoryBar\n            {...props}\n            data={[\n              { x: \"2023 Q1\", y: 1 },\n              { x: \"2023 Q2\", y: 2 },\n              { x: \"2023 Q3\", y: 3 },\n              { x: \"2023 Q4\", y: 2 },\n            ]}\n          />\n          <VictoryBar\n            {...props}\n            data={[\n              { x: \"2023 Q1\", y: 2 },\n              { x: \"2023 Q2\", y: 3 },\n              { x: \"2023 Q3\", y: 4 },\n              { x: \"2023 Q4\", y: 5 },\n            ]}\n          />\n          <VictoryBar\n            {...props}\n            data={[\n              { x: \"2023 Q1\", y: 1 },\n              { x: \"2023 Q2\", y: 2 },\n              { x: \"2023 Q3\", y: 3 },\n              { x: \"2023 Q4\", y: 4 },\n            ]}\n          />\n        </VictoryGroup>\n      </VictoryChart>\n    ),\n  },\n];\n"
  },
  {
    "path": "website/src/pages/themes/_components/examples/histogram.tsx",
    "content": "import React from \"react\";\nimport { VictoryHistogram } from \"victory\";\n\nimport { ExampleConfig } from \"./example\";\nimport { VictoryComponentType } from \"../../_const\";\n\nexport const HistogramExamples: ExampleConfig[] = [\n  {\n    key: VictoryComponentType.HISTOGRAM,\n    title: \"VictoryHistogram\",\n    content: (props) => (\n      <VictoryHistogram\n        {...props}\n        data={[\n          { x: 0 },\n          { x: 1 },\n          { x: 1 },\n          { x: 1 },\n          { x: 1 },\n          { x: 2 },\n          { x: 2 },\n          { x: 3 },\n          { x: 4 },\n          { x: 7 },\n          { x: 7 },\n          { x: 10 },\n        ]}\n        labels={({ datum }) => `Bin count:\\n ${datum.x}`}\n      />\n    ),\n  },\n];\n"
  },
  {
    "path": "website/src/pages/themes/_components/examples/index.ts",
    "content": "import { AreaExamples } from \"./area\";\nimport { AxisExamples } from \"./axis\";\nimport { BarExamples } from \"./bar\";\nimport { BoxPlotExamples } from \"./box-plot\";\nimport { CandlestickExamples } from \"./candlestick\";\nimport { ErrorBarExamples } from \"./errorbar\";\nimport { GroupExamples } from \"./group\";\nimport { HistogramExamples } from \"./histogram\";\nimport { LineExamples } from \"./line\";\nimport { PieExamples } from \"./pie\";\nimport { PolarAxisExamples } from \"./polar-axis\";\nimport { PolarAxisDependentExamples } from \"./polar-axis-dependent\";\nimport { ScatterExamples } from \"./scatter\";\nimport { StackExamples } from \"./stack\";\nimport { VoronoiExamples } from \"./voronoi\";\n\n// NOTE: these are ordered specifically for the previews\n//       to show the most common examples first\nexport const AllExamples = [\n  ...AreaExamples,\n  ...BarExamples,\n  ...GroupExamples,\n  ...LineExamples,\n  ...PieExamples,\n  ...StackExamples,\n  ...BoxPlotExamples,\n  ...CandlestickExamples,\n  ...ErrorBarExamples,\n  ...HistogramExamples,\n  ...ScatterExamples,\n  ...VoronoiExamples,\n  ...AxisExamples,\n  ...PolarAxisExamples,\n  ...PolarAxisDependentExamples,\n];\n\nexport * from \"./area\";\nexport * from \"./axis\";\nexport * from \"./bar\";\nexport * from \"./box-plot\";\nexport * from \"./candlestick\";\nexport * from \"./errorbar\";\nexport * from \"./example\";\nexport * from \"./group\";\nexport * from \"./histogram\";\nexport * from \"./legend\";\nexport * from \"./line\";\nexport * from \"./pie\";\nexport * from \"./polar-axis\";\nexport * from \"./polar-axis-dependent\";\nexport * from \"./scatter\";\nexport * from \"./stack\";\nexport * from \"./voronoi\";\n"
  },
  {
    "path": "website/src/pages/themes/_components/examples/legend.tsx",
    "content": "import React from \"react\";\nimport { VictoryBar, VictoryChart, VictoryLegend } from \"victory\";\n\nimport { ExampleConfig } from \"./example\";\nimport { VictoryComponentType } from \"../../_const\";\n\nexport const LegendExamples: ExampleConfig[] = [\n  {\n    key: VictoryComponentType.LEGEND,\n    title: \"VictoryLegend\",\n    content: (props) => (\n      <VictoryChart theme={props.theme} domainPadding={20}>\n        <VictoryLegend\n          {...props}\n          x={125}\n          y={20}\n          title=\"Pets\"\n          data={[\n            {\n              name: \"Dogs\",\n              symbol: { fill: \"tomato\" },\n            },\n            {\n              name: \"Cats\",\n              symbol: { fill: \"orange\" },\n            },\n            {\n              name: \"Rabbits\",\n              symbol: { fill: \"gold\" },\n            },\n          ]}\n        />\n        <VictoryBar\n          data={[\n            {\n              x: \"Dogs\",\n              y: 6,\n              fill: \"tomato\",\n            },\n            {\n              x: \"Cats\",\n              y: 4,\n              fill: \"orange\",\n            },\n            {\n              x: \"Rabbits\",\n              y: 2,\n              fill: \"gold\",\n            },\n          ]}\n          style={{\n            data: {\n              fill: ({ datum }) => datum.fill,\n            },\n          }}\n        />\n      </VictoryChart>\n    ),\n  },\n];\n"
  },
  {
    "path": "website/src/pages/themes/_components/examples/line.tsx",
    "content": "import React from \"react\";\nimport { VictoryAxis, VictoryChart, VictoryLine } from \"victory\";\n\nimport { ExampleConfig } from \"./example\";\nimport { VictoryComponentType } from \"../../_const\";\n\nexport const LineExamples: ExampleConfig[] = [\n  {\n    key: VictoryComponentType.LINE,\n    title: \"VictoryLine\",\n    content: (props) => (\n      <VictoryChart theme={props.theme} domainPadding={20}>\n        <VictoryAxis label=\"X Axis\" />\n        <VictoryAxis dependentAxis label=\"Y Axis\" />\n        <VictoryLine\n          {...props}\n          data={[\n            { x: 1, y: 2 },\n            { x: 2, y: 3 },\n            { x: 3, y: 5 },\n            { x: 4, y: 4 },\n            { x: 5, y: 7 },\n          ]}\n          labels={({ datum }) => datum.y}\n        />\n        ,\n      </VictoryChart>\n    ),\n  },\n];\n"
  },
  {
    "path": "website/src/pages/themes/_components/examples/pie.tsx",
    "content": "import React from \"react\";\nimport { VictoryPie } from \"victory\";\n\nimport { ExampleConfig } from \"./example\";\nimport { VictoryComponentType } from \"../../_const\";\n\nexport const PieExamples: ExampleConfig[] = [\n  {\n    key: VictoryComponentType.PIE,\n    title: \"VictoryPie\",\n    content: (props) => (\n      <VictoryPie\n        {...props}\n        data={[\n          { x: \"Cats\", y: 35 },\n          { x: \"Dogs\", y: 40 },\n          { x: \"Birds\", y: 55 },\n          { x: \"Fishes\", y: 15 },\n          { x: \"Reptiles\", y: 10 },\n        ]}\n      />\n    ),\n    hasVictoryChart: false,\n  },\n];\n"
  },
  {
    "path": "website/src/pages/themes/_components/examples/polar-axis-dependent.tsx",
    "content": "/* eslint-disable no-magic-numbers */\nimport React from \"react\";\nimport { VictoryChart, VictoryPolarAxis } from \"victory\";\n\nimport { ExampleConfig } from \"./example\";\nimport { VictoryComponentType } from \"../../_const\";\n\nexport const PolarAxisDependentExamples: ExampleConfig[] = [\n  {\n    key: VictoryComponentType.POLAR_DEPENDENT_AXIS,\n    title: \"VictoryPolarAxis - Dependent\",\n    content: (props) => (\n      <VictoryChart theme={props.theme} domainPadding={20}>\n        <VictoryPolarAxis\n          {...props}\n          dependentAxis\n          domain={[0, 10]}\n          standalone={false}\n        />\n      </VictoryChart>\n    ),\n  },\n];\n"
  },
  {
    "path": "website/src/pages/themes/_components/examples/polar-axis.tsx",
    "content": "import React from \"react\";\nimport { VictoryChart, VictoryPolarAxis } from \"victory\";\n\nimport { ExampleConfig } from \"./example\";\nimport { VictoryComponentType } from \"../../_const\";\n\nexport const PolarAxisExamples: ExampleConfig[] = [\n  {\n    key: VictoryComponentType.POLAR_AXIS,\n    title: \"VictoryPolarAxis\",\n    content: (props) => (\n      <VictoryChart theme={props.theme} domainPadding={20}>\n        <VictoryPolarAxis {...props} standalone={false} />\n      </VictoryChart>\n    ),\n  },\n];\n"
  },
  {
    "path": "website/src/pages/themes/_components/examples/scatter.tsx",
    "content": "import React from \"react\";\nimport { VictoryScatter } from \"victory\";\n\nimport { ExampleConfig } from \"./example\";\nimport { VictoryComponentType } from \"../../_const\";\n\nexport const ScatterExamples: ExampleConfig[] = [\n  {\n    key: VictoryComponentType.SCATTER,\n    title: \"VictoryScatter\",\n    content: (props) => (\n      <VictoryScatter\n        {...props}\n        data={[\n          { x: 1, y: 2 },\n          { x: 2, y: 3 },\n          { x: 3, y: 5 },\n          { x: 4, y: 4 },\n          { x: 5, y: 7 },\n        ]}\n      />\n    ),\n  },\n];\n"
  },
  {
    "path": "website/src/pages/themes/_components/examples/stack.tsx",
    "content": "import React from \"react\";\nimport { VictoryArea, VictoryAxis, VictoryChart, VictoryStack } from \"victory\";\nimport {\n  NUM_STACKS,\n  sampleStackData,\n  VictoryComponentType,\n} from \"../../_const\";\n\nimport { ExampleConfig } from \"./example\";\n\nexport const StackExamples: ExampleConfig[] = [\n  {\n    key: VictoryComponentType.STACK,\n    title: \"VictoryStack\",\n    content: (props) => (\n      <VictoryChart theme={props.theme} domainPadding={20}>\n        <VictoryAxis label=\"X Axis\" />\n        <VictoryAxis dependentAxis label=\"Y Axis\" />\n        <VictoryStack\n          {...props}\n          key=\"victory-stack\"\n          colorScale={props.colorScale}\n        >\n          {[...Array(NUM_STACKS)].map((_, i) => (\n            <VictoryArea data={sampleStackData} key={i} />\n          ))}\n        </VictoryStack>\n      </VictoryChart>\n    ),\n  },\n];\n"
  },
  {
    "path": "website/src/pages/themes/_components/examples/voronoi.tsx",
    "content": "import React from \"react\";\nimport { VictoryVoronoi } from \"victory\";\n\nimport { ExampleConfig } from \"./example\";\nimport { VictoryComponentType } from \"../../_const\";\n\nexport const VoronoiExamples: ExampleConfig[] = [\n  {\n    key: VictoryComponentType.VORONOI,\n    title: \"VictoryVoronoi\",\n    content: (props) => (\n      <VictoryVoronoi\n        {...props}\n        data={[\n          { x: 1, y: 2 },\n          { x: 2, y: 3 },\n          { x: 3, y: 5 },\n          { x: 4, y: 4 },\n          { x: 5, y: 7 },\n        ]}\n      />\n    ),\n  },\n];\n"
  },
  {
    "path": "website/src/pages/themes/_components/export-panel.tsx",
    "content": "import React, { useMemo } from \"react\";\nimport CodeBlock from \"./code-block\";\nimport { useTheme } from \"../_providers/themeProvider\";\nimport { VictoryTheme } from \"victory\";\nimport { Button } from \"@site/src/components/button\";\n\nconst generateThemeCode = (config, format: \"js\" | \"ts\") => {\n  const jsonConfig = JSON.stringify(config, null, 2).replace(\n    // Remove quotes around keys\n    /\"([^\"]+)\":/g,\n    \"$1:\",\n  );\n  if (format === \"js\") {\n    return `/** @type {import('victory').VictoryThemeDefinition} */\\n\\nconst customTheme = ${jsonConfig};\\n\\nexport default customTheme;`;\n  }\n  return `import { VictoryThemeDefinition } from 'victory';\\n\\nconst customTheme: VictoryThemeDefinition = ${jsonConfig};\\n\\nexport default customTheme;`;\n};\n\nconst availableOptions = Object.keys(VictoryTheme.clean).map((key) => {\n  return {\n    label: key,\n    value: key,\n  };\n});\n\nconst ExportPanel = () => {\n  const { customThemeConfig: config } = useTheme();\n  const [selectedOptions, setSelectedOptions] = React.useState<string[]>(() =>\n    availableOptions.map((option) => option.value),\n  );\n\n  const filteredConfig = useMemo(() => {\n    if (!config) return {};\n    return Object.keys(config).reduce((acc, key) => {\n      if (selectedOptions.includes(key)) {\n        acc[key] = config[key];\n      }\n      return acc;\n    }, {});\n  }, [config, selectedOptions]);\n\n  const blocks = useMemo(\n    () => [\n      {\n        title: \"theme.js\",\n        code: generateThemeCode(filteredConfig, \"js\"),\n        language: \"jsx\",\n      },\n      {\n        title: \"theme.ts\",\n        code: generateThemeCode(filteredConfig, \"ts\"),\n        language: \"tsx\",\n      },\n    ],\n    [filteredConfig],\n  );\n\n  const handleSelectButtonClick = () => {\n    const newOptions =\n      selectedOptions.length === availableOptions.length\n        ? []\n        : availableOptions.map((option) => option.value);\n    setSelectedOptions(newOptions);\n  };\n\n  const handleCheckboxChange = (value: string) => {\n    setSelectedOptions((prev) => {\n      if (prev.includes(value)) {\n        return prev.filter((option) => option !== value);\n      }\n      return [...prev, value];\n    });\n  };\n\n  return (\n    <div className=\"max-w-screen-lg mx-auto p-10 w-full-panel\">\n      <h1 className=\"text-3xl\">\n        How to Use Your Exported Victory Theme Config\n      </h1>\n      <ol className=\"pl-4 space-y-2\">\n        <li>\n          <strong>Choose Theme Options to Export</strong>\n          <p className=\"mb-2\">\n            Select the theme options to include in your custom theme export.\n          </p>\n          <div className=\"mb-6\">\n            <ul className=\"space-y-2 p-0 grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 w-full\">\n              {availableOptions.map(({ label, value }) => (\n                <li key={value} className=\"flex items-center cursor-pointer\">\n                  <input\n                    type=\"checkbox\"\n                    id={value}\n                    checked={selectedOptions.includes(value)}\n                    onChange={() => handleCheckboxChange(value)}\n                    className=\"mr-2\"\n                  />\n                  <label htmlFor={value} className=\"cursor-pointer\">\n                    {label}\n                  </label>\n                </li>\n              ))}\n            </ul>\n            <Button\n              onClick={handleSelectButtonClick}\n              size=\"sm\"\n              className=\"mt-4\"\n            >\n              {selectedOptions.length === availableOptions.length\n                ? \"Deselect All\"\n                : \"Select All\"}\n            </Button>\n          </div>\n        </li>\n        <li>\n          <strong>Save the Exported Theme File</strong>\n          <p className=\"mb-2\">\n            Save your custom generate theme to a file in your project. Use{\" \"}\n            <code>theme.js</code> or <code>theme.ts</code> depending on whether\n            your project uses JavaScript or TypeScript.\n          </p>\n          <CodeBlock blocks={blocks} className=\"h-[500px]\" />\n        </li>\n        <li>\n          <strong>Import the Theme</strong>\n          <p className=\"mb-2\">\n            To use your custom theme in your application, import the file where\n            you saved the theme configuration. The import path should match the\n            file&apos;s location in your project directory.\n          </p>\n          <CodeBlock\n            blocks={[\n              {\n                title: \"App.js\",\n                code: `import customTheme from './theme.js';`,\n                language: \"jsx\",\n              },\n              {\n                title: \"App.ts\",\n                code: `import customTheme from './theme.ts';`,\n                language: \"tsx\",\n              },\n            ]}\n          />\n        </li>\n        <li>\n          <strong>Apply the Theme to Victory Components</strong>\n          <p className=\"mb-2\">\n            Once the theme is imported, you can apply it to Victory components\n            by passing it as the <code>theme</code> prop.\n          </p>\n          <CodeBlock\n            code={`<VictoryChart theme={customTheme}>\n  {/* Add your Victory components here */}\n</VictoryChart>`}\n            language=\"jsx\"\n          />\n        </li>\n      </ol>\n    </div>\n  );\n};\n\nexport default ExportPanel;\n"
  },
  {
    "path": "website/src/pages/themes/_components/main.tsx",
    "content": "import React from \"react\";\nimport { useSideNavContext } from \"../_providers/sideNavProvider\";\nimport { ThemePreview } from \"./theme-preview\";\nimport BaseThemePanel from \"./base-theme-panel\";\nimport ChartPanel from \"./chart-panel\";\nimport OptionsPanel from \"./options-panel\";\nimport ExportPanel from \"./export-panel\";\nimport CodePanel from \"./code-panel\";\n\nconst Main = () => {\n  const { activeSideNavItem } = useSideNavContext();\n\n  const isExportPanel = activeSideNavItem.panelType === \"export\";\n\n  if (isExportPanel) return <ExportPanel />;\n\n  if (activeSideNavItem.panelType === \"code\") return <CodePanel />;\n\n  return (\n    <>\n      <aside className=\"sticky top-[60px] h-theme-builder p-6 border-r border-grayscale-300 overflow-y-scroll w-[390px] bg-gray-100\">\n        {activeSideNavItem.panelType === \"theme\" && <BaseThemePanel />}\n        {activeSideNavItem.panelType === \"chart\" && (\n          <ChartPanel config={activeSideNavItem.config} />\n        )}\n        {activeSideNavItem.panelType === \"default\" && (\n          <OptionsPanel config={activeSideNavItem.config} />\n        )}\n      </aside>\n      <ThemePreview />\n    </>\n  );\n};\nexport default Main;\n"
  },
  {
    "path": "website/src/pages/themes/_components/options-panel.tsx",
    "content": "import React from \"react\";\nimport Control from \"./control\";\nimport PanelHeader from \"./panel-header\";\nimport { OptionsPanelConfig } from \"../_config\";\n\ntype GlobalPanelProps = {\n  config: OptionsPanelConfig;\n};\n\nconst OptionsPanel = ({\n  config: { title, description, controls },\n}: GlobalPanelProps) => {\n  return (\n    <>\n      <PanelHeader title={title} description={description} />\n      {controls.map((control, i) => {\n        return (\n          <Control\n            key={control.label + i}\n            type={control.type}\n            control={control}\n          />\n        );\n      })}\n    </>\n  );\n};\nexport default OptionsPanel;\n"
  },
  {
    "path": "website/src/pages/themes/_components/panel-header.tsx",
    "content": "import React from \"react\";\n\ntype PanelHeaderProps = {\n  title?: string;\n  description?: string;\n};\n\nconst PanelHeader = ({ title, description }: PanelHeaderProps) => {\n  return (\n    <div className=\"mb-4\">\n      {!!title && (\n        <h2 className=\"mb-0 text-xl font-bold text-gray-800\">{title}</h2>\n      )}\n      {!!description && (\n        <p className=\"text-sm mt-1 text-grayscale-400\">{description}</p>\n      )}\n    </div>\n  );\n};\nexport default PanelHeader;\n"
  },
  {
    "path": "website/src/pages/themes/_components/select.tsx",
    "content": "import React from \"react\";\nimport clsx from \"clsx\";\n\nexport type SelectOption = {\n  label: string;\n  value?: string;\n};\n\ntype SelectProps = {\n  id: string;\n  label?: string;\n  options: SelectOption[];\n  value?: string;\n  onChange: (value: string) => void;\n  includeDefault?: boolean;\n  className?: string;\n  size?: \"sm\" | \"md\";\n};\n\nconst Select = ({\n  id,\n  label,\n  options,\n  value = \"\",\n  onChange,\n  includeDefault,\n  className,\n  size = \"md\",\n}: SelectProps) => {\n  const handleChange = (event: React.ChangeEvent<HTMLSelectElement>) => {\n    if (onChange) {\n      onChange(event.target.value);\n    }\n  };\n\n  const labelSizeClasses = size === \"sm\" ? \"font-medium\" : \"font-semibold\";\n  const selectSizeClasses =\n    size === \"sm\" ? \"text-sm px-2 py-1.5\" : \"text-base p-2\";\n\n  return (\n    <div className={clsx(\"relative\", className)}>\n      {label && (\n        <label\n          htmlFor={id}\n          className={clsx(\n            \"block flex-1 mb-1 text-sm text-gray-800\",\n            labelSizeClasses,\n          )}\n        >\n          {label}\n        </label>\n      )}\n      <select\n        id={id}\n        value={value}\n        onChange={handleChange}\n        className={clsx(\n          \"w-full border border-grayscale-300 bg-white appearance-none rounded-md bg-select-chevron bg-no-repeat bg-[right_8px_center] bg-[length:16px] flex-1 font-sans text-sm p-2.5\",\n          selectSizeClasses,\n        )}\n      >\n        {includeDefault && <option value=\"\">Default</option>}\n        {options.map((option, i) => (\n          <option key={(option.value || \"\") + i} value={option.value}>\n            {option.label}\n          </option>\n        ))}\n      </select>\n    </div>\n  );\n};\nexport default Select;\n"
  },
  {
    "path": "website/src/pages/themes/_components/sideNavButton.tsx",
    "content": "import clsx from \"clsx\";\nimport React from \"react\";\nimport { NavItem } from \"./sidenav\";\n\ntype SideNavButtonProps = {\n  item: NavItem;\n  Icon: React.ElementType;\n  isActive: boolean;\n  isDisabled?: boolean;\n  onClick: () => void;\n};\n\nconst SideNavButton = ({\n  item,\n  Icon,\n  isActive,\n  isDisabled = false,\n  onClick,\n}: SideNavButtonProps) => {\n  return (\n    <button\n      key={item.title}\n      aria-current={isActive ? \"page\" : undefined}\n      onClick={onClick}\n      disabled={isDisabled}\n      className={clsx(\n        \"group flex w-full flex-col items-center rounded-md p-3 text-xs font-semibold cursor-pointer\",\n        isActive\n          ? \"text-white bg-gray-800\"\n          : \"text-grayscale-300 hover:text-white disabled:text-grayscale-800 disabled:cursor-not-allowed bg-transparent hover:bg-gray-900\",\n      )}\n    >\n      <Icon\n        aria-hidden=\"true\"\n        className={clsx(\n          isActive\n            ? \"text-orange-100\"\n            : \"text-grayscale-300 group-hover:text-white group-disabled:text-grayscale-800\",\n          \"size-5\",\n        )}\n      />\n      <span className=\"mt-2\">{item.title}</span>\n    </button>\n  );\n};\n\nexport default SideNavButton;\n"
  },
  {
    "path": "website/src/pages/themes/_components/sidenav.tsx",
    "content": "import clsx from \"clsx\";\nimport React from \"react\";\nimport {\n  chartOptionsConfig,\n  ChartPanelConfig,\n  globalOptionsConfig,\n  OptionsPanelConfig,\n  paletteOptionsConfig,\n} from \"../_config\";\nimport axisOptionsConfig from \"../_config/axis\";\nimport { useTheme } from \"../_providers/themeProvider\";\nimport {\n  defaultColorScale,\n  usePreviewOptions,\n} from \"../_providers/previewOptionsProvider\";\nimport {\n  AllExamples,\n  ExampleConfig,\n  GroupExamples,\n  PieExamples,\n  StackExamples,\n} from \"./examples\";\nimport SideNavButton from \"./sideNavButton\";\nimport { useSideNavContext } from \"../_providers/sideNavProvider\";\nimport { AxisOptionsIcon, ChartOptionsIcon, ExportIcon } from \"../_icons\";\nimport { FiGlobe } from \"react-icons/fi\";\nimport { LuDatabase } from \"react-icons/lu\";\nimport { HiOutlineColorSwatch, HiCode } from \"react-icons/hi\";\n\nexport type NavItem = {\n  title: string;\n  Icon: React.ElementType;\n  content: ExampleConfig[];\n} & (\n  | {\n      panelType: \"theme\" | \"export\" | \"code\";\n    }\n  | {\n      panelType: \"default\";\n      config: OptionsPanelConfig;\n    }\n  | {\n      panelType: \"chart\";\n      config: ChartPanelConfig;\n    }\n);\n\nexport const baseThemeItem: NavItem = {\n  title: \"Base Theme\",\n  Icon: LuDatabase,\n  panelType: \"theme\",\n  content: AllExamples,\n};\n\nexport const colorPaletteItem: NavItem = {\n  title: \"Color Palette\",\n  Icon: HiOutlineColorSwatch,\n  config: paletteOptionsConfig,\n  panelType: \"default\",\n  content: [...StackExamples, ...GroupExamples, ...PieExamples],\n};\n\nexport const globalOptionsItem: NavItem = {\n  title: \"Global Options\",\n  Icon: FiGlobe,\n  config: globalOptionsConfig,\n  panelType: \"default\",\n  content: AllExamples,\n};\n\nexport const axisOptionsItem: NavItem = {\n  title: \"Axis Options\",\n  Icon: AxisOptionsIcon,\n  config: axisOptionsConfig,\n  panelType: \"chart\",\n  content: [],\n};\n\nexport const chartOptionsItem: NavItem = {\n  title: \"Chart Options\",\n  Icon: ChartOptionsIcon,\n  config: chartOptionsConfig,\n  panelType: \"chart\",\n  content: [],\n};\n\nexport const NAV_ITEMS: NavItem[] = [\n  baseThemeItem,\n  colorPaletteItem,\n  globalOptionsItem,\n  axisOptionsItem,\n  chartOptionsItem,\n];\n\nexport const codeItem: NavItem = {\n  title: \"Theme Code\",\n  Icon: HiCode,\n  panelType: \"code\",\n  content: [],\n};\n\nexport const exportItem: NavItem = {\n  title: \"Export Theme\",\n  Icon: ExportIcon,\n  panelType: \"export\",\n  content: [],\n};\n\nconst SideNav = () => {\n  const { baseTheme } = useTheme();\n  const { activeSideNavItem, setActiveSideNavItem } = useSideNavContext();\n  const { setExampleContent, updateColorScale, setActiveChartType } =\n    usePreviewOptions();\n  const isBaseThemeSelected = !!baseTheme;\n\n  const handleItemSelect = (item: NavItem) => {\n    setActiveChartType(null);\n    setActiveSideNavItem(item);\n    updateColorScale(defaultColorScale);\n    setExampleContent(item.content);\n  };\n\n  const isExportItemActive = activeSideNavItem.title === exportItem.title;\n  const isCodeItemActive = activeSideNavItem.title === codeItem.title;\n\n  return (\n    <aside className=\"sticky top-[60px] h-theme-builder w-[100px] overflow-y-auto bg-black py-2 flex-none flex flex-col justify-between px-2\">\n      <div className=\"w-full space-y-1\">\n        {NAV_ITEMS.map((item, i) => {\n          const isActive = item.title === activeSideNavItem.title;\n          const isDisabled =\n            item.title !== \"Base Theme\" && !isBaseThemeSelected;\n          return (\n            <SideNavButton\n              key={item.title + i}\n              item={item}\n              Icon={item.Icon}\n              isActive={isActive}\n              isDisabled={isDisabled}\n              onClick={() => handleItemSelect(item)}\n            />\n          );\n        })}\n      </div>\n      <div className=\"w-full space-y-4\">\n        <SideNavButton\n          item={codeItem}\n          Icon={codeItem.Icon}\n          isActive={isCodeItemActive}\n          onClick={() => handleItemSelect(codeItem)}\n        />\n        <button\n          aria-current={isExportItemActive ? \"page\" : undefined}\n          onClick={() => handleItemSelect(exportItem)}\n          disabled={!isBaseThemeSelected}\n          className={clsx(\n            \"group flex w-full flex-col items-center rounded-md p-3 text-xs font-bold cursor-pointer text-theme-2 disabled:bg-grayscale-400 disabled:text-grayscale-800 disabled:cursor-not-allowed\",\n            isExportItemActive\n              ? \"bg-theme-1/100\"\n              : \"bg-theme-1/80 hover:bg-theme-1/100\",\n          )}\n        >\n          <exportItem.Icon\n            aria-hidden=\"true\"\n            className={\"size-5 group-disabled:text-grayscale-800\"}\n          />\n          <span className=\"mt-2\">{exportItem.title}</span>\n        </button>\n      </div>\n    </aside>\n  );\n};\n\nexport default SideNav;\n"
  },
  {
    "path": "website/src/pages/themes/_components/slider.tsx",
    "content": "import React, { useState } from \"react\";\nimport clsx from \"clsx\";\nimport Toggle from \"./toggle\";\n\ntype SliderProps = {\n  label: string;\n  id: string;\n  value?: number;\n  defaultValue?: number;\n  unit?: string;\n  onChange?: (value?: number) => void;\n  min?: number;\n  max?: number;\n  step?: number;\n  className?: string;\n};\n\nconst DEFAULT_MIN = 1;\nconst DEFAULT_MAX = 100;\n\nconst Slider = ({\n  label,\n  id,\n  value,\n  defaultValue,\n  unit,\n  onChange,\n  min = DEFAULT_MIN,\n  max = DEFAULT_MAX,\n  step = 1,\n  className,\n}: SliderProps) => {\n  const [prevValue, setPrevValue] = useState(() => {\n    return value ?? defaultValue ?? min;\n  });\n\n  const handleSliderChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n    const newValue = event.target.valueAsNumber;\n    if (onChange) {\n      onChange(newValue);\n      setPrevValue(newValue);\n    }\n  };\n\n  const handleNumberChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n    const newValue = parseFloat(event.target.value) || min;\n    if (onChange) {\n      onChange(newValue);\n    }\n  };\n\n  const handleToggle = (isChecked: boolean) => {\n    if (!onChange) return;\n    const newValue = isChecked ? undefined : prevValue;\n    onChange(newValue);\n  };\n\n  const isUsingDefault = value === undefined;\n\n  return (\n    <fieldset className={clsx(\"relative p-0 m-0\", className)}>\n      <label\n        htmlFor={id}\n        className=\"flex justify-between items-center mb-2 text-sm font-semibold text-gray-800\"\n      >\n        <span>{label}</span>\n      </label>\n      <Toggle\n        id={`${id}-toggle`}\n        label=\"Use default\"\n        checked={value === undefined}\n        onChange={handleToggle}\n        size=\"xs\"\n      />\n      <div\n        className={clsx(\n          \"flex items-center gap-4 mt-2\",\n          isUsingDefault && \"opacity-30\",\n        )}\n      >\n        <input\n          id={id}\n          type=\"range\"\n          value={isUsingDefault ? \"\" : value}\n          onChange={handleSliderChange}\n          className={clsx(\n            \"w-full h-2 bg-grayscale-300 rounded-lg appearance-none accent-blue-500 m-0\",\n            !isUsingDefault && \"cursor-pointer\",\n          )}\n          min={min}\n          max={max}\n          step={step}\n          disabled={isUsingDefault}\n        />\n        <div className=\"flex items-center\">\n          <input\n            id={`${id}-number-input`}\n            type=\"number\"\n            value={isUsingDefault ? \"\" : value}\n            onChange={handleNumberChange}\n            className=\"px-2 py-1 text-sm border border-grayscale-300 rounded-lg\"\n            min={min}\n            max={max}\n            step={step}\n            disabled={isUsingDefault}\n          />\n          {unit && <span className=\"text-sm ml-1\">{unit}</span>}\n        </div>\n      </div>\n    </fieldset>\n  );\n};\n\nexport default Slider;\n"
  },
  {
    "path": "website/src/pages/themes/_components/theme-preview/header.tsx",
    "content": "import React, { useState } from \"react\";\n\nimport { Button } from \"@site/src/components/button\";\nimport { useClickOutside } from \"@site/src/hooks/useClickOutside\";\nimport { Options } from \"./options\";\n\nexport function Header() {\n  const [isSettingsMenuOpen, setIsSettingsMenuOpen] = useState(false);\n\n  const ref = useClickOutside(() => {\n    setIsSettingsMenuOpen((prev) => !prev);\n  });\n\n  const handlePreviewClick = () => {\n    setIsSettingsMenuOpen((prev) => !prev);\n  };\n\n  return (\n    <div className=\"border-b border-gray-200 pb-3 mb-6 sm:flex sm:items-center sm:justify-between\">\n      <h3 className=\"mb-0 font-semibold text-gray-900\">Chart Previews</h3>\n      <div className=\"mt-3 sm:ml-4 sm:mt-0\">\n        <Button onClick={handlePreviewClick}>Preview Options</Button>\n        <Options isOpen={isSettingsMenuOpen} ref={ref} />\n      </div>\n    </div>\n  );\n}\n"
  },
  {
    "path": "website/src/pages/themes/_components/theme-preview/index.tsx",
    "content": "import React from \"react\";\n\nimport { ColorScalePropType } from \"victory\";\n\nimport { useTheme } from \"../../_providers/themeProvider\";\nimport { usePreviewOptions } from \"../../_providers/previewOptionsProvider\";\nimport { Preview } from \"./preview\";\nimport { Header } from \"./header\";\n\nexport function ThemePreview() {\n  const { customThemeConfig } = useTheme();\n  const { colorScale, exampleContent, showTooltips } = usePreviewOptions();\n\n  if (!customThemeConfig) return null;\n\n  return (\n    <main className=\"flex-1 flex flex-col items-center overflow-y-auto h-full\">\n      <div className=\"max-w-screen-xl w-full px-10 pt-6 pb-20\">\n        <Header />\n        <div className=\"grid grid-cols-1 gap-10 xl:grid-cols-2\">\n          {exampleContent.map((content, i) => (\n            <Preview\n              key={i}\n              config={content}\n              colorScale={colorScale as ColorScalePropType}\n              showTooltips={showTooltips}\n              theme={customThemeConfig}\n              showOptions={exampleContent.length > 1}\n            />\n          ))}\n        </div>\n      </div>\n    </main>\n  );\n}\n"
  },
  {
    "path": "website/src/pages/themes/_components/theme-preview/options.tsx",
    "content": "import React, { forwardRef } from \"react\";\nimport { usePreviewOptions } from \"../../_providers/previewOptionsProvider\";\nimport Toggle from \"../toggle\";\nimport PreviewColorScaleSelect from \"./preview-color-scale-select\";\n\ntype Props = {\n  isOpen: boolean;\n};\n\nexport const Options = forwardRef<HTMLDivElement, Props>(({ isOpen }, ref) => {\n  const { showTooltips, setShowTooltips } = usePreviewOptions();\n\n  return (\n    <div className=\"relative\">\n      {isOpen && (\n        <div\n          className=\"absolute w-[400px] right-0 mt-1 border border-grayscale-300 bg-white rounded-md z-50 p-4 shadow-md\"\n          ref={ref}\n        >\n          <h1 className=\"text-base font-bold mb-4 text-gray-800\">\n            Preview Settings\n          </h1>\n          <PreviewColorScaleSelect size=\"sm\" />\n          <Toggle\n            id=\"show-tooltips\"\n            label=\"Show tooltips instead of labels\"\n            checked={showTooltips}\n            onChange={setShowTooltips}\n            className=\"mt-4\"\n            size=\"xs\"\n          />\n        </div>\n      )}\n    </div>\n  );\n});\n"
  },
  {
    "path": "website/src/pages/themes/_components/theme-preview/preview-color-scale-select.tsx",
    "content": "import React, { useId } from \"react\";\nimport Select from \"../select\";\nimport { usePreviewOptions } from \"../../_providers/previewOptionsProvider\";\nimport { colorScaleOptions } from \"../../_const\";\nimport clsx from \"clsx\";\n\ntype PreviewColorScaleSelectProps = {\n  label?: string;\n  size?: \"sm\" | \"md\";\n  className?: string;\n};\n\nconst PreviewColorScaleSelect = ({\n  label = \"Preview color scale\",\n  size = \"md\",\n  className,\n}: PreviewColorScaleSelectProps) => {\n  const { colorScale, updateColorScale } = usePreviewOptions();\n  const id = useId();\n  return (\n    <Select\n      id={id}\n      label={label}\n      value={colorScale}\n      onChange={updateColorScale}\n      options={colorScaleOptions}\n      includeDefault\n      className={clsx(\n        \"my-2\",\n        size === \"sm\" && \"flex items-center justify-between\",\n        className,\n      )}\n      size={size}\n    />\n  );\n};\nexport default PreviewColorScaleSelect;\n"
  },
  {
    "path": "website/src/pages/themes/_components/theme-preview/preview.tsx",
    "content": "import React from \"react\";\n\nimport {\n  ColorScalePropType,\n  VictoryThemeDefinition,\n  VictoryTooltip,\n} from \"victory\";\nimport { ExampleConfig } from \"../examples\";\nimport { useSideNavContext } from \"../../_providers/sideNavProvider\";\nimport { axisOptionsItem, chartOptionsItem } from \"../sidenav\";\nimport { usePreviewOptions } from \"../../_providers/previewOptionsProvider\";\nimport { VictoryComponentType } from \"../../_const\";\nimport { AdjustmentsVerticalIcon } from \"@heroicons/react/24/outline\";\n\ntype Props = {\n  config: ExampleConfig;\n  theme: VictoryThemeDefinition;\n  colorScale: ColorScalePropType;\n  showTooltips: boolean;\n  showOptions: boolean;\n};\n\nexport function Preview({\n  config,\n  theme,\n  colorScale,\n  showTooltips,\n  showOptions = true,\n}: Props) {\n  const { content: Content, title, key } = config;\n  const { setActiveChartType } = usePreviewOptions();\n  const { setActiveSideNavItem } = useSideNavContext();\n\n  const handleOptionsClick = () => {\n    if (\n      [\n        VictoryComponentType.AXIS,\n        VictoryComponentType.POLAR_AXIS,\n        VictoryComponentType.POLAR_DEPENDENT_AXIS,\n      ].includes(key)\n    ) {\n      setActiveSideNavItem(axisOptionsItem);\n    } else {\n      setActiveSideNavItem(chartOptionsItem);\n    }\n    setActiveChartType(key);\n    if (typeof window !== \"undefined\") window.scrollTo(0, 0);\n  };\n\n  return (\n    <div className=\"border border-solid border-gray-200 p-8\">\n      <div className=\"flex justify-between items-center mb-3\">\n        <h3 className=\"text-lg font-bold mb-0\">{title}</h3>\n        {showOptions && (\n          <button\n            onClick={handleOptionsClick}\n            className=\"bg-transparent border border-gray-200 font-sans font-medium cursor-pointer p-1.5 -m-1 rounded-md hover:bg-gray-200 flex items-center justify-center text-gray-500\"\n          >\n            Chart Options\n            <AdjustmentsVerticalIcon className=\"ml-1 size-5\" />\n          </button>\n        )}\n      </div>\n      {Content({\n        labels: ({ datum }) => datum.y || datum.x,\n        colorScale: colorScale as ColorScalePropType,\n        theme,\n        ...(showTooltips && {\n          labelComponent: <VictoryTooltip />,\n        }),\n      })}\n    </div>\n  );\n}\n"
  },
  {
    "path": "website/src/pages/themes/_components/toggle.tsx",
    "content": "import clsx from \"clsx\";\nimport React from \"react\";\n\ntype ToggleProps = {\n  id: string;\n  label: string;\n  checked: boolean;\n  onChange: (checked: boolean) => void;\n  className?: string;\n  size?: \"xs\" | \"sm\" | \"md\";\n};\n\nconst Toggle = ({\n  id,\n  label,\n  checked,\n  onChange,\n  className,\n  size = \"md\",\n}: ToggleProps) => {\n  const handleToggle = () => {\n    onChange(!checked);\n  };\n\n  return (\n    <div className={clsx(\"flex justify-start items-center gap-2\", className)}>\n      <button\n        type=\"button\"\n        id={id}\n        role=\"switch\"\n        aria-checked={checked}\n        onClick={handleToggle}\n        className={clsx(\n          \"group flex p-0.5 rounded-full bg-gray-300 transition-colors duration-200 ease-in-out overflow-hidden aria-checked:bg-blue-500 cursor-pointer\",\n          size === \"xs\" && \"w-7 h-4\",\n          size === \"sm\" && \"w-9 h-5\",\n          size === \"md\" && \"w-11 h-6\",\n        )}\n      >\n        <span\n          className={clsx(\n            \"rounded-full bg-white transition-transform duration-200 ease-in-out group-aria-checked:translate-x-full\",\n            size === \"xs\" && \"h-3 w-3\",\n            size === \"sm\" && \"h-4 w-4\",\n            size === \"md\" && \"h-5 w-5\",\n          )}\n        ></span>\n      </button>\n      <label htmlFor={id} className=\"text-sm font-medium\">\n        {label}\n      </label>\n    </div>\n  );\n};\n\nexport default Toggle;\n"
  },
  {
    "path": "website/src/pages/themes/_config/axis.tsx",
    "content": "import { getBaseLabelsConfig, getBaseStrokeConfig } from \"../_utils\";\nimport { StrokeProps, VictoryComponentType } from \"../_const\";\nimport { ControlConfig } from \".\";\nimport {\n  AxisExamples,\n  PolarAxisExamples,\n  PolarAxisDependentExamples,\n} from \"../_components/examples\";\n\nconst generalAxisOptionsConfig: ControlConfig = {\n  type: \"accordion\",\n  label: \"Base Axis\",\n  content: AxisExamples,\n  controls: [\n    {\n      type: \"section\",\n      label: \"General\",\n      controls: getBaseStrokeConfig(\"axis.style.axis\", [\n        StrokeProps.STROKE,\n        StrokeProps.STROKE_WIDTH,\n        StrokeProps.STROKE_LINE_CAP,\n        StrokeProps.STROKE_LINE_JOIN,\n      ]),\n    },\n    {\n      type: \"section\",\n      label: \"Grid\",\n      controls: getBaseStrokeConfig(\"axis.style.grid\"),\n    },\n    {\n      type: \"section\",\n      label: \"Ticks\",\n      controls: [\n        {\n          type: \"slider\",\n          label: \"Size\",\n          min: 0,\n          max: 50,\n          unit: \"px\",\n          path: \"axis.style.ticks.size\",\n        },\n        ...getBaseStrokeConfig(\"axis.style.ticks\", [\n          StrokeProps.STROKE,\n          StrokeProps.STROKE_WIDTH,\n        ]),\n      ],\n    },\n    {\n      type: \"section\",\n      label: \"Labels\",\n      controls: getBaseLabelsConfig(\"axis.style.axisLabel\"),\n    },\n  ],\n};\n\nconst polarAxisOptionsConfig: ControlConfig = {\n  type: \"accordion\",\n  label: \"Polar Axis\",\n  content: PolarAxisExamples,\n  controls: [\n    {\n      type: \"section\",\n      label: \"General\",\n      controls: getBaseStrokeConfig(\"polarAxis.style.axis\", [\n        StrokeProps.STROKE,\n        StrokeProps.STROKE_WIDTH,\n      ]),\n    },\n    {\n      type: \"section\",\n      label: \"Grid\",\n      controls: getBaseStrokeConfig(\"polarAxis.style.grid\"),\n    },\n    {\n      type: \"section\",\n      label: \"Ticks\",\n      controls: [\n        {\n          type: \"slider\",\n          label: \"Size\",\n          min: 0,\n          max: 50,\n          unit: \"px\",\n          path: \"polarAxis.style.ticks.size\",\n        },\n        ...getBaseStrokeConfig(\"polarAxis.style.ticks\", [\n          StrokeProps.STROKE,\n          StrokeProps.STROKE_WIDTH,\n          StrokeProps.STROKE_LINE_CAP,\n          StrokeProps.STROKE_LINE_JOIN,\n        ]),\n      ],\n    },\n    {\n      type: \"section\",\n      label: \"Labels\",\n      controls: getBaseLabelsConfig(\"polarAxis.style.tickLabels\"),\n    },\n  ],\n};\n\nconst polarDependentAxisOptionsConfig: ControlConfig = {\n  type: \"accordion\",\n  label: \"Polar Dependent Axis\",\n  content: PolarAxisDependentExamples,\n  controls: [\n    {\n      type: \"section\",\n      label: \"General\",\n      controls: getBaseStrokeConfig(\"polarDependentAxis.style.axis\", [\n        StrokeProps.STROKE,\n        StrokeProps.STROKE_WIDTH,\n      ]),\n    },\n    {\n      type: \"section\",\n      label: \"Grid\",\n      controls: getBaseStrokeConfig(\"polarDependentAxis.style.grid\"),\n    },\n    {\n      type: \"section\",\n      label: \"Ticks\",\n      controls: [\n        {\n          type: \"slider\",\n          label: \"Size\",\n          min: 0,\n          max: 50,\n          unit: \"px\",\n          path: \"polarDependentAxis.style.ticks.size\",\n        },\n        ...getBaseStrokeConfig(\"polarDependentAxis.style.ticks\", [\n          StrokeProps.STROKE,\n          StrokeProps.STROKE_WIDTH,\n          StrokeProps.STROKE_LINE_CAP,\n          StrokeProps.STROKE_LINE_JOIN,\n        ]),\n      ],\n    },\n    {\n      type: \"section\",\n      label: \"Labels\",\n      controls: getBaseLabelsConfig(\"polarDependentAxis.style.tickLabels\"),\n    },\n  ],\n};\n\nconst axisOptionsConfig = {\n  title: \"Axis Options\",\n  description: \"Customize the appearance of axes.\",\n  selectLabel: \"Axis Type\",\n  types: {\n    [VictoryComponentType.AXIS]: generalAxisOptionsConfig,\n    [VictoryComponentType.POLAR_AXIS]: polarAxisOptionsConfig,\n    [VictoryComponentType.POLAR_DEPENDENT_AXIS]:\n      polarDependentAxisOptionsConfig,\n  },\n};\n\nexport default axisOptionsConfig;\n"
  },
  {
    "path": "website/src/pages/themes/_config/chart.tsx",
    "content": "import {\n  getBaseLabelsConfig,\n  getBaseStrokeConfig,\n  getNestedColorScaleConfig,\n} from \"../_utils\";\nimport { ControlConfig } from \".\";\nimport { VictoryComponentType, StrokeProps } from \"../_const\";\nimport {\n  AreaExamples,\n  BarExamples,\n  BoxPlotExamples,\n  CandlestickExamples,\n  ErrorBarExamples,\n  GroupExamples,\n  HistogramExamples,\n  LegendExamples,\n  LineExamples,\n  PieExamples,\n  ScatterExamples,\n  StackExamples,\n  VoronoiExamples,\n} from \"../_components/examples\";\n\nconst chartConfigs: {\n  [key: string]: ControlConfig;\n} = {\n  [VictoryComponentType.AREA]: {\n    type: \"section\",\n    label: \"Area Chart\",\n    content: AreaExamples,\n    controls: [\n      {\n        type: \"section\",\n        label: \"Data\",\n        controls: [\n          {\n            type: \"slider\",\n            label: \"Fill Opacity\",\n            min: 0,\n            max: 1,\n            step: 0.1,\n            path: \"area.style.data.fillOpacity\",\n          },\n          ...getBaseStrokeConfig(\"area.style.data\", [\n            StrokeProps.STROKE,\n            StrokeProps.STROKE_WIDTH,\n          ]),\n          {\n            type: \"colorPicker\",\n            label: \"Fill\",\n            path: \"area.style.data.fill\",\n          },\n        ],\n      },\n      {\n        type: \"section\",\n        label: \"Labels\",\n        controls: getBaseLabelsConfig(\"area.style.labels\"),\n      },\n    ],\n  },\n  [VictoryComponentType.BAR]: {\n    type: \"section\",\n    label: \"Bar Chart\",\n    content: BarExamples,\n    controls: [\n      {\n        type: \"section\",\n        label: \"Data\",\n        controls: [\n          {\n            type: \"colorPicker\",\n            label: \"Fill\",\n            path: \"bar.style.data.fill\",\n          },\n          ...getBaseStrokeConfig(\"bar.style.data\", [\n            StrokeProps.STROKE,\n            StrokeProps.STROKE_WIDTH,\n          ]),\n          {\n            type: \"slider\",\n            label: \"Fill Opacity\",\n            min: 0,\n            max: 1,\n            step: 0.1,\n            path: \"bar.style.data.fillOpacity\",\n          },\n          {\n            type: \"slider\",\n            label: \"Top Corner Radius\",\n            path: \"bar.cornerRadius.top\",\n            max: 2,\n            step: 0.5,\n          },\n        ],\n      },\n      {\n        type: \"section\",\n        label: \"Labels\",\n        controls: getBaseLabelsConfig(\"bar.style.labels\"),\n      },\n    ],\n  },\n  [VictoryComponentType.BOX_PLOT]: {\n    type: \"section\",\n    label: \"Box Plot\",\n    content: BoxPlotExamples,\n    controls: [\n      {\n        type: \"section\",\n        label: \"Max\",\n        controls: [\n          ...getBaseStrokeConfig(\"boxplot.style.max\", [\n            StrokeProps.STROKE,\n            StrokeProps.STROKE_WIDTH,\n          ]),\n          ...getBaseLabelsConfig(\"boxplot.style.maxLabels\"),\n        ],\n      },\n      {\n        type: \"section\",\n        label: \"Median\",\n        controls: [\n          ...getBaseStrokeConfig(\"boxplot.style.median\", [\n            StrokeProps.STROKE,\n            StrokeProps.STROKE_WIDTH,\n          ]),\n          ...getBaseLabelsConfig(\"boxplot.style.medianLabels\"),\n        ],\n      },\n      {\n        type: \"section\",\n        label: \"Min\",\n        controls: [\n          ...getBaseStrokeConfig(\"boxplot.style.min\", [\n            StrokeProps.STROKE,\n            StrokeProps.STROKE_WIDTH,\n          ]),\n          ...getBaseLabelsConfig(\"boxplot.style.minLabels\"),\n        ],\n      },\n      {\n        type: \"section\",\n        label: \"Q1\",\n        controls: [\n          {\n            type: \"colorPicker\",\n            label: \"Fill\",\n            path: \"boxplot.style.q1.fill\",\n          },\n          {\n            type: \"slider\",\n            label: \"Border Radius\",\n            min: 0,\n            max: 10,\n            step: 0.5,\n            path: \"boxplot.q1.rx\",\n          },\n          {\n            type: \"slider\",\n            label: \"Stroke Width\",\n            min: 0,\n            max: 5,\n            unit: \"px\",\n            path: \"boxplot.style.q1.strokeWidth\",\n          },\n          ...getBaseLabelsConfig(\"boxplot.style.q1Labels\"),\n        ],\n      },\n      {\n        type: \"section\",\n        label: \"Q3\",\n        controls: [\n          {\n            type: \"colorPicker\",\n            label: \"Fill\",\n            path: \"boxplot.style.q3.fill\",\n          },\n          {\n            type: \"slider\",\n            label: \"Border Radius\",\n            min: 0,\n            max: 10,\n            step: 0.5,\n            path: \"boxplot.q3.rx\",\n          },\n          ...getBaseLabelsConfig(\"boxplot.style.q3Labels\"),\n        ],\n      },\n    ],\n  },\n  [VictoryComponentType.CANDLESTICK]: {\n    type: \"section\",\n    label: \"Candlestick Chart\",\n    content: CandlestickExamples,\n    controls: [\n      {\n        type: \"section\",\n        label: \"Data\",\n        controls: [\n          ...getBaseStrokeConfig(\"candlestick.style.data\", [\n            StrokeProps.STROKE,\n            StrokeProps.STROKE_WIDTH,\n          ]),\n          {\n            type: \"slider\",\n            label: \"Border Radius\",\n            max: 2,\n            step: 0.5,\n            path: \"candlestick.style.data.rx\",\n          },\n          {\n            type: \"slider\",\n            label: \"Wick Width\",\n            min: 0,\n            max: 5,\n            unit: \"px\",\n            path: \"candlestick.wickStrokeWidth\",\n          },\n        ],\n      },\n      {\n        type: \"section\",\n        label: \"Labels\",\n        controls: getBaseLabelsConfig(\"candlestick.style.labels\"),\n      },\n      {\n        type: \"section\",\n        label: \"Colors\",\n        controls: [\n          {\n            type: \"colorPicker\",\n            label: \"Positive Color\",\n            path: \"candlestick.candleColors.positive\",\n          },\n          {\n            type: \"colorPicker\",\n            label: \"Negative Color\",\n            path: \"candlestick.candleColors.negative\",\n          },\n        ],\n      },\n    ],\n  },\n  [VictoryComponentType.ERROR_BAR]: {\n    type: \"section\",\n    label: \"Error Bar\",\n    content: ErrorBarExamples,\n    controls: [\n      {\n        type: \"section\",\n        label: \"Data\",\n        controls: [\n          {\n            type: \"slider\",\n            label: \"Border Width\",\n            min: 0,\n            max: 10,\n            unit: \"px\",\n            path: \"errorbar.borderWidth\",\n          },\n          ...getBaseStrokeConfig(\"errorbar.style.data\", [\n            StrokeProps.STROKE,\n            StrokeProps.STROKE_WIDTH,\n            StrokeProps.STROKE_LINE_CAP,\n          ]),\n        ],\n      },\n      {\n        type: \"section\",\n        label: \"Labels\",\n        controls: getBaseLabelsConfig(\"errorbar.style.labels\"),\n      },\n    ],\n  },\n  [VictoryComponentType.HISTOGRAM]: {\n    type: \"section\",\n    label: \"Histogram\",\n    content: HistogramExamples,\n    controls: [\n      {\n        type: \"section\",\n        label: \"Data\",\n        controls: [\n          {\n            type: \"colorPicker\",\n            label: \"Fill\",\n            path: \"histogram.style.data.fill\",\n          },\n          {\n            type: \"slider\",\n            label: \"Fill Opacity\",\n            min: 0,\n            max: 1,\n            step: 0.1,\n            path: \"histogram.style.data.fillOpacity\",\n          },\n          {\n            type: \"slider\",\n            label: \"Top Corner Radius\",\n            path: \"histogram.cornerRadius.top\",\n            max: 10,\n            step: 0.5,\n          },\n          {\n            type: \"slider\",\n            label: \"Bin Spacing\",\n            min: 0,\n            max: 10,\n            unit: \"px\",\n            path: \"histogram.binSpacing\",\n          },\n        ],\n      },\n      {\n        type: \"section\",\n        label: \"Labels\",\n        controls: getBaseLabelsConfig(\"histogram.style.labels\"),\n      },\n    ],\n  },\n  [VictoryComponentType.GROUP]: {\n    type: \"section\",\n    label: \"Group\",\n    content: GroupExamples,\n    controls: [\n      {\n        type: \"section\",\n        label: \"Data\",\n        controls: [\n          ...getNestedColorScaleConfig(\"group\"),\n          {\n            type: \"slider\",\n            label: \"Width\",\n            min: 0,\n            max: 50,\n            unit: \"px\",\n            path: \"group.style.data.width\",\n          },\n        ],\n      },\n    ],\n  },\n  [VictoryComponentType.LEGEND]: {\n    type: \"section\",\n    label: \"Legend\",\n    content: LegendExamples,\n    controls: [\n      {\n        type: \"section\",\n        label: \"General\",\n        controls: [\n          {\n            type: \"slider\",\n            label: \"Gutter\",\n            min: 0,\n            max: 50,\n            unit: \"px\",\n            path: \"legend.gutter\",\n          },\n          {\n            type: \"slider\",\n            label: \"Border Padding\",\n            min: 0,\n            max: 50,\n            unit: \"px\",\n            path: \"legend.borderPadding\",\n          },\n          {\n            type: \"select\",\n            label: \"Orientation\",\n            options: [\n              { label: \"Horizontal\", value: \"horizontal\" },\n              { label: \"Vertical\", value: \"vertical\" },\n            ],\n            path: \"legend.orientation\",\n          },\n          {\n            type: \"select\",\n            label: \"Title Orientation\",\n            options: [\n              { label: \"Top\", value: \"top\" },\n              { label: \"Bottom\", value: \"bottom\" },\n              { label: \"Left\", value: \"left\" },\n              { label: \"Right\", value: \"right\" },\n            ],\n            path: \"legend.titleOrientation\",\n          },\n          {\n            type: \"select\",\n            label: \"Data Type\",\n            options: [\n              { label: \"Circle\", value: \"circle\" },\n              { label: \"Square\", value: \"square\" },\n              { label: \"Diamond\", value: \"diamond\" },\n              { label: \"Star\", value: \"star\" },\n            ],\n            path: \"legend.style.data.type\",\n          },\n        ],\n      },\n      {\n        type: \"section\",\n        label: \"Labels\",\n        controls: getBaseLabelsConfig(\"legend.style.labels\"),\n      },\n      {\n        type: \"section\",\n        label: \"Title\",\n        controls: getBaseLabelsConfig(\"legend.style.title\"),\n      },\n      {\n        type: \"section\",\n        label: \"Border\",\n        controls: getBaseStrokeConfig(\"legend.style.border\", [\n          StrokeProps.STROKE,\n          StrokeProps.STROKE_WIDTH,\n        ]),\n      },\n    ],\n  },\n  [VictoryComponentType.LINE]: {\n    type: \"section\",\n    label: \"Line Chart\",\n    content: LineExamples,\n    controls: [\n      {\n        type: \"section\",\n        label: \"Data\",\n        controls: getBaseStrokeConfig(\"line.style.data\", [\n          StrokeProps.STROKE,\n          StrokeProps.STROKE_WIDTH,\n          StrokeProps.STROKE_LINE_CAP,\n          StrokeProps.STROKE_LINE_JOIN,\n        ]),\n      },\n      {\n        type: \"section\",\n        label: \"Labels\",\n        controls: getBaseLabelsConfig(\"line.style.labels\"),\n      },\n    ],\n  },\n  [VictoryComponentType.PIE]: {\n    type: \"section\",\n    label: \"Pie Chart\",\n    content: PieExamples,\n    controls: [\n      {\n        type: \"section\",\n        label: \"Data\",\n        controls: [\n          ...getNestedColorScaleConfig(\"pie\"),\n          {\n            type: \"slider\",\n            label: \"Padding\",\n            min: 0,\n            max: 50,\n            unit: \"px\",\n            path: \"pie.style.data.padding\",\n          },\n          ...getBaseStrokeConfig(\"pie.style.data\", [\n            StrokeProps.STROKE,\n            StrokeProps.STROKE_WIDTH,\n          ]),\n        ],\n      },\n      {\n        type: \"section\",\n        label: \"Labels\",\n        controls: getBaseLabelsConfig(\"pie.style.labels\"),\n      },\n    ],\n  },\n  [VictoryComponentType.SCATTER]: {\n    type: \"section\",\n    label: \"Scatter Chart\",\n    content: ScatterExamples,\n    controls: [\n      {\n        type: \"section\",\n        label: \"Data\",\n        controls: [\n          {\n            type: \"colorPicker\",\n            label: \"Fill\",\n            path: \"scatter.style.data.fill\",\n          },\n          {\n            type: \"slider\",\n            label: \"Opacity\",\n            min: 0,\n            max: 1,\n            step: 0.1,\n            path: \"scatter.style.data.opacity\",\n          },\n          ...getBaseStrokeConfig(\"scatter.style.data\", [\n            StrokeProps.STROKE,\n            StrokeProps.STROKE_WIDTH,\n          ]),\n        ],\n      },\n      {\n        type: \"section\",\n        label: \"Labels\",\n        controls: getBaseLabelsConfig(\"scatter.style.labels\"),\n      },\n    ],\n  },\n  [VictoryComponentType.STACK]: {\n    type: \"section\",\n    label: \"Stack\",\n    content: StackExamples,\n    controls: [\n      {\n        type: \"section\",\n        label: \"Data\",\n        controls: [\n          ...getNestedColorScaleConfig(\"stack\"),\n          {\n            type: \"slider\",\n            label: \"Width\",\n            min: 0,\n            max: 50,\n            unit: \"px\",\n            path: \"stack.style.data.width\",\n          },\n        ],\n      },\n    ],\n  },\n  [VictoryComponentType.TOOLTIP]: {\n    type: \"section\",\n    label: \"Tooltip\",\n    controls: [\n      {\n        type: \"section\",\n        label: \"General\",\n        controls: [\n          ...getBaseLabelsConfig(\"tooltip.style\"),\n          {\n            type: \"slider\",\n            label: \"Corner Radius\",\n            min: 0,\n            max: 10,\n            path: \"tooltip.cornerRadius\",\n          },\n          {\n            type: \"slider\",\n            label: \"Pointer Length\",\n            min: 0,\n            max: 20,\n            path: \"tooltip.pointerLength\",\n          },\n        ],\n      },\n      {\n        type: \"section\",\n        label: \"Flyout\",\n        controls: [\n          {\n            type: \"colorPicker\",\n            label: \"Fill\",\n            path: \"tooltip.flyoutStyle.fill\",\n          },\n          ...getBaseStrokeConfig(\"tooltip.flyoutStyle\", [\n            StrokeProps.STROKE,\n            StrokeProps.STROKE_WIDTH,\n          ]),\n          {\n            type: \"select\",\n            label: \"Pointer Events\",\n            options: [\n              { label: \"None\", value: \"none\" },\n              { label: \"All\", value: \"all\" },\n            ],\n            path: \"tooltip.flyoutStyle.pointerEvents\",\n          },\n        ],\n      },\n    ],\n  },\n  [VictoryComponentType.VORONOI]: {\n    type: \"section\",\n    label: \"Voronoi\",\n    content: VoronoiExamples,\n    controls: [\n      {\n        type: \"section\",\n        label: \"General\",\n        controls: [\n          {\n            type: \"colorPicker\",\n            label: \"Fill\",\n            path: \"voronoi.style.data.fill\",\n          },\n          ...getBaseStrokeConfig(\"voronoi.style.data\", [\n            StrokeProps.STROKE,\n            StrokeProps.STROKE_WIDTH,\n          ]),\n        ],\n      },\n      {\n        type: \"section\",\n        label: \"Labels\",\n        controls: getBaseLabelsConfig(\"voronoi.style.labels\"),\n      },\n    ],\n  },\n};\n\nconst chartOptionsConfig = {\n  title: \"Chart Options\",\n  description: \"Customize the appearance of individual charts.\",\n  selectLabel: \"Chart Type\",\n  types: chartConfigs,\n};\n\nexport default chartOptionsConfig;\n"
  },
  {
    "path": "website/src/pages/themes/_config/global.tsx",
    "content": "import { OptionsPanelConfig } from \".\";\nimport { getBaseLabelsConfig, getBaseStrokeConfig } from \"../_utils\";\n\nconst globalOptionsConfig: OptionsPanelConfig = {\n  title: \"Global Options\",\n  description: \"Customize the appearance of all charts.\",\n  controls: [\n    {\n      type: \"section\",\n      label: \"Chart Size\",\n      controls: [\n        {\n          type: \"slider\",\n          label: \"Width\",\n          min: 150,\n          max: 500,\n          unit: \"px\",\n          path: [\n            \"chart.width\",\n            \"axis.width\",\n            \"area.width\",\n            \"bar.width\",\n            \"boxplot.width\",\n            \"candlestick.width\",\n            \"errorbar.width\",\n            \"group.width\",\n            \"histogram.width\",\n            \"line.width\",\n            \"pie.width\",\n            \"scatter.width\",\n            \"stack.width\",\n            \"voronoi.width\",\n          ],\n        },\n        {\n          type: \"slider\",\n          label: \"Height\",\n          min: 150,\n          max: 500,\n          unit: \"px\",\n          path: [\n            \"chart.height\",\n            \"axis.height\",\n            \"area.height\",\n            \"bar.height\",\n            \"boxplot.height\",\n            \"candlestick.height\",\n            \"errorbar.height\",\n            \"group.height\",\n            \"histogram.height\",\n            \"line.height\",\n            \"pie.height\",\n            \"scatter.height\",\n            \"stack.height\",\n            \"voronoi.height\",\n          ],\n        },\n        {\n          type: \"slider\",\n          label: \"Padding\",\n          min: 0,\n          max: 100,\n          unit: \"px\",\n          path: [\n            \"chart.padding\",\n            \"axis.padding\",\n            \"area.padding\",\n            \"bar.padding\",\n            \"boxplot.padding\",\n            \"candlestick.padding\",\n            \"errorbar.padding\",\n            \"group.padding\",\n            \"histogram.padding\",\n            \"line.padding\",\n            \"pie.padding\",\n            \"scatter.padding\",\n            \"stack.padding\",\n            \"voronoi.padding\",\n          ],\n        },\n      ],\n    },\n    {\n      type: \"section\",\n      label: \"Labels\",\n      controls: getBaseLabelsConfig([\n        \"axis.style.axisLabel\",\n        \"polarAxis.style.tickLabels\",\n        \"polarDependentAxis.style.tickLabels\",\n        \"tooltip.style\",\n        \"area.style.labels\",\n        \"bar.style.labels\",\n        \"candlestick.style.labels\",\n        \"errorbar.style.labels\",\n        \"histogram.style.labels\",\n        \"legend.style.labels\",\n        \"line.style.labels\",\n        \"pie.style.labels\",\n        \"scatter.style.labels\",\n        \"voronoi.style.labels\",\n        \"boxplot.style.maxLabels\",\n        \"boxplot.style.medianLabels\",\n        \"boxplot.style.minLabels\",\n        \"boxplot.style.q1Labels\",\n        \"boxplot.style.q3Labels\",\n      ]),\n    },\n    {\n      type: \"section\",\n      label: \"Data\",\n      controls: getBaseStrokeConfig([\n        \"area.style.data\",\n        \"bar.style.data\",\n        \"candlestick.style.data\",\n        \"errorbar.style.data\",\n        \"histogram.style.data\",\n        \"line.style.data\",\n        \"pie.style.data\",\n        \"scatter.style.data\",\n        \"voronoi.style.data\",\n      ]),\n    },\n  ],\n};\n\nexport default globalOptionsConfig;\n"
  },
  {
    "path": "website/src/pages/themes/_config/index.tsx",
    "content": "import { ExampleConfig } from \"../_components/examples\";\n\nexport type ControlConfig = {\n  label: string;\n  content?: ExampleConfig[];\n  controls?: ControlConfig[];\n} & (\n  | {\n      type: \"accordion\" | \"colorScalePreview\";\n    }\n  | {\n      type: \"section\";\n      description?: string;\n    }\n  | {\n      type: \"colorPalette\";\n      value: string;\n      path: string | string[];\n    }\n  | {\n      type: \"colorScale\";\n      path: string | string[];\n      showDefaultToggle?: boolean;\n    }\n  | {\n      type: \"slider\";\n      path: string | string[];\n      min?: number;\n      max?: number;\n      step?: number;\n      unit?: string;\n      default?: number;\n    }\n  | {\n      type: \"select\" | \"colorPicker\";\n      path: string | string[];\n      options?: { label: string; value: string }[];\n    }\n  | {\n      type: \"colorPicker\";\n      path: string | string[];\n    }\n);\n\nexport type OptionsPanelConfig = {\n  title: string;\n  description?: string;\n  hasVictoryChart?: boolean;\n  controls: ControlConfig[];\n};\n\nexport type ChartPanelConfig = {\n  title: string;\n  description?: string;\n  selectLabel: string;\n  types: Record<string, ControlConfig>;\n};\n\nexport { default as paletteOptionsConfig } from \"./palette\";\nexport { default as globalOptionsConfig } from \"./global\";\nexport { default as axisOptionsConfig } from \"./axis\";\nexport { default as chartOptionsConfig } from \"./chart\";\n"
  },
  {
    "path": "website/src/pages/themes/_config/palette.tsx",
    "content": "import { OptionsPanelConfig } from \".\";\nimport { colorScaleOptions } from \"../_const\";\nimport { getNestedColorScaleConfig } from \"../_utils\";\n\nconst paletteOptionsConfig: OptionsPanelConfig = {\n  title: \"Color Palette\",\n  description: \"Customize your theme's color palettes.\",\n  controls: [\n    {\n      type: \"section\",\n      label: \"Defaults\",\n      description:\n        \"Set the default color scale for each of the following Victory components.\",\n      controls: [\n        {\n          type: \"accordion\",\n          label: \"VictoryStack\",\n          controls: getNestedColorScaleConfig(\"stack\"),\n        },\n        {\n          type: \"accordion\",\n          label: \"VictoryGroup\",\n          controls: getNestedColorScaleConfig(\"group\"),\n        },\n        {\n          type: \"accordion\",\n          label: \"VictoryPie\",\n          controls: getNestedColorScaleConfig(\"pie\"),\n        },\n      ],\n    },\n    {\n      type: \"section\",\n      label: \"Color Scales\",\n      description: \"Customize the theme's predefined color scale palettes.\",\n      controls: colorScaleOptions.map((option) => ({\n        type: \"colorPalette\",\n        label: option.label,\n        value: option.value,\n        path: `palette.${option.value}`,\n      })),\n    },\n  ],\n};\n\nexport default paletteOptionsConfig;\n"
  },
  {
    "path": "website/src/pages/themes/_const.tsx",
    "content": "export const NUM_STACKS = 5;\n\nexport const sampleStackData = [\n  {\n    x: 1,\n    y: 2,\n  },\n  {\n    x: 2,\n    y: 3,\n  },\n  {\n    x: 3,\n    y: 5,\n  },\n  {\n    x: 4,\n    y: 4,\n  },\n  {\n    x: 5,\n    y: 7,\n  },\n];\n\nexport const colorScaleOptions = [\n  {\n    label: \"Qualitative\",\n    value: \"qualitative\",\n  },\n  {\n    label: \"Grayscale\",\n    value: \"grayscale\",\n  },\n  {\n    label: \"Heatmap\",\n    value: \"heatmap\",\n  },\n  {\n    label: \"Warm\",\n    value: \"warm\",\n  },\n  {\n    label: \"Cool\",\n    value: \"cool\",\n  },\n  {\n    label: \"Red\",\n    value: \"red\",\n  },\n  {\n    label: \"Green\",\n    value: \"green\",\n  },\n  {\n    label: \"Blue\",\n    value: \"blue\",\n  },\n];\n\nexport enum StrokeProps {\n  STROKE = \"Stroke\",\n  STROKE_WIDTH = \"Stroke Width\",\n  STROKE_DASH_ARRAY = \"Stroke Dash Array\",\n  STROKE_LINE_CAP = \"Stroke Line Cap\",\n  STROKE_LINE_JOIN = \"Stroke Line Join\",\n}\n\nexport enum VictoryComponentType {\n  AREA = \"area\",\n  AXIS = \"axis\",\n  BAR = \"bar\",\n  BOX_PLOT = \"boxPlot\",\n  CANDLESTICK = \"candlestick\",\n  ERROR_BAR = \"errorBar\",\n  HISTOGRAM = \"histogram\",\n  GROUP = \"group\",\n  LEGEND = \"legend\",\n  LINE = \"line\",\n  PIE = \"pie\",\n  POLAR_AXIS = \"polarAxis\",\n  POLAR_DEPENDENT_AXIS = \"polarDependentAxis\",\n  SCATTER = \"scatter\",\n  STACK = \"stack\",\n  TOOLTIP = \"tooltip\",\n  VORONOI = \"voronoi\",\n}\n"
  },
  {
    "path": "website/src/pages/themes/_icons/axis-options-icon.tsx",
    "content": "import React from \"react\";\n\nconst AxisOptionsIcon = ({ className, ...props }) => {\n  return (\n    <svg\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      className={className}\n      {...props}\n    >\n      <path\n        d=\"M3.75 3.75C3.75 2.98945 3.13555 2.375 2.375 2.375C1.61445 2.375 1 2.98945 1 3.75V18.1875C1 20.0867 2.53828 21.625 4.4375 21.625H21.625C22.3855 21.625 23 21.0105 23 20.25C23 19.4895 22.3855 18.875 21.625 18.875H4.4375C4.05938 18.875 3.75 18.5656 3.75 18.1875V3.75Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M20.6207 7.34081C21.0752 7.79523 21.0752 8.53321 20.6207 8.98763L20.6244 8.99126L15.9711 13.6445C15.5167 14.0989 14.7787 14.0989 14.3243 13.6445L12.2376 11.5578L8.98763 14.8042C8.53321 15.2586 7.79523 15.2586 7.34081 14.8042C6.8864 14.3498 6.8864 13.6118 7.34081 13.1574L11.4124 9.08578C11.8668 8.63136 12.6048 8.63136 13.0592 9.08578L15.1459 11.1725L18.9739 7.34081C19.4283 6.8864 20.1663 6.8864 20.6207 7.34081Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n};\nexport default AxisOptionsIcon;\n"
  },
  {
    "path": "website/src/pages/themes/_icons/chart-options-icon.tsx",
    "content": "import React from \"react\";\n\nconst ChartOptionsIcon = ({ className, ...props }) => (\n  <svg\n    viewBox=\"0 0 24 24\"\n    fill=\"none\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    className={className}\n    {...props}\n  >\n    <g clipPath=\"url(#clip0_398_1136)\">\n      <path\n        d=\"M8.66656 17.5556H6.44434V10.7778C6.44434 10.2255 6.89205 9.77778 7.44434 9.77778H7.66656C8.21884 9.77778 8.66656 10.2255 8.66656 10.7778V17.5556ZM13.111 17.5556H10.8888V7.44444C10.8888 6.89216 11.3365 6.44444 11.8888 6.44444H12.111C12.6633 6.44444 13.111 6.89216 13.111 7.44444V17.5556ZM17.5554 17.5556H15.3332V14.1111C15.3332 13.5588 15.7809 13.1111 16.3332 13.1111H16.5554C17.1077 13.1111 17.5554 13.5588 17.5554 14.1111V17.5556ZM20.3332 19.8889H3.66656V4.22222H20.3332V19.8889ZM20.3332 2H3.66656C2.44434 2 1.44434 3 1.44434 4.22222V19.7778C1.44434 21 2.44434 22 3.66656 22H20.3332C21.5554 22 22.5554 21 22.5554 19.7778V4.22222C22.5554 3 21.5554 2 20.3332 2Z\"\n        fill=\"currentColor\"\n      />\n    </g>\n    <defs>\n      <clipPath id=\"clip0_398_1136\">\n        <rect width=\"24\" height=\"24\" fill=\"white\" />\n      </clipPath>\n    </defs>\n  </svg>\n);\n\nexport default ChartOptionsIcon;\n"
  },
  {
    "path": "website/src/pages/themes/_icons/export-icon.tsx",
    "content": "import React from \"react\";\n\nconst ExportIcon = ({ className, ...props }) => {\n  return (\n    <svg\n      viewBox=\"0 0 20 21\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      className={className}\n      {...props}\n    >\n      <path\n        d=\"M8.3335 5.61003H5.00016C4.55814 5.61003 4.13421 5.78562 3.82165 6.09818C3.50909 6.41074 3.3335 6.83467 3.3335 7.27669V15.61C3.3335 16.0521 3.50909 16.476 3.82165 16.7885C4.13421 17.1011 4.55814 17.2767 5.00016 17.2767H13.3335C13.7755 17.2767 14.1994 17.1011 14.512 16.7885C14.8246 16.476 15.0002 16.0521 15.0002 15.61V12.2767M11.6668 3.94336H16.6668M16.6668 3.94336V8.94336M16.6668 3.94336L8.3335 12.2767\"\n        stroke=\"currentColor\"\n        strokeWidth=\"2\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </svg>\n  );\n};\nexport default ExportIcon;\n"
  },
  {
    "path": "website/src/pages/themes/_icons/index.tsx",
    "content": "export { default as ChartOptionsIcon } from \"./chart-options-icon\";\nexport { default as AxisOptionsIcon } from \"./axis-options-icon\";\nexport { default as ExportIcon } from \"./export-icon\";\n"
  },
  {
    "path": "website/src/pages/themes/_providers/alertProvider.tsx",
    "content": "import React from \"react\";\nimport { createContext, useContext, useState } from \"react\";\nimport Alert, { AlertProps } from \"../_components/alert\";\n\ntype AlertContextType = {\n  addAlert: (args: Omit<AlertProps, \"id\">) => void;\n};\n\nconst AlertContext = createContext<AlertContextType | undefined>(undefined);\n\nexport const AlertProvider = ({ children }) => {\n  const [alerts, setAlerts] = useState<AlertProps[]>([]);\n\n  const addAlert = (alertProps: Omit<AlertProps, \"id\">) => {\n    const id = crypto.randomUUID();\n    setAlerts((prev) => [...prev, { ...alertProps, id }]);\n  };\n\n  const removeAlert = (id) => {\n    setAlerts((prev) => prev.filter((alert) => alert.id !== id));\n  };\n\n  return (\n    <AlertContext.Provider value={{ addAlert }}>\n      {children}\n      <div className=\"fixed bottom-4 right-4 space-y-4 z-50\">\n        {alerts.map(({ id, type, title, message, duration }) => (\n          <Alert\n            key={id}\n            type={type}\n            title={title}\n            message={message}\n            duration={duration}\n            onClose={() => removeAlert(id)}\n          />\n        ))}\n      </div>\n    </AlertContext.Provider>\n  );\n};\n\nexport const useAlert = () => {\n  const context = useContext(AlertContext);\n  if (!context) {\n    throw new Error(\"useAlert must be used within a AlertProvider\");\n  }\n  return context;\n};\n"
  },
  {
    "path": "website/src/pages/themes/_providers/previewOptionsProvider.tsx",
    "content": "import React, { createContext, useContext } from \"react\";\nimport { AllExamples, ExampleConfig } from \"../_components/examples\";\nimport { VictoryComponentType } from \"../_const\";\n\ntype PreviewOptionsContextType = {\n  colorScale?: string;\n  updateColorScale: (newColorScale?: string) => void;\n  showTooltips: boolean;\n  setShowTooltips: React.Dispatch<React.SetStateAction<boolean>>;\n  resetPreviewOptions: () => void;\n  exampleContent: ExampleConfig[];\n  setExampleContent: React.Dispatch<React.SetStateAction<ExampleConfig[]>>;\n  activeChartType: VictoryComponentType | null;\n  setActiveChartType: React.Dispatch<\n    React.SetStateAction<VictoryComponentType | null>\n  >;\n};\n\nexport const defaultColorScale = undefined;\nexport const defaultShowTooltips = false;\n\nconst PreviewOptionsContext = createContext<\n  PreviewOptionsContextType | undefined\n>(undefined);\n\nexport const PreviewOptionsProvider = ({ children }) => {\n  const [colorScale, setColorScale] = React.useState<string | undefined>(\n    defaultColorScale,\n  );\n  const [showTooltips, setShowTooltips] = React.useState(defaultShowTooltips);\n  const [activeChartType, setActiveChartType] =\n    React.useState<VictoryComponentType | null>(null);\n  const [exampleContent, setExampleContent] = React.useState(AllExamples);\n\n  const updateColorScale = (newColorScale?: string) => {\n    const updatedColorScale = !newColorScale ? undefined : newColorScale;\n    setColorScale(updatedColorScale);\n  };\n\n  const resetPreviewOptions = () => {\n    setColorScale(defaultColorScale);\n    setShowTooltips(defaultShowTooltips);\n  };\n\n  return (\n    <PreviewOptionsContext.Provider\n      value={{\n        colorScale,\n        updateColorScale,\n        showTooltips,\n        setShowTooltips,\n        resetPreviewOptions,\n        exampleContent,\n        setExampleContent,\n        activeChartType,\n        setActiveChartType,\n      }}\n    >\n      {children}\n    </PreviewOptionsContext.Provider>\n  );\n};\n\nexport const usePreviewOptions = () => {\n  const context = useContext(PreviewOptionsContext);\n  if (context === undefined) {\n    throw new Error(\n      \"usePreviewOptions must be used within a PreviewOptionsProvider\",\n    );\n  }\n  return context;\n};\n"
  },
  {
    "path": "website/src/pages/themes/_providers/sideNavProvider.tsx",
    "content": "import { NAV_ITEMS, NavItem } from \"../_components/sidenav\";\nimport React, { createContext, useContext, useState } from \"react\";\n\ntype SideNavContextType = {\n  activeSideNavItem: NavItem;\n  setActiveSideNavItem: (navItem: NavItem) => void;\n};\n\nconst SideNavContext = createContext<SideNavContextType | undefined>(undefined);\n\nexport const SideNavProvider = ({ children }) => {\n  const [activeSideNavItem, setActiveSideNavItem] = useState(NAV_ITEMS[0]);\n\n  return (\n    <SideNavContext.Provider\n      value={{\n        activeSideNavItem,\n        setActiveSideNavItem,\n      }}\n    >\n      {children}\n    </SideNavContext.Provider>\n  );\n};\n\nexport const useSideNavContext = () => {\n  const context = useContext(SideNavContext);\n  if (context === undefined) {\n    throw new Error(\"useSideNavContext must be used within a SideNavProvider\");\n  }\n  return context;\n};\n"
  },
  {
    "path": "website/src/pages/themes/_providers/themeProvider.tsx",
    "content": "import React, { createContext, useCallback, useContext } from \"react\";\nimport { VictoryTheme, VictoryThemeDefinition } from \"victory\";\nimport { setNestedConfigValue } from \"../_utils\";\nimport { useLocalStorage } from \"@site/src/hooks/useLocalStorage\";\n\nexport type ThemeOption = {\n  name: string;\n  config: VictoryThemeDefinition;\n};\n\ntype ThemeContextType = {\n  baseTheme: ThemeOption | undefined;\n  onBaseThemeSelect: (\n    themeName?: string,\n    config?: VictoryThemeDefinition,\n  ) => void;\n  customThemeConfig: VictoryThemeDefinition | undefined;\n  updateCustomThemeConfig: (path: string | string[], newValue: unknown) => void;\n};\n\nconst CUSTOM_THEME_CONFIG: VictoryThemeDefinition = {\n  candlestick: {\n    style: {\n      labels: {\n        padding: 5,\n      },\n    },\n  },\n  errorbar: {\n    borderWidth: 8,\n  },\n};\n\nexport const CUSTOM_THEME = {\n  name: \"Custom\",\n  config: CUSTOM_THEME_CONFIG,\n};\n\nexport const themes: ThemeOption[] = [\n  { name: \"Clean\", config: VictoryTheme.clean },\n  { name: \"Material\", config: VictoryTheme.material },\n  { name: \"Grayscale\", config: VictoryTheme.grayscale },\n  CUSTOM_THEME,\n];\n\nconst defaultTheme = themes[0];\n\nconst localStorageCustomConfigKey = \"customThemeConfig\";\nconst localStorageBaseThemeKey = \"baseTheme\";\n\nconst ThemeContext = createContext<ThemeContextType | undefined>(undefined);\n\nexport const ThemeProvider = ({ children }) => {\n  const [baseTheme, setBaseTheme] = useLocalStorage(\n    localStorageBaseThemeKey,\n    defaultTheme,\n  );\n  const [customThemeConfig, setCustomThemeConfig] = useLocalStorage(\n    localStorageCustomConfigKey,\n    defaultTheme.config,\n  );\n\n  const onBaseThemeSelect = useCallback(\n    (themeName?: string, config?: VictoryThemeDefinition) => {\n      const theme = themes.find((t) => t.name === themeName);\n      if (!theme) {\n        setBaseTheme(defaultTheme);\n        setCustomThemeConfig(defaultTheme.config);\n      } else {\n        setBaseTheme(theme);\n        setCustomThemeConfig({\n          ...CUSTOM_THEME_CONFIG,\n          ...(config ?? theme?.config),\n        });\n      }\n    },\n    [setBaseTheme, setCustomThemeConfig],\n  );\n\n  const updateCustomThemeConfig = useCallback(\n    (path: string | string[], newValue: unknown) => {\n      if (!customThemeConfig) return;\n      const updatedConfig = setNestedConfigValue(\n        customThemeConfig,\n        path,\n        newValue,\n      );\n      if (baseTheme.name !== CUSTOM_THEME.name) {\n        setBaseTheme(CUSTOM_THEME);\n      }\n      setCustomThemeConfig(updatedConfig);\n    },\n    [customThemeConfig, setBaseTheme, setCustomThemeConfig, baseTheme],\n  );\n\n  return (\n    <ThemeContext.Provider\n      value={{\n        baseTheme,\n        onBaseThemeSelect,\n        customThemeConfig,\n        updateCustomThemeConfig,\n      }}\n    >\n      {children}\n    </ThemeContext.Provider>\n  );\n};\n\nexport const useTheme = () => {\n  const context = useContext(ThemeContext);\n  if (!context) {\n    throw new Error(\"useTheme must be used within a ThemeProvider\");\n  }\n  return context;\n};\n"
  },
  {
    "path": "website/src/pages/themes/_utils.ts",
    "content": "import { VictoryThemeDefinition } from \"victory-core\";\nimport { ControlConfig } from \"./_config\";\nimport { StrokeProps } from \"./_const\";\n\nexport const setNestedConfigValue = (\n  config: VictoryThemeDefinition,\n  paths: string | string[],\n  value: unknown,\n) => {\n  const updatedConfig = { ...config };\n  const pathsArray = Array.isArray(paths) ? paths : [paths];\n\n  pathsArray.forEach((path) => {\n    const pathArray = path.split(\".\");\n    pathArray.reduce((acc, key, i) => {\n      if (i === pathArray.length - 1) {\n        acc[key] = value;\n      } else {\n        acc[key] = { ...acc[key] };\n      }\n      return acc[key];\n    }, updatedConfig);\n  });\n\n  return updatedConfig;\n};\n\nexport const getConfigValue = (\n  config: VictoryThemeDefinition,\n  path: string | string[],\n) => {\n  const pathString = Array.isArray(path) ? path[0] : path;\n  if (!pathString) return undefined;\n  const pathArray = pathString.split(\".\");\n  return pathArray.reduce((acc, key) => {\n    return acc?.[key];\n  }, config);\n};\n\n// Config helpers\nexport const getPath = (basePath: string | string[], key: string) => {\n  if (Array.isArray(basePath)) {\n    return basePath.map((p) => `${p}.${key}`);\n  }\n  return `${basePath}.${key}`;\n};\n\nexport const getNestedColorScaleConfig = (\n  basePath: string | string[],\n): ControlConfig[] => [\n  {\n    type: \"colorScale\",\n    label: \"Color Scale\",\n    path: getPath(basePath, \"colorScale\"),\n  },\n];\n\nexport const getBaseStrokeConfig = (\n  basePath: string | string[],\n  includedStrokeProps: StrokeProps[] = [],\n): ControlConfig[] => {\n  const config = [\n    {\n      type: \"colorPicker\",\n      label: StrokeProps.STROKE,\n      path: getPath(basePath, \"stroke\"),\n    },\n    {\n      type: \"slider\",\n      label: StrokeProps.STROKE_WIDTH,\n      min: 0,\n      max: 5,\n      unit: \"px\",\n      path: getPath(basePath, \"strokeWidth\"),\n      default: 1,\n    },\n    {\n      type: \"select\",\n      label: StrokeProps.STROKE_DASH_ARRAY,\n      path: getPath(basePath, \"strokeDasharray\"),\n      options: [\n        { label: \"Solid\", value: \"0\" },\n        { label: \"Dashed\", value: \"4, 4\" },\n        { label: \"Dotted\", value: \"1, 1\" },\n        { label: \"Long Dash\", value: \"10, 5\" },\n      ],\n    },\n    {\n      type: \"select\",\n      label: StrokeProps.STROKE_LINE_CAP,\n      options: [\n        { label: \"Round\", value: \"round\" },\n        { label: \"Square\", value: \"square\" },\n        { label: \"Butt\", value: \"butt\" },\n      ],\n      path: getPath(basePath, \"strokeLinecap\"),\n    },\n    {\n      type: \"select\",\n      label: StrokeProps.STROKE_LINE_JOIN,\n      options: [\n        { label: \"Round\", value: \"round\" },\n        { label: \"Bevel\", value: \"bevel\" },\n        { label: \"Miter\", value: \"miter\" },\n      ],\n      path: getPath(basePath, \"strokeLinejoin\"),\n    },\n  ] as ControlConfig[];\n  return includedStrokeProps.length\n    ? config.filter((field) =>\n        includedStrokeProps.includes(field.label as StrokeProps),\n      )\n    : config;\n};\n\nexport const getBaseLabelsConfig = (\n  basePath: string | string[],\n): ControlConfig[] => [\n  {\n    type: \"slider\",\n    label: \"Font Size\",\n    min: 10,\n    max: 24,\n    unit: \"px\",\n    path: getPath(basePath, \"fontSize\"),\n  },\n  {\n    type: \"slider\",\n    label: \"Text Padding\",\n    min: 0,\n    max: 50,\n    unit: \"px\",\n    path: getPath(basePath, \"padding\"),\n  },\n  {\n    type: \"colorPicker\",\n    label: \"Font Color\",\n    path: getPath(basePath, \"fill\"),\n  },\n];\n\nexport const stringifyWithoutQuotes = (config: unknown) => {\n  return JSON.stringify(config, null, 2).replace(/\"([^\"]+)\":/g, \"$1:\");\n};\n"
  },
  {
    "path": "website/src/pages/themes/index.tsx",
    "content": "import React from \"react\";\n\nimport \"../../css/custom.css\";\n\nimport Layout from \"@theme/Layout\";\nimport SideNav from \"./_components/sidenav\";\nimport { ThemeProvider } from \"./_providers/themeProvider\";\nimport { PreviewOptionsProvider } from \"./_providers/previewOptionsProvider\";\nimport { SideNavProvider } from \"./_providers/sideNavProvider\";\nimport Main from \"./_components/main\";\nimport { AlertProvider } from \"./_providers/alertProvider\";\n\nconst ThemeBuilder = () => {\n  return (\n    <Layout>\n      <ThemeProvider>\n        <PreviewOptionsProvider>\n          <AlertProvider>\n            <SideNavProvider>\n              <div className=\"relative flex flex-row items-start justify-start w-full theme-builder font-sans text-gray-700\">\n                <SideNav />\n                <Main />\n              </div>\n            </SideNavProvider>\n          </AlertProvider>\n        </PreviewOptionsProvider>\n      </ThemeProvider>\n    </Layout>\n  );\n};\n\nexport default ThemeBuilder;\n"
  },
  {
    "path": "website/src/plugins/victory-typedoc/components/api-property.tsx",
    "content": "import React from \"react\";\n\ntype ApiPropertyProps = {\n  defaultValue?: string;\n  required?: boolean;\n  tsType: string;\n};\n\nexport function ApiProperty(props: ApiPropertyProps) {\n  const { defaultValue, required, tsType } = props;\n  return (\n    <>\n      <div className=\"flex flex-row gap-2 mb-4 align-middle font-mono\">\n        {required && (\n          <span className=\"inline-flex items-center rounded-md bg-red-50 px-2 py-1 text-xs font-medium text-red-700 ring-1 ring-inset ring-red-600/10\">\n            required\n          </span>\n        )}\n        {defaultValue && (\n          <span className=\"inline-flex items-center rounded-md bg-green-50 px-2 py-1 text-xs font-medium text-green-700 ring-1 ring-inset ring-green-600/20\">\n            default: {defaultValue}\n          </span>\n        )}\n        <span className=\"inline-flex items-center rounded-md bg-blue-50 px-2 py-1 text-xs font-medium text-blue-700 ring-1 ring-inset ring-blue-700/10\">\n          type: {tsType}\n        </span>\n      </div>\n    </>\n  );\n}\n"
  },
  {
    "path": "website/src/plugins/victory-typedoc/index.ts",
    "content": "import yaml from \"js-yaml\";\nimport { visit } from \"unist-util-visit\";\nimport fs from \"fs\";\n\nimport {\n  extractExamples,\n  buildComponentAst,\n  buildEsmImportAst,\n  buildPropertyAst,\n} from \"./mdast\";\nimport { getTypeInfo } from \"./typedoc\";\n\nexport function autoGenerateApiDocs() {\n  async function transform(root) {\n    const typeInfo = await getTypeInfo();\n\n    visit(root, \"yaml\", (yamlNode) => {\n      const frontmatter = yaml.load(yamlNode.value);\n      if (frontmatter?.auto_generated) {\n        // debug\n        // fs.writeFileSync(\"./merp_start.json\", JSON.stringify(root, null, 2));\n\n        // collect all code examples and remove them from the root\n        const examples = extractExamples(root);\n\n        // generate api documentation\n        const { component, props } = frontmatter.auto_generated;\n        const mdast: any = [];\n\n        // inject esm import for components\n        mdast.push(buildEsmImportAst());\n\n        // get the component type info\n        const componentType = typeInfo[component];\n        if (componentType) {\n          mdast.push(...buildComponentAst(componentType));\n          mdast.push(...buildPropertyAst(componentType));\n        }\n\n        // get the props type info\n        const propType = typeInfo[props];\n        if (propType?.children) {\n          for (const child of propType.children) {\n            mdast.push(...buildPropertyAst(child));\n\n            // reinject the code examples\n            if (examples[child.name]) {\n              mdast.push(examples[child.name]);\n            }\n          }\n        }\n\n        // inject the mdast into the root\n        root.children.push(...mdast);\n\n        // debug\n        // fs.writeFileSync(\"./merp-end.json\", JSON.stringify(root, null, 2));\n      }\n    });\n  }\n\n  return transform;\n}\n"
  },
  {
    "path": "website/src/plugins/victory-typedoc/mdast.ts",
    "content": "import { fromMarkdown } from \"mdast-util-from-markdown\";\nimport { visit } from \"unist-util-visit\";\nimport { TypeInfo } from \"./typedoc\";\n\nconst importPath = \"@site/src/plugins/victory-typedoc/components/api-property\";\n\n/**\n * Extracts the examples from the markdown AST and removes them from the tree\n */\nexport function extractExamples(root: any): Record<string, any> {\n  const examples: Record<string, any> = {};\n  visit(root, \"code\", (node, index, parent) => {\n    const match = node.meta?.match(/@example\\((.*)\\)/);\n    if (match) {\n      examples[match[1]] = node;\n      parent.children.splice(index, 1);\n    }\n  });\n  return examples;\n}\n\nexport function getMarkdown(value: string): any[] {\n  return fromMarkdown(value).children;\n}\n\nexport function buildComponentAst(typeInfo: TypeInfo) {\n  const mdast: any[] = [];\n\n  mdast.push({\n    type: \"heading\",\n    children: [{ type: \"text\", value: typeInfo.name }],\n    depth: 1,\n    data: {\n      hProperties: { id: typeInfo.name },\n      id: typeInfo.name,\n    },\n  });\n\n  if (typeInfo.description) {\n    mdast.push(...getMarkdown(typeInfo.description));\n  }\n\n  return mdast;\n}\n\nexport function buildEsmImportAst() {\n  return {\n    type: \"mdxjsEsm\",\n    value: `import { ApiProperty } from \"${importPath}\";`,\n    data: {\n      estree: {\n        type: \"Program\",\n        body: [\n          {\n            type: \"ImportDeclaration\",\n            specifiers: [\n              {\n                type: \"ImportSpecifier\",\n                imported: {\n                  type: \"Identifier\",\n                  name: \"ApiProperty\",\n                },\n                local: { type: \"Identifier\", name: \"ApiProperty\" },\n              },\n            ],\n            source: {\n              type: \"Literal\",\n              value: importPath,\n              raw: `\"${importPath}\"`,\n            },\n          },\n        ],\n        sourceType: \"module\",\n      },\n    },\n  };\n}\n\nexport function buildPropertyAst(child: TypeInfo) {\n  const mdast: any[] = [];\n\n  mdast.push({\n    type: \"heading\",\n    children: [{ type: \"text\", value: child.name }],\n    depth: 2,\n    data: {\n      hProperties: { id: child.name },\n      id: child.name,\n    },\n  });\n\n  // TODO: we can do an esm import here with embedded components\n  const jsxElement = {\n    type: \"mdxJsxFlowElement\",\n    name: \"ApiProperty\",\n    attributes: [\n      {\n        type: \"mdxJsxAttribute\",\n        name: \"tsType\",\n        value: child.type,\n      },\n    ],\n    children: [],\n  };\n\n  if (child.required) {\n    jsxElement.attributes.push({\n      type: \"mdxJsxAttribute\",\n      name: \"required\",\n      value: \"true\",\n    });\n  }\n\n  if (child.defaultValue) {\n    jsxElement.attributes.push({\n      type: \"mdxJsxAttribute\",\n      name: \"defaultValue\",\n      value: child.defaultValue,\n    });\n  }\n\n  mdast.push(jsxElement);\n\n  if (child.description) {\n    mdast.push(...getMarkdown(child.description));\n  }\n\n  mdast.push({\n    type: \"thematicBreak\",\n  });\n\n  return mdast;\n}\n"
  },
  {
    "path": "website/src/plugins/victory-typedoc/typedoc.ts",
    "content": "import fs from \"fs\";\nimport path from \"path\";\n\nimport findCacheDirectory from \"find-cache-dir\";\nimport { Application, JSONOutput } from \"typedoc\";\n\nexport type TypeInfo = {\n  name: string;\n\n  defaultValue?: string;\n  description?: string;\n  children?: TypeInfo[];\n  required?: boolean;\n  type?: string;\n};\n\ntype TypeDocType =\n  | JSONOutput.ReferenceReflection\n  | JSONOutput.DeclarationReflection;\n\nconst cacheDirectoryName = \"victory\";\nconst cacheFileName = \"typeInfo.json\";\nconst entryPoints = [\"../packages/victory/src/index.ts\"];\nconst tsconfig = \"../packages/victory/tsconfig.json\";\n\nconst SYNTAX = {\n  OR: \" | \",\n};\n\nfunction getBlockTag(comment: JSONOutput.Comment | undefined, tagName: string) {\n  if (comment?.blockTags) {\n    return comment.blockTags.find((x) => x.tag === tagName);\n  }\n}\n\nfunction getCommentSummary(\n  typeInfo: JSONOutput.ReferenceReflection | JSONOutput.DeclarationReflection,\n): string {\n  return typeInfo?.comment?.summary.map((x) => x.text).join(\"\") || \"\";\n}\n\nfunction getDefaultValue(typeInfo: TypeDocType) {\n  const tag = getBlockTag(typeInfo.comment, \"@defaultValue\");\n  if (tag) {\n    return tag.content\n      .map((x) => x.text.replace(\"```ts\\n\", \"\").replace(\"\\n```\", \"\"))\n      .join(\"\");\n  }\n}\n\nfunction getSignature(signature) {\n  const fields = (signature.parameters || []).map((x) => {\n    return `${x.name}: ${getType(x.type)}`;\n  });\n  return `(${fields.join(\", \")}) => ${getType(signature.type)}`;\n}\n\nfunction getReflectionType(type): string {\n  if (type.declaration?.children) {\n    const fields = type.declaration.children.map((x) => {\n      return `${x.name}: ${getType(x.type)}`;\n    });\n    return `{ ${fields.join(\", \")} }`;\n  }\n\n  if (type.declaration?.signatures) {\n    return type.declaration.signatures.map(getSignature).join(SYNTAX.OR);\n  }\n\n  return \"unknown\";\n}\n\nfunction getLiteralType(type): string {\n  if (type.value === null) {\n    return \"null\";\n  }\n  if (type.value === undefined) {\n    return \"undefined\";\n  }\n  return type.value;\n}\n\nfunction getType(type): string {\n  switch (type?.type) {\n    case \"reflection\":\n      return getReflectionType(type);\n    case \"array\":\n      return `${getType(type.elementType)}[]`;\n    case \"union\":\n      return type.types.map(getType).join(SYNTAX.OR);\n    case \"literal\":\n      return getLiteralType(type);\n    case \"typeOperator\":\n      return `${type.operator} ${getType(type.target)}`;\n    case \"reference\":\n    case \"intrinsic\":\n      return type.name;\n    default:\n      return \"unknown\";\n  }\n}\n\nfunction mapTypeInfo(\n  typeInfo: JSONOutput.ReferenceReflection | JSONOutput.DeclarationReflection,\n) {\n  const map: TypeInfo = {\n    name: typeInfo.name,\n    required: !typeInfo.flags?.isOptional === true,\n    description: getCommentSummary(typeInfo),\n    defaultValue: getDefaultValue(typeInfo),\n    type: getType(typeInfo.type),\n  };\n\n  if (typeInfo.children) {\n    map.children = typeInfo.children.map(mapTypeInfo);\n  }\n\n  return map;\n}\n\nasync function loadTypeInfo(): Promise<JSONOutput.ProjectReflection> {\n  // Load the type info from a file if it exists\n  const dir = findCacheDirectory({ name: cacheDirectoryName, create: true });\n  const typeInfoPath = path.join(dir!, cacheFileName);\n\n  let typeInfo;\n\n  if (fs.existsSync(typeInfoPath)) {\n    typeInfo = JSON.parse(fs.readFileSync(typeInfoPath, \"utf8\"));\n  }\n\n  if (!typeInfo) {\n    // Load the types from Victory\n    const typedocApp = await Application.bootstrapWithPlugins({\n      entryPoints,\n      tsconfig,\n      logLevel: \"Error\",\n      disableSources: true,\n      excludeExternals: true,\n      excludeInternal: true,\n      excludeReferences: true,\n      // excludeNotDocumented: true,\n      readme: \"none\",\n    });\n\n    const project = await typedocApp.convert();\n    if (!project) {\n      throw new Error(\"Failed to load type information from Victory\");\n    }\n\n    typeInfo = typedocApp.serializer.projectToObject(project, process.cwd());\n\n    // save typeInfo to a file\n    // TODO: we can strip this file down to only what we need\n    fs.writeFileSync(typeInfoPath, JSON.stringify(typeInfo, null, 2));\n  }\n\n  return typeInfo as JSONOutput.ProjectReflection;\n}\n\nexport async function getTypeInfo(): Promise<Record<string, TypeInfo>> {\n  const typeInfo = await loadTypeInfo();\n  if (!typeInfo) {\n    return {};\n  }\n\n  // apply transformations to the type info\n  const map: Record<string, TypeInfo> = {};\n  typeInfo.children?.forEach((child) => {\n    map[child.name] = mapTypeInfo(child);\n  });\n  return map;\n}\n"
  },
  {
    "path": "website/src/theme/DocItem/index.tsx",
    "content": "import React from \"react\";\nimport OriginalDocItem from \"@theme-original/DocItem\";\nimport CalloutBanner from \"@site/src/components/CalloutBanner\";\n\nexport default function DocItem(props) {\n  return (\n    <>\n      <OriginalDocItem {...props} />\n      <div className=\"mt-20 min-[997px]:hidden\">\n        <CalloutBanner fullWidth />\n      </div>\n    </>\n  );\n}\n"
  },
  {
    "path": "website/src/theme/DocSidebar/index.tsx",
    "content": "import React from \"react\";\nimport OriginalDocSidebar from \"@theme-original/DocSidebar\";\nimport SidebarLeadBanner from \"@site/src/components/SidebarLeadBanner\";\n\nexport default function DocSidebar(props) {\n  return (\n    <div className=\"flex flex-col h-full\">\n      <div className=\"flex-1 overflow-x-hidden\">\n        <OriginalDocSidebar {...props} />\n      </div>\n      <SidebarLeadBanner />\n    </div>\n  );\n}\n"
  },
  {
    "path": "website/src/theme/MDXComponents.ts",
    "content": "/* eslint-disable filenames/match-regex */\nimport MDXComponents from \"@theme-original/MDXComponents\";\nimport {\n  Badge,\n  Badges,\n  DefaultsBadge,\n  OverriddenBadge,\n  RequiredBadge,\n  TypeBadge,\n} from \"@site/src/components/badges\";\nimport { CommonProps } from \"@site/src/components/common-props\";\n\nexport default {\n  ...MDXComponents,\n  Badge,\n  Badges,\n  CommonProps,\n  DefaultsBadge,\n  OverriddenBadge,\n  RequiredBadge,\n  TypeBadge,\n};\n"
  },
  {
    "path": "website/src/theme/Playground/index.tsx",
    "content": "/**\n * This theme file overrides original file from the docusaurus theme\n * to customize the playground component\n *\n * Original file: @docusaurus/theme-live-codeblock/src/theme/Playground/index.tsx\n */\n\n/* eslint-disable react/no-multi-comp */\nimport React from \"react\";\nimport clsx from \"clsx\";\nimport useIsBrowser from \"@docusaurus/useIsBrowser\";\nimport { LiveProvider, LiveEditor, LiveError, LivePreview } from \"react-live\";\nimport Translate from \"@docusaurus/Translate\";\nimport BrowserOnly from \"@docusaurus/BrowserOnly\";\nimport {\n  ErrorBoundaryErrorMessageFallback,\n  usePrismTheme,\n} from \"@docusaurus/theme-common\";\nimport ErrorBoundary from \"@docusaurus/ErrorBoundary\";\n\nimport type { Props } from \"@theme/Playground\";\n\nimport styles from \"./styles.module.css\";\n\nfunction Header({ children }: { children: React.ReactNode }) {\n  return <div className={clsx(styles.playgroundHeader)}>{children}</div>;\n}\n\nfunction LivePreviewLoader() {\n  return <div>Loading...</div>;\n}\n\nfunction Preview() {\n  // No SSR for the live preview\n  // See https://github.com/facebook/docusaurus/issues/5747\n  return (\n    <BrowserOnly fallback={<LivePreviewLoader />}>\n      {() => (\n        <>\n          <ErrorBoundary\n            fallback={(params) => (\n              <ErrorBoundaryErrorMessageFallback {...params} />\n            )}\n          >\n            <LivePreview />\n          </ErrorBoundary>\n          <LiveError />\n        </>\n      )}\n    </BrowserOnly>\n  );\n}\n\nfunction ResultWithHeader() {\n  return (\n    <div className={styles.playgroundPreviewContainer}>\n      <Header>\n        <Translate\n          id=\"theme.Playground.result\"\n          description=\"The result label of the live codeblocks\"\n        >\n          Live View\n        </Translate>\n      </Header>\n      {/* https://github.com/facebook/docusaurus/issues/5747 */}\n      <div className={styles.playgroundPreview}>\n        <Preview />\n      </div>\n    </div>\n  );\n}\n\nfunction ThemedLiveEditor() {\n  const isBrowser = useIsBrowser();\n  return (\n    <LiveEditor\n      // We force remount the editor on hydration,\n      // otherwise dark prism theme is not applied\n      key={String(isBrowser)}\n      className={styles.playgroundEditor}\n    />\n  );\n}\n\nfunction EditorWithHeader() {\n  const [isExpanded, setIsExpanded] = React.useState(false);\n  const toggleExpanded = () => setIsExpanded((prev) => !prev);\n\n  return (\n    <div className={styles.playgroundEditorContainer}>\n      <Header>\n        <div className=\"flex flex-row items-center\">\n          <div className=\"flex-1\">\n            <Translate\n              id=\"theme.Playground.liveEditor\"\n              description=\"The live editor label of the live codeblocks\"\n            >\n              Live Editor\n            </Translate>\n          </div>\n          <button\n            type=\"button\"\n            className=\"rounded bg-blue-600 px-2 py-1 text-xs font-semibold text-white hover:bg-blue-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600 border-none xl:hidden\"\n            onClick={toggleExpanded}\n          >\n            {isExpanded ? \"Hide Code\" : \"Show Code\"}\n          </button>\n        </div>\n      </Header>\n      <div className={isExpanded ? \"block\" : \"hidden xl:block\"}>\n        <ThemedLiveEditor />\n      </div>\n    </div>\n  );\n}\n\n// this should rather be a stable function\n// see https://github.com/facebook/docusaurus/issues/9630#issuecomment-1855682643\nconst DEFAULT_TRANSFORM_CODE = (code: string) => `${code};`;\n\nexport default function Playground({\n  children,\n  transformCode,\n  ...props\n}: Props): JSX.Element {\n  const prismTheme = usePrismTheme();\n  const noInline = props.metastring?.includes(\"noInline\") ?? false;\n\n  return (\n    <div className={styles.playgroundContainer}>\n      <LiveProvider\n        code={children?.replace(/\\n$/, \"\")}\n        noInline={noInline}\n        transformCode={transformCode ?? DEFAULT_TRANSFORM_CODE}\n        theme={prismTheme}\n        {...props}\n      >\n        <>\n          <ResultWithHeader />\n          <EditorWithHeader />\n        </>\n      </LiveProvider>\n    </div>\n  );\n}\n"
  },
  {
    "path": "website/src/theme/Playground/styles.module.css",
    "content": ".playgroundContainer {\n  margin-bottom: var(--ifm-leading);\n\n  overflow: hidden;\n  display: flex;\n  flex-direction: column;\n}\n\n@media (min-width: 1280px) {\n  .playgroundContainer {\n    gap: 1rem;\n    flex-direction: row;\n  }\n}\n\n.playgroundHeader {\n  letter-spacing: 0.08rem;\n  padding: 0.75rem;\n  text-transform: uppercase;\n  font-weight: bold;\n  background: var(--ifm-color-emphasis-200);\n  color: var(--ifm-color-content);\n  font-size: var(--ifm-code-font-size);\n  border-top-left-radius: var(--ifm-global-radius);\n  border-top-right-radius: var(--ifm-global-radius);\n}\n\n@media (max-width: 1279px) {\n  .playgroundEditorContainer .playgroundHeader {\n    border-radius: 0;\n  }\n}\n\n.playgroundHeader:first-of-type {\n  background: var(--ifm-color-emphasis-600);\n  color: var(--ifm-color-content-inverse);\n}\n\n.playgroundEditorContainer,\n.playgroundPreviewContainer {\n  flex: 1;\n}\n\n.playgroundEditor {\n  font: var(--ifm-code-font-size) / var(--ifm-pre-line-height)\n    var(--ifm-font-family-monospace) !important;\n  /* rtl:ignore */\n  direction: ltr;\n  max-height: 504px;\n  overflow-y: scroll;\n}\n\n.playgroundPreview {\n  background-color: #f6f7f8;\n}\n"
  },
  {
    "path": "website/src/theme/README.md",
    "content": "# Custom Theme Folder\n\nWe use this custom prism theme configuration in order to support `diff` and `diff-ts` in prismjs syntax highlighting for code blocks.\n"
  },
  {
    "path": "website/src/theme/ReactLiveScope/index.tsx",
    "content": "import React from \"react\";\nimport ReactDOM from \"react-dom\";\n\nimport scopeMap from \"./scope-map\";\n\nconst ReactLiveScope = {\n  ...scopeMap,\n  React,\n  ReactDOM,\n};\n\nexport default ReactLiveScope;\n"
  },
  {
    "path": "website/src/theme/ReactLiveScope/scope-map.ts",
    "content": "/* eslint-disable no-magic-numbers */\nimport _ from \"lodash\";\n\n// NOTE(2220): Keep on old CommonJS-supported D3 versions\n// https://github.com/FormidableLabs/victory/issues/2220\nimport * as d3Array from \"d3-array\";\nimport * as d3Scale from \"d3-scale\";\nimport * as d3Time from \"d3-time\";\nimport {\n  scaleDiscontinuous,\n  discontinuitySkipWeekends,\n} from \"@d3fc/d3fc-discontinuous-scale\";\nimport { FaMoon, FaStar, FaSun } from \"react-icons/fa\";\nimport * as Victory from \"victory\";\n\nimport Slider from \"../../components/slider\";\n\nconst scopeMap = {\n  ...Victory,\n  _,\n  d3Array,\n  d3Scale,\n  d3Time,\n  scaleDiscontinuous,\n  discontinuitySkipWeekends,\n  Slider,\n  reactIconsFa: {\n    FaMoon,\n    FaStar,\n    FaSun,\n  },\n  sampleData: [\n    {\n      x: 1,\n      y: 2,\n    },\n    {\n      x: 2,\n      y: 3,\n    },\n    {\n      x: 3,\n      y: 5,\n    },\n    {\n      x: 4,\n      y: 4,\n    },\n    {\n      x: 5,\n      y: 7,\n    },\n  ],\n  sampleHistogramData: [\n    { x: 0 },\n    { x: 1 },\n    { x: 1 },\n    { x: 1 },\n    { x: 1 },\n    { x: 2 },\n    { x: 2 },\n    { x: 3 },\n    { x: 4 },\n    { x: 7 },\n    { x: 7 },\n    { x: 10 },\n  ],\n  sampleHistogramDateData: [\n    { x: new Date(2020, 0, 10) },\n    { x: new Date(2020, 0, 1) },\n    { x: new Date(2020, 0, 1) },\n    { x: new Date(2020, 1, 29) },\n    { x: new Date(2020, 1, 1) },\n    { x: new Date(2020, 2, 1) },\n    { x: new Date(2020, 2, 1) },\n    { x: new Date(2020, 2, 3) },\n    { x: new Date(2020, 3, 20) },\n    { x: new Date(2020, 3, 22) },\n    { x: new Date(2020, 4, 29) },\n    { x: new Date(2020, 4, 1) },\n    { x: new Date(2020, 8, 7) },\n    { x: new Date(2020, 8, 13) },\n    { x: new Date(2020, 9, 21) },\n    { x: new Date(2020, 9, 10) },\n    { x: new Date(2020, 9, 17) },\n    { x: new Date(2020, 9, 19) },\n    { x: new Date(2020, 10, 9) },\n    { x: new Date(2020, 11, 10) },\n    { x: new Date(2020, 11, 20) },\n    { x: new Date(2020, 11, 1) },\n    { x: new Date(2020, 11, 3) },\n    { x: new Date(2020, 11, 21) },\n    { x: new Date(2020, 11, 25) },\n  ],\n  sampleErrorData: [\n    {\n      x: 1,\n      y: 2,\n      errorX: 0.1,\n      errorY: 0.4,\n    },\n    {\n      x: 2,\n      y: 3,\n      errorX: 0.5,\n      errorY: 0.1,\n    },\n    {\n      x: 3,\n      y: 5,\n      errorX: 0.3,\n      errorY: 0.2,\n    },\n    {\n      x: 4,\n      y: 4,\n      errorX: 0.1,\n      errorY: 0.3,\n    },\n    {\n      x: 5,\n      y: 7,\n      errorX: 0.2,\n      errorY: 0.5,\n    },\n  ],\n  sampleDataDates: [\n    {\n      x: new Date(2016, 6, 1),\n      open: 5,\n      close: 10,\n      high: 15,\n      low: 0,\n    },\n    {\n      x: new Date(2016, 6, 2),\n      open: 10,\n      close: 15,\n      high: 20,\n      low: 5,\n    },\n    {\n      x: new Date(2016, 6, 3),\n      open: 15,\n      close: 20,\n      high: 22,\n      low: 10,\n    },\n    {\n      x: new Date(2016, 6, 4),\n      open: 20,\n      close: 10,\n      high: 25,\n      low: 7,\n    },\n    {\n      x: new Date(2016, 6, 5),\n      open: 10,\n      close: 8,\n      high: 15,\n      low: 5,\n    },\n  ],\n  sampleDataPolar: [\n    {\n      x: 45,\n      y: 2,\n    },\n    {\n      x: 90,\n      y: 3,\n    },\n    {\n      x: 135,\n      y: 5,\n    },\n    {\n      x: 180,\n      y: 4,\n    },\n    {\n      x: 225,\n      y: 7,\n    },\n    {\n      x: 270,\n      y: 2,\n    },\n    {\n      x: 315,\n      y: 4,\n    },\n    {\n      x: 360,\n      y: 7,\n    },\n  ],\n};\n\nexport default scopeMap;\n"
  },
  {
    "path": "website/src/theme/prism-diff-highlight.css",
    "content": "code .token.diff-highlight-deleted {\n\tbackground-color: rgba(255, 0, 0, .1);\n}\n\ncode .token.diff-highlight-inserted {\n\tbackground-color: rgba(0, 255, 128, .1);\n}\n\ncode .token.coord {\n\tfont-weight: 700;\n}\n"
  },
  {
    "path": "website/src/theme/prism-diff-highlight.ts",
    "content": "import { EnvConfig, PrismLib } from \"prism-react-renderer\";\nimport { TokenStream, Token } from \"prismjs\";\n\nconst LANGUAGE_REGEX = /^diff-([\\w-]+)/i;\n\nconst tokenStreamToString = (tokenStream: TokenStream): string => {\n  const result: string[] = [];\n  const stack: TokenStream[] = [tokenStream];\n\n  while (stack.length > 0) {\n    const item = stack.pop();\n\n    if (typeof item === \"string\") {\n      result.push(item);\n    } else if (Array.isArray(item)) {\n      for (let i = item.length - 1; i >= 0; i--) {\n        stack.push(item[i]);\n      }\n    } else {\n      // If it's a Token, convert it to a string and push it\n      stack.push(item.content);\n    }\n  }\n\n  return result.join(\"\");\n};\n\nexport function diffHighlight(Prism: PrismLib) {\n  Prism.hooks.add(\"after-tokenize\", function (env: EnvConfig) {\n    let diffLanguage;\n    let diffGrammar;\n    const language = env.language;\n    if (language !== \"diff\") {\n      const langMatch = LANGUAGE_REGEX.exec(language);\n      if (!langMatch) {\n        return; // not a language specific diff\n      }\n\n      diffLanguage = langMatch[1];\n      diffGrammar = Prism.languages[diffLanguage];\n      if (!diffGrammar) {\n        console.error(\n          \"prism-diff-highlight:\",\n          `You need to add language '${diffLanguage}' to use '${language}'`,\n        );\n        return;\n      }\n    } else return;\n\n    const newTokens = [];\n    env.tokens.forEach((token) => {\n      if (typeof token === \"string\") {\n        newTokens.push(...Prism.tokenize(token, diffGrammar));\n      } else if (token.type === \"unchanged\") {\n        newTokens.push(\n          ...Prism.tokenize(tokenStreamToString(token), diffGrammar),\n        );\n      } else if ([\"deleted-sign\", \"inserted-sign\"].includes(token.type)) {\n        token.alias = [\n          token.type === \"deleted-sign\"\n            ? \"diff-highlight-deleted\"\n            : \"diff-highlight-inserted\",\n        ];\n        // diff parser always return \"deleted\" and \"inserted\" lines with content of type array\n        if (token.content.length > 1) {\n          const newTokenContent: Array<string | Token> = [];\n          // preserve prefixes and don't parse them again\n          // subTokens from diff parser are of type Token\n          (token.content as Array<string | Token>).forEach(\n            (subToken: Token) => {\n              if (subToken.type === \"prefix\") {\n                newTokenContent.push(subToken);\n              } else {\n                newTokenContent.push(\n                  ...Prism.tokenize(tokenStreamToString(subToken), diffGrammar),\n                );\n              }\n            },\n          );\n          token.content = newTokenContent;\n        }\n        newTokens.push(token);\n      } else if (token.type === \"coord\") {\n        newTokens.push(token);\n      }\n    });\n    console.log(newTokens);\n    env.tokens = newTokens;\n  });\n}\n"
  },
  {
    "path": "website/src/theme/prism-include-languages.ts",
    "content": "import siteConfig from \"@generated/docusaurus.config\";\nimport * as PrismNamespace from \"prismjs\";\nimport { Optional } from \"utility-types\";\nimport { diffHighlight } from \"./prism-diff-highlight\";\nimport \"./prism-diff-highlight.css\";\n\nconst DIFF_LANGUAGE_REGEX = /^diff-([\\w-]+)/i;\n\nexport default function prismIncludeLanguages(\n  PrismObject: typeof PrismNamespace,\n): void {\n  const {\n    themeConfig: { prism },\n  } = siteConfig;\n  const { additionalLanguages } = prism as { additionalLanguages: string[] };\n\n  // Prism components work on the Prism instance on the window, while prism-\n  // react-renderer uses its own Prism instance. We temporarily mount the\n  // instance onto window, import components to enhance it, then remove it to\n  // avoid polluting global namespace.\n  // You can mutate PrismObject: registering plugins, deleting languages... As\n  // long as you don't re-assign it\n  globalThis.Prism = PrismObject;\n\n  additionalLanguages.forEach((lang) => {\n    const langMatch = DIFF_LANGUAGE_REGEX.exec(lang);\n    if (langMatch) {\n      // eslint-disable-next-line global-require\n      if (!PrismObject.languages.diff) {\n        console.error(\n          \"prism-include-languages:\",\n          \"You need to import 'diff' language first to use 'diff-xxxx' languages\",\n        );\n      }\n      PrismObject.languages[lang] = PrismObject.languages.diff;\n    } else {\n      // eslint-disable-next-line global-require, import/no-dynamic-require\n      require(`prismjs/components/prism-${lang}`);\n    }\n  });\n\n  diffHighlight(PrismObject);\n\n  delete (globalThis as Optional<typeof globalThis, \"Prism\">).Prism;\n}\n"
  },
  {
    "path": "website/static/.nojekyll",
    "content": ""
  },
  {
    "path": "website/static/favicon/browserconfig.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<browserconfig>\n    <msapplication>\n        <tile>\n            <square150x150logo src=\"/favicon/mstile-150x150.png\"/>\n            <TileColor>#da532c</TileColor>\n        </tile>\n    </msapplication>\n</browserconfig>\n"
  },
  {
    "path": "website/static/favicon/site.webmanifest",
    "content": "{\n    \"name\": \"\",\n    \"short_name\": \"\",\n    \"icons\": [\n        {\n            \"src\": \"/favicon/android-chrome-192x192.png\",\n            \"sizes\": \"192x192\",\n            \"type\": \"image/png\"\n        }\n    ],\n    \"theme_color\": \"#ffffff\",\n    \"background_color\": \"#ffffff\",\n    \"display\": \"standalone\"\n}\n"
  },
  {
    "path": "website/tailwind.config.ts",
    "content": "/** @type {import('tailwindcss').Config} */\n\nconst NearFormColors = {\n  White: \"hsla(0, 0%, 100%, 1)\",\n  Black: \"hsla(0, 0%, 0%, 1)\",\n  Green: \"hsla(163, 100%, 45%, 1)\",\n  Purple: \"hsla(260, 100%, 70%, 1)\",\n  LightPurple: \"hsla(262, 100%, 90%, 1)\",\n  Blue: \"hsla(218, 100%, 64%, 1)\",\n  LightBlue: \"hsla(217, 100%, 92%, 1)\",\n  Grey: \"hsla(0, 0%, 85%, 1)\",\n  LightGrey: \"#F4F8FA\",\n  DeepGrey: \"hsla(240, 8%, 29%, 1)\",\n  Navy: \"hsla(205, 78%, 21%, 1)\",\n  LightNavy: \"hsla(222, 25%, 43%, 1)\",\n  DeepNavy: \"hsla(225, 100%, 11%, 1)\",\n};\n\nconst orange = {\n  100: \"#ff684f\",\n  200: \"#ff4b2e\",\n  300: \"#ff3d1d\",\n  400: \"#ea2100\",\n};\n\nmodule.exports = {\n  corePlugins: {\n    preflight: false, // disable Tailwind's reset\n  },\n  content: [\"./src/**/*.{js,jsx,ts,tsx}\", \"./docs/**/*.mdx\"],\n  darkMode: [\"class\", '[data-theme=\"dark\"]'],\n  theme: {\n    extend: {\n      colors: {\n        currentColor: \"currentColor\",\n        transparent: \"transparent\",\n        white: NearFormColors.White,\n        black: NearFormColors.Black,\n        grayscale: {\n          100: NearFormColors.White,\n          200: NearFormColors.LightGrey,\n          300: NearFormColors.Grey,\n          400: NearFormColors.DeepGrey,\n          500: NearFormColors.Black,\n          800: \"#888888\",\n        },\n        orange,\n        \"theme-1\": NearFormColors.Green,\n        \"theme-2\": NearFormColors.DeepNavy,\n        \"theme-3\": NearFormColors.DeepNavy,\n        \"theme-4\": NearFormColors.White,\n        \"header-bg\": NearFormColors.White,\n        \"header-fg\": NearFormColors.DeepNavy,\n        \"button-bg\": NearFormColors.Green,\n        \"button-fg\": NearFormColors.DeepNavy,\n        \"button-bg-hover\": NearFormColors.White,\n        \"button-fg-hover\": NearFormColors.DeepNavy,\n        \"button-border\": NearFormColors.Green,\n        \"code-bg\": \"#1e1e1e\",\n        error: \"#FF0000\",\n      },\n      height: {\n        \"theme-builder\": \"calc(100vh - 60px)\",\n      },\n      width: {\n        prose: \"90ch\",\n        \"full-panel\": \"calc(100vw - 100px)\",\n      },\n      fontFamily: {\n        sans: [\"Inter, Helvetica, Arial, sans-serif\"],\n      },\n      backgroundImage: {\n        \"select-chevron\":\n          'url(\\'data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"black\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"feather feather-chevron-down\"><polyline points=\"6 9 12 15 18 9\"/></svg>\\')',\n      },\n    },\n  },\n};\n"
  },
  {
    "path": "website/tsconfig.json",
    "content": "{\n  \"extends\": \"@docusaurus/tsconfig\",\n  \"compilerOptions\": {\n    \"baseUrl\": \".\"\n  },\n  \"include\": [\"vendors.d.ts\"]\n}\n"
  },
  {
    "path": "website/vendors.d.ts",
    "content": "declare module \"@d3fc/d3fc-discontinuous-scale\";\ndeclare module \"d3-scale\";\ndeclare module \"prism-react-renderer\";\n"
  }
]