├── .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 | [](https://www.npmjs.com/package/use-prefers-color-scheme)
6 | [](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 | [](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 |
--------------------------------------------------------------------------------