├── example ├── src │ ├── react-app-env.d.ts │ ├── resources │ │ ├── frog.png │ │ ├── impo.png │ │ ├── bomber.png │ │ ├── smiley.png │ │ ├── smiley_idle.png │ │ ├── impo.json │ │ ├── smiley.json │ │ └── bomber.json │ ├── const.js │ ├── styles.css │ ├── setupTests.ts │ ├── index.tsx │ ├── reportWebVitals.ts │ ├── actors.tsx │ └── App.tsx ├── public │ ├── robots.txt │ ├── favicon.ico │ ├── logo192.png │ ├── logo512.png │ ├── manifest.json │ └── index.html ├── tsconfig.json ├── package.json └── README.md ├── banner.png ├── use-spritesheet ├── src │ ├── react-app-env.d.ts │ ├── aseprite.ts │ └── index.ts ├── tsconfig.json ├── LICENSE ├── package.json └── yarn.lock ├── package.json ├── .gitignore ├── .github └── workflows │ └── main.yml └── README.md /example/src/react-app-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bfollington/use-spritesheet/HEAD/banner.png -------------------------------------------------------------------------------- /use-spritesheet/src/react-app-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /example/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /example/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bfollington/use-spritesheet/HEAD/example/public/favicon.ico -------------------------------------------------------------------------------- /example/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bfollington/use-spritesheet/HEAD/example/public/logo192.png -------------------------------------------------------------------------------- /example/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bfollington/use-spritesheet/HEAD/example/public/logo512.png -------------------------------------------------------------------------------- /example/src/resources/frog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bfollington/use-spritesheet/HEAD/example/src/resources/frog.png -------------------------------------------------------------------------------- /example/src/resources/impo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bfollington/use-spritesheet/HEAD/example/src/resources/impo.png -------------------------------------------------------------------------------- /example/src/const.js: -------------------------------------------------------------------------------- 1 | export const DIMENSIONS = { 2 | width: window.innerWidth, 3 | height: window.innerHeight, 4 | } 5 | -------------------------------------------------------------------------------- /example/src/resources/bomber.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bfollington/use-spritesheet/HEAD/example/src/resources/bomber.png -------------------------------------------------------------------------------- /example/src/resources/smiley.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bfollington/use-spritesheet/HEAD/example/src/resources/smiley.png -------------------------------------------------------------------------------- /example/src/resources/smiley_idle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bfollington/use-spritesheet/HEAD/example/src/resources/smiley_idle.png -------------------------------------------------------------------------------- /example/src/styles.css: -------------------------------------------------------------------------------- 1 | html, 2 | body, 3 | #root { 4 | margin: 0; 5 | padding: 0; 6 | width: 100%; 7 | height: 100%; 8 | } 9 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "workspaces": ["example", "use-spritesheet"], 4 | "scripts": { 5 | "build": "cp README.md use-spritesheet/README.md && cd use-spritesheet && yarn build && cd ../example && yarn build" 6 | } 7 | } -------------------------------------------------------------------------------- /example/src/setupTests.ts: -------------------------------------------------------------------------------- 1 | // jest-dom adds custom jest matchers for asserting on DOM nodes. 2 | // allows you to do things like: 3 | // expect(element).toHaveTextContent(/react/i) 4 | // learn more: https://github.com/testing-library/jest-dom 5 | import '@testing-library/jest-dom'; 6 | -------------------------------------------------------------------------------- /example/src/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom' 3 | import App from './App' 4 | import './styles.css' 5 | 6 | ReactDOM.render( 7 | 8 | 9 | , 10 | document.getElementById('root') 11 | ) 12 | -------------------------------------------------------------------------------- /.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 | 25 | example/build 26 | use-spritesheet/lib 27 | use-spritesheet/README.md 28 | -------------------------------------------------------------------------------- /example/src/reportWebVitals.ts: -------------------------------------------------------------------------------- 1 | import { ReportHandler } from 'web-vitals'; 2 | 3 | const reportWebVitals = (onPerfEntry?: ReportHandler) => { 4 | if (onPerfEntry && onPerfEntry instanceof Function) { 5 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { 6 | getCLS(onPerfEntry); 7 | getFID(onPerfEntry); 8 | getFCP(onPerfEntry); 9 | getLCP(onPerfEntry); 10 | getTTFB(onPerfEntry); 11 | }); 12 | } 13 | }; 14 | 15 | export default reportWebVitals; 16 | -------------------------------------------------------------------------------- /example/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /example/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": [ 5 | "dom", 6 | "dom.iterable", 7 | "esnext" 8 | ], 9 | "allowJs": true, 10 | "skipLibCheck": true, 11 | "esModuleInterop": true, 12 | "allowSyntheticDefaultImports": true, 13 | "strict": true, 14 | "forceConsistentCasingInFileNames": true, 15 | "noFallthroughCasesInSwitch": true, 16 | "module": "esnext", 17 | "moduleResolution": "node", 18 | "resolveJsonModule": true, 19 | "isolatedModules": true, 20 | "noEmit": true, 21 | "jsx": "react-jsx" 22 | }, 23 | "include": [ 24 | "src" 25 | ] 26 | } 27 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build: 7 | 8 | runs-on: ubuntu-latest 9 | 10 | steps: 11 | - uses: actions/checkout@v1 12 | - name: Cache node modules 13 | uses: actions/cache@v1.0.0 14 | with: 15 | path: | 16 | node_modules 17 | example/node_modules 18 | use-spritesheet/node_modules 19 | key: ${{ runner.OS }}-build-${{ hashFiles('**/yarn.lock') }} 20 | restore-keys: | 21 | ${{ runner.OS }}-build-${{ env.cache-name }}- 22 | ${{ runner.OS }}-build- 23 | ${{ runner.OS }}- 24 | - name: Install 25 | run: yarn install 26 | - name: Build use-spritesheet 27 | working-directory: use-spritesheet 28 | run: yarn build 29 | - name: Build example 30 | working-directory: example 31 | run: yarn build 32 | -------------------------------------------------------------------------------- /use-spritesheet/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "lib", 4 | "module": "esnext", 5 | "target": "es5", 6 | "lib": ["dom", 7 | "dom.iterable", 8 | "esnext"], 9 | "sourceMap": true, 10 | "allowJs": false, 11 | "esModuleInterop": true, 12 | "jsx": "react-jsx", 13 | "declaration": true, 14 | "declarationDir": "./lib", 15 | "moduleResolution": "node", 16 | "forceConsistentCasingInFileNames": true, 17 | "noImplicitReturns": true, 18 | "noImplicitThis": true, 19 | "noImplicitAny": true, 20 | "strictNullChecks": true, 21 | "suppressImplicitAnyIndexErrors": true, 22 | "noUnusedLocals": true, 23 | "noUnusedParameters": true, 24 | "allowSyntheticDefaultImports": true, 25 | "incremental": true, 26 | "strict": true, 27 | "skipLibCheck": true, 28 | 29 | }, 30 | "include": ["src"], 31 | "exclude": ["node_modules", "build", "dist", "lib", "src/stories", "src/example", "**/*.test.ts", "**/*.test.tsx"] 32 | } 33 | 34 | -------------------------------------------------------------------------------- /use-spritesheet/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Ben Follington 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. 22 | -------------------------------------------------------------------------------- /example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "example", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@react-three/drei": "^7.22.7", 7 | "@react-three/fiber": "^7.0.19", 8 | "@types/jest": "^26.0.15", 9 | "@types/node": "^12.0.0", 10 | "@types/react": "^17.0.0", 11 | "@types/react-dom": "^17.0.0", 12 | "react": "^17.0.2", 13 | "react-dom": "^17.0.2", 14 | "react-scripts": "^4.0.3", 15 | "three": "0.134.0", 16 | "typescript": "^4.5.2", 17 | "use-spritesheet": "^0.1.0", 18 | "web-vitals": "^1.0.1" 19 | }, 20 | "scripts": { 21 | "start": "react-scripts start", 22 | "build": "react-scripts build", 23 | "test": "react-scripts test", 24 | "eject": "react-scripts eject" 25 | }, 26 | "eslintConfig": { 27 | "extends": [ 28 | "react-app", 29 | "react-app/jest" 30 | ] 31 | }, 32 | "browserslist": { 33 | "production": [ 34 | ">0.2%", 35 | "not dead", 36 | "not op_mini all" 37 | ], 38 | "development": [ 39 | "last 1 chrome version", 40 | "last 1 firefox version", 41 | "last 1 safari version" 42 | ] 43 | }, 44 | "devDependencies": { 45 | "@types/three": "^0.134.0" 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /use-spritesheet/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "use-spritesheet", 3 | "version": "0.1.2", 4 | "publishConfig": { 5 | "access": "public" 6 | }, 7 | "description": "Bringing spritesheets and aseprite intergration to react-three-fiber", 8 | "keywords": [ 9 | "spritesheet", 10 | "pixel art", 11 | "gamedev", 12 | "game development", 13 | "animarion", 14 | "aseprite", 15 | "libresprite", 16 | "react-three-fiber" 17 | ], 18 | "author": "bfollington", 19 | "license": "MIT", 20 | "repository": "bfollington/use-spritesheet", 21 | "main": "lib/index.js", 22 | "types": "lib/", 23 | "files": [ 24 | "lib" 25 | ], 26 | "scripts": { 27 | "build": "tsc -p tsconfig.json --outDir lib", 28 | "lint": "eslint src/ --ext .ts,.tsx", 29 | "format": "prettier --write \"src/**/*.{ts,tsx}\"" 30 | }, 31 | "dependencies": {}, 32 | "peerDependencies": { 33 | "@react-three/fiber": "^7.0.19", 34 | "react": "^15.0.0 || ^16.0.0 || ^17.0.0" 35 | }, 36 | "devDependencies": { 37 | "@react-three/fiber": "^7.0.19", 38 | "@types/jest": "^24.0.15", 39 | "@types/react": "^17.0.0", 40 | "@types/react-dom": "^17.0.0", 41 | "@types/three": "^0.134.0", 42 | "@typescript-eslint/parser": "^4.25.0", 43 | "eslint-plugin-react": "^7.23.2", 44 | "prettier": "^2.3.0", 45 | "typescript": "^4.3.2" 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /use-spritesheet/src/aseprite.ts: -------------------------------------------------------------------------------- 1 | export type AsepriteFrame = { 2 | frame: { 3 | x: number 4 | y: number 5 | w: number 6 | h: number 7 | } 8 | rotated: boolean 9 | trimmed: boolean 10 | spriteSourceSize: { 11 | x: number 12 | y: number 13 | w: number 14 | h: number 15 | } 16 | sourceSize: { 17 | w: number 18 | h: number 19 | } 20 | duration: number 21 | } 22 | 23 | export type AsepriteLayer = { 24 | name: string 25 | opacity: number 26 | blendMode: string 27 | } 28 | 29 | export type AsepriteFrameTag = { 30 | name: string 31 | from: number 32 | to: number 33 | direction: 'forward' | 'backward' 34 | } 35 | 36 | export type AsepriteJson = { 37 | frames: { [name: string]: AsepriteFrame } 38 | meta: { 39 | app: string 40 | version: string 41 | image: string 42 | format: string 43 | size: { 44 | w: number 45 | h: number 46 | } 47 | frameTags: AsepriteFrameTag[] 48 | layers: AsepriteLayer[] 49 | slices: unknown[] 50 | } 51 | } 52 | 53 | export function frameList(json: AsepriteJson): AsepriteFrame[] { 54 | return Object.values(json.frames) 55 | } 56 | 57 | export function getAnimationFrames(json: AsepriteJson, name: string): AsepriteFrame[] { 58 | const tag = json.meta.frameTags.find((t) => t.name === name) 59 | if (!tag) return [] 60 | 61 | const allFrames = frameList(json) 62 | return allFrames.slice(tag.from, tag.to) 63 | } 64 | -------------------------------------------------------------------------------- /example/src/actors.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { useAseprite } from "use-spritesheet/lib"; 3 | import { AsepriteJson } from "use-spritesheet/lib/aseprite"; 4 | import gremlinJson from "./resources/bomber.json"; 5 | import gremlin from "./resources/bomber.png"; 6 | import impoJson from "./resources/impo.json"; 7 | import impo from "./resources/impo.png"; 8 | import bardJson from "./resources/smiley.json"; 9 | import bard from "./resources/smiley.png"; 10 | 11 | export const GremlinAseprite = ({ 12 | position, 13 | animation = "idle", 14 | paused, 15 | }: any) => { 16 | const [texture] = useAseprite( 17 | gremlin, 18 | gremlinJson as AsepriteJson, 19 | animation, 20 | paused 21 | ); 22 | 23 | return ( 24 | 25 | 26 | 27 | ); 28 | }; 29 | 30 | export const ImpoAseprite = ({ position, animation = "idle", paused }: any) => { 31 | const [texture] = useAseprite( 32 | impo, 33 | impoJson as AsepriteJson, 34 | animation, 35 | paused 36 | ); 37 | 38 | return ( 39 | 40 | 41 | 42 | ); 43 | }; 44 | 45 | export const SmileyAseprite = ({ 46 | position, 47 | animation = "idle", 48 | paused, 49 | }: any) => { 50 | const [texture] = useAseprite( 51 | bard, 52 | bardJson as AsepriteJson, 53 | animation, 54 | paused 55 | ); 56 | 57 | return ( 58 | 59 | 60 | 61 | ); 62 | }; 63 | -------------------------------------------------------------------------------- /example/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | React App 28 | 29 | 30 | 31 |
32 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /example/README.md: -------------------------------------------------------------------------------- 1 | # Getting Started with Create React App 2 | 3 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). 4 | 5 | ## Available Scripts 6 | 7 | In the project directory, you can run: 8 | 9 | ### `yarn start` 10 | 11 | Runs the app in the development mode.\ 12 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser. 13 | 14 | The page will reload if you make edits.\ 15 | You will also see any lint errors in the console. 16 | 17 | ### `yarn test` 18 | 19 | Launches the test runner in the interactive watch mode.\ 20 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. 21 | 22 | ### `yarn build` 23 | 24 | Builds the app for production to the `build` folder.\ 25 | It correctly bundles React in production mode and optimizes the build for the best performance. 26 | 27 | The build is minified and the filenames include the hashes.\ 28 | Your app is ready to be deployed! 29 | 30 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. 31 | 32 | ### `yarn eject` 33 | 34 | **Note: this is a one-way operation. Once you `eject`, you can’t go back!** 35 | 36 | If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. 37 | 38 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. 39 | 40 | You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. 41 | 42 | ## Learn More 43 | 44 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). 45 | 46 | To learn React, check out the [React documentation](https://reactjs.org/). 47 | -------------------------------------------------------------------------------- /example/src/resources/impo.json: -------------------------------------------------------------------------------- 1 | { "frames": { 2 | "impo 0.ase": { 3 | "frame": { "x": 0, "y": 0, "w": 36, "h": 36 }, 4 | "rotated": false, 5 | "trimmed": false, 6 | "spriteSourceSize": { "x": 0, "y": 0, "w": 36, "h": 36 }, 7 | "sourceSize": { "w": 36, "h": 36 }, 8 | "duration": 100 9 | }, 10 | "impo 1.ase": { 11 | "frame": { "x": 36, "y": 0, "w": 36, "h": 36 }, 12 | "rotated": false, 13 | "trimmed": false, 14 | "spriteSourceSize": { "x": 0, "y": 0, "w": 36, "h": 36 }, 15 | "sourceSize": { "w": 36, "h": 36 }, 16 | "duration": 100 17 | }, 18 | "impo 2.ase": { 19 | "frame": { "x": 72, "y": 0, "w": 36, "h": 36 }, 20 | "rotated": false, 21 | "trimmed": false, 22 | "spriteSourceSize": { "x": 0, "y": 0, "w": 36, "h": 36 }, 23 | "sourceSize": { "w": 36, "h": 36 }, 24 | "duration": 100 25 | }, 26 | "impo 3.ase": { 27 | "frame": { "x": 108, "y": 0, "w": 36, "h": 36 }, 28 | "rotated": false, 29 | "trimmed": false, 30 | "spriteSourceSize": { "x": 0, "y": 0, "w": 36, "h": 36 }, 31 | "sourceSize": { "w": 36, "h": 36 }, 32 | "duration": 100 33 | }, 34 | "impo 4.ase": { 35 | "frame": { "x": 0, "y": 36, "w": 36, "h": 36 }, 36 | "rotated": false, 37 | "trimmed": false, 38 | "spriteSourceSize": { "x": 0, "y": 0, "w": 36, "h": 36 }, 39 | "sourceSize": { "w": 36, "h": 36 }, 40 | "duration": 100 41 | }, 42 | "impo 5.ase": { 43 | "frame": { "x": 36, "y": 36, "w": 36, "h": 36 }, 44 | "rotated": false, 45 | "trimmed": false, 46 | "spriteSourceSize": { "x": 0, "y": 0, "w": 36, "h": 36 }, 47 | "sourceSize": { "w": 36, "h": 36 }, 48 | "duration": 100 49 | }, 50 | "impo 6.ase": { 51 | "frame": { "x": 72, "y": 36, "w": 36, "h": 36 }, 52 | "rotated": false, 53 | "trimmed": false, 54 | "spriteSourceSize": { "x": 0, "y": 0, "w": 36, "h": 36 }, 55 | "sourceSize": { "w": 36, "h": 36 }, 56 | "duration": 100 57 | }, 58 | "impo 7.ase": { 59 | "frame": { "x": 108, "y": 36, "w": 36, "h": 36 }, 60 | "rotated": false, 61 | "trimmed": false, 62 | "spriteSourceSize": { "x": 0, "y": 0, "w": 36, "h": 36 }, 63 | "sourceSize": { "w": 36, "h": 36 }, 64 | "duration": 100 65 | } 66 | }, 67 | "meta": { 68 | "app": "http://www.aseprite.org/", 69 | "version": "1.2.15", 70 | "image": "impo.png", 71 | "format": "RGBA8888", 72 | "size": { "w": 144, "h": 72 }, 73 | "scale": "1", 74 | "frameTags": [ 75 | { "name": "idle", "from": 0, "to": 7, "direction": "forward" } 76 | ], 77 | "layers": [ 78 | { "name": "Layer", "opacity": 255, "blendMode": "normal" } 79 | ], 80 | "slices": [ 81 | ] 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /example/src/App.tsx: -------------------------------------------------------------------------------- 1 | import { OrbitControls } from "@react-three/drei"; 2 | import { Canvas } from "@react-three/fiber"; 3 | import React, { Suspense, useState } from "react"; 4 | import { 5 | usePixelTexture, 6 | useSpritesheet, 7 | useSpritesheetAnimation, 8 | } from "use-spritesheet/lib"; 9 | import { GremlinAseprite, ImpoAseprite, SmileyAseprite } from "./actors"; 10 | import frogSrc from "./resources/frog.png"; 11 | import smileySrc from "./resources/smiley_idle.png"; 12 | import impSrc from "./resources/impo.png"; 13 | 14 | const PixelTexture = () => { 15 | const tex = usePixelTexture(frogSrc); 16 | 17 | return ( 18 | 19 | 20 | 21 | ); 22 | }; 23 | 24 | const SpritesheetSingleFrame = () => { 25 | const tex = useSpritesheet(smileySrc, 1, 8, 2); 26 | 27 | return ( 28 | 29 | 30 | 31 | ); 32 | }; 33 | 34 | const SpritesheetAnimation = ({ paused }: { paused: boolean }) => { 35 | const [tex] = useSpritesheetAnimation(impSrc, 100, 2, 4, paused); 36 | 37 | return ( 38 | 39 | 40 | 41 | ); 42 | }; 43 | 44 | const AsepriteImports = ({ 45 | paused, 46 | animation, 47 | }: { 48 | paused: boolean; 49 | animation: string; 50 | }) => { 51 | return ( 52 | 53 | 58 | 59 | 60 | 61 | ); 62 | }; 63 | 64 | export default function App() { 65 | const [paused, setPaused] = useState(false); 66 | const [animation, setAnimation] = useState("idle"); 67 | 68 | return ( 69 | <> 70 | 71 | 72 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 91 | 92 | 93 | ); 94 | } 95 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | [![Version](https://img.shields.io/npm/v/use-spritesheet?style=flat&colorA=000000&colorB=000000)](https://npmjs.com/package/use-spritesheet) 5 | [![Twitter](https://img.shields.io/twitter/follow/vivavolt?label=%40vivavolt&style=flat&colorA=000000&colorB=000000&logo=twitter&logoColor=000000)](https://twitter.com/vivavolt) 6 | [![ETH](https://img.shields.io/badge/ETH-f5f5f5?style=flat&colorA=000000&colorB=000000)](https://blockchain.com/eth/address/0x981e493b795A7a28c43Bf8d7a8E125C419435Fa7) 7 | ![Language](https://img.shields.io/github/languages/top/bfollington/use-spritesheet?style=flat&colorA=000000&colorB=000000) 8 | ![License](https://img.shields.io/github/license/bfollington/use-spritesheet?style=flat&colorA=000000&colorB=000000) 9 | ![Bundle Size](https://img.shields.io/bundlephobia/min/use-spritesheet?style=flat&colorA=000000&colorB=000000) 10 | [![Build](https://github.com/bfollington/use-spritesheet/workflows/Build/badge.svg)](https://github.com/bfollington/use-spritesheet/actions?query=workflow%3A%22Build%22) 11 | 12 |

use-spritesheet is a set of hooks to use pixel art, spritesheets and Aseprite with react-three-fiber in just a few lines of code.

13 | 14 |

👁  Live Demo (source in example)

15 | 16 | # Installation 17 | ``` 18 | npm i use-spritesheet 19 | ``` 20 | 21 | ``` 22 | yarn add use-spritesheet 23 | ``` 24 | 25 | # API 26 | 27 | # `usePixelTexture` 28 | 29 | A small time-saver if you want crisp pixels on a texture, sets the texture filter to nearest-neighbour and (optionally) enables wrapping. 30 | 31 | ```tsx 32 | import frogSrc from './resources/frog.png'; 33 | 34 | const PixelTexture = () => { 35 | const tex = usePixelTexture(frogSrc); 36 | 37 | return ( 38 | 39 | 40 | 41 | ); 42 | }; 43 | ``` 44 | 45 | # `useSpritesheet` 46 | 47 | Perfect for when you have a spritesheet and want to slice out a single frame to display statically (such as an icon from a icon set). 48 | 49 | ```tsx 50 | import smileySrc from './resources/smiley_idle.png'; 51 | 52 | const SpritesheetSingleFrame = () => { 53 | // 1 row 54 | // 8 columns 55 | // display frame index 2 56 | const tex = useSpritesheet(smileySrc, 1, 8, 2); 57 | 58 | return ( 59 | 60 | 61 | 62 | ); 63 | }; 64 | ``` 65 | 66 | # `useSpritesheetAnimation` 67 | 68 | Play a series of frames that are baked into a single texture, ideal for particle effects. 69 | 70 | ```tsx 71 | import impSrc from './resources/impo.png'; 72 | 73 | const SpritesheetAnimation = ({ paused }: { paused: boolean }) => { 74 | // 100ms per frame 75 | // 2 rows 76 | // 4 columns 77 | const [tex] = useSpritesheetAnimation(impSrc, 100, 2, 4, paused); 78 | 79 | return ( 80 | 81 | 82 | 83 | ); 84 | }; 85 | ``` 86 | 87 | # `useAsepriteAnimation` 88 | 89 | Import a texture + `json` file exported from [Aseprite](https://www.aseprite.org/), select which animation to play and control playback speed. 90 | 91 | ```tsx 92 | import gremlin from "./resources/bomber.png"; 93 | import gremlinJson from "./resources/bomber.json"; 94 | 95 | export const AsepriteAnimation = ({ 96 | animation = "idle", 97 | paused, 98 | }: any) => { 99 | const [texture] = useAseprite( 100 | gremlin, 101 | gremlinJson as AsepriteJson, 102 | animation, // Changing this parameter automatically switches animations 103 | paused 104 | ); 105 | 106 | return ( 107 | 108 | 109 | 110 | ); 111 | }; 112 | 113 | ``` 114 | 115 | ## Running this repo 116 | 117 | We make use of `yarn` [workspaces](https://classic.yarnpkg.com/en/docs/workspaces/) to develop the example alongside the library itself. 118 | 119 | ### Bootstrap 120 | 121 | ``` 122 | yarn 123 | ``` 124 | 125 | ### Running the examples 126 | 127 | ``` 128 | cd use-spritesheet 129 | yarn build 130 | cd ../example 131 | yarn start 132 | ``` 133 | -------------------------------------------------------------------------------- /use-spritesheet/src/index.ts: -------------------------------------------------------------------------------- 1 | import { useFrame, useLoader } from "@react-three/fiber"; 2 | import { MutableRefObject, useEffect, useMemo, useRef } from "react"; 3 | import * as THREE from "three"; 4 | import { 5 | AsepriteFrame, 6 | AsepriteJson, 7 | frameList, 8 | getAnimationFrames, 9 | } from "./aseprite"; 10 | 11 | /** 12 | * Allow control of speed 13 | * Callback when animation finishes 14 | * 15 | * usePixelTexture -> nearest neighbour 16 | * useSpritesheet -> slice up image, allow indexing 17 | * useSpritesheetAnimation -> play back animation using speed param 18 | * useAseprite -> slice and play animations using aseprite data 19 | */ 20 | 21 | export function usePixelTexture(src: string, wrap: boolean = false) { 22 | const tex: THREE.Texture = useLoader(THREE.TextureLoader, src); 23 | 24 | if (wrap) { 25 | tex.wrapS = tex.wrapT = THREE.RepeatWrapping; 26 | } 27 | 28 | tex.minFilter = THREE.NearestFilter; 29 | tex.magFilter = THREE.NearestFilter; 30 | tex.needsUpdate = true; 31 | 32 | return tex; 33 | } 34 | 35 | export function useSpritesheet( 36 | src: string, 37 | rows: number, 38 | columns: number, 39 | currentFrameIndex: number 40 | ): THREE.Texture { 41 | console.assert(Number.isInteger(rows)); 42 | console.assert(Number.isInteger(columns)); 43 | console.assert(Number.isInteger(currentFrameIndex)); 44 | console.assert(rows >= 1); 45 | console.assert(columns >= 1); 46 | console.assert(currentFrameIndex >= 0); 47 | 48 | const texture = useLoader(THREE.TextureLoader, src); 49 | texture.minFilter = THREE.NearestFilter; 50 | texture.magFilter = THREE.NearestFilter; 51 | texture.repeat.set(1 / columns, 1 / rows); 52 | 53 | const totalFrames = rows * columns; // TODO: or override? 54 | 55 | useFrame(() => { 56 | const index = currentFrameIndex % totalFrames; 57 | texture.offset.x = (index % columns) / columns; 58 | texture.offset.y = Math.floor(index / columns) / rows; 59 | }); 60 | 61 | return texture; 62 | } 63 | 64 | export function useSpritesheetAnimation( 65 | src: string, 66 | frameDuration: number, 67 | rows: number, 68 | columns: number, 69 | paused: boolean = false 70 | ): [THREE.Texture, MutableRefObject, MutableRefObject] { 71 | console.assert(Number.isInteger(rows)); 72 | console.assert(Number.isInteger(columns)); 73 | console.assert(rows >= 1); 74 | console.assert(columns >= 1); 75 | 76 | const texture = useLoader(THREE.TextureLoader, src); 77 | 78 | const tex = useMemo(() => { 79 | // We'll be animating this texture independently to all other instances, so clone it 80 | const tex = texture.clone(); 81 | tex.minFilter = THREE.NearestFilter; 82 | tex.magFilter = THREE.NearestFilter; 83 | tex.repeat.set(1 / columns, 1 / rows); 84 | tex.needsUpdate = true; 85 | 86 | return tex; 87 | }, [texture, columns, rows]); 88 | 89 | const t = useRef(0); 90 | const index = useRef(0); 91 | const totalFrames = rows * columns; 92 | 93 | useFrame((_, delta) => { 94 | if (!paused) { 95 | t.current += delta * 1000; 96 | 97 | if (t.current >= frameDuration) { 98 | index.current += 1; 99 | if (index.current >= totalFrames) { 100 | index.current = 0; 101 | } 102 | 103 | t.current = 0; 104 | } 105 | } 106 | 107 | // split index into x and y components 108 | tex.offset.x = (index.current % columns) / columns; 109 | tex.offset.y = Math.floor(index.current / columns) / rows; 110 | }); 111 | 112 | return [tex, index, t]; 113 | } 114 | 115 | /** 116 | * Load an exported set of animations from Asesprite and contol playback 117 | * @param src path to spritesheet texture; 118 | * @param json json data exported from aseprite 119 | * @param currentAnimation the name of the current animation 120 | * @param paused 121 | * @returns [texture, ref internalTimer, ref currentFrameIndex] 122 | */ 123 | export function useAseprite( 124 | src: string, 125 | json: AsepriteJson, 126 | currentAnimation: string | null = null, 127 | paused: boolean = false 128 | ): [THREE.Texture, MutableRefObject, MutableRefObject] { 129 | const texture: THREE.Texture = useLoader(THREE.TextureLoader, src); 130 | 131 | const tex = useMemo(() => { 132 | // We'll be animating this texture independently to all other instances, so clone it 133 | const tex = texture.clone(); 134 | 135 | tex.wrapS = tex.wrapT = THREE.RepeatWrapping; 136 | tex.minFilter = THREE.NearestFilter; 137 | tex.magFilter = THREE.NearestFilter; 138 | tex.needsUpdate = true; 139 | return tex; 140 | }, [texture]); 141 | 142 | const frames: MutableRefObject = useRef([]); 143 | 144 | const w = json.meta.size.w; 145 | const h = json.meta.size.h; 146 | 147 | const t = useRef(0); 148 | const index = useRef(0); 149 | 150 | useEffect(() => { 151 | t.current = 0; 152 | index.current = 0; 153 | 154 | if (currentAnimation) { 155 | frames.current = getAnimationFrames(json, currentAnimation); 156 | } else { 157 | frames.current = frameList(json); 158 | } 159 | }, [currentAnimation, texture, json]); 160 | 161 | useFrame((_, delta) => { 162 | const f = frames.current[index.current]; 163 | if (!f) return; 164 | 165 | tex.repeat.set(f.frame.w / w, f.frame.h / h); 166 | 167 | if (!paused) { 168 | t.current += delta * 1000; 169 | 170 | if (t.current >= f.duration) { 171 | index.current += 1; 172 | if (index.current >= frames.current.length) { 173 | index.current = 0; 174 | } 175 | 176 | t.current = 0; 177 | } 178 | } 179 | 180 | tex.offset.x = f.frame.x / w; 181 | tex.offset.y = f.frame.y / h; 182 | }); 183 | 184 | return [tex, index, t]; 185 | } 186 | -------------------------------------------------------------------------------- /example/src/resources/smiley.json: -------------------------------------------------------------------------------- 1 | { 2 | "frames": { 3 | "smiley 0.ase": { 4 | "frame": { "x": 0, "y": 0, "w": 36, "h": 36 }, 5 | "rotated": false, 6 | "trimmed": false, 7 | "spriteSourceSize": { "x": 0, "y": 0, "w": 36, "h": 36 }, 8 | "sourceSize": { "w": 36, "h": 36 }, 9 | "duration": 100 10 | }, 11 | "smiley 1.ase": { 12 | "frame": { "x": 36, "y": 0, "w": 36, "h": 36 }, 13 | "rotated": false, 14 | "trimmed": false, 15 | "spriteSourceSize": { "x": 0, "y": 0, "w": 36, "h": 36 }, 16 | "sourceSize": { "w": 36, "h": 36 }, 17 | "duration": 100 18 | }, 19 | "smiley 2.ase": { 20 | "frame": { "x": 72, "y": 0, "w": 36, "h": 36 }, 21 | "rotated": false, 22 | "trimmed": false, 23 | "spriteSourceSize": { "x": 0, "y": 0, "w": 36, "h": 36 }, 24 | "sourceSize": { "w": 36, "h": 36 }, 25 | "duration": 100 26 | }, 27 | "smiley 3.ase": { 28 | "frame": { "x": 108, "y": 0, "w": 36, "h": 36 }, 29 | "rotated": false, 30 | "trimmed": false, 31 | "spriteSourceSize": { "x": 0, "y": 0, "w": 36, "h": 36 }, 32 | "sourceSize": { "w": 36, "h": 36 }, 33 | "duration": 100 34 | }, 35 | "smiley 4.ase": { 36 | "frame": { "x": 144, "y": 0, "w": 36, "h": 36 }, 37 | "rotated": false, 38 | "trimmed": false, 39 | "spriteSourceSize": { "x": 0, "y": 0, "w": 36, "h": 36 }, 40 | "sourceSize": { "w": 36, "h": 36 }, 41 | "duration": 100 42 | }, 43 | "smiley 5.ase": { 44 | "frame": { "x": 180, "y": 0, "w": 36, "h": 36 }, 45 | "rotated": false, 46 | "trimmed": false, 47 | "spriteSourceSize": { "x": 0, "y": 0, "w": 36, "h": 36 }, 48 | "sourceSize": { "w": 36, "h": 36 }, 49 | "duration": 100 50 | }, 51 | "smiley 6.ase": { 52 | "frame": { "x": 216, "y": 0, "w": 36, "h": 36 }, 53 | "rotated": false, 54 | "trimmed": false, 55 | "spriteSourceSize": { "x": 0, "y": 0, "w": 36, "h": 36 }, 56 | "sourceSize": { "w": 36, "h": 36 }, 57 | "duration": 100 58 | }, 59 | "smiley 7.ase": { 60 | "frame": { "x": 252, "y": 0, "w": 36, "h": 36 }, 61 | "rotated": false, 62 | "trimmed": false, 63 | "spriteSourceSize": { "x": 0, "y": 0, "w": 36, "h": 36 }, 64 | "sourceSize": { "w": 36, "h": 36 }, 65 | "duration": 100 66 | }, 67 | "smiley 8.ase": { 68 | "frame": { "x": 288, "y": 0, "w": 36, "h": 36 }, 69 | "rotated": false, 70 | "trimmed": false, 71 | "spriteSourceSize": { "x": 0, "y": 0, "w": 36, "h": 36 }, 72 | "sourceSize": { "w": 36, "h": 36 }, 73 | "duration": 100 74 | }, 75 | "smiley 9.ase": { 76 | "frame": { "x": 324, "y": 0, "w": 36, "h": 36 }, 77 | "rotated": false, 78 | "trimmed": false, 79 | "spriteSourceSize": { "x": 0, "y": 0, "w": 36, "h": 36 }, 80 | "sourceSize": { "w": 36, "h": 36 }, 81 | "duration": 100 82 | }, 83 | "smiley 10.ase": { 84 | "frame": { "x": 360, "y": 0, "w": 36, "h": 36 }, 85 | "rotated": false, 86 | "trimmed": false, 87 | "spriteSourceSize": { "x": 0, "y": 0, "w": 36, "h": 36 }, 88 | "sourceSize": { "w": 36, "h": 36 }, 89 | "duration": 100 90 | }, 91 | "smiley 11.ase": { 92 | "frame": { "x": 396, "y": 0, "w": 36, "h": 36 }, 93 | "rotated": false, 94 | "trimmed": false, 95 | "spriteSourceSize": { "x": 0, "y": 0, "w": 36, "h": 36 }, 96 | "sourceSize": { "w": 36, "h": 36 }, 97 | "duration": 100 98 | }, 99 | "smiley 12.ase": { 100 | "frame": { "x": 432, "y": 0, "w": 36, "h": 36 }, 101 | "rotated": false, 102 | "trimmed": false, 103 | "spriteSourceSize": { "x": 0, "y": 0, "w": 36, "h": 36 }, 104 | "sourceSize": { "w": 36, "h": 36 }, 105 | "duration": 100 106 | }, 107 | "smiley 13.ase": { 108 | "frame": { "x": 468, "y": 0, "w": 36, "h": 36 }, 109 | "rotated": false, 110 | "trimmed": false, 111 | "spriteSourceSize": { "x": 0, "y": 0, "w": 36, "h": 36 }, 112 | "sourceSize": { "w": 36, "h": 36 }, 113 | "duration": 100 114 | }, 115 | "smiley 14.ase": { 116 | "frame": { "x": 504, "y": 0, "w": 36, "h": 36 }, 117 | "rotated": false, 118 | "trimmed": false, 119 | "spriteSourceSize": { "x": 0, "y": 0, "w": 36, "h": 36 }, 120 | "sourceSize": { "w": 36, "h": 36 }, 121 | "duration": 100 122 | }, 123 | "smiley 15.ase": { 124 | "frame": { "x": 540, "y": 0, "w": 36, "h": 36 }, 125 | "rotated": false, 126 | "trimmed": false, 127 | "spriteSourceSize": { "x": 0, "y": 0, "w": 36, "h": 36 }, 128 | "sourceSize": { "w": 36, "h": 36 }, 129 | "duration": 100 130 | }, 131 | "smiley 16.ase": { 132 | "frame": { "x": 576, "y": 0, "w": 36, "h": 36 }, 133 | "rotated": false, 134 | "trimmed": false, 135 | "spriteSourceSize": { "x": 0, "y": 0, "w": 36, "h": 36 }, 136 | "sourceSize": { "w": 36, "h": 36 }, 137 | "duration": 100 138 | }, 139 | "smiley 17.ase": { 140 | "frame": { "x": 612, "y": 0, "w": 36, "h": 36 }, 141 | "rotated": false, 142 | "trimmed": false, 143 | "spriteSourceSize": { "x": 0, "y": 0, "w": 36, "h": 36 }, 144 | "sourceSize": { "w": 36, "h": 36 }, 145 | "duration": 100 146 | } 147 | }, 148 | "meta": { 149 | "app": "http://www.aseprite.org/", 150 | "version": "1.2.15", 151 | "image": "smiley.png", 152 | "format": "RGBA8888", 153 | "size": { "w": 648, "h": 36 }, 154 | "scale": "1", 155 | "frameTags": [ 156 | { "name": "idle", "from": 0, "to": 7, "direction": "forward" }, 157 | { "name": "wink", "from": 8, "to": 17, "direction": "forward" } 158 | ], 159 | "layers": [ 160 | { "name": "Layer", "opacity": 255, "blendMode": "normal" }, 161 | { "name": "Layer 1", "opacity": 255, "blendMode": "normal" } 162 | ], 163 | "slices": [] 164 | } 165 | } 166 | -------------------------------------------------------------------------------- /example/src/resources/bomber.json: -------------------------------------------------------------------------------- 1 | { "frames": { 2 | "bomber 0.aseprite": { 3 | "frame": { "x": 0, "y": 0, "w": 40, "h": 40 }, 4 | "rotated": false, 5 | "trimmed": false, 6 | "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, 7 | "sourceSize": { "w": 40, "h": 40 }, 8 | "duration": 100 9 | }, 10 | "bomber 1.aseprite": { 11 | "frame": { "x": 40, "y": 0, "w": 40, "h": 40 }, 12 | "rotated": false, 13 | "trimmed": false, 14 | "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, 15 | "sourceSize": { "w": 40, "h": 40 }, 16 | "duration": 100 17 | }, 18 | "bomber 2.aseprite": { 19 | "frame": { "x": 80, "y": 0, "w": 40, "h": 40 }, 20 | "rotated": false, 21 | "trimmed": false, 22 | "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, 23 | "sourceSize": { "w": 40, "h": 40 }, 24 | "duration": 100 25 | }, 26 | "bomber 3.aseprite": { 27 | "frame": { "x": 120, "y": 0, "w": 40, "h": 40 }, 28 | "rotated": false, 29 | "trimmed": false, 30 | "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, 31 | "sourceSize": { "w": 40, "h": 40 }, 32 | "duration": 100 33 | }, 34 | "bomber 4.aseprite": { 35 | "frame": { "x": 160, "y": 0, "w": 40, "h": 40 }, 36 | "rotated": false, 37 | "trimmed": false, 38 | "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, 39 | "sourceSize": { "w": 40, "h": 40 }, 40 | "duration": 100 41 | }, 42 | "bomber 5.aseprite": { 43 | "frame": { "x": 200, "y": 0, "w": 40, "h": 40 }, 44 | "rotated": false, 45 | "trimmed": false, 46 | "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, 47 | "sourceSize": { "w": 40, "h": 40 }, 48 | "duration": 100 49 | }, 50 | "bomber 6.aseprite": { 51 | "frame": { "x": 240, "y": 0, "w": 40, "h": 40 }, 52 | "rotated": false, 53 | "trimmed": false, 54 | "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, 55 | "sourceSize": { "w": 40, "h": 40 }, 56 | "duration": 100 57 | }, 58 | "bomber 7.aseprite": { 59 | "frame": { "x": 280, "y": 0, "w": 40, "h": 40 }, 60 | "rotated": false, 61 | "trimmed": false, 62 | "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, 63 | "sourceSize": { "w": 40, "h": 40 }, 64 | "duration": 100 65 | }, 66 | "bomber 8.aseprite": { 67 | "frame": { "x": 320, "y": 0, "w": 40, "h": 40 }, 68 | "rotated": false, 69 | "trimmed": false, 70 | "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, 71 | "sourceSize": { "w": 40, "h": 40 }, 72 | "duration": 50 73 | }, 74 | "bomber 9.aseprite": { 75 | "frame": { "x": 360, "y": 0, "w": 40, "h": 40 }, 76 | "rotated": false, 77 | "trimmed": false, 78 | "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, 79 | "sourceSize": { "w": 40, "h": 40 }, 80 | "duration": 50 81 | }, 82 | "bomber 10.aseprite": { 83 | "frame": { "x": 400, "y": 0, "w": 40, "h": 40 }, 84 | "rotated": false, 85 | "trimmed": false, 86 | "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, 87 | "sourceSize": { "w": 40, "h": 40 }, 88 | "duration": 50 89 | }, 90 | "bomber 11.aseprite": { 91 | "frame": { "x": 440, "y": 0, "w": 40, "h": 40 }, 92 | "rotated": false, 93 | "trimmed": false, 94 | "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, 95 | "sourceSize": { "w": 40, "h": 40 }, 96 | "duration": 50 97 | }, 98 | "bomber 12.aseprite": { 99 | "frame": { "x": 480, "y": 0, "w": 40, "h": 40 }, 100 | "rotated": false, 101 | "trimmed": false, 102 | "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, 103 | "sourceSize": { "w": 40, "h": 40 }, 104 | "duration": 50 105 | }, 106 | "bomber 13.aseprite": { 107 | "frame": { "x": 520, "y": 0, "w": 40, "h": 40 }, 108 | "rotated": false, 109 | "trimmed": false, 110 | "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, 111 | "sourceSize": { "w": 40, "h": 40 }, 112 | "duration": 50 113 | }, 114 | "bomber 14.aseprite": { 115 | "frame": { "x": 560, "y": 0, "w": 40, "h": 40 }, 116 | "rotated": false, 117 | "trimmed": false, 118 | "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, 119 | "sourceSize": { "w": 40, "h": 40 }, 120 | "duration": 50 121 | }, 122 | "bomber 15.aseprite": { 123 | "frame": { "x": 600, "y": 0, "w": 40, "h": 40 }, 124 | "rotated": false, 125 | "trimmed": false, 126 | "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, 127 | "sourceSize": { "w": 40, "h": 40 }, 128 | "duration": 50 129 | }, 130 | "bomber 16.aseprite": { 131 | "frame": { "x": 640, "y": 0, "w": 40, "h": 40 }, 132 | "rotated": false, 133 | "trimmed": false, 134 | "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, 135 | "sourceSize": { "w": 40, "h": 40 }, 136 | "duration": 75 137 | }, 138 | "bomber 17.aseprite": { 139 | "frame": { "x": 680, "y": 0, "w": 40, "h": 40 }, 140 | "rotated": false, 141 | "trimmed": false, 142 | "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, 143 | "sourceSize": { "w": 40, "h": 40 }, 144 | "duration": 75 145 | }, 146 | "bomber 18.aseprite": { 147 | "frame": { "x": 720, "y": 0, "w": 40, "h": 40 }, 148 | "rotated": false, 149 | "trimmed": false, 150 | "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, 151 | "sourceSize": { "w": 40, "h": 40 }, 152 | "duration": 75 153 | }, 154 | "bomber 19.aseprite": { 155 | "frame": { "x": 760, "y": 0, "w": 40, "h": 40 }, 156 | "rotated": false, 157 | "trimmed": false, 158 | "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, 159 | "sourceSize": { "w": 40, "h": 40 }, 160 | "duration": 75 161 | }, 162 | "bomber 20.aseprite": { 163 | "frame": { "x": 800, "y": 0, "w": 40, "h": 40 }, 164 | "rotated": false, 165 | "trimmed": false, 166 | "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, 167 | "sourceSize": { "w": 40, "h": 40 }, 168 | "duration": 75 169 | }, 170 | "bomber 21.aseprite": { 171 | "frame": { "x": 840, "y": 0, "w": 40, "h": 40 }, 172 | "rotated": false, 173 | "trimmed": false, 174 | "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, 175 | "sourceSize": { "w": 40, "h": 40 }, 176 | "duration": 75 177 | }, 178 | "bomber 22.aseprite": { 179 | "frame": { "x": 880, "y": 0, "w": 40, "h": 40 }, 180 | "rotated": false, 181 | "trimmed": false, 182 | "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, 183 | "sourceSize": { "w": 40, "h": 40 }, 184 | "duration": 100 185 | }, 186 | "bomber 23.aseprite": { 187 | "frame": { "x": 920, "y": 0, "w": 40, "h": 40 }, 188 | "rotated": false, 189 | "trimmed": false, 190 | "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, 191 | "sourceSize": { "w": 40, "h": 40 }, 192 | "duration": 100 193 | } 194 | }, 195 | "meta": { 196 | "app": "http://www.aseprite.org/", 197 | "version": "1.2.15", 198 | "image": "bomber.png", 199 | "format": "RGBA8888", 200 | "size": { "w": 960, "h": 40 }, 201 | "scale": "1", 202 | "frameTags": [ 203 | { "name": "idle", "from": 0, "to": 5, "direction": "forward" }, 204 | { "name": "boom", "from": 6, "to": 23, "direction": "forward" } 205 | ], 206 | "layers": [ 207 | { "name": "Layer 1", "opacity": 255, "blendMode": "normal" } 208 | ], 209 | "slices": [ 210 | ] 211 | } 212 | } 213 | -------------------------------------------------------------------------------- /use-spritesheet/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/runtime@^7.13.10": 6 | version "7.16.3" 7 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5" 8 | integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ== 9 | dependencies: 10 | regenerator-runtime "^0.13.4" 11 | 12 | "@jest/types@^24.9.0": 13 | version "24.9.0" 14 | resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" 15 | integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== 16 | dependencies: 17 | "@types/istanbul-lib-coverage" "^2.0.0" 18 | "@types/istanbul-reports" "^1.1.1" 19 | "@types/yargs" "^13.0.0" 20 | 21 | "@nodelib/fs.scandir@2.1.4": 22 | version "2.1.4" 23 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" 24 | integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== 25 | dependencies: 26 | "@nodelib/fs.stat" "2.0.4" 27 | run-parallel "^1.1.9" 28 | 29 | "@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": 30 | version "2.0.4" 31 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" 32 | integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== 33 | 34 | "@nodelib/fs.walk@^1.2.3": 35 | version "1.2.6" 36 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" 37 | integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== 38 | dependencies: 39 | "@nodelib/fs.scandir" "2.1.4" 40 | fastq "^1.6.0" 41 | 42 | "@react-three/fiber@^7.0.19": 43 | version "7.0.19" 44 | resolved "https://registry.yarnpkg.com/@react-three/fiber/-/fiber-7.0.19.tgz#28a2eb2c9a93b75dfde227c4cbd77882f2dad9e8" 45 | integrity sha512-R3/HTMJjjYhJXJu3U3JJ8bmLxv0X+y6/jNBkHm+wSWTFbXkWnKYzWbHkMVMzVesKyyQK1HBP6ZoJVNG+EzM9PA== 46 | dependencies: 47 | "@babel/runtime" "^7.13.10" 48 | react-merge-refs "^1.1.0" 49 | react-reconciler "^0.26.2" 50 | react-three-fiber "0.0.0-deprecated" 51 | react-use-measure "^2.0.4" 52 | resize-observer-polyfill "^1.5.1" 53 | scheduler "^0.20.2" 54 | use-asset "^1.0.4" 55 | utility-types "^3.10.0" 56 | zustand "^3.5.1" 57 | 58 | "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": 59 | version "2.0.1" 60 | resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" 61 | integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== 62 | 63 | "@types/istanbul-lib-report@*": 64 | version "1.1.1" 65 | resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#e5471e7fa33c61358dd38426189c037a58433b8c" 66 | integrity sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg== 67 | dependencies: 68 | "@types/istanbul-lib-coverage" "*" 69 | 70 | "@types/istanbul-reports@^1.1.1": 71 | version "1.1.1" 72 | resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" 73 | integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== 74 | dependencies: 75 | "@types/istanbul-lib-coverage" "*" 76 | "@types/istanbul-lib-report" "*" 77 | 78 | "@types/jest@^24.0.15": 79 | version "24.0.23" 80 | resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.23.tgz#046f8e2ade026fe831623e361a36b6fb9a4463e4" 81 | integrity sha512-L7MBvwfNpe7yVPTXLn32df/EK+AMBFAFvZrRuArGs7npEWnlziUXK+5GMIUTI4NIuwok3XibsjXCs5HxviYXjg== 82 | dependencies: 83 | jest-diff "^24.3.0" 84 | 85 | "@types/prop-types@*": 86 | version "15.7.3" 87 | resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" 88 | integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== 89 | 90 | "@types/react-dom@^17.0.0": 91 | version "17.0.5" 92 | resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.5.tgz#df44eed5b8d9e0b13bb0cd38e0ea6572a1231227" 93 | integrity sha512-ikqukEhH4H9gr4iJCmQVNzTB307kROe3XFfHAOTxOXPOw7lAoEXnM5KWTkzeANGL5Ce6ABfiMl/zJBYNi7ObmQ== 94 | dependencies: 95 | "@types/react" "*" 96 | 97 | "@types/react@*": 98 | version "16.9.11" 99 | resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.11.tgz#70e0b7ad79058a7842f25ccf2999807076ada120" 100 | integrity sha512-UBT4GZ3PokTXSWmdgC/GeCGEJXE5ofWyibCcecRLUVN2ZBpXQGVgQGtG2foS7CrTKFKlQVVswLvf7Js6XA/CVQ== 101 | dependencies: 102 | "@types/prop-types" "*" 103 | csstype "^2.2.0" 104 | 105 | "@types/react@^17.0.0": 106 | version "17.0.8" 107 | resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.8.tgz#fe76e3ba0fbb5602704110fd1e3035cf394778e3" 108 | integrity sha512-3sx4c0PbXujrYAKwXxNONXUtRp9C+hE2di0IuxFyf5BELD+B+AXL8G7QrmSKhVwKZDbv0igiAjQAMhXj8Yg3aw== 109 | dependencies: 110 | "@types/prop-types" "*" 111 | "@types/scheduler" "*" 112 | csstype "^3.0.2" 113 | 114 | "@types/scheduler@*": 115 | version "0.16.1" 116 | resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.1.tgz#18845205e86ff0038517aab7a18a62a6b9f71275" 117 | integrity sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA== 118 | 119 | "@types/three@^0.134.0": 120 | version "0.134.0" 121 | resolved "https://registry.yarnpkg.com/@types/three/-/three-0.134.0.tgz#22ae9892f4490faaf35f0ccea127df18407b8ab3" 122 | integrity sha512-4YB+99Rgqq27EjiYTItEoZtdjLnTh8W9LxowgpC9eWsjaQJIL4Kn/ZcUKAnW3gB/jS4hqGN8iqmid+RcUZDzpA== 123 | 124 | "@types/yargs-parser@*": 125 | version "13.1.0" 126 | resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-13.1.0.tgz#c563aa192f39350a1d18da36c5a8da382bbd8228" 127 | integrity sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg== 128 | 129 | "@types/yargs@^13.0.0": 130 | version "13.0.3" 131 | resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.3.tgz#76482af3981d4412d65371a318f992d33464a380" 132 | integrity sha512-K8/LfZq2duW33XW/tFwEAfnZlqIfVsoyRB3kfXdPXYhl0nfM8mmh7GS0jg7WrX2Dgq/0Ha/pR1PaR+BvmWwjiQ== 133 | dependencies: 134 | "@types/yargs-parser" "*" 135 | 136 | "@typescript-eslint/parser@^4.25.0": 137 | version "4.25.0" 138 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.25.0.tgz#6b2cb6285aa3d55bfb263c650739091b0f19aceb" 139 | integrity sha512-OZFa1SKyEJpAhDx8FcbWyX+vLwh7OEtzoo2iQaeWwxucyfbi0mT4DijbOSsTgPKzGHr6GrF2V5p/CEpUH/VBxg== 140 | dependencies: 141 | "@typescript-eslint/scope-manager" "4.25.0" 142 | "@typescript-eslint/types" "4.25.0" 143 | "@typescript-eslint/typescript-estree" "4.25.0" 144 | debug "^4.1.1" 145 | 146 | "@typescript-eslint/scope-manager@4.25.0": 147 | version "4.25.0" 148 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.25.0.tgz#9d86a5bcc46ef40acd03d85ad4e908e5aab8d4ca" 149 | integrity sha512-2NElKxMb/0rya+NJG1U71BuNnp1TBd1JgzYsldsdA83h/20Tvnf/HrwhiSlNmuq6Vqa0EzidsvkTArwoq+tH6w== 150 | dependencies: 151 | "@typescript-eslint/types" "4.25.0" 152 | "@typescript-eslint/visitor-keys" "4.25.0" 153 | 154 | "@typescript-eslint/types@4.25.0": 155 | version "4.25.0" 156 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.25.0.tgz#0e444a5c5e3c22d7ffa5e16e0e60510b3de5af87" 157 | integrity sha512-+CNINNvl00OkW6wEsi32wU5MhHti2J25TJsJJqgQmJu3B3dYDBcmOxcE5w9cgoM13TrdE/5ND2HoEnBohasxRQ== 158 | 159 | "@typescript-eslint/typescript-estree@4.25.0": 160 | version "4.25.0" 161 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.25.0.tgz#942e4e25888736bff5b360d9b0b61e013d0cfa25" 162 | integrity sha512-1B8U07TGNAFMxZbSpF6jqiDs1cVGO0izVkf18Q/SPcUAc9LhHxzvSowXDTvkHMWUVuPpagupaW63gB6ahTXVlg== 163 | dependencies: 164 | "@typescript-eslint/types" "4.25.0" 165 | "@typescript-eslint/visitor-keys" "4.25.0" 166 | debug "^4.1.1" 167 | globby "^11.0.1" 168 | is-glob "^4.0.1" 169 | semver "^7.3.2" 170 | tsutils "^3.17.1" 171 | 172 | "@typescript-eslint/visitor-keys@4.25.0": 173 | version "4.25.0" 174 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.25.0.tgz#863e7ed23da4287c5b469b13223255d0fde6aaa7" 175 | integrity sha512-AmkqV9dDJVKP/TcZrbf6s6i1zYXt5Hl8qOLrRDTFfRNae4+LB8A4N3i+FLZPW85zIxRy39BgeWOfMS3HoH5ngg== 176 | dependencies: 177 | "@typescript-eslint/types" "4.25.0" 178 | eslint-visitor-keys "^2.0.0" 179 | 180 | ansi-regex@^4.0.0: 181 | version "4.1.0" 182 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 183 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 184 | 185 | ansi-styles@^3.2.0, ansi-styles@^3.2.1: 186 | version "3.2.1" 187 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 188 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 189 | dependencies: 190 | color-convert "^1.9.0" 191 | 192 | array-includes@^3.1.2, array-includes@^3.1.3: 193 | version "3.1.3" 194 | resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" 195 | integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== 196 | dependencies: 197 | call-bind "^1.0.2" 198 | define-properties "^1.1.3" 199 | es-abstract "^1.18.0-next.2" 200 | get-intrinsic "^1.1.1" 201 | is-string "^1.0.5" 202 | 203 | array-union@^2.1.0: 204 | version "2.1.0" 205 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 206 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 207 | 208 | array.prototype.flatmap@^1.2.4: 209 | version "1.2.4" 210 | resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz#94cfd47cc1556ec0747d97f7c7738c58122004c9" 211 | integrity sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q== 212 | dependencies: 213 | call-bind "^1.0.0" 214 | define-properties "^1.1.3" 215 | es-abstract "^1.18.0-next.1" 216 | function-bind "^1.1.1" 217 | 218 | balanced-match@^1.0.0: 219 | version "1.0.0" 220 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 221 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 222 | 223 | brace-expansion@^1.1.7: 224 | version "1.1.11" 225 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 226 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 227 | dependencies: 228 | balanced-match "^1.0.0" 229 | concat-map "0.0.1" 230 | 231 | braces@^3.0.1: 232 | version "3.0.2" 233 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 234 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 235 | dependencies: 236 | fill-range "^7.0.1" 237 | 238 | call-bind@^1.0.0, call-bind@^1.0.2: 239 | version "1.0.2" 240 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 241 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 242 | dependencies: 243 | function-bind "^1.1.1" 244 | get-intrinsic "^1.0.2" 245 | 246 | chalk@^2.0.1: 247 | version "2.4.2" 248 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 249 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 250 | dependencies: 251 | ansi-styles "^3.2.1" 252 | escape-string-regexp "^1.0.5" 253 | supports-color "^5.3.0" 254 | 255 | color-convert@^1.9.0: 256 | version "1.9.3" 257 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 258 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 259 | dependencies: 260 | color-name "1.1.3" 261 | 262 | color-name@1.1.3: 263 | version "1.1.3" 264 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 265 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 266 | 267 | concat-map@0.0.1: 268 | version "0.0.1" 269 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 270 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 271 | 272 | csstype@^2.2.0: 273 | version "2.6.7" 274 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.7.tgz#20b0024c20b6718f4eda3853a1f5a1cce7f5e4a5" 275 | integrity sha512-9Mcn9sFbGBAdmimWb2gLVDtFJzeKtDGIr76TUqmjZrw9LFXBMSU70lcs+C0/7fyCd6iBDqmksUcCOUIkisPHsQ== 276 | 277 | csstype@^3.0.2: 278 | version "3.0.8" 279 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.8.tgz#d2266a792729fb227cd216fb572f43728e1ad340" 280 | integrity sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw== 281 | 282 | debounce@^1.2.0: 283 | version "1.2.1" 284 | resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" 285 | integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== 286 | 287 | debug@^4.1.1: 288 | version "4.1.1" 289 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 290 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 291 | dependencies: 292 | ms "^2.1.1" 293 | 294 | define-properties@^1.1.3: 295 | version "1.1.3" 296 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 297 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 298 | dependencies: 299 | object-keys "^1.0.12" 300 | 301 | diff-sequences@^24.9.0: 302 | version "24.9.0" 303 | resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" 304 | integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== 305 | 306 | dir-glob@^3.0.1: 307 | version "3.0.1" 308 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 309 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 310 | dependencies: 311 | path-type "^4.0.0" 312 | 313 | doctrine@^2.1.0: 314 | version "2.1.0" 315 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 316 | integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== 317 | dependencies: 318 | esutils "^2.0.2" 319 | 320 | es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2: 321 | version "1.18.3" 322 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0" 323 | integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw== 324 | dependencies: 325 | call-bind "^1.0.2" 326 | es-to-primitive "^1.2.1" 327 | function-bind "^1.1.1" 328 | get-intrinsic "^1.1.1" 329 | has "^1.0.3" 330 | has-symbols "^1.0.2" 331 | is-callable "^1.2.3" 332 | is-negative-zero "^2.0.1" 333 | is-regex "^1.1.3" 334 | is-string "^1.0.6" 335 | object-inspect "^1.10.3" 336 | object-keys "^1.1.1" 337 | object.assign "^4.1.2" 338 | string.prototype.trimend "^1.0.4" 339 | string.prototype.trimstart "^1.0.4" 340 | unbox-primitive "^1.0.1" 341 | 342 | es-to-primitive@^1.2.1: 343 | version "1.2.1" 344 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 345 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 346 | dependencies: 347 | is-callable "^1.1.4" 348 | is-date-object "^1.0.1" 349 | is-symbol "^1.0.2" 350 | 351 | escape-string-regexp@^1.0.5: 352 | version "1.0.5" 353 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 354 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 355 | 356 | eslint-plugin-react@^7.23.2: 357 | version "7.23.2" 358 | resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.23.2.tgz#2d2291b0f95c03728b55869f01102290e792d494" 359 | integrity sha512-AfjgFQB+nYszudkxRkTFu0UR1zEQig0ArVMPloKhxwlwkzaw/fBiH0QWcBBhZONlXqQC51+nfqFrkn4EzHcGBw== 360 | dependencies: 361 | array-includes "^3.1.3" 362 | array.prototype.flatmap "^1.2.4" 363 | doctrine "^2.1.0" 364 | has "^1.0.3" 365 | jsx-ast-utils "^2.4.1 || ^3.0.0" 366 | minimatch "^3.0.4" 367 | object.entries "^1.1.3" 368 | object.fromentries "^2.0.4" 369 | object.values "^1.1.3" 370 | prop-types "^15.7.2" 371 | resolve "^2.0.0-next.3" 372 | string.prototype.matchall "^4.0.4" 373 | 374 | eslint-visitor-keys@^2.0.0: 375 | version "2.1.0" 376 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" 377 | integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== 378 | 379 | esutils@^2.0.2: 380 | version "2.0.3" 381 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 382 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 383 | 384 | fast-deep-equal@^3.1.3: 385 | version "3.1.3" 386 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 387 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 388 | 389 | fast-glob@^3.1.1: 390 | version "3.2.5" 391 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" 392 | integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== 393 | dependencies: 394 | "@nodelib/fs.stat" "^2.0.2" 395 | "@nodelib/fs.walk" "^1.2.3" 396 | glob-parent "^5.1.0" 397 | merge2 "^1.3.0" 398 | micromatch "^4.0.2" 399 | picomatch "^2.2.1" 400 | 401 | fastq@^1.6.0: 402 | version "1.11.0" 403 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" 404 | integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g== 405 | dependencies: 406 | reusify "^1.0.4" 407 | 408 | fill-range@^7.0.1: 409 | version "7.0.1" 410 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 411 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 412 | dependencies: 413 | to-regex-range "^5.0.1" 414 | 415 | function-bind@^1.1.1: 416 | version "1.1.1" 417 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 418 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 419 | 420 | get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: 421 | version "1.1.1" 422 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" 423 | integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== 424 | dependencies: 425 | function-bind "^1.1.1" 426 | has "^1.0.3" 427 | has-symbols "^1.0.1" 428 | 429 | glob-parent@^5.1.0: 430 | version "5.1.2" 431 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 432 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 433 | dependencies: 434 | is-glob "^4.0.1" 435 | 436 | globby@^11.0.1: 437 | version "11.0.3" 438 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" 439 | integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== 440 | dependencies: 441 | array-union "^2.1.0" 442 | dir-glob "^3.0.1" 443 | fast-glob "^3.1.1" 444 | ignore "^5.1.4" 445 | merge2 "^1.3.0" 446 | slash "^3.0.0" 447 | 448 | has-bigints@^1.0.1: 449 | version "1.0.1" 450 | resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" 451 | integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== 452 | 453 | has-flag@^3.0.0: 454 | version "3.0.0" 455 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 456 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 457 | 458 | has-symbols@^1.0.0: 459 | version "1.0.0" 460 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" 461 | integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= 462 | 463 | has-symbols@^1.0.1, has-symbols@^1.0.2: 464 | version "1.0.2" 465 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" 466 | integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== 467 | 468 | has@^1.0.3: 469 | version "1.0.3" 470 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 471 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 472 | dependencies: 473 | function-bind "^1.1.1" 474 | 475 | ignore@^5.1.4: 476 | version "5.1.8" 477 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" 478 | integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== 479 | 480 | internal-slot@^1.0.3: 481 | version "1.0.3" 482 | resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" 483 | integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== 484 | dependencies: 485 | get-intrinsic "^1.1.0" 486 | has "^1.0.3" 487 | side-channel "^1.0.4" 488 | 489 | is-bigint@^1.0.1: 490 | version "1.0.2" 491 | resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" 492 | integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== 493 | 494 | is-boolean-object@^1.1.0: 495 | version "1.1.1" 496 | resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8" 497 | integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng== 498 | dependencies: 499 | call-bind "^1.0.2" 500 | 501 | is-callable@^1.1.4: 502 | version "1.1.4" 503 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" 504 | integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== 505 | 506 | is-callable@^1.2.3: 507 | version "1.2.3" 508 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" 509 | integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== 510 | 511 | is-core-module@^2.2.0: 512 | version "2.4.0" 513 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" 514 | integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== 515 | dependencies: 516 | has "^1.0.3" 517 | 518 | is-date-object@^1.0.1: 519 | version "1.0.1" 520 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" 521 | integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= 522 | 523 | is-extglob@^2.1.1: 524 | version "2.1.1" 525 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 526 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 527 | 528 | is-glob@^4.0.1: 529 | version "4.0.1" 530 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 531 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 532 | dependencies: 533 | is-extglob "^2.1.1" 534 | 535 | is-negative-zero@^2.0.1: 536 | version "2.0.1" 537 | resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" 538 | integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== 539 | 540 | is-number-object@^1.0.4: 541 | version "1.0.5" 542 | resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" 543 | integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== 544 | 545 | is-number@^7.0.0: 546 | version "7.0.0" 547 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 548 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 549 | 550 | is-regex@^1.1.3: 551 | version "1.1.3" 552 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" 553 | integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== 554 | dependencies: 555 | call-bind "^1.0.2" 556 | has-symbols "^1.0.2" 557 | 558 | is-string@^1.0.5, is-string@^1.0.6: 559 | version "1.0.6" 560 | resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" 561 | integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== 562 | 563 | is-symbol@^1.0.2: 564 | version "1.0.2" 565 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" 566 | integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== 567 | dependencies: 568 | has-symbols "^1.0.0" 569 | 570 | is-symbol@^1.0.3: 571 | version "1.0.4" 572 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" 573 | integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== 574 | dependencies: 575 | has-symbols "^1.0.2" 576 | 577 | jest-diff@^24.3.0: 578 | version "24.9.0" 579 | resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" 580 | integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== 581 | dependencies: 582 | chalk "^2.0.1" 583 | diff-sequences "^24.9.0" 584 | jest-get-type "^24.9.0" 585 | pretty-format "^24.9.0" 586 | 587 | jest-get-type@^24.9.0: 588 | version "24.9.0" 589 | resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" 590 | integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== 591 | 592 | "js-tokens@^3.0.0 || ^4.0.0": 593 | version "4.0.0" 594 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 595 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 596 | 597 | "jsx-ast-utils@^2.4.1 || ^3.0.0": 598 | version "3.2.0" 599 | resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz#41108d2cec408c3453c1bbe8a4aae9e1e2bd8f82" 600 | integrity sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q== 601 | dependencies: 602 | array-includes "^3.1.2" 603 | object.assign "^4.1.2" 604 | 605 | loose-envify@^1.1.0, loose-envify@^1.4.0: 606 | version "1.4.0" 607 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 608 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 609 | dependencies: 610 | js-tokens "^3.0.0 || ^4.0.0" 611 | 612 | lru-cache@^6.0.0: 613 | version "6.0.0" 614 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 615 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 616 | dependencies: 617 | yallist "^4.0.0" 618 | 619 | merge2@^1.3.0: 620 | version "1.4.1" 621 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 622 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 623 | 624 | micromatch@^4.0.2: 625 | version "4.0.4" 626 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" 627 | integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== 628 | dependencies: 629 | braces "^3.0.1" 630 | picomatch "^2.2.3" 631 | 632 | minimatch@^3.0.4: 633 | version "3.0.4" 634 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 635 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 636 | dependencies: 637 | brace-expansion "^1.1.7" 638 | 639 | ms@^2.1.1: 640 | version "2.1.2" 641 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 642 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 643 | 644 | object-assign@^4.1.1: 645 | version "4.1.1" 646 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 647 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 648 | 649 | object-inspect@^1.10.3, object-inspect@^1.9.0: 650 | version "1.10.3" 651 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369" 652 | integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw== 653 | 654 | object-keys@^1.0.12, object-keys@^1.1.1: 655 | version "1.1.1" 656 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 657 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 658 | 659 | object.assign@^4.1.2: 660 | version "4.1.2" 661 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" 662 | integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== 663 | dependencies: 664 | call-bind "^1.0.0" 665 | define-properties "^1.1.3" 666 | has-symbols "^1.0.1" 667 | object-keys "^1.1.1" 668 | 669 | object.entries@^1.1.3: 670 | version "1.1.4" 671 | resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.4.tgz#43ccf9a50bc5fd5b649d45ab1a579f24e088cafd" 672 | integrity sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA== 673 | dependencies: 674 | call-bind "^1.0.2" 675 | define-properties "^1.1.3" 676 | es-abstract "^1.18.2" 677 | 678 | object.fromentries@^2.0.4: 679 | version "2.0.4" 680 | resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.4.tgz#26e1ba5c4571c5c6f0890cef4473066456a120b8" 681 | integrity sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ== 682 | dependencies: 683 | call-bind "^1.0.2" 684 | define-properties "^1.1.3" 685 | es-abstract "^1.18.0-next.2" 686 | has "^1.0.3" 687 | 688 | object.values@^1.1.3: 689 | version "1.1.4" 690 | resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30" 691 | integrity sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg== 692 | dependencies: 693 | call-bind "^1.0.2" 694 | define-properties "^1.1.3" 695 | es-abstract "^1.18.2" 696 | 697 | path-parse@^1.0.6: 698 | version "1.0.6" 699 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 700 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 701 | 702 | path-type@^4.0.0: 703 | version "4.0.0" 704 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 705 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 706 | 707 | picomatch@^2.2.1, picomatch@^2.2.3: 708 | version "2.3.0" 709 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" 710 | integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== 711 | 712 | prettier@^2.3.0: 713 | version "2.3.0" 714 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.0.tgz#b6a5bf1284026ae640f17f7ff5658a7567fc0d18" 715 | integrity sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w== 716 | 717 | pretty-format@^24.9.0: 718 | version "24.9.0" 719 | resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" 720 | integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== 721 | dependencies: 722 | "@jest/types" "^24.9.0" 723 | ansi-regex "^4.0.0" 724 | ansi-styles "^3.2.0" 725 | react-is "^16.8.4" 726 | 727 | prop-types@^15.7.2: 728 | version "15.7.2" 729 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" 730 | integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== 731 | dependencies: 732 | loose-envify "^1.4.0" 733 | object-assign "^4.1.1" 734 | react-is "^16.8.1" 735 | 736 | queue-microtask@^1.2.2: 737 | version "1.2.3" 738 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 739 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 740 | 741 | react-is@^16.8.1, react-is@^16.8.4: 742 | version "16.12.0" 743 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" 744 | integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== 745 | 746 | react-merge-refs@^1.1.0: 747 | version "1.1.0" 748 | resolved "https://registry.yarnpkg.com/react-merge-refs/-/react-merge-refs-1.1.0.tgz#73d88b892c6c68cbb7a66e0800faa374f4c38b06" 749 | integrity sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ== 750 | 751 | react-reconciler@^0.26.2: 752 | version "0.26.2" 753 | resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.26.2.tgz#bbad0e2d1309423f76cf3c3309ac6c96e05e9d91" 754 | integrity sha512-nK6kgY28HwrMNwDnMui3dvm3rCFjZrcGiuwLc5COUipBK5hWHLOxMJhSnSomirqWwjPBJKV1QcbkI0VJr7Gl1Q== 755 | dependencies: 756 | loose-envify "^1.1.0" 757 | object-assign "^4.1.1" 758 | scheduler "^0.20.2" 759 | 760 | react-three-fiber@0.0.0-deprecated: 761 | version "0.0.0-deprecated" 762 | resolved "https://registry.yarnpkg.com/react-three-fiber/-/react-three-fiber-0.0.0-deprecated.tgz#c737242487d824cf9520307308b7e4c4071a278f" 763 | integrity sha512-EblIqTAsIpkYeM8bZtC4lcpTE0A2zCEGipFB52RgcQq/q+0oryrk7Sxt+sqhIjUu6xMNEVywV8dr74lz5yWO6A== 764 | 765 | react-use-measure@^2.0.4: 766 | version "2.0.4" 767 | resolved "https://registry.yarnpkg.com/react-use-measure/-/react-use-measure-2.0.4.tgz#cb675b36eaeaf3681b94d5f5e08b2a1e081fedc9" 768 | integrity sha512-7K2HIGaPMl3Q9ZQiEVjen3tRXl4UDda8LiTPy/QxP8dP2rl5gPBhf7mMH6MVjjRNv3loU7sNzey/ycPNnHVTxQ== 769 | dependencies: 770 | debounce "^1.2.0" 771 | 772 | regenerator-runtime@^0.13.4: 773 | version "0.13.9" 774 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" 775 | integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== 776 | 777 | regexp.prototype.flags@^1.3.1: 778 | version "1.3.1" 779 | resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" 780 | integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== 781 | dependencies: 782 | call-bind "^1.0.2" 783 | define-properties "^1.1.3" 784 | 785 | resize-observer-polyfill@^1.5.1: 786 | version "1.5.1" 787 | resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" 788 | integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== 789 | 790 | resolve@^2.0.0-next.3: 791 | version "2.0.0-next.3" 792 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" 793 | integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== 794 | dependencies: 795 | is-core-module "^2.2.0" 796 | path-parse "^1.0.6" 797 | 798 | reusify@^1.0.4: 799 | version "1.0.4" 800 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 801 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 802 | 803 | run-parallel@^1.1.9: 804 | version "1.2.0" 805 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 806 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 807 | dependencies: 808 | queue-microtask "^1.2.2" 809 | 810 | scheduler@^0.20.2: 811 | version "0.20.2" 812 | resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" 813 | integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== 814 | dependencies: 815 | loose-envify "^1.1.0" 816 | object-assign "^4.1.1" 817 | 818 | semver@^7.3.2: 819 | version "7.3.5" 820 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" 821 | integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== 822 | dependencies: 823 | lru-cache "^6.0.0" 824 | 825 | side-channel@^1.0.4: 826 | version "1.0.4" 827 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" 828 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 829 | dependencies: 830 | call-bind "^1.0.0" 831 | get-intrinsic "^1.0.2" 832 | object-inspect "^1.9.0" 833 | 834 | slash@^3.0.0: 835 | version "3.0.0" 836 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 837 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 838 | 839 | string.prototype.matchall@^4.0.4: 840 | version "4.0.5" 841 | resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz#59370644e1db7e4c0c045277690cf7b01203c4da" 842 | integrity sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q== 843 | dependencies: 844 | call-bind "^1.0.2" 845 | define-properties "^1.1.3" 846 | es-abstract "^1.18.2" 847 | get-intrinsic "^1.1.1" 848 | has-symbols "^1.0.2" 849 | internal-slot "^1.0.3" 850 | regexp.prototype.flags "^1.3.1" 851 | side-channel "^1.0.4" 852 | 853 | string.prototype.trimend@^1.0.4: 854 | version "1.0.4" 855 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" 856 | integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== 857 | dependencies: 858 | call-bind "^1.0.2" 859 | define-properties "^1.1.3" 860 | 861 | string.prototype.trimstart@^1.0.4: 862 | version "1.0.4" 863 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" 864 | integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== 865 | dependencies: 866 | call-bind "^1.0.2" 867 | define-properties "^1.1.3" 868 | 869 | supports-color@^5.3.0: 870 | version "5.5.0" 871 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 872 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 873 | dependencies: 874 | has-flag "^3.0.0" 875 | 876 | to-regex-range@^5.0.1: 877 | version "5.0.1" 878 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 879 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 880 | dependencies: 881 | is-number "^7.0.0" 882 | 883 | tslib@^1.8.1: 884 | version "1.10.0" 885 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" 886 | integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== 887 | 888 | tsutils@^3.17.1: 889 | version "3.17.1" 890 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" 891 | integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== 892 | dependencies: 893 | tslib "^1.8.1" 894 | 895 | typescript@^4.3.2: 896 | version "4.3.2" 897 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.2.tgz#399ab18aac45802d6f2498de5054fcbbe716a805" 898 | integrity sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw== 899 | 900 | unbox-primitive@^1.0.1: 901 | version "1.0.1" 902 | resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" 903 | integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== 904 | dependencies: 905 | function-bind "^1.1.1" 906 | has-bigints "^1.0.1" 907 | has-symbols "^1.0.2" 908 | which-boxed-primitive "^1.0.2" 909 | 910 | use-asset@^1.0.4: 911 | version "1.0.4" 912 | resolved "https://registry.yarnpkg.com/use-asset/-/use-asset-1.0.4.tgz#506caafc29f602890593799e58b577b70293a6e2" 913 | integrity sha512-7/hqDrWa0iMnCoET9W1T07EmD4Eg/Wmoj/X8TGBc++ECRK4m5yTsjP4O6s0yagbxfqIOuUkIxe2/sA+VR2GxZA== 914 | dependencies: 915 | fast-deep-equal "^3.1.3" 916 | 917 | utility-types@^3.10.0: 918 | version "3.10.0" 919 | resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" 920 | integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== 921 | 922 | which-boxed-primitive@^1.0.2: 923 | version "1.0.2" 924 | resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" 925 | integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== 926 | dependencies: 927 | is-bigint "^1.0.1" 928 | is-boolean-object "^1.1.0" 929 | is-number-object "^1.0.4" 930 | is-string "^1.0.5" 931 | is-symbol "^1.0.3" 932 | 933 | yallist@^4.0.0: 934 | version "4.0.0" 935 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 936 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 937 | 938 | zustand@^3.5.1: 939 | version "3.6.5" 940 | resolved "https://registry.yarnpkg.com/zustand/-/zustand-3.6.5.tgz#42a459397907d6bf0e2375351394733b2f83ee44" 941 | integrity sha512-/WfLJuXiEJimt61KGMHebrFBwckkCHGhAgVXTgPQHl6IMzjqm6MREb1OnDSnCRiSmRdhgdFCctceg6tSm79hiw== 942 | --------------------------------------------------------------------------------