diff --git a/.babelrc b/.babelrc deleted file mode 100644 index bd20dc1799..0000000000 --- a/.babelrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "presets": [ - "es2015", - "react" - ] -} diff --git a/.babelrc.js b/.babelrc.js new file mode 100644 index 0000000000..e7a3c19095 --- /dev/null +++ b/.babelrc.js @@ -0,0 +1,48 @@ +'use strict'; + +const target = process.env.BABEL_TARGET; +const output = process.env.BABEL_OUTPUT; +const env = process.env.NODE_ENV; +const modules = output == null ? false : output; + +const targets = env === 'test' ? { node: 'current' } : undefined; + +const options = { + comments: false, + minified: true, + assumptions: { + ignoreToPrimitiveHint: true, + iterableIsArray: true, + mutableTemplateObject: true, + noNewArrows: true, + objectRestNoSymbols: true, + setComputedProperties: true, + setSpreadProperties: true, + }, + presets: [ + [ + '@babel/env', + { + bugfixes: true, + loose: true, + modules, + targets, + corejs: '3', + useBuiltIns: 'entry', + }, + ], + ['@babel/react', { useBuiltIns: true }], + ], + plugins: [], +}; + +if (target === 'examples') { + options.plugins.push([ + 'transform-react-remove-prop-types', + { removeImport: true }, + ]); +} else if (env !== 'test') { + options.plugins.push(['transform-react-remove-prop-types', { mode: 'wrap' }]); +} + +module.exports = options; diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 0000000000..55ae8fde69 --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,6 @@ +> 0.3% +last 2 versions +Firefox ESR +not dead +not Android <5 +maintained node versions \ No newline at end of file diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 75fa6231bb..0000000000 --- a/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -/webpack.* diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index ea2fb30012..0000000000 --- a/.eslintrc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "airbnb", - "env": { - "browser": true, - "node": true - }, - "rules": { - "react/prefer-es6-class": 0, - "react/prefer-stateless-function": 0 - } -} diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000000..e090ba84f8 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: [danez] diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000000..4b3711fcd1 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,97 @@ +name: CI + +on: + push: + branches: + - main + - renovate/** + pull_request: + +permissions: {} + +jobs: + tests: + name: Unit tests + runs-on: ubuntu-latest + if: "!startsWith(github.head_ref, 'renovate/')" + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 'lts/*' + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Unit tests + run: pnpm test --coverage + + - name: Upload coverage + uses: coverallsapp/github-action@v2 + + lint: + name: Lint + runs-on: ubuntu-latest + if: "!startsWith(github.head_ref, 'renovate/')" + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 'lts/*' + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Lint + run: pnpm lint + + release: + needs: [tests, lint] + if: github.ref == 'refs/heads/main' + name: Release + runs-on: ubuntu-latest + permissions: + contents: write # to be able to publish a GitHub release + issues: write # to be able to comment on released issues + pull-requests: write # to be able to comment on released pull requests + id-token: write # to enable use of OIDC for npm provenance + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 'lts/*' + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Release + run: pnpm dlx semantic-release --branches main + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 0000000000..83a726e4ce --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,68 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: + - main + - renovate/** + pull_request: + schedule: + - cron: '33 1 * * 0' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + if: "!startsWith(github.head_ref, 'renovate/')" + + strategy: + fail-fast: false + matrix: + language: [ 'javascript' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] + # Learn more: + # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v3 + + # â„šī¸ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # âœī¸ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml new file mode 100644 index 0000000000..28cc5d68c0 --- /dev/null +++ b/.github/workflows/lock.yml @@ -0,0 +1,22 @@ +name: 'Lock Threads' + +on: + schedule: + - cron: '36 5 * * 2' + workflow_dispatch: + +permissions: + issues: write + pull-requests: write + discussions: write + +concurrency: + group: lock + +jobs: + action: + runs-on: ubuntu-latest + steps: + - uses: dessant/lock-threads@v5 + with: + log-output: true diff --git a/.github/workflows/ossar-analysis.yml b/.github/workflows/ossar-analysis.yml new file mode 100644 index 0000000000..e4a718be99 --- /dev/null +++ b/.github/workflows/ossar-analysis.yml @@ -0,0 +1,53 @@ +# This workflow integrates a collection of open source static analysis tools +# with GitHub code scanning. For documentation, or to provide feedback, visit +# https://github.com/github/ossar-action +name: OSSAR + +on: + push: + branches: + - main + - renovate/** + pull_request: + +jobs: + OSSAR-Scan: + # OSSAR runs on windows-latest. + # ubuntu-latest and macos-latest support coming soon + runs-on: windows-latest + if: "!startsWith(github.head_ref, 'renovate/')" + + steps: + # Checkout your code repository to scan + - name: Checkout repository + uses: actions/checkout@v4 + with: + # We must fetch at least the immediate parents so that if this is + # a pull request then we can checkout the head. + fetch-depth: 2 + + # If this run was triggered by a pull request event, then checkout + # the head of the pull request instead of the merge commit. + - run: git checkout HEAD^2 + if: ${{ github.event_name == 'pull_request' }} + + # Ensure a compatible version of dotnet is installed. + # The [Microsoft Security Code Analysis CLI](https://aka.ms/mscadocs) is built with dotnet v3.1.201. + # A version greater than or equal to v3.1.201 of dotnet must be installed on the agent in order to run this action. + # GitHub hosted runners already have a compatible version of dotnet installed and this step may be skipped. + # For self-hosted runners, ensure dotnet version 3.1.201 or later is installed by including this action: + # - name: Install .NET + # uses: actions/setup-dotnet@v1 + # with: + # dotnet-version: '3.1.x' + + # Run open source static analysis tools + - name: Run OSSAR + uses: github/ossar-action@v1 + id: ossar + + # Upload results to the Security tab + - name: Upload OSSAR results + uses: github/codeql-action/upload-sarif@v3 + with: + sarif_file: ${{ steps.ossar.outputs.sarifFile }} diff --git a/.github/workflows/pkg-size-report.yml b/.github/workflows/pkg-size-report.yml new file mode 100644 index 0000000000..e209961f33 --- /dev/null +++ b/.github/workflows/pkg-size-report.yml @@ -0,0 +1,37 @@ +name: Package size report + +on: + pull_request: + branches: [main, next] + +permissions: + pull-requests: write + +jobs: + pkg-size-report: + name: Package size report + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 'lts/*' + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Package size report + uses: pkg-size/action@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + hide-files: '*.{js,css}.map' + display-size: uncompressed, gzip diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml new file mode 100644 index 0000000000..d62419f979 --- /dev/null +++ b/.github/workflows/website.yml @@ -0,0 +1,66 @@ +name: Website + +on: + push: + branches: + - main + - renovate/** + pull_request: + +permissions: {} + +jobs: + website: + name: Test + if: "github.ref != 'refs/heads/main' && !startsWith(github.head_ref, 'renovate/')" + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 'lts/*' + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build website + run: pnpm run --sequential '/website:.*/' + + deploy: + name: Deploy + if: github.ref == 'refs/heads/main' + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 'lts/*' + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build + run: pnpm run --sequential '/website:.*/' + + - name: Deploy + uses: JamesIves/github-pages-deploy-action@v4 + with: + branch: gh-pages + folder: examples/dist diff --git a/.gitignore b/.gitignore index b3827e69a0..ae3adbfdc5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ -.idea -*.iml build/ +coverage/ +examples/dist/ node_modules/ npm-debug.log lib/ +esm/ diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 0000000000..c9fa969d57 --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,8 @@ + +tasks: + - init: pnpm install && pnpm run build + +vscode: + extensions: + - esbenp.prettier-vscode + - dbaeumer.vscode-eslint diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000000..b418c8e60a --- /dev/null +++ b/.prettierrc @@ -0,0 +1,11 @@ +{ + "arrowParens": "always", + "bracketSpacing": true, + "bracketSameLine": false, + "printWidth": 80, + "semi": true, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "all", + "useTabs": false + } \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index f36c70fe36..0000000000 --- a/.travis.yml +++ /dev/null @@ -1,9 +0,0 @@ -sudo: false -language: node_js -node_js: - - "4" - - "5" - - stable -script: - - npm run lint - - npm test diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000000..6917d94dd8 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,14 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Attach to Process", + "type": "node", + "request": "attach", + "port": 9229 + } + ] +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 2d3cb5fa4c..0000000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,80 +0,0 @@ -v0.5.4 - Fri, 10 Jun 2016 08:48:45 GMT --------------------------------------- - -- [5101f96](../../commit/5101f96) [fixed] Update to support react 15 #94 - - -v0.5.3 - Mon, 01 Feb 2016 16:09:12 GMT --------------------------------------- - -- [baaa587](../../commit/baaa587) [fixed] use correct spelling of aria-labelledby #67 - - -v0.5.2 - Fri, 29 Jan 2016 19:45:48 GMT --------------------------------------- - -- [c432a08](../../commit/c432a08) [fixed] Server Side Rendering won't work with default styles #45 - - -v0.5.1 - Thu, 22 Oct 2015 22:38:49 GMT --------------------------------------- - -- [53c7ccb](../../commit/53c7ccb) [fixed] Removing ReactDOM from bundle - - -v0.5.0 - Thu, 22 Oct 2015 05:36:48 GMT --------------------------------------- - -- [e05a9ec](../../commit/e05a9ec) [fixed] Issue when conditionally rendering Tab/TabPanel closes #37 - - -v0.4.1 - Wed, 09 Sep 2015 19:18:50 GMT --------------------------------------- - -- - - -v0.4.0 - Tue, 18 Aug 2015 22:53:59 GMT --------------------------------------- - -- - - -v0.3.0 - Tue, 11 Aug 2015 00:42:23 GMT --------------------------------------- - -- [0eb43e5](../../commit/0eb43e5) [added] Support for disabling tabs - - -v0.2.1 - Fri, 26 Jun 2015 19:35:50 GMT --------------------------------------- - -- [5132966](../../commit/5132966) [added] Bower support closes #22 -- [3f43e89](../../commit/3f43e89) [fixed] Issue with React being included twice closes #23 - - -# Changelog - -### 0.1.0 (Jul 18, 2014) - -- Initial release - -### 0.1.1 (Jul 19, 2014) - -- Fixing warning: Invalid access to component property -- Fixing style weirdness in Firefox - -### 0.1.2 (Jul 23, 2014) - -- Making Tab and TabPanel to be stateless -- Throwing Error when Tab count and TabPanel count aren't equal - -### 0.2.0 (Jun 07, 2015) - -- Allowing children of Tab to select Tab ([#9](https://github.com/rackt/react-tabs/pull/9)) -- Only render the selected TabPanel -- Upgrading to React 0.13 -- Removing JSX -- Fixing issue with focus management ([#7](https://github.com/rackt/react-tabs/pull/7)) -- Fixing issue caused by no children being provided ([#6](https://github.com/rackt/react-tabs/issues/6)) -- Fixing issue that made dynamic Tabs difficult diff --git a/LICENSE b/LICENSE index aa0e0036f1..50769ac6b9 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2015 by Matt Zabriskie +Copyright (c) Matt Zabriskie and Daniel Tschinder Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 1a9eb1a353..4f9a3b53ec 100644 --- a/README.md +++ b/README.md @@ -1,106 +1,372 @@ -# react-tabs [![Build Status](https://travis-ci.org/reactjs/react-tabs.svg?branch=master)](https://travis-ci.org/reactjs/react-tabs) +# react-tabs [![npm version](https://img.shields.io/npm/v/react-tabs.svg)](https://www.npmjs.com/package/react-tabs) [![Coverage Status](https://coveralls.io/repos/github/reactjs/react-tabs/badge.svg?branch=main)](https://coveralls.io/github/reactjs/react-tabs?branch=main) -React tabs component +An accessible and easy tab component for ReactJS. + +https://reactcommunity.org/react-tabs/ + +> Version 5 or newer of `react-tabs` needs react version 18 or newer +> +> Version 4 of `react-tabs` needs react version 16.8 or newer + +

react-tabs was tested on real mobile devices and browsers with
+Browserstack + +

## Installing ```bash -$ npm install react-tabs +yarn add react-tabs ``` -## Demo +or -https://reactcommunity.org/react-tabs/example/ +```bash +npm install --save react-tabs +``` -## Example +## Basic Example ```js -var React = require('react'); -var ReactDOM = require('react-dom'); -var ReactTabs = require('react-tabs'); -var Tab = ReactTabs.Tab; -var Tabs = ReactTabs.Tabs; -var TabList = ReactTabs.TabList; -var TabPanel = ReactTabs.TabPanel; - -var App = React.createClass({ - handleSelect: function (index, last) { - console.log('Selected tab: ' + index + ', Last tab: ' + last); - }, - - render: function () { - return ( - {/* - is a composite component and acts as the main container. - - `onSelect` is called whenever a tab is selected. The handler for - this function will be passed the current index as well as the last index. - - `selectedIndex` is the tab to select when first rendered. By default - the first (index 0) tab will be selected. - - `forceRenderTabPanel` By default this react-tabs will only render the selected - tab's contents. Setting `forceRenderTabPanel` to `true` allows you to override the - default behavior, which may be useful in some circumstances (such as animating between tabs). - - */} - - - - {/* - is a composit component and is the container for the s. - */} - - - - {/* - is the actual tab component that users will interact with. - - Selecting a tab can be done by either clicking with the mouse, - or by using the keyboard tab to give focus then navigating with - the arrow keys (right/down to select tab to the right of selected, - left/up to select tab to the left of selected). - - The content of the (this.props.children) will be shown as the label. - */} - - Foo - Bar - Baz - - - {/* - is the content for the tab. - - There should be an equal number of and components. - and components are tied together by the order in - which they appear. The first (index 0) will be associated with - the of the same index. Running this example when - `selectedIndex` is 0 the tab with the label "Foo" will be selected - and the content shown will be "Hello from Foo". - - As with the content of will be shown as the content. - */} - - -

Hello from Foo

-
- -

Hello from Bar

-
- -

Hello from Baz

-
-
- ); - } -}); - -ReactDOM.render(, document.getElementById('container')); +import { Tab, Tabs, TabList, TabPanel } from 'react-tabs'; +import 'react-tabs/style/react-tabs.css'; + +export default () => ( + + + Title 1 + Title 2 + + + +

Any content 1

+
+ +

Any content 2

+
+
+); +``` + +## API + +## Components + +react-tabs consists of 4 components which all need to be used together. + +### <Tabs /> + +If you specify additional props on the `` component they will be forwarded to the rendered `
`. + +#### className: `string | Array | { [string]: boolean }` + +> default: `"react-tabs"` + +Provide a custom class name for the outer `
` of the tabs. + +> You can also supply an array of class names or an object where the class names are the key and the value is a boolean indicating if the name should be added. See the docs of [classnames](https://github.com/JedWatson/classnames#usage) on how to supply different class names. + +#### defaultFocus: `boolean` + +> default: `false` + +If set to `true` the tabs will be focused on initial render. This allows immediate use of keyboard keys to switch tabs after the first render. + +#### defaultIndex: `number` + +> default: `0` + +This allows changing the tab that should be open on initial render. This is a zero-based index, so first tab is `0`, second tab is `1`, ... + +> This can only be used in uncontrolled mode when react-tabs handles the current selected tab internally and for this reason cannot be used together with `selectedIndex`. See [here](#controlled-vs-uncontrolled-mode) for more info on modes. + +#### direction: `string` + +> default: `"ltr"` + +Provide the direction of the component, can be either rtl or ltr. + +#### disabledTabClassName: `string` + +> default: `"react-tabs__tab--disabled"` + +Provide a custom class name for disabled tabs. + +> This option can also be set directly at the `` component. + +#### disableUpDownKeys: `bool` + +> default: `false` + +Disable up & down arrow keys to change tabs. + +#### domRef: `(node: ?HTMLElement) => void` + +> default: `null` + +Register a callback that will receive the underlying DOM node for every mount. It will also receive null on unmount. + +#### environment: `Window` + +If you're rendering `react-tabs` within a different `window` context than the default one; for example, an iframe. + +#### focusTabOnClick: `boolean` + +> default: `true` + +By default the tab that is clicked will also be focused in the DOM. If set to `false` the tab will not be focused anymore. + +> Be aware that keyboard navigation will not work after click if set to false. Though one can still focus the tabs by pressing `tab` and then keyboard navigation will work. + +#### forceRenderTabPanel: `boolean` + +> default: `false` + +By default only the current active tab will be rendered to DOM. If set to `true` all tabs will be rendered to the DOM always. + +> This can also be enabled for each individual `` component with its prop `forceRender`. + +#### onSelect: `(index: number, lastIndex: number, event: Event) => ?boolean` + +> default: `undefined` + +This event handler is called every time a tab is about to change. It will be called with the `index` that it will be changed to, the `lastIndex` which was selected before and the underlying `event` which is usually either a `keydown` or `click` event. When `index` and `lastIndex` are equal it means the user clicked on the currently active tab. + +The callback can optionally return `false` to cancel the change to the new tab. + +> Returning `false` when the change to the new tab should be canceled is also important in controlled mode, as react-tabs still internally handles the focus of the tabs. + +> In controlled mode the `onSelect` handler is a required prop. + +#### selectedIndex: `number` + +> default: `null` + +Set the currently selected tab. This is a zero-based index, so first tab is `0`, second tab is `1`, ... + +This enables controlled mode, which also requires `onSelect` to be set. See [here](#controlled-vs-uncontrolled-mode) for more info on modes. + +#### selectedTabClassName: `string` + +> default: `"react-tabs__tab--selected"` + +Provide a custom class name for the active tab. + +> This option can also be set directly at the `` component. + +#### selectedTabPanelClassName: `string` + +> default: `"react-tabs__tab-panel--selected"` + +Provide a custom class name for the active tab panel. + +> This option can also be set directly at the `` component. + +### <TabList /> + +If you specify additional props on the `` component they will be forwarded to the rendered `
    `. + +#### className: `string | Array | { [string]: boolean }` + +> default: `"react-tabs__tab-list"` + +Provide a custom class name for the `
      `. + +> You can also supply an array of class names or an object where the class names are the key and the value is a boolean indicating if the name should be added. See the docs of [classnames](https://github.com/JedWatson/classnames#usage) on how to supply different class names. + +### <Tab /> + +If you specify additional props on the `` component they will be forwarded to the rendered `
    • `. + +#### className: `string | Array | { [string]: boolean }` + +> default: `"react-tabs__tab"` + +Provide a custom class name for the `
    • `. + +> You can also supply an array of class names or an object where the class names are the key and the value is a boolean indicating if the name should be added. See the docs of [classnames](https://github.com/JedWatson/classnames#usage) on how to supply different class names. + +#### disabled: `boolean` + +> default: `false` + +Disable this tab which will make it not do anything when clicked. Also a disabled class name will be added (see `disabledClassName`) + +#### disabledClassName: `string` + +> default: `"react-tabs__tab--disabled"` + +Provide a custom class name for disabled tabs. + +> This option can also be set for all `` components with the prop `disabledTabClassName` on ``. + +#### selectedClassName: `string` + +> default: `"react-tabs__tab--selected"` + +Provide a custom class name for the active tab. + +> This option can also be set for all `` components with the prop `selectedTabClassName` on ``. + +#### tabIndex: `string` + +> default: if selected `"0"` otherwise `null` + +Overrides the tabIndex to enabled tabbing between tabs. + +### <TabPanel /> + +If you specify additional props on the `` component they will be forwarded to the rendered `
      `. + +#### className: `string | Array | { [string]: boolean }` + +> default: `"react-tabs__tab-panel"` + +Provide a custom class name for the `
      ` containing the tab content. + +> You can also supply an array of class names or an object where the class names are the key and the value is a boolean indicating if the name should be added. See the docs of [classnames](https://github.com/JedWatson/classnames#usage) on how to supply different class names. + +#### forceRender: `boolean` + +> default: `false` + +By default the tab content will only be rendered when the tab is active. If set to `true` the tab will also be rendered if inactive. + +> This can also be enabled for all `` components with the prop `forceRenderTabPanel` on ``. + +#### selectedClassName: `string` + +> default: `"react-tabs__tab-panel--selected"` + +Provide a custom class name for the active tab panel. + +> This option can also be set for all `` components with the prop `selectedTabPanelClassName` on ``. + +## Controlled vs Uncontrolled mode + +React tabs has two different modes it can operate in, which change the way how much you need to take care about the state yourself. + +### Uncontrolled mode + +This is the default mode of react-tabs and makes the react-tabs components handle its state internally. You can change the starting tab with `defaultIndex` and you can listen for changes with `onSelect`. + +In this mode you cannot force a tab change during runtime. + +```js + console.log(index)}> + + Title 1 + Title 2 + + + + +``` + +### Controlled mode + +This mode has to be enabled by supplying `selectedIndex` to the `` component. + +In this mode react-tabs does not handle any tab selection state internally and leaves all the state management up to the outer application. + +This mode also enforces you to set a handler for `onSelect`. `defaultIndex` does not have any effect and will therefore throw an error. + +```js +const App = () => { + const [tabIndex, setTabIndex] = useState(0); + + return ( + setTabIndex(index)}> + + Title 1 + Title 2 + + + + + ); +}; +``` + +## Styling + +react-tabs does not include any style loading by default. Default stylesheets are provided and can be included in your application if desired. + +### Webpack + +When using webpack and an appropriate loader (`css-loader`, `sass-loader`, `less-loader` or `style-loader`) you can simply import the default stylesheet. + +```js +import 'react-tabs/style/react-tabs.css'; +// or +import 'react-tabs/style/react-tabs.scss'; +// or +import 'react-tabs/style/react-tabs.less'; +``` + +### SASS + +When using SASS you can easily import the default styles + +```scss +@import 'http://github.com/path/to/node_modules/react-tabs/style/react-tabs.scss'; +``` + +### LESS + +When using LESS you can easily import the default styles + +```scss +@import 'http://github.com/path/to/node_modules/react-tabs/style/react-tabs.less'; +``` + +### Custom Style + +You can also always just simply copy the default style to your own css/scss/less and modify it to your own needs. The changelog will always tell you when classes change and we also consider changes that break the styling as semver major. + +### Custom Components + +#### Set `tabsRole` + +In case you want to create your own component wrapping the ones that the library provides, you have to set its `tabsRole`. This value is used inside react-tabs to check the role of a component inside ``. + +Possible values for tabsRole are: + +- Tab +- TabPanel +- TabList +- Tabs + +#### Pass through properties + +Note: Because of how react-tabs works internally (it uses cloning to opaquely control various parts of the tab state), you need to pass any incoming props to the component you're wrapping. The easiest way to do this is to use the rest and spread operators, e.g. see `{...otherProps}` below. + +```tsx +import { Tabs, TabList, Tab, TabPanel } from 'react-tabs'; +import type { ReactTabsFunctionComponent, TabProps } from 'react-tabs'; + +// All custom elements should pass through other props +const CustomTab: ReactTabsFunctionComponent = ({ + children, + ...otherProps +}) => ( + +

      {children}

      +
      +); + +CustomTab.tabsRole = 'Tab'; // Required field to use your custom Tab +const App = () => ( + + + Custom Tab 1 + Custom Tab 2 + + Panel 1 + Panel 2 + +); ``` ## License diff --git a/bower.json b/bower.json deleted file mode 100644 index 745b94c51c..0000000000 --- a/bower.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "react-tabs", - "version": "0.5.3", - "homepage": "https://github.com/rackt/react-tabs", - "authors": [ - "Matt Zabriskie" - ], - "description": "React tabs component", - "main": "./dist/react-tabs.js", - "keywords": [ - "react", - "tabs" - ], - "license": "MIT", - "ignore": [ - "**/.*", - "build", - "examples", - "lib", - "src", - "node_modules", - "specs", - "package.json", - "webpack.*" - ] -} diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 0000000000..3e31ee1814 --- /dev/null +++ b/codecov.yml @@ -0,0 +1,4 @@ +coverage: + parsers: + javascript: + enable_partials: yes diff --git a/dist/react-tabs.js b/dist/react-tabs.js deleted file mode 100644 index ae97cb8041..0000000000 --- a/dist/react-tabs.js +++ /dev/null @@ -1,980 +0,0 @@ -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(require("React"), require("ReactDOM")); - else if(typeof define === 'function' && define.amd) - define(["React", "ReactDOM"], factory); - else if(typeof exports === 'object') - exports["ReactTabs"] = factory(require("React"), require("ReactDOM")); - else - root["ReactTabs"] = factory(root["React"], root["ReactDOM"]); -})(this, function(__WEBPACK_EXTERNAL_MODULE_2__, __WEBPACK_EXTERNAL_MODULE_3__) { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) -/******/ return installedModules[moduleId].exports; -/******/ -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ exports: {}, -/******/ id: moduleId, -/******/ loaded: false -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.loaded = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.TabPanel = exports.Tab = exports.TabList = exports.Tabs = undefined; - - var _Tabs = __webpack_require__(1); - - var _Tabs2 = _interopRequireDefault(_Tabs); - - var _TabList = __webpack_require__(9); - - var _TabList2 = _interopRequireDefault(_TabList); - - var _Tab = __webpack_require__(8); - - var _Tab2 = _interopRequireDefault(_Tab); - - var _TabPanel = __webpack_require__(11); - - var _TabPanel2 = _interopRequireDefault(_TabPanel); - - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { default: obj }; - } - - exports.Tabs = - - // For bc we also export a default object, remove in 1.0 - _Tabs2.default; - exports.TabList = _TabList2.default; - exports.Tab = _Tab2.default; - exports.TabPanel = _TabPanel2.default; - exports.default = { - Tabs: _Tabs2.default, - TabList: _TabList2.default, - Tab: _Tab2.default, - TabPanel: _TabPanel2.default - }; - -/***/ }, -/* 1 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _extends = Object.assign || function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i];for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - }return target; - }; - - var _react = __webpack_require__(2); - - var _react2 = _interopRequireDefault(_react); - - var _reactDom = __webpack_require__(3); - - var _classnames = __webpack_require__(4); - - var _classnames2 = _interopRequireDefault(_classnames); - - var _jsStylesheet = __webpack_require__(5); - - var _jsStylesheet2 = _interopRequireDefault(_jsStylesheet); - - var _uuid = __webpack_require__(6); - - var _uuid2 = _interopRequireDefault(_uuid); - - var _childrenPropType = __webpack_require__(7); - - var _childrenPropType2 = _interopRequireDefault(_childrenPropType); - - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { default: obj }; - } - - function _objectWithoutProperties(obj, keys) { - var target = {};for (var i in obj) { - if (keys.indexOf(i) >= 0) continue;if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;target[i] = obj[i]; - }return target; - } - - // Determine if a node from event.target is a Tab element - function isTabNode(node) { - return node.nodeName === 'LI' && node.getAttribute('role') === 'tab'; - } - - // Determine if a tab node is disabled - function isTabDisabled(node) { - return node.getAttribute('aria-disabled') === 'true'; - } - - var useDefaultStyles = true; - - module.exports = _react2.default.createClass({ - displayName: 'Tabs', - - propTypes: { - className: _react.PropTypes.string, - selectedIndex: _react.PropTypes.number, - onSelect: _react.PropTypes.func, - focus: _react.PropTypes.bool, - children: _childrenPropType2.default, - forceRenderTabPanel: _react.PropTypes.bool - }, - - childContextTypes: { - forceRenderTabPanel: _react.PropTypes.bool - }, - - statics: { - setUseDefaultStyles: function setUseDefaultStyles(use) { - useDefaultStyles = use; - } - }, - - getDefaultProps: function getDefaultProps() { - return { - selectedIndex: -1, - focus: false, - forceRenderTabPanel: false - }; - }, - getInitialState: function getInitialState() { - return this.copyPropsToState(this.props); - }, - getChildContext: function getChildContext() { - return { - forceRenderTabPanel: this.props.forceRenderTabPanel - }; - }, - componentDidMount: function componentDidMount() { - if (useDefaultStyles) { - (0, _jsStylesheet2.default)(__webpack_require__(10)); // eslint-disable-line global-require - } - }, - componentWillReceiveProps: function componentWillReceiveProps(newProps) { - this.setState(this.copyPropsToState(newProps)); - }, - setSelected: function setSelected(index, focus) { - // Don't do anything if nothing has changed - if (index === this.state.selectedIndex) return; - // Check index boundary - if (index < 0 || index >= this.getTabsCount()) return; - - // Keep reference to last index for event handler - var last = this.state.selectedIndex; - - // Update selected index - this.setState({ selectedIndex: index, focus: focus === true }); - - // Call change event handler - if (typeof this.props.onSelect === 'function') { - this.props.onSelect(index, last); - } - }, - getNextTab: function getNextTab(index) { - var count = this.getTabsCount(); - - // Look for non-disabled tab from index to the last tab on the right - for (var i = index + 1; i < count; i++) { - var tab = this.getTab(i); - if (!isTabDisabled((0, _reactDom.findDOMNode)(tab))) { - return i; - } - } - - // If no tab found, continue searching from first on left to index - for (var _i = 0; _i < index; _i++) { - var _tab = this.getTab(_i); - if (!isTabDisabled((0, _reactDom.findDOMNode)(_tab))) { - return _i; - } - } - - // No tabs are disabled, return index - return index; - }, - getPrevTab: function getPrevTab(index) { - var i = index; - - // Look for non-disabled tab from index to first tab on the left - while (i--) { - var tab = this.getTab(i); - if (!isTabDisabled((0, _reactDom.findDOMNode)(tab))) { - return i; - } - } - - // If no tab found, continue searching from last tab on right to index - i = this.getTabsCount(); - while (i-- > index) { - var _tab2 = this.getTab(i); - if (!isTabDisabled((0, _reactDom.findDOMNode)(_tab2))) { - return i; - } - } - - // No tabs are disabled, return index - return index; - }, - getTabsCount: function getTabsCount() { - return this.props.children && this.props.children[0] ? _react2.default.Children.count(this.props.children[0].props.children) : 0; - }, - getPanelsCount: function getPanelsCount() { - return _react2.default.Children.count(this.props.children.slice(1)); - }, - getTabList: function getTabList() { - return this.refs.tablist; - }, - getTab: function getTab(index) { - return this.refs['tabs-' + index]; - }, - getPanel: function getPanel(index) { - return this.refs['panels-' + index]; - }, - getChildren: function getChildren() { - var index = 0; - var count = 0; - var children = this.props.children; - var state = this.state; - var tabIds = this.tabIds = this.tabIds || []; - var panelIds = this.panelIds = this.panelIds || []; - var diff = this.tabIds.length - this.getTabsCount(); - - // Add ids if new tabs have been added - // Don't bother removing ids, just keep them in case they are added again - // This is more efficient, and keeps the uuid counter under control - while (diff++ < 0) { - tabIds.push((0, _uuid2.default)()); - panelIds.push((0, _uuid2.default)()); - } - - // Map children to dynamically setup refs - return _react2.default.Children.map(children, function (child) { - // null happens when conditionally rendering TabPanel/Tab - // see https://github.com/rackt/react-tabs/issues/37 - if (child === null) { - return null; - } - - var result = null; - - // Clone TabList and Tab components to have refs - if (count++ === 0) { - // TODO try setting the uuid in the "constructor" for `Tab`/`TabPanel` - result = (0, _react.cloneElement)(child, { - ref: 'tablist', - children: _react2.default.Children.map(child.props.children, function (tab) { - // null happens when conditionally rendering TabPanel/Tab - // see https://github.com/rackt/react-tabs/issues/37 - if (tab === null) { - return null; - } - - var ref = 'tabs-' + index; - var id = tabIds[index]; - var panelId = panelIds[index]; - var selected = state.selectedIndex === index; - var focus = selected && state.focus; - - index++; - - return (0, _react.cloneElement)(tab, { - ref: ref, - id: id, - panelId: panelId, - selected: selected, - focus: focus - }); - }) - }); - - // Reset index for panels - index = 0; - } - // Clone TabPanel components to have refs - else { - var ref = 'panels-' + index; - var id = panelIds[index]; - var tabId = tabIds[index]; - var selected = state.selectedIndex === index; - - index++; - - result = (0, _react.cloneElement)(child, { - ref: ref, - id: id, - tabId: tabId, - selected: selected - }); - } - - return result; - }); - }, - handleKeyDown: function handleKeyDown(e) { - if (this.isTabFromContainer(e.target)) { - var index = this.state.selectedIndex; - var preventDefault = false; - - // Select next tab to the left - if (e.keyCode === 37 || e.keyCode === 38) { - index = this.getPrevTab(index); - preventDefault = true; - } - // Select next tab to the right - /* eslint brace-style:0 */ - else if (e.keyCode === 39 || e.keyCode === 40) { - index = this.getNextTab(index); - preventDefault = true; - } - - // This prevents scrollbars from moving around - if (preventDefault) { - e.preventDefault(); - } - - this.setSelected(index, true); - } - }, - handleClick: function handleClick(e) { - var node = e.target; - do { - // eslint-disable-line no-cond-assign - if (this.isTabFromContainer(node)) { - if (isTabDisabled(node)) { - return; - } - - var index = [].slice.call(node.parentNode.children).indexOf(node); - this.setSelected(index); - return; - } - } while ((node = node.parentNode) !== null); - }, - - // This is an anti-pattern, so sue me - copyPropsToState: function copyPropsToState(props) { - var selectedIndex = props.selectedIndex; - - // If no selectedIndex prop was supplied, then try - // preserving the existing selectedIndex from state. - // If the state has not selectedIndex, default - // to the first tab in the TabList. - // - // TODO: Need automation testing around this - // Manual testing can be done using examples/focus - // See 'should preserve selectedIndex when typing' in specs/Tabs.spec.js - if (selectedIndex === -1) { - if (this.state && this.state.selectedIndex) { - selectedIndex = this.state.selectedIndex; - } else { - selectedIndex = 0; - } - } - - return { - selectedIndex: selectedIndex, - focus: props.focus - }; - }, - - /** - * Determine if a node from event.target is a Tab element for the current Tabs container. - * If the clicked element is not a Tab, it returns false. - * If it finds another Tabs container between the Tab and `this`, it returns false. - */ - isTabFromContainer: function isTabFromContainer(node) { - // return immediately if the clicked element is not a Tab. - if (!isTabNode(node)) { - return false; - } - - // Check if the first occurrence of a Tabs container is `this` one. - var nodeAncestor = node.parentElement; - var tabsNode = (0, _reactDom.findDOMNode)(this); - do { - if (nodeAncestor === tabsNode) return true;else if (nodeAncestor.getAttribute('data-tabs')) break; - - nodeAncestor = nodeAncestor.parentElement; - } while (nodeAncestor); - - return false; - }, - render: function render() { - var _this = this; - - // This fixes an issue with focus management. - // - // Ultimately, when focus is true, and an input has focus, - // and any change on that input causes a state change/re-render, - // focus gets sent back to the active tab, and input loses focus. - // - // Since the focus state only needs to be remembered - // for the current render, we can reset it once the - // render has happened. - // - // Don't use setState, because we don't want to re-render. - // - // See https://github.com/rackt/react-tabs/pull/7 - if (this.state.focus) { - setTimeout(function () { - _this.state.focus = false; - }, 0); - } - - var _props = this.props; - var className = _props.className; - - var attributes = _objectWithoutProperties(_props, ['className']); - - // Delete all known props, so they don't get added to DOM - - delete attributes.selectedIndex; - delete attributes.onSelect; - delete attributes.focus; - delete attributes.children; - delete attributes.forceRenderTabPanel; - delete attributes.onClick; - delete attributes.onKeyDown; - - return _react2.default.createElement('div', _extends({}, attributes, { - className: (0, _classnames2.default)('ReactTabs', 'react-tabs', className), - onClick: this.handleClick, - onKeyDown: this.handleKeyDown, - 'data-tabs': true - }), this.getChildren()); - } - }); - -/***/ }, -/* 2 */ -/***/ function(module, exports) { - - module.exports = __WEBPACK_EXTERNAL_MODULE_2__; - -/***/ }, -/* 3 */ -/***/ function(module, exports) { - - module.exports = __WEBPACK_EXTERNAL_MODULE_3__; - -/***/ }, -/* 4 */ -/***/ function(module, exports, __webpack_require__) { - - var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! - Copyright (c) 2016 Jed Watson. - Licensed under the MIT License (MIT), see - http://jedwatson.github.io/classnames - */ - /* global define */ - - (function () { - 'use strict'; - - var hasOwn = {}.hasOwnProperty; - - function classNames () { - var classes = []; - - for (var i = 0; i < arguments.length; i++) { - var arg = arguments[i]; - if (!arg) continue; - - var argType = typeof arg; - - if (argType === 'string' || argType === 'number') { - classes.push(arg); - } else if (Array.isArray(arg)) { - classes.push(classNames.apply(null, arg)); - } else if (argType === 'object') { - for (var key in arg) { - if (hasOwn.call(arg, key) && arg[key]) { - classes.push(key); - } - } - } - } - - return classes.join(' '); - } - - if (typeof module !== 'undefined' && module.exports) { - module.exports = classNames; - } else if (true) { - // register as 'classnames', consistent with npm package name - !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function () { - return classNames; - }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); - } else { - window.classNames = classNames; - } - }()); - - -/***/ }, -/* 5 */ -/***/ function(module, exports, __webpack_require__) { - - !(function() { - function jss(blocks) { - var css = []; - for (var block in blocks) - css.push(createStyleBlock(block, blocks[block])); - injectCSS(css); - } - - function createStyleBlock(selector, rules) { - return selector + ' {\n' + parseRules(rules) + '\n}'; - } - - function parseRules(rules) { - var css = []; - for (var rule in rules) - css.push(' '+rule+': '+rules[rule]+';'); - return css.join('\n'); - } - - function injectCSS(css) { - var style = document.getElementById('jss-styles'); - if (!style) { - style = document.createElement('style'); - style.setAttribute('id', 'jss-styles'); - var head = document.getElementsByTagName('head')[0]; - head.insertBefore(style, head.firstChild); - } - var node = document.createTextNode(css.join('\n\n')); - style.appendChild(node); - } - - if (true) - module.exports = jss; - else - window.jss = jss; - - })(); - - - -/***/ }, -/* 6 */ -/***/ function(module, exports) { - - "use strict"; - - // Get a universally unique identifier - - var count = 0; - module.exports = function uuid() { - return "react-tabs-" + count++; - }; - -/***/ }, -/* 7 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _react = __webpack_require__(2); - - var _react2 = _interopRequireDefault(_react); - - var _Tab = __webpack_require__(8); - - var _Tab2 = _interopRequireDefault(_Tab); - - var _TabList = __webpack_require__(9); - - var _TabList2 = _interopRequireDefault(_TabList); - - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { default: obj }; - } - - module.exports = function childrenPropTypes(props, propName) { - var error = void 0; - var tabsCount = 0; - var panelsCount = 0; - var children = props[propName]; - - _react2.default.Children.forEach(children, function (child) { - // null happens when conditionally rendering TabPanel/Tab - // see https://github.com/rackt/react-tabs/issues/37 - if (child === null) { - return; - } - - if (child.type === _TabList2.default) { - _react2.default.Children.forEach(child.props.children, function (c) { - // null happens when conditionally rendering TabPanel/Tab - // see https://github.com/rackt/react-tabs/issues/37 - if (c === null) { - return; - } - - if (c.type === _Tab2.default) { - tabsCount++; - } else { - error = new Error('Expected \'Tab\' but found \'' + (c.type.displayName || c.type) + '\''); - } - }); - } else if (child.type.displayName === 'TabPanel') { - panelsCount++; - } else { - error = new Error('Expected \'TabList\' or \'TabPanel\' but found \'' + (child.type.displayName || child.type) + '\''); - } - }); - - if (tabsCount !== panelsCount) { - error = new Error("There should be an equal number of 'Tabs' and 'TabPanels'." + ('Received ' + tabsCount + ' \'Tabs\' and ' + panelsCount + ' \'TabPanels\'.')); - } - - return error; - }; - -/***/ }, -/* 8 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _extends = Object.assign || function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i];for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - }return target; - }; - - var _react = __webpack_require__(2); - - var _react2 = _interopRequireDefault(_react); - - var _reactDom = __webpack_require__(3); - - var _classnames = __webpack_require__(4); - - var _classnames2 = _interopRequireDefault(_classnames); - - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { default: obj }; - } - - function _objectWithoutProperties(obj, keys) { - var target = {};for (var i in obj) { - if (keys.indexOf(i) >= 0) continue;if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;target[i] = obj[i]; - }return target; - } - - function syncNodeAttributes(node, props) { - if (props.selected) { - node.setAttribute('tabindex', '0'); - node.setAttribute('selected', 'selected'); - if (props.focus) { - node.focus(); - } - } else { - node.removeAttribute('tabindex'); - node.removeAttribute('selected'); - } - } - - module.exports = _react2.default.createClass({ - displayName: 'Tab', - - propTypes: { - className: _react.PropTypes.string, - id: _react.PropTypes.string, - selected: _react.PropTypes.bool, - disabled: _react.PropTypes.bool, - panelId: _react.PropTypes.string, - children: _react.PropTypes.oneOfType([_react.PropTypes.array, _react.PropTypes.object, _react.PropTypes.string]) - }, - - getDefaultProps: function getDefaultProps() { - return { - focus: false, - selected: false, - id: null, - panelId: null - }; - }, - componentDidMount: function componentDidMount() { - syncNodeAttributes((0, _reactDom.findDOMNode)(this), this.props); - }, - componentDidUpdate: function componentDidUpdate() { - syncNodeAttributes((0, _reactDom.findDOMNode)(this), this.props); - }, - render: function render() { - var _props = this.props; - var selected = _props.selected; - var disabled = _props.disabled; - var panelId = _props.panelId; - var className = _props.className; - var children = _props.children; - var id = _props.id; - - var attributes = _objectWithoutProperties(_props, ['selected', 'disabled', 'panelId', 'className', 'children', 'id']); - - return _react2.default.createElement('li', _extends({}, attributes, { - className: (0, _classnames2.default)('ReactTabs__Tab', className, { - 'ReactTabs__Tab--selected': selected, - 'ReactTabs__Tab--disabled': disabled - }), - role: 'tab', - id: id, - 'aria-selected': selected ? 'true' : 'false', - 'aria-expanded': selected ? 'true' : 'false', - 'aria-disabled': disabled ? 'true' : 'false', - 'aria-controls': panelId - }), children); - } - }); - -/***/ }, -/* 9 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _extends = Object.assign || function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i];for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - }return target; - }; - - var _react = __webpack_require__(2); - - var _react2 = _interopRequireDefault(_react); - - var _classnames = __webpack_require__(4); - - var _classnames2 = _interopRequireDefault(_classnames); - - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { default: obj }; - } - - function _objectWithoutProperties(obj, keys) { - var target = {};for (var i in obj) { - if (keys.indexOf(i) >= 0) continue;if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;target[i] = obj[i]; - }return target; - } - - module.exports = _react2.default.createClass({ - displayName: 'TabList', - - propTypes: { - className: _react.PropTypes.string, - children: _react.PropTypes.oneOfType([_react.PropTypes.object, _react.PropTypes.array]) - }, - - render: function render() { - var _props = this.props; - var className = _props.className; - var children = _props.children; - - var attributes = _objectWithoutProperties(_props, ['className', 'children']); - - return _react2.default.createElement('ul', _extends({}, attributes, { - className: (0, _classnames2.default)('ReactTabs__TabList', className), - role: 'tablist' - }), children); - } - }); - -/***/ }, -/* 10 */ -/***/ function(module, exports) { - - 'use strict'; - - module.exports = { - '.react-tabs [role=tablist]': { - 'border-bottom': '1px solid #aaa', - margin: '0 0 10px', - padding: '0' - }, - - '.react-tabs [role=tab]': { - display: 'inline-block', - border: '1px solid transparent', - 'border-bottom': 'none', - bottom: '-1px', - position: 'relative', - 'list-style': 'none', - padding: '6px 12px', - cursor: 'pointer' - }, - - '.react-tabs [role=tab][aria-selected=true]': { - background: '#fff', - 'border-color': '#aaa', - color: 'black', - 'border-radius': '5px 5px 0 0', - '-moz-border-radius': '5px 5px 0 0', - '-webkit-border-radius': '5px 5px 0 0' - }, - - '.react-tabs [role=tab][aria-disabled=true]': { - color: 'GrayText', - cursor: 'default' - }, - - '.react-tabs [role=tab]:focus': { - 'box-shadow': '0 0 5px hsl(208, 99%, 50%)', - 'border-color': 'hsl(208, 99%, 50%)', - outline: 'none' - }, - - '.react-tabs [role=tab]:focus:after': { - content: '""', - position: 'absolute', - height: '5px', - left: '-4px', - right: '-4px', - bottom: '-5px', - background: '#fff' - } - }; - -/***/ }, -/* 11 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _extends = Object.assign || function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i];for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - }return target; - }; - - var _react = __webpack_require__(2); - - var _react2 = _interopRequireDefault(_react); - - var _classnames = __webpack_require__(4); - - var _classnames2 = _interopRequireDefault(_classnames); - - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { default: obj }; - } - - function _objectWithoutProperties(obj, keys) { - var target = {};for (var i in obj) { - if (keys.indexOf(i) >= 0) continue;if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;target[i] = obj[i]; - }return target; - } - - module.exports = _react2.default.createClass({ - displayName: 'TabPanel', - - propTypes: { - className: _react.PropTypes.string, - selected: _react.PropTypes.bool, - id: _react.PropTypes.string, - tabId: _react.PropTypes.string, - children: _react.PropTypes.oneOfType([_react.PropTypes.array, _react.PropTypes.object, _react.PropTypes.string]) - }, - - contextTypes: { - forceRenderTabPanel: _react.PropTypes.bool - }, - - getDefaultProps: function getDefaultProps() { - return { - selected: false, - id: null, - tabId: null - }; - }, - render: function render() { - var _props = this.props; - var className = _props.className; - var children = _props.children; - var selected = _props.selected; - var id = _props.id; - var tabId = _props.tabId; - - var attributes = _objectWithoutProperties(_props, ['className', 'children', 'selected', 'id', 'tabId']); - - // Merge style - - var style = _extends({}, attributes.style, { display: selected ? null : 'none' }); - delete attributes.style; - - return _react2.default.createElement('div', _extends({}, attributes, { - className: (0, _classnames2.default)('ReactTabs__TabPanel', className, { - 'ReactTabs__TabPanel--selected': selected - }), - role: 'tabpanel', - id: id, - 'aria-labelledby': tabId, - style: style - }), this.context.forceRenderTabPanel || selected ? children : null); - } - }); - -/***/ } -/******/ ]) -}); -; -//# sourceMappingURL=react-tabs.js.map \ No newline at end of file diff --git a/dist/react-tabs.js.map b/dist/react-tabs.js.map deleted file mode 100644 index 44e227663a..0000000000 --- a/dist/react-tabs.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 7b362e42f859525ab4b5","webpack:///./lib/main.js","webpack:///./lib/components/Tabs.js","webpack:///external \"React\"","webpack:///external \"ReactDOM\"","webpack:///./~/classnames/index.js","webpack:///./~/js-stylesheet/jss.js","webpack:///./lib/helpers/uuid.js","webpack:///./lib/helpers/childrenPropType.js","webpack:///./lib/components/Tab.js","webpack:///./lib/components/TabList.js","webpack:///./lib/helpers/styles.js","webpack:///./lib/components/TabPanel.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;ACVA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtCA;;AAEA,QAAO,cAAP,CAAsB,OAAtB,EAA+B,YAA/B,EAA6C;AAC3C,UAAO;AADoC,EAA7C;AAGA,SAAQ,QAAR,GAAmB,QAAQ,GAAR,GAAc,QAAQ,OAAR,GAAkB,QAAQ,IAAR,GAAe,SAAlE;;AAEA,KAAI,QAAQ,oBAAQ,CAAR,CAAZ;;AAEA,KAAI,SAAS,uBAAuB,KAAvB,CAAb;;AAEA,KAAI,WAAW,oBAAQ,CAAR,CAAf;;AAEA,KAAI,YAAY,uBAAuB,QAAvB,CAAhB;;AAEA,KAAI,OAAO,oBAAQ,CAAR,CAAX;;AAEA,KAAI,QAAQ,uBAAuB,IAAvB,CAAZ;;AAEA,KAAI,YAAY,oBAAQ,EAAR,CAAhB;;AAEA,KAAI,aAAa,uBAAuB,SAAvB,CAAjB;;AAEA,UAAS,sBAAT,CAAgC,GAAhC,EAAqC;AAAE,UAAO,OAAO,IAAI,UAAX,GAAwB,GAAxB,GAA8B,EAAE,SAAS,GAAX,EAArC;AAAwD;;AAE/F,SAAQ,IAAR;;;AAGA,QAAO,OAHP;AAIA,SAAQ,OAAR,GAAkB,UAAU,OAA5B;AACA,SAAQ,GAAR,GAAc,MAAM,OAApB;AACA,SAAQ,QAAR,GAAmB,WAAW,OAA9B;AACA,SAAQ,OAAR,GAAkB;AAChB,SAAM,OAAO,OADG;AAEhB,YAAS,UAAU,OAFH;AAGhB,QAAK,MAAM,OAHK;AAIhB,aAAU,WAAW;AAJL,EAAlB,C;;;;;;AChCA;;AAEA,KAAI,WAAW,OAAO,MAAP,IAAiB,UAAU,MAAV,EAAkB;AAAE,QAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AAAE,SAAI,SAAS,UAAU,CAAV,CAAb,CAA2B,KAAK,IAAI,GAAT,IAAgB,MAAhB,EAAwB;AAAE,WAAI,OAAO,SAAP,CAAiB,cAAjB,CAAgC,IAAhC,CAAqC,MAArC,EAA6C,GAA7C,CAAJ,EAAuD;AAAE,gBAAO,GAAP,IAAc,OAAO,GAAP,CAAd;AAA4B;AAAE;AAAE,IAAC,OAAO,MAAP;AAAgB,EAAhQ;;AAEA,KAAI,SAAS,oBAAQ,CAAR,CAAb;;AAEA,KAAI,UAAU,uBAAuB,MAAvB,CAAd;;AAEA,KAAI,YAAY,oBAAQ,CAAR,CAAhB;;AAEA,KAAI,cAAc,oBAAQ,CAAR,CAAlB;;AAEA,KAAI,eAAe,uBAAuB,WAAvB,CAAnB;;AAEA,KAAI,gBAAgB,oBAAQ,CAAR,CAApB;;AAEA,KAAI,iBAAiB,uBAAuB,aAAvB,CAArB;;AAEA,KAAI,QAAQ,oBAAQ,CAAR,CAAZ;;AAEA,KAAI,SAAS,uBAAuB,KAAvB,CAAb;;AAEA,KAAI,oBAAoB,oBAAQ,CAAR,CAAxB;;AAEA,KAAI,qBAAqB,uBAAuB,iBAAvB,CAAzB;;AAEA,UAAS,sBAAT,CAAgC,GAAhC,EAAqC;AAAE,UAAO,OAAO,IAAI,UAAX,GAAwB,GAAxB,GAA8B,EAAE,SAAS,GAAX,EAArC;AAAwD;;AAE/F,UAAS,wBAAT,CAAkC,GAAlC,EAAuC,IAAvC,EAA6C;AAAE,OAAI,SAAS,EAAb,CAAiB,KAAK,IAAI,CAAT,IAAc,GAAd,EAAmB;AAAE,SAAI,KAAK,OAAL,CAAa,CAAb,KAAmB,CAAvB,EAA0B,SAAU,IAAI,CAAC,OAAO,SAAP,CAAiB,cAAjB,CAAgC,IAAhC,CAAqC,GAArC,EAA0C,CAA1C,CAAL,EAAmD,SAAU,OAAO,CAAP,IAAY,IAAI,CAAJ,CAAZ;AAAqB,IAAC,OAAO,MAAP;AAAgB;;;AAG5N,UAAS,SAAT,CAAmB,IAAnB,EAAyB;AACvB,UAAO,KAAK,QAAL,KAAkB,IAAlB,IAA0B,KAAK,YAAL,CAAkB,MAAlB,MAA8B,KAA/D;AACD;;;AAGD,UAAS,aAAT,CAAuB,IAAvB,EAA6B;AAC3B,UAAO,KAAK,YAAL,CAAkB,eAAlB,MAAuC,MAA9C;AACD;;AAED,KAAI,mBAAmB,IAAvB;;AAEA,QAAO,OAAP,GAAiB,QAAQ,OAAR,CAAgB,WAAhB,CAA4B;AAC3C,gBAAa,MAD8B;;AAG3C,cAAW;AACT,gBAAW,OAAO,SAAP,CAAiB,MADnB;AAET,oBAAe,OAAO,SAAP,CAAiB,MAFvB;AAGT,eAAU,OAAO,SAAP,CAAiB,IAHlB;AAIT,YAAO,OAAO,SAAP,CAAiB,IAJf;AAKT,eAAU,mBAAmB,OALpB;AAMT,0BAAqB,OAAO,SAAP,CAAiB;AAN7B,IAHgC;;AAY3C,sBAAmB;AACjB,0BAAqB,OAAO,SAAP,CAAiB;AADrB,IAZwB;;AAgB3C,YAAS;AACP,0BAAqB,SAAS,mBAAT,CAA6B,GAA7B,EAAkC;AACrD,0BAAmB,GAAnB;AACD;AAHM,IAhBkC;;AAsB3C,oBAAiB,SAAS,eAAT,GAA2B;AAC1C,YAAO;AACL,sBAAe,CAAC,CADX;AAEL,cAAO,KAFF;AAGL,4BAAqB;AAHhB,MAAP;AAKD,IA5B0C;AA6B3C,oBAAiB,SAAS,eAAT,GAA2B;AAC1C,YAAO,KAAK,gBAAL,CAAsB,KAAK,KAA3B,CAAP;AACD,IA/B0C;AAgC3C,oBAAiB,SAAS,eAAT,GAA2B;AAC1C,YAAO;AACL,4BAAqB,KAAK,KAAL,CAAW;AAD3B,MAAP;AAGD,IApC0C;AAqC3C,sBAAmB,SAAS,iBAAT,GAA6B;AAC9C,SAAI,gBAAJ,EAAsB;AACpB,QAAC,GAAG,eAAe,OAAnB,EAA4B,oBAAQ,EAAR,CAA5B,E;AACD;AACF,IAzC0C;AA0C3C,8BAA2B,SAAS,yBAAT,CAAmC,QAAnC,EAA6C;AACtE,UAAK,QAAL,CAAc,KAAK,gBAAL,CAAsB,QAAtB,CAAd;AACD,IA5C0C;AA6C3C,gBAAa,SAAS,WAAT,CAAqB,KAArB,EAA4B,KAA5B,EAAmC;;AAE9C,SAAI,UAAU,KAAK,KAAL,CAAW,aAAzB,EAAwC;;AAExC,SAAI,QAAQ,CAAR,IAAa,SAAS,KAAK,YAAL,EAA1B,EAA+C;;;AAG/C,SAAI,OAAO,KAAK,KAAL,CAAW,aAAtB;;;AAGA,UAAK,QAAL,CAAc,EAAE,eAAe,KAAjB,EAAwB,OAAO,UAAU,IAAzC,EAAd;;;AAGA,SAAI,OAAO,KAAK,KAAL,CAAW,QAAlB,KAA+B,UAAnC,EAA+C;AAC7C,YAAK,KAAL,CAAW,QAAX,CAAoB,KAApB,EAA2B,IAA3B;AACD;AACF,IA7D0C;AA8D3C,eAAY,SAAS,UAAT,CAAoB,KAApB,EAA2B;AACrC,SAAI,QAAQ,KAAK,YAAL,EAAZ;;;AAGA,UAAK,IAAI,IAAI,QAAQ,CAArB,EAAwB,IAAI,KAA5B,EAAmC,GAAnC,EAAwC;AACtC,WAAI,MAAM,KAAK,MAAL,CAAY,CAAZ,CAAV;AACA,WAAI,CAAC,cAAc,CAAC,GAAG,UAAU,WAAd,EAA2B,GAA3B,CAAd,CAAL,EAAqD;AACnD,gBAAO,CAAP;AACD;AACF;;;AAGD,UAAK,IAAI,KAAK,CAAd,EAAiB,KAAK,KAAtB,EAA6B,IAA7B,EAAmC;AACjC,WAAI,OAAO,KAAK,MAAL,CAAY,EAAZ,CAAX;AACA,WAAI,CAAC,cAAc,CAAC,GAAG,UAAU,WAAd,EAA2B,IAA3B,CAAd,CAAL,EAAsD;AACpD,gBAAO,EAAP;AACD;AACF;;;AAGD,YAAO,KAAP;AACD,IAnF0C;AAoF3C,eAAY,SAAS,UAAT,CAAoB,KAApB,EAA2B;AACrC,SAAI,IAAI,KAAR;;;AAGA,YAAO,GAAP,EAAY;AACV,WAAI,MAAM,KAAK,MAAL,CAAY,CAAZ,CAAV;AACA,WAAI,CAAC,cAAc,CAAC,GAAG,UAAU,WAAd,EAA2B,GAA3B,CAAd,CAAL,EAAqD;AACnD,gBAAO,CAAP;AACD;AACF;;;AAGD,SAAI,KAAK,YAAL,EAAJ;AACA,YAAO,MAAM,KAAb,EAAoB;AAClB,WAAI,QAAQ,KAAK,MAAL,CAAY,CAAZ,CAAZ;AACA,WAAI,CAAC,cAAc,CAAC,GAAG,UAAU,WAAd,EAA2B,KAA3B,CAAd,CAAL,EAAuD;AACrD,gBAAO,CAAP;AACD;AACF;;;AAGD,YAAO,KAAP;AACD,IA1G0C;AA2G3C,iBAAc,SAAS,YAAT,GAAwB;AACpC,YAAO,KAAK,KAAL,CAAW,QAAX,IAAuB,KAAK,KAAL,CAAW,QAAX,CAAoB,CAApB,CAAvB,GAAgD,QAAQ,OAAR,CAAgB,QAAhB,CAAyB,KAAzB,CAA+B,KAAK,KAAL,CAAW,QAAX,CAAoB,CAApB,EAAuB,KAAvB,CAA6B,QAA5D,CAAhD,GAAwH,CAA/H;AACD,IA7G0C;AA8G3C,mBAAgB,SAAS,cAAT,GAA0B;AACxC,YAAO,QAAQ,OAAR,CAAgB,QAAhB,CAAyB,KAAzB,CAA+B,KAAK,KAAL,CAAW,QAAX,CAAoB,KAApB,CAA0B,CAA1B,CAA/B,CAAP;AACD,IAhH0C;AAiH3C,eAAY,SAAS,UAAT,GAAsB;AAChC,YAAO,KAAK,IAAL,CAAU,OAAjB;AACD,IAnH0C;AAoH3C,WAAQ,SAAS,MAAT,CAAgB,KAAhB,EAAuB;AAC7B,YAAO,KAAK,IAAL,CAAU,UAAU,KAApB,CAAP;AACD,IAtH0C;AAuH3C,aAAU,SAAS,QAAT,CAAkB,KAAlB,EAAyB;AACjC,YAAO,KAAK,IAAL,CAAU,YAAY,KAAtB,CAAP;AACD,IAzH0C;AA0H3C,gBAAa,SAAS,WAAT,GAAuB;AAClC,SAAI,QAAQ,CAAZ;AACA,SAAI,QAAQ,CAAZ;AACA,SAAI,WAAW,KAAK,KAAL,CAAW,QAA1B;AACA,SAAI,QAAQ,KAAK,KAAjB;AACA,SAAI,SAAS,KAAK,MAAL,GAAc,KAAK,MAAL,IAAe,EAA1C;AACA,SAAI,WAAW,KAAK,QAAL,GAAgB,KAAK,QAAL,IAAiB,EAAhD;AACA,SAAI,OAAO,KAAK,MAAL,CAAY,MAAZ,GAAqB,KAAK,YAAL,EAAhC;;;;;AAKA,YAAO,SAAS,CAAhB,EAAmB;AACjB,cAAO,IAAP,CAAY,CAAC,GAAG,OAAO,OAAX,GAAZ;AACA,gBAAS,IAAT,CAAc,CAAC,GAAG,OAAO,OAAX,GAAd;AACD;;;AAGD,YAAO,QAAQ,OAAR,CAAgB,QAAhB,CAAyB,GAAzB,CAA6B,QAA7B,EAAuC,UAAU,KAAV,EAAiB;;;AAG7D,WAAI,UAAU,IAAd,EAAoB;AAClB,gBAAO,IAAP;AACD;;AAED,WAAI,SAAS,IAAb;;;AAGA,WAAI,YAAY,CAAhB,EAAmB;;AAEjB,kBAAS,CAAC,GAAG,OAAO,YAAX,EAAyB,KAAzB,EAAgC;AACvC,gBAAK,SADkC;AAEvC,qBAAU,QAAQ,OAAR,CAAgB,QAAhB,CAAyB,GAAzB,CAA6B,MAAM,KAAN,CAAY,QAAzC,EAAmD,UAAU,GAAV,EAAe;;;AAG1E,iBAAI,QAAQ,IAAZ,EAAkB;AAChB,sBAAO,IAAP;AACD;;AAED,iBAAI,MAAM,UAAU,KAApB;AACA,iBAAI,KAAK,OAAO,KAAP,CAAT;AACA,iBAAI,UAAU,SAAS,KAAT,CAAd;AACA,iBAAI,WAAW,MAAM,aAAN,KAAwB,KAAvC;AACA,iBAAI,QAAQ,YAAY,MAAM,KAA9B;;AAEA;;AAEA,oBAAO,CAAC,GAAG,OAAO,YAAX,EAAyB,GAAzB,EAA8B;AACnC,oBAAK,GAD8B;AAEnC,mBAAI,EAF+B;AAGnC,wBAAS,OAH0B;AAInC,yBAAU,QAJyB;AAKnC,sBAAO;AAL4B,cAA9B,CAAP;AAOD,YAtBS;AAF6B,UAAhC,CAAT;;;AA4BA,iBAAQ,CAAR;AACD;;AA/BD,YAiCK;AACD,eAAI,MAAM,YAAY,KAAtB;AACA,eAAI,KAAK,SAAS,KAAT,CAAT;AACA,eAAI,QAAQ,OAAO,KAAP,CAAZ;AACA,eAAI,WAAW,MAAM,aAAN,KAAwB,KAAvC;;AAEA;;AAEA,oBAAS,CAAC,GAAG,OAAO,YAAX,EAAyB,KAAzB,EAAgC;AACvC,kBAAK,GADkC;AAEvC,iBAAI,EAFmC;AAGvC,oBAAO,KAHgC;AAIvC,uBAAU;AAJ6B,YAAhC,CAAT;AAMD;;AAEH,cAAO,MAAP;AACD,MA5DM,CAAP;AA6DD,IAzM0C;AA0M3C,kBAAe,SAAS,aAAT,CAAuB,CAAvB,EAA0B;AACvC,SAAI,KAAK,kBAAL,CAAwB,EAAE,MAA1B,CAAJ,EAAuC;AACrC,WAAI,QAAQ,KAAK,KAAL,CAAW,aAAvB;AACA,WAAI,iBAAiB,KAArB;;;AAGA,WAAI,EAAE,OAAF,KAAc,EAAd,IAAoB,EAAE,OAAF,KAAc,EAAtC,EAA0C;AACxC,iBAAQ,KAAK,UAAL,CAAgB,KAAhB,CAAR;AACA,0BAAiB,IAAjB;AACD;;;AAHD,YAMK,IAAI,EAAE,OAAF,KAAc,EAAd,IAAoB,EAAE,OAAF,KAAc,EAAtC,EAA0C;AAC3C,mBAAQ,KAAK,UAAL,CAAgB,KAAhB,CAAR;AACA,4BAAiB,IAAjB;AACD;;;AAGH,WAAI,cAAJ,EAAoB;AAClB,WAAE,cAAF;AACD;;AAED,YAAK,WAAL,CAAiB,KAAjB,EAAwB,IAAxB;AACD;AACF,IAlO0C;AAmO3C,gBAAa,SAAS,WAAT,CAAqB,CAArB,EAAwB;AACnC,SAAI,OAAO,EAAE,MAAb;AACA,QAAG;;AAED,WAAI,KAAK,kBAAL,CAAwB,IAAxB,CAAJ,EAAmC;AACjC,aAAI,cAAc,IAAd,CAAJ,EAAyB;AACvB;AACD;;AAED,aAAI,QAAQ,GAAG,KAAH,CAAS,IAAT,CAAc,KAAK,UAAL,CAAgB,QAA9B,EAAwC,OAAxC,CAAgD,IAAhD,CAAZ;AACA,cAAK,WAAL,CAAiB,KAAjB;AACA;AACD;AACF,MAXD,QAWS,CAAC,OAAO,KAAK,UAAb,MAA6B,IAXtC;AAYD,IAjP0C;;;AAqP3C,qBAAkB,SAAS,gBAAT,CAA0B,KAA1B,EAAiC;AACjD,SAAI,gBAAgB,MAAM,aAA1B;;;;;;;;;;AAUA,SAAI,kBAAkB,CAAC,CAAvB,EAA0B;AACxB,WAAI,KAAK,KAAL,IAAc,KAAK,KAAL,CAAW,aAA7B,EAA4C;AAC1C,yBAAgB,KAAK,KAAL,CAAW,aAA3B;AACD,QAFD,MAEO;AACL,yBAAgB,CAAhB;AACD;AACF;;AAED,YAAO;AACL,sBAAe,aADV;AAEL,cAAO,MAAM;AAFR,MAAP;AAID,IA5Q0C;;;;;;;AAoR3C,uBAAoB,SAAS,kBAAT,CAA4B,IAA5B,EAAkC;;AAEpD,SAAI,CAAC,UAAU,IAAV,CAAL,EAAsB;AACpB,cAAO,KAAP;AACD;;;AAGD,SAAI,eAAe,KAAK,aAAxB;AACA,SAAI,WAAW,CAAC,GAAG,UAAU,WAAd,EAA2B,IAA3B,CAAf;AACA,QAAG;AACD,WAAI,iBAAiB,QAArB,EAA+B,OAAO,IAAP,CAA/B,KAAgD,IAAI,aAAa,YAAb,CAA0B,WAA1B,CAAJ,EAA4C;;AAE5F,sBAAe,aAAa,aAA5B;AACD,MAJD,QAIS,YAJT;;AAMA,YAAO,KAAP;AACD,IApS0C;AAqS3C,WAAQ,SAAS,MAAT,GAAkB;AACxB,SAAI,QAAQ,IAAZ;;;;;;;;;;;;;;;AAeA,SAAI,KAAK,KAAL,CAAW,KAAf,EAAsB;AACpB,kBAAW,YAAY;AACrB,eAAM,KAAN,CAAY,KAAZ,GAAoB,KAApB;AACD,QAFD,EAEG,CAFH;AAGD;;AAED,SAAI,SAAS,KAAK,KAAlB;AACA,SAAI,YAAY,OAAO,SAAvB;;AAEA,SAAI,aAAa,yBAAyB,MAAzB,EAAiC,CAAC,WAAD,CAAjC,CAAjB;;;;AAKA,YAAO,WAAW,aAAlB;AACA,YAAO,WAAW,QAAlB;AACA,YAAO,WAAW,KAAlB;AACA,YAAO,WAAW,QAAlB;AACA,YAAO,WAAW,mBAAlB;AACA,YAAO,WAAW,OAAlB;AACA,YAAO,WAAW,SAAlB;;AAEA,YAAO,QAAQ,OAAR,CAAgB,aAAhB,CACL,KADK,EAEL,SAAS,EAAT,EAAa,UAAb,EAAyB;AACvB,kBAAW,CAAC,GAAG,aAAa,OAAjB,EAA0B,WAA1B,EAAuC,YAAvC,EAAqD,SAArD,CADY;AAEvB,gBAAS,KAAK,WAFS;AAGvB,kBAAW,KAAK,aAHO;AAIvB,oBAAa;AAJU,MAAzB,CAFK,EAQL,KAAK,WAAL,EARK,CAAP;AAUD;AArV0C,EAA5B,CAAjB,C;;;;;;AC1CA,gD;;;;;;ACAA,gD;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,iBAAgB;;AAEhB;AACA;;AAEA,kBAAiB,sBAAsB;AACvC;AACA;;AAEA;;AAEA;AACA;AACA,KAAI;AACJ;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA,IAAG;AACH,GAAE;AACF;AACA;AACA,EAAC;;;;;;;AC/CD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0BAAyB,8BAA8B;AACvD;;AAEA;AACA;AACA;AACA,6CAA4C;AAC5C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,EAAC;;;;;;;;ACpCD;;;;AAGA,KAAI,QAAQ,CAAZ;AACA,QAAO,OAAP,GAAiB,SAAS,IAAT,GAAgB;AAC/B,UAAO,gBAAgB,OAAvB;AACD,EAFD,C;;;;;;ACJA;;AAEA,KAAI,SAAS,oBAAQ,CAAR,CAAb;;AAEA,KAAI,UAAU,uBAAuB,MAAvB,CAAd;;AAEA,KAAI,OAAO,oBAAQ,CAAR,CAAX;;AAEA,KAAI,QAAQ,uBAAuB,IAAvB,CAAZ;;AAEA,KAAI,WAAW,oBAAQ,CAAR,CAAf;;AAEA,KAAI,YAAY,uBAAuB,QAAvB,CAAhB;;AAEA,UAAS,sBAAT,CAAgC,GAAhC,EAAqC;AAAE,UAAO,OAAO,IAAI,UAAX,GAAwB,GAAxB,GAA8B,EAAE,SAAS,GAAX,EAArC;AAAwD;;AAE/F,QAAO,OAAP,GAAiB,SAAS,iBAAT,CAA2B,KAA3B,EAAkC,QAAlC,EAA4C;AAC3D,OAAI,QAAQ,KAAK,CAAjB;AACA,OAAI,YAAY,CAAhB;AACA,OAAI,cAAc,CAAlB;AACA,OAAI,WAAW,MAAM,QAAN,CAAf;;AAEA,WAAQ,OAAR,CAAgB,QAAhB,CAAyB,OAAzB,CAAiC,QAAjC,EAA2C,UAAU,KAAV,EAAiB;;;AAG1D,SAAI,UAAU,IAAd,EAAoB;AAClB;AACD;;AAED,SAAI,MAAM,IAAN,KAAe,UAAU,OAA7B,EAAsC;AACpC,eAAQ,OAAR,CAAgB,QAAhB,CAAyB,OAAzB,CAAiC,MAAM,KAAN,CAAY,QAA7C,EAAuD,UAAU,CAAV,EAAa;;;AAGlE,aAAI,MAAM,IAAV,EAAgB;AACd;AACD;;AAED,aAAI,EAAE,IAAF,KAAW,MAAM,OAArB,EAA8B;AAC5B;AACD,UAFD,MAEO;AACL,mBAAQ,IAAI,KAAJ,CAAU,mCAAmC,EAAE,IAAF,CAAO,WAAP,IAAsB,EAAE,IAA3D,IAAmE,IAA7E,CAAR;AACD;AACF,QAZD;AAaD,MAdD,MAcO,IAAI,MAAM,IAAN,CAAW,WAAX,KAA2B,UAA/B,EAA2C;AAChD;AACD,MAFM,MAEA;AACL,eAAQ,IAAI,KAAJ,CAAU,uDAAuD,MAAM,IAAN,CAAW,WAAX,IAA0B,MAAM,IAAvF,IAA+F,IAAzG,CAAR;AACD;AACF,IA1BD;;AA4BA,OAAI,cAAc,WAAlB,EAA+B;AAC7B,aAAQ,IAAI,KAAJ,CAAU,gEAAgE,cAAc,SAAd,GAA0B,gBAA1B,GAA6C,WAA7C,GAA2D,iBAA3H,CAAV,CAAR;AACD;;AAED,UAAO,KAAP;AACD,EAvCD,C;;;;;;AChBA;;AAEA,KAAI,WAAW,OAAO,MAAP,IAAiB,UAAU,MAAV,EAAkB;AAAE,QAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AAAE,SAAI,SAAS,UAAU,CAAV,CAAb,CAA2B,KAAK,IAAI,GAAT,IAAgB,MAAhB,EAAwB;AAAE,WAAI,OAAO,SAAP,CAAiB,cAAjB,CAAgC,IAAhC,CAAqC,MAArC,EAA6C,GAA7C,CAAJ,EAAuD;AAAE,gBAAO,GAAP,IAAc,OAAO,GAAP,CAAd;AAA4B;AAAE;AAAE,IAAC,OAAO,MAAP;AAAgB,EAAhQ;;AAEA,KAAI,SAAS,oBAAQ,CAAR,CAAb;;AAEA,KAAI,UAAU,uBAAuB,MAAvB,CAAd;;AAEA,KAAI,YAAY,oBAAQ,CAAR,CAAhB;;AAEA,KAAI,cAAc,oBAAQ,CAAR,CAAlB;;AAEA,KAAI,eAAe,uBAAuB,WAAvB,CAAnB;;AAEA,UAAS,sBAAT,CAAgC,GAAhC,EAAqC;AAAE,UAAO,OAAO,IAAI,UAAX,GAAwB,GAAxB,GAA8B,EAAE,SAAS,GAAX,EAArC;AAAwD;;AAE/F,UAAS,wBAAT,CAAkC,GAAlC,EAAuC,IAAvC,EAA6C;AAAE,OAAI,SAAS,EAAb,CAAiB,KAAK,IAAI,CAAT,IAAc,GAAd,EAAmB;AAAE,SAAI,KAAK,OAAL,CAAa,CAAb,KAAmB,CAAvB,EAA0B,SAAU,IAAI,CAAC,OAAO,SAAP,CAAiB,cAAjB,CAAgC,IAAhC,CAAqC,GAArC,EAA0C,CAA1C,CAAL,EAAmD,SAAU,OAAO,CAAP,IAAY,IAAI,CAAJ,CAAZ;AAAqB,IAAC,OAAO,MAAP;AAAgB;;AAE5N,UAAS,kBAAT,CAA4B,IAA5B,EAAkC,KAAlC,EAAyC;AACvC,OAAI,MAAM,QAAV,EAAoB;AAClB,UAAK,YAAL,CAAkB,UAAlB,EAA8B,GAA9B;AACA,UAAK,YAAL,CAAkB,UAAlB,EAA8B,UAA9B;AACA,SAAI,MAAM,KAAV,EAAiB;AACf,YAAK,KAAL;AACD;AACF,IAND,MAMO;AACL,UAAK,eAAL,CAAqB,UAArB;AACA,UAAK,eAAL,CAAqB,UAArB;AACD;AACF;;AAED,QAAO,OAAP,GAAiB,QAAQ,OAAR,CAAgB,WAAhB,CAA4B;AAC3C,gBAAa,KAD8B;;AAG3C,cAAW;AACT,gBAAW,OAAO,SAAP,CAAiB,MADnB;AAET,SAAI,OAAO,SAAP,CAAiB,MAFZ;AAGT,eAAU,OAAO,SAAP,CAAiB,IAHlB;AAIT,eAAU,OAAO,SAAP,CAAiB,IAJlB;AAKT,cAAS,OAAO,SAAP,CAAiB,MALjB;AAMT,eAAU,OAAO,SAAP,CAAiB,SAAjB,CAA2B,CAAC,OAAO,SAAP,CAAiB,KAAlB,EAAyB,OAAO,SAAP,CAAiB,MAA1C,EAAkD,OAAO,SAAP,CAAiB,MAAnE,CAA3B;AAND,IAHgC;;AAY3C,oBAAiB,SAAS,eAAT,GAA2B;AAC1C,YAAO;AACL,cAAO,KADF;AAEL,iBAAU,KAFL;AAGL,WAAI,IAHC;AAIL,gBAAS;AAJJ,MAAP;AAMD,IAnB0C;AAoB3C,sBAAmB,SAAS,iBAAT,GAA6B;AAC9C,wBAAmB,CAAC,GAAG,UAAU,WAAd,EAA2B,IAA3B,CAAnB,EAAqD,KAAK,KAA1D;AACD,IAtB0C;AAuB3C,uBAAoB,SAAS,kBAAT,GAA8B;AAChD,wBAAmB,CAAC,GAAG,UAAU,WAAd,EAA2B,IAA3B,CAAnB,EAAqD,KAAK,KAA1D;AACD,IAzB0C;AA0B3C,WAAQ,SAAS,MAAT,GAAkB;AACxB,SAAI,SAAS,KAAK,KAAlB;AACA,SAAI,WAAW,OAAO,QAAtB;AACA,SAAI,WAAW,OAAO,QAAtB;AACA,SAAI,UAAU,OAAO,OAArB;AACA,SAAI,YAAY,OAAO,SAAvB;AACA,SAAI,WAAW,OAAO,QAAtB;AACA,SAAI,KAAK,OAAO,EAAhB;;AAEA,SAAI,aAAa,yBAAyB,MAAzB,EAAiC,CAAC,UAAD,EAAa,UAAb,EAAyB,SAAzB,EAAoC,WAApC,EAAiD,UAAjD,EAA6D,IAA7D,CAAjC,CAAjB;;AAEA,YAAO,QAAQ,OAAR,CAAgB,aAAhB,CACL,IADK,EAEL,SAAS,EAAT,EAAa,UAAb,EAAyB;AACvB,kBAAW,CAAC,GAAG,aAAa,OAAjB,EAA0B,gBAA1B,EAA4C,SAA5C,EAAuD;AAChE,qCAA4B,QADoC;AAEhE,qCAA4B;AAFoC,QAAvD,CADY;AAKvB,aAAM,KALiB;AAMvB,WAAI,EANmB;AAOvB,wBAAiB,WAAW,MAAX,GAAoB,OAPd;AAQvB,wBAAiB,WAAW,MAAX,GAAoB,OARd;AASvB,wBAAiB,WAAW,MAAX,GAAoB,OATd;AAUvB,wBAAiB;AAVM,MAAzB,CAFK,EAcL,QAdK,CAAP;AAgBD;AArD0C,EAA5B,CAAjB,C;;;;;;AC/BA;;AAEA,KAAI,WAAW,OAAO,MAAP,IAAiB,UAAU,MAAV,EAAkB;AAAE,QAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AAAE,SAAI,SAAS,UAAU,CAAV,CAAb,CAA2B,KAAK,IAAI,GAAT,IAAgB,MAAhB,EAAwB;AAAE,WAAI,OAAO,SAAP,CAAiB,cAAjB,CAAgC,IAAhC,CAAqC,MAArC,EAA6C,GAA7C,CAAJ,EAAuD;AAAE,gBAAO,GAAP,IAAc,OAAO,GAAP,CAAd;AAA4B;AAAE;AAAE,IAAC,OAAO,MAAP;AAAgB,EAAhQ;;AAEA,KAAI,SAAS,oBAAQ,CAAR,CAAb;;AAEA,KAAI,UAAU,uBAAuB,MAAvB,CAAd;;AAEA,KAAI,cAAc,oBAAQ,CAAR,CAAlB;;AAEA,KAAI,eAAe,uBAAuB,WAAvB,CAAnB;;AAEA,UAAS,sBAAT,CAAgC,GAAhC,EAAqC;AAAE,UAAO,OAAO,IAAI,UAAX,GAAwB,GAAxB,GAA8B,EAAE,SAAS,GAAX,EAArC;AAAwD;;AAE/F,UAAS,wBAAT,CAAkC,GAAlC,EAAuC,IAAvC,EAA6C;AAAE,OAAI,SAAS,EAAb,CAAiB,KAAK,IAAI,CAAT,IAAc,GAAd,EAAmB;AAAE,SAAI,KAAK,OAAL,CAAa,CAAb,KAAmB,CAAvB,EAA0B,SAAU,IAAI,CAAC,OAAO,SAAP,CAAiB,cAAjB,CAAgC,IAAhC,CAAqC,GAArC,EAA0C,CAA1C,CAAL,EAAmD,SAAU,OAAO,CAAP,IAAY,IAAI,CAAJ,CAAZ;AAAqB,IAAC,OAAO,MAAP;AAAgB;;AAE5N,QAAO,OAAP,GAAiB,QAAQ,OAAR,CAAgB,WAAhB,CAA4B;AAC3C,gBAAa,SAD8B;;AAG3C,cAAW;AACT,gBAAW,OAAO,SAAP,CAAiB,MADnB;AAET,eAAU,OAAO,SAAP,CAAiB,SAAjB,CAA2B,CAAC,OAAO,SAAP,CAAiB,MAAlB,EAA0B,OAAO,SAAP,CAAiB,KAA3C,CAA3B;AAFD,IAHgC;;AAQ3C,WAAQ,SAAS,MAAT,GAAkB;AACxB,SAAI,SAAS,KAAK,KAAlB;AACA,SAAI,YAAY,OAAO,SAAvB;AACA,SAAI,WAAW,OAAO,QAAtB;;AAEA,SAAI,aAAa,yBAAyB,MAAzB,EAAiC,CAAC,WAAD,EAAc,UAAd,CAAjC,CAAjB;;AAEA,YAAO,QAAQ,OAAR,CAAgB,aAAhB,CACL,IADK,EAEL,SAAS,EAAT,EAAa,UAAb,EAAyB;AACvB,kBAAW,CAAC,GAAG,aAAa,OAAjB,EAA0B,oBAA1B,EAAgD,SAAhD,CADY;AAEvB,aAAM;AAFiB,MAAzB,CAFK,EAML,QANK,CAAP;AAQD;AAvB0C,EAA5B,CAAjB,C;;;;;;AChBA;;AAEA,QAAO,OAAP,GAAiB;AACf,iCAA8B;AAC5B,sBAAiB,gBADW;AAE5B,aAAQ,UAFoB;AAG5B,cAAS;AAHmB,IADf;;AAOf,6BAA0B;AACxB,cAAS,cADe;AAExB,aAAQ,uBAFgB;AAGxB,sBAAiB,MAHO;AAIxB,aAAQ,MAJgB;AAKxB,eAAU,UALc;AAMxB,mBAAc,MANU;AAOxB,cAAS,UAPe;AAQxB,aAAQ;AARgB,IAPX;;AAkBf,iDAA8C;AAC5C,iBAAY,MADgC;AAE5C,qBAAgB,MAF4B;AAG5C,YAAO,OAHqC;AAI5C,sBAAiB,aAJ2B;AAK5C,2BAAsB,aALsB;AAM5C,8BAAyB;AANmB,IAlB/B;;AA2Bf,iDAA8C;AAC5C,YAAO,UADqC;AAE5C,aAAQ;AAFoC,IA3B/B;;AAgCf,mCAAgC;AAC9B,mBAAc,4BADgB;AAE9B,qBAAgB,oBAFc;AAG9B,cAAS;AAHqB,IAhCjB;;AAsCf,yCAAsC;AACpC,cAAS,IAD2B;AAEpC,eAAU,UAF0B;AAGpC,aAAQ,KAH4B;AAIpC,WAAM,MAJ8B;AAKpC,YAAO,MAL6B;AAMpC,aAAQ,MAN4B;AAOpC,iBAAY;AAPwB;AAtCvB,EAAjB,C;;;;;;ACFA;;AAEA,KAAI,WAAW,OAAO,MAAP,IAAiB,UAAU,MAAV,EAAkB;AAAE,QAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AAAE,SAAI,SAAS,UAAU,CAAV,CAAb,CAA2B,KAAK,IAAI,GAAT,IAAgB,MAAhB,EAAwB;AAAE,WAAI,OAAO,SAAP,CAAiB,cAAjB,CAAgC,IAAhC,CAAqC,MAArC,EAA6C,GAA7C,CAAJ,EAAuD;AAAE,gBAAO,GAAP,IAAc,OAAO,GAAP,CAAd;AAA4B;AAAE;AAAE,IAAC,OAAO,MAAP;AAAgB,EAAhQ;;AAEA,KAAI,SAAS,oBAAQ,CAAR,CAAb;;AAEA,KAAI,UAAU,uBAAuB,MAAvB,CAAd;;AAEA,KAAI,cAAc,oBAAQ,CAAR,CAAlB;;AAEA,KAAI,eAAe,uBAAuB,WAAvB,CAAnB;;AAEA,UAAS,sBAAT,CAAgC,GAAhC,EAAqC;AAAE,UAAO,OAAO,IAAI,UAAX,GAAwB,GAAxB,GAA8B,EAAE,SAAS,GAAX,EAArC;AAAwD;;AAE/F,UAAS,wBAAT,CAAkC,GAAlC,EAAuC,IAAvC,EAA6C;AAAE,OAAI,SAAS,EAAb,CAAiB,KAAK,IAAI,CAAT,IAAc,GAAd,EAAmB;AAAE,SAAI,KAAK,OAAL,CAAa,CAAb,KAAmB,CAAvB,EAA0B,SAAU,IAAI,CAAC,OAAO,SAAP,CAAiB,cAAjB,CAAgC,IAAhC,CAAqC,GAArC,EAA0C,CAA1C,CAAL,EAAmD,SAAU,OAAO,CAAP,IAAY,IAAI,CAAJ,CAAZ;AAAqB,IAAC,OAAO,MAAP;AAAgB;;AAE5N,QAAO,OAAP,GAAiB,QAAQ,OAAR,CAAgB,WAAhB,CAA4B;AAC3C,gBAAa,UAD8B;;AAG3C,cAAW;AACT,gBAAW,OAAO,SAAP,CAAiB,MADnB;AAET,eAAU,OAAO,SAAP,CAAiB,IAFlB;AAGT,SAAI,OAAO,SAAP,CAAiB,MAHZ;AAIT,YAAO,OAAO,SAAP,CAAiB,MAJf;AAKT,eAAU,OAAO,SAAP,CAAiB,SAAjB,CAA2B,CAAC,OAAO,SAAP,CAAiB,KAAlB,EAAyB,OAAO,SAAP,CAAiB,MAA1C,EAAkD,OAAO,SAAP,CAAiB,MAAnE,CAA3B;AALD,IAHgC;;AAW3C,iBAAc;AACZ,0BAAqB,OAAO,SAAP,CAAiB;AAD1B,IAX6B;;AAe3C,oBAAiB,SAAS,eAAT,GAA2B;AAC1C,YAAO;AACL,iBAAU,KADL;AAEL,WAAI,IAFC;AAGL,cAAO;AAHF,MAAP;AAKD,IArB0C;AAsB3C,WAAQ,SAAS,MAAT,GAAkB;AACxB,SAAI,SAAS,KAAK,KAAlB;AACA,SAAI,YAAY,OAAO,SAAvB;AACA,SAAI,WAAW,OAAO,QAAtB;AACA,SAAI,WAAW,OAAO,QAAtB;AACA,SAAI,KAAK,OAAO,EAAhB;AACA,SAAI,QAAQ,OAAO,KAAnB;;AAEA,SAAI,aAAa,yBAAyB,MAAzB,EAAiC,CAAC,WAAD,EAAc,UAAd,EAA0B,UAA1B,EAAsC,IAAtC,EAA4C,OAA5C,CAAjC,CAAjB;;;;AAKA,SAAI,QAAQ,SAAS,EAAT,EAAa,WAAW,KAAxB,EAA+B,EAAE,SAAS,WAAW,IAAX,GAAkB,MAA7B,EAA/B,CAAZ;AACA,YAAO,WAAW,KAAlB;;AAEA,YAAO,QAAQ,OAAR,CAAgB,aAAhB,CACL,KADK,EAEL,SAAS,EAAT,EAAa,UAAb,EAAyB;AACvB,kBAAW,CAAC,GAAG,aAAa,OAAjB,EAA0B,qBAA1B,EAAiD,SAAjD,EAA4D;AACrE,0CAAiC;AADoC,QAA5D,CADY;AAIvB,aAAM,UAJiB;AAKvB,WAAI,EALmB;AAMvB,0BAAmB,KANI;AAOvB,cAAO;AAPgB,MAAzB,CAFK,EAWL,KAAK,OAAL,CAAa,mBAAb,IAAoC,QAApC,GAA+C,QAA/C,GAA0D,IAXrD,CAAP;AAaD;AAnD0C,EAA5B,CAAjB,C","file":"/Users/danieltschinder/Documents/Github/react-tabs/dist/react-tabs.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"React\"), require(\"ReactDOM\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"React\", \"ReactDOM\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ReactTabs\"] = factory(require(\"React\"), require(\"ReactDOM\"));\n\telse\n\t\troot[\"ReactTabs\"] = factory(root[\"React\"], root[\"ReactDOM\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_2__, __WEBPACK_EXTERNAL_MODULE_3__) {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 7b362e42f859525ab4b5\n **/","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.TabPanel = exports.Tab = exports.TabList = exports.Tabs = undefined;\n\nvar _Tabs = require('./components/Tabs');\n\nvar _Tabs2 = _interopRequireDefault(_Tabs);\n\nvar _TabList = require('./components/TabList');\n\nvar _TabList2 = _interopRequireDefault(_TabList);\n\nvar _Tab = require('./components/Tab');\n\nvar _Tab2 = _interopRequireDefault(_Tab);\n\nvar _TabPanel = require('./components/TabPanel');\n\nvar _TabPanel2 = _interopRequireDefault(_TabPanel);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.Tabs =\n\n// For bc we also export a default object, remove in 1.0\n_Tabs2.default;\nexports.TabList = _TabList2.default;\nexports.Tab = _Tab2.default;\nexports.TabPanel = _TabPanel2.default;\nexports.default = {\n Tabs: _Tabs2.default,\n TabList: _TabList2.default,\n Tab: _Tab2.default,\n TabPanel: _TabPanel2.default\n};\n\n\n/** WEBPACK FOOTER **\n ** ./lib/main.js\n **/","'use strict';\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactDom = require('react-dom');\n\nvar _classnames = require('classnames');\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _jsStylesheet = require('js-stylesheet');\n\nvar _jsStylesheet2 = _interopRequireDefault(_jsStylesheet);\n\nvar _uuid = require('../helpers/uuid');\n\nvar _uuid2 = _interopRequireDefault(_uuid);\n\nvar _childrenPropType = require('../helpers/childrenPropType');\n\nvar _childrenPropType2 = _interopRequireDefault(_childrenPropType);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\n// Determine if a node from event.target is a Tab element\nfunction isTabNode(node) {\n return node.nodeName === 'LI' && node.getAttribute('role') === 'tab';\n}\n\n// Determine if a tab node is disabled\nfunction isTabDisabled(node) {\n return node.getAttribute('aria-disabled') === 'true';\n}\n\nvar useDefaultStyles = true;\n\nmodule.exports = _react2.default.createClass({\n displayName: 'Tabs',\n\n propTypes: {\n className: _react.PropTypes.string,\n selectedIndex: _react.PropTypes.number,\n onSelect: _react.PropTypes.func,\n focus: _react.PropTypes.bool,\n children: _childrenPropType2.default,\n forceRenderTabPanel: _react.PropTypes.bool\n },\n\n childContextTypes: {\n forceRenderTabPanel: _react.PropTypes.bool\n },\n\n statics: {\n setUseDefaultStyles: function setUseDefaultStyles(use) {\n useDefaultStyles = use;\n }\n },\n\n getDefaultProps: function getDefaultProps() {\n return {\n selectedIndex: -1,\n focus: false,\n forceRenderTabPanel: false\n };\n },\n getInitialState: function getInitialState() {\n return this.copyPropsToState(this.props);\n },\n getChildContext: function getChildContext() {\n return {\n forceRenderTabPanel: this.props.forceRenderTabPanel\n };\n },\n componentDidMount: function componentDidMount() {\n if (useDefaultStyles) {\n (0, _jsStylesheet2.default)(require('../helpers/styles.js')); // eslint-disable-line global-require\n }\n },\n componentWillReceiveProps: function componentWillReceiveProps(newProps) {\n this.setState(this.copyPropsToState(newProps));\n },\n setSelected: function setSelected(index, focus) {\n // Don't do anything if nothing has changed\n if (index === this.state.selectedIndex) return;\n // Check index boundary\n if (index < 0 || index >= this.getTabsCount()) return;\n\n // Keep reference to last index for event handler\n var last = this.state.selectedIndex;\n\n // Update selected index\n this.setState({ selectedIndex: index, focus: focus === true });\n\n // Call change event handler\n if (typeof this.props.onSelect === 'function') {\n this.props.onSelect(index, last);\n }\n },\n getNextTab: function getNextTab(index) {\n var count = this.getTabsCount();\n\n // Look for non-disabled tab from index to the last tab on the right\n for (var i = index + 1; i < count; i++) {\n var tab = this.getTab(i);\n if (!isTabDisabled((0, _reactDom.findDOMNode)(tab))) {\n return i;\n }\n }\n\n // If no tab found, continue searching from first on left to index\n for (var _i = 0; _i < index; _i++) {\n var _tab = this.getTab(_i);\n if (!isTabDisabled((0, _reactDom.findDOMNode)(_tab))) {\n return _i;\n }\n }\n\n // No tabs are disabled, return index\n return index;\n },\n getPrevTab: function getPrevTab(index) {\n var i = index;\n\n // Look for non-disabled tab from index to first tab on the left\n while (i--) {\n var tab = this.getTab(i);\n if (!isTabDisabled((0, _reactDom.findDOMNode)(tab))) {\n return i;\n }\n }\n\n // If no tab found, continue searching from last tab on right to index\n i = this.getTabsCount();\n while (i-- > index) {\n var _tab2 = this.getTab(i);\n if (!isTabDisabled((0, _reactDom.findDOMNode)(_tab2))) {\n return i;\n }\n }\n\n // No tabs are disabled, return index\n return index;\n },\n getTabsCount: function getTabsCount() {\n return this.props.children && this.props.children[0] ? _react2.default.Children.count(this.props.children[0].props.children) : 0;\n },\n getPanelsCount: function getPanelsCount() {\n return _react2.default.Children.count(this.props.children.slice(1));\n },\n getTabList: function getTabList() {\n return this.refs.tablist;\n },\n getTab: function getTab(index) {\n return this.refs['tabs-' + index];\n },\n getPanel: function getPanel(index) {\n return this.refs['panels-' + index];\n },\n getChildren: function getChildren() {\n var index = 0;\n var count = 0;\n var children = this.props.children;\n var state = this.state;\n var tabIds = this.tabIds = this.tabIds || [];\n var panelIds = this.panelIds = this.panelIds || [];\n var diff = this.tabIds.length - this.getTabsCount();\n\n // Add ids if new tabs have been added\n // Don't bother removing ids, just keep them in case they are added again\n // This is more efficient, and keeps the uuid counter under control\n while (diff++ < 0) {\n tabIds.push((0, _uuid2.default)());\n panelIds.push((0, _uuid2.default)());\n }\n\n // Map children to dynamically setup refs\n return _react2.default.Children.map(children, function (child) {\n // null happens when conditionally rendering TabPanel/Tab\n // see https://github.com/rackt/react-tabs/issues/37\n if (child === null) {\n return null;\n }\n\n var result = null;\n\n // Clone TabList and Tab components to have refs\n if (count++ === 0) {\n // TODO try setting the uuid in the \"constructor\" for `Tab`/`TabPanel`\n result = (0, _react.cloneElement)(child, {\n ref: 'tablist',\n children: _react2.default.Children.map(child.props.children, function (tab) {\n // null happens when conditionally rendering TabPanel/Tab\n // see https://github.com/rackt/react-tabs/issues/37\n if (tab === null) {\n return null;\n }\n\n var ref = 'tabs-' + index;\n var id = tabIds[index];\n var panelId = panelIds[index];\n var selected = state.selectedIndex === index;\n var focus = selected && state.focus;\n\n index++;\n\n return (0, _react.cloneElement)(tab, {\n ref: ref,\n id: id,\n panelId: panelId,\n selected: selected,\n focus: focus\n });\n })\n });\n\n // Reset index for panels\n index = 0;\n }\n // Clone TabPanel components to have refs\n else {\n var ref = 'panels-' + index;\n var id = panelIds[index];\n var tabId = tabIds[index];\n var selected = state.selectedIndex === index;\n\n index++;\n\n result = (0, _react.cloneElement)(child, {\n ref: ref,\n id: id,\n tabId: tabId,\n selected: selected\n });\n }\n\n return result;\n });\n },\n handleKeyDown: function handleKeyDown(e) {\n if (this.isTabFromContainer(e.target)) {\n var index = this.state.selectedIndex;\n var preventDefault = false;\n\n // Select next tab to the left\n if (e.keyCode === 37 || e.keyCode === 38) {\n index = this.getPrevTab(index);\n preventDefault = true;\n }\n // Select next tab to the right\n /* eslint brace-style:0 */\n else if (e.keyCode === 39 || e.keyCode === 40) {\n index = this.getNextTab(index);\n preventDefault = true;\n }\n\n // This prevents scrollbars from moving around\n if (preventDefault) {\n e.preventDefault();\n }\n\n this.setSelected(index, true);\n }\n },\n handleClick: function handleClick(e) {\n var node = e.target;\n do {\n // eslint-disable-line no-cond-assign\n if (this.isTabFromContainer(node)) {\n if (isTabDisabled(node)) {\n return;\n }\n\n var index = [].slice.call(node.parentNode.children).indexOf(node);\n this.setSelected(index);\n return;\n }\n } while ((node = node.parentNode) !== null);\n },\n\n\n // This is an anti-pattern, so sue me\n copyPropsToState: function copyPropsToState(props) {\n var selectedIndex = props.selectedIndex;\n\n // If no selectedIndex prop was supplied, then try\n // preserving the existing selectedIndex from state.\n // If the state has not selectedIndex, default\n // to the first tab in the TabList.\n //\n // TODO: Need automation testing around this\n // Manual testing can be done using examples/focus\n // See 'should preserve selectedIndex when typing' in specs/Tabs.spec.js\n if (selectedIndex === -1) {\n if (this.state && this.state.selectedIndex) {\n selectedIndex = this.state.selectedIndex;\n } else {\n selectedIndex = 0;\n }\n }\n\n return {\n selectedIndex: selectedIndex,\n focus: props.focus\n };\n },\n\n\n /**\n * Determine if a node from event.target is a Tab element for the current Tabs container.\n * If the clicked element is not a Tab, it returns false.\n * If it finds another Tabs container between the Tab and `this`, it returns false.\n */\n isTabFromContainer: function isTabFromContainer(node) {\n // return immediately if the clicked element is not a Tab.\n if (!isTabNode(node)) {\n return false;\n }\n\n // Check if the first occurrence of a Tabs container is `this` one.\n var nodeAncestor = node.parentElement;\n var tabsNode = (0, _reactDom.findDOMNode)(this);\n do {\n if (nodeAncestor === tabsNode) return true;else if (nodeAncestor.getAttribute('data-tabs')) break;\n\n nodeAncestor = nodeAncestor.parentElement;\n } while (nodeAncestor);\n\n return false;\n },\n render: function render() {\n var _this = this;\n\n // This fixes an issue with focus management.\n //\n // Ultimately, when focus is true, and an input has focus,\n // and any change on that input causes a state change/re-render,\n // focus gets sent back to the active tab, and input loses focus.\n //\n // Since the focus state only needs to be remembered\n // for the current render, we can reset it once the\n // render has happened.\n //\n // Don't use setState, because we don't want to re-render.\n //\n // See https://github.com/rackt/react-tabs/pull/7\n if (this.state.focus) {\n setTimeout(function () {\n _this.state.focus = false;\n }, 0);\n }\n\n var _props = this.props;\n var className = _props.className;\n\n var attributes = _objectWithoutProperties(_props, ['className']);\n\n // Delete all known props, so they don't get added to DOM\n\n\n delete attributes.selectedIndex;\n delete attributes.onSelect;\n delete attributes.focus;\n delete attributes.children;\n delete attributes.forceRenderTabPanel;\n delete attributes.onClick;\n delete attributes.onKeyDown;\n\n return _react2.default.createElement(\n 'div',\n _extends({}, attributes, {\n className: (0, _classnames2.default)('ReactTabs', 'react-tabs', className),\n onClick: this.handleClick,\n onKeyDown: this.handleKeyDown,\n 'data-tabs': true\n }),\n this.getChildren()\n );\n }\n});\n\n\n/** WEBPACK FOOTER **\n ** ./lib/components/Tabs.js\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_2__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"React\"\n ** module id = 2\n ** module chunks = 0\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_3__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"ReactDOM\"\n ** module id = 3\n ** module chunks = 0\n **/","/*!\n Copyright (c) 2016 Jed Watson.\n Licensed under the MIT License (MIT), see\n http://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tclasses.push(classNames.apply(null, arg));\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/classnames/index.js\n ** module id = 4\n ** module chunks = 0\n **/","!(function() {\n function jss(blocks) {\n var css = [];\n for (var block in blocks)\n css.push(createStyleBlock(block, blocks[block]));\n injectCSS(css);\n }\n\n function createStyleBlock(selector, rules) {\n return selector + ' {\\n' + parseRules(rules) + '\\n}';\n }\n\n function parseRules(rules) {\n var css = [];\n for (var rule in rules)\n css.push(' '+rule+': '+rules[rule]+';');\n return css.join('\\n');\n }\n\n function injectCSS(css) {\n var style = document.getElementById('jss-styles');\n if (!style) {\n style = document.createElement('style');\n style.setAttribute('id', 'jss-styles');\n var head = document.getElementsByTagName('head')[0];\n head.insertBefore(style, head.firstChild);\n }\n var node = document.createTextNode(css.join('\\n\\n'));\n style.appendChild(node);\n }\n\n if (typeof exports === 'object')\n module.exports = jss;\n else\n window.jss = jss;\n\n})();\n\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/js-stylesheet/jss.js\n ** module id = 5\n ** module chunks = 0\n **/","\"use strict\";\n\n// Get a universally unique identifier\nvar count = 0;\nmodule.exports = function uuid() {\n return \"react-tabs-\" + count++;\n};\n\n\n/** WEBPACK FOOTER **\n ** ./lib/helpers/uuid.js\n **/","'use strict';\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _Tab = require('../components/Tab');\n\nvar _Tab2 = _interopRequireDefault(_Tab);\n\nvar _TabList = require('../components/TabList');\n\nvar _TabList2 = _interopRequireDefault(_TabList);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nmodule.exports = function childrenPropTypes(props, propName) {\n var error = void 0;\n var tabsCount = 0;\n var panelsCount = 0;\n var children = props[propName];\n\n _react2.default.Children.forEach(children, function (child) {\n // null happens when conditionally rendering TabPanel/Tab\n // see https://github.com/rackt/react-tabs/issues/37\n if (child === null) {\n return;\n }\n\n if (child.type === _TabList2.default) {\n _react2.default.Children.forEach(child.props.children, function (c) {\n // null happens when conditionally rendering TabPanel/Tab\n // see https://github.com/rackt/react-tabs/issues/37\n if (c === null) {\n return;\n }\n\n if (c.type === _Tab2.default) {\n tabsCount++;\n } else {\n error = new Error('Expected \\'Tab\\' but found \\'' + (c.type.displayName || c.type) + '\\'');\n }\n });\n } else if (child.type.displayName === 'TabPanel') {\n panelsCount++;\n } else {\n error = new Error('Expected \\'TabList\\' or \\'TabPanel\\' but found \\'' + (child.type.displayName || child.type) + '\\'');\n }\n });\n\n if (tabsCount !== panelsCount) {\n error = new Error(\"There should be an equal number of 'Tabs' and 'TabPanels'.\" + ('Received ' + tabsCount + ' \\'Tabs\\' and ' + panelsCount + ' \\'TabPanels\\'.'));\n }\n\n return error;\n};\n\n\n/** WEBPACK FOOTER **\n ** ./lib/helpers/childrenPropType.js\n **/","'use strict';\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactDom = require('react-dom');\n\nvar _classnames = require('classnames');\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction syncNodeAttributes(node, props) {\n if (props.selected) {\n node.setAttribute('tabindex', '0');\n node.setAttribute('selected', 'selected');\n if (props.focus) {\n node.focus();\n }\n } else {\n node.removeAttribute('tabindex');\n node.removeAttribute('selected');\n }\n}\n\nmodule.exports = _react2.default.createClass({\n displayName: 'Tab',\n\n propTypes: {\n className: _react.PropTypes.string,\n id: _react.PropTypes.string,\n selected: _react.PropTypes.bool,\n disabled: _react.PropTypes.bool,\n panelId: _react.PropTypes.string,\n children: _react.PropTypes.oneOfType([_react.PropTypes.array, _react.PropTypes.object, _react.PropTypes.string])\n },\n\n getDefaultProps: function getDefaultProps() {\n return {\n focus: false,\n selected: false,\n id: null,\n panelId: null\n };\n },\n componentDidMount: function componentDidMount() {\n syncNodeAttributes((0, _reactDom.findDOMNode)(this), this.props);\n },\n componentDidUpdate: function componentDidUpdate() {\n syncNodeAttributes((0, _reactDom.findDOMNode)(this), this.props);\n },\n render: function render() {\n var _props = this.props;\n var selected = _props.selected;\n var disabled = _props.disabled;\n var panelId = _props.panelId;\n var className = _props.className;\n var children = _props.children;\n var id = _props.id;\n\n var attributes = _objectWithoutProperties(_props, ['selected', 'disabled', 'panelId', 'className', 'children', 'id']);\n\n return _react2.default.createElement(\n 'li',\n _extends({}, attributes, {\n className: (0, _classnames2.default)('ReactTabs__Tab', className, {\n 'ReactTabs__Tab--selected': selected,\n 'ReactTabs__Tab--disabled': disabled\n }),\n role: 'tab',\n id: id,\n 'aria-selected': selected ? 'true' : 'false',\n 'aria-expanded': selected ? 'true' : 'false',\n 'aria-disabled': disabled ? 'true' : 'false',\n 'aria-controls': panelId\n }),\n children\n );\n }\n});\n\n\n/** WEBPACK FOOTER **\n ** ./lib/components/Tab.js\n **/","'use strict';\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _classnames = require('classnames');\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nmodule.exports = _react2.default.createClass({\n displayName: 'TabList',\n\n propTypes: {\n className: _react.PropTypes.string,\n children: _react.PropTypes.oneOfType([_react.PropTypes.object, _react.PropTypes.array])\n },\n\n render: function render() {\n var _props = this.props;\n var className = _props.className;\n var children = _props.children;\n\n var attributes = _objectWithoutProperties(_props, ['className', 'children']);\n\n return _react2.default.createElement(\n 'ul',\n _extends({}, attributes, {\n className: (0, _classnames2.default)('ReactTabs__TabList', className),\n role: 'tablist'\n }),\n children\n );\n }\n});\n\n\n/** WEBPACK FOOTER **\n ** ./lib/components/TabList.js\n **/","'use strict';\n\nmodule.exports = {\n '.react-tabs [role=tablist]': {\n 'border-bottom': '1px solid #aaa',\n margin: '0 0 10px',\n padding: '0'\n },\n\n '.react-tabs [role=tab]': {\n display: 'inline-block',\n border: '1px solid transparent',\n 'border-bottom': 'none',\n bottom: '-1px',\n position: 'relative',\n 'list-style': 'none',\n padding: '6px 12px',\n cursor: 'pointer'\n },\n\n '.react-tabs [role=tab][aria-selected=true]': {\n background: '#fff',\n 'border-color': '#aaa',\n color: 'black',\n 'border-radius': '5px 5px 0 0',\n '-moz-border-radius': '5px 5px 0 0',\n '-webkit-border-radius': '5px 5px 0 0'\n },\n\n '.react-tabs [role=tab][aria-disabled=true]': {\n color: 'GrayText',\n cursor: 'default'\n },\n\n '.react-tabs [role=tab]:focus': {\n 'box-shadow': '0 0 5px hsl(208, 99%, 50%)',\n 'border-color': 'hsl(208, 99%, 50%)',\n outline: 'none'\n },\n\n '.react-tabs [role=tab]:focus:after': {\n content: '\"\"',\n position: 'absolute',\n height: '5px',\n left: '-4px',\n right: '-4px',\n bottom: '-5px',\n background: '#fff'\n }\n};\n\n\n/** WEBPACK FOOTER **\n ** ./lib/helpers/styles.js\n **/","'use strict';\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _classnames = require('classnames');\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nmodule.exports = _react2.default.createClass({\n displayName: 'TabPanel',\n\n propTypes: {\n className: _react.PropTypes.string,\n selected: _react.PropTypes.bool,\n id: _react.PropTypes.string,\n tabId: _react.PropTypes.string,\n children: _react.PropTypes.oneOfType([_react.PropTypes.array, _react.PropTypes.object, _react.PropTypes.string])\n },\n\n contextTypes: {\n forceRenderTabPanel: _react.PropTypes.bool\n },\n\n getDefaultProps: function getDefaultProps() {\n return {\n selected: false,\n id: null,\n tabId: null\n };\n },\n render: function render() {\n var _props = this.props;\n var className = _props.className;\n var children = _props.children;\n var selected = _props.selected;\n var id = _props.id;\n var tabId = _props.tabId;\n\n var attributes = _objectWithoutProperties(_props, ['className', 'children', 'selected', 'id', 'tabId']);\n\n // Merge style\n\n\n var style = _extends({}, attributes.style, { display: selected ? null : 'none' });\n delete attributes.style;\n\n return _react2.default.createElement(\n 'div',\n _extends({}, attributes, {\n className: (0, _classnames2.default)('ReactTabs__TabPanel', className, {\n 'ReactTabs__TabPanel--selected': selected\n }),\n role: 'tabpanel',\n id: id,\n 'aria-labelledby': tabId,\n style: style\n }),\n this.context.forceRenderTabPanel || selected ? children : null\n );\n }\n});\n\n\n/** WEBPACK FOOTER **\n ** ./lib/components/TabPanel.js\n **/"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/react-tabs.min.js b/dist/react-tabs.min.js deleted file mode 100644 index 401242b4d2..0000000000 --- a/dist/react-tabs.min.js +++ /dev/null @@ -1,7 +0,0 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("React"),require("ReactDOM")):"function"==typeof define&&define.amd?define(["React","ReactDOM"],t):"object"==typeof exports?exports.ReactTabs=t(require("React"),require("ReactDOM")):e.ReactTabs=t(e.React,e.ReactDOM)}(this,function(e,t){return function(e){function t(n){if(r[n])return r[n].exports;var a=r[n]={exports:{},id:n,loaded:!1};return e[n].call(a.exports,a,a.exports,t),a.loaded=!0,a.exports}var r={};return t.m=e,t.c=r,t.p="",t(0)}([function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0}),t.TabPanel=t.Tab=t.TabList=t.Tabs=void 0;var a=r(1),s=n(a),o=r(9),i=n(o),l=r(8),d=n(l),c=r(11),u=n(c);t.Tabs=s["default"],t.TabList=i["default"],t.Tab=d["default"],t.TabPanel=u["default"],t["default"]={Tabs:s["default"],TabList:i["default"],Tab:d["default"],TabPanel:u["default"]}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function a(e,t){var r={};for(var n in e)t.indexOf(n)>=0||Object.prototype.hasOwnProperty.call(e,n)&&(r[n]=e[n]);return r}function s(e){return"LI"===e.nodeName&&"tab"===e.getAttribute("role")}function o(e){return"true"===e.getAttribute("aria-disabled")}var i=Object.assign||function(e){for(var t=1;te||e>=this.getTabsCount())){var r=this.state.selectedIndex;this.setState({selectedIndex:e,focus:t===!0}),"function"==typeof this.props.onSelect&&this.props.onSelect(e,r)}},getNextTab:function(e){for(var t=this.getTabsCount(),r=e+1;t>r;r++){var n=this.getTab(r);if(!o((0,c.findDOMNode)(n)))return r}for(var a=0;e>a;a++){var s=this.getTab(a);if(!o((0,c.findDOMNode)(s)))return a}return e},getPrevTab:function(e){for(var t=e;t--;){var r=this.getTab(t);if(!o((0,c.findDOMNode)(r)))return t}for(t=this.getTabsCount();t-- >e;){var n=this.getTab(t);if(!o((0,c.findDOMNode)(n)))return t}return e},getTabsCount:function(){return this.props.children&&this.props.children[0]?d["default"].Children.count(this.props.children[0].props.children):0},getPanelsCount:function(){return d["default"].Children.count(this.props.children.slice(1))},getTabList:function(){return this.refs.tablist},getTab:function(e){return this.refs["tabs-"+e]},getPanel:function(e){return this.refs["panels-"+e]},getChildren:function(){for(var e=0,t=0,r=this.props.children,n=this.state,a=this.tabIds=this.tabIds||[],s=this.panelIds=this.panelIds||[],o=this.tabIds.length-this.getTabsCount();o++<0;)a.push((0,T["default"])()),s.push((0,T["default"])());return d["default"].Children.map(r,function(r){if(null===r)return null;var o=null;if(0===t++)o=(0,l.cloneElement)(r,{ref:"tablist",children:d["default"].Children.map(r.props.children,function(t){if(null===t)return null;var r="tabs-"+e,o=a[e],i=s[e],d=n.selectedIndex===e,c=d&&n.focus;return e++,(0,l.cloneElement)(t,{ref:r,id:o,panelId:i,selected:d,focus:c})})}),e=0;else{var i="panels-"+e,c=s[e],u=a[e],p=n.selectedIndex===e;e++,o=(0,l.cloneElement)(r,{ref:i,id:c,tabId:u,selected:p})}return o})},handleKeyDown:function(e){if(this.isTabFromContainer(e.target)){var t=this.state.selectedIndex,r=!1;37===e.keyCode||38===e.keyCode?(t=this.getPrevTab(t),r=!0):39!==e.keyCode&&40!==e.keyCode||(t=this.getNextTab(t),r=!0),r&&e.preventDefault(),this.setSelected(t,!0)}},handleClick:function(e){var t=e.target;do if(this.isTabFromContainer(t)){if(o(t))return;var r=[].slice.call(t.parentNode.children).indexOf(t);return void this.setSelected(r)}while(null!==(t=t.parentNode))},copyPropsToState:function(e){var t=e.selectedIndex;return-1===t&&(t=this.state&&this.state.selectedIndex?this.state.selectedIndex:0),{selectedIndex:t,focus:e.focus}},isTabFromContainer:function(e){if(!s(e))return!1;var t=e.parentElement,r=(0,c.findDOMNode)(this);do{if(t===r)return!0;if(t.getAttribute("data-tabs"))break;t=t.parentElement}while(t);return!1},render:function(){var e=this;this.state.focus&&setTimeout(function(){e.state.focus=!1},0);var t=this.props,r=t.className,n=a(t,["className"]);return delete n.selectedIndex,delete n.onSelect,delete n.focus,delete n.children,delete n.forceRenderTabPanel,delete n.onClick,delete n.onKeyDown,d["default"].createElement("div",i({},n,{className:(0,p["default"])("ReactTabs","react-tabs",r),onClick:this.handleClick,onKeyDown:this.handleKeyDown,"data-tabs":!0}),this.getChildren())}})},function(t,r){t.exports=e},function(e,r){e.exports=t},function(e,t,r){var n,a;/*! - Copyright (c) 2016 Jed Watson. - Licensed under the MIT License (MIT), see - http://jedwatson.github.io/classnames - */ -!function(){"use strict";function r(){for(var e=[],t=0;t=0||Object.prototype.hasOwnProperty.call(e,n)&&(r[n]=e[n]);return r}function s(e,t){t.selected?(e.setAttribute("tabindex","0"),e.setAttribute("selected","selected"),t.focus&&e.focus()):(e.removeAttribute("tabindex"),e.removeAttribute("selected"))}var o=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,n)&&(r[n]=e[n]);return r}var s=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,n)&&(r[n]=e[n]);return r}var s=Object.assign||function(e){for(var t=1;t= 0) continue;if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;target[i] = obj[i];\n\t }return target;\n\t}\n\t\n\t// Determine if a node from event.target is a Tab element\n\tfunction isTabNode(node) {\n\t return node.nodeName === 'LI' && node.getAttribute('role') === 'tab';\n\t}\n\t\n\t// Determine if a tab node is disabled\n\tfunction isTabDisabled(node) {\n\t return node.getAttribute('aria-disabled') === 'true';\n\t}\n\t\n\tvar useDefaultStyles = true;\n\t\n\tmodule.exports = _react2.default.createClass({\n\t displayName: 'Tabs',\n\t\n\t propTypes: {\n\t className: _react.PropTypes.string,\n\t selectedIndex: _react.PropTypes.number,\n\t onSelect: _react.PropTypes.func,\n\t focus: _react.PropTypes.bool,\n\t children: _childrenPropType2.default,\n\t forceRenderTabPanel: _react.PropTypes.bool\n\t },\n\t\n\t childContextTypes: {\n\t forceRenderTabPanel: _react.PropTypes.bool\n\t },\n\t\n\t statics: {\n\t setUseDefaultStyles: function setUseDefaultStyles(use) {\n\t useDefaultStyles = use;\n\t }\n\t },\n\t\n\t getDefaultProps: function getDefaultProps() {\n\t return {\n\t selectedIndex: -1,\n\t focus: false,\n\t forceRenderTabPanel: false\n\t };\n\t },\n\t getInitialState: function getInitialState() {\n\t return this.copyPropsToState(this.props);\n\t },\n\t getChildContext: function getChildContext() {\n\t return {\n\t forceRenderTabPanel: this.props.forceRenderTabPanel\n\t };\n\t },\n\t componentDidMount: function componentDidMount() {\n\t if (useDefaultStyles) {\n\t (0, _jsStylesheet2.default)(__webpack_require__(10)); // eslint-disable-line global-require\n\t }\n\t },\n\t componentWillReceiveProps: function componentWillReceiveProps(newProps) {\n\t this.setState(this.copyPropsToState(newProps));\n\t },\n\t setSelected: function setSelected(index, focus) {\n\t // Don't do anything if nothing has changed\n\t if (index === this.state.selectedIndex) return;\n\t // Check index boundary\n\t if (index < 0 || index >= this.getTabsCount()) return;\n\t\n\t // Keep reference to last index for event handler\n\t var last = this.state.selectedIndex;\n\t\n\t // Update selected index\n\t this.setState({ selectedIndex: index, focus: focus === true });\n\t\n\t // Call change event handler\n\t if (typeof this.props.onSelect === 'function') {\n\t this.props.onSelect(index, last);\n\t }\n\t },\n\t getNextTab: function getNextTab(index) {\n\t var count = this.getTabsCount();\n\t\n\t // Look for non-disabled tab from index to the last tab on the right\n\t for (var i = index + 1; i < count; i++) {\n\t var tab = this.getTab(i);\n\t if (!isTabDisabled((0, _reactDom.findDOMNode)(tab))) {\n\t return i;\n\t }\n\t }\n\t\n\t // If no tab found, continue searching from first on left to index\n\t for (var _i = 0; _i < index; _i++) {\n\t var _tab = this.getTab(_i);\n\t if (!isTabDisabled((0, _reactDom.findDOMNode)(_tab))) {\n\t return _i;\n\t }\n\t }\n\t\n\t // No tabs are disabled, return index\n\t return index;\n\t },\n\t getPrevTab: function getPrevTab(index) {\n\t var i = index;\n\t\n\t // Look for non-disabled tab from index to first tab on the left\n\t while (i--) {\n\t var tab = this.getTab(i);\n\t if (!isTabDisabled((0, _reactDom.findDOMNode)(tab))) {\n\t return i;\n\t }\n\t }\n\t\n\t // If no tab found, continue searching from last tab on right to index\n\t i = this.getTabsCount();\n\t while (i-- > index) {\n\t var _tab2 = this.getTab(i);\n\t if (!isTabDisabled((0, _reactDom.findDOMNode)(_tab2))) {\n\t return i;\n\t }\n\t }\n\t\n\t // No tabs are disabled, return index\n\t return index;\n\t },\n\t getTabsCount: function getTabsCount() {\n\t return this.props.children && this.props.children[0] ? _react2.default.Children.count(this.props.children[0].props.children) : 0;\n\t },\n\t getPanelsCount: function getPanelsCount() {\n\t return _react2.default.Children.count(this.props.children.slice(1));\n\t },\n\t getTabList: function getTabList() {\n\t return this.refs.tablist;\n\t },\n\t getTab: function getTab(index) {\n\t return this.refs['tabs-' + index];\n\t },\n\t getPanel: function getPanel(index) {\n\t return this.refs['panels-' + index];\n\t },\n\t getChildren: function getChildren() {\n\t var index = 0;\n\t var count = 0;\n\t var children = this.props.children;\n\t var state = this.state;\n\t var tabIds = this.tabIds = this.tabIds || [];\n\t var panelIds = this.panelIds = this.panelIds || [];\n\t var diff = this.tabIds.length - this.getTabsCount();\n\t\n\t // Add ids if new tabs have been added\n\t // Don't bother removing ids, just keep them in case they are added again\n\t // This is more efficient, and keeps the uuid counter under control\n\t while (diff++ < 0) {\n\t tabIds.push((0, _uuid2.default)());\n\t panelIds.push((0, _uuid2.default)());\n\t }\n\t\n\t // Map children to dynamically setup refs\n\t return _react2.default.Children.map(children, function (child) {\n\t // null happens when conditionally rendering TabPanel/Tab\n\t // see https://github.com/rackt/react-tabs/issues/37\n\t if (child === null) {\n\t return null;\n\t }\n\t\n\t var result = null;\n\t\n\t // Clone TabList and Tab components to have refs\n\t if (count++ === 0) {\n\t // TODO try setting the uuid in the \"constructor\" for `Tab`/`TabPanel`\n\t result = (0, _react.cloneElement)(child, {\n\t ref: 'tablist',\n\t children: _react2.default.Children.map(child.props.children, function (tab) {\n\t // null happens when conditionally rendering TabPanel/Tab\n\t // see https://github.com/rackt/react-tabs/issues/37\n\t if (tab === null) {\n\t return null;\n\t }\n\t\n\t var ref = 'tabs-' + index;\n\t var id = tabIds[index];\n\t var panelId = panelIds[index];\n\t var selected = state.selectedIndex === index;\n\t var focus = selected && state.focus;\n\t\n\t index++;\n\t\n\t return (0, _react.cloneElement)(tab, {\n\t ref: ref,\n\t id: id,\n\t panelId: panelId,\n\t selected: selected,\n\t focus: focus\n\t });\n\t })\n\t });\n\t\n\t // Reset index for panels\n\t index = 0;\n\t }\n\t // Clone TabPanel components to have refs\n\t else {\n\t var ref = 'panels-' + index;\n\t var id = panelIds[index];\n\t var tabId = tabIds[index];\n\t var selected = state.selectedIndex === index;\n\t\n\t index++;\n\t\n\t result = (0, _react.cloneElement)(child, {\n\t ref: ref,\n\t id: id,\n\t tabId: tabId,\n\t selected: selected\n\t });\n\t }\n\t\n\t return result;\n\t });\n\t },\n\t handleKeyDown: function handleKeyDown(e) {\n\t if (this.isTabFromContainer(e.target)) {\n\t var index = this.state.selectedIndex;\n\t var preventDefault = false;\n\t\n\t // Select next tab to the left\n\t if (e.keyCode === 37 || e.keyCode === 38) {\n\t index = this.getPrevTab(index);\n\t preventDefault = true;\n\t }\n\t // Select next tab to the right\n\t /* eslint brace-style:0 */\n\t else if (e.keyCode === 39 || e.keyCode === 40) {\n\t index = this.getNextTab(index);\n\t preventDefault = true;\n\t }\n\t\n\t // This prevents scrollbars from moving around\n\t if (preventDefault) {\n\t e.preventDefault();\n\t }\n\t\n\t this.setSelected(index, true);\n\t }\n\t },\n\t handleClick: function handleClick(e) {\n\t var node = e.target;\n\t do {\n\t // eslint-disable-line no-cond-assign\n\t if (this.isTabFromContainer(node)) {\n\t if (isTabDisabled(node)) {\n\t return;\n\t }\n\t\n\t var index = [].slice.call(node.parentNode.children).indexOf(node);\n\t this.setSelected(index);\n\t return;\n\t }\n\t } while ((node = node.parentNode) !== null);\n\t },\n\t\n\t // This is an anti-pattern, so sue me\n\t copyPropsToState: function copyPropsToState(props) {\n\t var selectedIndex = props.selectedIndex;\n\t\n\t // If no selectedIndex prop was supplied, then try\n\t // preserving the existing selectedIndex from state.\n\t // If the state has not selectedIndex, default\n\t // to the first tab in the TabList.\n\t //\n\t // TODO: Need automation testing around this\n\t // Manual testing can be done using examples/focus\n\t // See 'should preserve selectedIndex when typing' in specs/Tabs.spec.js\n\t if (selectedIndex === -1) {\n\t if (this.state && this.state.selectedIndex) {\n\t selectedIndex = this.state.selectedIndex;\n\t } else {\n\t selectedIndex = 0;\n\t }\n\t }\n\t\n\t return {\n\t selectedIndex: selectedIndex,\n\t focus: props.focus\n\t };\n\t },\n\t\n\t /**\n\t * Determine if a node from event.target is a Tab element for the current Tabs container.\n\t * If the clicked element is not a Tab, it returns false.\n\t * If it finds another Tabs container between the Tab and `this`, it returns false.\n\t */\n\t isTabFromContainer: function isTabFromContainer(node) {\n\t // return immediately if the clicked element is not a Tab.\n\t if (!isTabNode(node)) {\n\t return false;\n\t }\n\t\n\t // Check if the first occurrence of a Tabs container is `this` one.\n\t var nodeAncestor = node.parentElement;\n\t var tabsNode = (0, _reactDom.findDOMNode)(this);\n\t do {\n\t if (nodeAncestor === tabsNode) return true;else if (nodeAncestor.getAttribute('data-tabs')) break;\n\t\n\t nodeAncestor = nodeAncestor.parentElement;\n\t } while (nodeAncestor);\n\t\n\t return false;\n\t },\n\t render: function render() {\n\t var _this = this;\n\t\n\t // This fixes an issue with focus management.\n\t //\n\t // Ultimately, when focus is true, and an input has focus,\n\t // and any change on that input causes a state change/re-render,\n\t // focus gets sent back to the active tab, and input loses focus.\n\t //\n\t // Since the focus state only needs to be remembered\n\t // for the current render, we can reset it once the\n\t // render has happened.\n\t //\n\t // Don't use setState, because we don't want to re-render.\n\t //\n\t // See https://github.com/rackt/react-tabs/pull/7\n\t if (this.state.focus) {\n\t setTimeout(function () {\n\t _this.state.focus = false;\n\t }, 0);\n\t }\n\t\n\t var _props = this.props;\n\t var className = _props.className;\n\t\n\t var attributes = _objectWithoutProperties(_props, ['className']);\n\t\n\t // Delete all known props, so they don't get added to DOM\n\t\n\t delete attributes.selectedIndex;\n\t delete attributes.onSelect;\n\t delete attributes.focus;\n\t delete attributes.children;\n\t delete attributes.forceRenderTabPanel;\n\t delete attributes.onClick;\n\t delete attributes.onKeyDown;\n\t\n\t return _react2.default.createElement('div', _extends({}, attributes, {\n\t className: (0, _classnames2.default)('ReactTabs', 'react-tabs', className),\n\t onClick: this.handleClick,\n\t onKeyDown: this.handleKeyDown,\n\t 'data-tabs': true\n\t }), this.getChildren());\n\t }\n\t});\n\n/***/ },\n/* 2 */\n/***/ function(module, exports) {\n\n\tmodule.exports = __WEBPACK_EXTERNAL_MODULE_2__;\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\tmodule.exports = __WEBPACK_EXTERNAL_MODULE_3__;\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n\t Copyright (c) 2016 Jed Watson.\n\t Licensed under the MIT License (MIT), see\n\t http://jedwatson.github.io/classnames\n\t*/\n\t/* global define */\n\t\n\t(function () {\n\t\t'use strict';\n\t\n\t\tvar hasOwn = {}.hasOwnProperty;\n\t\n\t\tfunction classNames () {\n\t\t\tvar classes = [];\n\t\n\t\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\t\tvar arg = arguments[i];\n\t\t\t\tif (!arg) continue;\n\t\n\t\t\t\tvar argType = typeof arg;\n\t\n\t\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\t\tclasses.push(arg);\n\t\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\t\tclasses.push(classNames.apply(null, arg));\n\t\t\t\t} else if (argType === 'object') {\n\t\t\t\t\tfor (var key in arg) {\n\t\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn classes.join(' ');\n\t\t}\n\t\n\t\tif (typeof module !== 'undefined' && module.exports) {\n\t\t\tmodule.exports = classNames;\n\t\t} else if (true) {\n\t\t\t// register as 'classnames', consistent with npm package name\n\t\t\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function () {\n\t\t\t\treturn classNames;\n\t\t\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\t} else {\n\t\t\twindow.classNames = classNames;\n\t\t}\n\t}());\n\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t!(function() {\n\t function jss(blocks) {\n\t var css = [];\n\t for (var block in blocks)\n\t css.push(createStyleBlock(block, blocks[block]));\n\t injectCSS(css);\n\t }\n\t\n\t function createStyleBlock(selector, rules) {\n\t return selector + ' {\\n' + parseRules(rules) + '\\n}';\n\t }\n\t\n\t function parseRules(rules) {\n\t var css = [];\n\t for (var rule in rules)\n\t css.push(' '+rule+': '+rules[rule]+';');\n\t return css.join('\\n');\n\t }\n\t\n\t function injectCSS(css) {\n\t var style = document.getElementById('jss-styles');\n\t if (!style) {\n\t style = document.createElement('style');\n\t style.setAttribute('id', 'jss-styles');\n\t var head = document.getElementsByTagName('head')[0];\n\t head.insertBefore(style, head.firstChild);\n\t }\n\t var node = document.createTextNode(css.join('\\n\\n'));\n\t style.appendChild(node);\n\t }\n\t\n\t if (true)\n\t module.exports = jss;\n\t else\n\t window.jss = jss;\n\t\n\t})();\n\t\n\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\t// Get a universally unique identifier\n\t\n\tvar count = 0;\n\tmodule.exports = function uuid() {\n\t return \"react-tabs-\" + count++;\n\t};\n\n/***/ },\n/* 7 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _Tab = __webpack_require__(8);\n\t\n\tvar _Tab2 = _interopRequireDefault(_Tab);\n\t\n\tvar _TabList = __webpack_require__(9);\n\t\n\tvar _TabList2 = _interopRequireDefault(_TabList);\n\t\n\tfunction _interopRequireDefault(obj) {\n\t return obj && obj.__esModule ? obj : { default: obj };\n\t}\n\t\n\tmodule.exports = function childrenPropTypes(props, propName) {\n\t var error = void 0;\n\t var tabsCount = 0;\n\t var panelsCount = 0;\n\t var children = props[propName];\n\t\n\t _react2.default.Children.forEach(children, function (child) {\n\t // null happens when conditionally rendering TabPanel/Tab\n\t // see https://github.com/rackt/react-tabs/issues/37\n\t if (child === null) {\n\t return;\n\t }\n\t\n\t if (child.type === _TabList2.default) {\n\t _react2.default.Children.forEach(child.props.children, function (c) {\n\t // null happens when conditionally rendering TabPanel/Tab\n\t // see https://github.com/rackt/react-tabs/issues/37\n\t if (c === null) {\n\t return;\n\t }\n\t\n\t if (c.type === _Tab2.default) {\n\t tabsCount++;\n\t } else {\n\t error = new Error('Expected \\'Tab\\' but found \\'' + (c.type.displayName || c.type) + '\\'');\n\t }\n\t });\n\t } else if (child.type.displayName === 'TabPanel') {\n\t panelsCount++;\n\t } else {\n\t error = new Error('Expected \\'TabList\\' or \\'TabPanel\\' but found \\'' + (child.type.displayName || child.type) + '\\'');\n\t }\n\t });\n\t\n\t if (tabsCount !== panelsCount) {\n\t error = new Error(\"There should be an equal number of 'Tabs' and 'TabPanels'.\" + ('Received ' + tabsCount + ' \\'Tabs\\' and ' + panelsCount + ' \\'TabPanels\\'.'));\n\t }\n\t\n\t return error;\n\t};\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _extends = Object.assign || function (target) {\n\t for (var i = 1; i < arguments.length; i++) {\n\t var source = arguments[i];for (var key in source) {\n\t if (Object.prototype.hasOwnProperty.call(source, key)) {\n\t target[key] = source[key];\n\t }\n\t }\n\t }return target;\n\t};\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _reactDom = __webpack_require__(3);\n\t\n\tvar _classnames = __webpack_require__(4);\n\t\n\tvar _classnames2 = _interopRequireDefault(_classnames);\n\t\n\tfunction _interopRequireDefault(obj) {\n\t return obj && obj.__esModule ? obj : { default: obj };\n\t}\n\t\n\tfunction _objectWithoutProperties(obj, keys) {\n\t var target = {};for (var i in obj) {\n\t if (keys.indexOf(i) >= 0) continue;if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;target[i] = obj[i];\n\t }return target;\n\t}\n\t\n\tfunction syncNodeAttributes(node, props) {\n\t if (props.selected) {\n\t node.setAttribute('tabindex', '0');\n\t node.setAttribute('selected', 'selected');\n\t if (props.focus) {\n\t node.focus();\n\t }\n\t } else {\n\t node.removeAttribute('tabindex');\n\t node.removeAttribute('selected');\n\t }\n\t}\n\t\n\tmodule.exports = _react2.default.createClass({\n\t displayName: 'Tab',\n\t\n\t propTypes: {\n\t className: _react.PropTypes.string,\n\t id: _react.PropTypes.string,\n\t selected: _react.PropTypes.bool,\n\t disabled: _react.PropTypes.bool,\n\t panelId: _react.PropTypes.string,\n\t children: _react.PropTypes.oneOfType([_react.PropTypes.array, _react.PropTypes.object, _react.PropTypes.string])\n\t },\n\t\n\t getDefaultProps: function getDefaultProps() {\n\t return {\n\t focus: false,\n\t selected: false,\n\t id: null,\n\t panelId: null\n\t };\n\t },\n\t componentDidMount: function componentDidMount() {\n\t syncNodeAttributes((0, _reactDom.findDOMNode)(this), this.props);\n\t },\n\t componentDidUpdate: function componentDidUpdate() {\n\t syncNodeAttributes((0, _reactDom.findDOMNode)(this), this.props);\n\t },\n\t render: function render() {\n\t var _props = this.props;\n\t var selected = _props.selected;\n\t var disabled = _props.disabled;\n\t var panelId = _props.panelId;\n\t var className = _props.className;\n\t var children = _props.children;\n\t var id = _props.id;\n\t\n\t var attributes = _objectWithoutProperties(_props, ['selected', 'disabled', 'panelId', 'className', 'children', 'id']);\n\t\n\t return _react2.default.createElement('li', _extends({}, attributes, {\n\t className: (0, _classnames2.default)('ReactTabs__Tab', className, {\n\t 'ReactTabs__Tab--selected': selected,\n\t 'ReactTabs__Tab--disabled': disabled\n\t }),\n\t role: 'tab',\n\t id: id,\n\t 'aria-selected': selected ? 'true' : 'false',\n\t 'aria-expanded': selected ? 'true' : 'false',\n\t 'aria-disabled': disabled ? 'true' : 'false',\n\t 'aria-controls': panelId\n\t }), children);\n\t }\n\t});\n\n/***/ },\n/* 9 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _extends = Object.assign || function (target) {\n\t for (var i = 1; i < arguments.length; i++) {\n\t var source = arguments[i];for (var key in source) {\n\t if (Object.prototype.hasOwnProperty.call(source, key)) {\n\t target[key] = source[key];\n\t }\n\t }\n\t }return target;\n\t};\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _classnames = __webpack_require__(4);\n\t\n\tvar _classnames2 = _interopRequireDefault(_classnames);\n\t\n\tfunction _interopRequireDefault(obj) {\n\t return obj && obj.__esModule ? obj : { default: obj };\n\t}\n\t\n\tfunction _objectWithoutProperties(obj, keys) {\n\t var target = {};for (var i in obj) {\n\t if (keys.indexOf(i) >= 0) continue;if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;target[i] = obj[i];\n\t }return target;\n\t}\n\t\n\tmodule.exports = _react2.default.createClass({\n\t displayName: 'TabList',\n\t\n\t propTypes: {\n\t className: _react.PropTypes.string,\n\t children: _react.PropTypes.oneOfType([_react.PropTypes.object, _react.PropTypes.array])\n\t },\n\t\n\t render: function render() {\n\t var _props = this.props;\n\t var className = _props.className;\n\t var children = _props.children;\n\t\n\t var attributes = _objectWithoutProperties(_props, ['className', 'children']);\n\t\n\t return _react2.default.createElement('ul', _extends({}, attributes, {\n\t className: (0, _classnames2.default)('ReactTabs__TabList', className),\n\t role: 'tablist'\n\t }), children);\n\t }\n\t});\n\n/***/ },\n/* 10 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tmodule.exports = {\n\t '.react-tabs [role=tablist]': {\n\t 'border-bottom': '1px solid #aaa',\n\t margin: '0 0 10px',\n\t padding: '0'\n\t },\n\t\n\t '.react-tabs [role=tab]': {\n\t display: 'inline-block',\n\t border: '1px solid transparent',\n\t 'border-bottom': 'none',\n\t bottom: '-1px',\n\t position: 'relative',\n\t 'list-style': 'none',\n\t padding: '6px 12px',\n\t cursor: 'pointer'\n\t },\n\t\n\t '.react-tabs [role=tab][aria-selected=true]': {\n\t background: '#fff',\n\t 'border-color': '#aaa',\n\t color: 'black',\n\t 'border-radius': '5px 5px 0 0',\n\t '-moz-border-radius': '5px 5px 0 0',\n\t '-webkit-border-radius': '5px 5px 0 0'\n\t },\n\t\n\t '.react-tabs [role=tab][aria-disabled=true]': {\n\t color: 'GrayText',\n\t cursor: 'default'\n\t },\n\t\n\t '.react-tabs [role=tab]:focus': {\n\t 'box-shadow': '0 0 5px hsl(208, 99%, 50%)',\n\t 'border-color': 'hsl(208, 99%, 50%)',\n\t outline: 'none'\n\t },\n\t\n\t '.react-tabs [role=tab]:focus:after': {\n\t content: '\"\"',\n\t position: 'absolute',\n\t height: '5px',\n\t left: '-4px',\n\t right: '-4px',\n\t bottom: '-5px',\n\t background: '#fff'\n\t }\n\t};\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar _extends = Object.assign || function (target) {\n\t for (var i = 1; i < arguments.length; i++) {\n\t var source = arguments[i];for (var key in source) {\n\t if (Object.prototype.hasOwnProperty.call(source, key)) {\n\t target[key] = source[key];\n\t }\n\t }\n\t }return target;\n\t};\n\t\n\tvar _react = __webpack_require__(2);\n\t\n\tvar _react2 = _interopRequireDefault(_react);\n\t\n\tvar _classnames = __webpack_require__(4);\n\t\n\tvar _classnames2 = _interopRequireDefault(_classnames);\n\t\n\tfunction _interopRequireDefault(obj) {\n\t return obj && obj.__esModule ? obj : { default: obj };\n\t}\n\t\n\tfunction _objectWithoutProperties(obj, keys) {\n\t var target = {};for (var i in obj) {\n\t if (keys.indexOf(i) >= 0) continue;if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;target[i] = obj[i];\n\t }return target;\n\t}\n\t\n\tmodule.exports = _react2.default.createClass({\n\t displayName: 'TabPanel',\n\t\n\t propTypes: {\n\t className: _react.PropTypes.string,\n\t selected: _react.PropTypes.bool,\n\t id: _react.PropTypes.string,\n\t tabId: _react.PropTypes.string,\n\t children: _react.PropTypes.oneOfType([_react.PropTypes.array, _react.PropTypes.object, _react.PropTypes.string])\n\t },\n\t\n\t contextTypes: {\n\t forceRenderTabPanel: _react.PropTypes.bool\n\t },\n\t\n\t getDefaultProps: function getDefaultProps() {\n\t return {\n\t selected: false,\n\t id: null,\n\t tabId: null\n\t };\n\t },\n\t render: function render() {\n\t var _props = this.props;\n\t var className = _props.className;\n\t var children = _props.children;\n\t var selected = _props.selected;\n\t var id = _props.id;\n\t var tabId = _props.tabId;\n\t\n\t var attributes = _objectWithoutProperties(_props, ['className', 'children', 'selected', 'id', 'tabId']);\n\t\n\t // Merge style\n\t\n\t var style = _extends({}, attributes.style, { display: selected ? null : 'none' });\n\t delete attributes.style;\n\t\n\t return _react2.default.createElement('div', _extends({}, attributes, {\n\t className: (0, _classnames2.default)('ReactTabs__TabPanel', className, {\n\t 'ReactTabs__TabPanel--selected': selected\n\t }),\n\t role: 'tabpanel',\n\t id: id,\n\t 'aria-labelledby': tabId,\n\t style: style\n\t }), this.context.forceRenderTabPanel || selected ? children : null);\n\t }\n\t});\n\n/***/ }\n/******/ ])\n});\n;\n\n\n/** WEBPACK FOOTER **\n ** ./dist/react-tabs.min.js\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap db99d680d818c095ec9b\n **/","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.TabPanel = exports.Tab = exports.TabList = exports.Tabs = undefined;\n\nvar _Tabs = require('./components/Tabs');\n\nvar _Tabs2 = _interopRequireDefault(_Tabs);\n\nvar _TabList = require('./components/TabList');\n\nvar _TabList2 = _interopRequireDefault(_TabList);\n\nvar _Tab = require('./components/Tab');\n\nvar _Tab2 = _interopRequireDefault(_Tab);\n\nvar _TabPanel = require('./components/TabPanel');\n\nvar _TabPanel2 = _interopRequireDefault(_TabPanel);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.Tabs =\n\n// For bc we also export a default object, remove in 1.0\n_Tabs2.default;\nexports.TabList = _TabList2.default;\nexports.Tab = _Tab2.default;\nexports.TabPanel = _TabPanel2.default;\nexports.default = {\n Tabs: _Tabs2.default,\n TabList: _TabList2.default,\n Tab: _Tab2.default,\n TabPanel: _TabPanel2.default\n};\n\n\n/** WEBPACK FOOTER **\n ** ./lib/main.js\n **/","'use strict';\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactDom = require('react-dom');\n\nvar _classnames = require('classnames');\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nvar _jsStylesheet = require('js-stylesheet');\n\nvar _jsStylesheet2 = _interopRequireDefault(_jsStylesheet);\n\nvar _uuid = require('../helpers/uuid');\n\nvar _uuid2 = _interopRequireDefault(_uuid);\n\nvar _childrenPropType = require('../helpers/childrenPropType');\n\nvar _childrenPropType2 = _interopRequireDefault(_childrenPropType);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\n// Determine if a node from event.target is a Tab element\nfunction isTabNode(node) {\n return node.nodeName === 'LI' && node.getAttribute('role') === 'tab';\n}\n\n// Determine if a tab node is disabled\nfunction isTabDisabled(node) {\n return node.getAttribute('aria-disabled') === 'true';\n}\n\nvar useDefaultStyles = true;\n\nmodule.exports = _react2.default.createClass({\n displayName: 'Tabs',\n\n propTypes: {\n className: _react.PropTypes.string,\n selectedIndex: _react.PropTypes.number,\n onSelect: _react.PropTypes.func,\n focus: _react.PropTypes.bool,\n children: _childrenPropType2.default,\n forceRenderTabPanel: _react.PropTypes.bool\n },\n\n childContextTypes: {\n forceRenderTabPanel: _react.PropTypes.bool\n },\n\n statics: {\n setUseDefaultStyles: function setUseDefaultStyles(use) {\n useDefaultStyles = use;\n }\n },\n\n getDefaultProps: function getDefaultProps() {\n return {\n selectedIndex: -1,\n focus: false,\n forceRenderTabPanel: false\n };\n },\n getInitialState: function getInitialState() {\n return this.copyPropsToState(this.props);\n },\n getChildContext: function getChildContext() {\n return {\n forceRenderTabPanel: this.props.forceRenderTabPanel\n };\n },\n componentDidMount: function componentDidMount() {\n if (useDefaultStyles) {\n (0, _jsStylesheet2.default)(require('../helpers/styles.js')); // eslint-disable-line global-require\n }\n },\n componentWillReceiveProps: function componentWillReceiveProps(newProps) {\n this.setState(this.copyPropsToState(newProps));\n },\n setSelected: function setSelected(index, focus) {\n // Don't do anything if nothing has changed\n if (index === this.state.selectedIndex) return;\n // Check index boundary\n if (index < 0 || index >= this.getTabsCount()) return;\n\n // Keep reference to last index for event handler\n var last = this.state.selectedIndex;\n\n // Update selected index\n this.setState({ selectedIndex: index, focus: focus === true });\n\n // Call change event handler\n if (typeof this.props.onSelect === 'function') {\n this.props.onSelect(index, last);\n }\n },\n getNextTab: function getNextTab(index) {\n var count = this.getTabsCount();\n\n // Look for non-disabled tab from index to the last tab on the right\n for (var i = index + 1; i < count; i++) {\n var tab = this.getTab(i);\n if (!isTabDisabled((0, _reactDom.findDOMNode)(tab))) {\n return i;\n }\n }\n\n // If no tab found, continue searching from first on left to index\n for (var _i = 0; _i < index; _i++) {\n var _tab = this.getTab(_i);\n if (!isTabDisabled((0, _reactDom.findDOMNode)(_tab))) {\n return _i;\n }\n }\n\n // No tabs are disabled, return index\n return index;\n },\n getPrevTab: function getPrevTab(index) {\n var i = index;\n\n // Look for non-disabled tab from index to first tab on the left\n while (i--) {\n var tab = this.getTab(i);\n if (!isTabDisabled((0, _reactDom.findDOMNode)(tab))) {\n return i;\n }\n }\n\n // If no tab found, continue searching from last tab on right to index\n i = this.getTabsCount();\n while (i-- > index) {\n var _tab2 = this.getTab(i);\n if (!isTabDisabled((0, _reactDom.findDOMNode)(_tab2))) {\n return i;\n }\n }\n\n // No tabs are disabled, return index\n return index;\n },\n getTabsCount: function getTabsCount() {\n return this.props.children && this.props.children[0] ? _react2.default.Children.count(this.props.children[0].props.children) : 0;\n },\n getPanelsCount: function getPanelsCount() {\n return _react2.default.Children.count(this.props.children.slice(1));\n },\n getTabList: function getTabList() {\n return this.refs.tablist;\n },\n getTab: function getTab(index) {\n return this.refs['tabs-' + index];\n },\n getPanel: function getPanel(index) {\n return this.refs['panels-' + index];\n },\n getChildren: function getChildren() {\n var index = 0;\n var count = 0;\n var children = this.props.children;\n var state = this.state;\n var tabIds = this.tabIds = this.tabIds || [];\n var panelIds = this.panelIds = this.panelIds || [];\n var diff = this.tabIds.length - this.getTabsCount();\n\n // Add ids if new tabs have been added\n // Don't bother removing ids, just keep them in case they are added again\n // This is more efficient, and keeps the uuid counter under control\n while (diff++ < 0) {\n tabIds.push((0, _uuid2.default)());\n panelIds.push((0, _uuid2.default)());\n }\n\n // Map children to dynamically setup refs\n return _react2.default.Children.map(children, function (child) {\n // null happens when conditionally rendering TabPanel/Tab\n // see https://github.com/rackt/react-tabs/issues/37\n if (child === null) {\n return null;\n }\n\n var result = null;\n\n // Clone TabList and Tab components to have refs\n if (count++ === 0) {\n // TODO try setting the uuid in the \"constructor\" for `Tab`/`TabPanel`\n result = (0, _react.cloneElement)(child, {\n ref: 'tablist',\n children: _react2.default.Children.map(child.props.children, function (tab) {\n // null happens when conditionally rendering TabPanel/Tab\n // see https://github.com/rackt/react-tabs/issues/37\n if (tab === null) {\n return null;\n }\n\n var ref = 'tabs-' + index;\n var id = tabIds[index];\n var panelId = panelIds[index];\n var selected = state.selectedIndex === index;\n var focus = selected && state.focus;\n\n index++;\n\n return (0, _react.cloneElement)(tab, {\n ref: ref,\n id: id,\n panelId: panelId,\n selected: selected,\n focus: focus\n });\n })\n });\n\n // Reset index for panels\n index = 0;\n }\n // Clone TabPanel components to have refs\n else {\n var ref = 'panels-' + index;\n var id = panelIds[index];\n var tabId = tabIds[index];\n var selected = state.selectedIndex === index;\n\n index++;\n\n result = (0, _react.cloneElement)(child, {\n ref: ref,\n id: id,\n tabId: tabId,\n selected: selected\n });\n }\n\n return result;\n });\n },\n handleKeyDown: function handleKeyDown(e) {\n if (this.isTabFromContainer(e.target)) {\n var index = this.state.selectedIndex;\n var preventDefault = false;\n\n // Select next tab to the left\n if (e.keyCode === 37 || e.keyCode === 38) {\n index = this.getPrevTab(index);\n preventDefault = true;\n }\n // Select next tab to the right\n /* eslint brace-style:0 */\n else if (e.keyCode === 39 || e.keyCode === 40) {\n index = this.getNextTab(index);\n preventDefault = true;\n }\n\n // This prevents scrollbars from moving around\n if (preventDefault) {\n e.preventDefault();\n }\n\n this.setSelected(index, true);\n }\n },\n handleClick: function handleClick(e) {\n var node = e.target;\n do {\n // eslint-disable-line no-cond-assign\n if (this.isTabFromContainer(node)) {\n if (isTabDisabled(node)) {\n return;\n }\n\n var index = [].slice.call(node.parentNode.children).indexOf(node);\n this.setSelected(index);\n return;\n }\n } while ((node = node.parentNode) !== null);\n },\n\n\n // This is an anti-pattern, so sue me\n copyPropsToState: function copyPropsToState(props) {\n var selectedIndex = props.selectedIndex;\n\n // If no selectedIndex prop was supplied, then try\n // preserving the existing selectedIndex from state.\n // If the state has not selectedIndex, default\n // to the first tab in the TabList.\n //\n // TODO: Need automation testing around this\n // Manual testing can be done using examples/focus\n // See 'should preserve selectedIndex when typing' in specs/Tabs.spec.js\n if (selectedIndex === -1) {\n if (this.state && this.state.selectedIndex) {\n selectedIndex = this.state.selectedIndex;\n } else {\n selectedIndex = 0;\n }\n }\n\n return {\n selectedIndex: selectedIndex,\n focus: props.focus\n };\n },\n\n\n /**\n * Determine if a node from event.target is a Tab element for the current Tabs container.\n * If the clicked element is not a Tab, it returns false.\n * If it finds another Tabs container between the Tab and `this`, it returns false.\n */\n isTabFromContainer: function isTabFromContainer(node) {\n // return immediately if the clicked element is not a Tab.\n if (!isTabNode(node)) {\n return false;\n }\n\n // Check if the first occurrence of a Tabs container is `this` one.\n var nodeAncestor = node.parentElement;\n var tabsNode = (0, _reactDom.findDOMNode)(this);\n do {\n if (nodeAncestor === tabsNode) return true;else if (nodeAncestor.getAttribute('data-tabs')) break;\n\n nodeAncestor = nodeAncestor.parentElement;\n } while (nodeAncestor);\n\n return false;\n },\n render: function render() {\n var _this = this;\n\n // This fixes an issue with focus management.\n //\n // Ultimately, when focus is true, and an input has focus,\n // and any change on that input causes a state change/re-render,\n // focus gets sent back to the active tab, and input loses focus.\n //\n // Since the focus state only needs to be remembered\n // for the current render, we can reset it once the\n // render has happened.\n //\n // Don't use setState, because we don't want to re-render.\n //\n // See https://github.com/rackt/react-tabs/pull/7\n if (this.state.focus) {\n setTimeout(function () {\n _this.state.focus = false;\n }, 0);\n }\n\n var _props = this.props;\n var className = _props.className;\n\n var attributes = _objectWithoutProperties(_props, ['className']);\n\n // Delete all known props, so they don't get added to DOM\n\n\n delete attributes.selectedIndex;\n delete attributes.onSelect;\n delete attributes.focus;\n delete attributes.children;\n delete attributes.forceRenderTabPanel;\n delete attributes.onClick;\n delete attributes.onKeyDown;\n\n return _react2.default.createElement(\n 'div',\n _extends({}, attributes, {\n className: (0, _classnames2.default)('ReactTabs', 'react-tabs', className),\n onClick: this.handleClick,\n onKeyDown: this.handleKeyDown,\n 'data-tabs': true\n }),\n this.getChildren()\n );\n }\n});\n\n\n/** WEBPACK FOOTER **\n ** ./lib/components/Tabs.js\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_2__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"React\"\n ** module id = 2\n ** module chunks = 0\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_3__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"ReactDOM\"\n ** module id = 3\n ** module chunks = 0\n **/","/*!\n Copyright (c) 2016 Jed Watson.\n Licensed under the MIT License (MIT), see\n http://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tclasses.push(classNames.apply(null, arg));\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/classnames/index.js\n ** module id = 4\n ** module chunks = 0\n **/","!(function() {\n function jss(blocks) {\n var css = [];\n for (var block in blocks)\n css.push(createStyleBlock(block, blocks[block]));\n injectCSS(css);\n }\n\n function createStyleBlock(selector, rules) {\n return selector + ' {\\n' + parseRules(rules) + '\\n}';\n }\n\n function parseRules(rules) {\n var css = [];\n for (var rule in rules)\n css.push(' '+rule+': '+rules[rule]+';');\n return css.join('\\n');\n }\n\n function injectCSS(css) {\n var style = document.getElementById('jss-styles');\n if (!style) {\n style = document.createElement('style');\n style.setAttribute('id', 'jss-styles');\n var head = document.getElementsByTagName('head')[0];\n head.insertBefore(style, head.firstChild);\n }\n var node = document.createTextNode(css.join('\\n\\n'));\n style.appendChild(node);\n }\n\n if (typeof exports === 'object')\n module.exports = jss;\n else\n window.jss = jss;\n\n})();\n\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/js-stylesheet/jss.js\n ** module id = 5\n ** module chunks = 0\n **/","\"use strict\";\n\n// Get a universally unique identifier\nvar count = 0;\nmodule.exports = function uuid() {\n return \"react-tabs-\" + count++;\n};\n\n\n/** WEBPACK FOOTER **\n ** ./lib/helpers/uuid.js\n **/","'use strict';\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _Tab = require('../components/Tab');\n\nvar _Tab2 = _interopRequireDefault(_Tab);\n\nvar _TabList = require('../components/TabList');\n\nvar _TabList2 = _interopRequireDefault(_TabList);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nmodule.exports = function childrenPropTypes(props, propName) {\n var error = void 0;\n var tabsCount = 0;\n var panelsCount = 0;\n var children = props[propName];\n\n _react2.default.Children.forEach(children, function (child) {\n // null happens when conditionally rendering TabPanel/Tab\n // see https://github.com/rackt/react-tabs/issues/37\n if (child === null) {\n return;\n }\n\n if (child.type === _TabList2.default) {\n _react2.default.Children.forEach(child.props.children, function (c) {\n // null happens when conditionally rendering TabPanel/Tab\n // see https://github.com/rackt/react-tabs/issues/37\n if (c === null) {\n return;\n }\n\n if (c.type === _Tab2.default) {\n tabsCount++;\n } else {\n error = new Error('Expected \\'Tab\\' but found \\'' + (c.type.displayName || c.type) + '\\'');\n }\n });\n } else if (child.type.displayName === 'TabPanel') {\n panelsCount++;\n } else {\n error = new Error('Expected \\'TabList\\' or \\'TabPanel\\' but found \\'' + (child.type.displayName || child.type) + '\\'');\n }\n });\n\n if (tabsCount !== panelsCount) {\n error = new Error(\"There should be an equal number of 'Tabs' and 'TabPanels'.\" + ('Received ' + tabsCount + ' \\'Tabs\\' and ' + panelsCount + ' \\'TabPanels\\'.'));\n }\n\n return error;\n};\n\n\n/** WEBPACK FOOTER **\n ** ./lib/helpers/childrenPropType.js\n **/","'use strict';\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactDom = require('react-dom');\n\nvar _classnames = require('classnames');\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction syncNodeAttributes(node, props) {\n if (props.selected) {\n node.setAttribute('tabindex', '0');\n node.setAttribute('selected', 'selected');\n if (props.focus) {\n node.focus();\n }\n } else {\n node.removeAttribute('tabindex');\n node.removeAttribute('selected');\n }\n}\n\nmodule.exports = _react2.default.createClass({\n displayName: 'Tab',\n\n propTypes: {\n className: _react.PropTypes.string,\n id: _react.PropTypes.string,\n selected: _react.PropTypes.bool,\n disabled: _react.PropTypes.bool,\n panelId: _react.PropTypes.string,\n children: _react.PropTypes.oneOfType([_react.PropTypes.array, _react.PropTypes.object, _react.PropTypes.string])\n },\n\n getDefaultProps: function getDefaultProps() {\n return {\n focus: false,\n selected: false,\n id: null,\n panelId: null\n };\n },\n componentDidMount: function componentDidMount() {\n syncNodeAttributes((0, _reactDom.findDOMNode)(this), this.props);\n },\n componentDidUpdate: function componentDidUpdate() {\n syncNodeAttributes((0, _reactDom.findDOMNode)(this), this.props);\n },\n render: function render() {\n var _props = this.props;\n var selected = _props.selected;\n var disabled = _props.disabled;\n var panelId = _props.panelId;\n var className = _props.className;\n var children = _props.children;\n var id = _props.id;\n\n var attributes = _objectWithoutProperties(_props, ['selected', 'disabled', 'panelId', 'className', 'children', 'id']);\n\n return _react2.default.createElement(\n 'li',\n _extends({}, attributes, {\n className: (0, _classnames2.default)('ReactTabs__Tab', className, {\n 'ReactTabs__Tab--selected': selected,\n 'ReactTabs__Tab--disabled': disabled\n }),\n role: 'tab',\n id: id,\n 'aria-selected': selected ? 'true' : 'false',\n 'aria-expanded': selected ? 'true' : 'false',\n 'aria-disabled': disabled ? 'true' : 'false',\n 'aria-controls': panelId\n }),\n children\n );\n }\n});\n\n\n/** WEBPACK FOOTER **\n ** ./lib/components/Tab.js\n **/","'use strict';\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _classnames = require('classnames');\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nmodule.exports = _react2.default.createClass({\n displayName: 'TabList',\n\n propTypes: {\n className: _react.PropTypes.string,\n children: _react.PropTypes.oneOfType([_react.PropTypes.object, _react.PropTypes.array])\n },\n\n render: function render() {\n var _props = this.props;\n var className = _props.className;\n var children = _props.children;\n\n var attributes = _objectWithoutProperties(_props, ['className', 'children']);\n\n return _react2.default.createElement(\n 'ul',\n _extends({}, attributes, {\n className: (0, _classnames2.default)('ReactTabs__TabList', className),\n role: 'tablist'\n }),\n children\n );\n }\n});\n\n\n/** WEBPACK FOOTER **\n ** ./lib/components/TabList.js\n **/","'use strict';\n\nmodule.exports = {\n '.react-tabs [role=tablist]': {\n 'border-bottom': '1px solid #aaa',\n margin: '0 0 10px',\n padding: '0'\n },\n\n '.react-tabs [role=tab]': {\n display: 'inline-block',\n border: '1px solid transparent',\n 'border-bottom': 'none',\n bottom: '-1px',\n position: 'relative',\n 'list-style': 'none',\n padding: '6px 12px',\n cursor: 'pointer'\n },\n\n '.react-tabs [role=tab][aria-selected=true]': {\n background: '#fff',\n 'border-color': '#aaa',\n color: 'black',\n 'border-radius': '5px 5px 0 0',\n '-moz-border-radius': '5px 5px 0 0',\n '-webkit-border-radius': '5px 5px 0 0'\n },\n\n '.react-tabs [role=tab][aria-disabled=true]': {\n color: 'GrayText',\n cursor: 'default'\n },\n\n '.react-tabs [role=tab]:focus': {\n 'box-shadow': '0 0 5px hsl(208, 99%, 50%)',\n 'border-color': 'hsl(208, 99%, 50%)',\n outline: 'none'\n },\n\n '.react-tabs [role=tab]:focus:after': {\n content: '\"\"',\n position: 'absolute',\n height: '5px',\n left: '-4px',\n right: '-4px',\n bottom: '-5px',\n background: '#fff'\n }\n};\n\n\n/** WEBPACK FOOTER **\n ** ./lib/helpers/styles.js\n **/","'use strict';\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _classnames = require('classnames');\n\nvar _classnames2 = _interopRequireDefault(_classnames);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nmodule.exports = _react2.default.createClass({\n displayName: 'TabPanel',\n\n propTypes: {\n className: _react.PropTypes.string,\n selected: _react.PropTypes.bool,\n id: _react.PropTypes.string,\n tabId: _react.PropTypes.string,\n children: _react.PropTypes.oneOfType([_react.PropTypes.array, _react.PropTypes.object, _react.PropTypes.string])\n },\n\n contextTypes: {\n forceRenderTabPanel: _react.PropTypes.bool\n },\n\n getDefaultProps: function getDefaultProps() {\n return {\n selected: false,\n id: null,\n tabId: null\n };\n },\n render: function render() {\n var _props = this.props;\n var className = _props.className;\n var children = _props.children;\n var selected = _props.selected;\n var id = _props.id;\n var tabId = _props.tabId;\n\n var attributes = _objectWithoutProperties(_props, ['className', 'children', 'selected', 'id', 'tabId']);\n\n // Merge style\n\n\n var style = _extends({}, attributes.style, { display: selected ? null : 'none' });\n delete attributes.style;\n\n return _react2.default.createElement(\n 'div',\n _extends({}, attributes, {\n className: (0, _classnames2.default)('ReactTabs__TabPanel', className, {\n 'ReactTabs__TabPanel--selected': selected\n }),\n role: 'tabpanel',\n id: id,\n 'aria-labelledby': tabId,\n style: style\n }),\n this.context.forceRenderTabPanel || selected ? children : null\n );\n }\n});\n\n\n/** WEBPACK FOOTER **\n ** ./lib/components/TabPanel.js\n **/"],"sourceRoot":""} \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000000..f3bcaa0797 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,66 @@ +import babelParser from '@babel/eslint-parser'; +import js from '@eslint/js'; +import reactPlugin from 'eslint-plugin-react'; +import importPlugin from 'eslint-plugin-import'; +import jsxA11yPlugin from 'eslint-plugin-jsx-a11y'; +import prettierRecommended from 'eslint-plugin-prettier/recommended'; + +export default [ + js.configs.recommended, + reactPlugin.configs.flat.recommended, + importPlugin.flatConfigs.recommended, + importPlugin.flatConfigs.react, + jsxA11yPlugin.flatConfigs.recommended, + prettierRecommended, + { + ignores: ['webpack.*', '**/lib', '**/dist', '**/esm'], + }, + { + languageOptions: { + parser: babelParser, + + parserOptions: { + requireConfigFile: false, + }, + }, + + settings: { + react: { + version: 'detect', + }, + 'import/resolver': { + node: { + extensions: ['.js', '.jsx'], + }, + }, + }, + + rules: { + 'jsx-a11y/no-static-element-interactions': 'off', + + 'import/no-extraneous-dependencies': [ + 'error', + { + devDependencies: [ + '**/__tests__/**/*', + 'examples/src/**/*.js', + 'rollup.config.js', + 'webpack.config.js', + ], + + optionalDependencies: false, + }, + ], + + 'no-unused-vars': [ + 'error', + { + ignoreRestSiblings: true, + }, + ], + + 'no-console': 'error', + 'react/prop-types': 'off', + }, + }, +]; diff --git a/examples/basic/app.js b/examples/basic/app.js deleted file mode 100644 index fe51d3e8da..0000000000 --- a/examples/basic/app.js +++ /dev/null @@ -1,89 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import { Tab, Tabs, TabList, TabPanel } from '../../src/main'; - -const App = React.createClass({ - render() { - return ( -
      -

      Hint:

      -
        -
      • use keyboard tab to focus tabs
      • -
      • use arrow keys to navigate focused tabs
      • -
      - - - - React - Ember - Angular - - - -

      Just The UI

      -

      Lots of people use React as the V in MVC. Since React makes no assumptions about the rest of your technology stack, it's easy to try it out on a small feature in an existing project.

      - -

      Virtual DOM

      -

      React uses a virtual DOM diff implementation for ultra-high performance. It can also render on the server using Node.js — no heavy browser DOM required.

      - -

      Data Flow

      -

      React implements one-way reactive data flow which reduces boilerplate and is easier to reason about than traditional data binding.

      - -

      Source: React

      -
      - -

      Handlebars

      -

      Write dramatically less code with Ember's Handlebars integrated templates that update automatically when the underlying data changes.

      - -

      Architecture

      -

      Don't waste time making trivial choices. Ember.js incorporates common idioms so you can focus on what makes your app special, not reinventing the wheel.

      - -

      Productivity

      -

      Ember.js is built for productivity. Designed with developer ergonomics in mind, its friendly APIs help you get your job done—fast.

      - -

      Source: Ember

      -
      - -

      Why AngularJS?

      -

      HTML is great for declaring static documents, but it falters when we try to use it for declaring dynamic views in web-applications. AngularJS lets you extend HTML vocabulary for your application. The resulting environment is extraordinarily expressive, readable, and quick to develop.

      - -

      Alternatives

      -

      Other frameworks deal with HTML’s shortcomings by either abstracting away HTML, CSS, and/or JavaScript or by providing an imperative way for manipulating the DOM. Neither of these address the root problem that HTML was not designed for dynamic views.

      - -

      Extensibility

      -

      AngularJS is a toolset for building the framework most suited to your application development. It is fully extensible and works well with other libraries. Every feature can be modified or replaced to suit your unique development workflow and feature needs. Read on to find out how.

      - -

      Source: Angular

      -
      -
      - - - - Mario - Luigi - Peach - Yoshi - - - -

      Mario (Japanese: マãƒĒã‚Ē Hepburn: Mario?) is a fictional character in the Mario video game franchise by Nintendo, created by Japanese video game designer Shigeru Miyamoto. Serving as Nintendo's mascot and the eponymous protagonist of the series, he has a younger brother Luigi. Mario has appeared in over 200 video games since his creation. Depicted as a short, pudgy, Italian plumber who resides in the Mushroom Kingdom, he repeatedly rescues Princess Peach from the Koopa villain Bowser and stops his numerous plans to destroy him and take over the kingdom.

      -

      Source: Wikipedia

      -
      - -

      Luigi (Japanese: ãƒĢイãƒŧジ Hepburn: RuÄĢji?) is a fictional character featured in video games and related media released by Nintendo. Created by prominent game designer Shigeru Miyamoto, Luigi is portrayed as the slightly younger but taller fraternal twin brother of Nintendo's mascot Mario, and appears in many games throughout the Mario franchise, frequently as a sidekick to his brother.

      -

      Source: Wikipedia

      -
      - -

      Princess Peach (Japanese: ピãƒŧチå§Ģ Hepburn: PÄĢchi-hime?) is a character in Nintendo's Mario franchise. Originally created by Shigeru Miyamoto, Peach is the princess of the fictional Mushroom Kingdom, which is constantly under attack by Bowser. She often plays the damsel in distress role within the series and is the lead female.[1] She is often portrayed as Mario's love interest and has appeared in nearly all the Mario games to date with the notable exception of Super Princess Peach, where she is the main playable character.

      -
      - -

      Yoshi (ãƒ¨ãƒƒã‚ˇãƒŧ YosshÄĢ?) /ˈjoƊƃi/ or /ˈjɒʃi/, once romanized as Yossy, is a fictional anthropomorphic dinosaur (referred to as a dragon at times) who appears in video games published by Nintendo. He debuted in Super Mario World (1990) on the Super Nintendo Entertainment System as Mario and Luigi's sidekick (a role he has often reprised), and he later established his own series with several platform and puzzle games, including Super Mario World 2: Yoshi's Island. He has also appeared in many of the spin-off Mario games including the Mario Party, the Mario Kart, and the Super Smash Bros. series, as well as in other various Mario sports titles. Yoshi also appears in New Super Mario Bros. Wii (2009) as the characters' companion and steed, similar to his original debut role in Super Mario World. Yoshi belongs to the species of the same name which comes in various colors, with green being the most common.

      -

      Source: Wikipedia

      -
      -
      -
      - ); - }, -}); - -ReactDOM.render(, document.getElementById('example')); diff --git a/examples/basic/index.html b/examples/basic/index.html deleted file mode 100644 index ccad09406b..0000000000 --- a/examples/basic/index.html +++ /dev/null @@ -1,18 +0,0 @@ - - -React Tabs - - - -
      -

      react-tabs

      -

      React tabs component

      -
      -
      - Fork me on GitHub - - diff --git a/examples/conditional/app.js b/examples/conditional/app.js deleted file mode 100644 index bb4cb5a926..0000000000 --- a/examples/conditional/app.js +++ /dev/null @@ -1,53 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import { Tab, Tabs, TabList, TabPanel } from '../../src/main'; - -const App = React.createClass({ - getInitialState() { - return { - showA: true, - showB: true, - showC: true, - }; - }, - - handleCheckClicked(e) { - const state = {}; - state[e.target.name] = e.target.checked; - this.setState(state); - }, - - render() { - return ( -
      -

      -
      -
      -
      -

      - - - {this.state.showA && Tab A} - {this.state.showB && Tab B} - {this.state.showC && Tab C} - - {this.state.showA && This is tab A} - {this.state.showB && This is tab B} - {this.state.showC && This is tab C} - -
      - ); - }, -}); - -ReactDOM.render(, document.getElementById('example')); - diff --git a/examples/conditional/index.html b/examples/conditional/index.html deleted file mode 100644 index 7c1f048bea..0000000000 --- a/examples/conditional/index.html +++ /dev/null @@ -1,8 +0,0 @@ - - -React Tabs - -
      - - - diff --git a/examples/dyno/app.js b/examples/dyno/app.js deleted file mode 100644 index 98601c18ef..0000000000 --- a/examples/dyno/app.js +++ /dev/null @@ -1,92 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import Modal from 'react-modal'; -import { Tab, Tabs, TabList, TabPanel } from '../../src/main'; - -Modal.setAppElement(document.getElementById('example')); -Modal.injectCSS(); - -const App = React.createClass({ - getInitialState() { - return { - isModalOpen: false, - selectedIndex: -1, - tabs: [ - { label: 'Foo', content: 'This is foo' }, - { label: 'Bar', content: 'This is bar' }, - { label: 'Baz', content: 'This is baz' }, - { label: 'Zap', content: 'This is zap' }, - ], - }; - }, - - render() { - return ( -
      -

      - -

      - - - {this.state.tabs.map((tab, i) => { - return ( - - {tab.label} ✕ - - ); - })} - - {this.state.tabs.map((tab, i) => { - return {tab.content}; - })} - - -

      Add a Tab

      -
      -

      -
      -

      - {' '} - -
      -
      - ); - }, - - openModal() { - this.setState({ - isModalOpen: true, - }); - }, - - closeModal() { - this.setState({ - isModalOpen: false, - }); - }, - - addTab() { - const label = this.refs.label.value; - const content = this.refs.content.value; - - this.state.tabs.push({ - label: label, - content: content, - }); - this.setState({ - selectedIndex: this.state.tabs.length - 1, - }); - this.closeModal(); - }, - - removeTab(index) { - this.state.tabs.splice(index, 1); - this.forceUpdate(); - }, -}); - -ReactDOM.render(, document.getElementById('example')); diff --git a/examples/dyno/index.html b/examples/dyno/index.html deleted file mode 100644 index b828581689..0000000000 --- a/examples/dyno/index.html +++ /dev/null @@ -1,7 +0,0 @@ - - -React Tabs - -
      - - diff --git a/examples/focus/app.js b/examples/focus/app.js deleted file mode 100644 index 361145f14f..0000000000 --- a/examples/focus/app.js +++ /dev/null @@ -1,34 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import { Tab, Tabs, TabList, TabPanel } from '../../src/main'; - -const App = React.createClass({ - handleInputChange() { - this.forceUpdate(); - }, - - render() { - return ( -
      - - - First - Second - - -

      Tab to focus `First`, then arrow to select `Second`.

      -
      - -

      Tab to focus input, then begin typing. Focus should stay.

      - -
      -
      -
      - ); - }, -}); - -ReactDOM.render(, document.getElementById('example')); diff --git a/examples/focus/index.html b/examples/focus/index.html deleted file mode 100644 index 035fee23dd..0000000000 --- a/examples/focus/index.html +++ /dev/null @@ -1,8 +0,0 @@ - - -React Tabs - -
      - - - diff --git a/examples/src/app.js b/examples/src/app.js new file mode 100644 index 0000000000..7e0c5b6f3f --- /dev/null +++ b/examples/src/app.js @@ -0,0 +1,18 @@ +import React from 'react'; +import * as ReactDOM from 'react-dom/client'; +import './example.less'; +import SuperMario from './components/examples/SuperMario'; +import MattGroening from './components/examples/MattGroening'; +import Avengers from './components/examples/Avengers'; +import RightToLeft from './components/examples/RightToLeft'; + +const root = ReactDOM.createRoot(document.getElementById('example')); + +root.render( +
      + + + + +
      , +); diff --git a/examples/src/components/ExampleItem.js b/examples/src/components/ExampleItem.js new file mode 100644 index 0000000000..50b0145b64 --- /dev/null +++ b/examples/src/components/ExampleItem.js @@ -0,0 +1,82 @@ +import React, { Component } from 'react'; +import T from 'prop-types'; +import { Tab, Tabs, TabList, TabPanel } from 'react-tabs'; // eslint-disable-line +import { LiveProvider, LiveEditor, LivePreview, LiveError } from 'react-live'; +import classNames from 'clsx'; +import { themes } from 'prism-react-renderer'; + +const scope = { Tabs, Tab, TabList, TabPanel }; + +export default class ExampleItem extends Component { + state = { + editorOpen: false, + }; + + toggleCheckbox({ target: { name, checked } }) { + this.setState({ + [name]: checked, + }); + } + + handleEditSourceChange = () => { + this.setState({ + editorOpen: !this.state.editorOpen, + }); + }; + + renderHint() { + if (!this.props.hint) return null; + + return
      {this.props.hint}
      ; + } + + render() { + const { editorOpen } = this.state; + const editorClassNames = classNames('live-editor', { + 'live-editor--visible': editorOpen, + }); + const formId = `editorOpen${this.props.label.replace(' ', '_')}`; + + return ( +
      +

      + {this.props.label}{' '} + +

      + {this.renderHint()} + + +
      +
      + +
      + +
      +
      +
      + ); + } +} + +ExampleItem.propTypes = { + label: T.string.isRequired, + hint: T.string.isRequired, + code: T.string.isRequired, +}; diff --git a/examples/src/components/examples/Avengers.js b/examples/src/components/examples/Avengers.js new file mode 100644 index 0000000000..ccb53aa3e3 --- /dev/null +++ b/examples/src/components/examples/Avengers.js @@ -0,0 +1,113 @@ +import React from 'react'; +import ExampleItem from '../ExampleItem'; +import antMan from '../../images/ant_man.png'; +import blackWidow from '../../images/black_widow.png'; +import captain from '../../images/captain_america.png'; +import fury from '../../images/fury.png'; +import hawkeye from '../../images/hawkeye.png'; +import ironman from '../../images/ironman.png'; +import loki from '../../images/loki.png'; +import thor from '../../images/thor.png'; +import warMachine from '../../images/war_machine.png'; + +const code = `class Component extends React.Component { + constructor(props) { + super(props); + + this.characters = [ + { name: "Ant-Man", img: "${antMan}", color: "IndianRed", text: "white", desc: "\\"I do some dumb things, and the people I love the most...they pay the price.\\"" }, + { name: "Black Widow", img: "${blackWidow}", color: "SlateGrey", text: "white", desc: "\\"After everything that happened with S.H.I.E.L.D., during my little hiatus, I went back to Russia and tried to find my parents. Two little graves linked by a chain fence. I pulled some weeds and left some flowers. We have what we have when we have it.\\"" }, + { name: "Captain America", img: "${captain}", color: "RoyalBlue", text: "white", desc: "\\"I'm not looking for forgiveness. And I'm way past asking for permission. Earth just lost their best defender. So we're here to fight. If you wanna stay in our way... we'll fight you, too.\\"" }, + { name: "Director Fury", img: "${fury}", color: "Sienna", text: "white", desc: "\\"Back in the day, I had eyes everywhere, ears everywhere else. Here we all are, back on earth, with nothing but our wit, and our will to save the world. So stand. Outwit the platinum bastard.\\"" }, + { name: "Hawkeye", img: "${hawkeye}", color: "MediumOrchid", text: "white", desc: "\\"Just can't seem to miss.\\"" }, + { name: "Iron Man", img: "${ironman}", color: "LightCoral", text: "black", desc: "\\"My armor was never a distraction or a hobby. It was a cocoon. And now I'm a changed man. You can take away my house, all my tricks and toys. But one thing you can't take away... I am Iron Man.\\"" }, + { name: "Loki", img: "${loki}", color: "LightGreen", text: "black", desc: "\\"I, Loki, Prince of Asgard, Odinson, the rightful King of Jotunheim, God of Mischief, do hereby pledge to you, my undying fidelity.\\"" }, + { name: "Thor", img: "${thor}", color: "SkyBlue", text: "black", desc: "\\"You know I’m 1500 years old. I’ve killed twice as many enemies as that. And every one of them would have rather killed me than not succeeded. I’m only alive because fate wants me alive. Thanos is just the latest of a long line of bastards, and he’ll be the latest to feel my vengeance. Fate wills it so.\\"" }, + { name: "War Machine", img: "${warMachine}", color: "LightGrey", text: "black", desc: "\\"138 combat missions. That's how many I've flown, Tony. Every one of them could've been my last, but I flew 'em. Because the fight needed to be fought.\\"" } + ]; + + this.state = { + "Ant-Man": true, + "Black Widow": true, + "Captain America": true, + "Director Fury": false, + Loki: false, + Hawkeye: true, + "Iron Man": true, + Thor: true, + "War Machine": true, + selectedIndex: 0 + }; + + this.handleCheckClicked = this.handleCheckClicked.bind(this); + } + + handleCheckClicked(e) { + const state = { + [e.target.name]: e.target.checked + }; + if (this.characters.findIndex(({name}) => name === e.target.name) <= this.state.selectedIndex) { + state.selectedIndex = this.state.selectedIndex + (e.target.checked ? 1 : -1); + } + this.setState(state); + } + + render() { + const links = []; + const tabs = []; + const tabPanels = []; + + this.characters.forEach(({ name, img, color: backgroundColor, text: color, desc }) => { + links.push( + + ); + + if (!this.state[name]) return; + + tabs.push( + + {name} + + ); + + tabPanels.push( + + {desc} + + ); + }); + + return ( +
      +

      {links}

      + this.setState({ selectedIndex })} + selectedTabClassName="avengers-tab--selected" + selectedTabPanelClassName="avengers-tab-panel--selected" + > + {tabs} + {tabPanels} + +
      + ); + } +} + +render(Component); +`; + +const hint = + 'This example lets you disable or enable certain Tabs dynamically.'; + +export default () => ( + +); diff --git a/examples/src/components/examples/MattGroening.js b/examples/src/components/examples/MattGroening.js new file mode 100644 index 0000000000..696b4a0bb3 --- /dev/null +++ b/examples/src/components/examples/MattGroening.js @@ -0,0 +1,83 @@ +import React from 'react'; +import ExampleItem from '../ExampleItem'; + +const code = `const Component = ( + + + The Simpsons + Futurama + + + + + Homer Simpson + Marge Simpson + Bart Simpson + Lisa Simpson + Maggie Simpson + + +

      Husband of Marge; father of Bart, Lisa, and Maggie.

      + Homer Simpson +
      + +

      Wife of Homer; mother of Bart, Lisa, and Maggie.

      + Marge Simpson +
      + +

      Oldest child and only son of Homer and Marge; brother of Lisa and Maggie.

      + Bart Simpson +
      + +

      Middle child and eldest daughter of Homer and Marge; sister of Bart and Maggie.

      + Lisa Simpson +
      + +

      Youngest child and daughter of Homer and Marge; sister of Bart and Lisa.

      + Maggie Simpson +
      +
      +
      + + + + Philip J. Fry + Turanga Leela + Bender Bending Rodriguez + Amy Wong + Professor Hubert J. Farnsworth + Doctor John Zoidberg + + +

      Protagonist, from the 20th Century. Delivery boy. Many times great-uncle to Professor Hubert Farnsworth. Suitor of Leela.

      + Philip J. Fry +
      + +

      Mutant cyclops. Captain of the Planet Express Ship. Love interest of Fry.

      + Turanga Leela +
      + +

      A kleptomaniacal, lazy, cigar-smoking, heavy-drinking robot who is Fry's best friend. Built in Tijuana, Mexico, he is the Planet Express Ship's cook.

      + Bender Bending Rodriguez +
      + +

      Chinese-Martian intern at Planet Express. Fonfon Ru of Kif Kroker.

      +
      + +

      Many times great-nephew of Fry. CEO and owner of Planet Express delivery company. Tenured professor of Mars University.

      + Professor Hubert J. Farnsworth +
      + +

      Alien from Decapod 10. Planet Express' staff doctor and steward. Has a medical degree and Ph.D in art history.

      + Doctor John Zoidberg +
      +
      +
      +
      +); + +render(Component);`; + +const hint = 'Tabs can also be nested within each other and will continue to work individually.'; + +export default () => ; diff --git a/examples/src/components/examples/RightToLeft.js b/examples/src/components/examples/RightToLeft.js new file mode 100644 index 0000000000..bc57372702 --- /dev/null +++ b/examples/src/components/examples/RightToLeft.js @@ -0,0 +1,77 @@ +import React from 'react'; +import ExampleItem from '../ExampleItem'; + +const code = `const Component = ( +
      + + + כו×Ēר×Ē + כו×Ēר×Ē ×›×‘×•×™×” + כו×Ēר×Ē ×Š× ×™×™×” + כו×Ēר×Ē ×Š×œ×™×Š×™×Ē + + +

      + לורם איפסום דולור סיט אמט, קונסקטורר אדיפיסינג אלי×Ē ×œ×•×¨× איפסום דולור סיט אמט, קונסקטורר אדיפיסינג אלי×Ē. ץ×Ē ××œ×ž× ×§×•× ניסי נון ניבאה. דס איאקוליס וולופטה דיאם. וסטיבולום אט דולור, קראץ אג×Ē ×œ×§×˜×•×Ą וואל אאוגו וסטיבולום סוליסי טידום ב×ĸליק. קונדימנטום קורוס בליקרה, נונסטי קלובר בריקנה סטום, לפריקך ×Ē×Ļטריק לרטי. +

      +

      + Source:{' '} + + Wikipedia + +

      +
      + +

      + לורם איפסום דולור סיט אמט, קונסקטורר אדיפיסינג אלי×Ē ×œ×•×¨× איפסום דולור סיט אמט, קונסקטורר אדיפיסינג אלי×Ē. ץ×Ē ××œ×ž× ×§×•× ניסי נון ניבאה. דס איאקוליס וולופטה דיאם. וסטיבולום אט דולור, קראץ אג×Ē ×œ×§×˜×•×Ą וואל אאוגו וסטיבולום סוליסי טידום ב×ĸליק. קונדימנטום קורוס בליקרה, נונסטי קלובר בריקנה סטום, לפריקך ×Ē×Ļטריק לרטי. +

      +

      + Source:{' '} + + Wikipedia + +

      +
      + +

      + לורם איפסום דולור סיט אמט, קונסקטורר אדיפיסינג אלי×Ē ×œ×•×¨× איפסום דולור סיט אמט, קונסקטורר אדיפיסינג אלי×Ē. ץ×Ē ××œ×ž× ×§×•× ניסי נון ניבאה. דס איאקוליס וולופטה דיאם. וסטיבולום אט דולור, קראץ אג×Ē ×œ×§×˜×•×Ą וואל אאוגו וסטיבולום סוליסי טידום ב×ĸליק. קונדימנטום קורוס בליקרה, נונסטי קלובר בריקנה סטום, לפריקך ×Ē×Ļטריק לרטי. + לורם איפסום דולור סיט אמט, קונסקטורר אדיפיסינג אלי×Ē ×œ×•×¨× איפסום דולור סיט אמט, קונסקטורר אדיפיסינג אלי×Ē. ץ×Ē ××œ×ž× ×§×•× ניסי נון ניבאה. דס איאקוליס וולופטה דיאם. וסטיבולום אט דולור, קראץ אג×Ē ×œ×§×˜×•×Ą וואל אאוגו וסטיבולום סוליסי טידום ב×ĸליק. קונדימנטום קורוס בליקרה, נונסטי קלובר בריקנה סטום, לפריקך ×Ē×Ļטריק לרטי. + לורם איפסום דולור סיט אמט, קונסקטורר אדיפיסינג אלי×Ē ×œ×•×¨× איפסום דולור סיט אמט, קונסקטורר אדיפיסינג אלי×Ē. ץ×Ē ××œ×ž× ×§×•× ניסי נון ניבאה. דס איאקוליס וולופטה דיאם. וסטיבולום אט דולור, קראץ אג×Ē ×œ×§×˜×•×Ą וואל אאוגו וסטיבולום סוליסי טידום ב×ĸליק. קונדימנטום קורוס בליקרה, נונסטי קלובר בריקנה סטום, לפריקך ×Ē×Ļטריק לרטי. +

      +

      + Source:{' '} + + Wikipedia + +

      +
      + +

      ×Ē×Ē ×›×•×Ēר×Ē

      +

      + לורם איפסום דולור סיט אמט, קונסקטורר אדיפיסינג אלי×Ē ×œ×•×¨× איפסום דולור סיט אמט, קונסקטורר אדיפיסינג אלי×Ē. ץ×Ē ××œ×ž× ×§×•× ניסי נון ניבאה. דס איאקוליס וולופטה דיאם. וסטיבולום אט דולור, קראץ אג×Ē ×œ×§×˜×•×Ą וואל אאוגו וסטיבולום סוליסי טידום ב×ĸליק. קונדימנטום קורוס בליקרה, נונסטי קלובר בריקנה סטום, לפריקך ×Ē×Ļטריק לרטי. + לורם איפסום דולור סיט אמט, קונסקטורר אדיפיסינג אלי×Ē ×œ×•×¨× איפסום דולור סיט אמט, קונסקטורר אדיפיסינג אלי×Ē. ץ×Ē ××œ×ž× ×§×•× ניסי נון ניבאה. דס איאקוליס וולופטה דיאם. וסטיבולום אט דולור, קראץ אג×Ē ×œ×§×˜×•×Ą וואל אאוגו וסטיבולום סוליסי טידום ב×ĸליק. קונדימנטום קורוס בליקרה, נונסטי קלובר בריקנה סטום, לפריקך ×Ē×Ļטריק לרטי. +

      +

      + Source:{' '} + + Wikipedia + +

      +
      +
      +
      +); + +render(Component);`; + +const hint = + 'This is an example of a right to left option. Just pass the `direction` prop to the element'; + +export default () => ( + +); diff --git a/examples/src/components/examples/SuperMario.js b/examples/src/components/examples/SuperMario.js new file mode 100644 index 0000000000..e52226a8cd --- /dev/null +++ b/examples/src/components/examples/SuperMario.js @@ -0,0 +1,107 @@ +import React from 'react'; +import ExampleItem from '../ExampleItem'; + +const code = `const Component = ( + + + Mario + Luigi + Peach + Yoshi + Toad + + + +

      + Mario (Japanese: マãƒĒã‚Ē Hepburn: Mario, [ma.ɞʲi.o]) (English: + /ˈmɑːrioƊ/; Italian: [ˈmaːrjo]) is a fictional character in the Mario video + game franchise, owned by Nintendo and created by Japanese video game designer + Shigeru Miyamoto. Serving as the company's mascot and the eponymous protagonist + of the series, Mario has appeared in over 200 video games since his creation. + Depicted as a short, pudgy, Italian plumber who resides in the Mushroom + Kingdom, his adventures generally center upon rescuing Princess Peach from the + Koopa villain Bowser. His younger brother and sidekick is Luigi. +

      +

      + Source:{' '} + + Wikipedia + +

      +
      + +

      + Luigi (Japanese: ãƒĢイãƒŧジ Hepburn: RuÄĢji, [ɞɯ.iː.dʑiĖĨ]) (English: /luˈiːdʒi/; + Italian: [luˈiːdʒi]) is a fictional character featured in video games and related media + released by Nintendo. Created by prominent game designer Shigeru Miyamoto, Luigi is portrayed + as the slightly younger but taller fraternal twin brother of Nintendo's mascot Mario, and + appears in many games throughout the Mario franchise, often as a sidekick to his brother. +

      +

      + Source:{' '} + + Wikipedia + +

      +
      + +

      + Princess Peach (Japanese: ピãƒŧチå§Ģ Hepburn: PÄĢchi-hime, [piː.tɕiĖĨ çiĖĨ.me]) + is a character in Nintendo's Mario franchise. Originally created by Shigeru Miyamoto, + Peach is the princess of the fictional Mushroom Kingdom, which is constantly under + attack by Bowser. She often plays the damsel in distress role within the series and + is the lead female. She is often portrayed as Mario's love interest and has appeared + in Super Princess Peach, where she is the main playable character. +

      +

      + Source:{' '} + + Wikipedia + +

      +
      + +

      + Yoshi (ãƒ¨ãƒƒã‚ˇãƒŧ YosshÄĢ, [joɕ.ɕiː]) (English: /ˈjoƊƃi/ or /ˈjɒʃi/), once + romanized as Yossy, is a fictional anthropomorphic dinosaur who appears in + video games published by Nintendo. Yoshi debuted in Super Mario World (1990) on the + Super Nintendo Entertainment System as Mario and Luigi's sidekick. Yoshi later starred + in platform and puzzle games, including Super Mario World 2: Yoshi's Island, Yoshi's Story + and Yoshi's Woolly World. Yoshi also appears in many of the Mario spin-off games, including + Mario Party and Mario Kart, various Mario sports games, and Nintendo's crossover fighting + game series Super Smash Bros. Yoshi belongs to the species of the same name, which is + characterized by their variety of colors. +

      +

      + Source:{' '} + + Wikipedia + +

      +
      + +

      + Toad (Japanese: キノピã‚Ē Hepburn: Kinopio) is a fictional character who primarily + appears in Nintendo's Mario franchise. Created by Japanese video game designer Shigeru Miyamoto, + he is portrayed as a citizen of the Mushroom Kingdom and is one of Princess Peach's most loyal + attendants; constantly working on her behalf. He is usually seen as a non-player character (NPC) + who provides assistance to Mario and his friends in most games, but there are times when Toad(s) + takes center stage and appears as a protagonist, as seen in Super Mario Bros. 2, Wario's Woods, + Super Mario 3D World, and Captain Toad: Treasure Tracker. +

      +

      + Source:{' '} + + Wikipedia + +

      +
      +
      +); + +render(Component);`; + +const hint = + 'This is a simple usecase where the Luigi tab is disable by default. You can also use [tab] to focus the tabs and use arrow left/right or up/down to switch tabs.'; + +export default () => ; diff --git a/examples/src/example.less b/examples/src/example.less new file mode 100644 index 0000000000..e67edb3d6f --- /dev/null +++ b/examples/src/example.less @@ -0,0 +1,250 @@ +@import "http://github.com/style/react-tabs.less"; + +@heading-color: black; +@text-color: #333; +@link-color: #007eff; +@gutter: 30px; +@header-bg-color: #3c72a9; +@header-color: #d3e9ff; + +body { + color: @text-color; + font-family: Helvetica Neue, Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.4; + margin: 0; + padding: 0; +} + +a { + color: @link-color; + text-decoration: none; + + &:hover { + text-decoration: underline; + } +} + +.container { + margin-left: auto; + margin-right: auto; + max-width: 850px; + padding: 0 @gutter; +} + +h1, h2, h3 { + font-weight: 500; + line-height: 1; + margin-top: 0; +} + +// common + +.page-body, +.page-footer, +.page-header { + padding: @gutter 0; +} + +// header + +.page-header { + background-color: @header-bg-color; + color: @header-color; + text-align: center; + + &__title { + color: white; + font-size: 3em; + margin-bottom: 0.33em; + } + &__subtitle { + font-size: 1.2em; + margin-bottom: 1em; + font-weight: 300; + line-height: 1.4; + } + + &__link { + border-bottom: 1px solid fade(white, 30%); + color: white; + text-decoration: none; + + &:hover, + &:focus { + border-bottom-color: white; + outline: none; + text-decoration: none; + } + } + + &__button { + display: inline-block; + margin-bottom: 2rem; + color: rgba(255,255,255,0.9); + background-color: rgba(255,255,255,0.08); + border-color: rgba(255,255,255,0.2) !important; + border-style: solid; + border-width: 1px; + border-radius: 0.3rem; + transition: color 0.2s, background-color 0.2s, border-color 0.2s; + text-decoration: none; + + &:hover { + color: white; + text-decoration: none; + background-color: rgba(255,255,255,0.2); + border-color: rgba(255,255,255,0.3); + text-decoration: none; + } + } +} + +// subheader + +.page-subheader { + background-color: mix(@link-color, white, 10%); + line-height: 20px; + padding: @gutter 0; +} +.page-subheader__button { + float: right; +} +.page-subheader__link { + border-bottom: 1px solid fade(@link-color, 30%); + outline: none; + text-decoration: none; + + &:hover, + &:focus { + border-bottom-color: @link-color; + outline: none; + text-decoration: none; + } +} + +// footer + +.page-footer { + background-color: #fafafa; + color: #999; + padding: @gutter 0; + text-align: center; + + a { + color: black; + } + + img.browserstack { + height: 50px; + margin-bottom: 15px + } +} + +// Miscellaneous +// ------------------------------ + +.section { + margin-bottom: 40px; + + .source-checkbox-label { + border: none; + cursor: pointer; + color: @link-color; + text-decoration: none; + font-size: .7em; + } + + .react-live-preview { + padding: 2em; + } + + .live-preview { + box-shadow: 0.055rem 0.055rem 1.11rem rgba(20,20,20,0.27); + + .live-editor { + background-color: rgb(40, 42, 54); + font-family: "Source Code Pro", monospace; + font-size: 0.875rem; + height: 0; + overflow-y: scroll; + transition: height .2s; + max-width: 850px; + + &--visible { + height: 300px; + } + } + } +} + +.hint { + font-size: .95em; + margin: 15px 0; + color: #666; +} + +.avengers-tab-list { + margin: 0; + padding: 0; +} + +.avengers-tab { + display: inline-block; + position: relative; + list-style: none; + padding: 6px 12px 0; + cursor: pointer; + border-radius: 5px 5px 0 0; + margin-right: 2px; + + &--selected { + box-shadow: 2px -1px 2px 0px rgba(0,0,0,0.5); + background: #fff; + color: black; + z-index: 3; + } +} + +.avengers-tab-panel { + padding: 10px; + display: none; + z-index: 2; + position: relative; + + &--selected { + box-shadow: 2px -1px 2px 0px rgba(0,0,0,0.5); + display: block; + } +} + +// layout changes based on screen dimensions + +@media (max-width: 767px) { + .page-header__button { + display: block; + padding: 0.75rem; + font-size: 0.9rem; + } + + .section { + .live-preview { + .live-editor { + max-width: ~"calc(100vw - 60px)"; + } + } + } +} + +@media (min-width: 768px) { + .page-header__button { + padding: 0.75rem 1rem; + } + .page-body, + .page-header { + padding: 3em 0 1.5em; + } + .page-header { + font-size: 1.4em; + } +} diff --git a/examples/src/example/index.html b/examples/src/example/index.html new file mode 100644 index 0000000000..50a61ce052 --- /dev/null +++ b/examples/src/example/index.html @@ -0,0 +1,10 @@ + + + +Redirectingâ€Ļ + + +

      Redirectingâ€Ļ

      +Click here if you are not redirected. + + diff --git a/examples/src/images/Browserstack-logo.svg b/examples/src/images/Browserstack-logo.svg new file mode 100644 index 0000000000..3687005625 --- /dev/null +++ b/examples/src/images/Browserstack-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/src/images/ant_man.png b/examples/src/images/ant_man.png new file mode 100644 index 0000000000..a4f72b173e Binary files /dev/null and b/examples/src/images/ant_man.png differ diff --git a/examples/src/images/black_widow.png b/examples/src/images/black_widow.png new file mode 100644 index 0000000000..61a123ad8c Binary files /dev/null and b/examples/src/images/black_widow.png differ diff --git a/examples/src/images/captain_america.png b/examples/src/images/captain_america.png new file mode 100644 index 0000000000..03252dd674 Binary files /dev/null and b/examples/src/images/captain_america.png differ diff --git a/examples/src/images/fury.png b/examples/src/images/fury.png new file mode 100644 index 0000000000..d4df01df44 Binary files /dev/null and b/examples/src/images/fury.png differ diff --git a/examples/src/images/hawkeye.png b/examples/src/images/hawkeye.png new file mode 100644 index 0000000000..a577839da9 Binary files /dev/null and b/examples/src/images/hawkeye.png differ diff --git a/examples/src/images/hulk.png b/examples/src/images/hulk.png new file mode 100644 index 0000000000..099ef45a91 Binary files /dev/null and b/examples/src/images/hulk.png differ diff --git a/examples/src/images/ironman.png b/examples/src/images/ironman.png new file mode 100644 index 0000000000..8da2887b35 Binary files /dev/null and b/examples/src/images/ironman.png differ diff --git a/examples/src/images/loki.png b/examples/src/images/loki.png new file mode 100644 index 0000000000..cb6338432b Binary files /dev/null and b/examples/src/images/loki.png differ diff --git a/examples/src/images/thor.png b/examples/src/images/thor.png new file mode 100644 index 0000000000..a8a3726552 Binary files /dev/null and b/examples/src/images/thor.png differ diff --git a/examples/src/images/war_machine.png b/examples/src/images/war_machine.png new file mode 100644 index 0000000000..bfe50757b8 Binary files /dev/null and b/examples/src/images/war_machine.png differ diff --git a/examples/src/index.html b/examples/src/index.html new file mode 100644 index 0000000000..3763967ac8 --- /dev/null +++ b/examples/src/index.html @@ -0,0 +1,38 @@ + + + + React-Tabs + + + + + + + + + + + + +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      Supported by
      +
      Browserstack
      +
      Copyright © Daniel Tschinder 2017-2023. MIT Licensed.
      +
      +
      + diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000000..cf7af97c66 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,52 @@ +import { FunctionComponent, HTMLProps } from 'react'; + +export interface TabsProps + extends Omit, 'className' | 'onSelect' | 'ref'> { + className?: string | string[] | { [name: string]: boolean } | undefined; + defaultFocus?: boolean | undefined; + defaultIndex?: number | undefined; + direction?: 'rtl' | 'ltr' | undefined; + disabledTabClassName?: string | undefined; + disableUpDownKeys?: boolean | undefined; + disableLeftRightKeys?: boolean | undefined; + domRef?: ((node?: HTMLElement) => void) | undefined; + environment?: Window | undefined; + focusTabOnClick?: boolean | undefined; + forceRenderTabPanel?: boolean | undefined; + onSelect?: + | ((index: number, last: number, event: Event) => boolean | void) + | undefined; + selectedIndex?: number | undefined; + selectedTabClassName?: string | undefined; + selectedTabPanelClassName?: string | undefined; +} + +export interface TabListProps + extends Omit, 'className'> { + className?: string | string[] | { [name: string]: boolean } | undefined; +} + +export interface TabProps + extends Omit, 'className' | 'tabIndex'> { + className?: string | string[] | { [name: string]: boolean } | undefined; + disabled?: boolean | undefined; + disabledClassName?: string | undefined; + selectedClassName?: string | undefined; + tabIndex?: string | undefined; +} + +export interface TabPanelProps + extends Omit, 'className'> { + className?: string | string[] | { [name: string]: boolean } | undefined; + forceRender?: boolean | undefined; + selectedClassName?: string | undefined; +} + +export interface ReactTabsFunctionComponent

      extends FunctionComponent

      { + tabsRole: 'Tabs' | 'TabList' | 'Tab' | 'TabPanel'; +} + +export const Tabs: FunctionComponent; +export const TabList: FunctionComponent; +export const Tab: FunctionComponent; +export const TabPanel: FunctionComponent; diff --git a/package.json b/package.json index 926f4fdb47..45803c57cc 100644 --- a/package.json +++ b/package.json @@ -1,21 +1,27 @@ { "name": "react-tabs", - "version": "0.5.5", - "description": "React tabs component", - "main": "lib/main.js", + "version": "0.0.0-development", + "description": "An accessible and easy tab component for ReactJS", + "main": "lib/index.js", + "module": "esm/index.js", + "typings": "index.d.ts", "scripts": { - "clean": "rimraf lib", - "build:commonjs": "babel src/ --out-dir lib/ --ignore __tests__,__mocks__", - "build:umd": "webpack --devtool source-map --config webpack.build.js", - "build:umd:min": "cross-env MINIFY=1 webpack --devtool source-map --config webpack.build.js", - "build": "npm run clean && npm run build:commonjs", - "bundle": "mkdir -p dist && npm run build:umd && npm run build:umd:min", - "lint": "eslint src", - "preversion": "npm run lint && npm test && npm run bundle && git add dist/ && git commit -m 'Publish: build bower distribution'", - "prepublish": "npm run build", - "test": "jest", - "start": "webpack-dev-server --inline --content-base examples/" + "clean:commonjs": "rm -rf lib", + "clean:esm": "rm -rf esm", + "build:commonjs": "cross-env BABEL_OUTPUT=commonjs babel src/ --out-dir lib/ --ignore **/__tests__,**/__mocks__", + "build:esm": "babel src/ --out-dir esm/ --ignore **/__tests__,**/__mocks__", + "build": "pnpm run --sequential '/clean:.*|build:.*/'", + "format": "eslint src --fix --report-unused-disable-directives", + "lint": "eslint src --report-unused-disable-directives", + "prebump": "pnpm run --sequential '/lint|test/'", + "prepublishOnly": "pnpm run build", + "test": "vitest run", + "start": "webpack serve", + "website:clean": "rm -rf examples/dist", + "website:build": "cross-env BABEL_TARGET=examples NODE_ENV=production webpack", + "website:redirect": "cp -R examples/src/example examples/dist" }, + "packageManager": "pnpm@10.12.1", "repository": { "type": "git", "url": "https://github.com/reactjs/react-tabs.git" @@ -26,8 +32,10 @@ "url": "https://github.com/reactjs/react-tabs/issues" }, "files": [ - "dist", - "lib" + "esm", + "lib", + "style", + "index.d.ts" ], "homepage": "https://github.com/reactjs/react-tabs", "keywords": [ @@ -37,44 +45,51 @@ "react-component" ], "peerDependencies": { - "react": "^0.14.7 || ^15.0.0", - "react-dom": "^0.14.7 || ^15.0.0" + "react": "^18.0.0 || ^19.0.0" }, "devDependencies": { - "babel-cli": "^6.9.0", - "babel-core": "^6.9.1", - "babel-jest": "^12.1.0", - "babel-loader": "^6.2.4", - "babel-preset-es2015": "^6.9.0", - "babel-preset-react": "^6.5.0", - "cross-env": "^1.0.8", - "enzyme": "^2.3.0", - "eslint": "^2.11.1", - "eslint-config-airbnb": "^9.0.1", - "eslint-plugin-import": "^1.8.0", - "eslint-plugin-jsx-a11y": "^1.2.2", - "eslint-plugin-react": "^5.1.1", - "jest-cli": "^12.1.1", - "react": "^15.0.0", - "react-addons-test-utils": "^15.0.0", - "react-dom": "^15.0.0", - "react-modal": "^1.3.0", - "rimraf": "^2.5.2", - "webpack": "^1.13.1", - "webpack-dev-server": "^1.14.1" + "@babel/cli": "7.27.2", + "@babel/core": "7.27.4", + "@babel/eslint-parser": "7.27.5", + "@babel/preset-env": "7.27.2", + "@babel/preset-react": "7.27.1", + "@eslint/js": "9.29.0", + "@testing-library/dom": "10.4.0", + "@testing-library/jest-dom": "6.6.3", + "@testing-library/react": "16.3.0", + "@testing-library/user-event": "14.6.1", + "@vitest/coverage-v8": "3.2.3", + "babel-loader": "10.0.0", + "babel-plugin-transform-react-remove-prop-types": "0.4.24", + "cross-env": "7.0.3", + "css-loader": "7.1.2", + "css-minimizer-webpack-plugin": "7.0.2", + "eslint": "9.29.0", + "eslint-config-prettier": "10.1.5", + "eslint-plugin-import": "2.31.0", + "eslint-plugin-jsx-a11y": "6.10.2", + "eslint-plugin-prettier": "5.4.1", + "eslint-plugin-react": "7.37.5", + "hoist-non-react-statics": "3.3.2", + "html-loader": "5.1.0", + "html-webpack-plugin": "5.6.3", + "jsdom": "26.1.0", + "less": "4.3.0", + "less-loader": "12.3.0", + "mini-css-extract-plugin": "2.9.2", + "prettier": "3.5.3", + "prism-react-renderer": "2.4.1", + "react": "19.1.0", + "react-dom": "19.1.0", + "react-live": "4.1.8", + "react-modal": "3.16.3", + "vitest": "3.2.3", + "webpack": "5.99.9", + "webpack-cli": "6.0.1", + "webpack-dev-server": "5.2.2" }, "dependencies": { - "classnames": "^2.2", - "js-stylesheet": "^0.0.1" - }, - "jest": { - "automock": false, - "testPathDirs": [ - "src" - ], - "unmockedModulePathPatterns": [ - "node_modules", - "babel" - ] + "clsx": "^2.0.0", + "prop-types": "^15.5.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000000..3331b57684 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,8865 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + clsx: + specifier: ^2.0.0 + version: 2.1.1 + prop-types: + specifier: ^15.5.0 + version: 15.8.1 + devDependencies: + '@babel/cli': + specifier: 7.27.2 + version: 7.27.2(@babel/core@7.27.4) + '@babel/core': + specifier: 7.27.4 + version: 7.27.4 + '@babel/eslint-parser': + specifier: 7.27.5 + version: 7.27.5(@babel/core@7.27.4)(eslint@9.29.0) + '@babel/preset-env': + specifier: 7.27.2 + version: 7.27.2(@babel/core@7.27.4) + '@babel/preset-react': + specifier: 7.27.1 + version: 7.27.1(@babel/core@7.27.4) + '@eslint/js': + specifier: 9.29.0 + version: 9.29.0 + '@testing-library/dom': + specifier: 10.4.0 + version: 10.4.0 + '@testing-library/jest-dom': + specifier: 6.6.3 + version: 6.6.3 + '@testing-library/react': + specifier: 16.3.0 + version: 16.3.0(@testing-library/dom@10.4.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@testing-library/user-event': + specifier: 14.6.1 + version: 14.6.1(@testing-library/dom@10.4.0) + '@vitest/coverage-v8': + specifier: 3.2.3 + version: 3.2.3(vitest@3.2.3(@types/node@22.15.30)(jsdom@26.1.0)(less@4.3.0)(terser@5.41.0)) + babel-loader: + specifier: 10.0.0 + version: 10.0.0(@babel/core@7.27.4)(webpack@5.99.9) + babel-plugin-transform-react-remove-prop-types: + specifier: 0.4.24 + version: 0.4.24 + cross-env: + specifier: 7.0.3 + version: 7.0.3 + css-loader: + specifier: 7.1.2 + version: 7.1.2(webpack@5.99.9) + css-minimizer-webpack-plugin: + specifier: 7.0.2 + version: 7.0.2(webpack@5.99.9) + eslint: + specifier: 9.29.0 + version: 9.29.0 + eslint-config-prettier: + specifier: 10.1.5 + version: 10.1.5(eslint@9.29.0) + eslint-plugin-import: + specifier: 2.31.0 + version: 2.31.0(eslint@9.29.0) + eslint-plugin-jsx-a11y: + specifier: 6.10.2 + version: 6.10.2(eslint@9.29.0) + eslint-plugin-prettier: + specifier: 5.4.1 + version: 5.4.1(@types/eslint@9.6.1)(eslint-config-prettier@10.1.5(eslint@9.29.0))(eslint@9.29.0)(prettier@3.5.3) + eslint-plugin-react: + specifier: 7.37.5 + version: 7.37.5(eslint@9.29.0) + hoist-non-react-statics: + specifier: 3.3.2 + version: 3.3.2 + html-loader: + specifier: 5.1.0 + version: 5.1.0(webpack@5.99.9) + html-webpack-plugin: + specifier: 5.6.3 + version: 5.6.3(webpack@5.99.9) + jsdom: + specifier: 26.1.0 + version: 26.1.0 + less: + specifier: 4.3.0 + version: 4.3.0 + less-loader: + specifier: 12.3.0 + version: 12.3.0(less@4.3.0)(webpack@5.99.9) + mini-css-extract-plugin: + specifier: 2.9.2 + version: 2.9.2(webpack@5.99.9) + prettier: + specifier: 3.5.3 + version: 3.5.3 + prism-react-renderer: + specifier: 2.4.1 + version: 2.4.1(react@19.1.0) + react: + specifier: 19.1.0 + version: 19.1.0 + react-dom: + specifier: 19.1.0 + version: 19.1.0(react@19.1.0) + react-live: + specifier: 4.1.8 + version: 4.1.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react-modal: + specifier: 3.16.3 + version: 3.16.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + vitest: + specifier: 3.2.3 + version: 3.2.3(@types/node@22.15.30)(jsdom@26.1.0)(less@4.3.0)(terser@5.41.0) + webpack: + specifier: 5.99.9 + version: 5.99.9(webpack-cli@6.0.1) + webpack-cli: + specifier: 6.0.1 + version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9) + webpack-dev-server: + specifier: 5.2.2 + version: 5.2.2(webpack-cli@6.0.1)(webpack@5.99.9) + +packages: + + '@adobe/css-tools@4.4.3': + resolution: {integrity: sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@asamuzakjp/css-color@3.2.0': + resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} + + '@babel/cli@7.27.2': + resolution: {integrity: sha512-cfd7DnGlhH6OIyuPSSj3vcfIdnbXukhAyKY8NaZrFadC7pXyL9mOL5WgjcptiEJLi5k3j8aYvLIVCzezrWTaiA==} + engines: {node: '>=6.9.0'} + hasBin: true + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.27.5': + resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.27.4': + resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} + engines: {node: '>=6.9.0'} + + '@babel/eslint-parser@7.27.5': + resolution: {integrity: sha512-HLkYQfRICudzcOtjGwkPvGc5nF1b4ljLZh1IRDj50lRZ718NAKVgQpIAUX8bfg6u/yuSKY3L7E0YzIV+OxrB8Q==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 + + '@babel/generator@7.27.5': + resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.27.1': + resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.27.1': + resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.4': + resolution: {integrity: sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.27.3': + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.27.1': + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.27.1': + resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.27.6': + resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.27.5': + resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1': + resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': + resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': + resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': + resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1': + resolution: {integrity: sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.27.1': + resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.27.1': + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.27.1': + resolution: {integrity: sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.27.1': + resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.27.1': + resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.27.5': + resolution: {integrity: sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.27.1': + resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.27.1': + resolution: {integrity: sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.27.1': + resolution: {integrity: sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.27.1': + resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.27.3': + resolution: {integrity: sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.27.1': + resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.27.1': + resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-dynamic-import@7.27.1': + resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.27.1': + resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.27.1': + resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.27.1': + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.27.1': + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.27.1': + resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.27.1': + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.27.1': + resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.27.1': + resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.27.1': + resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.27.1': + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.27.1': + resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.27.1': + resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.27.1': + resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': + resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.27.1': + resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.27.3': + resolution: {integrity: sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.27.1': + resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.27.1': + resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.27.1': + resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.27.1': + resolution: {integrity: sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.27.1': + resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.27.1': + resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.27.1': + resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-display-name@7.27.1': + resolution: {integrity: sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-development@7.27.1': + resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx@7.27.1': + resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-pure-annotations@7.27.1': + resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.27.5': + resolution: {integrity: sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regexp-modifiers@7.27.1': + resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-reserved-words@7.27.1': + resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.27.1': + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.27.1': + resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.27.1': + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.27.1': + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.27.1': + resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.27.1': + resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.27.1': + resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.27.1': + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.27.1': + resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.27.2': + resolution: {integrity: sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/preset-react@7.27.1': + resolution: {integrity: sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.27.6': + resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.27.4': + resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.27.6': + resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} + + '@csstools/color-helpers@5.0.2': + resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-color-parser@3.0.10': + resolution: {integrity: sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + + '@discoveryjs/json-ext@0.6.3': + resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==} + engines: {node: '>=14.17.0'} + + '@esbuild/aix-ppc64@0.25.5': + resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.5': + resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.5': + resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.5': + resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.5': + resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.5': + resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.5': + resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.5': + resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.5': + resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.5': + resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.5': + resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.5': + resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.5': + resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.5': + resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.5': + resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.5': + resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.5': + resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.5': + resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.5': + resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.5': + resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.5': + resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.25.5': + resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.5': + resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.5': + resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.5': + resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.20.1': + resolution: {integrity: sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.2.2': + resolution: {integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.14.0': + resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.29.0': + resolution: {integrity: sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.3.1': + resolution: {integrity: sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jsonjoy.com/base64@1.1.2': + resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@1.2.0': + resolution: {integrity: sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/util@1.6.0': + resolution: {integrity: sha512-sw/RMbehRhN68WRtcKCpQOPfnH6lLP4GJfqzi3iYej8tnzpZUDr6UkZYJjcjjC0FWEJOJbyM3PTIwxucUmDG2A==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@leichtgewicht/ip-codec@2.0.5': + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + + '@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3': + resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==} + + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.2.7': + resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@rollup/rollup-android-arm-eabi@4.42.0': + resolution: {integrity: sha512-gldmAyS9hpj+H6LpRNlcjQWbuKUtb94lodB9uCz71Jm+7BxK1VIOo7y62tZZwxhA7j1ylv/yQz080L5WkS+LoQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.42.0': + resolution: {integrity: sha512-bpRipfTgmGFdCZDFLRvIkSNO1/3RGS74aWkJJTFJBH7h3MRV4UijkaEUeOMbi9wxtxYmtAbVcnMtHTPBhLEkaw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.42.0': + resolution: {integrity: sha512-JxHtA081izPBVCHLKnl6GEA0w3920mlJPLh89NojpU2GsBSB6ypu4erFg/Wx1qbpUbepn0jY4dVWMGZM8gplgA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.42.0': + resolution: {integrity: sha512-rv5UZaWVIJTDMyQ3dCEK+m0SAn6G7H3PRc2AZmExvbDvtaDc+qXkei0knQWcI3+c9tEs7iL/4I4pTQoPbNL2SA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.42.0': + resolution: {integrity: sha512-fJcN4uSGPWdpVmvLuMtALUFwCHgb2XiQjuECkHT3lWLZhSQ3MBQ9pq+WoWeJq2PrNxr9rPM1Qx+IjyGj8/c6zQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.42.0': + resolution: {integrity: sha512-CziHfyzpp8hJpCVE/ZdTizw58gr+m7Y2Xq5VOuCSrZR++th2xWAz4Nqk52MoIIrV3JHtVBhbBsJcAxs6NammOQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.42.0': + resolution: {integrity: sha512-UsQD5fyLWm2Fe5CDM7VPYAo+UC7+2Px4Y+N3AcPh/LdZu23YcuGPegQly++XEVaC8XUTFVPscl5y5Cl1twEI4A==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.42.0': + resolution: {integrity: sha512-/i8NIrlgc/+4n1lnoWl1zgH7Uo0XK5xK3EDqVTf38KvyYgCU/Rm04+o1VvvzJZnVS5/cWSd07owkzcVasgfIkQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.42.0': + resolution: {integrity: sha512-eoujJFOvoIBjZEi9hJnXAbWg+Vo1Ov8n/0IKZZcPZ7JhBzxh2A+2NFyeMZIRkY9iwBvSjloKgcvnjTbGKHE44Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.42.0': + resolution: {integrity: sha512-/3NrcOWFSR7RQUQIuZQChLND36aTU9IYE4j+TB40VU78S+RA0IiqHR30oSh6P1S9f9/wVOenHQnacs/Byb824g==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.42.0': + resolution: {integrity: sha512-O8AplvIeavK5ABmZlKBq9/STdZlnQo7Sle0LLhVA7QT+CiGpNVe197/t8Aph9bhJqbDVGCHpY2i7QyfEDDStDg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.42.0': + resolution: {integrity: sha512-6Qb66tbKVN7VyQrekhEzbHRxXXFFD8QKiFAwX5v9Xt6FiJ3BnCVBuyBxa2fkFGqxOCSGGYNejxd8ht+q5SnmtA==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.42.0': + resolution: {integrity: sha512-KQETDSEBamQFvg/d8jajtRwLNBlGc3aKpaGiP/LvEbnmVUKlFta1vqJqTrvPtsYsfbE/DLg5CC9zyXRX3fnBiA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.42.0': + resolution: {integrity: sha512-qMvnyjcU37sCo/tuC+JqeDKSuukGAd+pVlRl/oyDbkvPJ3awk6G6ua7tyum02O3lI+fio+eM5wsVd66X0jQtxw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.42.0': + resolution: {integrity: sha512-I2Y1ZUgTgU2RLddUHXTIgyrdOwljjkmcZ/VilvaEumtS3Fkuhbw4p4hgHc39Ypwvo2o7sBFNl2MquNvGCa55Iw==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.42.0': + resolution: {integrity: sha512-Gfm6cV6mj3hCUY8TqWa63DB8Mx3NADoFwiJrMpoZ1uESbK8FQV3LXkhfry+8bOniq9pqY1OdsjFWNsSbfjPugw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.42.0': + resolution: {integrity: sha512-g86PF8YZ9GRqkdi0VoGlcDUb4rYtQKyTD1IVtxxN4Hpe7YqLBShA7oHMKU6oKTCi3uxwW4VkIGnOaH/El8de3w==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.42.0': + resolution: {integrity: sha512-+axkdyDGSp6hjyzQ5m1pgcvQScfHnMCcsXkx8pTgy/6qBmWVhtRVlgxjWwDp67wEXXUr0x+vD6tp5W4x6V7u1A==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.42.0': + resolution: {integrity: sha512-F+5J9pelstXKwRSDq92J0TEBXn2nfUrQGg+HK1+Tk7VOL09e0gBqUHugZv7SW4MGrYj41oNCUe3IKCDGVlis2g==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.42.0': + resolution: {integrity: sha512-LpHiJRwkaVz/LqjHjK8LCi8osq7elmpwujwbXKNW88bM8eeGxavJIKKjkjpMHAh/2xfnrt1ZSnhTv41WYUHYmA==} + cpu: [x64] + os: [win32] + + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@testing-library/dom@10.4.0': + resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} + engines: {node: '>=18'} + + '@testing-library/jest-dom@6.6.3': + resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + + '@testing-library/react@16.3.0': + resolution: {integrity: sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==} + engines: {node: '>=18'} + peerDependencies: + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 || ^19.0.0 + '@types/react-dom': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@testing-library/user-event@14.6.1': + resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + + '@trysound/sax@0.2.0': + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + + '@types/bonjour@3.5.13': + resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + + '@types/connect-history-api-fallback@1.5.4': + resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/express-serve-static-core@4.19.6': + resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} + + '@types/express@4.17.23': + resolution: {integrity: sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==} + + '@types/html-minifier-terser@6.1.0': + resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + + '@types/http-proxy@1.17.16': + resolution: {integrity: sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/node-forge@1.3.11': + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + + '@types/node@22.15.30': + resolution: {integrity: sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==} + + '@types/prismjs@1.26.5': + resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} + + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/retry@0.12.2': + resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + + '@types/send@0.17.5': + resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} + + '@types/serve-index@1.9.4': + resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + + '@types/serve-static@1.15.8': + resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} + + '@types/sockjs@0.3.36': + resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + + '@vitest/coverage-v8@3.2.3': + resolution: {integrity: sha512-D1QKzngg8PcDoCE8FHSZhREDuEy+zcKmMiMafYse41RZpBE5EDJyKOTdqK3RQfsV2S2nyKor5KCs8PyPRFqKPg==} + peerDependencies: + '@vitest/browser': 3.2.3 + vitest: 3.2.3 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/expect@3.2.3': + resolution: {integrity: sha512-W2RH2TPWVHA1o7UmaFKISPvdicFJH+mjykctJFoAkUw+SPTJTGjUNdKscFBrqM7IPnCVu6zihtKYa7TkZS1dkQ==} + + '@vitest/mocker@3.2.3': + resolution: {integrity: sha512-cP6fIun+Zx8he4rbWvi+Oya6goKQDZK+Yq4hhlggwQBbrlOQ4qtZ+G4nxB6ZnzI9lyIb+JnvyiJnPC2AGbKSPA==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.2.3': + resolution: {integrity: sha512-yFglXGkr9hW/yEXngO+IKMhP0jxyFw2/qys/CK4fFUZnSltD+MU7dVYGrH8rvPcK/O6feXQA+EU33gjaBBbAng==} + + '@vitest/runner@3.2.3': + resolution: {integrity: sha512-83HWYisT3IpMaU9LN+VN+/nLHVBCSIUKJzGxC5RWUOsK1h3USg7ojL+UXQR3b4o4UBIWCYdD2fxuzM7PQQ1u8w==} + + '@vitest/snapshot@3.2.3': + resolution: {integrity: sha512-9gIVWx2+tysDqUmmM1L0hwadyumqssOL1r8KJipwLx5JVYyxvVRfxvMq7DaWbZZsCqZnu/dZedaZQh4iYTtneA==} + + '@vitest/spy@3.2.3': + resolution: {integrity: sha512-JHu9Wl+7bf6FEejTCREy+DmgWe+rQKbK+y32C/k5f4TBIAlijhJbRBIRIOCEpVevgRsCQR2iHRUH2/qKVM/plw==} + + '@vitest/utils@3.2.3': + resolution: {integrity: sha512-4zFBCU5Pf+4Z6v+rwnZ1HU1yzOKKvDkMXZrymE2PBlbjKJRlrOxbvpfPSvJTGRIwGoahaOGvp+kbCoxifhzJ1Q==} + + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + + '@webpack-cli/configtest@3.0.1': + resolution: {integrity: sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==} + engines: {node: '>=18.12.0'} + peerDependencies: + webpack: ^5.82.0 + webpack-cli: 6.x.x + + '@webpack-cli/info@3.0.1': + resolution: {integrity: sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==} + engines: {node: '>=18.12.0'} + peerDependencies: + webpack: ^5.82.0 + webpack-cli: 6.x.x + + '@webpack-cli/serve@3.0.1': + resolution: {integrity: sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==} + engines: {node: '>=18.12.0'} + peerDependencies: + webpack: ^5.82.0 + webpack-cli: 6.x.x + webpack-dev-server: '*' + peerDependenciesMeta: + webpack-dev-server: + optional: true + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-html-community@0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + + ast-v8-to-istanbul@0.3.3: + resolution: {integrity: sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axe-core@4.10.3: + resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} + engines: {node: '>=4'} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + babel-loader@10.0.0: + resolution: {integrity: sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==} + engines: {node: ^18.20.0 || ^20.10.0 || >=22.0.0} + peerDependencies: + '@babel/core': ^7.12.0 + webpack: '>=5.61.0' + + babel-plugin-polyfill-corejs2@0.4.13: + resolution: {integrity: sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.11.1: + resolution: {integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.4: + resolution: {integrity: sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-transform-react-remove-prop-types@0.4.24: + resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + bonjour-service@1.3.0: + resolution: {integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.25.0: + resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + + caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + + caniuse-lite@1.0.30001721: + resolution: {integrity: sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==} + + chai@5.2.0: + resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} + engines: {node: '>=12'} + + chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.8.0: + resolution: {integrity: sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==} + engines: {node: '>= 0.8.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + + copy-anything@2.0.6: + resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + + core-js-compat@3.42.0: + resolution: {integrity: sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-declaration-sorter@7.2.0: + resolution: {integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.0.9 + + css-loader@7.1.2: + resolution: {integrity: sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.27.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + css-minimizer-webpack-plugin@7.0.2: + resolution: {integrity: sha512-nBRWZtI77PBZQgcXMNqiIXVshiQOVLGSf2qX/WZfG8IQfMbeHUMXaBWQmiiSTmPJUflQxHjZjzAmuyO7tpL2Jg==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@parcel/css': '*' + '@swc/css': '*' + clean-css: '*' + csso: '*' + esbuild: '*' + lightningcss: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + '@parcel/css': + optional: true + '@swc/css': + optional: true + clean-css: + optional: true + csso: + optional: true + esbuild: + optional: true + lightningcss: + optional: true + + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssnano-preset-default@7.0.7: + resolution: {integrity: sha512-jW6CG/7PNB6MufOrlovs1TvBTEVmhY45yz+bd0h6nw3h6d+1e+/TX+0fflZ+LzvZombbT5f+KC063w9VoHeHow==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + cssnano-utils@5.0.1: + resolution: {integrity: sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + cssnano@7.0.7: + resolution: {integrity: sha512-evKu7yiDIF7oS+EIpwFlMF730ijRyLFaM2o5cTxRGJR9OKHKkc+qP443ZEVR9kZG0syaAJJCPJyfv5pbrxlSng==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + cssstyle@4.4.0: + resolution: {integrity: sha512-W0Y2HOXlPkb2yaKrCVRjinYKciu/qSLEmK0K9mcfDei3zwlnHFEHAs/Du3cIRwPqY+J4JsiBzUjoHyc8RsJ03A==} + engines: {node: '>=18'} + + damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decimal.js@10.5.0: + resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + + default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + + dom-converter@0.2.0: + resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.165: + resolution: {integrity: sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + engines: {node: '>=10.13.0'} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + envinfo@7.14.0: + resolution: {integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==} + engines: {node: '>=4'} + hasBin: true + + errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esbuild@0.25.5: + resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@10.1.5: + resolution: {integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-module-utils@2.12.0: + resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import@2.31.0: + resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jsx-a11y@6.10.2: + resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + + eslint-plugin-prettier@5.4.1: + resolution: {integrity: sha512-9dF+KuU/Ilkq27A8idRP7N2DH8iUR6qXcjF3FR2wETY21PZdBrIjwCau8oboyGj9b7etWmTGEeM8e7oOed6ZWg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.29.0: + resolution: {integrity: sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + exenv@1.2.2: + resolution: {integrity: sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==} + + expect-type@1.2.1: + resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} + engines: {node: '>=12.0.0'} + + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + engines: {node: '>= 0.10.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + + fdir@6.4.5: + resolution: {integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-readdir-recursive@1.1.0: + resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + handle-thing@2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + hpack.js@2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + html-loader@5.1.0: + resolution: {integrity: sha512-Jb3xwDbsm0W3qlXrCZwcYqYGnYz55hb6aoKQTlzyZPXsPpi6tHXzAfqalecglMQgNvtEfxrCQPaKT90Irt5XDA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.0.0 + + html-minifier-terser@6.1.0: + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} + engines: {node: '>=12'} + hasBin: true + + html-minifier-terser@7.2.0: + resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + + html-webpack-plugin@5.6.3: + resolution: {integrity: sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==} + engines: {node: '>=10.13.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.20.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + htmlparser2@6.1.0: + resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + + http-deceiver@1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + + http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-parser-js@0.5.10: + resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + http-proxy-middleware@2.0.9: + resolution: {integrity: sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true + + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + hyperdyperid@1.2.0: + resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} + engines: {node: '>=10.18'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + ipaddr.js@2.2.0: + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + engines: {node: '>= 10'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-network-error@1.1.0: + resolution: {integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==} + engines: {node: '>=16'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + is-what@3.14.1: + resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsdom@26.1.0: + resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + + launch-editor@2.10.0: + resolution: {integrity: sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==} + + less-loader@12.3.0: + resolution: {integrity: sha512-0M6+uYulvYIWs52y0LqN4+QM9TqWAohYSNTo4htE8Z7Cn3G/qQMEmktfHmyJT23k+20kU9zHH2wrfFXkxNLtVw==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + less: ^3.5.0 || ^4.0.0 + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + less@4.3.0: + resolution: {integrity: sha512-X9RyH9fvemArzfdP8Pi3irr7lor2Ok4rOttDXBhlwDg+wKQsXOXgHWduAJE1EsF7JJx0w0bcO6BC6tCKKYnXKA==} + engines: {node: '>=14'} + hasBin: true + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + memfs@4.17.2: + resolution: {integrity: sha512-NgYhCOWgovOXSzvYgUW0LQ7Qy72rWQMGGFJDoWg4G30RHd3z77VbYdtJ4fembJXBy8pMIUA31XNAupobOQlwdg==} + engines: {node: '>= 4.0.0'} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + mini-css-extract-plugin@2.9.2: + resolution: {integrity: sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multicast-dns@7.2.5: + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + hasBin: true + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + needle@3.3.1: + resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} + engines: {node: '>= 4.4.x'} + hasBin: true + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + nwsapi@2.2.20: + resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + open@10.1.2: + resolution: {integrity: sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==} + engines: {node: '>=18'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-retry@6.2.1: + resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} + engines: {node: '>=16.17'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-node-version@1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss-calc@10.1.1: + resolution: {integrity: sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==} + engines: {node: ^18.12 || ^20.9 || >=22.0} + peerDependencies: + postcss: ^8.4.38 + + postcss-colormin@7.0.3: + resolution: {integrity: sha512-xZxQcSyIVZbSsl1vjoqZAcMYYdnJsIyG8OvqShuuqf12S88qQboxxEy0ohNCOLwVPXTU+hFHvJPACRL2B5ohTA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-convert-values@7.0.5: + resolution: {integrity: sha512-0VFhH8nElpIs3uXKnVtotDJJNX0OGYSZmdt4XfSfvOMrFw1jKfpwpZxfC4iN73CTM/MWakDEmsHQXkISYj4BXw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-discard-comments@7.0.4: + resolution: {integrity: sha512-6tCUoql/ipWwKtVP/xYiFf1U9QgJ0PUvxN7pTcsQ8Ns3Fnwq1pU5D5s1MhT/XySeLq6GXNvn37U46Ded0TckWg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-discard-duplicates@7.0.2: + resolution: {integrity: sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-discard-empty@7.0.1: + resolution: {integrity: sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-discard-overridden@7.0.1: + resolution: {integrity: sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-merge-longhand@7.0.5: + resolution: {integrity: sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-merge-rules@7.0.5: + resolution: {integrity: sha512-ZonhuSwEaWA3+xYbOdJoEReKIBs5eDiBVLAGpYZpNFPzXZcEE5VKR7/qBEQvTZpiwjqhhqEQ+ax5O3VShBj9Wg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-minify-font-values@7.0.1: + resolution: {integrity: sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-minify-gradients@7.0.1: + resolution: {integrity: sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-minify-params@7.0.3: + resolution: {integrity: sha512-vUKV2+f5mtjewYieanLX0xemxIp1t0W0H/D11u+kQV/MWdygOO7xPMkbK+r9P6Lhms8MgzKARF/g5OPXhb8tgg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-minify-selectors@7.0.5: + resolution: {integrity: sha512-x2/IvofHcdIrAm9Q+p06ZD1h6FPcQ32WtCRVodJLDR+WMn8EVHI1kvLxZuGKz/9EY5nAmI6lIQIrpo4tBy5+ug==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.2.0: + resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.1: + resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-normalize-charset@7.0.1: + resolution: {integrity: sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-display-values@7.0.1: + resolution: {integrity: sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-positions@7.0.1: + resolution: {integrity: sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-repeat-style@7.0.1: + resolution: {integrity: sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-string@7.0.1: + resolution: {integrity: sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-timing-functions@7.0.1: + resolution: {integrity: sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-unicode@7.0.3: + resolution: {integrity: sha512-EcoA29LvG3F+EpOh03iqu+tJY3uYYKzArqKJHxDhUYLa2u58aqGq16K6/AOsXD9yqLN8O6y9mmePKN5cx6krOw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-url@7.0.1: + resolution: {integrity: sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-whitespace@7.0.1: + resolution: {integrity: sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-ordered-values@7.0.2: + resolution: {integrity: sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-reduce-initial@7.0.3: + resolution: {integrity: sha512-RFvkZaqiWtGMlVjlUHpaxGqEL27lgt+Q2Ixjf83CRAzqdo+TsDyGPtJUbPx2MuYIJ+sCQc2TrOvRnhcXQfgIVA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-reduce-transforms@7.0.1: + resolution: {integrity: sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + engines: {node: '>=4'} + + postcss-svgo@7.0.2: + resolution: {integrity: sha512-5Dzy66JlnRM6pkdOTF8+cGsB1fnERTE8Nc+Eed++fOWo1hdsBptCsbG8UuJkgtZt75bRtMJIrPeZmtfANixdFA==} + engines: {node: ^18.12.0 || ^20.9.0 || >= 18} + peerDependencies: + postcss: ^8.4.32 + + postcss-unique-selectors@7.0.4: + resolution: {integrity: sha512-pmlZjsmEAG7cHd7uK3ZiNSW6otSZ13RHuZ/4cDN/bVglS5EpF2r2oxY99SuOHa8m7AWoBCelTS3JPpzsIs8skQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.4: + resolution: {integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + engines: {node: '>=14'} + hasBin: true + + pretty-error@4.0.0: + resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + prism-react-renderer@2.4.1: + resolution: {integrity: sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==} + peerDependencies: + react: '>=16.0.0' + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + react-dom@19.1.0: + resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} + peerDependencies: + react: ^19.1.0 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react-lifecycles-compat@3.0.4: + resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} + + react-live@4.1.8: + resolution: {integrity: sha512-B2SgNqwPuS2ekqj4lcxi5TibEcjWkdVyYykBEUBshPAPDQ527x2zPEZg560n8egNtAjUpwXFQm7pcXV65aAYmg==} + engines: {node: '>= 0.12.0', npm: '>= 2.0.0'} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + react-modal@3.16.3: + resolution: {integrity: sha512-yCYRJB5YkeQDQlTt17WGAgFJ7jr2QYcWa1SHqZ3PluDmnKJ/7+tVU+E6uKyZ0nODaeEj+xCpK4LcSnKXLMC0Nw==} + peerDependencies: + react: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19 + react-dom: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19 + + react@19.1.0: + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + engines: {node: '>=0.10.0'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regenerate-unicode-properties@10.2.0: + resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + regexpu-core@6.2.0: + resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} + engines: {node: '>=4'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.12.0: + resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} + hasBin: true + + relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + + renderkid@3.0.0: + resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + rollup@4.42.0: + resolution: {integrity: sha512-LW+Vse3BJPyGJGAJt1j8pWDKPd73QM8cRXYK1IxOBgL2AGLu7Xd2YOW0M2sLUBCkF5MshXXtMApyEAEzMVMsnw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + + run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + + schema-utils@4.3.2: + resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} + engines: {node: '>= 10.13.0'} + + select-hose@2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + + selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + serve-index@1.9.1: + resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + engines: {node: '>= 0.8.0'} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@2.0.0: + resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} + engines: {node: '>=6'} + + sockjs@0.3.24: + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spdy-transport@3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + + spdy@4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.includes@2.0.1: + resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} + engines: {node: '>= 0.4'} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + + stylehacks@7.0.5: + resolution: {integrity: sha512-5kNb7V37BNf0Q3w+1pxfa+oiNPS++/b4Jil9e/kPDgrk1zjEd6uR7SZeJiYaLYH6RRSC1XX2/37OTeU/4FvuIA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svgo@3.3.2: + resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} + engines: {node: '>=14.0.0'} + hasBin: true + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + synckit@0.11.8: + resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} + engines: {node: ^14.18.0 || >=16.0.0} + + tapable@2.2.2: + resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} + engines: {node: '>=6'} + + terser-webpack-plugin@5.3.14: + resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.41.0: + resolution: {integrity: sha512-H406eLPXpZbAX14+B8psIuvIr8+3c+2hkuYzpMkoE0ij+NdsVATbA78vb8neA/eqrj7rywa2pIkdmWRsXW6wmw==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + thingies@1.21.0: + resolution: {integrity: sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==} + engines: {node: '>=10.18'} + peerDependencies: + tslib: ^2 + + thunky@1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + + tinypool@1.1.0: + resolution: {integrity: sha512-7CotroY9a8DKsKprEy/a14aCCm8jYVmR7aFy4fpkZM8sdpNJbKkixuNjgM50yCmip2ezc8z4N7k3oe2+rfRJCQ==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.3: + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + engines: {node: '>=14.0.0'} + + tldts-core@6.1.86: + resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} + + tldts@6.1.86: + resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} + hasBin: true + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tough-cookie@5.1.2: + resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} + engines: {node: '>=16'} + + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + + tree-dump@1.0.3: + resolution: {integrity: sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.0: + resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + use-editable@2.3.3: + resolution: {integrity: sha512-7wVD2JbfAFJ3DK0vITvXBdpd9JAz5BcKAAolsnLBuBn6UDDwBGuCIAGvR3yA2BNKm578vAMVHFCWaOcA+BhhiA==} + peerDependencies: + react: '>= 16.8.0' + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utila@0.4.0: + resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vite-node@3.2.3: + resolution: {integrity: sha512-gc8aAifGuDIpZHrPjuHyP4dpQmYXqWw7D1GmDnWeNWP654UEXzVfQ5IHPSK5HaHkwB/+p1atpYpSdw/2kOv8iQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + + vite@6.3.5: + resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@3.2.3: + resolution: {integrity: sha512-E6U2ZFXe3N/t4f5BwUaVCKRLHqUpk1CBWeMh78UT4VaTPH/2dyvH6ALl29JTovEPu9dVKr/K/J4PkXgrMbw4Ww==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.3 + '@vitest/ui': 3.2.3 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + warning@4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + + watchpack@2.4.4: + resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} + engines: {node: '>=10.13.0'} + + wbuf@1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + webpack-cli@6.0.1: + resolution: {integrity: sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==} + engines: {node: '>=18.12.0'} + hasBin: true + peerDependencies: + webpack: ^5.82.0 + webpack-bundle-analyzer: '*' + webpack-dev-server: '*' + peerDependenciesMeta: + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + + webpack-dev-middleware@7.4.2: + resolution: {integrity: sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + + webpack-dev-server@5.2.2: + resolution: {integrity: sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==} + engines: {node: '>= 18.12.0'} + hasBin: true + peerDependencies: + webpack: ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + + webpack-merge@6.0.1: + resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} + engines: {node: '>=18.0.0'} + + webpack-sources@3.3.2: + resolution: {integrity: sha512-ykKKus8lqlgXX/1WjudpIEjqsafjOTcOJqxnAbMLAu/KCsDCJ6GBtvscewvTkrn24HsnvFwrSCbenFrhtcCsAA==} + engines: {node: '>=10.13.0'} + + webpack@5.99.9: + resolution: {integrity: sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + + websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.18.2: + resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@adobe/css-tools@4.4.3': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@asamuzakjp/css-color@3.2.0': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 10.4.3 + + '@babel/cli@7.27.2(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@jridgewell/trace-mapping': 0.3.25 + commander: 6.2.1 + convert-source-map: 2.0.0 + fs-readdir-recursive: 1.1.0 + glob: 7.2.3 + make-dir: 2.1.0 + slash: 2.0.0 + optionalDependencies: + '@nicolo-ribaudo/chokidar-2': 2.1.8-no-fsevents.3 + chokidar: 3.6.0 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.27.5': {} + + '@babel/core@7.27.4': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helpers': 7.27.6 + '@babel/parser': 7.27.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 + convert-source-map: 2.0.0 + debug: 4.4.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/eslint-parser@7.27.5(@babel/core@7.27.4)(eslint@9.29.0)': + dependencies: + '@babel/core': 7.27.4 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 9.29.0 + eslint-visitor-keys: 2.1.0 + semver: 6.3.1 + + '@babel/generator@7.27.5': + dependencies: + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.27.6 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.27.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.27.4 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.2.0 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.1 + lodash.debounce: 4.0.8 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + '@babel/helper-member-expression-to-functions@7.27.1': + dependencies: + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.27.6 + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.27.1 + '@babel/traverse': 7.27.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.27.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helper-wrap-function@7.27.1': + dependencies: + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.27.6': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 + + '@babel/parser@7.27.5': + dependencies: + '@babel/types': 7.27.6 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.4 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.4) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.4 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-async-generator-functions@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) + '@babel/traverse': 7.27.4 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-block-scoping@7.27.5(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) + '@babel/traverse': 7.27.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.2 + + '@babel/plugin-transform-destructuring@7.27.3(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.27.4 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.4 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-object-rest-spread@7.27.3(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) + '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) + + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-display-name@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/types': 7.27.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regenerator@7.27.5(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/preset-env@7.27.2(@babel/core@7.27.4)': + dependencies: + '@babel/compat-data': 7.27.5 + '@babel/core': 7.27.4 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.4) + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.27.4) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-async-generator-functions': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-block-scoping': 7.27.5(@babel/core@7.27.4) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) + '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-object-rest-spread': 7.27.3(@babel/core@7.27.4) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-regenerator': 7.27.5(@babel/core@7.27.4) + '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.27.4) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.27.4) + babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.27.4) + babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.4) + babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.27.4) + core-js-compat: 3.42.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.27.6 + esutils: 2.0.3 + + '@babel/preset-react@7.27.1(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-react-display-name': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.27.4) + transitivePeerDependencies: + - supports-color + + '@babel/runtime@7.27.6': {} + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 + + '@babel/traverse@7.27.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.5 + '@babel/parser': 7.27.5 + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 + debug: 4.4.1 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.27.6': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@bcoe/v8-coverage@1.0.2': {} + + '@csstools/color-helpers@5.0.2': {} + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-color-parser@3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.0.2 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-tokenizer@3.0.4': {} + + '@discoveryjs/json-ext@0.6.3': {} + + '@esbuild/aix-ppc64@0.25.5': + optional: true + + '@esbuild/android-arm64@0.25.5': + optional: true + + '@esbuild/android-arm@0.25.5': + optional: true + + '@esbuild/android-x64@0.25.5': + optional: true + + '@esbuild/darwin-arm64@0.25.5': + optional: true + + '@esbuild/darwin-x64@0.25.5': + optional: true + + '@esbuild/freebsd-arm64@0.25.5': + optional: true + + '@esbuild/freebsd-x64@0.25.5': + optional: true + + '@esbuild/linux-arm64@0.25.5': + optional: true + + '@esbuild/linux-arm@0.25.5': + optional: true + + '@esbuild/linux-ia32@0.25.5': + optional: true + + '@esbuild/linux-loong64@0.25.5': + optional: true + + '@esbuild/linux-mips64el@0.25.5': + optional: true + + '@esbuild/linux-ppc64@0.25.5': + optional: true + + '@esbuild/linux-riscv64@0.25.5': + optional: true + + '@esbuild/linux-s390x@0.25.5': + optional: true + + '@esbuild/linux-x64@0.25.5': + optional: true + + '@esbuild/netbsd-arm64@0.25.5': + optional: true + + '@esbuild/netbsd-x64@0.25.5': + optional: true + + '@esbuild/openbsd-arm64@0.25.5': + optional: true + + '@esbuild/openbsd-x64@0.25.5': + optional: true + + '@esbuild/sunos-x64@0.25.5': + optional: true + + '@esbuild/win32-arm64@0.25.5': + optional: true + + '@esbuild/win32-ia32@0.25.5': + optional: true + + '@esbuild/win32-x64@0.25.5': + optional: true + + '@eslint-community/eslint-utils@4.7.0(eslint@9.29.0)': + dependencies: + eslint: 9.29.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/config-array@0.20.1': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.1 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.2.2': {} + + '@eslint/core@0.14.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.1': + dependencies: + ajv: 6.12.6 + debug: 4.4.1 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.29.0': {} + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.3.1': + dependencies: + '@eslint/core': 0.14.0 + levn: 0.4.1 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 22.15.30 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/json-pack@1.2.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) + '@jsonjoy.com/util': 1.6.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 1.21.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/util@1.6.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@leichtgewicht/ip-codec@2.0.5': {} + + '@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3': + optional: true + + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + dependencies: + eslint-scope: 5.1.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.2.7': {} + + '@rollup/rollup-android-arm-eabi@4.42.0': + optional: true + + '@rollup/rollup-android-arm64@4.42.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.42.0': + optional: true + + '@rollup/rollup-darwin-x64@4.42.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.42.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.42.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.42.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.42.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.42.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.42.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.42.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.42.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.42.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.42.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.42.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.42.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.42.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.42.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.42.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.42.0': + optional: true + + '@rtsao/scc@1.1.0': {} + + '@sinclair/typebox@0.27.8': {} + + '@testing-library/dom@10.4.0': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/runtime': 7.27.6 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + + '@testing-library/jest-dom@6.6.3': + dependencies: + '@adobe/css-tools': 4.4.3 + aria-query: 5.3.2 + chalk: 3.0.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + lodash: 4.17.21 + redent: 3.0.0 + + '@testing-library/react@16.3.0(@testing-library/dom@10.4.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@babel/runtime': 7.27.6 + '@testing-library/dom': 10.4.0 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.0)': + dependencies: + '@testing-library/dom': 10.4.0 + + '@trysound/sax@0.2.0': {} + + '@types/aria-query@5.0.4': {} + + '@types/body-parser@1.19.6': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 22.15.30 + + '@types/bonjour@3.5.13': + dependencies: + '@types/node': 22.15.30 + + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + + '@types/connect-history-api-fallback@1.5.4': + dependencies: + '@types/express-serve-static-core': 4.19.6 + '@types/node': 22.15.30 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.15.30 + + '@types/deep-eql@4.0.2': {} + + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.8 + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + + '@types/estree@1.0.7': {} + + '@types/estree@1.0.8': {} + + '@types/express-serve-static-core@4.19.6': + dependencies: + '@types/node': 22.15.30 + '@types/qs': 6.14.0 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.5 + + '@types/express@4.17.23': + dependencies: + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 4.19.6 + '@types/qs': 6.14.0 + '@types/serve-static': 1.15.8 + + '@types/html-minifier-terser@6.1.0': {} + + '@types/http-errors@2.0.5': {} + + '@types/http-proxy@1.17.16': + dependencies: + '@types/node': 22.15.30 + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': {} + + '@types/mime@1.3.5': {} + + '@types/node-forge@1.3.11': + dependencies: + '@types/node': 22.15.30 + + '@types/node@22.15.30': + dependencies: + undici-types: 6.21.0 + + '@types/prismjs@1.26.5': {} + + '@types/qs@6.14.0': {} + + '@types/range-parser@1.2.7': {} + + '@types/retry@0.12.2': {} + + '@types/send@0.17.5': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 22.15.30 + + '@types/serve-index@1.9.4': + dependencies: + '@types/express': 4.17.23 + + '@types/serve-static@1.15.8': + dependencies: + '@types/http-errors': 2.0.5 + '@types/node': 22.15.30 + '@types/send': 0.17.5 + + '@types/sockjs@0.3.36': + dependencies: + '@types/node': 22.15.30 + + '@types/ws@8.18.1': + dependencies: + '@types/node': 22.15.30 + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.33': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@vitest/coverage-v8@3.2.3(vitest@3.2.3(@types/node@22.15.30)(jsdom@26.1.0)(less@4.3.0)(terser@5.41.0))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 1.0.2 + ast-v8-to-istanbul: 0.3.3 + debug: 4.4.1 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + magic-string: 0.30.17 + magicast: 0.3.5 + std-env: 3.9.0 + test-exclude: 7.0.1 + tinyrainbow: 2.0.0 + vitest: 3.2.3(@types/node@22.15.30)(jsdom@26.1.0)(less@4.3.0)(terser@5.41.0) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@3.2.3': + dependencies: + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.3 + '@vitest/utils': 3.2.3 + chai: 5.2.0 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.2.3(vite@6.3.5(@types/node@22.15.30)(less@4.3.0)(terser@5.41.0))': + dependencies: + '@vitest/spy': 3.2.3 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 6.3.5(@types/node@22.15.30)(less@4.3.0)(terser@5.41.0) + + '@vitest/pretty-format@3.2.3': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.2.3': + dependencies: + '@vitest/utils': 3.2.3 + pathe: 2.0.3 + strip-literal: 3.0.0 + + '@vitest/snapshot@3.2.3': + dependencies: + '@vitest/pretty-format': 3.2.3 + magic-string: 0.30.17 + pathe: 2.0.3 + + '@vitest/spy@3.2.3': + dependencies: + tinyspy: 4.0.3 + + '@vitest/utils@3.2.3': + dependencies: + '@vitest/pretty-format': 3.2.3 + loupe: 3.1.3 + tinyrainbow: 2.0.0 + + '@webassemblyjs/ast@1.14.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + + '@webassemblyjs/helper-api-error@1.13.2': {} + + '@webassemblyjs/helper-buffer@1.14.1': {} + + '@webassemblyjs/helper-numbers@1.13.2': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + + '@webassemblyjs/helper-wasm-section@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + + '@webassemblyjs/ieee754@1.13.2': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.13.2': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.13.2': {} + + '@webassemblyjs/wasm-edit@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + '@webassemblyjs/wasm-gen@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wasm-opt@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + '@webassemblyjs/wasm-parser@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wast-printer@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + + '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.99.9)': + dependencies: + webpack: 5.99.9(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9) + + '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.99.9)': + dependencies: + webpack: 5.99.9(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9) + + '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.99.9)': + dependencies: + webpack: 5.99.9(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9) + optionalDependencies: + webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.99.9) + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + agent-base@7.1.3: {} + + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-keywords@5.1.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + fast-deep-equal: 3.1.3 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-html-community@0.0.8: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@2.0.1: {} + + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + aria-query@5.3.2: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-flatten@1.1.1: {} + + array-includes@3.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.findlastindex@1.2.6: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + assertion-error@2.0.1: {} + + ast-types-flow@0.0.8: {} + + ast-v8-to-istanbul@0.3.3: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + estree-walker: 3.0.3 + js-tokens: 9.0.1 + + async-function@1.0.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axe-core@4.10.3: {} + + axobject-query@4.1.0: {} + + babel-loader@10.0.0(@babel/core@7.27.4)(webpack@5.99.9): + dependencies: + '@babel/core': 7.27.4 + find-up: 5.0.0 + webpack: 5.99.9(webpack-cli@6.0.1) + + babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.27.4): + dependencies: + '@babel/compat-data': 7.27.5 + '@babel/core': 7.27.4 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.27.4): + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) + core-js-compat: 3.42.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.27.4): + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) + transitivePeerDependencies: + - supports-color + + babel-plugin-transform-react-remove-prop-types@0.4.24: {} + + balanced-match@1.0.2: {} + + batch@0.6.1: {} + + binary-extensions@2.3.0: {} + + body-parser@1.20.3: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + bonjour-service@1.3.0: + dependencies: + fast-deep-equal: 3.1.3 + multicast-dns: 7.2.5 + + boolbase@1.0.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.25.0: + dependencies: + caniuse-lite: 1.0.30001721 + electron-to-chromium: 1.5.165 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.0) + + buffer-from@1.1.2: {} + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.0.0 + + bytes@3.1.2: {} + + cac@6.7.14: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camel-case@4.1.2: + dependencies: + pascal-case: 3.1.2 + tslib: 2.8.1 + + caniuse-api@3.0.0: + dependencies: + browserslist: 4.25.0 + caniuse-lite: 1.0.30001721 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + + caniuse-lite@1.0.30001721: {} + + chai@5.2.0: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.3 + pathval: 2.0.0 + + chalk@3.0.0: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + check-error@2.1.1: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chrome-trace-event@1.0.4: {} + + ci-info@3.9.0: {} + + clean-css@5.3.3: + dependencies: + source-map: 0.6.1 + + clone-deep@4.0.1: + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + + clsx@2.1.1: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colord@2.9.3: {} + + colorette@2.0.20: {} + + commander@10.0.1: {} + + commander@12.1.0: {} + + commander@2.20.3: {} + + commander@4.1.1: {} + + commander@6.2.1: {} + + commander@7.2.0: {} + + commander@8.3.0: {} + + compressible@2.0.18: + dependencies: + mime-db: 1.54.0 + + compression@1.8.0: + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + debug: 2.6.9 + negotiator: 0.6.4 + on-headers: 1.0.2 + safe-buffer: 5.2.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + concat-map@0.0.1: {} + + connect-history-api-fallback@2.0.0: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + convert-source-map@2.0.0: {} + + cookie-signature@1.0.6: {} + + cookie@0.7.1: {} + + copy-anything@2.0.6: + dependencies: + is-what: 3.14.1 + + core-js-compat@3.42.0: + dependencies: + browserslist: 4.25.0 + + core-util-is@1.0.3: {} + + cross-env@7.0.3: + dependencies: + cross-spawn: 7.0.6 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-declaration-sorter@7.2.0(postcss@8.5.4): + dependencies: + postcss: 8.5.4 + + css-loader@7.1.2(webpack@5.99.9): + dependencies: + icss-utils: 5.1.0(postcss@8.5.4) + postcss: 8.5.4 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.4) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.4) + postcss-modules-scope: 3.2.1(postcss@8.5.4) + postcss-modules-values: 4.0.0(postcss@8.5.4) + postcss-value-parser: 4.2.0 + semver: 7.7.2 + optionalDependencies: + webpack: 5.99.9(webpack-cli@6.0.1) + + css-minimizer-webpack-plugin@7.0.2(webpack@5.99.9): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + cssnano: 7.0.7(postcss@8.5.4) + jest-worker: 29.7.0 + postcss: 8.5.4 + schema-utils: 4.3.2 + serialize-javascript: 6.0.2 + webpack: 5.99.9(webpack-cli@6.0.1) + + css-select@4.3.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + + css-select@5.1.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.1 + + css-what@6.1.0: {} + + css.escape@1.5.1: {} + + cssesc@3.0.0: {} + + cssnano-preset-default@7.0.7(postcss@8.5.4): + dependencies: + browserslist: 4.25.0 + css-declaration-sorter: 7.2.0(postcss@8.5.4) + cssnano-utils: 5.0.1(postcss@8.5.4) + postcss: 8.5.4 + postcss-calc: 10.1.1(postcss@8.5.4) + postcss-colormin: 7.0.3(postcss@8.5.4) + postcss-convert-values: 7.0.5(postcss@8.5.4) + postcss-discard-comments: 7.0.4(postcss@8.5.4) + postcss-discard-duplicates: 7.0.2(postcss@8.5.4) + postcss-discard-empty: 7.0.1(postcss@8.5.4) + postcss-discard-overridden: 7.0.1(postcss@8.5.4) + postcss-merge-longhand: 7.0.5(postcss@8.5.4) + postcss-merge-rules: 7.0.5(postcss@8.5.4) + postcss-minify-font-values: 7.0.1(postcss@8.5.4) + postcss-minify-gradients: 7.0.1(postcss@8.5.4) + postcss-minify-params: 7.0.3(postcss@8.5.4) + postcss-minify-selectors: 7.0.5(postcss@8.5.4) + postcss-normalize-charset: 7.0.1(postcss@8.5.4) + postcss-normalize-display-values: 7.0.1(postcss@8.5.4) + postcss-normalize-positions: 7.0.1(postcss@8.5.4) + postcss-normalize-repeat-style: 7.0.1(postcss@8.5.4) + postcss-normalize-string: 7.0.1(postcss@8.5.4) + postcss-normalize-timing-functions: 7.0.1(postcss@8.5.4) + postcss-normalize-unicode: 7.0.3(postcss@8.5.4) + postcss-normalize-url: 7.0.1(postcss@8.5.4) + postcss-normalize-whitespace: 7.0.1(postcss@8.5.4) + postcss-ordered-values: 7.0.2(postcss@8.5.4) + postcss-reduce-initial: 7.0.3(postcss@8.5.4) + postcss-reduce-transforms: 7.0.1(postcss@8.5.4) + postcss-svgo: 7.0.2(postcss@8.5.4) + postcss-unique-selectors: 7.0.4(postcss@8.5.4) + + cssnano-utils@5.0.1(postcss@8.5.4): + dependencies: + postcss: 8.5.4 + + cssnano@7.0.7(postcss@8.5.4): + dependencies: + cssnano-preset-default: 7.0.7(postcss@8.5.4) + lilconfig: 3.1.3 + postcss: 8.5.4 + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + + cssstyle@4.4.0: + dependencies: + '@asamuzakjp/css-color': 3.2.0 + rrweb-cssom: 0.8.0 + + damerau-levenshtein@1.0.8: {} + + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.4.1: + dependencies: + ms: 2.1.3 + + decimal.js@10.5.0: {} + + deep-eql@5.0.2: {} + + deep-is@0.1.4: {} + + default-browser-id@5.0.0: {} + + default-browser@5.2.1: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-lazy-prop@3.0.0: {} + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + depd@1.1.2: {} + + depd@2.0.0: {} + + dequal@2.0.3: {} + + destroy@1.2.0: {} + + detect-node@2.1.0: {} + + dns-packet@5.6.1: + dependencies: + '@leichtgewicht/ip-codec': 2.0.5 + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + dom-accessibility-api@0.5.16: {} + + dom-accessibility-api@0.6.3: {} + + dom-converter@0.2.0: + dependencies: + utila: 0.4.0 + + dom-serializer@1.4.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@4.3.1: + dependencies: + domelementtype: 2.3.0 + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@2.8.0: + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.165: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + enhanced-resolve@5.18.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.2 + + entities@2.2.0: {} + + entities@4.5.0: {} + + entities@6.0.1: {} + + envinfo@7.14.0: {} + + errno@0.1.8: + dependencies: + prr: 1.0.1 + optional: true + + es-abstract@1.24.0: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-iterator-helpers@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esbuild@0.25.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.5 + '@esbuild/android-arm': 0.25.5 + '@esbuild/android-arm64': 0.25.5 + '@esbuild/android-x64': 0.25.5 + '@esbuild/darwin-arm64': 0.25.5 + '@esbuild/darwin-x64': 0.25.5 + '@esbuild/freebsd-arm64': 0.25.5 + '@esbuild/freebsd-x64': 0.25.5 + '@esbuild/linux-arm': 0.25.5 + '@esbuild/linux-arm64': 0.25.5 + '@esbuild/linux-ia32': 0.25.5 + '@esbuild/linux-loong64': 0.25.5 + '@esbuild/linux-mips64el': 0.25.5 + '@esbuild/linux-ppc64': 0.25.5 + '@esbuild/linux-riscv64': 0.25.5 + '@esbuild/linux-s390x': 0.25.5 + '@esbuild/linux-x64': 0.25.5 + '@esbuild/netbsd-arm64': 0.25.5 + '@esbuild/netbsd-x64': 0.25.5 + '@esbuild/openbsd-arm64': 0.25.5 + '@esbuild/openbsd-x64': 0.25.5 + '@esbuild/sunos-x64': 0.25.5 + '@esbuild/win32-arm64': 0.25.5 + '@esbuild/win32-ia32': 0.25.5 + '@esbuild/win32-x64': 0.25.5 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-prettier@10.1.5(eslint@9.29.0): + dependencies: + eslint: 9.29.0 + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.0(eslint-import-resolver-node@0.3.9)(eslint@9.29.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + eslint: 9.29.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + + eslint-plugin-import@2.31.0(eslint@9.29.0): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.29.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.0(eslint-import-resolver-node@0.3.9)(eslint@9.29.0) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-jsx-a11y@6.10.2(eslint@9.29.0): + dependencies: + aria-query: 5.3.2 + array-includes: 3.1.9 + array.prototype.flatmap: 1.3.3 + ast-types-flow: 0.0.8 + axe-core: 4.10.3 + axobject-query: 4.1.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 9.29.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + safe-regex-test: 1.1.0 + string.prototype.includes: 2.0.1 + + eslint-plugin-prettier@5.4.1(@types/eslint@9.6.1)(eslint-config-prettier@10.1.5(eslint@9.29.0))(eslint@9.29.0)(prettier@3.5.3): + dependencies: + eslint: 9.29.0 + prettier: 3.5.3 + prettier-linter-helpers: 1.0.0 + synckit: 0.11.8 + optionalDependencies: + '@types/eslint': 9.6.1 + eslint-config-prettier: 10.1.5(eslint@9.29.0) + + eslint-plugin-react@7.37.5(eslint@9.29.0): + dependencies: + array-includes: 3.1.9 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.2.1 + eslint: 9.29.0 + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.9 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@2.1.0: {} + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint@9.29.0: + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.20.1 + '@eslint/config-helpers': 0.2.2 + '@eslint/core': 0.14.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.29.0 + '@eslint/plugin-kit': 0.3.1 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.1 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + esutils@2.0.3: {} + + etag@1.8.1: {} + + eventemitter3@4.0.7: {} + + events@3.3.0: {} + + exenv@1.2.2: {} + + expect-type@1.2.1: {} + + express@4.21.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.12 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.0.6: {} + + fastest-levenshtein@1.0.16: {} + + faye-websocket@0.11.4: + dependencies: + websocket-driver: 0.7.4 + + fdir@6.4.5(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.3.1: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flat@5.0.2: {} + + flatted@3.3.3: {} + + follow-redirects@1.15.9: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + forwarded@0.2.0: {} + + fresh@0.5.2: {} + + fs-readdir-recursive@1.1.0: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + gensync@1.0.0-beta.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob-to-regexp@0.4.1: {} + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@11.12.0: {} + + globals@14.0.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + handle-thing@2.0.1: {} + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + hpack.js@2.1.6: + dependencies: + inherits: 2.0.4 + obuf: 1.1.2 + readable-stream: 2.3.8 + wbuf: 1.7.3 + + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + + html-escaper@2.0.2: {} + + html-loader@5.1.0(webpack@5.99.9): + dependencies: + html-minifier-terser: 7.2.0 + parse5: 7.3.0 + webpack: 5.99.9(webpack-cli@6.0.1) + + html-minifier-terser@6.1.0: + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 8.3.0 + he: 1.2.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.41.0 + + html-minifier-terser@7.2.0: + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 10.0.1 + entities: 4.5.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.41.0 + + html-webpack-plugin@5.6.3(webpack@5.99.9): + dependencies: + '@types/html-minifier-terser': 6.1.0 + html-minifier-terser: 6.1.0 + lodash: 4.17.21 + pretty-error: 4.0.0 + tapable: 2.2.2 + optionalDependencies: + webpack: 5.99.9(webpack-cli@6.0.1) + + htmlparser2@6.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 2.2.0 + + http-deceiver@1.2.7: {} + + http-errors@1.6.3: + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.5.0 + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + http-parser-js@0.5.10: {} + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.3 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + http-proxy-middleware@2.0.9(@types/express@4.17.23): + dependencies: + '@types/http-proxy': 1.17.16 + http-proxy: 1.18.1 + is-glob: 4.0.3 + is-plain-obj: 3.0.0 + micromatch: 4.0.8 + optionalDependencies: + '@types/express': 4.17.23 + transitivePeerDependencies: + - debug + + http-proxy@1.18.1: + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.9 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.3 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + hyperdyperid@1.2.0: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + icss-utils@5.1.0(postcss@8.5.4): + dependencies: + postcss: 8.5.4 + + ignore@5.3.2: {} + + image-size@0.5.5: + optional: true + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.3: {} + + inherits@2.0.4: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + interpret@3.1.1: {} + + ipaddr.js@1.9.1: {} + + ipaddr.js@2.2.0: {} + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-docker@3.0.0: {} + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-network-error@1.1.0: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-plain-obj@3.0.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-potential-custom-element-name@1.0.1: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-what@3.14.1: {} + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isobject@3.0.1: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.4.1 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + iterator.prototype@1.1.5: + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 22.15.30 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + + jest-worker@27.5.1: + dependencies: + '@types/node': 22.15.30 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest-worker@29.7.0: + dependencies: + '@types/node': 22.15.30 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsdom@26.1.0: + dependencies: + cssstyle: 4.4.0 + data-urls: 5.0.0 + decimal.js: 10.5.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.20 + parse5: 7.3.0 + rrweb-cssom: 0.8.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 5.1.2 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + ws: 8.18.2 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + jsesc@3.0.2: {} + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + json5@2.2.3: {} + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.9 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@6.0.3: {} + + language-subtag-registry@0.3.23: {} + + language-tags@1.0.9: + dependencies: + language-subtag-registry: 0.3.23 + + launch-editor@2.10.0: + dependencies: + picocolors: 1.1.1 + shell-quote: 1.8.3 + + less-loader@12.3.0(less@4.3.0)(webpack@5.99.9): + dependencies: + less: 4.3.0 + optionalDependencies: + webpack: 5.99.9(webpack-cli@6.0.1) + + less@4.3.0: + dependencies: + copy-anything: 2.0.6 + parse-node-version: 1.0.1 + tslib: 2.8.1 + optionalDependencies: + errno: 0.1.8 + graceful-fs: 4.2.11 + image-size: 0.5.5 + make-dir: 2.1.0 + mime: 1.6.0 + needle: 3.3.1 + source-map: 0.6.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + loader-runner@4.3.0: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.debounce@4.0.8: {} + + lodash.memoize@4.1.2: {} + + lodash.merge@4.6.2: {} + + lodash.uniq@4.5.0: {} + + lodash@4.17.21: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + loupe@3.1.3: {} + + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lz-string@1.5.0: {} + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + magicast@0.3.5: + dependencies: + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 + source-map-js: 1.2.1 + + make-dir@2.1.0: + dependencies: + pify: 4.0.1 + semver: 5.7.2 + + make-dir@4.0.0: + dependencies: + semver: 7.7.2 + + math-intrinsics@1.1.0: {} + + mdn-data@2.0.28: {} + + mdn-data@2.0.30: {} + + media-typer@0.3.0: {} + + memfs@4.17.2: + dependencies: + '@jsonjoy.com/json-pack': 1.2.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.6.0(tslib@2.8.1) + tree-dump: 1.0.3(tslib@2.8.1) + tslib: 2.8.1 + + merge-descriptors@1.0.3: {} + + merge-stream@2.0.0: {} + + methods@1.1.2: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + min-indent@1.0.1: {} + + mini-css-extract-plugin@2.9.2(webpack@5.99.9): + dependencies: + schema-utils: 4.3.2 + tapable: 2.2.2 + webpack: 5.99.9(webpack-cli@6.0.1) + + minimalistic-assert@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + multicast-dns@7.2.5: + dependencies: + dns-packet: 5.6.1 + thunky: 1.1.0 + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.11: {} + + natural-compare@1.4.0: {} + + needle@3.3.1: + dependencies: + iconv-lite: 0.6.3 + sax: 1.4.1 + optional: true + + negotiator@0.6.3: {} + + negotiator@0.6.4: {} + + neo-async@2.6.2: {} + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + + node-forge@1.3.1: {} + + node-releases@2.0.19: {} + + normalize-path@3.0.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + nwsapi@2.2.20: {} + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.entries@1.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + obuf@1.1.2: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.0.2: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + open@10.1.2: + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-retry@6.2.1: + dependencies: + '@types/retry': 0.12.2 + is-network-error: 1.1.0 + retry: 0.13.1 + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + param-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-node-version@1.0.1: {} + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + parseurl@1.3.3: {} + + pascal-case@3.1.2: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-to-regexp@0.1.12: {} + + pathe@2.0.3: {} + + pathval@2.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pify@4.0.1: {} + + pirates@4.0.7: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + possible-typed-array-names@1.1.0: {} + + postcss-calc@10.1.1(postcss@8.5.4): + dependencies: + postcss: 8.5.4 + postcss-selector-parser: 7.1.0 + postcss-value-parser: 4.2.0 + + postcss-colormin@7.0.3(postcss@8.5.4): + dependencies: + browserslist: 4.25.0 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.5.4 + postcss-value-parser: 4.2.0 + + postcss-convert-values@7.0.5(postcss@8.5.4): + dependencies: + browserslist: 4.25.0 + postcss: 8.5.4 + postcss-value-parser: 4.2.0 + + postcss-discard-comments@7.0.4(postcss@8.5.4): + dependencies: + postcss: 8.5.4 + postcss-selector-parser: 7.1.0 + + postcss-discard-duplicates@7.0.2(postcss@8.5.4): + dependencies: + postcss: 8.5.4 + + postcss-discard-empty@7.0.1(postcss@8.5.4): + dependencies: + postcss: 8.5.4 + + postcss-discard-overridden@7.0.1(postcss@8.5.4): + dependencies: + postcss: 8.5.4 + + postcss-merge-longhand@7.0.5(postcss@8.5.4): + dependencies: + postcss: 8.5.4 + postcss-value-parser: 4.2.0 + stylehacks: 7.0.5(postcss@8.5.4) + + postcss-merge-rules@7.0.5(postcss@8.5.4): + dependencies: + browserslist: 4.25.0 + caniuse-api: 3.0.0 + cssnano-utils: 5.0.1(postcss@8.5.4) + postcss: 8.5.4 + postcss-selector-parser: 7.1.0 + + postcss-minify-font-values@7.0.1(postcss@8.5.4): + dependencies: + postcss: 8.5.4 + postcss-value-parser: 4.2.0 + + postcss-minify-gradients@7.0.1(postcss@8.5.4): + dependencies: + colord: 2.9.3 + cssnano-utils: 5.0.1(postcss@8.5.4) + postcss: 8.5.4 + postcss-value-parser: 4.2.0 + + postcss-minify-params@7.0.3(postcss@8.5.4): + dependencies: + browserslist: 4.25.0 + cssnano-utils: 5.0.1(postcss@8.5.4) + postcss: 8.5.4 + postcss-value-parser: 4.2.0 + + postcss-minify-selectors@7.0.5(postcss@8.5.4): + dependencies: + cssesc: 3.0.0 + postcss: 8.5.4 + postcss-selector-parser: 7.1.0 + + postcss-modules-extract-imports@3.1.0(postcss@8.5.4): + dependencies: + postcss: 8.5.4 + + postcss-modules-local-by-default@4.2.0(postcss@8.5.4): + dependencies: + icss-utils: 5.1.0(postcss@8.5.4) + postcss: 8.5.4 + postcss-selector-parser: 7.1.0 + postcss-value-parser: 4.2.0 + + postcss-modules-scope@3.2.1(postcss@8.5.4): + dependencies: + postcss: 8.5.4 + postcss-selector-parser: 7.1.0 + + postcss-modules-values@4.0.0(postcss@8.5.4): + dependencies: + icss-utils: 5.1.0(postcss@8.5.4) + postcss: 8.5.4 + + postcss-normalize-charset@7.0.1(postcss@8.5.4): + dependencies: + postcss: 8.5.4 + + postcss-normalize-display-values@7.0.1(postcss@8.5.4): + dependencies: + postcss: 8.5.4 + postcss-value-parser: 4.2.0 + + postcss-normalize-positions@7.0.1(postcss@8.5.4): + dependencies: + postcss: 8.5.4 + postcss-value-parser: 4.2.0 + + postcss-normalize-repeat-style@7.0.1(postcss@8.5.4): + dependencies: + postcss: 8.5.4 + postcss-value-parser: 4.2.0 + + postcss-normalize-string@7.0.1(postcss@8.5.4): + dependencies: + postcss: 8.5.4 + postcss-value-parser: 4.2.0 + + postcss-normalize-timing-functions@7.0.1(postcss@8.5.4): + dependencies: + postcss: 8.5.4 + postcss-value-parser: 4.2.0 + + postcss-normalize-unicode@7.0.3(postcss@8.5.4): + dependencies: + browserslist: 4.25.0 + postcss: 8.5.4 + postcss-value-parser: 4.2.0 + + postcss-normalize-url@7.0.1(postcss@8.5.4): + dependencies: + postcss: 8.5.4 + postcss-value-parser: 4.2.0 + + postcss-normalize-whitespace@7.0.1(postcss@8.5.4): + dependencies: + postcss: 8.5.4 + postcss-value-parser: 4.2.0 + + postcss-ordered-values@7.0.2(postcss@8.5.4): + dependencies: + cssnano-utils: 5.0.1(postcss@8.5.4) + postcss: 8.5.4 + postcss-value-parser: 4.2.0 + + postcss-reduce-initial@7.0.3(postcss@8.5.4): + dependencies: + browserslist: 4.25.0 + caniuse-api: 3.0.0 + postcss: 8.5.4 + + postcss-reduce-transforms@7.0.1(postcss@8.5.4): + dependencies: + postcss: 8.5.4 + postcss-value-parser: 4.2.0 + + postcss-selector-parser@7.1.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-svgo@7.0.2(postcss@8.5.4): + dependencies: + postcss: 8.5.4 + postcss-value-parser: 4.2.0 + svgo: 3.3.2 + + postcss-unique-selectors@7.0.4(postcss@8.5.4): + dependencies: + postcss: 8.5.4 + postcss-selector-parser: 7.1.0 + + postcss-value-parser@4.2.0: {} + + postcss@8.5.4: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier@3.5.3: {} + + pretty-error@4.0.0: + dependencies: + lodash: 4.17.21 + renderkid: 3.0.0 + + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + + prism-react-renderer@2.4.1(react@19.1.0): + dependencies: + '@types/prismjs': 1.26.5 + clsx: 2.1.1 + react: 19.1.0 + + process-nextick-args@2.0.1: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + prr@1.0.1: + optional: true + + punycode@2.3.1: {} + + qs@6.13.0: + dependencies: + side-channel: 1.1.0 + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + react-dom@19.1.0(react@19.1.0): + dependencies: + react: 19.1.0 + scheduler: 0.26.0 + + react-is@16.13.1: {} + + react-is@17.0.2: {} + + react-lifecycles-compat@3.0.4: {} + + react-live@4.1.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + prism-react-renderer: 2.4.1(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + sucrase: 3.35.0 + use-editable: 2.3.3(react@19.1.0) + + react-modal@3.16.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + exenv: 1.2.2 + prop-types: 15.8.1 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-lifecycles-compat: 3.0.4 + warning: 4.0.3 + + react@19.1.0: {} + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + rechoir@0.8.0: + dependencies: + resolve: 1.22.10 + + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regenerate-unicode-properties@10.2.0: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + regexpu-core@6.2.0: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.0 + regjsgen: 0.8.0 + regjsparser: 0.12.0 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.0 + + regjsgen@0.8.0: {} + + regjsparser@0.12.0: + dependencies: + jsesc: 3.0.2 + + relateurl@0.2.7: {} + + renderkid@3.0.0: + dependencies: + css-select: 4.3.0 + dom-converter: 0.2.0 + htmlparser2: 6.1.0 + lodash: 4.17.21 + strip-ansi: 6.0.1 + + require-from-string@2.0.2: {} + + requires-port@1.0.0: {} + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + resolve@2.0.0-next.5: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + retry@0.13.1: {} + + rollup@4.42.0: + dependencies: + '@types/estree': 1.0.7 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.42.0 + '@rollup/rollup-android-arm64': 4.42.0 + '@rollup/rollup-darwin-arm64': 4.42.0 + '@rollup/rollup-darwin-x64': 4.42.0 + '@rollup/rollup-freebsd-arm64': 4.42.0 + '@rollup/rollup-freebsd-x64': 4.42.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.42.0 + '@rollup/rollup-linux-arm-musleabihf': 4.42.0 + '@rollup/rollup-linux-arm64-gnu': 4.42.0 + '@rollup/rollup-linux-arm64-musl': 4.42.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.42.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.42.0 + '@rollup/rollup-linux-riscv64-gnu': 4.42.0 + '@rollup/rollup-linux-riscv64-musl': 4.42.0 + '@rollup/rollup-linux-s390x-gnu': 4.42.0 + '@rollup/rollup-linux-x64-gnu': 4.42.0 + '@rollup/rollup-linux-x64-musl': 4.42.0 + '@rollup/rollup-win32-arm64-msvc': 4.42.0 + '@rollup/rollup-win32-ia32-msvc': 4.42.0 + '@rollup/rollup-win32-x64-msvc': 4.42.0 + fsevents: 2.3.3 + + rrweb-cssom@0.8.0: {} + + run-applescript@7.0.0: {} + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safer-buffer@2.1.2: {} + + sax@1.4.1: + optional: true + + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + + scheduler@0.26.0: {} + + schema-utils@4.3.2: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + + select-hose@2.0.0: {} + + selfsigned@2.4.1: + dependencies: + '@types/node-forge': 1.3.11 + node-forge: 1.3.1 + + semver@5.7.2: {} + + semver@6.3.1: {} + + semver@7.7.2: {} + + send@0.19.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + serve-index@1.9.1: + dependencies: + accepts: 1.3.8 + batch: 0.6.1 + debug: 2.6.9 + escape-html: 1.0.3 + http-errors: 1.6.3 + mime-types: 2.1.35 + parseurl: 1.3.3 + transitivePeerDependencies: + - supports-color + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + setprototypeof@1.1.0: {} + + setprototypeof@1.2.0: {} + + shallow-clone@3.0.1: + dependencies: + kind-of: 6.0.3 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.3: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + siginfo@2.0.0: {} + + signal-exit@4.1.0: {} + + slash@2.0.0: {} + + sockjs@0.3.24: + dependencies: + faye-websocket: 0.11.4 + uuid: 8.3.2 + websocket-driver: 0.7.4 + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + spdy-transport@3.0.0: + dependencies: + debug: 4.4.1 + detect-node: 2.1.0 + hpack.js: 2.1.6 + obuf: 1.1.2 + readable-stream: 3.6.2 + wbuf: 1.7.3 + transitivePeerDependencies: + - supports-color + + spdy@4.0.2: + dependencies: + debug: 4.4.1 + handle-thing: 2.0.1 + http-deceiver: 1.2.7 + select-hose: 2.0.0 + spdy-transport: 3.0.0 + transitivePeerDependencies: + - supports-color + + stackback@0.0.2: {} + + statuses@1.5.0: {} + + statuses@2.0.1: {} + + std-env@3.9.0: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string.prototype.includes@2.0.1: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.24.0 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-bom@3.0.0: {} + + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + strip-json-comments@3.1.1: {} + + strip-literal@3.0.0: + dependencies: + js-tokens: 9.0.1 + + stylehacks@7.0.5(postcss@8.5.4): + dependencies: + browserslist: 4.25.0 + postcss: 8.5.4 + postcss-selector-parser: 7.1.0 + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + ts-interface-checker: 0.1.13 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svgo@3.3.2: + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 5.1.0 + css-tree: 2.3.1 + css-what: 6.1.0 + csso: 5.0.5 + picocolors: 1.1.1 + + symbol-tree@3.2.4: {} + + synckit@0.11.8: + dependencies: + '@pkgr/core': 0.2.7 + + tapable@2.2.2: {} + + terser-webpack-plugin@5.3.14(webpack@5.99.9): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 4.3.2 + serialize-javascript: 6.0.2 + terser: 5.41.0 + webpack: 5.99.9(webpack-cli@6.0.1) + + terser@5.41.0: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.15.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + test-exclude@7.0.1: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.4.5 + minimatch: 9.0.5 + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + thingies@1.21.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + + thunky@1.1.0: {} + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.14: + dependencies: + fdir: 6.4.5(picomatch@4.0.2) + picomatch: 4.0.2 + + tinypool@1.1.0: {} + + tinyrainbow@2.0.0: {} + + tinyspy@4.0.3: {} + + tldts-core@6.1.86: {} + + tldts@6.1.86: + dependencies: + tldts-core: 6.1.86 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + tough-cookie@5.1.2: + dependencies: + tldts: 6.1.86 + + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + + tree-dump@1.0.3(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + + ts-interface-checker@0.1.13: {} + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@2.8.1: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + undici-types@6.21.0: {} + + unicode-canonical-property-names-ecmascript@2.0.1: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.1.0 + + unicode-match-property-value-ecmascript@2.2.0: {} + + unicode-property-aliases-ecmascript@2.1.0: {} + + unpipe@1.0.0: {} + + update-browserslist-db@1.1.3(browserslist@4.25.0): + dependencies: + browserslist: 4.25.0 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + use-editable@2.3.3(react@19.1.0): + dependencies: + react: 19.1.0 + + util-deprecate@1.0.2: {} + + utila@0.4.0: {} + + utils-merge@1.0.1: {} + + uuid@8.3.2: {} + + vary@1.1.2: {} + + vite-node@3.2.3(@types/node@22.15.30)(less@4.3.0)(terser@5.41.0): + dependencies: + cac: 6.7.14 + debug: 4.4.1 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 6.3.5(@types/node@22.15.30)(less@4.3.0)(terser@5.41.0) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite@6.3.5(@types/node@22.15.30)(less@4.3.0)(terser@5.41.0): + dependencies: + esbuild: 0.25.5 + fdir: 6.4.5(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.4 + rollup: 4.42.0 + tinyglobby: 0.2.14 + optionalDependencies: + '@types/node': 22.15.30 + fsevents: 2.3.3 + less: 4.3.0 + terser: 5.41.0 + + vitest@3.2.3(@types/node@22.15.30)(jsdom@26.1.0)(less@4.3.0)(terser@5.41.0): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.3 + '@vitest/mocker': 3.2.3(vite@6.3.5(@types/node@22.15.30)(less@4.3.0)(terser@5.41.0)) + '@vitest/pretty-format': 3.2.3 + '@vitest/runner': 3.2.3 + '@vitest/snapshot': 3.2.3 + '@vitest/spy': 3.2.3 + '@vitest/utils': 3.2.3 + chai: 5.2.0 + debug: 4.4.1 + expect-type: 1.2.1 + magic-string: 0.30.17 + pathe: 2.0.3 + picomatch: 4.0.2 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tinypool: 1.1.0 + tinyrainbow: 2.0.0 + vite: 6.3.5(@types/node@22.15.30)(less@4.3.0)(terser@5.41.0) + vite-node: 3.2.3(@types/node@22.15.30)(less@4.3.0)(terser@5.41.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.15.30 + jsdom: 26.1.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + + warning@4.0.3: + dependencies: + loose-envify: 1.4.0 + + watchpack@2.4.4: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + wbuf@1.7.3: + dependencies: + minimalistic-assert: 1.0.1 + + webidl-conversions@7.0.0: {} + + webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9): + dependencies: + '@discoveryjs/json-ext': 0.6.3 + '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.9) + '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.9) + '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.99.9) + colorette: 2.0.20 + commander: 12.1.0 + cross-spawn: 7.0.6 + envinfo: 7.14.0 + fastest-levenshtein: 1.0.16 + import-local: 3.2.0 + interpret: 3.1.1 + rechoir: 0.8.0 + webpack: 5.99.9(webpack-cli@6.0.1) + webpack-merge: 6.0.1 + optionalDependencies: + webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.99.9) + + webpack-dev-middleware@7.4.2(webpack@5.99.9): + dependencies: + colorette: 2.0.20 + memfs: 4.17.2 + mime-types: 2.1.35 + on-finished: 2.4.1 + range-parser: 1.2.1 + schema-utils: 4.3.2 + optionalDependencies: + webpack: 5.99.9(webpack-cli@6.0.1) + + webpack-dev-server@5.2.2(webpack-cli@6.0.1)(webpack@5.99.9): + dependencies: + '@types/bonjour': 3.5.13 + '@types/connect-history-api-fallback': 1.5.4 + '@types/express': 4.17.23 + '@types/express-serve-static-core': 4.19.6 + '@types/serve-index': 1.9.4 + '@types/serve-static': 1.15.8 + '@types/sockjs': 0.3.36 + '@types/ws': 8.18.1 + ansi-html-community: 0.0.8 + bonjour-service: 1.3.0 + chokidar: 3.6.0 + colorette: 2.0.20 + compression: 1.8.0 + connect-history-api-fallback: 2.0.0 + express: 4.21.2 + graceful-fs: 4.2.11 + http-proxy-middleware: 2.0.9(@types/express@4.17.23) + ipaddr.js: 2.2.0 + launch-editor: 2.10.0 + open: 10.1.2 + p-retry: 6.2.1 + schema-utils: 4.3.2 + selfsigned: 2.4.1 + serve-index: 1.9.1 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack-dev-middleware: 7.4.2(webpack@5.99.9) + ws: 8.18.2 + optionalDependencies: + webpack: 5.99.9(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9) + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + + webpack-merge@6.0.1: + dependencies: + clone-deep: 4.0.1 + flat: 5.0.2 + wildcard: 2.0.1 + + webpack-sources@3.3.2: {} + + webpack@5.99.9(webpack-cli@6.0.1): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.15.0 + browserslist: 4.25.0 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.1 + es-module-lexer: 1.7.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.2 + tapable: 2.2.2 + terser-webpack-plugin: 5.3.14(webpack@5.99.9) + watchpack: 2.4.4 + webpack-sources: 3.3.2 + optionalDependencies: + webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + websocket-driver@0.7.4: + dependencies: + http-parser-js: 0.5.10 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + + websocket-extensions@0.1.4: {} + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wildcard@2.0.1: {} + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + ws@8.18.2: {} + + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} + + yallist@3.1.1: {} + + yocto-queue@0.1.0: {} diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000000..2c37f07031 --- /dev/null +++ b/renovate.json @@ -0,0 +1,42 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "labels": ["dependencies"], + "extends": [ + "config:base", + ":pinOnlyDevDependencies" + ], + "lockFileMaintenance": { + "enabled": true, + "semanticCommitType": "chore", + "automerge": true + }, + "postUpdateOptions": [ + "pnpmDedupe" + ], + "semanticCommits": "enabled", + "semanticCommitType": "fix", + "automergeType": "branch", + "packageRules": [ + { + "matchDepTypes": [ + "devDependencies" + ], + "semanticCommitType": "chore" + }, + { + "matchPackageNames": ["pnpm"], + "updateTypes": ["minor", "patch"], + "automerge": true + }, + { + "matchDepTypes": [ + "devDependencies" + ], + "matchUpdateTypes": [ + "minor", + "patch" + ], + "automerge": true + } + ] +} diff --git a/src/__tests__/index-test.js b/src/__tests__/index-test.js new file mode 100644 index 0000000000..c30ecc9c2f --- /dev/null +++ b/src/__tests__/index-test.js @@ -0,0 +1,15 @@ +import { describe, expect, test } from 'vitest'; +import { Tab, Tabs, TabList, TabPanel } from '../index'; +import TabComponent from '../components/Tab'; +import TabListComponent from '../components/TabList'; +import TabsComponent from '../components/Tabs'; +import TabPanelComponent from '../components/TabPanel'; + +describe('index.js', () => { + test('should correctly export all component as named export', () => { + expect(Tab).toEqual(TabComponent); + expect(TabList).toEqual(TabListComponent); + expect(Tabs).toEqual(TabsComponent); + expect(TabPanel).toEqual(TabPanelComponent); + }); +}); diff --git a/src/__tests__/main-test.js b/src/__tests__/main-test.js deleted file mode 100644 index 59be2b1d1a..0000000000 --- a/src/__tests__/main-test.js +++ /dev/null @@ -1,22 +0,0 @@ -/* global describe, it, expect */ -import ReactTabs, { Tab, Tabs, TabList, TabPanel } from '../main'; -import TabComponent from '../components/Tab'; -import TabListComponent from '../components/TabList'; -import TabsComponent from '../components/Tabs'; -import TabPanelComponent from '../components/TabPanel'; - -describe('main.js', () => { - it('should correctly export all component as named export', () => { - expect(Tab).toEqual(TabComponent); - expect(TabList).toEqual(TabListComponent); - expect(Tabs).toEqual(TabsComponent); - expect(TabPanel).toEqual(TabPanelComponent); - }); - - it('should correctly export all components as legacy es6 export', () => { - expect(ReactTabs.Tab).toEqual(TabComponent); - expect(ReactTabs.TabList).toEqual(TabListComponent); - expect(ReactTabs.Tabs).toEqual(TabsComponent); - expect(ReactTabs.TabPanel).toEqual(TabPanelComponent); - }); -}); diff --git a/src/components/Tab.js b/src/components/Tab.js deleted file mode 100644 index f323a36da1..0000000000 --- a/src/components/Tab.js +++ /dev/null @@ -1,73 +0,0 @@ -import React, { PropTypes } from 'react'; -import { findDOMNode } from 'react-dom'; -import cx from 'classnames'; - -function syncNodeAttributes(node, props) { - if (props.selected) { - node.setAttribute('tabindex', 0); - node.setAttribute('selected', 'selected'); - if (props.focus) { - node.focus(); - } - } else { - node.removeAttribute('tabindex'); - node.removeAttribute('selected'); - } -} - -module.exports = React.createClass({ - displayName: 'Tab', - - propTypes: { - className: PropTypes.string, - id: PropTypes.string, - selected: PropTypes.bool, - disabled: PropTypes.bool, - panelId: PropTypes.string, - children: PropTypes.oneOfType([ - PropTypes.array, - PropTypes.object, - PropTypes.string, - ]), - }, - - getDefaultProps() { - return { - focus: false, - selected: false, - id: null, - panelId: null, - }; - }, - - componentDidMount() { - syncNodeAttributes(findDOMNode(this), this.props); - }, - - componentDidUpdate() { - syncNodeAttributes(findDOMNode(this), this.props); - }, - - render() { - return ( -

    • - ); - }, -}); diff --git a/src/components/Tab.jsx b/src/components/Tab.jsx new file mode 100644 index 0000000000..91401a9268 --- /dev/null +++ b/src/components/Tab.jsx @@ -0,0 +1,88 @@ +import React, { useEffect, useRef } from 'react'; +import cx from 'clsx'; + +const DEFAULT_CLASS = 'react-tabs__tab'; +const defaultProps = { + className: DEFAULT_CLASS, + disabledClassName: `${DEFAULT_CLASS}--disabled`, + focus: false, + id: null, + selected: false, + selectedClassName: `${DEFAULT_CLASS}--selected`, +}; + +/* +Left for TS migration +const propTypes = { + children: PropTypes.oneOfType([ + PropTypes.array, + PropTypes.object, + PropTypes.string, + ]), + className: PropTypes.oneOfType([ + PropTypes.string, + PropTypes.array, + PropTypes.object, + ]), + disabled: PropTypes.bool, + disabledClassName: PropTypes.string, + focus: PropTypes.bool, // private + id: PropTypes.string, // private + selected: PropTypes.bool, // private + selectedClassName: PropTypes.string, + tabIndex: PropTypes.string, + tabRef: PropTypes.func, // private +};*/ + +const Tab = (props) => { + let nodeRef = useRef(); + const { + children, + className, + disabled, + disabledClassName, + focus, + id, + selected, + selectedClassName, + tabIndex, + tabRef, + ...attributes + } = { + ...defaultProps, + ...props, + }; + + useEffect(() => { + if (selected && focus) { + nodeRef.current.focus(); + } + }, [selected, focus]); + + return ( +
    • { + nodeRef.current = node; + if (tabRef) tabRef(node); + }} + role="tab" + id={`tab${id}`} + aria-selected={selected ? 'true' : 'false'} + aria-disabled={disabled ? 'true' : 'false'} + aria-controls={`panel${id}`} + tabIndex={tabIndex || (selected ? '0' : null)} + data-rttab + > + {children} +
    • + ); +}; + +Tab.tabsRole = 'Tab'; + +export default Tab; diff --git a/src/components/TabList.js b/src/components/TabList.js deleted file mode 100644 index f5b96a673e..0000000000 --- a/src/components/TabList.js +++ /dev/null @@ -1,28 +0,0 @@ -import React, { PropTypes } from 'react'; -import cx from 'classnames'; - -module.exports = React.createClass({ - displayName: 'TabList', - - propTypes: { - className: PropTypes.string, - children: PropTypes.oneOfType([ - PropTypes.object, - PropTypes.array, - ]), - }, - - render() { - return ( -
        - {this.props.children} -
      - ); - }, -}); diff --git a/src/components/TabList.jsx b/src/components/TabList.jsx new file mode 100644 index 0000000000..c3de9888fb --- /dev/null +++ b/src/components/TabList.jsx @@ -0,0 +1,33 @@ +import React from 'react'; +import cx from 'clsx'; + +const defaultProps = { + className: 'react-tabs__tab-list', +}; + +/* +Left for TS migration +const propTypes = { + children: PropTypes.oneOfType([PropTypes.object, PropTypes.array]), + className: PropTypes.oneOfType([ + PropTypes.string, + PropTypes.array, + PropTypes.object, + ]), +};*/ +const TabList = (props) => { + const { children, className, ...attributes } = { + ...defaultProps, + ...props, + }; + + return ( +
        + {children} +
      + ); +}; + +TabList.tabsRole = 'TabList'; + +export default TabList; diff --git a/src/components/TabPanel.js b/src/components/TabPanel.js deleted file mode 100644 index 81343d2f6e..0000000000 --- a/src/components/TabPanel.js +++ /dev/null @@ -1,54 +0,0 @@ -import React, { PropTypes } from 'react'; -import cx from 'classnames'; - -module.exports = React.createClass({ - displayName: 'TabPanel', - - propTypes: { - className: PropTypes.string, - selected: PropTypes.bool, - id: PropTypes.string, - tabId: PropTypes.string, - children: PropTypes.oneOfType([ - PropTypes.array, - PropTypes.object, - PropTypes.string, - ]), - }, - - contextTypes: { - forceRenderTabPanel: PropTypes.bool, - }, - - getDefaultProps() { - return { - selected: false, - id: null, - tabId: null, - }; - }, - - render() { - const children = (this.context.forceRenderTabPanel || this.props.selected) ? - this.props.children : - null; - - return ( -
      - {children} -
      - ); - }, -}); diff --git a/src/components/TabPanel.jsx b/src/components/TabPanel.jsx new file mode 100644 index 0000000000..30fdcbbc72 --- /dev/null +++ b/src/components/TabPanel.jsx @@ -0,0 +1,57 @@ +import React from 'react'; +import cx from 'clsx'; + +const DEFAULT_CLASS = 'react-tabs__tab-panel'; +const defaultProps = { + className: DEFAULT_CLASS, + forceRender: false, + selectedClassName: `${DEFAULT_CLASS}--selected`, +}; + +/* +Left for TS migration +const propTypes = { + children: PropTypes.node, + className: PropTypes.oneOfType([ + PropTypes.string, + PropTypes.array, + PropTypes.object, + ]), + forceRender: PropTypes.bool, + id: PropTypes.string, // private + selected: PropTypes.bool, // private + selectedClassName: PropTypes.string, +}; +*/ +const TabPanel = (props) => { + const { + children, + className, + forceRender, + id, + selected, + selectedClassName, + ...attributes + } = { + ...defaultProps, + ...props, + }; + + return ( +
      + {forceRender || selected ? children : null} +
      + ); +}; + +TabPanel.tabsRole = 'TabPanel'; + +export default TabPanel; diff --git a/src/components/Tabs.js b/src/components/Tabs.js deleted file mode 100644 index 200a2c9ef8..0000000000 --- a/src/components/Tabs.js +++ /dev/null @@ -1,339 +0,0 @@ -import React, { PropTypes, cloneElement } from 'react'; -import { findDOMNode } from 'react-dom'; -import cx from 'classnames'; -import jss from 'js-stylesheet'; -import uuid from '../helpers/uuid'; -import childrenPropType from '../helpers/childrenPropType'; - -// Determine if a node from event.target is a Tab element -function isTabNode(node) { - return node.nodeName === 'LI' && node.getAttribute('role') === 'tab'; -} - -// Determine if a tab node is disabled -function isTabDisabled(node) { - return node.getAttribute('aria-disabled') === 'true'; -} - -let useDefaultStyles = true; - -module.exports = React.createClass({ - displayName: 'Tabs', - - propTypes: { - className: PropTypes.string, - selectedIndex: PropTypes.number, - onSelect: PropTypes.func, - focus: PropTypes.bool, - children: childrenPropType, - forceRenderTabPanel: PropTypes.bool, - }, - - childContextTypes: { - forceRenderTabPanel: PropTypes.bool, - }, - - statics: { - setUseDefaultStyles(use) { - useDefaultStyles = use; - }, - }, - - getDefaultProps() { - return { - selectedIndex: -1, - focus: false, - forceRenderTabPanel: false, - }; - }, - - getInitialState() { - return this.copyPropsToState(this.props); - }, - - getChildContext() { - return { - forceRenderTabPanel: this.props.forceRenderTabPanel, - }; - }, - - componentDidMount() { - if (useDefaultStyles) { - jss(require('../helpers/styles.js')); // eslint-disable-line global-require - } - }, - - componentWillReceiveProps(newProps) { - this.setState(this.copyPropsToState(newProps)); - }, - - setSelected(index, focus) { - // Don't do anything if nothing has changed - if (index === this.state.selectedIndex) return; - // Check index boundary - if (index < 0 || index >= this.getTabsCount()) return; - - // Keep reference to last index for event handler - const last = this.state.selectedIndex; - - // Update selected index - this.setState({ selectedIndex: index, focus: focus === true }); - - // Call change event handler - if (typeof this.props.onSelect === 'function') { - this.props.onSelect(index, last); - } - }, - - getNextTab(index) { - const count = this.getTabsCount(); - - // Look for non-disabled tab from index to the last tab on the right - for (let i = index + 1; i < count; i++) { - const tab = this.getTab(i); - if (!isTabDisabled(findDOMNode(tab))) { - return i; - } - } - - // If no tab found, continue searching from first on left to index - for (let i = 0; i < index; i++) { - const tab = this.getTab(i); - if (!isTabDisabled(findDOMNode(tab))) { - return i; - } - } - - // No tabs are disabled, return index - return index; - }, - - getPrevTab(index) { - let i = index; - - // Look for non-disabled tab from index to first tab on the left - while (i--) { - const tab = this.getTab(i); - if (!isTabDisabled(findDOMNode(tab))) { - return i; - } - } - - // If no tab found, continue searching from last tab on right to index - i = this.getTabsCount(); - while (i-- > index) { - const tab = this.getTab(i); - if (!isTabDisabled(findDOMNode(tab))) { - return i; - } - } - - // No tabs are disabled, return index - return index; - }, - - getTabsCount() { - return this.props.children && this.props.children[0] ? - React.Children.count(this.props.children[0].props.children) : - 0; - }, - - getPanelsCount() { - return React.Children.count(this.props.children.slice(1)); - }, - - getTabList() { - return this.refs.tablist; - }, - - getTab(index) { - return this.refs[`tabs-${index}`]; - }, - - getPanel(index) { - return this.refs[`panels-${index}`]; - }, - - getChildren() { - let index = 0; - let count = 0; - const children = this.props.children; - const state = this.state; - const tabIds = this.tabIds = this.tabIds || []; - const panelIds = this.panelIds = this.panelIds || []; - let diff = this.tabIds.length - this.getTabsCount(); - - // Add ids if new tabs have been added - // Don't bother removing ids, just keep them in case they are added again - // This is more efficient, and keeps the uuid counter under control - while (diff++ < 0) { - tabIds.push(uuid()); - panelIds.push(uuid()); - } - - // Map children to dynamically setup refs - return React.Children.map(children, (child) => { - // null happens when conditionally rendering TabPanel/Tab - // see https://github.com/rackt/react-tabs/issues/37 - if (child === null) { - return null; - } - - let result = null; - - // Clone TabList and Tab components to have refs - if (count++ === 0) { - // TODO try setting the uuid in the "constructor" for `Tab`/`TabPanel` - result = cloneElement(child, { - ref: 'tablist', - children: React.Children.map(child.props.children, (tab) => { - // null happens when conditionally rendering TabPanel/Tab - // see https://github.com/rackt/react-tabs/issues/37 - if (tab === null) { - return null; - } - - const ref = `tabs-${index}`; - const id = tabIds[index]; - const panelId = panelIds[index]; - const selected = state.selectedIndex === index; - const focus = selected && state.focus; - - index++; - - return cloneElement(tab, { - ref, - id, - panelId, - selected, - focus, - }); - }), - }); - - // Reset index for panels - index = 0; - } - // Clone TabPanel components to have refs - else { - const ref = `panels-${index}`; - const id = panelIds[index]; - const tabId = tabIds[index]; - const selected = state.selectedIndex === index; - - index++; - - result = cloneElement(child, { - ref, - id, - tabId, - selected, - }); - } - - return result; - }); - }, - - handleKeyDown(e) { - if (isTabNode(e.target)) { - let index = this.state.selectedIndex; - let preventDefault = false; - - // Select next tab to the left - if (e.keyCode === 37 || e.keyCode === 38) { - index = this.getPrevTab(index); - preventDefault = true; - } - // Select next tab to the right - /* eslint brace-style:0 */ - else if (e.keyCode === 39 || e.keyCode === 40) { - index = this.getNextTab(index); - preventDefault = true; - } - - // This prevents scrollbars from moving around - if (preventDefault) { - e.preventDefault(); - } - - this.setSelected(index, true); - } - }, - - handleClick(e) { - let node = e.target; - do { // eslint-disable-line no-cond-assign - if (isTabNode(node)) { - if (isTabDisabled(node)) { - return; - } - - const index = [].slice.call(node.parentNode.children).indexOf(node); - this.setSelected(index); - return; - } - } while ((node = node.parentNode) !== null); - }, - - // This is an anti-pattern, so sue me - copyPropsToState(props) { - let selectedIndex = props.selectedIndex; - - // If no selectedIndex prop was supplied, then try - // preserving the existing selectedIndex from state. - // If the state has not selectedIndex, default - // to the first tab in the TabList. - // - // TODO: Need automation testing around this - // Manual testing can be done using examples/focus - // See 'should preserve selectedIndex when typing' in specs/Tabs.spec.js - if (selectedIndex === -1) { - if (this.state && this.state.selectedIndex) { - selectedIndex = this.state.selectedIndex; - } else { - selectedIndex = 0; - } - } - - return { - selectedIndex, - focus: props.focus, - }; - }, - - render() { - // This fixes an issue with focus management. - // - // Ultimately, when focus is true, and an input has focus, - // and any change on that input causes a state change/re-render, - // focus gets sent back to the active tab, and input loses focus. - // - // Since the focus state only needs to be remembered - // for the current render, we can reset it once the - // render has happened. - // - // Don't use setState, because we don't want to re-render. - // - // See https://github.com/rackt/react-tabs/pull/7 - if (this.state.focus) { - setTimeout(() => { - this.state.focus = false; - }, 0); - } - - return ( -
      - {this.getChildren()} -
      - ); - }, -}); diff --git a/src/components/Tabs.jsx b/src/components/Tabs.jsx new file mode 100644 index 0000000000..72f1f51248 --- /dev/null +++ b/src/components/Tabs.jsx @@ -0,0 +1,144 @@ +import { checkPropTypes } from 'prop-types'; +import React, { useEffect, useState } from 'react'; +import { + childrenPropType, + onSelectPropType, + selectedIndexPropType, +} from '../helpers/propTypes'; +import UncontrolledTabs from './UncontrolledTabs'; +import { getTabsCount } from '../helpers/count'; + +const MODE_CONTROLLED = 0; +const MODE_UNCONTROLLED = 1; +const propTypes = { + children: childrenPropType, + onSelect: onSelectPropType, + selectedIndex: selectedIndexPropType, + /* +Left for TS migration + className: PropTypes.oneOfType([ + PropTypes.string, + PropTypes.array, + PropTypes.object, + ]), + defaultFocus: PropTypes.bool, + defaultIndex: PropTypes.number, + direction: PropTypes.oneOf(['rtl', 'ltr']), + disabledTabClassName: PropTypes.string, + disableUpDownKeys: PropTypes.bool, + disableLeftRightKeys: PropTypes.bool, + domRef: PropTypes.func, + environment: PropTypes.object, + focusTabOnClick: PropTypes.bool, + forceRenderTabPanel: PropTypes.bool, + selectedTabClassName: PropTypes.string, + selectedTabPanelClassName: PropTypes.string,*/ +}; +const defaultProps = { + defaultFocus: false, + focusTabOnClick: true, + forceRenderTabPanel: false, + selectedIndex: null, + defaultIndex: null, + environment: null, + disableUpDownKeys: false, + disableLeftRightKeys: false, +}; + +const getModeFromProps = (props) => { + return props.selectedIndex === null ? MODE_UNCONTROLLED : MODE_CONTROLLED; +}; + +const checkForIllegalModeChange = (props, mode) => { + if ( + process.env.NODE_ENV !== 'production' && + mode != undefined && + mode !== getModeFromProps(props) + ) { + throw new Error( + `Switching between controlled mode (by using \`selectedIndex\`) and uncontrolled mode is not supported in \`Tabs\`. +For more information about controlled and uncontrolled mode of react-tabs see https://github.com/reactjs/react-tabs#controlled-vs-uncontrolled-mode.`, + ); + } +}; + +/** + * State: + * mode: Initialized only once from props and never changes + * selectedIndex: null if controlled mode, otherwise initialized with prop defaultIndex, changed on selection of tabs, has effect to ensure it never gets out of bound + * focus: Because we never remove focus from the Tabs this state is only used to indicate that we should focus the current tab. + * It is initialized from the prop defaultFocus, and after the first render it is reset back to false. Later it can become true again when using keys to navigate the tabs. + */ +const Tabs = (props) => { + checkPropTypes(propTypes, props, 'prop', 'Tabs'); + const { + children, + defaultFocus, + defaultIndex, + focusTabOnClick, + onSelect, + ...attributes + } = { + ...defaultProps, + ...props, + }; + + const [focus, setFocus] = useState(defaultFocus); + const [mode] = useState(getModeFromProps(attributes)); + const [selectedIndex, setSelectedIndex] = useState( + mode === MODE_UNCONTROLLED ? defaultIndex || 0 : null, + ); + + useEffect(() => { + // Reset focus after initial render, see comment above + setFocus(false); + }, []); + + if (mode === MODE_UNCONTROLLED) { + // Ensure that we handle removed tabs and don't let selectedIndex get out of bounds + const tabsCount = getTabsCount(children); + useEffect(() => { + if (selectedIndex != null) { + const maxTabIndex = Math.max(0, tabsCount - 1); + setSelectedIndex(Math.min(selectedIndex, maxTabIndex)); + } + }, [tabsCount]); + } + + checkForIllegalModeChange(attributes, mode); + + const handleSelected = (index, last, event) => { + // Call change event handler + if (typeof onSelect === 'function') { + // Check if the change event handler cancels the tab change + if (onSelect(index, last, event) === false) return; + } + + // Always set focus on tabs unless it is disabled + if (focusTabOnClick) { + setFocus(true); + } + + if (mode === MODE_UNCONTROLLED) { + // Update selected index + setSelectedIndex(index); + } + }; + + let subProps = { ...props, ...attributes }; + + subProps.focus = focus; + subProps.onSelect = handleSelected; + + if (selectedIndex != null) { + subProps.selectedIndex = selectedIndex; + } + delete subProps.defaultFocus; + delete subProps.defaultIndex; + delete subProps.focusTabOnClick; + return {children}; +}; + +Tabs.tabsRole = 'Tabs'; + +export default Tabs; diff --git a/src/components/UncontrolledTabs.jsx b/src/components/UncontrolledTabs.jsx new file mode 100644 index 0000000000..8e802b71d2 --- /dev/null +++ b/src/components/UncontrolledTabs.jsx @@ -0,0 +1,411 @@ +import { checkPropTypes } from 'prop-types'; +import React, { cloneElement, useRef, useId } from 'react'; +import cx from 'clsx'; +import { childrenPropType } from '../helpers/propTypes'; +import { getTabsCount as getTabsCountHelper } from '../helpers/count'; +import { deepMap } from '../helpers/childrenDeepMap'; +import { isTabList, isTabPanel, isTab } from '../helpers/elementTypes'; + +function isNode(node) { + return node && 'getAttribute' in node; +} + +// Determine if a node from event.target is a Tab element +function isTabNode(node) { + return isNode(node) && node.getAttribute('data-rttab'); +} + +// Determine if a tab node is disabled +function isTabDisabled(node) { + return isNode(node) && node.getAttribute('aria-disabled') === 'true'; +} + +let canUseActiveElement; + +function determineCanUseActiveElement(environment) { + const env = + environment || (typeof window !== 'undefined' ? window : undefined); + + try { + canUseActiveElement = !!( + typeof env !== 'undefined' && + env.document && + env.document.activeElement + ); + // eslint-disable-next-line no-unused-vars + } catch (e) { + // Work around for IE bug when accessing document.activeElement in an iframe + // Refer to the following resources: + // http://stackoverflow.com/a/10982960/369687 + // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12733599 + // istanbul ignore next + canUseActiveElement = false; + } +} + +const defaultProps = { + className: 'react-tabs', + focus: false, +}; + +const propTypes = { + children: childrenPropType, + /* + Left for TS migration + direction: PropTypes.oneOf(['rtl', 'ltr']), + className: PropTypes.oneOfType([ + PropTypes.string, + PropTypes.array, + PropTypes.object, + ]), + disabledTabClassName: PropTypes.string, + disableUpDownKeys: PropTypes.bool, + disableLeftRightKeys: PropTypes.bool, + domRef: PropTypes.func, + focus: PropTypes.bool, + forceRenderTabPanel: PropTypes.bool, + onSelect: PropTypes.func.isRequired, + selectedIndex: PropTypes.number.isRequired, + selectedTabClassName: PropTypes.string, + selectedTabPanelClassName: PropTypes.string, + environment: PropTypes.object,*/ +}; + +const UncontrolledTabs = (props) => { + checkPropTypes(propTypes, props, 'prop', 'UncontrolledTabs'); + let tabNodes = useRef([]); + let tabIds = useRef([]); + const ref = useRef(); + + function setSelected(index, event) { + // Check index boundary + if (index < 0 || index >= getTabsCount()) return; + + const { onSelect, selectedIndex } = props; + + // Call change event handler + onSelect(index, selectedIndex, event); + } + + function getNextTab(index) { + const count = getTabsCount(); + + // Look for non-disabled tab from index to the last tab on the right + for (let i = index + 1; i < count; i++) { + if (!isTabDisabled(getTab(i))) { + return i; + } + } + + // If no tab found, continue searching from first on left to index + for (let i = 0; i < index; i++) { + if (!isTabDisabled(getTab(i))) { + return i; + } + } + + // All tabs are disabled, return index + /* istanbul ignore next */ + return index; + } + + function getPrevTab(index) { + let i = index; + + // Look for non-disabled tab from index to first tab on the left + while (i--) { + if (!isTabDisabled(getTab(i))) { + return i; + } + } + + // If no tab found, continue searching from last tab on right to index + i = getTabsCount(); + while (i-- > index) { + if (!isTabDisabled(getTab(i))) { + return i; + } + } + + // All tabs are disabled, return index + /* istanbul ignore next */ + return index; + } + + function getFirstTab() { + const count = getTabsCount(); + + // Look for non disabled tab from the first tab + for (let i = 0; i < count; i++) { + if (!isTabDisabled(getTab(i))) { + return i; + } + } + + /* istanbul ignore next */ + return null; + } + + function getLastTab() { + let i = getTabsCount(); + + // Look for non disabled tab from the last tab + while (i--) { + if (!isTabDisabled(getTab(i))) { + return i; + } + } + + /* istanbul ignore next */ + return null; + } + + function getTabsCount() { + const { children } = props; + return getTabsCountHelper(children); + } + + function getTab(index) { + return tabNodes.current[`tabs-${index}`]; + } + + function getChildren() { + let index = 0; + const { + children, + disabledTabClassName, + focus, + forceRenderTabPanel, + selectedIndex, + selectedTabClassName, + selectedTabPanelClassName, + environment, + } = props; + + tabIds.current = tabIds.current || []; + let diff = tabIds.current.length - getTabsCount(); + + // Add ids if new tabs have been added + // Don't bother removing ids, just keep them in case they are added again + // This is more efficient, and keeps the uuid counter under control + const id = useId(); + while (diff++ < 0) { + tabIds.current.push(`${id}${tabIds.current.length}`); + } + + // Map children to dynamically setup refs + return deepMap(children, (child) => { + let result = child; + + // Clone TabList and Tab components to have refs + if (isTabList(child)) { + let listIndex = 0; + + // Figure out if the current focus in the DOM is set on a Tab + // If it is we should keep the focus on the next selected tab + let wasTabFocused = false; + + if (canUseActiveElement == null) { + determineCanUseActiveElement(environment); + } + + const env = + environment || (typeof window !== 'undefined' ? window : undefined); + if (canUseActiveElement && env) { + wasTabFocused = React.Children.toArray(child.props.children) + .filter(isTab) + .some((tab, i) => env.document.activeElement === getTab(i)); + } + + result = cloneElement(child, { + children: deepMap(child.props.children, (tab) => { + const key = `tabs-${listIndex}`; + const selected = selectedIndex === listIndex; + + const props = { + tabRef: (node) => { + tabNodes.current[key] = node; + }, + id: tabIds.current[listIndex], + selected, + focus: selected && (focus || wasTabFocused), + }; + + if (selectedTabClassName) + props.selectedClassName = selectedTabClassName; + if (disabledTabClassName) + props.disabledClassName = disabledTabClassName; + + listIndex++; + + return cloneElement(tab, props); + }), + }); + } else if (isTabPanel(child)) { + const props = { + id: tabIds.current[index], + selected: selectedIndex === index, + }; + + if (forceRenderTabPanel) props.forceRender = forceRenderTabPanel; + if (selectedTabPanelClassName) + props.selectedClassName = selectedTabPanelClassName; + + index++; + + result = cloneElement(child, props); + } + + return result; + }); + } + + function handleKeyDown(e) { + const { direction, disableUpDownKeys, disableLeftRightKeys } = props; + if (isTabFromContainer(e.target)) { + let { selectedIndex: index } = props; + let preventDefault = false; + let useSelectedIndex = false; + + if ( + e.code === 'Space' || + e.keyCode === 32 /* space */ || + e.code === 'Enter' || + e.keyCode === 13 /* enter */ + ) { + preventDefault = true; + useSelectedIndex = false; + handleClick(e); + } + + // keyCode is deprecated and only used here for IE + + if ( + (!disableLeftRightKeys && + (e.keyCode === 37 || e.code === 'ArrowLeft')) /* arrow left */ || + (!disableUpDownKeys && + (e.keyCode === 38 || e.code === 'ArrowUp')) /* arrow up */ + ) { + // Select next tab to the left, validate if up arrow is not disabled + if (direction === 'rtl') { + index = getNextTab(index); + } else { + index = getPrevTab(index); + } + preventDefault = true; + useSelectedIndex = true; + } else if ( + (!disableLeftRightKeys && + (e.keyCode === 39 || e.code === 'ArrowRight')) /* arrow right */ || + (!disableUpDownKeys && + (e.keyCode === 40 || e.code === 'ArrowDown')) /* arrow down */ + ) { + // Select next tab to the right, validate if down arrow is not disabled + if (direction === 'rtl') { + index = getPrevTab(index); + } else { + index = getNextTab(index); + } + preventDefault = true; + useSelectedIndex = true; + } else if (e.keyCode === 35 || e.code === 'End') { + // Select last tab (End key) + index = getLastTab(); + preventDefault = true; + useSelectedIndex = true; + } else if (e.keyCode === 36 || e.code === 'Home') { + // Select first tab (Home key) + index = getFirstTab(); + preventDefault = true; + useSelectedIndex = true; + } + + // This prevents scrollbars from moving around + if (preventDefault) { + e.preventDefault(); + } + + // Only use the selected index in the state if we're not using the tabbed index + if (useSelectedIndex) { + setSelected(index, e); + } + } + } + + function handleClick(e) { + let node = e.target; + do { + if (isTabFromContainer(node)) { + if (isTabDisabled(node)) { + return; + } + + const index = [].slice + .call(node.parentNode.children) + .filter(isTabNode) + .indexOf(node); + setSelected(index, e); + return; + } + } while ((node = node.parentNode) != null); + } + + /** + * Determine if a node from event.target is a Tab element for the current Tabs container. + * If the clicked element is not a Tab, it returns false. + * If it finds another Tabs container between the Tab and `this`, it returns false. + */ + function isTabFromContainer(node) { + // return immediately if the clicked element is not a Tab. + if (!isTabNode(node)) { + return false; + } + + // Check if the first occurrence of a Tabs container is `this` one. + let nodeAncestor = node.parentElement; + do { + if (nodeAncestor === ref.current) return true; + if (nodeAncestor.getAttribute('data-rttabs')) break; + + nodeAncestor = nodeAncestor.parentElement; + } while (nodeAncestor); + + return false; + } + const { + children, // unused + className, + disabledTabClassName, // unused + domRef, + focus, // unused + forceRenderTabPanel, // unused + onSelect, // unused + selectedIndex, // unused + selectedTabClassName, // unused + selectedTabPanelClassName, // unused + environment, // unused + disableUpDownKeys, // unused + disableLeftRightKeys, // unused + ...attributes + } = { + ...defaultProps, + ...props, + }; + return ( +
      { + ref.current = node; + if (domRef) domRef(node); + }} + data-rttabs + > + {getChildren()} +
      + ); +}; + +export default UncontrolledTabs; diff --git a/src/components/__tests__/Tab-test.js b/src/components/__tests__/Tab-test.js deleted file mode 100644 index 0f3e758ff8..0000000000 --- a/src/components/__tests__/Tab-test.js +++ /dev/null @@ -1,47 +0,0 @@ -/* global jest, describe, it, expect */ -import React from 'react'; -import { shallow } from 'enzyme'; -import Tab from '../Tab'; - -describe('', () => { - it('should have sane defaults', () => { - const wrapper = shallow(); - - expect(wrapper.hasClass('ReactTabs__Tab')).toBe(true); - expect(wrapper.prop('role')).toBe('tab'); - expect(wrapper.prop('aria-selected')).toBe('false'); - expect(wrapper.prop('aria-expanded')).toBe('false'); - expect(wrapper.prop('aria-disabled')).toBe('false'); - expect(wrapper.prop('aria-controls')).toBe(null); - expect(wrapper.prop('id')).toBe(null); - expect(wrapper.children().length).toBe(0); - }); - - it('should accept className', () => { - const wrapper = shallow(); - - expect(wrapper.hasClass('ReactTabs__Tab')).toBe(true); - expect(wrapper.hasClass('foobar')).toBe(true); - }); - - it('should support being selected', () => { - const wrapper = shallow(Hello); - - expect(wrapper.hasClass('ReactTabs__Tab')).toBe(true); - expect(wrapper.hasClass('ReactTabs__Tab--selected')).toBe(true); - expect(wrapper.prop('aria-selected')).toBe('true'); - expect(wrapper.prop('aria-expanded')).toBe('true'); - expect(wrapper.prop('aria-disabled')).toBe('false'); - expect(wrapper.prop('aria-controls')).toBe('1234'); - expect(wrapper.prop('id')).toBe('abcd'); - expect(wrapper.text()).toBe('Hello'); - }); - - it('should support being disabled', () => { - const wrapper = shallow(); - - expect(wrapper.hasClass('ReactTabs__Tab')).toBe(true); - expect(wrapper.hasClass('ReactTabs__Tab--disabled')).toBe(true); - expect(wrapper.prop('aria-disabled')).toBe('true'); - }); -}); diff --git a/src/components/__tests__/Tab-test.jsx b/src/components/__tests__/Tab-test.jsx new file mode 100644 index 0000000000..4c89cba506 --- /dev/null +++ b/src/components/__tests__/Tab-test.jsx @@ -0,0 +1,66 @@ +import { afterEach, beforeAll, describe, expect, test } from 'vitest'; +import React from 'react'; +import { cleanup, render } from '@testing-library/react'; +import Tab from '../Tab'; +import { TabWrapper } from './helpers/higherOrder'; + +function expectToMatchSnapshot(component) { + const { container } = render(component); + expect(container.firstChild).toMatchSnapshot(); +} + +afterEach(cleanup); + +describe('', () => { + beforeAll(() => { + // eslint-disable-next-line no-console + console.error = (error) => { + throw new Error(error); + }; + }); + + test('should have sane defaults', () => { + expectToMatchSnapshot(); + }); + + test('should accept className', () => { + expectToMatchSnapshot(); + }); + + test('should support being selected', () => { + expectToMatchSnapshot( + + Hello + , + ); + }); + + test('should support being selected with custom class', () => { + expectToMatchSnapshot(); + }); + + test('should support being disabled', () => { + expectToMatchSnapshot(); + }); + + test('should support being disabled with custom class name', () => { + expectToMatchSnapshot(); + }); + + test('should pass through custom properties', () => { + expectToMatchSnapshot(); + }); + + test('should not allow overriding all default properties', () => { + // eslint-disable-next-line jsx-a11y/aria-role + expectToMatchSnapshot(); + }); + + test('should allow to be wrapped in higher-order-component', () => { + expectToMatchSnapshot(); + }); + + test('override the tabIndex if it was provided', () => { + expectToMatchSnapshot(Hello); + }); +}); diff --git a/src/components/__tests__/TabList-test.js b/src/components/__tests__/TabList-test.js deleted file mode 100644 index 9ffb57dc02..0000000000 --- a/src/components/__tests__/TabList-test.js +++ /dev/null @@ -1,20 +0,0 @@ -/* global jest, describe, it, expect */ -import React from 'react'; -import { shallow } from 'enzyme'; -import TabList from '../TabList'; - -describe('', () => { - it('should have sane defaults', () => { - const wrapper = shallow(); - - expect(wrapper.hasClass('ReactTabs__TabList')).toBe(true); - expect(wrapper.prop('role')).toBe('tablist'); - }); - - it('should accept className', () => { - const wrapper = shallow(); - - expect(wrapper.hasClass('ReactTabs__TabList')).toBe(true); - expect(wrapper.hasClass('foobar')).toBe(true); - }); -}); diff --git a/src/components/__tests__/TabList-test.jsx b/src/components/__tests__/TabList-test.jsx new file mode 100644 index 0000000000..5e3c3605e1 --- /dev/null +++ b/src/components/__tests__/TabList-test.jsx @@ -0,0 +1,110 @@ +import { afterEach, beforeAll, describe, expect, test, vi } from 'vitest'; +import React from 'react'; +import { cleanup, render } from '@testing-library/react'; +import Tab from '../Tab'; +import TabList from '../TabList'; +import TabPanel from '../TabPanel'; +import Tabs from '../Tabs'; +import { TabListWrapper, TabWrapper } from './helpers/higherOrder'; + +vi.mock('react', async (importOriginal) => { + const originalModule = await importOriginal(); + + return { + ...originalModule, + useId: () => ':r0:', + }; +}); + +function expectToMatchSnapshot(component) { + const { container } = render(component); + expect(container.firstChild).toMatchSnapshot(); +} + +afterEach(cleanup); + +describe('', () => { + beforeAll(() => { + // eslint-disable-next-line no-console + console.error = (error) => { + throw new Error(error); + }; + }); + + test('should have sane defaults', () => { + expectToMatchSnapshot(); + }); + + test('should accept className', () => { + expectToMatchSnapshot(); + }); + + test('should pass through custom properties', () => { + expectToMatchSnapshot(); + }); + + test('should not allow overriding all default properties', () => { + // eslint-disable-next-line jsx-a11y/aria-role + expectToMatchSnapshot(); + }); + + test('should retain the default classnames for active and disabled tab', () => { + expectToMatchSnapshot( + + + Foo + Bar + + Foo + Bar + , + ); + }); + + test('should display the custom classnames for selected and disabled tab specified on tabs', () => { + expectToMatchSnapshot( + + + Foo + Bar + + Foo + Bar + , + ); + }); + + test('should display the custom classnames for selected and disabled tab', () => { + expectToMatchSnapshot( + + + + Foo + + + Bar + + + Foo + Bar + , + ); + }); + + test('should allow for higher order components', () => { + expectToMatchSnapshot( + + + Foo + Bar + + Foo + Bar + , + ); + }); +}); diff --git a/src/components/__tests__/TabPanel-test.js b/src/components/__tests__/TabPanel-test.js deleted file mode 100644 index 88d7a8dcc6..0000000000 --- a/src/components/__tests__/TabPanel-test.js +++ /dev/null @@ -1,39 +0,0 @@ -/* global jest, describe, it, expect */ -import React from 'react'; -import { shallow } from 'enzyme'; -import TabPanel from '../TabPanel'; - -describe('Tab', () => { - it('should have sane defaults', () => { - const wrapper = shallow(Hola); - - expect(wrapper.hasClass('ReactTabs__TabPanel')).toBe(true); - expect(wrapper.prop('role')).toBe('tabpanel'); - expect(wrapper.prop('aria-labelledby')).toBe(null); - expect(wrapper.prop('id')).toBe(null); - expect(wrapper.children().length).toBe(0); - expect(wrapper.children().length).toBe(0); - expect(wrapper.prop('style')).not.toBe(null); - expect(wrapper.prop('style').display).toBe('none'); - }); - - it('should accept className', () => { - const wrapper = shallow(); - - expect(wrapper.hasClass('ReactTabs__TabPanel')).toBe(true); - expect(wrapper.hasClass('foobar')).toBe(true); - }); - - it('should support being selected', () => { - const wrapper = shallow(Hola); - - expect(wrapper.hasClass('ReactTabs__TabPanel')).toBe(true); - expect(wrapper.hasClass('ReactTabs__TabPanel--selected')).toBe(true); - expect(wrapper.prop('aria-labelledby')).toBe('1234'); - expect(wrapper.prop('id')).toBe('abcd'); - expect(wrapper.text()).toBe('Hola'); - expect(wrapper.prop('style')).not.toBe(null); - expect(wrapper.prop('style').display).toBe(null); - }); -}); - diff --git a/src/components/__tests__/TabPanel-test.jsx b/src/components/__tests__/TabPanel-test.jsx new file mode 100644 index 0000000000..d74f764aa8 --- /dev/null +++ b/src/components/__tests__/TabPanel-test.jsx @@ -0,0 +1,66 @@ +import { afterEach, beforeAll, describe, expect, test } from 'vitest'; +import React from 'react'; +import { cleanup, render } from '@testing-library/react'; +import TabPanel from '../TabPanel'; +import { TabPanelWrapper } from './helpers/higherOrder'; + +function expectToMatchSnapshot(component) { + const { container } = render(component); + expect(container.firstChild).toMatchSnapshot(); +} + +afterEach(cleanup); + +describe('', () => { + beforeAll(() => { + // eslint-disable-next-line no-console + console.error = (error) => { + throw new Error(error); + }; + }); + + test('should have sane defaults', () => { + expectToMatchSnapshot(Hola); + }); + + test('should render when selected', () => { + expectToMatchSnapshot(Hola); + }); + + test('should render when forced', () => { + expectToMatchSnapshot(Hola); + }); + + test('should accept className', () => { + expectToMatchSnapshot(); + }); + + test('should support being selected', () => { + expectToMatchSnapshot( + + Hola + , + ); + }); + + test('should support being selected with custom class name', () => { + expectToMatchSnapshot( + + Hola + , + ); + }); + + test('should pass through custom properties', () => { + expectToMatchSnapshot(); + }); + + test('should not allow overriding all default properties', () => { + // eslint-disable-next-line jsx-a11y/aria-role + expectToMatchSnapshot(); + }); + + test('should allow for higher-order components', () => { + expectToMatchSnapshot(); + }); +}); diff --git a/src/components/__tests__/Tabs-errors-test.jsx b/src/components/__tests__/Tabs-errors-test.jsx new file mode 100644 index 0000000000..228342b36b --- /dev/null +++ b/src/components/__tests__/Tabs-errors-test.jsx @@ -0,0 +1,182 @@ +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'; +import React from 'react'; +import { cleanup, render } from '@testing-library/react'; +import '@testing-library/jest-dom/vitest'; +import Tab from '../Tab'; +import TabList from '../TabList'; +import TabPanel from '../TabPanel'; +import Tabs from '../Tabs'; + +vi.mock('react', async (importOriginal) => { + const originalModule = await importOriginal('react'); + + return { + ...originalModule, + useId: () => ':r0:', + }; +}); + +afterEach(cleanup); + +describe('', () => { + let consoleErrorMock; + + function assertPropTypeWarning(message, nth = 1) { + expect(consoleErrorMock).toHaveBeenNthCalledWith( + nth, + expect.stringMatching(message), + ); + } + + beforeEach(() => { + consoleErrorMock = vi.spyOn(console, 'error').mockImplementation(() => {}); + }); + + afterEach(() => { + consoleErrorMock.mockRestore(); + }); + + describe('errors', () => { + test('should result with warning when tabs/panels are imbalanced and it should ignore non tab children', () => { + render( + + + Foo +
      +
      +
      + + Hello Foo + Hello Bar +
      , + ); + + assertPropTypeWarning( + "There should be an equal number of 'Tab' and 'TabPanel' in `Tabs`. Received 1 'Tab' and 2 'TabPanel'.", + 1, + ); + assertPropTypeWarning( + "There should be an equal number of 'Tab' and 'TabPanel' in `UncontrolledTabs`. Received 1 'Tab' and 2 'TabPanel'.", + 2, + ); + }); + + test('should result with warning when multiple tablist components exist', () => { + render( + + + Foo + + + Foo + + + + , + ); + + assertPropTypeWarning( + "Found multiple 'TabList' components inside 'Tabs'. Only one is allowed.", + ); + }); + + test('should result with warning when tab outside of tablist', () => { + render( + + + Foo + + Foo + + + , + ); + + assertPropTypeWarning( + "Found a 'Tab' component outside of the 'TabList' component. 'Tab' components have to be inside the 'TabList' component.", + ); + }); + + test('should result with warning when defaultIndex and selectedIndex set', () => { + render( + {}}> + + Foo + + Foo + , + ); + + assertPropTypeWarning( + 'The prop `selectedIndex` cannot be used together with `defaultIndex` in `Tabs`.\nEither remove `selectedIndex` to let `Tabs` handle the selected tab internally or remove `defaultIndex` to handle it yourself.', + ); + }); + + test('should throw when mode of component changes', () => { + const onSelect = () => {}; + const { rerender } = render( + + + Foo + Foo2 + + Foo + Foo2 + , + ); + + const consoleLogMock = vi.spyOn(console, 'log').mockImplementation(); + try { + rerender( + + + Foo + Foo2 + + Foo + Foo2 + , + ); + } catch (e) { + expect(e.message).toContain( + 'Switching between controlled mode (by using `selectedIndex`) and uncontrolled mode is not supported in `Tabs`.', + ); + } finally { + consoleLogMock.mockRestore(); + } + }); + + test('should result with warning when tabs/panels are imbalanced', () => { + render( + + + Foo + + , + ); + + assertPropTypeWarning( + "There should be an equal number of 'Tab' and 'TabPanel' in `Tabs`. Received 1 'Tab' and 0 'TabPanel'.", + 1, + ); + assertPropTypeWarning( + "There should be an equal number of 'Tab' and 'TabPanel' in `UncontrolledTabs`. Received 1 'Tab' and 0 'TabPanel'.", + 2, + ); + }); + + test('should result with warning when onSelect missing when selectedIndex set', () => { + render( + + + Foo + + Foo + , + ); + + assertPropTypeWarning( + 'The prop `onSelect` is marked as required in `Tabs`, but its value is `undefined` or `null`.\n`onSelect` is required when `selectedIndex` is also set. Not doing so will make the tabs not do anything, as `selectedIndex` indicates that you want to handle the selected tab yourself.\nIf you only want to set the inital tab replace `selectedIndex` with `defaultIndex`.', + ); + }); + }); +}); diff --git a/src/components/__tests__/Tabs-node-test.jsx b/src/components/__tests__/Tabs-node-test.jsx new file mode 100644 index 0000000000..1e9088f01d --- /dev/null +++ b/src/components/__tests__/Tabs-node-test.jsx @@ -0,0 +1,43 @@ +/** + * @vitest-environment node + */ +import { describe, expect, test, vi } from 'vitest'; +import React from 'react'; +import Tab from '../Tab'; +import TabList from '../TabList'; +import TabPanel from '../TabPanel'; +import Tabs from '../Tabs'; + +vi.mock('react', async (importOriginal) => { + const originalModule = await importOriginal(); + + return { + ...originalModule, + useId: () => ':r0:', + }; +}); + +function createTabs(props = {}) { + return ( + + + Foo + Bar + + Baz + + Qux + + Hello Foo + Hello Bar + Hello Baz + Hello Qux + + ); +} + +describe('ServerSide ', () => { + test('does not crash in node environments', () => { + expect(() => createTabs()).not.toThrow(); + }); +}); diff --git a/src/components/__tests__/Tabs-test.js b/src/components/__tests__/Tabs-test.js deleted file mode 100644 index 5ba890603b..0000000000 --- a/src/components/__tests__/Tabs-test.js +++ /dev/null @@ -1,245 +0,0 @@ -/* global jest, describe, it, expect */ -import React from 'react'; -import { shallow, mount } from 'enzyme'; -import Tab from '../Tab'; -import TabList from '../TabList'; -import TabPanel from '../TabPanel'; -import Tabs from '../Tabs'; - -function createTabs(props = { - selectedIndex: 0, - focus: false, - onSelect: null, - forceRenderTabPanel: false, - className: null, -}) { - return ( - - - Foo - Bar - Baz - Qux - - Hello Foo - Hello Bar - Hello Baz - Hello Qux - - ); -} - -function assertTabSelected(wrapper, index) { - const tab = wrapper.childAt(0).childAt(index); - const panel = wrapper.childAt(index + 1); - - expect(tab.prop('selected')).toBe(true); - expect(panel.prop('selected')).toBe(true); -} - -describe('react-tabs', () => { - describe('props', () => { - it('should default to selectedIndex being 0', () => { - const wrapper = shallow(createTabs()); - - assertTabSelected(wrapper, 0); - }); - - it('should honor selectedIndex prop', () => { - const wrapper = shallow(createTabs({ selectedIndex: 1 })); - - assertTabSelected(wrapper, 1); - }); - - it('should call onSelect when selection changes', () => { - const called = { index: -1, last: -1 }; - const wrapper = shallow(createTabs({ - onSelect(index, last) { - called.index = index; - called.last = last; - }, - })); - - wrapper.instance().setSelected(2); - expect(called.index).toBe(2); - expect(called.last).toBe(0); - }); - - it('should have a default className', () => { - const wrapper = shallow(createTabs()); - - expect(wrapper.hasClass('ReactTabs')).toBe(true); - expect(wrapper.hasClass('react-tabs')).toBe(true); - }); - - it('should accept className', () => { - const wrapper = shallow(createTabs({ className: 'foobar' })); - - expect(wrapper.hasClass('ReactTabs')).toBe(true); - expect(wrapper.hasClass('react-tabs')).toBe(true); - expect(wrapper.hasClass('foobar')).toBe(true); - }); - }); - - describe('child props', () => { - it('should set disabled on disabled node', () => { - const wrapper = mount(createTabs()); - const tablist = wrapper.childAt(0); - - expect(tablist.childAt(3).prop('disabled')).toBe(true); - }); - - it('should set ids correctly', () => { - const wrapper = mount(createTabs()); - const tablist = wrapper.childAt(0); - - for (let i = 0, l = wrapper.instance().getTabsCount(); i < l; i++) { - const tab = tablist.childAt(i); - const panel = wrapper.childAt(i + 1); - - expect(tab.prop('id')).toBe(panel.prop('tabId')); - expect(panel.prop('id')).toBe(tab.prop('panelId')); - } - }); - }); - - describe('interaction', () => { - it('should update selectedIndex when clicked', () => { - const wrapper = mount(createTabs()); - wrapper.childAt(0).childAt(1).simulate('click'); - - assertTabSelected(wrapper, 1); - }); - - it('should update selectedIndex when tab child is clicked', () => { - const wrapper = mount(createTabs()); - const tablist = wrapper.childAt(0); - tablist.childAt(2).first().simulate('click'); - - assertTabSelected(wrapper, 2); - }); - - it('should not change selectedIndex when clicking a disabled tab', () => { - const wrapper = mount(createTabs({ selectedIndex: 0 })); - - wrapper.childAt(0).childAt(3).simulate('click'); - assertTabSelected(wrapper, 0); - }); - - // TODO: Can't seem to make this fail when removing fix :`( - // See https://github.com/rackt/react-tabs/pull/7 - // it('should preserve selectedIndex when typing', function () { - // let App = React.createClass({ - // handleKeyDown: function () { this.forceUpdate(); }, - // render: function () { - // return ( - // - // - // First - // Second - // - // 1st - // - // - // ); - // } - // }); - // - // let tabs = TestUtils.renderIntoDocument().refs.tabs; - // let input = tabs.getDOMNode().querySelector('input'); - // - // input.focus(); - // TestUtils.Simulate.keyDown(input, { - // keyCode: 'a'.charCodeAt() - // }); - // - // assertTabSelected(tabs, 1); - // }); - }); - - describe('performance', () => { - it('should only render the active tab panel', () => { - const wrapper = mount(createTabs()); - - expect(wrapper.childAt(1).text()).toBe('Hello Foo'); - expect(wrapper.childAt(2).text()).toBe(''); - expect(wrapper.childAt(3).text()).toBe(''); - - wrapper.childAt(0).childAt(1).simulate('click'); - - expect(wrapper.childAt(1).text()).toBe(''); - expect(wrapper.childAt(2).text()).toBe('Hello Bar'); - expect(wrapper.childAt(3).text()).toBe(''); - - - wrapper.childAt(0).childAt(2).simulate('click'); - - expect(wrapper.childAt(1).text()).toBe(''); - expect(wrapper.childAt(2).text()).toBe(''); - expect(wrapper.childAt(3).text()).toBe('Hello Baz'); - }); - - it('should render all tabs if forceRenderTabPanel is true', () => { - const wrapper = mount(createTabs({ forceRenderTabPanel: true })); - - expect(wrapper.childAt(1).text()).toBe('Hello Foo'); - expect(wrapper.childAt(2).text()).toBe('Hello Bar'); - expect(wrapper.childAt(3).text()).toBe('Hello Baz'); - }); - }); - - describe('validation', () => { - it('should result with warning when tabs/panels are imbalanced', () => { - const wrapper = shallow( - - - Foo - - - ); - - const result = Tabs.propTypes.children(wrapper.props(), 'children', 'Tabs'); - expect(result instanceof Error).toBe(true); - }); - - it('should result with a warning when wrong element is found', () => { - const wrapper = shallow( - - - -
      - - - - ); - - const result = Tabs.propTypes.children(wrapper.props(), 'children', 'Tabs'); - expect(result instanceof Error).toBe(true); - }); - - it('should be okay with rendering without any children', () => { - expect(() => shallow()).not.toThrow(); - }); - - it('should be okay with rendering just TabList', () => { - expect(() => shallow( - - - - )).not.toThrow(); - }); - - it('should gracefully render null', () => { - expect(() => shallow( - - - Tab A - {false && Tab B} - - Content A - {false && Content B} - - )).not.toThrow(); - }); - }); -}); diff --git a/src/components/__tests__/Tabs-test.jsx b/src/components/__tests__/Tabs-test.jsx new file mode 100644 index 0000000000..8010cb8efd --- /dev/null +++ b/src/components/__tests__/Tabs-test.jsx @@ -0,0 +1,653 @@ +import { afterEach, describe, expect, test, vi } from 'vitest'; +import React from 'react'; +import { cleanup, render, screen, within } from '@testing-library/react'; +import { userEvent } from '@testing-library/user-event'; +import '@testing-library/jest-dom/vitest'; +import Tab from '../Tab'; +import TabList from '../TabList'; +import TabPanel from '../TabPanel'; +import Tabs from '../Tabs'; +import { + TabListWrapper, + TabWrapper, + TabPanelWrapper, +} from './helpers/higherOrder'; + +vi.mock('react', async (importOriginal) => { + const originalModule = await importOriginal('react'); + + return { + ...originalModule, + useId: () => ':r0:', + }; +}); + +function expectToMatchSnapshot(component) { + expect(render(component).container.firstChild).toMatchSnapshot(); +} + +function createTabs(props = {}) { + return ( + + + Tab1 + Tab2 + + Tab3 + + + Tab4 + + + Hello Tab1 + Hello Tab2 + Hello Tab3 + Hello Tab4 + + ); +} + +function assertTabSelected(tabNo, node = screen) { + const tab = node.getByTestId(`tab${tabNo}`); + const panel = node.getByTestId(`panel${tabNo}`); + + expect(tab).toHaveAttribute('aria-selected', 'true'); + expect(panel).toHaveTextContent(`Hello Tab${tabNo}`); +} + +afterEach(cleanup); + +describe('', () => { + describe('props', () => { + test('should have sane defaults', () => { + expectToMatchSnapshot(createTabs()); + }); + + test('should honor positive defaultIndex prop', () => { + expectToMatchSnapshot(createTabs({ defaultIndex: 1 })); + }); + + test('should honor negative defaultIndex prop', () => { + expectToMatchSnapshot(createTabs({ defaultIndex: -1 })); + }); + + test('should call onSelect when selection changes', async () => { + const called = { index: -1, last: -1 }; + render( + createTabs({ + onSelect(index, last) { + called.index = index; + called.last = last; + }, + }), + ); + + await userEvent.click(screen.getByTestId('tab2')); + + expect(called.index).toBe(1); + expect(called.last).toBe(0); + }); + + test('should accept className', () => { + expectToMatchSnapshot(createTabs({ className: 'foobar' })); + }); + + test('should accept domRef', () => { + let domNode; + render( + createTabs({ + domRef: (node) => { + domNode = node; + }, + }), + ); + + expect(domNode).not.toBeUndefined(); + expect(domNode.className).toBe('react-tabs'); + }); + }); + + describe('interaction', () => { + describe('mouse', () => { + test('should update selectedIndex when clicked', async () => { + render(createTabs()); + await userEvent.click(screen.getByTestId('tab2')); + + assertTabSelected(2); + }); + + test('should update selectedIndex when tab child is clicked', async () => { + render(createTabs()); + await userEvent.click(screen.getByTestId('tab3')); + + assertTabSelected(3); + }); + + test('should not change selectedIndex when clicking a disabled tab', async () => { + render(createTabs({ defaultIndex: 0 })); + await userEvent.click(screen.getByTestId('tab4')); + + assertTabSelected(1); + }); + }); + + describe('keyboard', () => { + test('should change focus on tab and tabindex set', async () => { + render( + + + + Tab1 + + + Tab2 + + + Tab3 + + + Hello Tab1 + Hello Tab2 + Hello Tab3 + , + ); + const element = screen.getByTestId('tab1'); + await userEvent.click(element); + + assertTabSelected(1); + + await userEvent.keyboard('[Tab]'); + await userEvent.keyboard('[Enter]'); + + assertTabSelected(2); + + await userEvent.keyboard('[Tab]'); + await userEvent.keyboard('[Space]'); + + assertTabSelected(3); + }); + + test('should update selectedIndex when arrow right key pressed', async () => { + render(createTabs()); + const element = screen.getByTestId('tab1'); + await userEvent.click(element); + await userEvent.type(element, '[ArrowRight]'); + + assertTabSelected(2); + }); + + test('should overflow when arrow right key pressed and no right tab available', async () => { + render(createTabs()); + const element = screen.getByTestId('tab3'); + await userEvent.click(element); + await userEvent.type(element, '[ArrowRight]'); + + assertTabSelected(1); + }); + + test('should not do anything when arrow right key pressed and no other tab available', async () => { + render( + + + Tab1 + + Tab2 + + + Hello Tab1 + Hello Tab2 + , + ); + const element = screen.getByTestId('tab1'); + await userEvent.click(element); + await userEvent.keyboard('[ArrowRight]'); + + assertTabSelected(1); + }); + + test('should overflow when arrow left key pressed and no left tab available', async () => { + render(createTabs()); + const element = screen.getByTestId('tab1'); + await userEvent.click(element); + await userEvent.keyboard('[ArrowLeft]'); + + assertTabSelected(3); + }); + + test('should not do anything when arrow left key pressed and no other tab available', async () => { + render( + + + + Tab1 + + Tab2 + + Hello Tab1 + Hello Tab2 + , + ); + const element = screen.getByTestId('tab2'); + await userEvent.click(element); + await userEvent.keyboard('[ArrowLeft]'); + + assertTabSelected(2); + }); + + test('should move to first tab on home key', async () => { + render(createTabs()); + const element = screen.getByTestId('tab3'); + await userEvent.click(element); + await userEvent.type(element, '[Home]'); + + assertTabSelected(1); + }); + + test('should move to first tab on end key', async () => { + render(createTabs()); + const element = screen.getByTestId('tab1'); + await userEvent.click(element); + await userEvent.type(element, '[End]'); + + assertTabSelected(3); + }); + + test('should update selectedIndex when arrow left key pressed (RTL)', async () => { + render(createTabs({ direction: 'rtl' })); + const element = screen.getByTestId('tab1'); + await userEvent.click(element); + await userEvent.type(element, '[ArrowLeft]'); + + assertTabSelected(2); + }); + + test('should update selectedIndex when arrow right key pressed (RTL)', async () => { + render(createTabs({ direction: 'rtl' })); + const element = screen.getByTestId('tab2'); + await userEvent.click(element); + await userEvent.type(element, '[ArrowRight]'); + + assertTabSelected(1); + }); + + test('should not change selectedIndex when arrow left key pressed on a disabled tab', async () => { + render(createTabs()); + const element = screen.getByTestId('tab4'); + await userEvent.click(element); + await userEvent.type(element, '[ArrowLeft]'); + + assertTabSelected(1); + }); + }); + }); + + describe('performance', () => { + test('should only render the selected tab panel', async () => { + render(createTabs()); + const tabPanels = screen.getAllByRole('tabpanel'); + + expect(tabPanels[0]).toHaveTextContent('Hello Tab1'); + expect(tabPanels[1]).toHaveTextContent(''); + expect(tabPanels[2]).toHaveTextContent(''); + expect(tabPanels[3]).toHaveTextContent(''); + + await userEvent.click(screen.getByTestId('tab2')); + + expect(tabPanels[0]).toHaveTextContent(''); + expect(tabPanels[1]).toHaveTextContent('Hello Tab2'); + expect(tabPanels[2]).toHaveTextContent(''); + expect(tabPanels[3]).toHaveTextContent(''); + + await userEvent.click(screen.getByTestId('tab3')); + + expect(tabPanels[0]).toHaveTextContent(''); + expect(tabPanels[1]).toHaveTextContent(''); + expect(tabPanels[2]).toHaveTextContent('Hello Tab3'); + expect(tabPanels[3]).toHaveTextContent(''); + }); + + test('should render all tabs if forceRenderTabPanel is true', () => { + expectToMatchSnapshot(createTabs({ forceRenderTabPanel: true })); + }); + }); + + describe('validation', () => { + test('should allow random order for elements', () => { + expectToMatchSnapshot( + + Hello Foo + + Foo + Bar + + Hello Bar + , + ); + }); + + test('should not throw a warning when wrong element is found', () => { + expectToMatchSnapshot( + + + +
      + + + , + ); + }); + + test('should be okay with rendering without any children', () => { + expectToMatchSnapshot(); + }); + + test('should be okay with rendering just TabList', () => { + expectToMatchSnapshot( + + + , + ); + }); + + test('should gracefully render null', () => { + expectToMatchSnapshot( + + + Tab A + {/* eslint-disable-next-line no-constant-binary-expression*/} + {false && Tab B} + + Content A + {/* eslint-disable-next-line no-constant-binary-expression*/} + {false && Content B} + , + ); + }); + + test('should support nested tabs', async () => { + render( + + + + + + + Hello Tab1 + + + + + + + Hello Tab2 + + + + , + ); + + await userEvent.click( + within(screen.getByTestId('second')).getByTestId('tab2'), + ); + + assertTabSelected(1); + assertTabSelected(2, within(screen.getByTestId('second'))); + }); + + test('should allow other DOM nodes', () => { + expectToMatchSnapshot( + +
      + +
      + + + + +
      + +
      +
      + + +
      +
      , + ); + }); + }); + + test('should pass through custom properties', () => { + expectToMatchSnapshot(); + }); + + test('should not add known props to dom', () => { + expectToMatchSnapshot(); + }); + + test('should cancel if event handler returns false', async () => { + render(createTabs({ onSelect: () => false })); + + assertTabSelected(1); + + await userEvent.click(screen.getByTestId('tab2')); + assertTabSelected(1); + + await userEvent.click(screen.getByTestId('tab3')); + assertTabSelected(1); + }); + + test('should trigger onSelect handler when clicking', async () => { + let wasClicked = false; + render( + createTabs({ + onSelect: () => { + wasClicked = true; + }, + }), + ); + + assertTabSelected(1); + + await userEvent.click(screen.getByTestId('tab2')); + assertTabSelected(2); + expect(wasClicked).toBe(true); + }); + + test('should trigger onSelect handler when clicking on open tab', async () => { + let wasClicked = false; + render( + createTabs({ + onSelect: () => { + wasClicked = true; + }, + }), + ); + + assertTabSelected(1); + + await userEvent.click(screen.getByTestId('tab1')); + assertTabSelected(1); + expect(wasClicked).toBe(true); + }); + + test('should switch tabs if setState is called within onSelect', async () => { + class Wrap extends React.Component { + state = {}; + + handleSelect = () => this.setState({ foo: 'bar' }); + + render() { + const { foo } = this.state; + return createTabs({ + onSelect: this.handleSelect, + className: foo, + }); + } + } + + render(); + + await userEvent.click(screen.getByTestId('tab2')); + assertTabSelected(2); + + await userEvent.click(screen.getByTestId('tab3')); + assertTabSelected(3); + }); + + test('should allow for higher order components', () => { + expectToMatchSnapshot( + + + Foo + Bar + + Foo + Bar + , + ); + }); + + test('should allow string children', () => { + expectToMatchSnapshot( + + Foo + + Foo + Foo + Foo + Bar + Foo + + Bar + Foo + Foo + , + ); + }); + + test('should change tabs when arrow up/down is pressed', async () => { + render(createTabs()); + const firstTab = screen.getByTestId('tab1'); + const secondTab = screen.getByTestId('tab2'); + + await userEvent.tab(); + expect(firstTab).toHaveFocus(); + assertTabSelected(1); + + await userEvent.type(firstTab, '[ArrowDown]'); + expect(secondTab).toHaveFocus(); + assertTabSelected(2); + + await userEvent.type(secondTab, '[ArrowUp]'); + expect(firstTab).toHaveFocus(); + assertTabSelected(1); + }); + + test('should not focus tabs if focusTabOnClick is false', async () => { + render(createTabs({ focusTabOnClick: false })); + const firstTab = screen.getByTestId('tab1'); + const secondTab = screen.getByTestId('tab2'); + + expect(firstTab).not.toHaveFocus(); + expect(secondTab).not.toHaveFocus(); + assertTabSelected(1); + + await userEvent.click(secondTab); + expect(firstTab).not.toHaveFocus(); + expect(secondTab).not.toHaveFocus(); + assertTabSelected(2); + }); + + test('should not focus tab again on rerender', async () => { + const { rerender } = render( + <> + + {createTabs()} + , + ); + const firstTab = screen.getByTestId('tab1'); + const inputField = screen.getByTestId('input1'); + + expect(firstTab).not.toHaveFocus(); + expect(inputField).not.toHaveFocus(); + + await userEvent.click(firstTab); + + expect(firstTab).toHaveFocus(); + expect(inputField).not.toHaveFocus(); + + await userEvent.click(inputField); + + expect(firstTab).not.toHaveFocus(); + expect(inputField).toHaveFocus(); + + rerender( + <> + + {createTabs()} + , + ); + + expect(firstTab).not.toHaveFocus(); + expect(inputField).toHaveFocus(); + }); + + test('should not change tabs when arrow up/down is pressed and disableUpDownKeys is passed', async () => { + render( + createTabs({ + disableUpDownKeys: true, + }), + ); + const firstTab = screen.getByTestId('tab1'); + + await userEvent.tab(); + expect(firstTab).toHaveFocus(); + assertTabSelected(1); + + await userEvent.type(firstTab, '[ArrowDown]'); + expect(firstTab).toHaveFocus(); + assertTabSelected(1); + + await userEvent.type(firstTab, '[ArrowUp]'); + expect(firstTab).toHaveFocus(); + assertTabSelected(1); + }); + + test('should not change tabs when arrow left/right is pressed and disableLeftRightKeys is passed', async () => { + render( + createTabs({ + disableLeftRightKeys: true, + }), + ); + const firstTab = screen.getByTestId('tab1'); + + await userEvent.tab(); + expect(firstTab).toHaveFocus(); + assertTabSelected(1); + + await userEvent.type(firstTab, '[ArrowLeft]'); + expect(firstTab).toHaveFocus(); + assertTabSelected(1); + + await userEvent.type(firstTab, '[ArrowRight]'); + expect(firstTab).toHaveFocus(); + assertTabSelected(1); + }); + + test('should render first tab once tabs are available', () => { + const { rerender } = render(); + + rerender( + + + Tab1 + Tab2 + + Hello Tab1 + Hello Tab2 + , + ); + + assertTabSelected(1); + }); +}); diff --git a/src/components/__tests__/__snapshots__/Tab-test.jsx.snap b/src/components/__tests__/__snapshots__/Tab-test.jsx.snap new file mode 100644 index 0000000000..56ffb188b2 --- /dev/null +++ b/src/components/__tests__/__snapshots__/Tab-test.jsx.snap @@ -0,0 +1,129 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[` > override the tabIndex if it was provided 1`] = ` + +`; + +exports[` > should accept className 1`] = ` + +`; + +exports[` > should support being selected with custom class 1`] = ` +