├── .eslintignore ├── .eslintrc ├── .github ├── dependabot.yml └── workflows │ └── push-main.yml ├── .gitignore ├── .prettierrc ├── .releaserc ├── CHANGELOG.md ├── README.md ├── example ├── .gitignore ├── index.html ├── package-lock.json ├── package.json ├── public │ ├── dark.png │ └── light.png ├── src │ ├── App.tsx │ ├── index.css │ ├── main.tsx │ └── vite-env.d.ts ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts ├── package-lock.json ├── package.json ├── src └── index.ts ├── tests ├── index.test.ts └── setup.js ├── tsconfig.build.json ├── tsconfig.json └── vite.config.ts /.eslintignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* 131 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["react-app", "plugin:prettier/recommended"], 3 | "plugins": ["prettier", "import"], 4 | "rules": { 5 | "prettier/prettier": [ 6 | "error", 7 | { 8 | "bracketSpacing": true, 9 | "printWidth": 80, 10 | "semi": false, 11 | "singleQuote": true, 12 | "trailingComma": "all", 13 | "arrowParens": "always", 14 | "endOfLine": "auto" 15 | } 16 | ], 17 | "import/order": [ 18 | "error", 19 | { 20 | "alphabetize": { 21 | "order": "asc", 22 | "caseInsensitive": true 23 | }, 24 | "groups": [ 25 | "builtin", 26 | "external", 27 | "internal", 28 | "parent", 29 | "sibling", 30 | "index" 31 | ], 32 | "newlines-between": "always" 33 | } 34 | ] 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: npm 4 | directory: '/' 5 | schedule: 6 | interval: daily 7 | time: '08:00' 8 | open-pull-requests-limit: 10 9 | target-branch: main 10 | commit-message: 11 | prefix: fix 12 | prefix-development: chore 13 | -------------------------------------------------------------------------------- /.github/workflows/push-main.yml: -------------------------------------------------------------------------------- 1 | name: Push to main 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | lint: 10 | name: ⬣ ESLint 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: 🛑 Cancel Previous Runs 14 | uses: styfle/cancel-workflow-action@0.11.0 15 | 16 | - name: ⬇️ Checkout repo 17 | uses: actions/checkout@v3 18 | 19 | - name: ⎔ Setup node 20 | uses: actions/setup-node@v3 21 | with: 22 | node-version: 18 23 | 24 | - name: 📥 Download deps 25 | uses: bahmutov/npm-install@v1 26 | 27 | - name: 🔬 Lint 28 | run: npm run lint 29 | 30 | typecheck: 31 | name: ʦ TypeScript 32 | runs-on: ubuntu-latest 33 | steps: 34 | - name: 🛑 Cancel Previous Runs 35 | uses: styfle/cancel-workflow-action@0.11.0 36 | 37 | - name: ⬇️ Checkout repo 38 | uses: actions/checkout@v3 39 | 40 | - name: ⎔ Setup node 41 | uses: actions/setup-node@v3 42 | with: 43 | node-version: 18 44 | 45 | - name: 📥 Download deps 46 | uses: bahmutov/npm-install@v1 47 | 48 | - name: 🔎 Type check 49 | run: npm run typecheck --if-present 50 | 51 | release: 52 | needs: [lint, typecheck] 53 | runs-on: ubuntu-latest 54 | 55 | steps: 56 | - name: 🛑 Cancel Previous Runs 57 | uses: styfle/cancel-workflow-action@0.11.0 58 | 59 | - name: ⬇️ Checkout repo 60 | uses: actions/checkout@v3 61 | 62 | - name: ⎔ Setup node 63 | uses: actions/setup-node@v3 64 | with: 65 | node-version: 18 66 | 67 | - name: 📥 Download deps 68 | uses: bahmutov/npm-install@v1 69 | 70 | - name: 🏗 Build 71 | run: npm run build 72 | 73 | - name: 📦 Release 74 | run: npx semantic-release 75 | env: 76 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 77 | NPM_TOKEN: ${{ secrets.NPM_TOKEN }} 78 | 79 | build: 80 | needs: [lint, typecheck] 81 | runs-on: ubuntu-latest 82 | 83 | steps: 84 | - name: 🛑 Cancel Previous Runs 85 | uses: styfle/cancel-workflow-action@0.11.0 86 | 87 | - name: ⬇️ Checkout repo 88 | uses: actions/checkout@v3 89 | 90 | - name: ⎔ Setup node 91 | uses: actions/setup-node@v3 92 | with: 93 | node-version: 18 94 | 95 | - name: 📥 Download deps 96 | uses: bahmutov/npm-install@v1 97 | 98 | - name: 🏗 Build 99 | run: npm run build 100 | 101 | - name: 🏗 Build 102 | run: | 103 | cd example/ 104 | npm install 105 | npm run build 106 | 107 | - uses: actions/upload-pages-artifact@v1 108 | with: 109 | path: ./example/dist 110 | 111 | deploy: 112 | needs: [build] 113 | runs-on: ubuntu-latest 114 | environment: 115 | name: github-pages 116 | permissions: 117 | contents: read 118 | pages: write 119 | id-token: write 120 | 121 | steps: 122 | - name: 🛑 Cancel Previous Runs 123 | uses: styfle/cancel-workflow-action@0.11.0 124 | 125 | - name: 🚀 Production Deploy 126 | uses: actions/deploy-pages@v1 127 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* 131 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "jsxSingleQuote": true, 4 | "semi": false, 5 | "tabWidth": 2, 6 | "bracketSpacing": true, 7 | "jsxBracketSameLine": false, 8 | "arrowParens": "avoid", 9 | "trailingComma": "all" 10 | } 11 | -------------------------------------------------------------------------------- /.releaserc: -------------------------------------------------------------------------------- 1 | { 2 | "branches": [ 3 | "main" 4 | ], 5 | "plugins": [ 6 | "@semantic-release/commit-analyzer", 7 | "@semantic-release/release-notes-generator", 8 | "@semantic-release/changelog", 9 | [ 10 | "@semantic-release/npm", 11 | { 12 | "tarballDir": "release" 13 | } 14 | ], 15 | [ 16 | "@semantic-release/github", 17 | { 18 | "assets": "release/*.tgz" 19 | } 20 | ], 21 | "@semantic-release/git" 22 | ], 23 | "preset": "angular" 24 | } 25 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## [1.1.3](https://github.com/rfoel/use-prefers-color-scheme/compare/v1.1.2...v1.1.3) (2023-01-31) 2 | 3 | 4 | ### Bug Fixes 5 | 6 | * fix build ([0943d0e](https://github.com/rfoel/use-prefers-color-scheme/commit/0943d0e88105beca9c4e8c1887e999c586d69bdb)) 7 | * fix ssr ([6b0b94a](https://github.com/rfoel/use-prefers-color-scheme/commit/6b0b94afd71fba1df3a30b133562f5d24bbacca2)) 8 | 9 | ## [1.1.2](https://github.com/rfoel/use-prefers-color-scheme/compare/v1.1.1...v1.1.2) (2023-01-23) 10 | 11 | 12 | ### Bug Fixes 13 | 14 | * prevent flash of wrong theme ([40190c4](https://github.com/rfoel/use-prefers-color-scheme/commit/40190c49948170a46a117eef4f5d232ebb2beccf)) 15 | 16 | ## [1.1.1](https://github.com/rfoel/use-prefers-color-scheme/compare/v1.1.0...v1.1.1) (2022-10-19) 17 | 18 | 19 | ### Bug Fixes 20 | 21 | * added function description for intellisense ([#12](https://github.com/rfoel/use-prefers-color-scheme/issues/12)) ([77c8d5d](https://github.com/rfoel/use-prefers-color-scheme/commit/77c8d5daa44af3b724ae8c06af5f1c6a2d6d3b3e)) 22 | 23 | # [1.1.0](https://github.com/rfoel/use-prefers-color-scheme/compare/v1.0.0...v1.1.0) (2022-10-17) 24 | 25 | 26 | ### Features 27 | 28 | * refactor code to support server-side-rendering (SSR) ([#9](https://github.com/rfoel/use-prefers-color-scheme/issues/9)) ([622e18f](https://github.com/rfoel/use-prefers-color-scheme/commit/622e18f30acba2088d0b243fc3b3aa60d47fd609)) 29 | 30 | # 1.0.0 (2022-10-05) 31 | 32 | 33 | ### Bug Fixes 34 | 35 | * fix safari change method ([ee98710](https://github.com/rfoel/use-prefers-color-scheme/commit/ee98710d92f7a16e02e3fad373e56473696755de)) 36 | * state setter ([04feead](https://github.com/rfoel/use-prefers-color-scheme/commit/04feeadd196944503107af5831c10b0a6a534e06)) 37 | 38 | 39 | ### Features 40 | 41 | * add types ([#5](https://github.com/rfoel/use-prefers-color-scheme/issues/5)) ([a536a94](https://github.com/rfoel/use-prefers-color-scheme/commit/a536a94a9c43da992b0561f6f38b3a3e9d5fa1ae)) 42 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # use-prefers-color-scheme 2 | 3 | > React hook for determining the preferred color scheme 4 | 5 | [![NPM](https://img.shields.io/npm/v/use-prefers-color-scheme.svg)](https://www.npmjs.com/package/use-prefers-color-scheme) 6 | [![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com) 7 | 8 | ## Features: 9 | 10 | - SSR support 11 | - Written in Typescript 12 | 13 | ## Install 14 | 15 | ```bash 16 | npm install --save use-prefers-color-scheme 17 | ``` 18 | 19 | ## Usage 20 | 21 | > **Tip** When rendered in node (SSR) the hook returns `no-preference`. 22 | 23 | ```jsx 24 | import React from 'react' 25 | 26 | import usePrefersColorScheme from 'use-prefers-color-scheme' 27 | 28 | const App = () => { 29 | const prefersColorScheme = usePrefersColorScheme() 30 | const isDarkMode = prefersColorScheme === 'dark' 31 | 32 | return ( 33 |
You are using {isDarkMode ? 'Dark Mode 🌚' : 'Light Mode 🌞'}!
34 | ) 35 | } 36 | ``` 37 | 38 | 39 | ## Online Demo 40 | 41 | [![Open Codesanbox](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/use-prefers-color-scheme-example-xb134y?file=/src/App.js) 42 | 43 | 44 | ## License 45 | 46 | MIT © [rfoel](https://github.com/rfoel) 47 | -------------------------------------------------------------------------------- /example/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /example/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 11 | 12 | 13 | use-prefers-color-scheme 14 | 15 | 16 |
17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /example/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "example", 3 | "version": "0.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "example", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "react": "^18.2.0", 12 | "react-dom": "^18.2.0", 13 | "use-prefers-color-scheme": "file:.." 14 | }, 15 | "devDependencies": { 16 | "@types/react": "^18.0.26", 17 | "@types/react-dom": "^18.0.9", 18 | "@vitejs/plugin-react-swc": "^3.0.0", 19 | "typescript": "^4.9.3", 20 | "vite": "^4.0.0" 21 | } 22 | }, 23 | "..": { 24 | "version": "1.1.2", 25 | "license": "MIT", 26 | "devDependencies": { 27 | "@semantic-release/changelog": "^6.0.2", 28 | "@semantic-release/commit-analyzer": "^9.0.2", 29 | "@semantic-release/git": "^10.0.1", 30 | "@semantic-release/github": "^8.0.7", 31 | "@semantic-release/npm": "^9.0.2", 32 | "@semantic-release/release-notes-generator": "^10.0.3", 33 | "@testing-library/react": "^13.4.0", 34 | "@types/jest": "^29.4.0", 35 | "@types/react": "^18.0.27", 36 | "esbuild": "^0.17.5", 37 | "eslint": "^8.33.0", 38 | "eslint-config-prettier": "^8.6.0", 39 | "eslint-config-react-app": "^7.0.1", 40 | "eslint-plugin-import": "^2.27.5", 41 | "eslint-plugin-prettier": "^4.2.1", 42 | "prettier": "^2.8.3", 43 | "react": "^18.2.0", 44 | "react-scripts": "^5.0.1", 45 | "rimraf": "^4.1.2", 46 | "semantic-release": "^20.1.0", 47 | "typescript": "^4.9.5" 48 | }, 49 | "engines": { 50 | "node": ">=8", 51 | "npm": ">=5" 52 | }, 53 | "peerDependencies": { 54 | "react": ">= 16.8.0" 55 | } 56 | }, 57 | "node_modules/@esbuild/android-arm": { 58 | "version": "0.16.17", 59 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", 60 | "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", 61 | "cpu": [ 62 | "arm" 63 | ], 64 | "dev": true, 65 | "optional": true, 66 | "os": [ 67 | "android" 68 | ], 69 | "engines": { 70 | "node": ">=12" 71 | } 72 | }, 73 | "node_modules/@esbuild/android-arm64": { 74 | "version": "0.16.17", 75 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", 76 | "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", 77 | "cpu": [ 78 | "arm64" 79 | ], 80 | "dev": true, 81 | "optional": true, 82 | "os": [ 83 | "android" 84 | ], 85 | "engines": { 86 | "node": ">=12" 87 | } 88 | }, 89 | "node_modules/@esbuild/android-x64": { 90 | "version": "0.16.17", 91 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", 92 | "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", 93 | "cpu": [ 94 | "x64" 95 | ], 96 | "dev": true, 97 | "optional": true, 98 | "os": [ 99 | "android" 100 | ], 101 | "engines": { 102 | "node": ">=12" 103 | } 104 | }, 105 | "node_modules/@esbuild/darwin-arm64": { 106 | "version": "0.16.17", 107 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", 108 | "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", 109 | "cpu": [ 110 | "arm64" 111 | ], 112 | "dev": true, 113 | "optional": true, 114 | "os": [ 115 | "darwin" 116 | ], 117 | "engines": { 118 | "node": ">=12" 119 | } 120 | }, 121 | "node_modules/@esbuild/darwin-x64": { 122 | "version": "0.16.17", 123 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", 124 | "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", 125 | "cpu": [ 126 | "x64" 127 | ], 128 | "dev": true, 129 | "optional": true, 130 | "os": [ 131 | "darwin" 132 | ], 133 | "engines": { 134 | "node": ">=12" 135 | } 136 | }, 137 | "node_modules/@esbuild/freebsd-arm64": { 138 | "version": "0.16.17", 139 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", 140 | "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", 141 | "cpu": [ 142 | "arm64" 143 | ], 144 | "dev": true, 145 | "optional": true, 146 | "os": [ 147 | "freebsd" 148 | ], 149 | "engines": { 150 | "node": ">=12" 151 | } 152 | }, 153 | "node_modules/@esbuild/freebsd-x64": { 154 | "version": "0.16.17", 155 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", 156 | "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", 157 | "cpu": [ 158 | "x64" 159 | ], 160 | "dev": true, 161 | "optional": true, 162 | "os": [ 163 | "freebsd" 164 | ], 165 | "engines": { 166 | "node": ">=12" 167 | } 168 | }, 169 | "node_modules/@esbuild/linux-arm": { 170 | "version": "0.16.17", 171 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", 172 | "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", 173 | "cpu": [ 174 | "arm" 175 | ], 176 | "dev": true, 177 | "optional": true, 178 | "os": [ 179 | "linux" 180 | ], 181 | "engines": { 182 | "node": ">=12" 183 | } 184 | }, 185 | "node_modules/@esbuild/linux-arm64": { 186 | "version": "0.16.17", 187 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", 188 | "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", 189 | "cpu": [ 190 | "arm64" 191 | ], 192 | "dev": true, 193 | "optional": true, 194 | "os": [ 195 | "linux" 196 | ], 197 | "engines": { 198 | "node": ">=12" 199 | } 200 | }, 201 | "node_modules/@esbuild/linux-ia32": { 202 | "version": "0.16.17", 203 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", 204 | "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", 205 | "cpu": [ 206 | "ia32" 207 | ], 208 | "dev": true, 209 | "optional": true, 210 | "os": [ 211 | "linux" 212 | ], 213 | "engines": { 214 | "node": ">=12" 215 | } 216 | }, 217 | "node_modules/@esbuild/linux-loong64": { 218 | "version": "0.16.17", 219 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", 220 | "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", 221 | "cpu": [ 222 | "loong64" 223 | ], 224 | "dev": true, 225 | "optional": true, 226 | "os": [ 227 | "linux" 228 | ], 229 | "engines": { 230 | "node": ">=12" 231 | } 232 | }, 233 | "node_modules/@esbuild/linux-mips64el": { 234 | "version": "0.16.17", 235 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", 236 | "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", 237 | "cpu": [ 238 | "mips64el" 239 | ], 240 | "dev": true, 241 | "optional": true, 242 | "os": [ 243 | "linux" 244 | ], 245 | "engines": { 246 | "node": ">=12" 247 | } 248 | }, 249 | "node_modules/@esbuild/linux-ppc64": { 250 | "version": "0.16.17", 251 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", 252 | "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", 253 | "cpu": [ 254 | "ppc64" 255 | ], 256 | "dev": true, 257 | "optional": true, 258 | "os": [ 259 | "linux" 260 | ], 261 | "engines": { 262 | "node": ">=12" 263 | } 264 | }, 265 | "node_modules/@esbuild/linux-riscv64": { 266 | "version": "0.16.17", 267 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", 268 | "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", 269 | "cpu": [ 270 | "riscv64" 271 | ], 272 | "dev": true, 273 | "optional": true, 274 | "os": [ 275 | "linux" 276 | ], 277 | "engines": { 278 | "node": ">=12" 279 | } 280 | }, 281 | "node_modules/@esbuild/linux-s390x": { 282 | "version": "0.16.17", 283 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", 284 | "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", 285 | "cpu": [ 286 | "s390x" 287 | ], 288 | "dev": true, 289 | "optional": true, 290 | "os": [ 291 | "linux" 292 | ], 293 | "engines": { 294 | "node": ">=12" 295 | } 296 | }, 297 | "node_modules/@esbuild/linux-x64": { 298 | "version": "0.16.17", 299 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", 300 | "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", 301 | "cpu": [ 302 | "x64" 303 | ], 304 | "dev": true, 305 | "optional": true, 306 | "os": [ 307 | "linux" 308 | ], 309 | "engines": { 310 | "node": ">=12" 311 | } 312 | }, 313 | "node_modules/@esbuild/netbsd-x64": { 314 | "version": "0.16.17", 315 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", 316 | "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", 317 | "cpu": [ 318 | "x64" 319 | ], 320 | "dev": true, 321 | "optional": true, 322 | "os": [ 323 | "netbsd" 324 | ], 325 | "engines": { 326 | "node": ">=12" 327 | } 328 | }, 329 | "node_modules/@esbuild/openbsd-x64": { 330 | "version": "0.16.17", 331 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", 332 | "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", 333 | "cpu": [ 334 | "x64" 335 | ], 336 | "dev": true, 337 | "optional": true, 338 | "os": [ 339 | "openbsd" 340 | ], 341 | "engines": { 342 | "node": ">=12" 343 | } 344 | }, 345 | "node_modules/@esbuild/sunos-x64": { 346 | "version": "0.16.17", 347 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", 348 | "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", 349 | "cpu": [ 350 | "x64" 351 | ], 352 | "dev": true, 353 | "optional": true, 354 | "os": [ 355 | "sunos" 356 | ], 357 | "engines": { 358 | "node": ">=12" 359 | } 360 | }, 361 | "node_modules/@esbuild/win32-arm64": { 362 | "version": "0.16.17", 363 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", 364 | "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", 365 | "cpu": [ 366 | "arm64" 367 | ], 368 | "dev": true, 369 | "optional": true, 370 | "os": [ 371 | "win32" 372 | ], 373 | "engines": { 374 | "node": ">=12" 375 | } 376 | }, 377 | "node_modules/@esbuild/win32-ia32": { 378 | "version": "0.16.17", 379 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", 380 | "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", 381 | "cpu": [ 382 | "ia32" 383 | ], 384 | "dev": true, 385 | "optional": true, 386 | "os": [ 387 | "win32" 388 | ], 389 | "engines": { 390 | "node": ">=12" 391 | } 392 | }, 393 | "node_modules/@esbuild/win32-x64": { 394 | "version": "0.16.17", 395 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", 396 | "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", 397 | "cpu": [ 398 | "x64" 399 | ], 400 | "dev": true, 401 | "optional": true, 402 | "os": [ 403 | "win32" 404 | ], 405 | "engines": { 406 | "node": ">=12" 407 | } 408 | }, 409 | "node_modules/@swc/core": { 410 | "version": "1.3.31", 411 | "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.31.tgz", 412 | "integrity": "sha512-YD3PKF0CHfxWU9+X900AXH3Wx1ozzBBHuSF1Md1o9ygeboj2aMnVhNwwyZ96jVlqdeDCX+MHZfNJ07IxzY0IZw==", 413 | "dev": true, 414 | "hasInstallScript": true, 415 | "engines": { 416 | "node": ">=10" 417 | }, 418 | "funding": { 419 | "type": "opencollective", 420 | "url": "https://opencollective.com/swc" 421 | }, 422 | "optionalDependencies": { 423 | "@swc/core-darwin-arm64": "1.3.31", 424 | "@swc/core-darwin-x64": "1.3.31", 425 | "@swc/core-linux-arm-gnueabihf": "1.3.31", 426 | "@swc/core-linux-arm64-gnu": "1.3.31", 427 | "@swc/core-linux-arm64-musl": "1.3.31", 428 | "@swc/core-linux-x64-gnu": "1.3.31", 429 | "@swc/core-linux-x64-musl": "1.3.31", 430 | "@swc/core-win32-arm64-msvc": "1.3.31", 431 | "@swc/core-win32-ia32-msvc": "1.3.31", 432 | "@swc/core-win32-x64-msvc": "1.3.31" 433 | } 434 | }, 435 | "node_modules/@swc/core-darwin-arm64": { 436 | "version": "1.3.31", 437 | "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.31.tgz", 438 | "integrity": "sha512-Iz7zgLVHl1cnVUiKVvF/KpvCW0WR3spXiRtJsgslWqCNUZqt/bkf9n/U9vNqQBnOTBGugCyOwhxoNYBTSfRqIQ==", 439 | "cpu": [ 440 | "arm64" 441 | ], 442 | "dev": true, 443 | "optional": true, 444 | "os": [ 445 | "darwin" 446 | ], 447 | "engines": { 448 | "node": ">=10" 449 | } 450 | }, 451 | "node_modules/@swc/core-darwin-x64": { 452 | "version": "1.3.31", 453 | "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.31.tgz", 454 | "integrity": "sha512-qLkDgoghoOS2jkBex/vhLXzm9JSlQIPG0it8VVbEHXJ5BTHxJSDi2H1wSvY6Xv+7PlvMAFjSM48Z+AYCG4lpIQ==", 455 | "cpu": [ 456 | "x64" 457 | ], 458 | "dev": true, 459 | "optional": true, 460 | "os": [ 461 | "darwin" 462 | ], 463 | "engines": { 464 | "node": ">=10" 465 | } 466 | }, 467 | "node_modules/@swc/core-linux-arm-gnueabihf": { 468 | "version": "1.3.31", 469 | "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.31.tgz", 470 | "integrity": "sha512-r236OahAsapz65ALHu0H90vJkRrIh6ZRaDxqwvzlIaXFsD4usxEJKnZV0H3l/NE3LntDUyVim55X+JKiyCgLmg==", 471 | "cpu": [ 472 | "arm" 473 | ], 474 | "dev": true, 475 | "optional": true, 476 | "os": [ 477 | "linux" 478 | ], 479 | "engines": { 480 | "node": ">=10" 481 | } 482 | }, 483 | "node_modules/@swc/core-linux-arm64-gnu": { 484 | "version": "1.3.31", 485 | "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.31.tgz", 486 | "integrity": "sha512-pwdaXsoTM9gr6NKHTusE2v1FvueQsSais3032JL4g6S4fA2+goBSAIDAnJXk6/TXfUDnRPiobDctN58mzeFmmg==", 487 | "cpu": [ 488 | "arm64" 489 | ], 490 | "dev": true, 491 | "optional": true, 492 | "os": [ 493 | "linux" 494 | ], 495 | "engines": { 496 | "node": ">=10" 497 | } 498 | }, 499 | "node_modules/@swc/core-linux-arm64-musl": { 500 | "version": "1.3.31", 501 | "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.31.tgz", 502 | "integrity": "sha512-lpvpz3jjRREWr+UngOy+b1vhbgYgi8eP4ZORgnUCWWk+MIHp4gLmveN8spH+hCc+uzLw8nMRHPndLfTF8vQ/GQ==", 503 | "cpu": [ 504 | "arm64" 505 | ], 506 | "dev": true, 507 | "optional": true, 508 | "os": [ 509 | "linux" 510 | ], 511 | "engines": { 512 | "node": ">=10" 513 | } 514 | }, 515 | "node_modules/@swc/core-linux-x64-gnu": { 516 | "version": "1.3.31", 517 | "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.31.tgz", 518 | "integrity": "sha512-prN7cg2GVD/rYwPYtyomuzhPKxoPuwRRKp/wUtVV3GI2e6122cT/cRE3UgJVgrpBkqf9LgbXlPhT5oimYjujUg==", 519 | "cpu": [ 520 | "x64" 521 | ], 522 | "dev": true, 523 | "optional": true, 524 | "os": [ 525 | "linux" 526 | ], 527 | "engines": { 528 | "node": ">=10" 529 | } 530 | }, 531 | "node_modules/@swc/core-linux-x64-musl": { 532 | "version": "1.3.31", 533 | "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.31.tgz", 534 | "integrity": "sha512-2/xgDYeCmzbdz0o24Zxz/Qo2Ql9rN9eErN9v03MNpUJinVgeWqzBS85PzXAIWHzCCMwIcQRDo2zBXgvCaGmROg==", 535 | "cpu": [ 536 | "x64" 537 | ], 538 | "dev": true, 539 | "optional": true, 540 | "os": [ 541 | "linux" 542 | ], 543 | "engines": { 544 | "node": ">=10" 545 | } 546 | }, 547 | "node_modules/@swc/core-win32-arm64-msvc": { 548 | "version": "1.3.31", 549 | "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.31.tgz", 550 | "integrity": "sha512-F1oXyQN7XtC+RkVXJhs1TzP9tEpAEbcLlv7F/jSntnsuq6alxY70vmoc163jhPWAm4AjY3QwXiDLDc/2VFFewg==", 551 | "cpu": [ 552 | "arm64" 553 | ], 554 | "dev": true, 555 | "optional": true, 556 | "os": [ 557 | "win32" 558 | ], 559 | "engines": { 560 | "node": ">=10" 561 | } 562 | }, 563 | "node_modules/@swc/core-win32-ia32-msvc": { 564 | "version": "1.3.31", 565 | "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.31.tgz", 566 | "integrity": "sha512-PYculWKvAbbihKPSmC8pZ/5dFsax3BF2k3INwSkX4JskanlKI4ITfBWHeVrs9U58t+swsJ/UFoqak7deM1KiXw==", 567 | "cpu": [ 568 | "ia32" 569 | ], 570 | "dev": true, 571 | "optional": true, 572 | "os": [ 573 | "win32" 574 | ], 575 | "engines": { 576 | "node": ">=10" 577 | } 578 | }, 579 | "node_modules/@swc/core-win32-x64-msvc": { 580 | "version": "1.3.31", 581 | "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.31.tgz", 582 | "integrity": "sha512-SGbGanxrP1raRBGM9v1gwn4TH48/HD3wfS9s7fXDVj+xYMOpACGU20GRwqP6FLO9aRMKijc/z9Ie0iyyTaEYYg==", 583 | "cpu": [ 584 | "x64" 585 | ], 586 | "dev": true, 587 | "optional": true, 588 | "os": [ 589 | "win32" 590 | ], 591 | "engines": { 592 | "node": ">=10" 593 | } 594 | }, 595 | "node_modules/@types/prop-types": { 596 | "version": "15.7.5", 597 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", 598 | "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", 599 | "dev": true 600 | }, 601 | "node_modules/@types/react": { 602 | "version": "18.0.27", 603 | "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.27.tgz", 604 | "integrity": "sha512-3vtRKHgVxu3Jp9t718R9BuzoD4NcQ8YJ5XRzsSKxNDiDonD2MXIT1TmSkenxuCycZJoQT5d2vE8LwWJxBC1gmA==", 605 | "dev": true, 606 | "dependencies": { 607 | "@types/prop-types": "*", 608 | "@types/scheduler": "*", 609 | "csstype": "^3.0.2" 610 | } 611 | }, 612 | "node_modules/@types/react-dom": { 613 | "version": "18.0.10", 614 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.10.tgz", 615 | "integrity": "sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==", 616 | "dev": true, 617 | "dependencies": { 618 | "@types/react": "*" 619 | } 620 | }, 621 | "node_modules/@types/scheduler": { 622 | "version": "0.16.2", 623 | "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", 624 | "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", 625 | "dev": true 626 | }, 627 | "node_modules/@vitejs/plugin-react-swc": { 628 | "version": "3.0.1", 629 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.0.1.tgz", 630 | "integrity": "sha512-3GQ2oruZO9j8dSHcI0MUeOZQBhjYyDQsF/pKY4Px+CJxn0M16OhgFeEzUjeuwci4zhhjoNIDE9aFNaV5GMQ09g==", 631 | "dev": true, 632 | "dependencies": { 633 | "@swc/core": "^1.3.22" 634 | }, 635 | "peerDependencies": { 636 | "vite": "^4" 637 | } 638 | }, 639 | "node_modules/csstype": { 640 | "version": "3.1.1", 641 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", 642 | "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", 643 | "dev": true 644 | }, 645 | "node_modules/esbuild": { 646 | "version": "0.16.17", 647 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", 648 | "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", 649 | "dev": true, 650 | "hasInstallScript": true, 651 | "bin": { 652 | "esbuild": "bin/esbuild" 653 | }, 654 | "engines": { 655 | "node": ">=12" 656 | }, 657 | "optionalDependencies": { 658 | "@esbuild/android-arm": "0.16.17", 659 | "@esbuild/android-arm64": "0.16.17", 660 | "@esbuild/android-x64": "0.16.17", 661 | "@esbuild/darwin-arm64": "0.16.17", 662 | "@esbuild/darwin-x64": "0.16.17", 663 | "@esbuild/freebsd-arm64": "0.16.17", 664 | "@esbuild/freebsd-x64": "0.16.17", 665 | "@esbuild/linux-arm": "0.16.17", 666 | "@esbuild/linux-arm64": "0.16.17", 667 | "@esbuild/linux-ia32": "0.16.17", 668 | "@esbuild/linux-loong64": "0.16.17", 669 | "@esbuild/linux-mips64el": "0.16.17", 670 | "@esbuild/linux-ppc64": "0.16.17", 671 | "@esbuild/linux-riscv64": "0.16.17", 672 | "@esbuild/linux-s390x": "0.16.17", 673 | "@esbuild/linux-x64": "0.16.17", 674 | "@esbuild/netbsd-x64": "0.16.17", 675 | "@esbuild/openbsd-x64": "0.16.17", 676 | "@esbuild/sunos-x64": "0.16.17", 677 | "@esbuild/win32-arm64": "0.16.17", 678 | "@esbuild/win32-ia32": "0.16.17", 679 | "@esbuild/win32-x64": "0.16.17" 680 | } 681 | }, 682 | "node_modules/fsevents": { 683 | "version": "2.3.2", 684 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 685 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 686 | "dev": true, 687 | "hasInstallScript": true, 688 | "optional": true, 689 | "os": [ 690 | "darwin" 691 | ], 692 | "engines": { 693 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 694 | } 695 | }, 696 | "node_modules/function-bind": { 697 | "version": "1.1.1", 698 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 699 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 700 | "dev": true 701 | }, 702 | "node_modules/has": { 703 | "version": "1.0.3", 704 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 705 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 706 | "dev": true, 707 | "dependencies": { 708 | "function-bind": "^1.1.1" 709 | }, 710 | "engines": { 711 | "node": ">= 0.4.0" 712 | } 713 | }, 714 | "node_modules/is-core-module": { 715 | "version": "2.11.0", 716 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", 717 | "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", 718 | "dev": true, 719 | "dependencies": { 720 | "has": "^1.0.3" 721 | }, 722 | "funding": { 723 | "url": "https://github.com/sponsors/ljharb" 724 | } 725 | }, 726 | "node_modules/js-tokens": { 727 | "version": "4.0.0", 728 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 729 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 730 | }, 731 | "node_modules/loose-envify": { 732 | "version": "1.4.0", 733 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 734 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 735 | "dependencies": { 736 | "js-tokens": "^3.0.0 || ^4.0.0" 737 | }, 738 | "bin": { 739 | "loose-envify": "cli.js" 740 | } 741 | }, 742 | "node_modules/nanoid": { 743 | "version": "3.3.4", 744 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 745 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", 746 | "dev": true, 747 | "bin": { 748 | "nanoid": "bin/nanoid.cjs" 749 | }, 750 | "engines": { 751 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 752 | } 753 | }, 754 | "node_modules/path-parse": { 755 | "version": "1.0.7", 756 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 757 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 758 | "dev": true 759 | }, 760 | "node_modules/picocolors": { 761 | "version": "1.0.0", 762 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 763 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 764 | "dev": true 765 | }, 766 | "node_modules/postcss": { 767 | "version": "8.4.21", 768 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", 769 | "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", 770 | "dev": true, 771 | "funding": [ 772 | { 773 | "type": "opencollective", 774 | "url": "https://opencollective.com/postcss/" 775 | }, 776 | { 777 | "type": "tidelift", 778 | "url": "https://tidelift.com/funding/github/npm/postcss" 779 | } 780 | ], 781 | "dependencies": { 782 | "nanoid": "^3.3.4", 783 | "picocolors": "^1.0.0", 784 | "source-map-js": "^1.0.2" 785 | }, 786 | "engines": { 787 | "node": "^10 || ^12 || >=14" 788 | } 789 | }, 790 | "node_modules/react": { 791 | "version": "18.2.0", 792 | "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", 793 | "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", 794 | "dependencies": { 795 | "loose-envify": "^1.1.0" 796 | }, 797 | "engines": { 798 | "node": ">=0.10.0" 799 | } 800 | }, 801 | "node_modules/react-dom": { 802 | "version": "18.2.0", 803 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", 804 | "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", 805 | "dependencies": { 806 | "loose-envify": "^1.1.0", 807 | "scheduler": "^0.23.0" 808 | }, 809 | "peerDependencies": { 810 | "react": "^18.2.0" 811 | } 812 | }, 813 | "node_modules/resolve": { 814 | "version": "1.22.1", 815 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 816 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 817 | "dev": true, 818 | "dependencies": { 819 | "is-core-module": "^2.9.0", 820 | "path-parse": "^1.0.7", 821 | "supports-preserve-symlinks-flag": "^1.0.0" 822 | }, 823 | "bin": { 824 | "resolve": "bin/resolve" 825 | }, 826 | "funding": { 827 | "url": "https://github.com/sponsors/ljharb" 828 | } 829 | }, 830 | "node_modules/rollup": { 831 | "version": "3.12.0", 832 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.12.0.tgz", 833 | "integrity": "sha512-4MZ8kA2HNYahIjz63rzrMMRvDqQDeS9LoriJvMuV0V6zIGysP36e9t4yObUfwdT9h/szXoHQideICftcdZklWg==", 834 | "dev": true, 835 | "bin": { 836 | "rollup": "dist/bin/rollup" 837 | }, 838 | "engines": { 839 | "node": ">=14.18.0", 840 | "npm": ">=8.0.0" 841 | }, 842 | "optionalDependencies": { 843 | "fsevents": "~2.3.2" 844 | } 845 | }, 846 | "node_modules/scheduler": { 847 | "version": "0.23.0", 848 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", 849 | "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", 850 | "dependencies": { 851 | "loose-envify": "^1.1.0" 852 | } 853 | }, 854 | "node_modules/source-map-js": { 855 | "version": "1.0.2", 856 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 857 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 858 | "dev": true, 859 | "engines": { 860 | "node": ">=0.10.0" 861 | } 862 | }, 863 | "node_modules/supports-preserve-symlinks-flag": { 864 | "version": "1.0.0", 865 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 866 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 867 | "dev": true, 868 | "engines": { 869 | "node": ">= 0.4" 870 | }, 871 | "funding": { 872 | "url": "https://github.com/sponsors/ljharb" 873 | } 874 | }, 875 | "node_modules/typescript": { 876 | "version": "4.9.5", 877 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", 878 | "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", 879 | "dev": true, 880 | "bin": { 881 | "tsc": "bin/tsc", 882 | "tsserver": "bin/tsserver" 883 | }, 884 | "engines": { 885 | "node": ">=4.2.0" 886 | } 887 | }, 888 | "node_modules/use-prefers-color-scheme": { 889 | "resolved": "..", 890 | "link": true 891 | }, 892 | "node_modules/vite": { 893 | "version": "4.0.4", 894 | "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.4.tgz", 895 | "integrity": "sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==", 896 | "dev": true, 897 | "dependencies": { 898 | "esbuild": "^0.16.3", 899 | "postcss": "^8.4.20", 900 | "resolve": "^1.22.1", 901 | "rollup": "^3.7.0" 902 | }, 903 | "bin": { 904 | "vite": "bin/vite.js" 905 | }, 906 | "engines": { 907 | "node": "^14.18.0 || >=16.0.0" 908 | }, 909 | "optionalDependencies": { 910 | "fsevents": "~2.3.2" 911 | }, 912 | "peerDependencies": { 913 | "@types/node": ">= 14", 914 | "less": "*", 915 | "sass": "*", 916 | "stylus": "*", 917 | "sugarss": "*", 918 | "terser": "^5.4.0" 919 | }, 920 | "peerDependenciesMeta": { 921 | "@types/node": { 922 | "optional": true 923 | }, 924 | "less": { 925 | "optional": true 926 | }, 927 | "sass": { 928 | "optional": true 929 | }, 930 | "stylus": { 931 | "optional": true 932 | }, 933 | "sugarss": { 934 | "optional": true 935 | }, 936 | "terser": { 937 | "optional": true 938 | } 939 | } 940 | } 941 | }, 942 | "dependencies": { 943 | "@esbuild/android-arm": { 944 | "version": "0.16.17", 945 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", 946 | "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", 947 | "dev": true, 948 | "optional": true 949 | }, 950 | "@esbuild/android-arm64": { 951 | "version": "0.16.17", 952 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", 953 | "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", 954 | "dev": true, 955 | "optional": true 956 | }, 957 | "@esbuild/android-x64": { 958 | "version": "0.16.17", 959 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", 960 | "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", 961 | "dev": true, 962 | "optional": true 963 | }, 964 | "@esbuild/darwin-arm64": { 965 | "version": "0.16.17", 966 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", 967 | "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", 968 | "dev": true, 969 | "optional": true 970 | }, 971 | "@esbuild/darwin-x64": { 972 | "version": "0.16.17", 973 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", 974 | "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", 975 | "dev": true, 976 | "optional": true 977 | }, 978 | "@esbuild/freebsd-arm64": { 979 | "version": "0.16.17", 980 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", 981 | "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", 982 | "dev": true, 983 | "optional": true 984 | }, 985 | "@esbuild/freebsd-x64": { 986 | "version": "0.16.17", 987 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", 988 | "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", 989 | "dev": true, 990 | "optional": true 991 | }, 992 | "@esbuild/linux-arm": { 993 | "version": "0.16.17", 994 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", 995 | "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", 996 | "dev": true, 997 | "optional": true 998 | }, 999 | "@esbuild/linux-arm64": { 1000 | "version": "0.16.17", 1001 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", 1002 | "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", 1003 | "dev": true, 1004 | "optional": true 1005 | }, 1006 | "@esbuild/linux-ia32": { 1007 | "version": "0.16.17", 1008 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", 1009 | "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", 1010 | "dev": true, 1011 | "optional": true 1012 | }, 1013 | "@esbuild/linux-loong64": { 1014 | "version": "0.16.17", 1015 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", 1016 | "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", 1017 | "dev": true, 1018 | "optional": true 1019 | }, 1020 | "@esbuild/linux-mips64el": { 1021 | "version": "0.16.17", 1022 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", 1023 | "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", 1024 | "dev": true, 1025 | "optional": true 1026 | }, 1027 | "@esbuild/linux-ppc64": { 1028 | "version": "0.16.17", 1029 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", 1030 | "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", 1031 | "dev": true, 1032 | "optional": true 1033 | }, 1034 | "@esbuild/linux-riscv64": { 1035 | "version": "0.16.17", 1036 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", 1037 | "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", 1038 | "dev": true, 1039 | "optional": true 1040 | }, 1041 | "@esbuild/linux-s390x": { 1042 | "version": "0.16.17", 1043 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", 1044 | "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", 1045 | "dev": true, 1046 | "optional": true 1047 | }, 1048 | "@esbuild/linux-x64": { 1049 | "version": "0.16.17", 1050 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", 1051 | "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", 1052 | "dev": true, 1053 | "optional": true 1054 | }, 1055 | "@esbuild/netbsd-x64": { 1056 | "version": "0.16.17", 1057 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", 1058 | "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", 1059 | "dev": true, 1060 | "optional": true 1061 | }, 1062 | "@esbuild/openbsd-x64": { 1063 | "version": "0.16.17", 1064 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", 1065 | "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", 1066 | "dev": true, 1067 | "optional": true 1068 | }, 1069 | "@esbuild/sunos-x64": { 1070 | "version": "0.16.17", 1071 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", 1072 | "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", 1073 | "dev": true, 1074 | "optional": true 1075 | }, 1076 | "@esbuild/win32-arm64": { 1077 | "version": "0.16.17", 1078 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", 1079 | "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", 1080 | "dev": true, 1081 | "optional": true 1082 | }, 1083 | "@esbuild/win32-ia32": { 1084 | "version": "0.16.17", 1085 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", 1086 | "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", 1087 | "dev": true, 1088 | "optional": true 1089 | }, 1090 | "@esbuild/win32-x64": { 1091 | "version": "0.16.17", 1092 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", 1093 | "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", 1094 | "dev": true, 1095 | "optional": true 1096 | }, 1097 | "@swc/core": { 1098 | "version": "1.3.31", 1099 | "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.31.tgz", 1100 | "integrity": "sha512-YD3PKF0CHfxWU9+X900AXH3Wx1ozzBBHuSF1Md1o9ygeboj2aMnVhNwwyZ96jVlqdeDCX+MHZfNJ07IxzY0IZw==", 1101 | "dev": true, 1102 | "requires": { 1103 | "@swc/core-darwin-arm64": "1.3.31", 1104 | "@swc/core-darwin-x64": "1.3.31", 1105 | "@swc/core-linux-arm-gnueabihf": "1.3.31", 1106 | "@swc/core-linux-arm64-gnu": "1.3.31", 1107 | "@swc/core-linux-arm64-musl": "1.3.31", 1108 | "@swc/core-linux-x64-gnu": "1.3.31", 1109 | "@swc/core-linux-x64-musl": "1.3.31", 1110 | "@swc/core-win32-arm64-msvc": "1.3.31", 1111 | "@swc/core-win32-ia32-msvc": "1.3.31", 1112 | "@swc/core-win32-x64-msvc": "1.3.31" 1113 | } 1114 | }, 1115 | "@swc/core-darwin-arm64": { 1116 | "version": "1.3.31", 1117 | "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.31.tgz", 1118 | "integrity": "sha512-Iz7zgLVHl1cnVUiKVvF/KpvCW0WR3spXiRtJsgslWqCNUZqt/bkf9n/U9vNqQBnOTBGugCyOwhxoNYBTSfRqIQ==", 1119 | "dev": true, 1120 | "optional": true 1121 | }, 1122 | "@swc/core-darwin-x64": { 1123 | "version": "1.3.31", 1124 | "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.31.tgz", 1125 | "integrity": "sha512-qLkDgoghoOS2jkBex/vhLXzm9JSlQIPG0it8VVbEHXJ5BTHxJSDi2H1wSvY6Xv+7PlvMAFjSM48Z+AYCG4lpIQ==", 1126 | "dev": true, 1127 | "optional": true 1128 | }, 1129 | "@swc/core-linux-arm-gnueabihf": { 1130 | "version": "1.3.31", 1131 | "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.31.tgz", 1132 | "integrity": "sha512-r236OahAsapz65ALHu0H90vJkRrIh6ZRaDxqwvzlIaXFsD4usxEJKnZV0H3l/NE3LntDUyVim55X+JKiyCgLmg==", 1133 | "dev": true, 1134 | "optional": true 1135 | }, 1136 | "@swc/core-linux-arm64-gnu": { 1137 | "version": "1.3.31", 1138 | "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.31.tgz", 1139 | "integrity": "sha512-pwdaXsoTM9gr6NKHTusE2v1FvueQsSais3032JL4g6S4fA2+goBSAIDAnJXk6/TXfUDnRPiobDctN58mzeFmmg==", 1140 | "dev": true, 1141 | "optional": true 1142 | }, 1143 | "@swc/core-linux-arm64-musl": { 1144 | "version": "1.3.31", 1145 | "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.31.tgz", 1146 | "integrity": "sha512-lpvpz3jjRREWr+UngOy+b1vhbgYgi8eP4ZORgnUCWWk+MIHp4gLmveN8spH+hCc+uzLw8nMRHPndLfTF8vQ/GQ==", 1147 | "dev": true, 1148 | "optional": true 1149 | }, 1150 | "@swc/core-linux-x64-gnu": { 1151 | "version": "1.3.31", 1152 | "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.31.tgz", 1153 | "integrity": "sha512-prN7cg2GVD/rYwPYtyomuzhPKxoPuwRRKp/wUtVV3GI2e6122cT/cRE3UgJVgrpBkqf9LgbXlPhT5oimYjujUg==", 1154 | "dev": true, 1155 | "optional": true 1156 | }, 1157 | "@swc/core-linux-x64-musl": { 1158 | "version": "1.3.31", 1159 | "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.31.tgz", 1160 | "integrity": "sha512-2/xgDYeCmzbdz0o24Zxz/Qo2Ql9rN9eErN9v03MNpUJinVgeWqzBS85PzXAIWHzCCMwIcQRDo2zBXgvCaGmROg==", 1161 | "dev": true, 1162 | "optional": true 1163 | }, 1164 | "@swc/core-win32-arm64-msvc": { 1165 | "version": "1.3.31", 1166 | "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.31.tgz", 1167 | "integrity": "sha512-F1oXyQN7XtC+RkVXJhs1TzP9tEpAEbcLlv7F/jSntnsuq6alxY70vmoc163jhPWAm4AjY3QwXiDLDc/2VFFewg==", 1168 | "dev": true, 1169 | "optional": true 1170 | }, 1171 | "@swc/core-win32-ia32-msvc": { 1172 | "version": "1.3.31", 1173 | "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.31.tgz", 1174 | "integrity": "sha512-PYculWKvAbbihKPSmC8pZ/5dFsax3BF2k3INwSkX4JskanlKI4ITfBWHeVrs9U58t+swsJ/UFoqak7deM1KiXw==", 1175 | "dev": true, 1176 | "optional": true 1177 | }, 1178 | "@swc/core-win32-x64-msvc": { 1179 | "version": "1.3.31", 1180 | "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.31.tgz", 1181 | "integrity": "sha512-SGbGanxrP1raRBGM9v1gwn4TH48/HD3wfS9s7fXDVj+xYMOpACGU20GRwqP6FLO9aRMKijc/z9Ie0iyyTaEYYg==", 1182 | "dev": true, 1183 | "optional": true 1184 | }, 1185 | "@types/prop-types": { 1186 | "version": "15.7.5", 1187 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", 1188 | "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", 1189 | "dev": true 1190 | }, 1191 | "@types/react": { 1192 | "version": "18.0.27", 1193 | "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.27.tgz", 1194 | "integrity": "sha512-3vtRKHgVxu3Jp9t718R9BuzoD4NcQ8YJ5XRzsSKxNDiDonD2MXIT1TmSkenxuCycZJoQT5d2vE8LwWJxBC1gmA==", 1195 | "dev": true, 1196 | "requires": { 1197 | "@types/prop-types": "*", 1198 | "@types/scheduler": "*", 1199 | "csstype": "^3.0.2" 1200 | } 1201 | }, 1202 | "@types/react-dom": { 1203 | "version": "18.0.10", 1204 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.10.tgz", 1205 | "integrity": "sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==", 1206 | "dev": true, 1207 | "requires": { 1208 | "@types/react": "*" 1209 | } 1210 | }, 1211 | "@types/scheduler": { 1212 | "version": "0.16.2", 1213 | "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", 1214 | "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", 1215 | "dev": true 1216 | }, 1217 | "@vitejs/plugin-react-swc": { 1218 | "version": "3.0.1", 1219 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.0.1.tgz", 1220 | "integrity": "sha512-3GQ2oruZO9j8dSHcI0MUeOZQBhjYyDQsF/pKY4Px+CJxn0M16OhgFeEzUjeuwci4zhhjoNIDE9aFNaV5GMQ09g==", 1221 | "dev": true, 1222 | "requires": { 1223 | "@swc/core": "^1.3.22" 1224 | } 1225 | }, 1226 | "csstype": { 1227 | "version": "3.1.1", 1228 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", 1229 | "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", 1230 | "dev": true 1231 | }, 1232 | "esbuild": { 1233 | "version": "0.16.17", 1234 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", 1235 | "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", 1236 | "dev": true, 1237 | "requires": { 1238 | "@esbuild/android-arm": "0.16.17", 1239 | "@esbuild/android-arm64": "0.16.17", 1240 | "@esbuild/android-x64": "0.16.17", 1241 | "@esbuild/darwin-arm64": "0.16.17", 1242 | "@esbuild/darwin-x64": "0.16.17", 1243 | "@esbuild/freebsd-arm64": "0.16.17", 1244 | "@esbuild/freebsd-x64": "0.16.17", 1245 | "@esbuild/linux-arm": "0.16.17", 1246 | "@esbuild/linux-arm64": "0.16.17", 1247 | "@esbuild/linux-ia32": "0.16.17", 1248 | "@esbuild/linux-loong64": "0.16.17", 1249 | "@esbuild/linux-mips64el": "0.16.17", 1250 | "@esbuild/linux-ppc64": "0.16.17", 1251 | "@esbuild/linux-riscv64": "0.16.17", 1252 | "@esbuild/linux-s390x": "0.16.17", 1253 | "@esbuild/linux-x64": "0.16.17", 1254 | "@esbuild/netbsd-x64": "0.16.17", 1255 | "@esbuild/openbsd-x64": "0.16.17", 1256 | "@esbuild/sunos-x64": "0.16.17", 1257 | "@esbuild/win32-arm64": "0.16.17", 1258 | "@esbuild/win32-ia32": "0.16.17", 1259 | "@esbuild/win32-x64": "0.16.17" 1260 | } 1261 | }, 1262 | "fsevents": { 1263 | "version": "2.3.2", 1264 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1265 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1266 | "dev": true, 1267 | "optional": true 1268 | }, 1269 | "function-bind": { 1270 | "version": "1.1.1", 1271 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1272 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1273 | "dev": true 1274 | }, 1275 | "has": { 1276 | "version": "1.0.3", 1277 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1278 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1279 | "dev": true, 1280 | "requires": { 1281 | "function-bind": "^1.1.1" 1282 | } 1283 | }, 1284 | "is-core-module": { 1285 | "version": "2.11.0", 1286 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", 1287 | "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", 1288 | "dev": true, 1289 | "requires": { 1290 | "has": "^1.0.3" 1291 | } 1292 | }, 1293 | "js-tokens": { 1294 | "version": "4.0.0", 1295 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1296 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 1297 | }, 1298 | "loose-envify": { 1299 | "version": "1.4.0", 1300 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1301 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1302 | "requires": { 1303 | "js-tokens": "^3.0.0 || ^4.0.0" 1304 | } 1305 | }, 1306 | "nanoid": { 1307 | "version": "3.3.4", 1308 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 1309 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", 1310 | "dev": true 1311 | }, 1312 | "path-parse": { 1313 | "version": "1.0.7", 1314 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1315 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1316 | "dev": true 1317 | }, 1318 | "picocolors": { 1319 | "version": "1.0.0", 1320 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1321 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 1322 | "dev": true 1323 | }, 1324 | "postcss": { 1325 | "version": "8.4.21", 1326 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", 1327 | "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", 1328 | "dev": true, 1329 | "requires": { 1330 | "nanoid": "^3.3.4", 1331 | "picocolors": "^1.0.0", 1332 | "source-map-js": "^1.0.2" 1333 | } 1334 | }, 1335 | "react": { 1336 | "version": "18.2.0", 1337 | "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", 1338 | "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", 1339 | "requires": { 1340 | "loose-envify": "^1.1.0" 1341 | } 1342 | }, 1343 | "react-dom": { 1344 | "version": "18.2.0", 1345 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", 1346 | "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", 1347 | "requires": { 1348 | "loose-envify": "^1.1.0", 1349 | "scheduler": "^0.23.0" 1350 | } 1351 | }, 1352 | "resolve": { 1353 | "version": "1.22.1", 1354 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 1355 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 1356 | "dev": true, 1357 | "requires": { 1358 | "is-core-module": "^2.9.0", 1359 | "path-parse": "^1.0.7", 1360 | "supports-preserve-symlinks-flag": "^1.0.0" 1361 | } 1362 | }, 1363 | "rollup": { 1364 | "version": "3.12.0", 1365 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.12.0.tgz", 1366 | "integrity": "sha512-4MZ8kA2HNYahIjz63rzrMMRvDqQDeS9LoriJvMuV0V6zIGysP36e9t4yObUfwdT9h/szXoHQideICftcdZklWg==", 1367 | "dev": true, 1368 | "requires": { 1369 | "fsevents": "~2.3.2" 1370 | } 1371 | }, 1372 | "scheduler": { 1373 | "version": "0.23.0", 1374 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", 1375 | "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", 1376 | "requires": { 1377 | "loose-envify": "^1.1.0" 1378 | } 1379 | }, 1380 | "source-map-js": { 1381 | "version": "1.0.2", 1382 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1383 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 1384 | "dev": true 1385 | }, 1386 | "supports-preserve-symlinks-flag": { 1387 | "version": "1.0.0", 1388 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1389 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1390 | "dev": true 1391 | }, 1392 | "typescript": { 1393 | "version": "4.9.5", 1394 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", 1395 | "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", 1396 | "dev": true 1397 | }, 1398 | "use-prefers-color-scheme": { 1399 | "version": "file:..", 1400 | "requires": { 1401 | "@semantic-release/changelog": "^6.0.2", 1402 | "@semantic-release/commit-analyzer": "^9.0.2", 1403 | "@semantic-release/git": "^10.0.1", 1404 | "@semantic-release/github": "^8.0.7", 1405 | "@semantic-release/npm": "^9.0.2", 1406 | "@semantic-release/release-notes-generator": "^10.0.3", 1407 | "@testing-library/react": "^13.4.0", 1408 | "@types/jest": "^29.4.0", 1409 | "@types/react": "^18.0.27", 1410 | "esbuild": "^0.17.5", 1411 | "eslint": "^8.33.0", 1412 | "eslint-config-prettier": "^8.6.0", 1413 | "eslint-config-react-app": "^7.0.1", 1414 | "eslint-plugin-import": "^2.27.5", 1415 | "eslint-plugin-prettier": "^4.2.1", 1416 | "prettier": "^2.8.3", 1417 | "react": "^18.2.0", 1418 | "react-scripts": "^5.0.1", 1419 | "rimraf": "^4.1.2", 1420 | "semantic-release": "^20.1.0", 1421 | "typescript": "^4.9.5" 1422 | } 1423 | }, 1424 | "vite": { 1425 | "version": "4.0.4", 1426 | "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.4.tgz", 1427 | "integrity": "sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==", 1428 | "dev": true, 1429 | "requires": { 1430 | "esbuild": "^0.16.3", 1431 | "fsevents": "~2.3.2", 1432 | "postcss": "^8.4.20", 1433 | "resolve": "^1.22.1", 1434 | "rollup": "^3.7.0" 1435 | } 1436 | } 1437 | } 1438 | } 1439 | -------------------------------------------------------------------------------- /example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "example", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "tsc && vite build", 9 | "preview": "vite preview" 10 | }, 11 | "dependencies": { 12 | "react": "^18.2.0", 13 | "react-dom": "^18.2.0", 14 | "use-prefers-color-scheme": "file:.." 15 | }, 16 | "devDependencies": { 17 | "@types/react": "^18.0.26", 18 | "@types/react-dom": "^18.0.9", 19 | "@vitejs/plugin-react-swc": "^3.0.0", 20 | "typescript": "^4.9.3", 21 | "vite": "^4.0.0" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /example/public/dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rfoel/use-prefers-color-scheme/237728aa0476f25caabf94a20da4dac8716c98e1/example/public/dark.png -------------------------------------------------------------------------------- /example/public/light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rfoel/use-prefers-color-scheme/237728aa0476f25caabf94a20da4dac8716c98e1/example/public/light.png -------------------------------------------------------------------------------- /example/src/App.tsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect } from 'react' 2 | import usePrefersColorScheme from 'use-prefers-color-scheme' 3 | 4 | const App = () => { 5 | const preferredColorSchema = usePrefersColorScheme() 6 | const isDarkMode = preferredColorSchema === 'dark' 7 | 8 | useEffect(() => { 9 | const favicon = document.querySelector('.favicon') 10 | if (favicon) { 11 | if (isDarkMode) favicon.href = 'dark.png' 12 | else favicon.href = 'light.png' 13 | } 14 | }) 15 | 16 | return ( 17 |
23 | You are using {isDarkMode ? 'Dark Mode 🌚' : 'Light Mode 🌞'}! 24 |
25 | ) 26 | } 27 | 28 | export default App 29 | -------------------------------------------------------------------------------- /example/src/index.css: -------------------------------------------------------------------------------- 1 | html, 2 | body, 3 | #root { 4 | font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 5 | Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; 6 | height: 100%; 7 | margin: 0; 8 | padding: 0; 9 | } 10 | 11 | div { 12 | align-items: center; 13 | display: flex; 14 | font-size: 2em; 15 | height: 100%; 16 | justify-content: center; 17 | padding: 24px; 18 | text-align: center; 19 | width: 100%; 20 | } 21 | -------------------------------------------------------------------------------- /example/src/main.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom/client' 3 | 4 | import App from './App' 5 | import './index.css' 6 | 7 | ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( 8 | 9 | 10 | , 11 | ) 12 | -------------------------------------------------------------------------------- /example/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /example/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "useDefineForClassFields": true, 5 | "lib": ["DOM", "DOM.Iterable", "ESNext"], 6 | "allowJs": false, 7 | "skipLibCheck": true, 8 | "esModuleInterop": false, 9 | "allowSyntheticDefaultImports": true, 10 | "strict": true, 11 | "forceConsistentCasingInFileNames": true, 12 | "module": "ESNext", 13 | "moduleResolution": "Node", 14 | "resolveJsonModule": true, 15 | "isolatedModules": true, 16 | "noEmit": true, 17 | "jsx": "react-jsx" 18 | }, 19 | "include": ["src"], 20 | "references": [{ "path": "./tsconfig.node.json" }] 21 | } 22 | -------------------------------------------------------------------------------- /example/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "module": "ESNext", 5 | "moduleResolution": "Node", 6 | "allowSyntheticDefaultImports": true 7 | }, 8 | "include": ["vite.config.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /example/vite.config.ts: -------------------------------------------------------------------------------- 1 | import react from '@vitejs/plugin-react-swc' 2 | import { defineConfig } from 'vite' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()], 7 | }) 8 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "use-prefers-color-scheme", 3 | "version": "1.1.3", 4 | "description": "React hook for determining the preferred color scheme", 5 | "author": "rfoel", 6 | "license": "MIT", 7 | "repository": "rfoel/use-prefers-color-scheme", 8 | "main": "dist/index.cjs.js", 9 | "module": "dist/index.esm.js", 10 | "types": "dist/index.d.ts", 11 | "files": [ 12 | "dist" 13 | ], 14 | "scripts": { 15 | "build:cjs": "esbuild src/index.ts --bundle --sourcemap --minify --format=cjs --outfile=dist/index.cjs.js --external:react --target=esnext,node12.22.0", 16 | "build:esm": "esbuild src/index.ts --bundle --sourcemap --minify --format=esm --outfile=dist/index.esm.js --external:react --target=esnext,node12.22.0", 17 | "build": "npm run build:cjs && npm run build:esm", 18 | "lint": "eslint --cache --cache-location ./node_modules/.cache/eslint .", 19 | "postbuild": "tsc --project tsconfig.build.json", 20 | "prebuild": "rimraf dist", 21 | "test": "vitest", 22 | "typecheck": "tsc --noEmit" 23 | }, 24 | "peerDependencies": { 25 | "react": ">= 16.8.0" 26 | }, 27 | "devDependencies": { 28 | "@semantic-release/changelog": "^6.0.2", 29 | "@semantic-release/commit-analyzer": "^9.0.2", 30 | "@semantic-release/git": "^10.0.1", 31 | "@semantic-release/github": "^8.0.7", 32 | "@semantic-release/npm": "^9.0.2", 33 | "@semantic-release/release-notes-generator": "^10.0.3", 34 | "@testing-library/jest-dom": "^5.16.5", 35 | "@testing-library/react": "^13.4.0", 36 | "@types/jest": "^29.4.0", 37 | "@types/react": "^18.0.27", 38 | "@vitejs/plugin-react": "^3.0.1", 39 | "esbuild": "^0.17.5", 40 | "eslint": "^8.33.0", 41 | "eslint-config-prettier": "^8.6.0", 42 | "eslint-config-react-app": "^7.0.1", 43 | "eslint-plugin-import": "^2.27.5", 44 | "eslint-plugin-prettier": "^4.2.1", 45 | "jsdom": "^21.1.0", 46 | "prettier": "^2.8.3", 47 | "react": "^18.2.0", 48 | "react-scripts": "^5.0.1", 49 | "rimraf": "^4.1.2", 50 | "semantic-release": "^20.1.0", 51 | "typescript": "^4.9.5", 52 | "vitest": "^0.28.3" 53 | }, 54 | "engines": { 55 | "node": ">=8", 56 | "npm": ">=5" 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import * as React from 'react' 2 | 3 | /** 4 | * React hook for determining the preferred color scheme (aka 'prefers-color-scheme'). 5 | * When server side rendered returns `no-preference`. 6 | * 7 | * @see [Usage] https://github.com/rfoel/use-prefers-color-scheme#usage 8 | * @returns {string} String, one of `dark`, `light`, `no-preference` 9 | */ 10 | export const usePrefersColorScheme = () => { 11 | const [preferredColorSchema, setPreferredColorSchema] = React.useState< 12 | 'dark' | 'light' | 'no-preference' 13 | >(() => { 14 | // if window is undefined (SSR), return 'no-preference' 15 | if (typeof window === 'undefined') return 'no-preference' 16 | 17 | // since window.matchMedia is synchronous we can initialize the state with the right value 18 | // preventing a flash of wrong theme on first render 19 | const isDark = window.matchMedia('(prefers-color-scheme: dark)') 20 | const isLight = window.matchMedia('(prefers-color-scheme: light)') 21 | 22 | return isDark.matches ? 'dark' : isLight.matches ? 'light' : 'no-preference' 23 | }) 24 | 25 | // On first render: 26 | // - Ensure window.matchMedia is supported 27 | // - Initialize MediaQueryList objects 28 | // - Check initial state 29 | // - Subscribe on changes 30 | React.useEffect(() => { 31 | if (typeof window.matchMedia !== 'function') return 32 | 33 | // 1. define MediaQueryList observables 34 | const isDark = window.matchMedia('(prefers-color-scheme: dark)') 35 | const isLight = window.matchMedia('(prefers-color-scheme: light)') 36 | 37 | // 2. subscribe on changes 38 | // 39 | // Is modern "matchMedia" implementation ??? 40 | if (typeof isLight.addEventListener === 'function') { 41 | // In modern browsers MediaQueryList should subclass EventTarget 42 | // https://developer.mozilla.org/en-US/docs/Web/API/MediaQueryList 43 | const darkListener = ({ matches }: MediaQueryListEvent) => { 44 | matches && setPreferredColorSchema('dark') 45 | } 46 | const lightListener = ({ matches }: MediaQueryListEvent) => { 47 | matches && setPreferredColorSchema('light') 48 | } 49 | isDark.addEventListener('change', darkListener) 50 | isLight.addEventListener('change', lightListener) 51 | return () => { 52 | isDark.removeEventListener('change', darkListener) 53 | isLight.removeEventListener('change', lightListener) 54 | } 55 | } 56 | 57 | // Is the old "matchMedia" implementation ??? 58 | if (typeof isLight.addListener === 'function') { 59 | // In some early implementations MediaQueryList existed, but did not 60 | // subclass EventTarget 61 | const listener = () => 62 | setPreferredColorSchema( 63 | isDark.matches ? 'dark' : isLight.matches ? 'light' : 'no-preference', 64 | ) 65 | // This is two state updates if a user changes from dark to light, but 66 | // both state updates will be consistent and should be batched by React, 67 | // resulting in only one re-render 68 | isDark.addListener(listener) 69 | isLight.addListener(listener) 70 | return () => { 71 | isDark.removeListener(listener) 72 | isLight.removeListener(listener) 73 | } 74 | } 75 | 76 | // Is an unknown implementation case ??? 77 | return 78 | }, []) 79 | 80 | return preferredColorSchema 81 | } 82 | 83 | export default usePrefersColorScheme 84 | -------------------------------------------------------------------------------- /tests/index.test.ts: -------------------------------------------------------------------------------- 1 | import { renderHook } from '@testing-library/react' 2 | import { describe, it, expect } from 'vitest' 3 | 4 | import usePrefersColorScheme from '../src' 5 | 6 | describe('usePrefersColorScheme', () => { 7 | it('returns preferred color scheme', () => { 8 | const { result } = renderHook(() => usePrefersColorScheme()) 9 | 10 | expect(result.current).toBe('no-preference') 11 | }) 12 | }) 13 | -------------------------------------------------------------------------------- /tests/setup.js: -------------------------------------------------------------------------------- 1 | import matchers from '@testing-library/jest-dom/matchers' 2 | import { cleanup } from '@testing-library/react' 3 | 4 | expect.extend(matchers) 5 | 6 | afterEach(() => { 7 | cleanup() 8 | }) 9 | -------------------------------------------------------------------------------- /tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["./src/index.ts"], 4 | "compilerOptions": { 5 | "emitDeclarationOnly": true, 6 | "isolatedModules": false, 7 | "declaration": true, 8 | "declarationMap": true 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowJs": false, 4 | "alwaysStrict": true, 5 | "declaration": true, 6 | "declarationMap": true, 7 | "emitDecoratorMetadata": true, 8 | "esModuleInterop": true, 9 | "experimentalDecorators": true, 10 | "forceConsistentCasingInFileNames": true, 11 | "isolatedModules": true, 12 | "jsx": "react", 13 | "lib": ["es6", "dom"], 14 | "module": "commonjs", 15 | "moduleResolution": "node", 16 | "noFallthroughCasesInSwitch": true, 17 | "noImplicitAny": false, 18 | "noLib": false, 19 | "noUnusedLocals": false, 20 | "noUnusedParameters": false, 21 | "outDir": "./dist", 22 | "removeComments": true, 23 | "resolveJsonModule": true, 24 | "skipLibCheck": true, 25 | "sourceMap": true, 26 | "strict": false, 27 | "strictBindCallApply": true, 28 | "strictNullChecks": true, 29 | "target": "es6" 30 | }, 31 | "exclude": ["node_modules", "**/*.d.ts", "**/dist/*", "example"] 32 | } 33 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import react from '@vitejs/plugin-react' 2 | import { defineConfig } from 'vite' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()], 7 | test: { 8 | globals: true, 9 | environment: 'jsdom', 10 | setupFiles: './tests/setup.js', 11 | }, 12 | }) 13 | --------------------------------------------------------------------------------