├── .gitignore ├── .npmignore ├── .prettierignore ├── .prettierrc.mjs ├── .travis.yml ├── LICENSE ├── README.md ├── eslint.config.mjs ├── package.json ├── playground ├── .gitignore ├── .prettierignore ├── .prettierrc ├── eslint.config.js ├── index.html ├── package.json ├── pnpm-lock.yaml ├── public │ ├── favicon.ico │ └── robots.txt ├── src │ ├── BackgroundImage.tsx │ ├── ResizeCard.tsx │ ├── Sidebar.tsx │ ├── Snippet.tsx │ ├── context.tsx │ ├── index.css │ ├── main.tsx │ ├── useCopyToClipboard.ts │ └── useDimensions.tsx ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts ├── pnpm-lock.yaml ├── rollup.config.mjs ├── src ├── index.ts ├── types.ts ├── useResizeDetector.ts └── utils.ts └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | */**/dist 3 | *.log 4 | .DS_Store 5 | build 6 | yarn.lock 7 | .eslintcache 8 | .yarn 9 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.log 3 | node_modules 4 | src 5 | test 6 | playground 7 | yarn.lock 8 | tsconfig.json 9 | .babelrc 10 | .eslintignore 11 | .eslintrc 12 | .gitignore 13 | .travis.yml 14 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | **/node_modules 2 | */**/dist 3 | *.log 4 | .DS_Store 5 | build 6 | yarn.lock 7 | pnpm-lock.yaml 8 | .eslintcache 9 | -------------------------------------------------------------------------------- /.prettierrc.mjs: -------------------------------------------------------------------------------- 1 | /** 2 | * @see https://prettier.io/docs/en/configuration.html 3 | * @type {import("prettier").Config} 4 | */ 5 | const config = { 6 | printWidth: 120, 7 | singleQuote: true, 8 | }; 9 | 10 | export default config; 11 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 'iojs' 4 | script: npm run test 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2023 Vitalii Maslianok 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Handle element resizes like it's 2025! 2 | 3 | 4 | 5 | #### [Live demo](https://react-resize-detector.vercel.app/) 6 | 7 | Modern browsers now have native support for detecting element size changes through [ResizeObservers](https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver). This library utilizes ResizeObservers to facilitate managing element size changes in React applications. 8 | 9 | 🐥 Tiny ~2kb 10 | 11 | 🐼 Written in TypeScript 12 | 13 | 🐠 Used by 170k repositories 14 | 15 | 🦄 Produces 100 million downloads annually 16 | 17 | No `window.resize` listeners! No timeouts! 18 | 19 | ## Is it necessary for you to use this library? 20 | 21 | Container queries now work in [all major browsers](https://caniuse.com/css-container-queries). It's very likely you can solve your task using [pure CSS](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Container_Queries). 22 | 23 |
Example 24 | 25 | ```html 26 |
27 |
28 |

Card title

29 |

Card content

30 |
31 |
32 | ``` 33 | 34 | ```css 35 | .post { 36 | container-type: inline-size; 37 | } 38 | 39 | /* Default heading styles for the card title */ 40 | .card h2 { 41 | font-size: 1em; 42 | } 43 | 44 | /* If the container is larger than 700px */ 45 | @container (min-width: 700px) { 46 | .card h2 { 47 | font-size: 2em; 48 | } 49 | } 50 | ``` 51 | 52 |
53 | 54 | ## Installation 55 | 56 | ```ssh 57 | npm i react-resize-detector 58 | // OR 59 | yarn add react-resize-detector 60 | ``` 61 | 62 | ## Example 63 | 64 | ```jsx 65 | import { useResizeDetector } from 'react-resize-detector'; 66 | 67 | const CustomComponent = () => { 68 | const { width, height, ref } = useResizeDetector(); 69 | return
{`${width}x${height}`}
; 70 | }; 71 | ``` 72 | 73 | #### With props 74 | 75 | ```js 76 | import { useResizeDetector } from 'react-resize-detector'; 77 | 78 | const CustomComponent = () => { 79 | const onResize = useCallback(() => { 80 | // on resize logic 81 | }, []); 82 | 83 | const { width, height, ref } = useResizeDetector({ 84 | handleHeight: false, 85 | refreshMode: 'debounce', 86 | refreshRate: 1000, 87 | onResize, 88 | }); 89 | 90 | return
{`${width}x${height}`}
; 91 | }; 92 | ``` 93 | 94 | #### With custom ref 95 | 96 | _It's not advised to use this approach, as dynamically mounting and unmounting the observed element could lead to unexpected behavior._ 97 | 98 | ```js 99 | import { useResizeDetector } from 'react-resize-detector'; 100 | 101 | const CustomComponent = () => { 102 | const targetRef = useRef(); 103 | const { width, height } = useResizeDetector({ targetRef }); 104 | return
{`${width}x${height}`}
; 105 | }; 106 | ``` 107 | 108 | ## API 109 | 110 | | Prop | Type | Description | Default | 111 | | --------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | 112 | | onResize | Func | Function that will be invoked with `width`, `height` and ResizeObserver `entry` arguments | `undefined` | 113 | | handleWidth | Bool | Trigger `onResize` on width change | `true` | 114 | | handleHeight | Bool | Trigger `onResize` on height change | `true` | 115 | | skipOnMount | Bool | Do not trigger onResize when a component mounts | `false` | 116 | | refreshMode | String | Possible values: `throttle` and `debounce` See [lodash docs](https://lodash.com/docs#debounce) for more information. `undefined` - callback will be fired for every frame | `undefined` | 117 | | refreshRate | Number | Use this in conjunction with `refreshMode`. Important! It's a numeric prop so set it accordingly, e.g. `refreshRate={500}` | `1000` | 118 | | refreshOptions | Object | Use this in conjunction with `refreshMode`. An object in shape of `{ leading: bool, trailing: bool }`. Please refer to [lodash's docs](https://lodash.com/docs/4.17.11#throttle) for more info | `undefined` | 119 | | observerOptions | Object | These options will be used as a second parameter of [`resizeObserver.observe`](https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver/observe) method. | `undefined` | 120 | | targetRef | Ref | Use this prop to pass a reference to the element you want to attach resize handlers to. It must be an instance of `React.useRef` or `React.createRef` functions | `undefined` | 121 | 122 | ## Testing with Enzyme and Jest 123 | 124 | Thanks to [@Primajin](https://github.com/Primajin) for posting this [snippet](https://github.com/maslianok/react-resize-detector/issues/145) 125 | 126 | ```jsx 127 | const { ResizeObserver } = window; 128 | 129 | beforeEach(() => { 130 | delete window.ResizeObserver; 131 | window.ResizeObserver = jest.fn().mockImplementation(() => ({ 132 | observe: jest.fn(), 133 | unobserve: jest.fn(), 134 | disconnect: jest.fn(), 135 | })); 136 | 137 | wrapper = mount(); 138 | }); 139 | 140 | afterEach(() => { 141 | window.ResizeObserver = ResizeObserver; 142 | jest.restoreAllMocks(); 143 | }); 144 | 145 | it('should do my test', () => { 146 | // [...] 147 | }); 148 | ``` 149 | 150 | ## License 151 | 152 | MIT 153 | 154 | ## ❤️ 155 | 156 | Show us some love and STAR ⭐ the project if you find it useful 157 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import eslint from '@eslint/js'; 2 | import tseslint from 'typescript-eslint'; 3 | import reactPlugin from 'eslint-plugin-react'; 4 | import prettierConfig from 'eslint-config-prettier'; 5 | 6 | export default tseslint.config( 7 | { 8 | ignores: ['**/build/**', '**/playground/**'], 9 | }, 10 | eslint.configs.recommended, 11 | tseslint.configs.recommended, 12 | reactPlugin.configs.flat.recommended, 13 | reactPlugin.configs.flat['jsx-runtime'], 14 | { 15 | settings: { 16 | react: { 17 | version: 'detect', 18 | }, 19 | }, 20 | }, 21 | prettierConfig, 22 | ); 23 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-resize-detector", 3 | "version": "12.0.2", 4 | "description": "React resize detector", 5 | "type": "module", 6 | "exports": "./build/index.js", 7 | "types": "./build/index.d.ts", 8 | "files": [ 9 | "build" 10 | ], 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/maslianok/react-resize-detector.git" 14 | }, 15 | "scripts": { 16 | "build": "rollup -c", 17 | "prettier": "prettier --write .", 18 | "lint": "eslint . --fix", 19 | "fix": "npm run prettier && npm run lint", 20 | "prerelease": "npm version prerelease --preid=rc", 21 | "prepublishOnly": "npm run build" 22 | }, 23 | "dependencies": { 24 | "lodash": "^4.17.21" 25 | }, 26 | "devDependencies": { 27 | "@rollup/plugin-commonjs": "^28.0.2", 28 | "@rollup/plugin-node-resolve": "^16.0.0", 29 | "@rollup/plugin-typescript": "^12.1.2", 30 | "@types/lodash": "^4.17.13", 31 | "@types/react": "^19.0.2", 32 | "@types/react-dom": "^19.0.2", 33 | "eslint": "^9.17.0", 34 | "eslint-config-prettier": "^9.1.0", 35 | "eslint-plugin-react": "^7.37.3", 36 | "prettier": "^3.4.2", 37 | "rollup": "^4.29.1", 38 | "rollup-plugin-node-externals": "^8.0.0", 39 | "tslib": "^2.8.1", 40 | "typescript": "^5.7.2", 41 | "typescript-eslint": "^8.19.0" 42 | }, 43 | "peerDependencies": { 44 | "react": "^18.0.0 || ^19.0.0" 45 | }, 46 | "author": "Vitalii Maslianok (https://github.com/maslianok)", 47 | "bugs": { 48 | "url": "https://github.com/maslianok/react-resize-detector/issues" 49 | }, 50 | "homepage": "https://github.com/maslianok/react-resize-detector", 51 | "keywords": [ 52 | "react", 53 | "resize", 54 | "detector", 55 | "resizeObserver", 56 | "observer" 57 | ], 58 | "license": "MIT", 59 | "sideEffects": false, 60 | "maintainers": [ 61 | { 62 | "name": "Vitalii Maslianok", 63 | "email": "maslianok@gmail.com" 64 | } 65 | ], 66 | "contributors": [ 67 | { 68 | "name": "James J. Womack (@james_womack)" 69 | }, 70 | { 71 | "name": "Roman Zhuravlov (@snelsi)" 72 | } 73 | ] 74 | } 75 | -------------------------------------------------------------------------------- /playground/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /playground/.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | public 3 | build 4 | -------------------------------------------------------------------------------- /playground/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 120, 3 | "singleQuote": true 4 | } 5 | -------------------------------------------------------------------------------- /playground/eslint.config.js: -------------------------------------------------------------------------------- 1 | import eslint from '@eslint/js'; 2 | import tseslint from 'typescript-eslint'; 3 | import reactPlugin from 'eslint-plugin-react'; 4 | import prettierConfig from 'eslint-config-prettier'; 5 | 6 | export default tseslint.config( 7 | eslint.configs.recommended, 8 | tseslint.configs.recommended, 9 | reactPlugin.configs.flat.recommended, 10 | reactPlugin.configs.flat['jsx-runtime'], 11 | { 12 | settings: { 13 | react: { 14 | version: 'detect', 15 | }, 16 | }, 17 | }, 18 | prettierConfig, 19 | ); 20 | -------------------------------------------------------------------------------- /playground/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | React-resize-detector demo 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /playground/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "playground", 3 | "version": "0.1.0", 4 | "type": "module", 5 | "scripts": { 6 | "dev": "linklocal && vite", 7 | "build": "tsc && vite build", 8 | "prettier": "prettier --write ./src", 9 | "lint": "eslint ./src --fix", 10 | "fix": "npm run prettier && npm run lint", 11 | "preview": "vite preview" 12 | }, 13 | "dependencies": { 14 | "@radix-ui/themes": "^3.1.6", 15 | "lucide-react": "^0.469.0", 16 | "react": "^19.0.0", 17 | "react-dom": "^19.0.0", 18 | "react-resize-detector": "file:.." 19 | }, 20 | "devDependencies": { 21 | "@types/node": "^22.10.2", 22 | "@types/react": "^19.0.2", 23 | "@types/react-dom": "^19.0.2", 24 | "@vitejs/plugin-react": "^4.3.4", 25 | "eslint": "^9.17.0", 26 | "eslint-config-prettier": "^9.1.0", 27 | "eslint-plugin-react": "^7.37.3", 28 | "linklocal": "^2.8.2", 29 | "prettier": "3.4.2", 30 | "typescript": "^5.7.2", 31 | "typescript-eslint": "^8.19.0", 32 | "vite": "^6.0.6" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /playground/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maslianok/react-resize-detector/62b05b67964a63b803163f827902390025467b52/playground/public/favicon.ico -------------------------------------------------------------------------------- /playground/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /playground/src/BackgroundImage.tsx: -------------------------------------------------------------------------------- 1 | export const BackgroundImage = ({ style, ...props }: React.ComponentPropsWithoutRef<'svg'>) => ( 2 | 11 | 12 | 16 | 20 | 24 | 25 | 29 | 30 | 34 | 35 | 36 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | ); 119 | -------------------------------------------------------------------------------- /playground/src/ResizeCard.tsx: -------------------------------------------------------------------------------- 1 | import { useState } from 'react'; 2 | 3 | import { Card, Code, Flex, Heading, Text, Spinner } from '@radix-ui/themes'; 4 | 5 | // 1) Import `useResizeDetector` hook from 'react-resize-detector' 6 | import { useResizeDetector } from 'react-resize-detector'; 7 | 8 | import { useDemoContext } from './context'; 9 | import { DimensionsTooltip, getDimensions, useDimensions } from './useDimensions'; 10 | 11 | export const ResizeCard = () => { 12 | const [dimensions, setDimensions] = useDimensions(); 13 | 14 | const [count, setCount] = useState(0); 15 | const { refreshMode, box, handleHeight, handleWidth, isLoading } = useDemoContext(); 16 | 17 | // 2) Call `useResizeDetector` to get dimensions of the element. 18 | // It will return `width` and `height` of the element in pixels. 19 | // You need to pass a `ref` to the element you want to observe. 20 | const { ref, width, height } = useResizeDetector({ 21 | // 3) You can customize `useResizeDetector` behavior by overriding default options. 22 | // For example, you can throttle the refresh rate of the resize event 23 | 24 | // Limit the refresh rate of the resize event. 25 | // Refs: https://lodash.com/docs#debounce 26 | refreshMode, 27 | refreshRate: 200, 28 | 29 | // If you only need to observe the width or height, you can disable the other dimension 30 | handleHeight, 31 | handleWidth, 32 | 33 | // You can pass additional options directly to the ResizeObserver 34 | // For example, you can change the box model used to calculate the dimensions 35 | // By default padding and border are not included in the dimensions 36 | observerOptions: { 37 | box, 38 | }, 39 | 40 | // You can attach a side effect to the resize event 41 | // For example, count the number of times the element has been resized 42 | onResize: ({ width, height, entry }) => { 43 | if (width && height) { 44 | setCount((count) => count + 1); 45 | setDimensions(getDimensions(entry)); 46 | } 47 | }, 48 | 49 | // For the full list of options, see the API section in the README: 50 | // https://github.com/maslianok/react-resize-detector/tree/master?tab=readme-ov-file#api 51 | }); 52 | 53 | // 4) `useResizeDetector` supports dynamic ref change. It's useful when you 54 | // need to use conditional rendering or when the ref is not available immediately. 55 | if (isLoading) { 56 | return ( 57 | 58 | 59 | 60 | ); 61 | } 62 | 63 | return ( 64 | 69 |
70 |
71 | 72 | Card resized {count} times 73 | 74 | 75 | Width:{' '} 76 | 77 | {width}px 78 | 79 | , Height:{' '} 80 | 81 | {height}px 82 | 83 | 84 |
85 | 86 | ); 87 | }; 88 | -------------------------------------------------------------------------------- /playground/src/Sidebar.tsx: -------------------------------------------------------------------------------- 1 | import { useCallback } from 'react'; 2 | 3 | import { 4 | Button, 5 | Code, 6 | Flex, 7 | Heading, 8 | Link, 9 | Tabs, 10 | Text, 11 | Theme, 12 | RadioCards, 13 | Switch, 14 | Spinner, 15 | ScrollArea, 16 | Badge, 17 | Table, 18 | Tooltip, 19 | Callout, 20 | } from '@radix-ui/themes'; 21 | import { Github, MessageCircleQuestion, Rocket, WandSparkles } from 'lucide-react'; 22 | 23 | import { Box, ResfreshModeType, useDemoContext } from './context'; 24 | import { Snippet } from './Snippet'; 25 | 26 | export const Sidebar = () => { 27 | const { 28 | box, 29 | setBox, 30 | refreshMode, 31 | setRefreshMode, 32 | handleHeight, 33 | setHandleHeight, 34 | handleWidth, 35 | setHandleWidth, 36 | isLoading, 37 | setIsLoading, 38 | } = useDemoContext(); 39 | 40 | const toggleLoading = useCallback(() => { 41 | setIsLoading(true); 42 | setTimeout(() => setIsLoading(false), 1000); 43 | }, []); 44 | 45 | return ( 46 | 47 | 324 | 325 | ); 326 | }; 327 | -------------------------------------------------------------------------------- /playground/src/Snippet.tsx: -------------------------------------------------------------------------------- 1 | import { Button, Code, Tooltip } from '@radix-ui/themes'; 2 | import { Copy, Check } from 'lucide-react'; 3 | import { useCopyToClipboard } from './useCopyToClipboard'; 4 | 5 | export interface SnippetProps { 6 | code: string; 7 | } 8 | 9 | export const Snippet = ({ code }: SnippetProps) => { 10 | const [copied, copy] = useCopyToClipboard(code); 11 | return ( 12 |
13 | {code} 14 | 15 | 16 | 19 | 20 |
21 | ); 22 | }; 23 | -------------------------------------------------------------------------------- /playground/src/context.tsx: -------------------------------------------------------------------------------- 1 | import { createContext, useContext, useMemo, useState } from 'react'; 2 | 3 | export type ResfreshModeType = 'throttle' | 'debounce' | undefined; 4 | 5 | export type Box = ResizeObserverBoxOptions | undefined; 6 | 7 | export interface DemoContext { 8 | box: Box; 9 | setBox: React.Dispatch>; 10 | 11 | refreshMode: ResfreshModeType; 12 | setRefreshMode: React.Dispatch>; 13 | 14 | isLoading: boolean; 15 | setIsLoading: React.Dispatch>; 16 | 17 | handleHeight: boolean; 18 | setHandleHeight: React.Dispatch>; 19 | 20 | handleWidth: boolean; 21 | setHandleWidth: React.Dispatch>; 22 | } 23 | 24 | const defaultContext = {} as DemoContext; 25 | 26 | export const DemoContext = createContext(defaultContext); 27 | 28 | export const useDemoContext = () => useContext(DemoContext); 29 | 30 | export const DemoProvider = ({ children }: { children: React.ReactNode }) => { 31 | const [box, setBox] = useState(undefined); 32 | const [refreshMode, setRefreshMode] = useState(undefined); 33 | const [isLoading, setIsLoading] = useState(false); 34 | const [handleHeight, setHandleHeight] = useState(true); 35 | const [handleWidth, setHandleWidth] = useState(true); 36 | 37 | const value = useMemo( 38 | () => ({ 39 | refreshMode, 40 | setRefreshMode, 41 | isLoading, 42 | setIsLoading, 43 | handleHeight, 44 | setHandleHeight, 45 | handleWidth, 46 | setHandleWidth, 47 | box, 48 | setBox, 49 | }), 50 | [refreshMode, isLoading, handleHeight, handleWidth, box], 51 | ); 52 | 53 | return {children}; 54 | }; 55 | -------------------------------------------------------------------------------- /playground/src/index.css: -------------------------------------------------------------------------------- 1 | *, 2 | *::before, 3 | *::after { 4 | box-sizing: border-box; 5 | margin: 0; 6 | padding: 0; 7 | } 8 | 9 | :root { 10 | --highlight-color: var(--pink-8); 11 | } 12 | 13 | nav { 14 | width: 420px; 15 | flex: 0 0 auto; 16 | 17 | @media (max-width: 768px) { 18 | width: 100%; 19 | } 20 | } 21 | 22 | main { 23 | display: flex; 24 | position: relative; 25 | overflow: hidden; 26 | flex: 1 1 auto; 27 | padding: 24px; 28 | } 29 | 30 | @keyframes fadeOut { 31 | from { 32 | opacity: 1; 33 | } 34 | to { 35 | opacity: 0; 36 | } 37 | } 38 | 39 | .rt-RadioCardsItem { 40 | text-align: center; 41 | } 42 | 43 | main .rt-BaseCard { 44 | --card-padding: var(--space-5); 45 | 46 | box-shadow: var(--shadow-4); 47 | 48 | min-width: 240px; 49 | min-height: 240px; 50 | max-width: 92%; 51 | max-height: 92%; 52 | width: 340px; 53 | height: 340px; 54 | resize: both; 55 | will-change: width, height; 56 | 57 | display: flex; 58 | align-items: center; 59 | justify-content: center; 60 | flex-direction: column; 61 | text-align: center; 62 | margin: auto; 63 | 64 | transition: 0.3s ease-out; 65 | transition-property: background, border, padding; 66 | 67 | & .highlight { 68 | position: absolute; 69 | inset: 20px; 70 | border-radius: 16px; 71 | border: 4px solid var(--highlight-color); 72 | pointer-events: none; 73 | 74 | animation: fadeOut 1s ease-out forwards; 75 | } 76 | 77 | & .inner { 78 | border-radius: calc(var(--card-border-radius)); 79 | width: 100%; 80 | height: 100%; 81 | flex: 1 1 auto; 82 | padding: var(--card-padding); 83 | 84 | display: flex; 85 | align-items: center; 86 | justify-content: center; 87 | flex-direction: column; 88 | 89 | transition: inherit; 90 | 91 | & i { 92 | color: var(--highlight-color); 93 | } 94 | 95 | & .rt-Code { 96 | text-decoration: underline dotted; 97 | cursor: help; 98 | } 99 | } 100 | 101 | &[data-debug-colors='true'] { 102 | --card-background-color: var(--green-4); 103 | box-shadow: var(--shadow-1); 104 | & .inner { 105 | background: var(--blue-4); 106 | box-shadow: var(--shadow-1); 107 | } 108 | } 109 | } 110 | 111 | body:has(#debug-hover:hover) main .rt-BaseCard, 112 | main .rt-BaseCard:has(code:hover), 113 | main .rt-BaseCard:has(code[data-state*='open']) { 114 | --card-background-color: var(--green-4); 115 | box-shadow: var(--shadow-1); 116 | & .inner { 117 | background: var(--blue-4); 118 | box-shadow: var(--shadow-1); 119 | } 120 | } 121 | 122 | .snippet { 123 | position: relative; 124 | display: flex; 125 | align-items: center; 126 | width: 100%; 127 | margin-top: 8px; 128 | 129 | & > code { 130 | min-height: 40px; 131 | display: flex; 132 | align-items: center; 133 | width: 100%; 134 | padding: 12px; 135 | } 136 | 137 | & > button { 138 | position: absolute; 139 | right: 4px; 140 | top: 50%; 141 | transform: translateY(-50%); 142 | 143 | box-sizing: border-box; 144 | padding: 4px; 145 | margin: 0; 146 | width: 32px; 147 | height: 32px; 148 | 149 | & svg { 150 | --size: 20px; 151 | width: var(--size); 152 | height: var(--size); 153 | } 154 | } 155 | } 156 | 157 | #debug-hover { 158 | cursor: help; 159 | border: 1px dashed var(--accent-a6); 160 | box-shadow: none; 161 | 162 | & p > em { 163 | text-decoration: underline dotted; 164 | } 165 | 166 | /* Hide if device doesn't support hover */ 167 | @media (hover: none) { 168 | display: none; 169 | } 170 | } 171 | -------------------------------------------------------------------------------- /playground/src/main.tsx: -------------------------------------------------------------------------------- 1 | import * as ReactDOMClient from 'react-dom/client'; 2 | import { Flex, Theme } from '@radix-ui/themes'; 3 | 4 | import { DemoProvider } from './context'; 5 | import { Sidebar } from './Sidebar'; 6 | import { ResizeCard } from './ResizeCard'; 7 | import { BackgroundImage } from './BackgroundImage'; 8 | 9 | import '@radix-ui/themes/styles.css'; 10 | import './index.css'; 11 | 12 | const root = ReactDOMClient.createRoot(document.getElementById('root')!); 13 | 14 | root.render( 15 | 16 | 17 | 30 | 31 |
32 | 33 | 34 | 35 | 36 |
37 |
38 |
39 |
, 40 | ); 41 | -------------------------------------------------------------------------------- /playground/src/useCopyToClipboard.ts: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react'; 2 | import { useCallback, useState } from 'react'; 3 | 4 | export const useCopyToClipboard = (text: string) => { 5 | const [copied, setCopied] = useState(false); 6 | 7 | const copy = useCallback(async () => { 8 | if (!navigator?.clipboard) { 9 | console.warn('Clipboard not supported'); 10 | return false; 11 | } 12 | 13 | // Try to save to clipboard then set copied state if successful 14 | try { 15 | await navigator.clipboard.writeText(text); 16 | setCopied(true); 17 | return true; 18 | } catch (error) { 19 | console.warn('Copy failed', error); 20 | setCopied(false); 21 | return false; 22 | } 23 | }, []); 24 | 25 | // Clear copied state after 3 seconds 26 | useEffect(() => { 27 | if (copied) { 28 | const timeout = setTimeout(() => setCopied(false), 3000); 29 | return () => clearTimeout(timeout); 30 | } 31 | }, [copied]); 32 | 33 | return [copied, copy] as const; 34 | }; 35 | -------------------------------------------------------------------------------- /playground/src/useDimensions.tsx: -------------------------------------------------------------------------------- 1 | import { useState } from 'react'; 2 | import { Code, DataList, Tooltip, Theme } from '@radix-ui/themes'; 3 | 4 | export interface TRBL { 5 | top: number; 6 | right: number; 7 | bottom: number; 8 | left: number; 9 | } 10 | 11 | export interface Dimensions { 12 | border: TRBL; 13 | padding: TRBL; 14 | inner: { 15 | width: number; 16 | height: number; 17 | }; 18 | } 19 | 20 | const defaultValue: TRBL = { 21 | top: 0, 22 | right: 0, 23 | bottom: 0, 24 | left: 0, 25 | }; 26 | 27 | // You can use the `ResizeObserverEntry` returned in the `onResize` callback to calculate border and padding dimensions of the element. 28 | export const getDimensions = (entry: ResizeObserverEntry): Dimensions => { 29 | const style = getComputedStyle(entry.target); 30 | 31 | // Get the border and padding dimensions of the element 32 | const border = { 33 | top: parseFloat(style.borderTopWidth), 34 | right: parseFloat(style.borderRightWidth), 35 | bottom: parseFloat(style.borderBottomWidth), 36 | left: parseFloat(style.borderLeftWidth), 37 | }; 38 | const padding = { 39 | top: parseFloat(style.paddingTop), 40 | right: parseFloat(style.paddingRight), 41 | bottom: parseFloat(style.paddingBottom), 42 | left: parseFloat(style.paddingLeft), 43 | }; 44 | 45 | // You can calculate the inner content dimensions by subtracting the border and padding from the content box size, 46 | // Or you can use the `contentBoxSize` property of the `ResizeObserverEntry` object directly. 47 | const inner = { 48 | width: entry.contentBoxSize[0].inlineSize, 49 | height: entry.contentBoxSize[0].blockSize, 50 | }; 51 | 52 | return { 53 | border, 54 | padding, 55 | inner, 56 | }; 57 | }; 58 | 59 | export const useDimensions = () => 60 | useState({ 61 | border: defaultValue, 62 | padding: defaultValue, 63 | inner: { 64 | width: 0, 65 | height: 0, 66 | }, 67 | }); 68 | 69 | export const DimensionsTooltip = ({ 70 | dimensions, 71 | children, 72 | orientation, 73 | }: { 74 | dimensions: Dimensions; 75 | children: React.ReactNode; 76 | orientation: 'horizontal' | 'vertical'; 77 | }) => { 78 | if (orientation === 'horizontal') { 79 | return ( 80 | 83 | 84 | 85 | Border left: 86 | 87 | {dimensions.border.left}px 88 | 89 | 90 | 91 | Padding left: 92 | 93 | {dimensions.padding.left}px 94 | 95 | 96 | 97 | Inner width: 98 | 99 | {dimensions.inner.width}px 100 | 101 | 102 | 103 | Padding right: 104 | 105 | {dimensions.padding.right}px 106 | 107 | 108 | 109 | Border right: 110 | 111 | {dimensions.border.right}px 112 | 113 | 114 | 115 | 116 | } 117 | > 118 | {children} 119 | 120 | ); 121 | } 122 | 123 | return ( 124 | 127 | 128 | 129 | Border top: 130 | 131 | {dimensions.border.top}px 132 | 133 | 134 | 135 | Padding top: 136 | 137 | {dimensions.padding.top}px 138 | 139 | 140 | 141 | Inner height: 142 | 143 | {dimensions.inner.height}px 144 | 145 | 146 | 147 | Padding bottom: 148 | 149 | {dimensions.padding.bottom}px 150 | 151 | 152 | 153 | Border bottom: 154 | 155 | {dimensions.border.bottom}px 156 | 157 | 158 | 159 | 160 | } 161 | > 162 | {children} 163 | 164 | ); 165 | }; 166 | -------------------------------------------------------------------------------- /playground/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "module": "ESNext", 6 | "skipLibCheck": true, 7 | "moduleResolution": "bundler", 8 | "allowImportingTsExtensions": true, 9 | "resolveJsonModule": true, 10 | "isolatedModules": true, 11 | "noEmit": true, 12 | "jsx": "react-jsx", 13 | "paths": { 14 | "@/*": ["./src/*"] 15 | } 16 | }, 17 | "include": ["src"], 18 | "references": [{ "path": "./tsconfig.node.json" }] 19 | } 20 | -------------------------------------------------------------------------------- /playground/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true 8 | }, 9 | "include": ["vite.config.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /playground/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | import react from '@vitejs/plugin-react'; 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()], 7 | server: { 8 | port: 3000, 9 | }, 10 | build: { 11 | outDir: 'build', 12 | }, 13 | resolve: { 14 | alias: { 15 | '@': '/src', 16 | }, 17 | }, 18 | }); 19 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | lodash: 12 | specifier: ^4.17.21 13 | version: 4.17.21 14 | react: 15 | specifier: ^18.0.0 || ^19.0.0 16 | version: 19.0.0 17 | devDependencies: 18 | '@rollup/plugin-commonjs': 19 | specifier: ^28.0.2 20 | version: 28.0.2(rollup@4.29.1) 21 | '@rollup/plugin-node-resolve': 22 | specifier: ^16.0.0 23 | version: 16.0.0(rollup@4.29.1) 24 | '@rollup/plugin-typescript': 25 | specifier: ^12.1.2 26 | version: 12.1.2(rollup@4.29.1)(tslib@2.8.1)(typescript@5.7.2) 27 | '@types/lodash': 28 | specifier: ^4.17.13 29 | version: 4.17.13 30 | '@types/react': 31 | specifier: ^19.0.2 32 | version: 19.0.2 33 | '@types/react-dom': 34 | specifier: ^19.0.2 35 | version: 19.0.2(@types/react@19.0.2) 36 | eslint: 37 | specifier: ^9.17.0 38 | version: 9.17.0 39 | eslint-config-prettier: 40 | specifier: ^9.1.0 41 | version: 9.1.0(eslint@9.17.0) 42 | eslint-plugin-react: 43 | specifier: ^7.37.3 44 | version: 7.37.3(eslint@9.17.0) 45 | prettier: 46 | specifier: ^3.4.2 47 | version: 3.4.2 48 | rollup: 49 | specifier: ^4.29.1 50 | version: 4.29.1 51 | rollup-plugin-node-externals: 52 | specifier: ^8.0.0 53 | version: 8.0.0(rollup@4.29.1) 54 | tslib: 55 | specifier: ^2.8.1 56 | version: 2.8.1 57 | typescript: 58 | specifier: ^5.7.2 59 | version: 5.7.2 60 | typescript-eslint: 61 | specifier: ^8.19.0 62 | version: 8.19.0(eslint@9.17.0)(typescript@5.7.2) 63 | 64 | packages: 65 | 66 | '@eslint-community/eslint-utils@4.4.1': 67 | resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} 68 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 69 | peerDependencies: 70 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 71 | 72 | '@eslint-community/regexpp@4.12.1': 73 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 74 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 75 | 76 | '@eslint/config-array@0.19.1': 77 | resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} 78 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 79 | 80 | '@eslint/core@0.9.1': 81 | resolution: {integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==} 82 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 83 | 84 | '@eslint/eslintrc@3.2.0': 85 | resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} 86 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 87 | 88 | '@eslint/js@9.17.0': 89 | resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} 90 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 91 | 92 | '@eslint/object-schema@2.1.5': 93 | resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} 94 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 95 | 96 | '@eslint/plugin-kit@0.2.4': 97 | resolution: {integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==} 98 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 99 | 100 | '@humanfs/core@0.19.1': 101 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 102 | engines: {node: '>=18.18.0'} 103 | 104 | '@humanfs/node@0.16.6': 105 | resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} 106 | engines: {node: '>=18.18.0'} 107 | 108 | '@humanwhocodes/module-importer@1.0.1': 109 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 110 | engines: {node: '>=12.22'} 111 | 112 | '@humanwhocodes/retry@0.3.1': 113 | resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} 114 | engines: {node: '>=18.18'} 115 | 116 | '@humanwhocodes/retry@0.4.1': 117 | resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} 118 | engines: {node: '>=18.18'} 119 | 120 | '@jridgewell/sourcemap-codec@1.5.0': 121 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 122 | 123 | '@nodelib/fs.scandir@2.1.5': 124 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 125 | engines: {node: '>= 8'} 126 | 127 | '@nodelib/fs.stat@2.0.5': 128 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 129 | engines: {node: '>= 8'} 130 | 131 | '@nodelib/fs.walk@1.2.8': 132 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 133 | engines: {node: '>= 8'} 134 | 135 | '@rollup/plugin-commonjs@28.0.2': 136 | resolution: {integrity: sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw==} 137 | engines: {node: '>=16.0.0 || 14 >= 14.17'} 138 | peerDependencies: 139 | rollup: ^2.68.0||^3.0.0||^4.0.0 140 | peerDependenciesMeta: 141 | rollup: 142 | optional: true 143 | 144 | '@rollup/plugin-node-resolve@16.0.0': 145 | resolution: {integrity: sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg==} 146 | engines: {node: '>=14.0.0'} 147 | peerDependencies: 148 | rollup: ^2.78.0||^3.0.0||^4.0.0 149 | peerDependenciesMeta: 150 | rollup: 151 | optional: true 152 | 153 | '@rollup/plugin-typescript@12.1.2': 154 | resolution: {integrity: sha512-cdtSp154H5sv637uMr1a8OTWB0L1SWDSm1rDGiyfcGcvQ6cuTs4MDk2BVEBGysUWago4OJN4EQZqOTl/QY3Jgg==} 155 | engines: {node: '>=14.0.0'} 156 | peerDependencies: 157 | rollup: ^2.14.0||^3.0.0||^4.0.0 158 | tslib: '*' 159 | typescript: '>=3.7.0' 160 | peerDependenciesMeta: 161 | rollup: 162 | optional: true 163 | tslib: 164 | optional: true 165 | 166 | '@rollup/pluginutils@5.1.4': 167 | resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} 168 | engines: {node: '>=14.0.0'} 169 | peerDependencies: 170 | rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 171 | peerDependenciesMeta: 172 | rollup: 173 | optional: true 174 | 175 | '@rollup/rollup-android-arm-eabi@4.29.1': 176 | resolution: {integrity: sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==} 177 | cpu: [arm] 178 | os: [android] 179 | 180 | '@rollup/rollup-android-arm64@4.29.1': 181 | resolution: {integrity: sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==} 182 | cpu: [arm64] 183 | os: [android] 184 | 185 | '@rollup/rollup-darwin-arm64@4.29.1': 186 | resolution: {integrity: sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==} 187 | cpu: [arm64] 188 | os: [darwin] 189 | 190 | '@rollup/rollup-darwin-x64@4.29.1': 191 | resolution: {integrity: sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==} 192 | cpu: [x64] 193 | os: [darwin] 194 | 195 | '@rollup/rollup-freebsd-arm64@4.29.1': 196 | resolution: {integrity: sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==} 197 | cpu: [arm64] 198 | os: [freebsd] 199 | 200 | '@rollup/rollup-freebsd-x64@4.29.1': 201 | resolution: {integrity: sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==} 202 | cpu: [x64] 203 | os: [freebsd] 204 | 205 | '@rollup/rollup-linux-arm-gnueabihf@4.29.1': 206 | resolution: {integrity: sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==} 207 | cpu: [arm] 208 | os: [linux] 209 | 210 | '@rollup/rollup-linux-arm-musleabihf@4.29.1': 211 | resolution: {integrity: sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==} 212 | cpu: [arm] 213 | os: [linux] 214 | 215 | '@rollup/rollup-linux-arm64-gnu@4.29.1': 216 | resolution: {integrity: sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==} 217 | cpu: [arm64] 218 | os: [linux] 219 | 220 | '@rollup/rollup-linux-arm64-musl@4.29.1': 221 | resolution: {integrity: sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==} 222 | cpu: [arm64] 223 | os: [linux] 224 | 225 | '@rollup/rollup-linux-loongarch64-gnu@4.29.1': 226 | resolution: {integrity: sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==} 227 | cpu: [loong64] 228 | os: [linux] 229 | 230 | '@rollup/rollup-linux-powerpc64le-gnu@4.29.1': 231 | resolution: {integrity: sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==} 232 | cpu: [ppc64] 233 | os: [linux] 234 | 235 | '@rollup/rollup-linux-riscv64-gnu@4.29.1': 236 | resolution: {integrity: sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==} 237 | cpu: [riscv64] 238 | os: [linux] 239 | 240 | '@rollup/rollup-linux-s390x-gnu@4.29.1': 241 | resolution: {integrity: sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==} 242 | cpu: [s390x] 243 | os: [linux] 244 | 245 | '@rollup/rollup-linux-x64-gnu@4.29.1': 246 | resolution: {integrity: sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==} 247 | cpu: [x64] 248 | os: [linux] 249 | 250 | '@rollup/rollup-linux-x64-musl@4.29.1': 251 | resolution: {integrity: sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==} 252 | cpu: [x64] 253 | os: [linux] 254 | 255 | '@rollup/rollup-win32-arm64-msvc@4.29.1': 256 | resolution: {integrity: sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==} 257 | cpu: [arm64] 258 | os: [win32] 259 | 260 | '@rollup/rollup-win32-ia32-msvc@4.29.1': 261 | resolution: {integrity: sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==} 262 | cpu: [ia32] 263 | os: [win32] 264 | 265 | '@rollup/rollup-win32-x64-msvc@4.29.1': 266 | resolution: {integrity: sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==} 267 | cpu: [x64] 268 | os: [win32] 269 | 270 | '@types/estree@1.0.6': 271 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 272 | 273 | '@types/json-schema@7.0.15': 274 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 275 | 276 | '@types/lodash@4.17.13': 277 | resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==} 278 | 279 | '@types/react-dom@19.0.2': 280 | resolution: {integrity: sha512-c1s+7TKFaDRRxr1TxccIX2u7sfCnc3RxkVyBIUA2lCpyqCF+QoAwQ/CBg7bsMdVwP120HEH143VQezKtef5nCg==} 281 | peerDependencies: 282 | '@types/react': ^19.0.0 283 | 284 | '@types/react@19.0.2': 285 | resolution: {integrity: sha512-USU8ZI/xyKJwFTpjSVIrSeHBVAGagkHQKPNbxeWwql/vDmnTIBgx+TJnhFnj1NXgz8XfprU0egV2dROLGpsBEg==} 286 | 287 | '@types/resolve@1.20.2': 288 | resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} 289 | 290 | '@typescript-eslint/eslint-plugin@8.19.0': 291 | resolution: {integrity: sha512-NggSaEZCdSrFddbctrVjkVZvFC6KGfKfNK0CU7mNK/iKHGKbzT4Wmgm08dKpcZECBu9f5FypndoMyRHkdqfT1Q==} 292 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 293 | peerDependencies: 294 | '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 295 | eslint: ^8.57.0 || ^9.0.0 296 | typescript: '>=4.8.4 <5.8.0' 297 | 298 | '@typescript-eslint/parser@8.19.0': 299 | resolution: {integrity: sha512-6M8taKyOETY1TKHp0x8ndycipTVgmp4xtg5QpEZzXxDhNvvHOJi5rLRkLr8SK3jTgD5l4fTlvBiRdfsuWydxBw==} 300 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 301 | peerDependencies: 302 | eslint: ^8.57.0 || ^9.0.0 303 | typescript: '>=4.8.4 <5.8.0' 304 | 305 | '@typescript-eslint/scope-manager@8.19.0': 306 | resolution: {integrity: sha512-hkoJiKQS3GQ13TSMEiuNmSCvhz7ujyqD1x3ShbaETATHrck+9RaDdUbt+osXaUuns9OFwrDTTrjtwsU8gJyyRA==} 307 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 308 | 309 | '@typescript-eslint/type-utils@8.19.0': 310 | resolution: {integrity: sha512-TZs0I0OSbd5Aza4qAMpp1cdCYVnER94IziudE3JU328YUHgWu9gwiwhag+fuLeJ2LkWLXI+F/182TbG+JaBdTg==} 311 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 312 | peerDependencies: 313 | eslint: ^8.57.0 || ^9.0.0 314 | typescript: '>=4.8.4 <5.8.0' 315 | 316 | '@typescript-eslint/types@8.19.0': 317 | resolution: {integrity: sha512-8XQ4Ss7G9WX8oaYvD4OOLCjIQYgRQxO+qCiR2V2s2GxI9AUpo7riNwo6jDhKtTcaJjT8PY54j2Yb33kWtSJsmA==} 318 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 319 | 320 | '@typescript-eslint/typescript-estree@8.19.0': 321 | resolution: {integrity: sha512-WW9PpDaLIFW9LCbucMSdYUuGeFUz1OkWYS/5fwZwTA+l2RwlWFdJvReQqMUMBw4yJWJOfqd7An9uwut2Oj8sLw==} 322 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 323 | peerDependencies: 324 | typescript: '>=4.8.4 <5.8.0' 325 | 326 | '@typescript-eslint/utils@8.19.0': 327 | resolution: {integrity: sha512-PTBG+0oEMPH9jCZlfg07LCB2nYI0I317yyvXGfxnvGvw4SHIOuRnQ3kadyyXY6tGdChusIHIbM5zfIbp4M6tCg==} 328 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 329 | peerDependencies: 330 | eslint: ^8.57.0 || ^9.0.0 331 | typescript: '>=4.8.4 <5.8.0' 332 | 333 | '@typescript-eslint/visitor-keys@8.19.0': 334 | resolution: {integrity: sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w==} 335 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 336 | 337 | acorn-jsx@5.3.2: 338 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 339 | peerDependencies: 340 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 341 | 342 | acorn@8.14.0: 343 | resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} 344 | engines: {node: '>=0.4.0'} 345 | hasBin: true 346 | 347 | ajv@6.12.6: 348 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 349 | 350 | ansi-styles@4.3.0: 351 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 352 | engines: {node: '>=8'} 353 | 354 | argparse@2.0.1: 355 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 356 | 357 | array-buffer-byte-length@1.0.2: 358 | resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} 359 | engines: {node: '>= 0.4'} 360 | 361 | array-includes@3.1.8: 362 | resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} 363 | engines: {node: '>= 0.4'} 364 | 365 | array.prototype.findlast@1.2.5: 366 | resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} 367 | engines: {node: '>= 0.4'} 368 | 369 | array.prototype.flat@1.3.3: 370 | resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} 371 | engines: {node: '>= 0.4'} 372 | 373 | array.prototype.flatmap@1.3.3: 374 | resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} 375 | engines: {node: '>= 0.4'} 376 | 377 | array.prototype.tosorted@1.1.4: 378 | resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} 379 | engines: {node: '>= 0.4'} 380 | 381 | arraybuffer.prototype.slice@1.0.4: 382 | resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} 383 | engines: {node: '>= 0.4'} 384 | 385 | available-typed-arrays@1.0.7: 386 | resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} 387 | engines: {node: '>= 0.4'} 388 | 389 | balanced-match@1.0.2: 390 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 391 | 392 | brace-expansion@1.1.11: 393 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 394 | 395 | brace-expansion@2.0.1: 396 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 397 | 398 | braces@3.0.3: 399 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 400 | engines: {node: '>=8'} 401 | 402 | call-bind-apply-helpers@1.0.1: 403 | resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} 404 | engines: {node: '>= 0.4'} 405 | 406 | call-bind@1.0.8: 407 | resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} 408 | engines: {node: '>= 0.4'} 409 | 410 | call-bound@1.0.3: 411 | resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} 412 | engines: {node: '>= 0.4'} 413 | 414 | callsites@3.1.0: 415 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 416 | engines: {node: '>=6'} 417 | 418 | chalk@4.1.2: 419 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 420 | engines: {node: '>=10'} 421 | 422 | color-convert@2.0.1: 423 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 424 | engines: {node: '>=7.0.0'} 425 | 426 | color-name@1.1.4: 427 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 428 | 429 | commondir@1.0.1: 430 | resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} 431 | 432 | concat-map@0.0.1: 433 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 434 | 435 | cross-spawn@7.0.6: 436 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 437 | engines: {node: '>= 8'} 438 | 439 | csstype@3.1.3: 440 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 441 | 442 | data-view-buffer@1.0.2: 443 | resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} 444 | engines: {node: '>= 0.4'} 445 | 446 | data-view-byte-length@1.0.2: 447 | resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} 448 | engines: {node: '>= 0.4'} 449 | 450 | data-view-byte-offset@1.0.1: 451 | resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} 452 | engines: {node: '>= 0.4'} 453 | 454 | debug@4.4.0: 455 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 456 | engines: {node: '>=6.0'} 457 | peerDependencies: 458 | supports-color: '*' 459 | peerDependenciesMeta: 460 | supports-color: 461 | optional: true 462 | 463 | deep-is@0.1.4: 464 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 465 | 466 | deepmerge@4.3.1: 467 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 468 | engines: {node: '>=0.10.0'} 469 | 470 | define-data-property@1.1.4: 471 | resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} 472 | engines: {node: '>= 0.4'} 473 | 474 | define-properties@1.2.1: 475 | resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} 476 | engines: {node: '>= 0.4'} 477 | 478 | doctrine@2.1.0: 479 | resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} 480 | engines: {node: '>=0.10.0'} 481 | 482 | dunder-proto@1.0.1: 483 | resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 484 | engines: {node: '>= 0.4'} 485 | 486 | es-abstract@1.23.8: 487 | resolution: {integrity: sha512-lfab8IzDn6EpI1ibZakcgS6WsfEBiB+43cuJo+wgylx1xKXf+Sp+YR3vFuQwC/u3sxYwV8Cxe3B0DpVUu/WiJQ==} 488 | engines: {node: '>= 0.4'} 489 | 490 | es-define-property@1.0.1: 491 | resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} 492 | engines: {node: '>= 0.4'} 493 | 494 | es-errors@1.3.0: 495 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 496 | engines: {node: '>= 0.4'} 497 | 498 | es-iterator-helpers@1.2.1: 499 | resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} 500 | engines: {node: '>= 0.4'} 501 | 502 | es-object-atoms@1.0.0: 503 | resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} 504 | engines: {node: '>= 0.4'} 505 | 506 | es-set-tostringtag@2.0.3: 507 | resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} 508 | engines: {node: '>= 0.4'} 509 | 510 | es-shim-unscopables@1.0.2: 511 | resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} 512 | 513 | es-to-primitive@1.3.0: 514 | resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} 515 | engines: {node: '>= 0.4'} 516 | 517 | escape-string-regexp@4.0.0: 518 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 519 | engines: {node: '>=10'} 520 | 521 | eslint-config-prettier@9.1.0: 522 | resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} 523 | hasBin: true 524 | peerDependencies: 525 | eslint: '>=7.0.0' 526 | 527 | eslint-plugin-react@7.37.3: 528 | resolution: {integrity: sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA==} 529 | engines: {node: '>=4'} 530 | peerDependencies: 531 | eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 532 | 533 | eslint-scope@8.2.0: 534 | resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} 535 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 536 | 537 | eslint-visitor-keys@3.4.3: 538 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 539 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 540 | 541 | eslint-visitor-keys@4.2.0: 542 | resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} 543 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 544 | 545 | eslint@9.17.0: 546 | resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==} 547 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 548 | hasBin: true 549 | peerDependencies: 550 | jiti: '*' 551 | peerDependenciesMeta: 552 | jiti: 553 | optional: true 554 | 555 | espree@10.3.0: 556 | resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} 557 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 558 | 559 | esquery@1.6.0: 560 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 561 | engines: {node: '>=0.10'} 562 | 563 | esrecurse@4.3.0: 564 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 565 | engines: {node: '>=4.0'} 566 | 567 | estraverse@5.3.0: 568 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 569 | engines: {node: '>=4.0'} 570 | 571 | estree-walker@2.0.2: 572 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 573 | 574 | esutils@2.0.3: 575 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 576 | engines: {node: '>=0.10.0'} 577 | 578 | fast-deep-equal@3.1.3: 579 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 580 | 581 | fast-glob@3.3.2: 582 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 583 | engines: {node: '>=8.6.0'} 584 | 585 | fast-json-stable-stringify@2.1.0: 586 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 587 | 588 | fast-levenshtein@2.0.6: 589 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 590 | 591 | fastq@1.18.0: 592 | resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} 593 | 594 | fdir@6.4.2: 595 | resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} 596 | peerDependencies: 597 | picomatch: ^3 || ^4 598 | peerDependenciesMeta: 599 | picomatch: 600 | optional: true 601 | 602 | file-entry-cache@8.0.0: 603 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 604 | engines: {node: '>=16.0.0'} 605 | 606 | fill-range@7.1.1: 607 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 608 | engines: {node: '>=8'} 609 | 610 | find-up@5.0.0: 611 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 612 | engines: {node: '>=10'} 613 | 614 | flat-cache@4.0.1: 615 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 616 | engines: {node: '>=16'} 617 | 618 | flatted@3.3.2: 619 | resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} 620 | 621 | for-each@0.3.3: 622 | resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} 623 | 624 | fsevents@2.3.3: 625 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 626 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 627 | os: [darwin] 628 | 629 | function-bind@1.1.2: 630 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 631 | 632 | function.prototype.name@1.1.8: 633 | resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} 634 | engines: {node: '>= 0.4'} 635 | 636 | functions-have-names@1.2.3: 637 | resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 638 | 639 | get-intrinsic@1.2.6: 640 | resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} 641 | engines: {node: '>= 0.4'} 642 | 643 | get-symbol-description@1.1.0: 644 | resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} 645 | engines: {node: '>= 0.4'} 646 | 647 | glob-parent@5.1.2: 648 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 649 | engines: {node: '>= 6'} 650 | 651 | glob-parent@6.0.2: 652 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 653 | engines: {node: '>=10.13.0'} 654 | 655 | globals@14.0.0: 656 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 657 | engines: {node: '>=18'} 658 | 659 | globalthis@1.0.4: 660 | resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} 661 | engines: {node: '>= 0.4'} 662 | 663 | gopd@1.2.0: 664 | resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} 665 | engines: {node: '>= 0.4'} 666 | 667 | graphemer@1.4.0: 668 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 669 | 670 | has-bigints@1.1.0: 671 | resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} 672 | engines: {node: '>= 0.4'} 673 | 674 | has-flag@4.0.0: 675 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 676 | engines: {node: '>=8'} 677 | 678 | has-property-descriptors@1.0.2: 679 | resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} 680 | 681 | has-proto@1.2.0: 682 | resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} 683 | engines: {node: '>= 0.4'} 684 | 685 | has-symbols@1.1.0: 686 | resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} 687 | engines: {node: '>= 0.4'} 688 | 689 | has-tostringtag@1.0.2: 690 | resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} 691 | engines: {node: '>= 0.4'} 692 | 693 | hasown@2.0.2: 694 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 695 | engines: {node: '>= 0.4'} 696 | 697 | ignore@5.3.2: 698 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 699 | engines: {node: '>= 4'} 700 | 701 | import-fresh@3.3.0: 702 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 703 | engines: {node: '>=6'} 704 | 705 | imurmurhash@0.1.4: 706 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 707 | engines: {node: '>=0.8.19'} 708 | 709 | internal-slot@1.1.0: 710 | resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} 711 | engines: {node: '>= 0.4'} 712 | 713 | is-array-buffer@3.0.5: 714 | resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} 715 | engines: {node: '>= 0.4'} 716 | 717 | is-async-function@2.0.0: 718 | resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} 719 | engines: {node: '>= 0.4'} 720 | 721 | is-bigint@1.1.0: 722 | resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} 723 | engines: {node: '>= 0.4'} 724 | 725 | is-boolean-object@1.2.1: 726 | resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} 727 | engines: {node: '>= 0.4'} 728 | 729 | is-callable@1.2.7: 730 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 731 | engines: {node: '>= 0.4'} 732 | 733 | is-core-module@2.16.1: 734 | resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 735 | engines: {node: '>= 0.4'} 736 | 737 | is-data-view@1.0.2: 738 | resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} 739 | engines: {node: '>= 0.4'} 740 | 741 | is-date-object@1.1.0: 742 | resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} 743 | engines: {node: '>= 0.4'} 744 | 745 | is-extglob@2.1.1: 746 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 747 | engines: {node: '>=0.10.0'} 748 | 749 | is-finalizationregistry@1.1.1: 750 | resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} 751 | engines: {node: '>= 0.4'} 752 | 753 | is-generator-function@1.0.10: 754 | resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} 755 | engines: {node: '>= 0.4'} 756 | 757 | is-glob@4.0.3: 758 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 759 | engines: {node: '>=0.10.0'} 760 | 761 | is-map@2.0.3: 762 | resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} 763 | engines: {node: '>= 0.4'} 764 | 765 | is-module@1.0.0: 766 | resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} 767 | 768 | is-number-object@1.1.1: 769 | resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} 770 | engines: {node: '>= 0.4'} 771 | 772 | is-number@7.0.0: 773 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 774 | engines: {node: '>=0.12.0'} 775 | 776 | is-reference@1.2.1: 777 | resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} 778 | 779 | is-regex@1.2.1: 780 | resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} 781 | engines: {node: '>= 0.4'} 782 | 783 | is-set@2.0.3: 784 | resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} 785 | engines: {node: '>= 0.4'} 786 | 787 | is-shared-array-buffer@1.0.4: 788 | resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} 789 | engines: {node: '>= 0.4'} 790 | 791 | is-string@1.1.1: 792 | resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} 793 | engines: {node: '>= 0.4'} 794 | 795 | is-symbol@1.1.1: 796 | resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} 797 | engines: {node: '>= 0.4'} 798 | 799 | is-typed-array@1.1.15: 800 | resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} 801 | engines: {node: '>= 0.4'} 802 | 803 | is-weakmap@2.0.2: 804 | resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} 805 | engines: {node: '>= 0.4'} 806 | 807 | is-weakref@1.1.0: 808 | resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} 809 | engines: {node: '>= 0.4'} 810 | 811 | is-weakset@2.0.4: 812 | resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} 813 | engines: {node: '>= 0.4'} 814 | 815 | isarray@2.0.5: 816 | resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} 817 | 818 | isexe@2.0.0: 819 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 820 | 821 | iterator.prototype@1.1.4: 822 | resolution: {integrity: sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA==} 823 | engines: {node: '>= 0.4'} 824 | 825 | js-tokens@4.0.0: 826 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 827 | 828 | js-yaml@4.1.0: 829 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 830 | hasBin: true 831 | 832 | json-buffer@3.0.1: 833 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 834 | 835 | json-schema-traverse@0.4.1: 836 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 837 | 838 | json-stable-stringify-without-jsonify@1.0.1: 839 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 840 | 841 | jsx-ast-utils@3.3.5: 842 | resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} 843 | engines: {node: '>=4.0'} 844 | 845 | keyv@4.5.4: 846 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 847 | 848 | levn@0.4.1: 849 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 850 | engines: {node: '>= 0.8.0'} 851 | 852 | locate-path@6.0.0: 853 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 854 | engines: {node: '>=10'} 855 | 856 | lodash.merge@4.6.2: 857 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 858 | 859 | lodash@4.17.21: 860 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 861 | 862 | loose-envify@1.4.0: 863 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 864 | hasBin: true 865 | 866 | magic-string@0.30.17: 867 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 868 | 869 | math-intrinsics@1.1.0: 870 | resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} 871 | engines: {node: '>= 0.4'} 872 | 873 | merge2@1.4.1: 874 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 875 | engines: {node: '>= 8'} 876 | 877 | micromatch@4.0.8: 878 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 879 | engines: {node: '>=8.6'} 880 | 881 | minimatch@3.1.2: 882 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 883 | 884 | minimatch@9.0.5: 885 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 886 | engines: {node: '>=16 || 14 >=14.17'} 887 | 888 | ms@2.1.3: 889 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 890 | 891 | natural-compare@1.4.0: 892 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 893 | 894 | object-assign@4.1.1: 895 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 896 | engines: {node: '>=0.10.0'} 897 | 898 | object-inspect@1.13.3: 899 | resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} 900 | engines: {node: '>= 0.4'} 901 | 902 | object-keys@1.1.1: 903 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 904 | engines: {node: '>= 0.4'} 905 | 906 | object.assign@4.1.7: 907 | resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} 908 | engines: {node: '>= 0.4'} 909 | 910 | object.entries@1.1.8: 911 | resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} 912 | engines: {node: '>= 0.4'} 913 | 914 | object.fromentries@2.0.8: 915 | resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} 916 | engines: {node: '>= 0.4'} 917 | 918 | object.values@1.2.1: 919 | resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} 920 | engines: {node: '>= 0.4'} 921 | 922 | optionator@0.9.4: 923 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 924 | engines: {node: '>= 0.8.0'} 925 | 926 | own-keys@1.0.1: 927 | resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} 928 | engines: {node: '>= 0.4'} 929 | 930 | p-limit@3.1.0: 931 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 932 | engines: {node: '>=10'} 933 | 934 | p-locate@5.0.0: 935 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 936 | engines: {node: '>=10'} 937 | 938 | parent-module@1.0.1: 939 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 940 | engines: {node: '>=6'} 941 | 942 | path-exists@4.0.0: 943 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 944 | engines: {node: '>=8'} 945 | 946 | path-key@3.1.1: 947 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 948 | engines: {node: '>=8'} 949 | 950 | path-parse@1.0.7: 951 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 952 | 953 | picomatch@2.3.1: 954 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 955 | engines: {node: '>=8.6'} 956 | 957 | picomatch@4.0.2: 958 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 959 | engines: {node: '>=12'} 960 | 961 | possible-typed-array-names@1.0.0: 962 | resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} 963 | engines: {node: '>= 0.4'} 964 | 965 | prelude-ls@1.2.1: 966 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 967 | engines: {node: '>= 0.8.0'} 968 | 969 | prettier@3.4.2: 970 | resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} 971 | engines: {node: '>=14'} 972 | hasBin: true 973 | 974 | prop-types@15.8.1: 975 | resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} 976 | 977 | punycode@2.3.1: 978 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 979 | engines: {node: '>=6'} 980 | 981 | queue-microtask@1.2.3: 982 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 983 | 984 | react-is@16.13.1: 985 | resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} 986 | 987 | react@19.0.0: 988 | resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} 989 | engines: {node: '>=0.10.0'} 990 | 991 | reflect.getprototypeof@1.0.9: 992 | resolution: {integrity: sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==} 993 | engines: {node: '>= 0.4'} 994 | 995 | regexp.prototype.flags@1.5.3: 996 | resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} 997 | engines: {node: '>= 0.4'} 998 | 999 | resolve-from@4.0.0: 1000 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1001 | engines: {node: '>=4'} 1002 | 1003 | resolve@1.22.10: 1004 | resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} 1005 | engines: {node: '>= 0.4'} 1006 | hasBin: true 1007 | 1008 | resolve@2.0.0-next.5: 1009 | resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} 1010 | hasBin: true 1011 | 1012 | reusify@1.0.4: 1013 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1014 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1015 | 1016 | rollup-plugin-node-externals@8.0.0: 1017 | resolution: {integrity: sha512-2HIOpWsWn5DqBoYl6iCAmB4kd5GoGbF68PR4xKR1YBPvywiqjtYvDEjHFodyqRL51iAMDITP074Zxs0OKs6F+g==} 1018 | engines: {node: '>= 21 || ^20.6.0 || ^18.19.0'} 1019 | peerDependencies: 1020 | rollup: ^4.0.0 1021 | 1022 | rollup@4.29.1: 1023 | resolution: {integrity: sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==} 1024 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1025 | hasBin: true 1026 | 1027 | run-parallel@1.2.0: 1028 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1029 | 1030 | safe-array-concat@1.1.3: 1031 | resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} 1032 | engines: {node: '>=0.4'} 1033 | 1034 | safe-push-apply@1.0.0: 1035 | resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} 1036 | engines: {node: '>= 0.4'} 1037 | 1038 | safe-regex-test@1.1.0: 1039 | resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} 1040 | engines: {node: '>= 0.4'} 1041 | 1042 | semver@6.3.1: 1043 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1044 | hasBin: true 1045 | 1046 | semver@7.6.3: 1047 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 1048 | engines: {node: '>=10'} 1049 | hasBin: true 1050 | 1051 | set-function-length@1.2.2: 1052 | resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} 1053 | engines: {node: '>= 0.4'} 1054 | 1055 | set-function-name@2.0.2: 1056 | resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} 1057 | engines: {node: '>= 0.4'} 1058 | 1059 | shebang-command@2.0.0: 1060 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1061 | engines: {node: '>=8'} 1062 | 1063 | shebang-regex@3.0.0: 1064 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1065 | engines: {node: '>=8'} 1066 | 1067 | side-channel-list@1.0.0: 1068 | resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} 1069 | engines: {node: '>= 0.4'} 1070 | 1071 | side-channel-map@1.0.1: 1072 | resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} 1073 | engines: {node: '>= 0.4'} 1074 | 1075 | side-channel-weakmap@1.0.2: 1076 | resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} 1077 | engines: {node: '>= 0.4'} 1078 | 1079 | side-channel@1.1.0: 1080 | resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 1081 | engines: {node: '>= 0.4'} 1082 | 1083 | string.prototype.matchall@4.0.12: 1084 | resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} 1085 | engines: {node: '>= 0.4'} 1086 | 1087 | string.prototype.repeat@1.0.0: 1088 | resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} 1089 | 1090 | string.prototype.trim@1.2.10: 1091 | resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} 1092 | engines: {node: '>= 0.4'} 1093 | 1094 | string.prototype.trimend@1.0.9: 1095 | resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} 1096 | engines: {node: '>= 0.4'} 1097 | 1098 | string.prototype.trimstart@1.0.8: 1099 | resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} 1100 | engines: {node: '>= 0.4'} 1101 | 1102 | strip-json-comments@3.1.1: 1103 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1104 | engines: {node: '>=8'} 1105 | 1106 | supports-color@7.2.0: 1107 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1108 | engines: {node: '>=8'} 1109 | 1110 | supports-preserve-symlinks-flag@1.0.0: 1111 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1112 | engines: {node: '>= 0.4'} 1113 | 1114 | to-regex-range@5.0.1: 1115 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1116 | engines: {node: '>=8.0'} 1117 | 1118 | ts-api-utils@1.4.3: 1119 | resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} 1120 | engines: {node: '>=16'} 1121 | peerDependencies: 1122 | typescript: '>=4.2.0' 1123 | 1124 | tslib@2.8.1: 1125 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 1126 | 1127 | type-check@0.4.0: 1128 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1129 | engines: {node: '>= 0.8.0'} 1130 | 1131 | typed-array-buffer@1.0.3: 1132 | resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} 1133 | engines: {node: '>= 0.4'} 1134 | 1135 | typed-array-byte-length@1.0.3: 1136 | resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} 1137 | engines: {node: '>= 0.4'} 1138 | 1139 | typed-array-byte-offset@1.0.4: 1140 | resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} 1141 | engines: {node: '>= 0.4'} 1142 | 1143 | typed-array-length@1.0.7: 1144 | resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} 1145 | engines: {node: '>= 0.4'} 1146 | 1147 | typescript-eslint@8.19.0: 1148 | resolution: {integrity: sha512-Ni8sUkVWYK4KAcTtPjQ/UTiRk6jcsuDhPpxULapUDi8A/l8TSBk+t1GtJA1RsCzIJg0q6+J7bf35AwQigENWRQ==} 1149 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1150 | peerDependencies: 1151 | eslint: ^8.57.0 || ^9.0.0 1152 | typescript: '>=4.8.4 <5.8.0' 1153 | 1154 | typescript@5.7.2: 1155 | resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} 1156 | engines: {node: '>=14.17'} 1157 | hasBin: true 1158 | 1159 | unbox-primitive@1.1.0: 1160 | resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} 1161 | engines: {node: '>= 0.4'} 1162 | 1163 | uri-js@4.4.1: 1164 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1165 | 1166 | which-boxed-primitive@1.1.1: 1167 | resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} 1168 | engines: {node: '>= 0.4'} 1169 | 1170 | which-builtin-type@1.2.1: 1171 | resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} 1172 | engines: {node: '>= 0.4'} 1173 | 1174 | which-collection@1.0.2: 1175 | resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} 1176 | engines: {node: '>= 0.4'} 1177 | 1178 | which-typed-array@1.1.18: 1179 | resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} 1180 | engines: {node: '>= 0.4'} 1181 | 1182 | which@2.0.2: 1183 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1184 | engines: {node: '>= 8'} 1185 | hasBin: true 1186 | 1187 | word-wrap@1.2.5: 1188 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1189 | engines: {node: '>=0.10.0'} 1190 | 1191 | yocto-queue@0.1.0: 1192 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1193 | engines: {node: '>=10'} 1194 | 1195 | snapshots: 1196 | 1197 | '@eslint-community/eslint-utils@4.4.1(eslint@9.17.0)': 1198 | dependencies: 1199 | eslint: 9.17.0 1200 | eslint-visitor-keys: 3.4.3 1201 | 1202 | '@eslint-community/regexpp@4.12.1': {} 1203 | 1204 | '@eslint/config-array@0.19.1': 1205 | dependencies: 1206 | '@eslint/object-schema': 2.1.5 1207 | debug: 4.4.0 1208 | minimatch: 3.1.2 1209 | transitivePeerDependencies: 1210 | - supports-color 1211 | 1212 | '@eslint/core@0.9.1': 1213 | dependencies: 1214 | '@types/json-schema': 7.0.15 1215 | 1216 | '@eslint/eslintrc@3.2.0': 1217 | dependencies: 1218 | ajv: 6.12.6 1219 | debug: 4.4.0 1220 | espree: 10.3.0 1221 | globals: 14.0.0 1222 | ignore: 5.3.2 1223 | import-fresh: 3.3.0 1224 | js-yaml: 4.1.0 1225 | minimatch: 3.1.2 1226 | strip-json-comments: 3.1.1 1227 | transitivePeerDependencies: 1228 | - supports-color 1229 | 1230 | '@eslint/js@9.17.0': {} 1231 | 1232 | '@eslint/object-schema@2.1.5': {} 1233 | 1234 | '@eslint/plugin-kit@0.2.4': 1235 | dependencies: 1236 | levn: 0.4.1 1237 | 1238 | '@humanfs/core@0.19.1': {} 1239 | 1240 | '@humanfs/node@0.16.6': 1241 | dependencies: 1242 | '@humanfs/core': 0.19.1 1243 | '@humanwhocodes/retry': 0.3.1 1244 | 1245 | '@humanwhocodes/module-importer@1.0.1': {} 1246 | 1247 | '@humanwhocodes/retry@0.3.1': {} 1248 | 1249 | '@humanwhocodes/retry@0.4.1': {} 1250 | 1251 | '@jridgewell/sourcemap-codec@1.5.0': {} 1252 | 1253 | '@nodelib/fs.scandir@2.1.5': 1254 | dependencies: 1255 | '@nodelib/fs.stat': 2.0.5 1256 | run-parallel: 1.2.0 1257 | 1258 | '@nodelib/fs.stat@2.0.5': {} 1259 | 1260 | '@nodelib/fs.walk@1.2.8': 1261 | dependencies: 1262 | '@nodelib/fs.scandir': 2.1.5 1263 | fastq: 1.18.0 1264 | 1265 | '@rollup/plugin-commonjs@28.0.2(rollup@4.29.1)': 1266 | dependencies: 1267 | '@rollup/pluginutils': 5.1.4(rollup@4.29.1) 1268 | commondir: 1.0.1 1269 | estree-walker: 2.0.2 1270 | fdir: 6.4.2(picomatch@4.0.2) 1271 | is-reference: 1.2.1 1272 | magic-string: 0.30.17 1273 | picomatch: 4.0.2 1274 | optionalDependencies: 1275 | rollup: 4.29.1 1276 | 1277 | '@rollup/plugin-node-resolve@16.0.0(rollup@4.29.1)': 1278 | dependencies: 1279 | '@rollup/pluginutils': 5.1.4(rollup@4.29.1) 1280 | '@types/resolve': 1.20.2 1281 | deepmerge: 4.3.1 1282 | is-module: 1.0.0 1283 | resolve: 1.22.10 1284 | optionalDependencies: 1285 | rollup: 4.29.1 1286 | 1287 | '@rollup/plugin-typescript@12.1.2(rollup@4.29.1)(tslib@2.8.1)(typescript@5.7.2)': 1288 | dependencies: 1289 | '@rollup/pluginutils': 5.1.4(rollup@4.29.1) 1290 | resolve: 1.22.10 1291 | typescript: 5.7.2 1292 | optionalDependencies: 1293 | rollup: 4.29.1 1294 | tslib: 2.8.1 1295 | 1296 | '@rollup/pluginutils@5.1.4(rollup@4.29.1)': 1297 | dependencies: 1298 | '@types/estree': 1.0.6 1299 | estree-walker: 2.0.2 1300 | picomatch: 4.0.2 1301 | optionalDependencies: 1302 | rollup: 4.29.1 1303 | 1304 | '@rollup/rollup-android-arm-eabi@4.29.1': 1305 | optional: true 1306 | 1307 | '@rollup/rollup-android-arm64@4.29.1': 1308 | optional: true 1309 | 1310 | '@rollup/rollup-darwin-arm64@4.29.1': 1311 | optional: true 1312 | 1313 | '@rollup/rollup-darwin-x64@4.29.1': 1314 | optional: true 1315 | 1316 | '@rollup/rollup-freebsd-arm64@4.29.1': 1317 | optional: true 1318 | 1319 | '@rollup/rollup-freebsd-x64@4.29.1': 1320 | optional: true 1321 | 1322 | '@rollup/rollup-linux-arm-gnueabihf@4.29.1': 1323 | optional: true 1324 | 1325 | '@rollup/rollup-linux-arm-musleabihf@4.29.1': 1326 | optional: true 1327 | 1328 | '@rollup/rollup-linux-arm64-gnu@4.29.1': 1329 | optional: true 1330 | 1331 | '@rollup/rollup-linux-arm64-musl@4.29.1': 1332 | optional: true 1333 | 1334 | '@rollup/rollup-linux-loongarch64-gnu@4.29.1': 1335 | optional: true 1336 | 1337 | '@rollup/rollup-linux-powerpc64le-gnu@4.29.1': 1338 | optional: true 1339 | 1340 | '@rollup/rollup-linux-riscv64-gnu@4.29.1': 1341 | optional: true 1342 | 1343 | '@rollup/rollup-linux-s390x-gnu@4.29.1': 1344 | optional: true 1345 | 1346 | '@rollup/rollup-linux-x64-gnu@4.29.1': 1347 | optional: true 1348 | 1349 | '@rollup/rollup-linux-x64-musl@4.29.1': 1350 | optional: true 1351 | 1352 | '@rollup/rollup-win32-arm64-msvc@4.29.1': 1353 | optional: true 1354 | 1355 | '@rollup/rollup-win32-ia32-msvc@4.29.1': 1356 | optional: true 1357 | 1358 | '@rollup/rollup-win32-x64-msvc@4.29.1': 1359 | optional: true 1360 | 1361 | '@types/estree@1.0.6': {} 1362 | 1363 | '@types/json-schema@7.0.15': {} 1364 | 1365 | '@types/lodash@4.17.13': {} 1366 | 1367 | '@types/react-dom@19.0.2(@types/react@19.0.2)': 1368 | dependencies: 1369 | '@types/react': 19.0.2 1370 | 1371 | '@types/react@19.0.2': 1372 | dependencies: 1373 | csstype: 3.1.3 1374 | 1375 | '@types/resolve@1.20.2': {} 1376 | 1377 | '@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0)(typescript@5.7.2)': 1378 | dependencies: 1379 | '@eslint-community/regexpp': 4.12.1 1380 | '@typescript-eslint/parser': 8.19.0(eslint@9.17.0)(typescript@5.7.2) 1381 | '@typescript-eslint/scope-manager': 8.19.0 1382 | '@typescript-eslint/type-utils': 8.19.0(eslint@9.17.0)(typescript@5.7.2) 1383 | '@typescript-eslint/utils': 8.19.0(eslint@9.17.0)(typescript@5.7.2) 1384 | '@typescript-eslint/visitor-keys': 8.19.0 1385 | eslint: 9.17.0 1386 | graphemer: 1.4.0 1387 | ignore: 5.3.2 1388 | natural-compare: 1.4.0 1389 | ts-api-utils: 1.4.3(typescript@5.7.2) 1390 | typescript: 5.7.2 1391 | transitivePeerDependencies: 1392 | - supports-color 1393 | 1394 | '@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@5.7.2)': 1395 | dependencies: 1396 | '@typescript-eslint/scope-manager': 8.19.0 1397 | '@typescript-eslint/types': 8.19.0 1398 | '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) 1399 | '@typescript-eslint/visitor-keys': 8.19.0 1400 | debug: 4.4.0 1401 | eslint: 9.17.0 1402 | typescript: 5.7.2 1403 | transitivePeerDependencies: 1404 | - supports-color 1405 | 1406 | '@typescript-eslint/scope-manager@8.19.0': 1407 | dependencies: 1408 | '@typescript-eslint/types': 8.19.0 1409 | '@typescript-eslint/visitor-keys': 8.19.0 1410 | 1411 | '@typescript-eslint/type-utils@8.19.0(eslint@9.17.0)(typescript@5.7.2)': 1412 | dependencies: 1413 | '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) 1414 | '@typescript-eslint/utils': 8.19.0(eslint@9.17.0)(typescript@5.7.2) 1415 | debug: 4.4.0 1416 | eslint: 9.17.0 1417 | ts-api-utils: 1.4.3(typescript@5.7.2) 1418 | typescript: 5.7.2 1419 | transitivePeerDependencies: 1420 | - supports-color 1421 | 1422 | '@typescript-eslint/types@8.19.0': {} 1423 | 1424 | '@typescript-eslint/typescript-estree@8.19.0(typescript@5.7.2)': 1425 | dependencies: 1426 | '@typescript-eslint/types': 8.19.0 1427 | '@typescript-eslint/visitor-keys': 8.19.0 1428 | debug: 4.4.0 1429 | fast-glob: 3.3.2 1430 | is-glob: 4.0.3 1431 | minimatch: 9.0.5 1432 | semver: 7.6.3 1433 | ts-api-utils: 1.4.3(typescript@5.7.2) 1434 | typescript: 5.7.2 1435 | transitivePeerDependencies: 1436 | - supports-color 1437 | 1438 | '@typescript-eslint/utils@8.19.0(eslint@9.17.0)(typescript@5.7.2)': 1439 | dependencies: 1440 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0) 1441 | '@typescript-eslint/scope-manager': 8.19.0 1442 | '@typescript-eslint/types': 8.19.0 1443 | '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) 1444 | eslint: 9.17.0 1445 | typescript: 5.7.2 1446 | transitivePeerDependencies: 1447 | - supports-color 1448 | 1449 | '@typescript-eslint/visitor-keys@8.19.0': 1450 | dependencies: 1451 | '@typescript-eslint/types': 8.19.0 1452 | eslint-visitor-keys: 4.2.0 1453 | 1454 | acorn-jsx@5.3.2(acorn@8.14.0): 1455 | dependencies: 1456 | acorn: 8.14.0 1457 | 1458 | acorn@8.14.0: {} 1459 | 1460 | ajv@6.12.6: 1461 | dependencies: 1462 | fast-deep-equal: 3.1.3 1463 | fast-json-stable-stringify: 2.1.0 1464 | json-schema-traverse: 0.4.1 1465 | uri-js: 4.4.1 1466 | 1467 | ansi-styles@4.3.0: 1468 | dependencies: 1469 | color-convert: 2.0.1 1470 | 1471 | argparse@2.0.1: {} 1472 | 1473 | array-buffer-byte-length@1.0.2: 1474 | dependencies: 1475 | call-bound: 1.0.3 1476 | is-array-buffer: 3.0.5 1477 | 1478 | array-includes@3.1.8: 1479 | dependencies: 1480 | call-bind: 1.0.8 1481 | define-properties: 1.2.1 1482 | es-abstract: 1.23.8 1483 | es-object-atoms: 1.0.0 1484 | get-intrinsic: 1.2.6 1485 | is-string: 1.1.1 1486 | 1487 | array.prototype.findlast@1.2.5: 1488 | dependencies: 1489 | call-bind: 1.0.8 1490 | define-properties: 1.2.1 1491 | es-abstract: 1.23.8 1492 | es-errors: 1.3.0 1493 | es-object-atoms: 1.0.0 1494 | es-shim-unscopables: 1.0.2 1495 | 1496 | array.prototype.flat@1.3.3: 1497 | dependencies: 1498 | call-bind: 1.0.8 1499 | define-properties: 1.2.1 1500 | es-abstract: 1.23.8 1501 | es-shim-unscopables: 1.0.2 1502 | 1503 | array.prototype.flatmap@1.3.3: 1504 | dependencies: 1505 | call-bind: 1.0.8 1506 | define-properties: 1.2.1 1507 | es-abstract: 1.23.8 1508 | es-shim-unscopables: 1.0.2 1509 | 1510 | array.prototype.tosorted@1.1.4: 1511 | dependencies: 1512 | call-bind: 1.0.8 1513 | define-properties: 1.2.1 1514 | es-abstract: 1.23.8 1515 | es-errors: 1.3.0 1516 | es-shim-unscopables: 1.0.2 1517 | 1518 | arraybuffer.prototype.slice@1.0.4: 1519 | dependencies: 1520 | array-buffer-byte-length: 1.0.2 1521 | call-bind: 1.0.8 1522 | define-properties: 1.2.1 1523 | es-abstract: 1.23.8 1524 | es-errors: 1.3.0 1525 | get-intrinsic: 1.2.6 1526 | is-array-buffer: 3.0.5 1527 | 1528 | available-typed-arrays@1.0.7: 1529 | dependencies: 1530 | possible-typed-array-names: 1.0.0 1531 | 1532 | balanced-match@1.0.2: {} 1533 | 1534 | brace-expansion@1.1.11: 1535 | dependencies: 1536 | balanced-match: 1.0.2 1537 | concat-map: 0.0.1 1538 | 1539 | brace-expansion@2.0.1: 1540 | dependencies: 1541 | balanced-match: 1.0.2 1542 | 1543 | braces@3.0.3: 1544 | dependencies: 1545 | fill-range: 7.1.1 1546 | 1547 | call-bind-apply-helpers@1.0.1: 1548 | dependencies: 1549 | es-errors: 1.3.0 1550 | function-bind: 1.1.2 1551 | 1552 | call-bind@1.0.8: 1553 | dependencies: 1554 | call-bind-apply-helpers: 1.0.1 1555 | es-define-property: 1.0.1 1556 | get-intrinsic: 1.2.6 1557 | set-function-length: 1.2.2 1558 | 1559 | call-bound@1.0.3: 1560 | dependencies: 1561 | call-bind-apply-helpers: 1.0.1 1562 | get-intrinsic: 1.2.6 1563 | 1564 | callsites@3.1.0: {} 1565 | 1566 | chalk@4.1.2: 1567 | dependencies: 1568 | ansi-styles: 4.3.0 1569 | supports-color: 7.2.0 1570 | 1571 | color-convert@2.0.1: 1572 | dependencies: 1573 | color-name: 1.1.4 1574 | 1575 | color-name@1.1.4: {} 1576 | 1577 | commondir@1.0.1: {} 1578 | 1579 | concat-map@0.0.1: {} 1580 | 1581 | cross-spawn@7.0.6: 1582 | dependencies: 1583 | path-key: 3.1.1 1584 | shebang-command: 2.0.0 1585 | which: 2.0.2 1586 | 1587 | csstype@3.1.3: {} 1588 | 1589 | data-view-buffer@1.0.2: 1590 | dependencies: 1591 | call-bound: 1.0.3 1592 | es-errors: 1.3.0 1593 | is-data-view: 1.0.2 1594 | 1595 | data-view-byte-length@1.0.2: 1596 | dependencies: 1597 | call-bound: 1.0.3 1598 | es-errors: 1.3.0 1599 | is-data-view: 1.0.2 1600 | 1601 | data-view-byte-offset@1.0.1: 1602 | dependencies: 1603 | call-bound: 1.0.3 1604 | es-errors: 1.3.0 1605 | is-data-view: 1.0.2 1606 | 1607 | debug@4.4.0: 1608 | dependencies: 1609 | ms: 2.1.3 1610 | 1611 | deep-is@0.1.4: {} 1612 | 1613 | deepmerge@4.3.1: {} 1614 | 1615 | define-data-property@1.1.4: 1616 | dependencies: 1617 | es-define-property: 1.0.1 1618 | es-errors: 1.3.0 1619 | gopd: 1.2.0 1620 | 1621 | define-properties@1.2.1: 1622 | dependencies: 1623 | define-data-property: 1.1.4 1624 | has-property-descriptors: 1.0.2 1625 | object-keys: 1.1.1 1626 | 1627 | doctrine@2.1.0: 1628 | dependencies: 1629 | esutils: 2.0.3 1630 | 1631 | dunder-proto@1.0.1: 1632 | dependencies: 1633 | call-bind-apply-helpers: 1.0.1 1634 | es-errors: 1.3.0 1635 | gopd: 1.2.0 1636 | 1637 | es-abstract@1.23.8: 1638 | dependencies: 1639 | array-buffer-byte-length: 1.0.2 1640 | arraybuffer.prototype.slice: 1.0.4 1641 | available-typed-arrays: 1.0.7 1642 | call-bind: 1.0.8 1643 | call-bound: 1.0.3 1644 | data-view-buffer: 1.0.2 1645 | data-view-byte-length: 1.0.2 1646 | data-view-byte-offset: 1.0.1 1647 | es-define-property: 1.0.1 1648 | es-errors: 1.3.0 1649 | es-object-atoms: 1.0.0 1650 | es-set-tostringtag: 2.0.3 1651 | es-to-primitive: 1.3.0 1652 | function.prototype.name: 1.1.8 1653 | get-intrinsic: 1.2.6 1654 | get-symbol-description: 1.1.0 1655 | globalthis: 1.0.4 1656 | gopd: 1.2.0 1657 | has-property-descriptors: 1.0.2 1658 | has-proto: 1.2.0 1659 | has-symbols: 1.1.0 1660 | hasown: 2.0.2 1661 | internal-slot: 1.1.0 1662 | is-array-buffer: 3.0.5 1663 | is-callable: 1.2.7 1664 | is-data-view: 1.0.2 1665 | is-regex: 1.2.1 1666 | is-shared-array-buffer: 1.0.4 1667 | is-string: 1.1.1 1668 | is-typed-array: 1.1.15 1669 | is-weakref: 1.1.0 1670 | math-intrinsics: 1.1.0 1671 | object-inspect: 1.13.3 1672 | object-keys: 1.1.1 1673 | object.assign: 4.1.7 1674 | own-keys: 1.0.1 1675 | regexp.prototype.flags: 1.5.3 1676 | safe-array-concat: 1.1.3 1677 | safe-push-apply: 1.0.0 1678 | safe-regex-test: 1.1.0 1679 | string.prototype.trim: 1.2.10 1680 | string.prototype.trimend: 1.0.9 1681 | string.prototype.trimstart: 1.0.8 1682 | typed-array-buffer: 1.0.3 1683 | typed-array-byte-length: 1.0.3 1684 | typed-array-byte-offset: 1.0.4 1685 | typed-array-length: 1.0.7 1686 | unbox-primitive: 1.1.0 1687 | which-typed-array: 1.1.18 1688 | 1689 | es-define-property@1.0.1: {} 1690 | 1691 | es-errors@1.3.0: {} 1692 | 1693 | es-iterator-helpers@1.2.1: 1694 | dependencies: 1695 | call-bind: 1.0.8 1696 | call-bound: 1.0.3 1697 | define-properties: 1.2.1 1698 | es-abstract: 1.23.8 1699 | es-errors: 1.3.0 1700 | es-set-tostringtag: 2.0.3 1701 | function-bind: 1.1.2 1702 | get-intrinsic: 1.2.6 1703 | globalthis: 1.0.4 1704 | gopd: 1.2.0 1705 | has-property-descriptors: 1.0.2 1706 | has-proto: 1.2.0 1707 | has-symbols: 1.1.0 1708 | internal-slot: 1.1.0 1709 | iterator.prototype: 1.1.4 1710 | safe-array-concat: 1.1.3 1711 | 1712 | es-object-atoms@1.0.0: 1713 | dependencies: 1714 | es-errors: 1.3.0 1715 | 1716 | es-set-tostringtag@2.0.3: 1717 | dependencies: 1718 | get-intrinsic: 1.2.6 1719 | has-tostringtag: 1.0.2 1720 | hasown: 2.0.2 1721 | 1722 | es-shim-unscopables@1.0.2: 1723 | dependencies: 1724 | hasown: 2.0.2 1725 | 1726 | es-to-primitive@1.3.0: 1727 | dependencies: 1728 | is-callable: 1.2.7 1729 | is-date-object: 1.1.0 1730 | is-symbol: 1.1.1 1731 | 1732 | escape-string-regexp@4.0.0: {} 1733 | 1734 | eslint-config-prettier@9.1.0(eslint@9.17.0): 1735 | dependencies: 1736 | eslint: 9.17.0 1737 | 1738 | eslint-plugin-react@7.37.3(eslint@9.17.0): 1739 | dependencies: 1740 | array-includes: 3.1.8 1741 | array.prototype.findlast: 1.2.5 1742 | array.prototype.flatmap: 1.3.3 1743 | array.prototype.tosorted: 1.1.4 1744 | doctrine: 2.1.0 1745 | es-iterator-helpers: 1.2.1 1746 | eslint: 9.17.0 1747 | estraverse: 5.3.0 1748 | hasown: 2.0.2 1749 | jsx-ast-utils: 3.3.5 1750 | minimatch: 3.1.2 1751 | object.entries: 1.1.8 1752 | object.fromentries: 2.0.8 1753 | object.values: 1.2.1 1754 | prop-types: 15.8.1 1755 | resolve: 2.0.0-next.5 1756 | semver: 6.3.1 1757 | string.prototype.matchall: 4.0.12 1758 | string.prototype.repeat: 1.0.0 1759 | 1760 | eslint-scope@8.2.0: 1761 | dependencies: 1762 | esrecurse: 4.3.0 1763 | estraverse: 5.3.0 1764 | 1765 | eslint-visitor-keys@3.4.3: {} 1766 | 1767 | eslint-visitor-keys@4.2.0: {} 1768 | 1769 | eslint@9.17.0: 1770 | dependencies: 1771 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0) 1772 | '@eslint-community/regexpp': 4.12.1 1773 | '@eslint/config-array': 0.19.1 1774 | '@eslint/core': 0.9.1 1775 | '@eslint/eslintrc': 3.2.0 1776 | '@eslint/js': 9.17.0 1777 | '@eslint/plugin-kit': 0.2.4 1778 | '@humanfs/node': 0.16.6 1779 | '@humanwhocodes/module-importer': 1.0.1 1780 | '@humanwhocodes/retry': 0.4.1 1781 | '@types/estree': 1.0.6 1782 | '@types/json-schema': 7.0.15 1783 | ajv: 6.12.6 1784 | chalk: 4.1.2 1785 | cross-spawn: 7.0.6 1786 | debug: 4.4.0 1787 | escape-string-regexp: 4.0.0 1788 | eslint-scope: 8.2.0 1789 | eslint-visitor-keys: 4.2.0 1790 | espree: 10.3.0 1791 | esquery: 1.6.0 1792 | esutils: 2.0.3 1793 | fast-deep-equal: 3.1.3 1794 | file-entry-cache: 8.0.0 1795 | find-up: 5.0.0 1796 | glob-parent: 6.0.2 1797 | ignore: 5.3.2 1798 | imurmurhash: 0.1.4 1799 | is-glob: 4.0.3 1800 | json-stable-stringify-without-jsonify: 1.0.1 1801 | lodash.merge: 4.6.2 1802 | minimatch: 3.1.2 1803 | natural-compare: 1.4.0 1804 | optionator: 0.9.4 1805 | transitivePeerDependencies: 1806 | - supports-color 1807 | 1808 | espree@10.3.0: 1809 | dependencies: 1810 | acorn: 8.14.0 1811 | acorn-jsx: 5.3.2(acorn@8.14.0) 1812 | eslint-visitor-keys: 4.2.0 1813 | 1814 | esquery@1.6.0: 1815 | dependencies: 1816 | estraverse: 5.3.0 1817 | 1818 | esrecurse@4.3.0: 1819 | dependencies: 1820 | estraverse: 5.3.0 1821 | 1822 | estraverse@5.3.0: {} 1823 | 1824 | estree-walker@2.0.2: {} 1825 | 1826 | esutils@2.0.3: {} 1827 | 1828 | fast-deep-equal@3.1.3: {} 1829 | 1830 | fast-glob@3.3.2: 1831 | dependencies: 1832 | '@nodelib/fs.stat': 2.0.5 1833 | '@nodelib/fs.walk': 1.2.8 1834 | glob-parent: 5.1.2 1835 | merge2: 1.4.1 1836 | micromatch: 4.0.8 1837 | 1838 | fast-json-stable-stringify@2.1.0: {} 1839 | 1840 | fast-levenshtein@2.0.6: {} 1841 | 1842 | fastq@1.18.0: 1843 | dependencies: 1844 | reusify: 1.0.4 1845 | 1846 | fdir@6.4.2(picomatch@4.0.2): 1847 | optionalDependencies: 1848 | picomatch: 4.0.2 1849 | 1850 | file-entry-cache@8.0.0: 1851 | dependencies: 1852 | flat-cache: 4.0.1 1853 | 1854 | fill-range@7.1.1: 1855 | dependencies: 1856 | to-regex-range: 5.0.1 1857 | 1858 | find-up@5.0.0: 1859 | dependencies: 1860 | locate-path: 6.0.0 1861 | path-exists: 4.0.0 1862 | 1863 | flat-cache@4.0.1: 1864 | dependencies: 1865 | flatted: 3.3.2 1866 | keyv: 4.5.4 1867 | 1868 | flatted@3.3.2: {} 1869 | 1870 | for-each@0.3.3: 1871 | dependencies: 1872 | is-callable: 1.2.7 1873 | 1874 | fsevents@2.3.3: 1875 | optional: true 1876 | 1877 | function-bind@1.1.2: {} 1878 | 1879 | function.prototype.name@1.1.8: 1880 | dependencies: 1881 | call-bind: 1.0.8 1882 | call-bound: 1.0.3 1883 | define-properties: 1.2.1 1884 | functions-have-names: 1.2.3 1885 | hasown: 2.0.2 1886 | is-callable: 1.2.7 1887 | 1888 | functions-have-names@1.2.3: {} 1889 | 1890 | get-intrinsic@1.2.6: 1891 | dependencies: 1892 | call-bind-apply-helpers: 1.0.1 1893 | dunder-proto: 1.0.1 1894 | es-define-property: 1.0.1 1895 | es-errors: 1.3.0 1896 | es-object-atoms: 1.0.0 1897 | function-bind: 1.1.2 1898 | gopd: 1.2.0 1899 | has-symbols: 1.1.0 1900 | hasown: 2.0.2 1901 | math-intrinsics: 1.1.0 1902 | 1903 | get-symbol-description@1.1.0: 1904 | dependencies: 1905 | call-bound: 1.0.3 1906 | es-errors: 1.3.0 1907 | get-intrinsic: 1.2.6 1908 | 1909 | glob-parent@5.1.2: 1910 | dependencies: 1911 | is-glob: 4.0.3 1912 | 1913 | glob-parent@6.0.2: 1914 | dependencies: 1915 | is-glob: 4.0.3 1916 | 1917 | globals@14.0.0: {} 1918 | 1919 | globalthis@1.0.4: 1920 | dependencies: 1921 | define-properties: 1.2.1 1922 | gopd: 1.2.0 1923 | 1924 | gopd@1.2.0: {} 1925 | 1926 | graphemer@1.4.0: {} 1927 | 1928 | has-bigints@1.1.0: {} 1929 | 1930 | has-flag@4.0.0: {} 1931 | 1932 | has-property-descriptors@1.0.2: 1933 | dependencies: 1934 | es-define-property: 1.0.1 1935 | 1936 | has-proto@1.2.0: 1937 | dependencies: 1938 | dunder-proto: 1.0.1 1939 | 1940 | has-symbols@1.1.0: {} 1941 | 1942 | has-tostringtag@1.0.2: 1943 | dependencies: 1944 | has-symbols: 1.1.0 1945 | 1946 | hasown@2.0.2: 1947 | dependencies: 1948 | function-bind: 1.1.2 1949 | 1950 | ignore@5.3.2: {} 1951 | 1952 | import-fresh@3.3.0: 1953 | dependencies: 1954 | parent-module: 1.0.1 1955 | resolve-from: 4.0.0 1956 | 1957 | imurmurhash@0.1.4: {} 1958 | 1959 | internal-slot@1.1.0: 1960 | dependencies: 1961 | es-errors: 1.3.0 1962 | hasown: 2.0.2 1963 | side-channel: 1.1.0 1964 | 1965 | is-array-buffer@3.0.5: 1966 | dependencies: 1967 | call-bind: 1.0.8 1968 | call-bound: 1.0.3 1969 | get-intrinsic: 1.2.6 1970 | 1971 | is-async-function@2.0.0: 1972 | dependencies: 1973 | has-tostringtag: 1.0.2 1974 | 1975 | is-bigint@1.1.0: 1976 | dependencies: 1977 | has-bigints: 1.1.0 1978 | 1979 | is-boolean-object@1.2.1: 1980 | dependencies: 1981 | call-bound: 1.0.3 1982 | has-tostringtag: 1.0.2 1983 | 1984 | is-callable@1.2.7: {} 1985 | 1986 | is-core-module@2.16.1: 1987 | dependencies: 1988 | hasown: 2.0.2 1989 | 1990 | is-data-view@1.0.2: 1991 | dependencies: 1992 | call-bound: 1.0.3 1993 | get-intrinsic: 1.2.6 1994 | is-typed-array: 1.1.15 1995 | 1996 | is-date-object@1.1.0: 1997 | dependencies: 1998 | call-bound: 1.0.3 1999 | has-tostringtag: 1.0.2 2000 | 2001 | is-extglob@2.1.1: {} 2002 | 2003 | is-finalizationregistry@1.1.1: 2004 | dependencies: 2005 | call-bound: 1.0.3 2006 | 2007 | is-generator-function@1.0.10: 2008 | dependencies: 2009 | has-tostringtag: 1.0.2 2010 | 2011 | is-glob@4.0.3: 2012 | dependencies: 2013 | is-extglob: 2.1.1 2014 | 2015 | is-map@2.0.3: {} 2016 | 2017 | is-module@1.0.0: {} 2018 | 2019 | is-number-object@1.1.1: 2020 | dependencies: 2021 | call-bound: 1.0.3 2022 | has-tostringtag: 1.0.2 2023 | 2024 | is-number@7.0.0: {} 2025 | 2026 | is-reference@1.2.1: 2027 | dependencies: 2028 | '@types/estree': 1.0.6 2029 | 2030 | is-regex@1.2.1: 2031 | dependencies: 2032 | call-bound: 1.0.3 2033 | gopd: 1.2.0 2034 | has-tostringtag: 1.0.2 2035 | hasown: 2.0.2 2036 | 2037 | is-set@2.0.3: {} 2038 | 2039 | is-shared-array-buffer@1.0.4: 2040 | dependencies: 2041 | call-bound: 1.0.3 2042 | 2043 | is-string@1.1.1: 2044 | dependencies: 2045 | call-bound: 1.0.3 2046 | has-tostringtag: 1.0.2 2047 | 2048 | is-symbol@1.1.1: 2049 | dependencies: 2050 | call-bound: 1.0.3 2051 | has-symbols: 1.1.0 2052 | safe-regex-test: 1.1.0 2053 | 2054 | is-typed-array@1.1.15: 2055 | dependencies: 2056 | which-typed-array: 1.1.18 2057 | 2058 | is-weakmap@2.0.2: {} 2059 | 2060 | is-weakref@1.1.0: 2061 | dependencies: 2062 | call-bound: 1.0.3 2063 | 2064 | is-weakset@2.0.4: 2065 | dependencies: 2066 | call-bound: 1.0.3 2067 | get-intrinsic: 1.2.6 2068 | 2069 | isarray@2.0.5: {} 2070 | 2071 | isexe@2.0.0: {} 2072 | 2073 | iterator.prototype@1.1.4: 2074 | dependencies: 2075 | define-data-property: 1.1.4 2076 | es-object-atoms: 1.0.0 2077 | get-intrinsic: 1.2.6 2078 | has-symbols: 1.1.0 2079 | reflect.getprototypeof: 1.0.9 2080 | set-function-name: 2.0.2 2081 | 2082 | js-tokens@4.0.0: {} 2083 | 2084 | js-yaml@4.1.0: 2085 | dependencies: 2086 | argparse: 2.0.1 2087 | 2088 | json-buffer@3.0.1: {} 2089 | 2090 | json-schema-traverse@0.4.1: {} 2091 | 2092 | json-stable-stringify-without-jsonify@1.0.1: {} 2093 | 2094 | jsx-ast-utils@3.3.5: 2095 | dependencies: 2096 | array-includes: 3.1.8 2097 | array.prototype.flat: 1.3.3 2098 | object.assign: 4.1.7 2099 | object.values: 1.2.1 2100 | 2101 | keyv@4.5.4: 2102 | dependencies: 2103 | json-buffer: 3.0.1 2104 | 2105 | levn@0.4.1: 2106 | dependencies: 2107 | prelude-ls: 1.2.1 2108 | type-check: 0.4.0 2109 | 2110 | locate-path@6.0.0: 2111 | dependencies: 2112 | p-locate: 5.0.0 2113 | 2114 | lodash.merge@4.6.2: {} 2115 | 2116 | lodash@4.17.21: {} 2117 | 2118 | loose-envify@1.4.0: 2119 | dependencies: 2120 | js-tokens: 4.0.0 2121 | 2122 | magic-string@0.30.17: 2123 | dependencies: 2124 | '@jridgewell/sourcemap-codec': 1.5.0 2125 | 2126 | math-intrinsics@1.1.0: {} 2127 | 2128 | merge2@1.4.1: {} 2129 | 2130 | micromatch@4.0.8: 2131 | dependencies: 2132 | braces: 3.0.3 2133 | picomatch: 2.3.1 2134 | 2135 | minimatch@3.1.2: 2136 | dependencies: 2137 | brace-expansion: 1.1.11 2138 | 2139 | minimatch@9.0.5: 2140 | dependencies: 2141 | brace-expansion: 2.0.1 2142 | 2143 | ms@2.1.3: {} 2144 | 2145 | natural-compare@1.4.0: {} 2146 | 2147 | object-assign@4.1.1: {} 2148 | 2149 | object-inspect@1.13.3: {} 2150 | 2151 | object-keys@1.1.1: {} 2152 | 2153 | object.assign@4.1.7: 2154 | dependencies: 2155 | call-bind: 1.0.8 2156 | call-bound: 1.0.3 2157 | define-properties: 1.2.1 2158 | es-object-atoms: 1.0.0 2159 | has-symbols: 1.1.0 2160 | object-keys: 1.1.1 2161 | 2162 | object.entries@1.1.8: 2163 | dependencies: 2164 | call-bind: 1.0.8 2165 | define-properties: 1.2.1 2166 | es-object-atoms: 1.0.0 2167 | 2168 | object.fromentries@2.0.8: 2169 | dependencies: 2170 | call-bind: 1.0.8 2171 | define-properties: 1.2.1 2172 | es-abstract: 1.23.8 2173 | es-object-atoms: 1.0.0 2174 | 2175 | object.values@1.2.1: 2176 | dependencies: 2177 | call-bind: 1.0.8 2178 | call-bound: 1.0.3 2179 | define-properties: 1.2.1 2180 | es-object-atoms: 1.0.0 2181 | 2182 | optionator@0.9.4: 2183 | dependencies: 2184 | deep-is: 0.1.4 2185 | fast-levenshtein: 2.0.6 2186 | levn: 0.4.1 2187 | prelude-ls: 1.2.1 2188 | type-check: 0.4.0 2189 | word-wrap: 1.2.5 2190 | 2191 | own-keys@1.0.1: 2192 | dependencies: 2193 | get-intrinsic: 1.2.6 2194 | object-keys: 1.1.1 2195 | safe-push-apply: 1.0.0 2196 | 2197 | p-limit@3.1.0: 2198 | dependencies: 2199 | yocto-queue: 0.1.0 2200 | 2201 | p-locate@5.0.0: 2202 | dependencies: 2203 | p-limit: 3.1.0 2204 | 2205 | parent-module@1.0.1: 2206 | dependencies: 2207 | callsites: 3.1.0 2208 | 2209 | path-exists@4.0.0: {} 2210 | 2211 | path-key@3.1.1: {} 2212 | 2213 | path-parse@1.0.7: {} 2214 | 2215 | picomatch@2.3.1: {} 2216 | 2217 | picomatch@4.0.2: {} 2218 | 2219 | possible-typed-array-names@1.0.0: {} 2220 | 2221 | prelude-ls@1.2.1: {} 2222 | 2223 | prettier@3.4.2: {} 2224 | 2225 | prop-types@15.8.1: 2226 | dependencies: 2227 | loose-envify: 1.4.0 2228 | object-assign: 4.1.1 2229 | react-is: 16.13.1 2230 | 2231 | punycode@2.3.1: {} 2232 | 2233 | queue-microtask@1.2.3: {} 2234 | 2235 | react-is@16.13.1: {} 2236 | 2237 | react@19.0.0: {} 2238 | 2239 | reflect.getprototypeof@1.0.9: 2240 | dependencies: 2241 | call-bind: 1.0.8 2242 | define-properties: 1.2.1 2243 | dunder-proto: 1.0.1 2244 | es-abstract: 1.23.8 2245 | es-errors: 1.3.0 2246 | get-intrinsic: 1.2.6 2247 | gopd: 1.2.0 2248 | which-builtin-type: 1.2.1 2249 | 2250 | regexp.prototype.flags@1.5.3: 2251 | dependencies: 2252 | call-bind: 1.0.8 2253 | define-properties: 1.2.1 2254 | es-errors: 1.3.0 2255 | set-function-name: 2.0.2 2256 | 2257 | resolve-from@4.0.0: {} 2258 | 2259 | resolve@1.22.10: 2260 | dependencies: 2261 | is-core-module: 2.16.1 2262 | path-parse: 1.0.7 2263 | supports-preserve-symlinks-flag: 1.0.0 2264 | 2265 | resolve@2.0.0-next.5: 2266 | dependencies: 2267 | is-core-module: 2.16.1 2268 | path-parse: 1.0.7 2269 | supports-preserve-symlinks-flag: 1.0.0 2270 | 2271 | reusify@1.0.4: {} 2272 | 2273 | rollup-plugin-node-externals@8.0.0(rollup@4.29.1): 2274 | dependencies: 2275 | rollup: 4.29.1 2276 | 2277 | rollup@4.29.1: 2278 | dependencies: 2279 | '@types/estree': 1.0.6 2280 | optionalDependencies: 2281 | '@rollup/rollup-android-arm-eabi': 4.29.1 2282 | '@rollup/rollup-android-arm64': 4.29.1 2283 | '@rollup/rollup-darwin-arm64': 4.29.1 2284 | '@rollup/rollup-darwin-x64': 4.29.1 2285 | '@rollup/rollup-freebsd-arm64': 4.29.1 2286 | '@rollup/rollup-freebsd-x64': 4.29.1 2287 | '@rollup/rollup-linux-arm-gnueabihf': 4.29.1 2288 | '@rollup/rollup-linux-arm-musleabihf': 4.29.1 2289 | '@rollup/rollup-linux-arm64-gnu': 4.29.1 2290 | '@rollup/rollup-linux-arm64-musl': 4.29.1 2291 | '@rollup/rollup-linux-loongarch64-gnu': 4.29.1 2292 | '@rollup/rollup-linux-powerpc64le-gnu': 4.29.1 2293 | '@rollup/rollup-linux-riscv64-gnu': 4.29.1 2294 | '@rollup/rollup-linux-s390x-gnu': 4.29.1 2295 | '@rollup/rollup-linux-x64-gnu': 4.29.1 2296 | '@rollup/rollup-linux-x64-musl': 4.29.1 2297 | '@rollup/rollup-win32-arm64-msvc': 4.29.1 2298 | '@rollup/rollup-win32-ia32-msvc': 4.29.1 2299 | '@rollup/rollup-win32-x64-msvc': 4.29.1 2300 | fsevents: 2.3.3 2301 | 2302 | run-parallel@1.2.0: 2303 | dependencies: 2304 | queue-microtask: 1.2.3 2305 | 2306 | safe-array-concat@1.1.3: 2307 | dependencies: 2308 | call-bind: 1.0.8 2309 | call-bound: 1.0.3 2310 | get-intrinsic: 1.2.6 2311 | has-symbols: 1.1.0 2312 | isarray: 2.0.5 2313 | 2314 | safe-push-apply@1.0.0: 2315 | dependencies: 2316 | es-errors: 1.3.0 2317 | isarray: 2.0.5 2318 | 2319 | safe-regex-test@1.1.0: 2320 | dependencies: 2321 | call-bound: 1.0.3 2322 | es-errors: 1.3.0 2323 | is-regex: 1.2.1 2324 | 2325 | semver@6.3.1: {} 2326 | 2327 | semver@7.6.3: {} 2328 | 2329 | set-function-length@1.2.2: 2330 | dependencies: 2331 | define-data-property: 1.1.4 2332 | es-errors: 1.3.0 2333 | function-bind: 1.1.2 2334 | get-intrinsic: 1.2.6 2335 | gopd: 1.2.0 2336 | has-property-descriptors: 1.0.2 2337 | 2338 | set-function-name@2.0.2: 2339 | dependencies: 2340 | define-data-property: 1.1.4 2341 | es-errors: 1.3.0 2342 | functions-have-names: 1.2.3 2343 | has-property-descriptors: 1.0.2 2344 | 2345 | shebang-command@2.0.0: 2346 | dependencies: 2347 | shebang-regex: 3.0.0 2348 | 2349 | shebang-regex@3.0.0: {} 2350 | 2351 | side-channel-list@1.0.0: 2352 | dependencies: 2353 | es-errors: 1.3.0 2354 | object-inspect: 1.13.3 2355 | 2356 | side-channel-map@1.0.1: 2357 | dependencies: 2358 | call-bound: 1.0.3 2359 | es-errors: 1.3.0 2360 | get-intrinsic: 1.2.6 2361 | object-inspect: 1.13.3 2362 | 2363 | side-channel-weakmap@1.0.2: 2364 | dependencies: 2365 | call-bound: 1.0.3 2366 | es-errors: 1.3.0 2367 | get-intrinsic: 1.2.6 2368 | object-inspect: 1.13.3 2369 | side-channel-map: 1.0.1 2370 | 2371 | side-channel@1.1.0: 2372 | dependencies: 2373 | es-errors: 1.3.0 2374 | object-inspect: 1.13.3 2375 | side-channel-list: 1.0.0 2376 | side-channel-map: 1.0.1 2377 | side-channel-weakmap: 1.0.2 2378 | 2379 | string.prototype.matchall@4.0.12: 2380 | dependencies: 2381 | call-bind: 1.0.8 2382 | call-bound: 1.0.3 2383 | define-properties: 1.2.1 2384 | es-abstract: 1.23.8 2385 | es-errors: 1.3.0 2386 | es-object-atoms: 1.0.0 2387 | get-intrinsic: 1.2.6 2388 | gopd: 1.2.0 2389 | has-symbols: 1.1.0 2390 | internal-slot: 1.1.0 2391 | regexp.prototype.flags: 1.5.3 2392 | set-function-name: 2.0.2 2393 | side-channel: 1.1.0 2394 | 2395 | string.prototype.repeat@1.0.0: 2396 | dependencies: 2397 | define-properties: 1.2.1 2398 | es-abstract: 1.23.8 2399 | 2400 | string.prototype.trim@1.2.10: 2401 | dependencies: 2402 | call-bind: 1.0.8 2403 | call-bound: 1.0.3 2404 | define-data-property: 1.1.4 2405 | define-properties: 1.2.1 2406 | es-abstract: 1.23.8 2407 | es-object-atoms: 1.0.0 2408 | has-property-descriptors: 1.0.2 2409 | 2410 | string.prototype.trimend@1.0.9: 2411 | dependencies: 2412 | call-bind: 1.0.8 2413 | call-bound: 1.0.3 2414 | define-properties: 1.2.1 2415 | es-object-atoms: 1.0.0 2416 | 2417 | string.prototype.trimstart@1.0.8: 2418 | dependencies: 2419 | call-bind: 1.0.8 2420 | define-properties: 1.2.1 2421 | es-object-atoms: 1.0.0 2422 | 2423 | strip-json-comments@3.1.1: {} 2424 | 2425 | supports-color@7.2.0: 2426 | dependencies: 2427 | has-flag: 4.0.0 2428 | 2429 | supports-preserve-symlinks-flag@1.0.0: {} 2430 | 2431 | to-regex-range@5.0.1: 2432 | dependencies: 2433 | is-number: 7.0.0 2434 | 2435 | ts-api-utils@1.4.3(typescript@5.7.2): 2436 | dependencies: 2437 | typescript: 5.7.2 2438 | 2439 | tslib@2.8.1: {} 2440 | 2441 | type-check@0.4.0: 2442 | dependencies: 2443 | prelude-ls: 1.2.1 2444 | 2445 | typed-array-buffer@1.0.3: 2446 | dependencies: 2447 | call-bound: 1.0.3 2448 | es-errors: 1.3.0 2449 | is-typed-array: 1.1.15 2450 | 2451 | typed-array-byte-length@1.0.3: 2452 | dependencies: 2453 | call-bind: 1.0.8 2454 | for-each: 0.3.3 2455 | gopd: 1.2.0 2456 | has-proto: 1.2.0 2457 | is-typed-array: 1.1.15 2458 | 2459 | typed-array-byte-offset@1.0.4: 2460 | dependencies: 2461 | available-typed-arrays: 1.0.7 2462 | call-bind: 1.0.8 2463 | for-each: 0.3.3 2464 | gopd: 1.2.0 2465 | has-proto: 1.2.0 2466 | is-typed-array: 1.1.15 2467 | reflect.getprototypeof: 1.0.9 2468 | 2469 | typed-array-length@1.0.7: 2470 | dependencies: 2471 | call-bind: 1.0.8 2472 | for-each: 0.3.3 2473 | gopd: 1.2.0 2474 | is-typed-array: 1.1.15 2475 | possible-typed-array-names: 1.0.0 2476 | reflect.getprototypeof: 1.0.9 2477 | 2478 | typescript-eslint@8.19.0(eslint@9.17.0)(typescript@5.7.2): 2479 | dependencies: 2480 | '@typescript-eslint/eslint-plugin': 8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0)(typescript@5.7.2) 2481 | '@typescript-eslint/parser': 8.19.0(eslint@9.17.0)(typescript@5.7.2) 2482 | '@typescript-eslint/utils': 8.19.0(eslint@9.17.0)(typescript@5.7.2) 2483 | eslint: 9.17.0 2484 | typescript: 5.7.2 2485 | transitivePeerDependencies: 2486 | - supports-color 2487 | 2488 | typescript@5.7.2: {} 2489 | 2490 | unbox-primitive@1.1.0: 2491 | dependencies: 2492 | call-bound: 1.0.3 2493 | has-bigints: 1.1.0 2494 | has-symbols: 1.1.0 2495 | which-boxed-primitive: 1.1.1 2496 | 2497 | uri-js@4.4.1: 2498 | dependencies: 2499 | punycode: 2.3.1 2500 | 2501 | which-boxed-primitive@1.1.1: 2502 | dependencies: 2503 | is-bigint: 1.1.0 2504 | is-boolean-object: 1.2.1 2505 | is-number-object: 1.1.1 2506 | is-string: 1.1.1 2507 | is-symbol: 1.1.1 2508 | 2509 | which-builtin-type@1.2.1: 2510 | dependencies: 2511 | call-bound: 1.0.3 2512 | function.prototype.name: 1.1.8 2513 | has-tostringtag: 1.0.2 2514 | is-async-function: 2.0.0 2515 | is-date-object: 1.1.0 2516 | is-finalizationregistry: 1.1.1 2517 | is-generator-function: 1.0.10 2518 | is-regex: 1.2.1 2519 | is-weakref: 1.1.0 2520 | isarray: 2.0.5 2521 | which-boxed-primitive: 1.1.1 2522 | which-collection: 1.0.2 2523 | which-typed-array: 1.1.18 2524 | 2525 | which-collection@1.0.2: 2526 | dependencies: 2527 | is-map: 2.0.3 2528 | is-set: 2.0.3 2529 | is-weakmap: 2.0.2 2530 | is-weakset: 2.0.4 2531 | 2532 | which-typed-array@1.1.18: 2533 | dependencies: 2534 | available-typed-arrays: 1.0.7 2535 | call-bind: 1.0.8 2536 | call-bound: 1.0.3 2537 | for-each: 0.3.3 2538 | gopd: 1.2.0 2539 | has-tostringtag: 1.0.2 2540 | 2541 | which@2.0.2: 2542 | dependencies: 2543 | isexe: 2.0.0 2544 | 2545 | word-wrap@1.2.5: {} 2546 | 2547 | yocto-queue@0.1.0: {} 2548 | -------------------------------------------------------------------------------- /rollup.config.mjs: -------------------------------------------------------------------------------- 1 | import externals from 'rollup-plugin-node-externals'; 2 | import resolve from '@rollup/plugin-node-resolve'; 3 | import commonjs from '@rollup/plugin-commonjs'; 4 | import typescript from '@rollup/plugin-typescript'; 5 | 6 | const getConfig = () => ({ 7 | input: 'src/index.ts', 8 | output: { 9 | dir: 'build', 10 | format: 'esm', 11 | sourcemap: true, 12 | preserveModules: true, 13 | preserveModulesRoot: 'src', 14 | }, 15 | plugins: [externals(), resolve(), commonjs(), typescript()], 16 | }); 17 | 18 | export default [getConfig()]; 19 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import useResizeDetector from './useResizeDetector'; 2 | 3 | export { useResizeDetector }; 4 | export type { 5 | UseResizeDetectorReturn, 6 | useResizeDetectorProps, 7 | OnResizeCallback, 8 | ResizePayload, 9 | ResfreshModeType, 10 | ResfreshOptionsType, 11 | Dimensions, 12 | } from './types'; 13 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | import type { MutableRefObject } from 'react'; 2 | 3 | export type Dimensions = { 4 | height?: number; 5 | width?: number; 6 | }; 7 | 8 | /** If element is mounted, returns its dimensions and `ResizeObserverEntry` 9 | * If element is unmounted, returns null */ 10 | export type ResizePayload = 11 | | { width: number; height: number; entry: ResizeObserverEntry } 12 | | { width: null; height: null; entry: null }; 13 | 14 | export type ResfreshModeType = 'throttle' | 'debounce'; 15 | export type ResfreshOptionsType = { leading?: boolean; trailing?: boolean }; 16 | export type OnResizeCallback = (payload: ResizePayload) => void; 17 | 18 | export type Props = { 19 | /** 20 | * Function that will be invoked with observable element's width, height and ResizeObserverEntry. 21 | * If element is unmounted, width and height will be null. 22 | * Default: undefined 23 | */ 24 | onResize?: OnResizeCallback; 25 | /** 26 | * Trigger update on height change. 27 | * Default: true 28 | */ 29 | handleHeight?: boolean; 30 | /** 31 | * Trigger onResize on width change. 32 | * Default: true 33 | */ 34 | handleWidth?: boolean; 35 | /** 36 | * Do not trigger update when a component mounts. 37 | * Default: false 38 | */ 39 | skipOnMount?: boolean; 40 | /** 41 | * Changes the update strategy. Possible values: "throttle" and "debounce". 42 | * See `lodash` docs for more information https://lodash.com/docs/ 43 | * undefined - callback will be fired for every frame. 44 | * Default: undefined 45 | */ 46 | refreshMode?: ResfreshModeType; 47 | /** 48 | * Set the timeout/interval for `refreshMode` strategy 49 | * Default: undefined 50 | */ 51 | refreshRate?: number; 52 | /** 53 | * Pass additional params to `refreshMode` according to lodash docs 54 | * Default: undefined 55 | */ 56 | refreshOptions?: ResfreshOptionsType; 57 | /** 58 | * These options will be used as a second parameter of `resizeObserver.observe` method 59 | * @see https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver/observe 60 | * Default: undefined 61 | */ 62 | observerOptions?: ResizeObserverOptions; 63 | }; 64 | 65 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 66 | export type OnRefChangeType = { 67 | (node: T | null): void; 68 | current?: T | null; 69 | }; 70 | 71 | export interface UseResizeDetectorReturn extends Dimensions { 72 | ref: OnRefChangeType; 73 | } 74 | 75 | export interface useResizeDetectorProps extends Props { 76 | targetRef?: MutableRefObject; 77 | } 78 | -------------------------------------------------------------------------------- /src/useResizeDetector.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useState, useRef, useCallback } from 'react'; 2 | import type { DebouncedFunc } from 'lodash'; 3 | 4 | import { getDimensions, patchResizeCallback, useCallbackRef, useRefProxy } from './utils'; 5 | 6 | import type { Dimensions, UseResizeDetectorReturn, useResizeDetectorProps } from './types'; 7 | 8 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 9 | function useResizeDetector({ 10 | skipOnMount = false, 11 | refreshMode, 12 | refreshRate = 1000, 13 | refreshOptions, 14 | handleWidth = true, 15 | handleHeight = true, 16 | targetRef, 17 | observerOptions, 18 | onResize, 19 | }: useResizeDetectorProps = {}): UseResizeDetectorReturn { 20 | // If `skipOnMount` is enabled, skip the first resize event 21 | const skipResize = useRef(skipOnMount); 22 | 23 | // Wrap the `onResize` callback with a ref to avoid re-renders 24 | const onResizeRef = useCallbackRef(onResize); 25 | 26 | const [size, setSize] = useState({ 27 | width: undefined, 28 | height: undefined, 29 | }); 30 | 31 | // Create a proxy ref to handle conditional rendering and dynamic ref changes of the target element 32 | const { refProxy, refElement } = useRefProxy(targetRef); 33 | 34 | const { box } = observerOptions || {}; 35 | 36 | const resizeCallback: ResizeObserverCallback = useCallback( 37 | (entries: ResizeObserverEntry[]) => { 38 | if (!handleWidth && !handleHeight) return; 39 | 40 | if (skipResize.current) { 41 | skipResize.current = false; 42 | return; 43 | } 44 | 45 | // Only update the size if one of the observed dimensions has changed 46 | const shouldSetSize = (prevSize: Dimensions, nextSize: Dimensions) => 47 | (handleWidth && prevSize.width !== nextSize.width) || (handleHeight && prevSize.height !== nextSize.height); 48 | 49 | entries.forEach((entry) => { 50 | const dimensions = getDimensions(entry, box); 51 | setSize((prevSize) => { 52 | if (!shouldSetSize(prevSize, dimensions)) return prevSize; 53 | onResizeRef?.({ 54 | width: dimensions.width, 55 | height: dimensions.height, 56 | entry, 57 | }); 58 | return dimensions; 59 | }); 60 | }); 61 | }, 62 | [handleWidth, handleHeight, skipResize, box], 63 | ); 64 | 65 | // Throttle/Debounce the resize event if refreshMode is configured 66 | const resizeHandler = useCallback(patchResizeCallback(resizeCallback, refreshMode, refreshRate, refreshOptions), [ 67 | resizeCallback, 68 | refreshMode, 69 | refreshRate, 70 | refreshOptions, 71 | ]); 72 | 73 | // Attach ResizeObserver to the element 74 | useEffect(() => { 75 | let resizeObserver: ResizeObserver | undefined; 76 | if (refElement) { 77 | resizeObserver = new window.ResizeObserver(resizeHandler); 78 | resizeObserver.observe(refElement, observerOptions); 79 | } 80 | // If refElement is not available, reset the size 81 | else if (size.width || size.height) { 82 | onResizeRef?.({ 83 | width: null, 84 | height: null, 85 | entry: null, 86 | }); 87 | setSize({ width: undefined, height: undefined }); 88 | } 89 | 90 | // Disconnect the ResizeObserver when the component is unmounted 91 | return () => { 92 | resizeObserver?.disconnect?.(); 93 | (resizeHandler as DebouncedFunc).cancel?.(); 94 | }; 95 | }, [resizeHandler, refElement]); 96 | 97 | return { ref: refProxy, ...size }; 98 | } 99 | 100 | export default useResizeDetector; 101 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import debounce from 'lodash/debounce.js'; 3 | import throttle from 'lodash/throttle.js'; 4 | import type { DebouncedFunc } from 'lodash'; 5 | 6 | import { OnRefChangeType, Props } from './types'; 7 | 8 | export type PatchedResizeObserverCallback = DebouncedFunc | ResizeObserverCallback; 9 | 10 | /** 11 | * Wraps the resize callback with a lodash debounce / throttle based on the refresh mode 12 | */ 13 | export const patchResizeCallback = ( 14 | resizeCallback: ResizeObserverCallback, 15 | refreshMode: Props['refreshMode'], 16 | refreshRate: Props['refreshRate'], 17 | refreshOptions: Props['refreshOptions'], 18 | ): PatchedResizeObserverCallback => { 19 | switch (refreshMode) { 20 | case 'debounce': 21 | return debounce(resizeCallback, refreshRate, refreshOptions); 22 | case 'throttle': 23 | return throttle(resizeCallback, refreshRate, refreshOptions); 24 | default: 25 | return resizeCallback; 26 | } 27 | }; 28 | 29 | /** 30 | * A custom hook that converts a callback to a ref to avoid triggering re-renders when passed as a 31 | * prop or avoid re-executing effects when passed as a dependency 32 | */ 33 | export const useCallbackRef = 34 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 35 | any>(callback: T | undefined): T => { 36 | const callbackRef = React.useRef(callback); 37 | 38 | React.useEffect(() => { 39 | callbackRef.current = callback; 40 | }); 41 | 42 | return React.useMemo(() => ((...args) => callbackRef.current?.(...args)) as T, []); 43 | }; 44 | 45 | /** `useRef` hook doesn't handle conditional rendering or dynamic ref changes. 46 | * This hook creates a proxy that ensures that `refElement` is updated whenever the ref is changed. */ 47 | export const useRefProxy = 48 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 49 | (targetRef: React.MutableRefObject | undefined) => { 50 | // we are going to use this ref to store the last element that was passed to the hook 51 | const [refElement, setRefElement] = React.useState(targetRef?.current || null); 52 | 53 | // if targetRef is passed, we need to update the refElement 54 | // we have to use setTimeout because ref get assigned after the hook is called 55 | // in the future releases we are going to remove targetRef and force users to use ref returned by the hook 56 | if (targetRef) { 57 | setTimeout(() => { 58 | if (targetRef.current !== refElement) { 59 | setRefElement(targetRef.current); 60 | } 61 | }, 0); 62 | } 63 | 64 | // this is a memo that will be called every time the ref is changed 65 | // This proxy will properly call setState either when the ref is called as a function or when `.current` is set 66 | // we call setState inside to trigger rerender 67 | const refProxy: OnRefChangeType = React.useMemo( 68 | () => 69 | new Proxy( 70 | (node) => { 71 | if (node !== refElement) { 72 | setRefElement(node); 73 | } 74 | }, 75 | { 76 | get(target, prop) { 77 | if (prop === 'current') { 78 | return refElement; 79 | } 80 | return target[prop]; 81 | }, 82 | set(target, prop, value) { 83 | if (prop === 'current') { 84 | setRefElement(value); 85 | } else { 86 | target[prop] = value; 87 | } 88 | return true; 89 | }, 90 | }, 91 | ), 92 | [refElement], 93 | ); 94 | 95 | return { refProxy, refElement, setRefElement }; 96 | }; 97 | 98 | /** Calculates the dimensions of the element based on the current box model. 99 | * @see https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/The_box_model 100 | */ 101 | export const getDimensions = (entry: ResizeObserverEntry, box: ResizeObserverBoxOptions | undefined) => { 102 | // Value Border Padding Inner Content 103 | // --------------------------------------------------- 104 | // 'border-box' Yes Yes Yes 105 | // 'content-box' No No Yes 106 | // undefined No No? Yes 107 | 108 | if (box === 'border-box') { 109 | return { 110 | width: entry.borderBoxSize[0].inlineSize, 111 | height: entry.borderBoxSize[0].blockSize, 112 | }; 113 | } 114 | 115 | if (box === 'content-box') { 116 | return { 117 | width: entry.contentBoxSize[0].inlineSize, 118 | height: entry.contentBoxSize[0].blockSize, 119 | }; 120 | } 121 | 122 | return { 123 | width: entry.contentRect.width, 124 | height: entry.contentRect.height, 125 | }; 126 | }; 127 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "rootDir": "src", 4 | "declaration": true, 5 | "declarationDir": "build", 6 | "module": "esnext", 7 | "target": "es6", 8 | "lib": ["es6", "dom", "es2016", "es2017"], 9 | "sourceMap": true, 10 | "strict": true, 11 | "jsx": "react", 12 | "moduleResolution": "node", 13 | "allowSyntheticDefaultImports": true, 14 | "esModuleInterop": true, 15 | "noImplicitAny": false, 16 | "skipLibCheck": true, 17 | "inlineSources": true 18 | }, 19 | "include": ["src/**/*"], 20 | "exclude": ["node_modules", "build", "src/**/*.test.tsx"] 21 | } 22 | --------------------------------------------------------------------------------