├── sample ├── .gitignore ├── vite.config.ts ├── index.tsx ├── tsconfig.json ├── index.html ├── package.json ├── Sample.css ├── Sample.tsx └── yarn.lock ├── test ├── .gitignore ├── vite.config.ts ├── shared │ └── types.ts ├── tsconfig.json ├── index.html ├── index.tsx ├── package.json ├── MaxDetailOptions.tsx ├── MinDetailOptions.tsx ├── Test.css ├── ValidityOptions.tsx ├── ValueOptions.tsx ├── LocaleOptions.tsx ├── ViewOptions.tsx └── Test.tsx ├── README.md ├── .husky └── pre-commit ├── .github ├── FUNDING.yml └── workflows │ ├── close-stale-issues.yml │ ├── publish.yml │ └── ci.yml ├── .yarnrc.yml ├── .vscode ├── settings.json └── extensions.json ├── packages └── react-daterange-picker │ ├── src │ ├── index.ts │ ├── shared │ │ └── types.ts │ ├── DateRangePicker.css │ ├── DateRangePicker.tsx │ └── DateRangePicker.spec.tsx │ ├── tsconfig.build.json │ ├── vitest.config.ts │ ├── tsconfig.json │ ├── LICENSE │ ├── package.json │ └── README.md ├── .gitattributes ├── .gitignore ├── package.json ├── LICENSE └── biome.json /sample/.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | -------------------------------------------------------------------------------- /test/.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | packages/react-daterange-picker/README.md -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | yarn format --staged --no-errors-on-unmatched --write 2 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: wojtekmaj 2 | open_collective: react-date-picker 3 | -------------------------------------------------------------------------------- /.yarnrc.yml: -------------------------------------------------------------------------------- 1 | enableScripts: false 2 | 3 | logFilters: 4 | - code: YN0076 5 | level: discard 6 | 7 | nodeLinker: node-modules 8 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.defaultFormatter": "biomejs.biome", 3 | "editor.formatOnSave": true, 4 | "search.exclude": { 5 | "**/.yarn": true 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["biomejs.biome"], 3 | "unwantedRecommendations": ["dbaeumer.jshint", "dbaeumer.vscode-eslint", "esbenp.prettier-vscode"] 4 | } 5 | -------------------------------------------------------------------------------- /test/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | import react from '@vitejs/plugin-react'; 3 | 4 | export default defineConfig({ 5 | base: './', 6 | plugins: [react()], 7 | }); 8 | -------------------------------------------------------------------------------- /sample/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | import react from '@vitejs/plugin-react'; 3 | 4 | export default defineConfig({ 5 | base: './', 6 | plugins: [react()], 7 | }); 8 | -------------------------------------------------------------------------------- /packages/react-daterange-picker/src/index.ts: -------------------------------------------------------------------------------- 1 | import DateRangePicker from './DateRangePicker.js'; 2 | 3 | export type { DateRangePickerProps } from './DateRangePicker.js'; 4 | 5 | export { DateRangePicker }; 6 | 7 | export default DateRangePicker; 8 | -------------------------------------------------------------------------------- /test/shared/types.ts: -------------------------------------------------------------------------------- 1 | type Range = [T, T]; 2 | 3 | export type Detail = 'century' | 'decade' | 'year' | 'month'; 4 | 5 | type LooseValuePiece = string | Date | null; 6 | 7 | export type LooseValue = LooseValuePiece | Range; 8 | -------------------------------------------------------------------------------- /packages/react-daterange-picker/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "noEmit": false, 5 | "outDir": "dist", 6 | "rootDir": "src" 7 | }, 8 | "include": ["src"], 9 | "exclude": ["src/**/*.spec.ts", "src/**/*.spec.tsx"] 10 | } 11 | -------------------------------------------------------------------------------- /sample/index.tsx: -------------------------------------------------------------------------------- 1 | import { createRoot } from 'react-dom/client'; 2 | 3 | import Sample from './Sample.js'; 4 | 5 | const root = document.getElementById('root'); 6 | 7 | if (!root) { 8 | throw new Error('Could not find root element'); 9 | } 10 | 11 | createRoot(root).render(); 12 | -------------------------------------------------------------------------------- /test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "isolatedModules": true, 4 | "jsx": "react-jsx", 5 | "module": "preserve", 6 | "moduleDetection": "force", 7 | "noEmit": true, 8 | "noUncheckedIndexedAccess": true, 9 | "skipLibCheck": true, 10 | "strict": true, 11 | "target": "esnext", 12 | "verbatimModuleSyntax": true 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /sample/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "isolatedModules": true, 4 | "jsx": "react-jsx", 5 | "module": "preserve", 6 | "moduleDetection": "force", 7 | "noEmit": true, 8 | "noUncheckedIndexedAccess": true, 9 | "skipLibCheck": true, 10 | "strict": true, 11 | "target": "esnext", 12 | "verbatimModuleSyntax": true 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /test/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | react-daterange-picker test page 7 | 8 | 9 |
10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /test/index.tsx: -------------------------------------------------------------------------------- 1 | import { StrictMode } from 'react'; 2 | import { createRoot } from 'react-dom/client'; 3 | 4 | import Test from './Test.js'; 5 | 6 | const root = document.getElementById('root'); 7 | 8 | if (!root) { 9 | throw new Error('Could not find root element'); 10 | } 11 | 12 | createRoot(root).render( 13 | 14 | 15 | , 16 | ); 17 | -------------------------------------------------------------------------------- /sample/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | react-daterange-picker sample page 7 | 8 | 9 |
10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /packages/react-daterange-picker/vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { playwright } from '@vitest/browser-playwright'; 2 | import { defineConfig } from 'vitest/config'; 3 | 4 | import type { ViteUserConfig } from 'vitest/config'; 5 | 6 | const config: ViteUserConfig = defineConfig({ 7 | test: { 8 | browser: { 9 | enabled: true, 10 | headless: true, 11 | instances: [{ browser: 'chromium' }], 12 | provider: playwright(), 13 | }, 14 | watch: false, 15 | }, 16 | }); 17 | 18 | export default config; 19 | -------------------------------------------------------------------------------- /packages/react-daterange-picker/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "esModuleInterop": true, 5 | "isolatedDeclarations": true, 6 | "isolatedModules": true, 7 | "jsx": "react-jsx", 8 | "module": "nodenext", 9 | "moduleDetection": "force", 10 | "noEmit": true, 11 | "noUncheckedIndexedAccess": true, 12 | "outDir": "dist", 13 | "skipLibCheck": true, 14 | "strict": true, 15 | "target": "es2018", 16 | "verbatimModuleSyntax": true 17 | }, 18 | "exclude": ["dist"] 19 | } 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OS 2 | .DS_Store 3 | 4 | # Cache 5 | .cache 6 | .playwright 7 | .tmp 8 | *.tsbuildinfo 9 | .eslintcache 10 | 11 | # Yarn 12 | .pnp.* 13 | **/.yarn/* 14 | !**/.yarn/patches 15 | !**/.yarn/plugins 16 | !**/.yarn/releases 17 | !**/.yarn/sdks 18 | !**/.yarn/versions 19 | 20 | # Project-generated directories and files 21 | __screenshots__ 22 | coverage 23 | dist 24 | node_modules 25 | playwright-report 26 | test-results 27 | package.tgz 28 | 29 | # Logs 30 | npm-debug.log 31 | yarn-error.log 32 | 33 | # .env files 34 | **/.env 35 | **/.env.* 36 | !**/.env.example 37 | -------------------------------------------------------------------------------- /packages/react-daterange-picker/src/shared/types.ts: -------------------------------------------------------------------------------- 1 | export type Range = [T, T]; 2 | 3 | export type ClassName = string | null | undefined | (string | null | undefined)[]; 4 | 5 | export type CloseReason = 'buttonClick' | 'escape' | 'outsideAction' | 'select'; 6 | 7 | export type Detail = 'century' | 'decade' | 'year' | 'month'; 8 | 9 | type LooseValuePiece = string | Date | null; 10 | 11 | export type LooseValue = LooseValuePiece | Range; 12 | 13 | export type OpenReason = 'buttonClick' | 'focus'; 14 | 15 | export type RangeType = 'century' | 'decade' | 'year' | 'month' | 'day'; 16 | 17 | type ValuePiece = Date | null; 18 | 19 | export type Value = ValuePiece | Range; 20 | -------------------------------------------------------------------------------- /sample/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-daterange-picker-sample-page", 3 | "version": "3.0.0", 4 | "description": "A sample page for React-DateRange-Picker.", 5 | "private": true, 6 | "type": "module", 7 | "scripts": { 8 | "build": "vite build", 9 | "dev": "vite", 10 | "preview": "vite preview" 11 | }, 12 | "author": { 13 | "name": "Wojciech Maj", 14 | "email": "kontakt@wojtekmaj.pl" 15 | }, 16 | "license": "MIT", 17 | "dependencies": { 18 | "@wojtekmaj/react-daterange-picker": "latest", 19 | "react": "^18.2.0", 20 | "react-dom": "^18.2.0" 21 | }, 22 | "devDependencies": { 23 | "@vitejs/plugin-react": "^4.6.0", 24 | "typescript": "^5.9.2", 25 | "vite": "^7.1.11" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@wojtekmaj/react-daterange-picker-monorepo", 3 | "version": "1.0.0", 4 | "description": "@wojtekmaj/react-daterange-picker monorepo", 5 | "type": "module", 6 | "workspaces": [ 7 | "packages/*", 8 | "test" 9 | ], 10 | "scripts": { 11 | "build": "yarn workspace @wojtekmaj/react-daterange-picker build", 12 | "dev": "yarn workspace @wojtekmaj/react-daterange-picker watch & yarn workspace test dev", 13 | "format": "yarn workspaces foreach --all run format", 14 | "lint": "yarn workspaces foreach --all run lint", 15 | "postinstall": "husky", 16 | "test": "yarn workspaces foreach --all run test", 17 | "tsc": "yarn workspaces foreach --all run tsc", 18 | "unit": "yarn workspaces foreach --all run unit" 19 | }, 20 | "devDependencies": { 21 | "husky": "^9.0.0" 22 | }, 23 | "packageManager": "yarn@4.10.3" 24 | } 25 | -------------------------------------------------------------------------------- /sample/Sample.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | height: 100%; 4 | } 5 | 6 | body { 7 | margin: 0; 8 | font-family: 'Segoe UI', Tahoma, sans-serif; 9 | } 10 | 11 | .Sample input, 12 | .Sample button { 13 | font: inherit; 14 | } 15 | 16 | .Sample header { 17 | background-color: #323639; 18 | box-shadow: 0 0 8px rgba(0, 0, 0, 0.5); 19 | padding: 20px; 20 | color: white; 21 | } 22 | 23 | .Sample header h1 { 24 | font-size: inherit; 25 | margin: 0; 26 | } 27 | 28 | .Sample__container { 29 | display: flex; 30 | flex-direction: row; 31 | flex-wrap: wrap; 32 | align-items: flex-start; 33 | margin: 10px 0; 34 | padding: 10px; 35 | } 36 | 37 | .Sample__container > * > * { 38 | margin: 10px; 39 | } 40 | 41 | .Sample__container__content { 42 | display: flex; 43 | max-width: 100%; 44 | flex-basis: 420px; 45 | flex-direction: column; 46 | flex-grow: 100; 47 | align-items: stretch; 48 | } 49 | -------------------------------------------------------------------------------- /.github/workflows/close-stale-issues.yml: -------------------------------------------------------------------------------- 1 | name: Close stale issues 2 | 3 | on: 4 | schedule: 5 | - cron: '0 0 * * 1' # Every Monday 6 | workflow_dispatch: 7 | 8 | jobs: 9 | close-issues: 10 | name: Close stale issues 11 | runs-on: ubuntu-24.04-arm 12 | 13 | steps: 14 | - name: Close stale issues 15 | uses: actions/stale@v8 16 | with: 17 | days-before-issue-stale: 90 18 | days-before-issue-close: 14 19 | stale-issue-label: 'stale' 20 | stale-issue-message: 'This issue is stale because it has been open 90 days with no activity. Remove stale label or comment or this issue will be closed in 14 days.' 21 | close-issue-message: 'This issue was closed because it has been stalled for 14 days with no activity.' 22 | exempt-issue-labels: 'fresh' 23 | remove-issue-stale-when-updated: true 24 | days-before-pr-stale: -1 25 | days-before-pr-close: -1 26 | -------------------------------------------------------------------------------- /test/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "test", 3 | "version": "2.0.0", 4 | "description": "A test page for React-DateRange-Picker.", 5 | "private": true, 6 | "type": "module", 7 | "scripts": { 8 | "build": "vite build", 9 | "dev": "vite", 10 | "format": "biome format", 11 | "lint": "biome lint", 12 | "preview": "vite preview", 13 | "test": "yarn lint && yarn tsc && yarn format", 14 | "tsc": "tsc" 15 | }, 16 | "author": { 17 | "name": "Wojciech Maj", 18 | "email": "kontakt@wojtekmaj.pl" 19 | }, 20 | "license": "MIT", 21 | "dependencies": { 22 | "@wojtekmaj/date-utils": "^2.0.2", 23 | "@wojtekmaj/react-daterange-picker": "workspace:packages/react-daterange-picker", 24 | "react": "^18.2.0", 25 | "react-dom": "^18.2.0" 26 | }, 27 | "devDependencies": { 28 | "@biomejs/biome": "2.2.2", 29 | "@types/react": "*", 30 | "@vitejs/plugin-react": "^4.6.0", 31 | "typescript": "^5.9.2", 32 | "vite": "^7.1.11" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018–2024 Wojciech Maj 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /packages/react-daterange-picker/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018–2024 Wojciech Maj 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /sample/Sample.tsx: -------------------------------------------------------------------------------- 1 | import { useState } from 'react'; 2 | import DateRangePicker from '@wojtekmaj/react-daterange-picker'; 3 | 4 | import './Sample.css'; 5 | 6 | type ValuePiece = Date | null; 7 | 8 | type Value = ValuePiece | [ValuePiece, ValuePiece]; 9 | 10 | const now = new Date(); 11 | const yesterdayBegin = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1); 12 | const todayEnd = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 23, 59, 59, 999); 13 | 14 | export default function Sample() { 15 | const [value, onChange] = useState([yesterdayBegin, todayEnd]); 16 | 17 | return ( 18 |
19 |
20 |

react-daterange-picker sample page

21 |
22 |
23 |
24 | 34 |
35 |
36 |
37 | ); 38 | } 39 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish 2 | 3 | on: 4 | release: 5 | types: [published] 6 | 7 | env: 8 | HUSKY: 0 9 | 10 | permissions: 11 | id-token: write 12 | 13 | jobs: 14 | publish: 15 | name: Publish 16 | runs-on: ubuntu-24.04-arm 17 | 18 | steps: 19 | - name: Checkout 20 | uses: actions/checkout@v4 21 | 22 | - name: Cache Yarn cache 23 | uses: actions/cache@v5 24 | env: 25 | cache-name: yarn-cache 26 | with: 27 | path: ~/.yarn/berry/cache 28 | key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/yarn.lock') }} 29 | restore-keys: | 30 | ${{ runner.os }}-${{ env.cache-name }} 31 | 32 | - name: Use Node.js 33 | uses: actions/setup-node@v6 34 | with: 35 | node-version: '24' 36 | registry-url: 'https://registry.npmjs.org' 37 | 38 | - name: Install Corepack 39 | run: npm install -g corepack 40 | 41 | - name: Install dependencies 42 | run: yarn --immutable 43 | 44 | - name: Publish with latest tag 45 | if: github.event.release.prerelease == false 46 | run: yarn npm publish --tag latest 47 | working-directory: packages/react-daterange-picker 48 | 49 | - name: Publish with next tag 50 | if: github.event.release.prerelease == true 51 | run: yarn npm publish --tag next 52 | working-directory: packages/react-daterange-picker 53 | -------------------------------------------------------------------------------- /test/MaxDetailOptions.tsx: -------------------------------------------------------------------------------- 1 | import type { Detail } from './shared/types.js'; 2 | 3 | const allViews = ['century', 'decade', 'year', 'month'] as const; 4 | 5 | function upperCaseFirstLetter(str: string) { 6 | return str.slice(0, 1).toUpperCase() + str.slice(1); 7 | } 8 | 9 | type MaxDetailOptionsProps = { 10 | maxDetail: Detail; 11 | minDetail: Detail; 12 | setMaxDetail: (maxDetail: Detail) => void; 13 | }; 14 | 15 | export default function MaxDetailOptions({ 16 | maxDetail, 17 | minDetail, 18 | setMaxDetail, 19 | }: MaxDetailOptionsProps) { 20 | function onChange(event: React.ChangeEvent) { 21 | const { value } = event.target; 22 | 23 | setMaxDetail(value as Detail); 24 | } 25 | 26 | const minDetailIndex = allViews.indexOf(minDetail); 27 | 28 | return ( 29 |
30 | Maximum detail 31 | 32 | {allViews.map((view, index) => ( 33 |
34 | index} 37 | id={`max-${view}`} 38 | name="maxDetail" 39 | onChange={onChange} 40 | type="radio" 41 | value={view} 42 | /> 43 | {/* biome-ignore lint/a11y/noLabelWithoutControl: Pinky promise this label won't ever be empty */} 44 | 45 |
46 | ))} 47 |
48 | ); 49 | } 50 | -------------------------------------------------------------------------------- /test/MinDetailOptions.tsx: -------------------------------------------------------------------------------- 1 | import type { Detail } from './shared/types.js'; 2 | 3 | const allViews = ['century', 'decade', 'year', 'month'] as const; 4 | 5 | function upperCaseFirstLetter(str: string) { 6 | return str.slice(0, 1).toUpperCase() + str.slice(1); 7 | } 8 | 9 | type MinDetailOptionsProps = { 10 | maxDetail: Detail; 11 | minDetail: Detail; 12 | setMinDetail: (maxDetail: Detail) => void; 13 | }; 14 | 15 | export default function MinDetailOptions({ 16 | maxDetail, 17 | minDetail, 18 | setMinDetail, 19 | }: MinDetailOptionsProps) { 20 | function onChange(event: React.ChangeEvent) { 21 | const { value } = event.target; 22 | 23 | setMinDetail(value as Detail); 24 | } 25 | 26 | const maxDetailIndex = allViews.indexOf(maxDetail); 27 | 28 | return ( 29 |
30 | Minimum detail 31 | 32 | {allViews.map((view, index) => ( 33 |
34 | 43 | {/* biome-ignore lint/a11y/noLabelWithoutControl: Pinky promise this label won't ever be empty */} 44 | 45 |
46 | ))} 47 |
48 | ); 49 | } 50 | -------------------------------------------------------------------------------- /test/Test.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: 'Segoe UI', Tahoma, sans-serif; 4 | } 5 | 6 | .Test header { 7 | background-color: #323639; 8 | box-shadow: 0 0 8px rgba(0, 0, 0, 0.5); 9 | padding: 20px; 10 | color: white; 11 | } 12 | 13 | .Test header h1 { 14 | font-size: inherit; 15 | margin: 0; 16 | } 17 | 18 | .Test__container { 19 | display: flex; 20 | flex-direction: row; 21 | flex-wrap: wrap; 22 | align-items: flex-start; 23 | margin: 10px 0; 24 | padding: 10px; 25 | } 26 | 27 | .Test__container > * > * { 28 | margin: 10px; 29 | } 30 | 31 | .Test__container__options { 32 | display: flex; 33 | flex-basis: 400px; 34 | flex-grow: 1; 35 | flex-wrap: wrap; 36 | margin: 0; 37 | } 38 | 39 | .Test__container__options input, 40 | .Test__container__options button { 41 | font: inherit; 42 | } 43 | 44 | .Test__container__options fieldset { 45 | border: 1px solid black; 46 | flex-grow: 1; 47 | position: relative; 48 | top: -10px; 49 | } 50 | 51 | .Test__container__options fieldset legend { 52 | font-weight: 600; 53 | } 54 | 55 | .Test__container__options fieldset legend + * { 56 | margin-top: 0 !important; 57 | } 58 | 59 | .Test__container__options fieldset label { 60 | font-weight: 600; 61 | display: block; 62 | } 63 | 64 | .Test__container__options fieldset label:not(:first-of-type) { 65 | margin-top: 1em; 66 | } 67 | 68 | .Test__container__options fieldset input[type='checkbox'] + label, 69 | .Test__container__options fieldset input[type='radio'] + label { 70 | font-weight: normal; 71 | display: inline-block; 72 | margin: 0; 73 | } 74 | 75 | .Test__container__options fieldset form:not(:first-child), 76 | .Test__container__options fieldset div:not(:first-child) { 77 | margin-top: 1em; 78 | } 79 | 80 | .Test__container__options fieldset form:not(:last-child), 81 | .Test__container__options fieldset div:not(:last-child) { 82 | margin-bottom: 1em; 83 | } 84 | 85 | .Test__container__content { 86 | display: flex; 87 | max-width: 100%; 88 | flex-basis: 420px; 89 | flex-direction: column; 90 | flex-grow: 100; 91 | align-items: stretch; 92 | } 93 | -------------------------------------------------------------------------------- /test/ValidityOptions.tsx: -------------------------------------------------------------------------------- 1 | import { useId } from 'react'; 2 | import { getISOLocalDate } from '@wojtekmaj/date-utils'; 3 | 4 | type ValidityOptionsProps = { 5 | maxDate?: Date; 6 | minDate?: Date; 7 | required?: boolean; 8 | setMaxDate: (maxDate: Date | undefined) => void; 9 | setMinDate: (minDate: Date | undefined) => void; 10 | setRequired: (required: boolean) => void; 11 | }; 12 | 13 | export default function ValidityOptions({ 14 | maxDate, 15 | minDate, 16 | required, 17 | setMaxDate, 18 | setMinDate, 19 | setRequired, 20 | }: ValidityOptionsProps) { 21 | const minDateId = useId(); 22 | const maxDateId = useId(); 23 | const requiredId = useId(); 24 | 25 | function onMinChange(event: React.ChangeEvent) { 26 | const { value } = event.target; 27 | 28 | setMinDate(value ? new Date(value) : undefined); 29 | } 30 | 31 | function onMaxChange(event: React.ChangeEvent) { 32 | const { value } = event.target; 33 | 34 | setMaxDate(value ? new Date(value) : undefined); 35 | } 36 | 37 | return ( 38 |
39 | Minimum and maximum date 40 | 41 |
42 | 43 | 49 |   50 | 53 |
54 | 55 |
56 | 57 | 63 |   64 | 67 |
68 | 69 |
70 | setRequired(event.target.checked)} 74 | type="checkbox" 75 | /> 76 | 77 |
78 |
79 | ); 80 | } 81 | -------------------------------------------------------------------------------- /packages/react-daterange-picker/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@wojtekmaj/react-daterange-picker", 3 | "version": "7.0.0", 4 | "description": "A date range picker for your React app.", 5 | "type": "module", 6 | "sideEffects": [ 7 | "*.css" 8 | ], 9 | "main": "./dist/index.js", 10 | "source": "./src/index.ts", 11 | "types": "./dist/index.d.ts", 12 | "exports": { 13 | ".": "./dist/index.js", 14 | "./*": "./*" 15 | }, 16 | "scripts": { 17 | "build": "yarn build-js && yarn copy-styles", 18 | "build-js": "tsc --project tsconfig.build.json", 19 | "clean": "node -e \"fs.rmSync('./dist', { recursive: true, force: true })\"", 20 | "copy-styles": "cpy 'src/**/*.css' dist", 21 | "format": "biome format", 22 | "lint": "biome lint", 23 | "prepack": "yarn clean && yarn build", 24 | "test": "yarn lint && yarn tsc && yarn format && yarn unit", 25 | "tsc": "tsc", 26 | "unit": "vitest", 27 | "watch": "yarn build-js --watch & node --eval \"fs.watch('src', () => child_process.exec('yarn copy-styles'))\"" 28 | }, 29 | "keywords": [ 30 | "calendar", 31 | "date", 32 | "date-picker", 33 | "date-range", 34 | "date-range-picker", 35 | "month-picker", 36 | "react" 37 | ], 38 | "author": { 39 | "name": "Wojciech Maj", 40 | "email": "kontakt@wojtekmaj.pl" 41 | }, 42 | "license": "MIT", 43 | "dependencies": { 44 | "clsx": "^2.0.0", 45 | "make-event-props": "^2.0.0", 46 | "react-calendar": "^6.0.0", 47 | "react-date-picker": "^12.0.1", 48 | "react-fit": "^3.0.0" 49 | }, 50 | "devDependencies": { 51 | "@biomejs/biome": "2.2.2", 52 | "@types/node": "*", 53 | "@types/react": "*", 54 | "@types/react-dom": "*", 55 | "@vitest/browser-playwright": "^4.0.1", 56 | "cpy-cli": "^5.0.0", 57 | "playwright": "^1.55.1", 58 | "react": "^18.2.0", 59 | "react-dom": "^18.2.0", 60 | "typescript": "^5.9.2", 61 | "vitest": "^4.0.1", 62 | "vitest-browser-react": "^2.0.0" 63 | }, 64 | "peerDependencies": { 65 | "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", 66 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", 67 | "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" 68 | }, 69 | "peerDependenciesMeta": { 70 | "@types/react": { 71 | "optional": true 72 | } 73 | }, 74 | "publishConfig": { 75 | "access": "public", 76 | "provenance": true 77 | }, 78 | "files": [ 79 | "dist/**/*", 80 | "src/**/*", 81 | "!**/*.spec.ts", 82 | "!**/*.spec.tsx" 83 | ], 84 | "repository": { 85 | "type": "git", 86 | "url": "git+https://github.com/wojtekmaj/react-daterange-picker.git", 87 | "directory": "packages/react-daterange-picker" 88 | }, 89 | "funding": "https://github.com/wojtekmaj/react-daterange-picker?sponsor=1" 90 | } 91 | -------------------------------------------------------------------------------- /biome.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://biomejs.dev/schemas/2.2.2/schema.json", 3 | "files": { 4 | "includes": [ 5 | "**", 6 | "!**/.yarn", 7 | "!**/coverage", 8 | "!**/dist", 9 | "!**/.pnp.cjs", 10 | "!**/.pnp.loader.mjs" 11 | ] 12 | }, 13 | "assist": { 14 | "actions": { 15 | "source": { 16 | "organizeImports": { 17 | "level": "on", 18 | "options": { 19 | "groups": [ 20 | { "type": false, "source": ":NODE:" }, 21 | { "type": false, "source": ["vitest", "vitest/**", "@vitest/**", "vitest-*"] }, 22 | { "type": false, "source": ["react", "react-dom", "react-dom/**", "react-native"] }, 23 | { "type": false, "source": [":PACKAGE:"] }, 24 | ":BLANK_LINE:", 25 | { 26 | "type": false, 27 | "source": [ 28 | ":PATH:", 29 | "!**/hooks/*", 30 | "!**/use*.js", 31 | "!**/shared/*", 32 | "!**/utils/*", 33 | "!**/__mocks__/*", 34 | "!**/test-utils.js" 35 | ] 36 | }, 37 | ":BLANK_LINE:", 38 | { "type": false, "source": ["**/hooks/*", "**/use*.js"] }, 39 | ":BLANK_LINE:", 40 | { "type": false, "source": ["**/shared/*", "**/utils/*"] }, 41 | ":BLANK_LINE:", 42 | { "type": false, "source": "**/__mocks__/*" }, 43 | ":BLANK_LINE:", 44 | { "type": false, "source": "**/test-utils.js" }, 45 | ":BLANK_LINE:", 46 | ":NODE:", 47 | ":PACKAGE:", 48 | ":PATH:" 49 | ] 50 | } 51 | } 52 | } 53 | } 54 | }, 55 | "formatter": { 56 | "lineWidth": 100, 57 | "indentStyle": "space" 58 | }, 59 | "linter": { 60 | "rules": { 61 | "complexity": { 62 | "noUselessSwitchCase": "off" 63 | }, 64 | "correctness": { 65 | "noUnusedImports": "warn", 66 | "noUnusedVariables": { 67 | "level": "warn", 68 | "options": { 69 | "ignoreRestSiblings": true 70 | } 71 | } 72 | }, 73 | "suspicious": { 74 | "noConsole": "warn" 75 | } 76 | } 77 | }, 78 | "css": { 79 | "formatter": { 80 | "quoteStyle": "single" 81 | } 82 | }, 83 | "javascript": { 84 | "formatter": { 85 | "quoteStyle": "single" 86 | } 87 | }, 88 | "overrides": [ 89 | { 90 | "includes": ["**/vite.config.ts"], 91 | "linter": { 92 | "rules": { 93 | "suspicious": { 94 | "noConsole": "off" 95 | } 96 | } 97 | } 98 | } 99 | ] 100 | } 101 | -------------------------------------------------------------------------------- /test/ValueOptions.tsx: -------------------------------------------------------------------------------- 1 | import { useId } from 'react'; 2 | import { getDayStart, getDayEnd, getISOLocalDate } from '@wojtekmaj/date-utils'; 3 | 4 | import type { LooseValue } from './shared/types.js'; 5 | 6 | type ValueOptionsProps = { 7 | setValue: (value: LooseValue) => void; 8 | value?: LooseValue; 9 | }; 10 | 11 | export default function ValueOptions({ setValue, value }: ValueOptionsProps) { 12 | const startDateId = useId(); 13 | const endDateId = useId(); 14 | 15 | const [startDate, endDate] = Array.isArray(value) ? value : [value, null]; 16 | 17 | function setStartValue(nextStartDate: string | Date | null) { 18 | if (!nextStartDate) { 19 | setValue(endDate); 20 | return; 21 | } 22 | 23 | if (Array.isArray(value)) { 24 | setValue([nextStartDate, endDate]); 25 | } else { 26 | setValue(nextStartDate); 27 | } 28 | } 29 | 30 | function setEndValue(nextEndDate: string | Date | null) { 31 | if (!nextEndDate) { 32 | setValue(startDate || null); 33 | return; 34 | } 35 | 36 | setValue([startDate || null, nextEndDate]); 37 | } 38 | 39 | function onStartChange(event: React.ChangeEvent) { 40 | const { value: nextValue } = event.target; 41 | 42 | setStartValue(nextValue ? getDayStart(new Date(nextValue)) : null); 43 | } 44 | 45 | function onEndChange(event: React.ChangeEvent) { 46 | const { value: nextValue } = event.target; 47 | 48 | setEndValue(nextValue ? getDayEnd(new Date(nextValue)) : null); 49 | } 50 | 51 | return ( 52 |
53 | Value options 54 | 55 |
56 | 57 | 67 |   68 | 71 | 74 |
75 | 76 |
77 | 78 | 86 |   87 | 90 | 93 |
94 |
95 | ); 96 | } 97 | -------------------------------------------------------------------------------- /packages/react-daterange-picker/src/DateRangePicker.css: -------------------------------------------------------------------------------- 1 | .react-daterange-picker { 2 | display: inline-flex; 3 | position: relative; 4 | } 5 | 6 | .react-daterange-picker, 7 | .react-daterange-picker *, 8 | .react-daterange-picker *:before, 9 | .react-daterange-picker *:after { 10 | -moz-box-sizing: border-box; 11 | -webkit-box-sizing: border-box; 12 | box-sizing: border-box; 13 | } 14 | 15 | .react-daterange-picker--disabled { 16 | background-color: #f0f0f0; 17 | color: #6d6d6d; 18 | } 19 | 20 | .react-daterange-picker__wrapper { 21 | display: flex; 22 | flex-grow: 1; 23 | flex-shrink: 0; 24 | align-items: center; 25 | border: thin solid gray; 26 | } 27 | 28 | .react-daterange-picker__inputGroup { 29 | min-width: calc((4px * 3) + 0.54em * 8 + 0.217em * 2); 30 | height: 100%; 31 | flex-grow: 1; 32 | padding: 0 2px; 33 | box-sizing: content-box; 34 | } 35 | 36 | .react-daterange-picker__inputGroup__divider { 37 | padding: 1px 0; 38 | white-space: pre; 39 | } 40 | 41 | .react-daterange-picker__inputGroup__divider, 42 | .react-daterange-picker__inputGroup__leadingZero { 43 | display: inline-block; 44 | font: inherit; 45 | } 46 | 47 | .react-daterange-picker__inputGroup__input { 48 | min-width: 0.54em; 49 | height: 100%; 50 | position: relative; 51 | padding: 0 1px; 52 | border: 0; 53 | background: none; 54 | color: currentColor; 55 | font: inherit; 56 | box-sizing: content-box; 57 | -webkit-appearance: textfield; 58 | -moz-appearance: textfield; 59 | appearance: textfield; 60 | } 61 | 62 | .react-daterange-picker__inputGroup__input::-webkit-outer-spin-button, 63 | .react-daterange-picker__inputGroup__input::-webkit-inner-spin-button { 64 | -webkit-appearance: none; 65 | -moz-appearance: none; 66 | appearance: none; 67 | margin: 0; 68 | } 69 | 70 | .react-daterange-picker__inputGroup__input:invalid { 71 | background: rgba(255, 0, 0, 0.1); 72 | } 73 | 74 | .react-daterange-picker__inputGroup__input--hasLeadingZero { 75 | margin-left: -0.54em; 76 | padding-left: calc(1px + 0.54em); 77 | } 78 | 79 | .react-daterange-picker__button { 80 | border: 0; 81 | background: transparent; 82 | padding: 4px 6px; 83 | } 84 | 85 | .react-daterange-picker__button:enabled { 86 | cursor: pointer; 87 | } 88 | 89 | .react-daterange-picker__button:enabled:hover .react-daterange-picker__button__icon, 90 | .react-daterange-picker__button:enabled:focus .react-daterange-picker__button__icon { 91 | stroke: #0078d7; 92 | } 93 | 94 | .react-daterange-picker__button:disabled .react-daterange-picker__button__icon { 95 | stroke: #6d6d6d; 96 | } 97 | 98 | .react-daterange-picker__button svg { 99 | display: inherit; 100 | } 101 | 102 | .react-daterange-picker__calendar { 103 | width: 350px; 104 | max-width: 100vw; 105 | z-index: 1; 106 | } 107 | 108 | .react-daterange-picker__calendar--closed { 109 | display: none; 110 | } 111 | 112 | .react-daterange-picker__calendar .react-calendar { 113 | border-width: thin; 114 | } 115 | -------------------------------------------------------------------------------- /test/LocaleOptions.tsx: -------------------------------------------------------------------------------- 1 | import { useId, useRef } from 'react'; 2 | 3 | type LocaleOptionsProps = { 4 | locale: string | undefined; 5 | setLocale: (locale: string | undefined) => void; 6 | }; 7 | 8 | export default function LocaleOptions({ locale, setLocale }: LocaleOptionsProps) { 9 | const localeDefaultId = useId(); 10 | const localeEnUSId = useId(); 11 | const localeFrFRId = useId(); 12 | const localeArEGId = useId(); 13 | const customLocaleId = useId(); 14 | const customLocale = useRef(null); 15 | 16 | function onChange(event: React.ChangeEvent) { 17 | const { value: nextLocale } = event.target; 18 | 19 | if (nextLocale === 'undefined') { 20 | setLocale(undefined); 21 | } else { 22 | setLocale(nextLocale); 23 | } 24 | } 25 | 26 | function onCustomChange(event: React.FormEvent) { 27 | event.preventDefault(); 28 | 29 | const input = customLocale.current; 30 | const { value: nextLocale } = input as HTMLInputElement; 31 | 32 | setLocale(nextLocale); 33 | } 34 | 35 | function resetLocale() { 36 | setLocale(undefined); 37 | } 38 | 39 | return ( 40 |
41 | Locale 42 | 43 |
44 | 52 | 53 |
54 |
55 | 63 | 64 |
65 |
66 | 74 | 75 |
76 |
77 | 85 | 86 |
87 |
88 | 89 |   90 | 99 |   100 | 103 | 106 |
107 |
108 | ); 109 | } 110 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: ['*'] 6 | pull_request: 7 | branches: [main] 8 | 9 | env: 10 | HUSKY: 0 11 | 12 | jobs: 13 | lint: 14 | name: Static code analysis 15 | runs-on: ubuntu-24.04-arm 16 | 17 | steps: 18 | - name: Checkout 19 | uses: actions/checkout@v4 20 | 21 | - name: Setup Biome 22 | uses: biomejs/setup-biome@v2 23 | 24 | - name: Run tests 25 | run: biome lint 26 | 27 | typescript: 28 | name: Type checking 29 | runs-on: ubuntu-24.04-arm 30 | 31 | steps: 32 | - name: Checkout 33 | uses: actions/checkout@v4 34 | 35 | - name: Cache Yarn cache 36 | uses: actions/cache@v5 37 | env: 38 | cache-name: yarn-cache 39 | with: 40 | path: ~/.yarn/berry/cache 41 | key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/yarn.lock') }} 42 | restore-keys: | 43 | ${{ runner.os }}-${{ env.cache-name }} 44 | 45 | - name: Use Node.js 46 | uses: actions/setup-node@v6 47 | with: 48 | node-version: '24' 49 | 50 | - name: Install Corepack 51 | run: npm install -g corepack 52 | 53 | - name: Install dependencies 54 | run: yarn --immutable 55 | env: 56 | PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: true 57 | 58 | - name: Build package 59 | run: yarn build 60 | 61 | - name: Run type checking 62 | run: yarn tsc 63 | 64 | format: 65 | name: Formatting 66 | runs-on: ubuntu-24.04-arm 67 | 68 | steps: 69 | - name: Checkout 70 | uses: actions/checkout@v4 71 | 72 | - name: Setup Biome 73 | uses: biomejs/setup-biome@v2 74 | 75 | - name: Run formatting 76 | run: biome format 77 | 78 | unit: 79 | name: Unit tests 80 | runs-on: ubuntu-24.04-arm 81 | 82 | steps: 83 | - name: Checkout 84 | uses: actions/checkout@v4 85 | 86 | - name: Cache Yarn cache 87 | uses: actions/cache@v5 88 | env: 89 | cache-name: yarn-cache 90 | with: 91 | path: ~/.yarn/berry/cache 92 | key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/yarn.lock') }} 93 | restore-keys: | 94 | ${{ runner.os }}-${{ env.cache-name }} 95 | 96 | - name: Cache ~/.cache/ms-playwright 97 | id: playwright-cache 98 | uses: actions/cache@v5 99 | env: 100 | cache-name: playwright-cache 101 | with: 102 | path: ~/.cache/ms-playwright 103 | key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/yarn.lock') }} 104 | 105 | - name: Use Node.js 106 | uses: actions/setup-node@v6 107 | with: 108 | node-version: '24' 109 | 110 | - name: Install Corepack 111 | run: npm install -g corepack 112 | 113 | - name: Install dependencies 114 | run: yarn --immutable 115 | 116 | - name: Install Playwright browsers 117 | if: steps.playwright-cache.outputs.cache-hit != 'true' 118 | run: yarn workspace @wojtekmaj/react-daterange-picker playwright install chromium-headless-shell 119 | 120 | - name: Run tests 121 | run: yarn unit 122 | -------------------------------------------------------------------------------- /test/ViewOptions.tsx: -------------------------------------------------------------------------------- 1 | import { useId } from 'react'; 2 | 3 | type ViewOptionsProps = { 4 | disabled: boolean; 5 | renderInPortal: boolean; 6 | setDisabled: (disabled: boolean) => void; 7 | setRenderInPortal: (renderInPortal: boolean) => void; 8 | setShowLeadingZeros: (showLeadingZeros: boolean) => void; 9 | setShowNeighboringMonth: (showNeighboringMonth: boolean) => void; 10 | setShowWeekNumbers: (showWeekNumbers: boolean) => void; 11 | showLeadingZeros: boolean; 12 | showNeighboringMonth: boolean; 13 | showWeekNumbers: boolean; 14 | }; 15 | 16 | export default function ViewOptions({ 17 | disabled, 18 | renderInPortal, 19 | setDisabled, 20 | setRenderInPortal, 21 | setShowLeadingZeros, 22 | setShowNeighboringMonth, 23 | setShowWeekNumbers, 24 | showLeadingZeros, 25 | showNeighboringMonth, 26 | showWeekNumbers, 27 | }: ViewOptionsProps) { 28 | const disabledId = useId(); 29 | const showLeadingZerosId = useId(); 30 | const showWeekNumbersId = useId(); 31 | const showNeighboringMonthId = useId(); 32 | const renderInPortalId = useId(); 33 | 34 | function onDisabledChange(event: React.ChangeEvent) { 35 | const { checked } = event.target; 36 | 37 | setDisabled(checked); 38 | } 39 | 40 | function onShowLeadingZerosChange(event: React.ChangeEvent) { 41 | const { checked } = event.target; 42 | 43 | setShowLeadingZeros(checked); 44 | } 45 | 46 | function onShowWeekNumbersChange(event: React.ChangeEvent) { 47 | const { checked } = event.target; 48 | 49 | setShowWeekNumbers(checked); 50 | } 51 | 52 | function onShowNeighboringMonthChange(event: React.ChangeEvent) { 53 | const { checked } = event.target; 54 | 55 | setShowNeighboringMonth(checked); 56 | } 57 | 58 | function onRenderInPortalChange(event: React.ChangeEvent) { 59 | const { checked } = event.target; 60 | 61 | setRenderInPortal(checked); 62 | } 63 | 64 | return ( 65 |
66 | View options 67 | 68 |
69 | 70 | 71 |
72 | 73 |
74 | 80 | 81 |
82 | 83 |
84 | 90 | 91 |
92 | 93 |
94 | 100 | 101 |
102 | 103 |
104 | 110 | 111 |
112 |
113 | ); 114 | } 115 | -------------------------------------------------------------------------------- /test/Test.tsx: -------------------------------------------------------------------------------- 1 | import { useRef, useState } from 'react'; 2 | import DateRangePicker from '@wojtekmaj/react-daterange-picker'; 3 | import '@wojtekmaj/react-daterange-picker/dist/DateRangePicker.css'; 4 | import 'react-calendar/dist/Calendar.css'; 5 | 6 | import ValidityOptions from './ValidityOptions.js'; 7 | import MaxDetailOptions from './MaxDetailOptions.js'; 8 | import MinDetailOptions from './MinDetailOptions.js'; 9 | import LocaleOptions from './LocaleOptions.js'; 10 | import ValueOptions from './ValueOptions.js'; 11 | import ViewOptions from './ViewOptions.js'; 12 | 13 | import './Test.css'; 14 | 15 | import type { Detail, LooseValue } from './shared/types.js'; 16 | 17 | const now = new Date(); 18 | 19 | const ariaLabelProps = { 20 | calendarAriaLabel: 'Toggle calendar', 21 | clearAriaLabel: 'Clear value', 22 | dayAriaLabel: 'Day', 23 | monthAriaLabel: 'Month', 24 | nativeInputAriaLabel: 'Date', 25 | yearAriaLabel: 'Year', 26 | }; 27 | 28 | const placeholderProps = { 29 | dayPlaceholder: 'dd', 30 | monthPlaceholder: 'mm', 31 | yearPlaceholder: 'yyyy', 32 | }; 33 | 34 | const nineteenNinetyFive = new Date(1995, now.getUTCMonth() + 1, 15, 12); 35 | const fifteenthOfNextMonth = new Date(now.getUTCFullYear(), now.getUTCMonth() + 1, 15, 12); 36 | 37 | export default function Test() { 38 | const portalContainer = useRef(null); 39 | const [disabled, setDisabled] = useState(false); 40 | const [locale, setLocale] = useState(); 41 | const [maxDate, setMaxDate] = useState(fifteenthOfNextMonth); 42 | const [maxDetail, setMaxDetail] = useState('month'); 43 | const [minDate, setMinDate] = useState(nineteenNinetyFive); 44 | const [minDetail, setMinDetail] = useState('century'); 45 | const [renderInPortal, setRenderInPortal] = useState(false); 46 | const [required, setRequired] = useState(true); 47 | const [showLeadingZeros, setShowLeadingZeros] = useState(true); 48 | const [showNeighboringMonth, setShowNeighboringMonth] = useState(false); 49 | const [showWeekNumbers, setShowWeekNumbers] = useState(false); 50 | const [value, setValue] = useState(now); 51 | 52 | return ( 53 |
54 |
55 |

react-daterange-picker test page

56 |
57 |
58 | 92 |
93 |
{ 95 | event.preventDefault(); 96 | 97 | console.warn('Calendar triggered submitting the form.'); 98 | console.log(event); 99 | }} 100 | > 101 | console.log('Calendar closed')} 119 | onCalendarOpen={() => console.log('Calendar opened')} 120 | onChange={setValue} 121 | portalContainer={renderInPortal ? portalContainer.current : undefined} 122 | required={required} 123 | showLeadingZeros={showLeadingZeros} 124 | value={value} 125 | /> 126 |
127 |
128 |
129 | 130 | 131 |
132 |
133 |
134 | ); 135 | } 136 | -------------------------------------------------------------------------------- /packages/react-daterange-picker/src/DateRangePicker.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | 3 | import { createElement, useCallback, useEffect, useMemo, useRef, useState } from 'react'; 4 | import { createPortal } from 'react-dom'; 5 | import clsx from 'clsx'; 6 | import makeEventProps from 'make-event-props'; 7 | import Calendar from 'react-calendar'; 8 | import DateInput from 'react-date-picker/dist/DateInput'; 9 | import Fit from 'react-fit'; 10 | 11 | import type { 12 | ClassName, 13 | CloseReason, 14 | Detail, 15 | LooseValue, 16 | OpenReason, 17 | Value, 18 | } from './shared/types.js'; 19 | 20 | const baseClassName = 'react-daterange-picker'; 21 | const outsideActionEvents = ['mousedown', 'focusin', 'touchstart'] as const; 22 | 23 | const iconProps = { 24 | xmlns: 'http://www.w3.org/2000/svg', 25 | width: 19, 26 | height: 19, 27 | viewBox: '0 0 19 19', 28 | stroke: 'black', 29 | strokeWidth: 2, 30 | }; 31 | 32 | const CalendarIcon = ( 33 | 42 | ); 43 | 44 | const ClearIcon = ( 45 | 53 | ); 54 | 55 | type ReactNodeLike = React.ReactNode | string | number | boolean | null | undefined; 56 | 57 | type Icon = ReactNodeLike | ReactNodeLike[]; 58 | 59 | type IconOrRenderFunction = Icon | React.ComponentType | React.ReactElement; 60 | 61 | type CalendarProps = Omit< 62 | React.ComponentPropsWithoutRef, 63 | 'onChange' | 'selectRange' | 'value' 64 | >; 65 | 66 | type EventProps = ReturnType; 67 | 68 | export type DateRangePickerProps = { 69 | /** 70 | * Automatically focuses the input on mount. 71 | * 72 | * @example true 73 | */ 74 | autoFocus?: boolean; 75 | /** 76 | * `aria-label` for the calendar button. 77 | * 78 | * @example 'Toggle calendar' 79 | */ 80 | calendarAriaLabel?: string; 81 | /** 82 | * Content of the calendar button. Setting the value explicitly to `null` will hide the icon. 83 | * 84 | * @example 'Calendar' 85 | * @example 86 | * @example CalendarIcon 87 | */ 88 | calendarIcon?: IconOrRenderFunction | null; 89 | /** 90 | * Props to pass to React-Calendar component. 91 | */ 92 | calendarProps?: CalendarProps; 93 | /** 94 | * Class name(s) that will be added along with `"react-daterange-picker"` to the main React-DateRange-Picker `
` element. 95 | * 96 | * @example 'class1 class2' 97 | * @example ['class1', 'class2 class3'] 98 | */ 99 | className?: ClassName; 100 | /** 101 | * `aria-label` for the clear button. 102 | * 103 | * @example 'Clear value' 104 | */ 105 | clearAriaLabel?: string; 106 | /** 107 | * Content of the clear button. Setting the value explicitly to `null` will hide the icon. 108 | * 109 | * @example 'Clear' 110 | * @example 111 | * @example ClearIcon 112 | */ 113 | clearIcon?: IconOrRenderFunction | null; 114 | /** 115 | * Whether to close the calendar on value selection. 116 | * 117 | * **Note**: It's recommended to use `shouldCloseCalendar` function instead. 118 | * 119 | * @default true 120 | * @example false 121 | */ 122 | closeCalendar?: boolean; 123 | /** 124 | * `data-testid` attribute for the main React-DateRange-Picker `
` element. 125 | * 126 | * @example 'daterange-picker' 127 | */ 128 | 'data-testid'?: string; 129 | /** 130 | * `aria-label` for the day input. 131 | * 132 | * @example 'Day' 133 | */ 134 | dayAriaLabel?: string; 135 | /** 136 | * `placeholder` for the day input. 137 | * 138 | * @default '--' 139 | * @example 'dd' 140 | */ 141 | dayPlaceholder?: string; 142 | /** 143 | * When set to `true`, will remove the calendar and the button toggling its visibility. 144 | * 145 | * @default false 146 | * @example true 147 | */ 148 | disableCalendar?: boolean; 149 | /** 150 | * Whether the date range picker should be disabled. 151 | * 152 | * @default false 153 | * @example true 154 | */ 155 | disabled?: boolean; 156 | /** 157 | * Input format based on [Unicode Technical Standard #35](https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table). Supported values are: `y`, `M`, `MM`, `MMM`, `MMMM`, `d`, `dd`. 158 | * 159 | * **Note**: When using SSR, setting this prop may help resolving hydration errors caused by locale mismatch between server and client. 160 | * 161 | * @example 'y-MM-dd' 162 | */ 163 | format?: string; 164 | /** 165 | * `id` attribute for the main React-DateRange-Picker `
` element. 166 | * 167 | * @example 'daterange-picker' 168 | */ 169 | id?: string; 170 | /** 171 | * Whether the calendar should be opened. 172 | * 173 | * @default false 174 | * @example true 175 | */ 176 | isOpen?: boolean; 177 | /** 178 | * Locale that should be used by the date range picker and the calendar. Can be any [IETF language tag](https://en.wikipedia.org/wiki/IETF_language_tag). 179 | * 180 | * **Note**: When using SSR, setting this prop may help resolving hydration errors caused by locale mismatch between server and client. 181 | * 182 | * @example 'hu-HU' 183 | */ 184 | locale?: string; 185 | /** 186 | * Maximum date that the user can select. Periods partially overlapped by maxDate will also be selectable, although React-DateRange-Picker will ensure that no later date is selected. 187 | * 188 | * @example new Date() 189 | */ 190 | maxDate?: Date; 191 | /** 192 | * The most detailed calendar view that the user shall see. View defined here also becomes the one on which clicking an item in the calendar will select a date and pass it to onChange. Can be `"month"`, `"year"`, `"decade"` or 193 | * 194 | * @default 'month' 195 | * @example 'year' 196 | */ 197 | maxDetail?: Detail; 198 | /** 199 | * Minimum date that the user can select. Periods partially overlapped by minDate will also be selectable, although React-DateRange-Picker will ensure that no earlier date is selected. 200 | * 201 | * @example new Date() 202 | */ 203 | minDate?: Date; 204 | /** 205 | * `aria-label` for the month input. 206 | * 207 | * @example 'Month' 208 | */ 209 | monthAriaLabel?: string; 210 | /** 211 | * `placeholder` for the month input. 212 | * 213 | * @default '--' 214 | * @example 'mm' 215 | */ 216 | monthPlaceholder?: string; 217 | /** 218 | * Input name. 219 | * 220 | * @default 'daterange' 221 | */ 222 | name?: string; 223 | /** 224 | * `aria-label` for the native date input. 225 | * 226 | * @example 'Date' 227 | */ 228 | nativeInputAriaLabel?: string; 229 | /** 230 | * Function called when the calendar closes. 231 | * 232 | * @example () => alert('Calendar closed') 233 | */ 234 | onCalendarClose?: () => void; 235 | /** 236 | * Function called when the calendar opens. 237 | * 238 | * @example () => alert('Calendar opened') 239 | */ 240 | onCalendarOpen?: () => void; 241 | /** 242 | * Function called when the user picks a valid date. If any of the fields were excluded using custom `format`, `new Date(y, 0, 1, 0, 0, 0)`, where `y` is the current year, is going to serve as a "base". 243 | * 244 | * @example (value) => alert('New date is: ', value) 245 | */ 246 | onChange?: (value: Value) => void; 247 | /** 248 | * Function called when the user focuses an input. 249 | * 250 | * @example (event) => alert('Focused input: ', event.target.name) 251 | */ 252 | onFocus?: (event: React.FocusEvent) => void; 253 | /** 254 | * Function called when the user picks an invalid date. 255 | * 256 | * @example () => alert('Invalid date') 257 | */ 258 | onInvalidChange?: () => void; 259 | /** 260 | * Whether to open the calendar on input focus. **Note**: It's recommended to use `shouldOpenCalendar` function instead. 261 | * 262 | * @default true 263 | * @example false 264 | */ 265 | openCalendarOnFocus?: boolean; 266 | /** 267 | * Element to render the calendar in using portal. 268 | * 269 | * @example document.getElementById('my-div') 270 | */ 271 | portalContainer?: HTMLElement | null; 272 | /** 273 | * Divider between date inputs. 274 | * 275 | * @default '–' 276 | * @example ' to ' 277 | */ 278 | rangeDivider?: React.ReactNode; 279 | /** 280 | * Whether date input should be required. 281 | * 282 | * @default false 283 | * @example true 284 | */ 285 | required?: boolean; 286 | /** 287 | * Function called before the calendar closes. `reason` can be `"buttonClick"`, `"escape"`, `"outsideAction"`, or `"select"`. If it returns `false`, the calendar will not close. 288 | * 289 | * @example ({ reason }) => reason !== 'outsideAction' 290 | */ 291 | shouldCloseCalendar?: (props: { reason: CloseReason }) => boolean; 292 | /** 293 | * Function called before the calendar opens. `reason` can be `"buttonClick"` or `"focus"`. If it returns `false`, the calendar will not open. 294 | * 295 | * @example ({ reason }) => reason !== 'focus' 296 | */ 297 | shouldOpenCalendar?: (props: { reason: OpenReason }) => boolean; 298 | /** 299 | * Whether leading zeros should be rendered in date inputs. 300 | * 301 | * @default false 302 | * @example true 303 | */ 304 | showLeadingZeros?: boolean; 305 | /** 306 | * Input value. 307 | * 308 | * @example new Date(2017, 0, 1) 309 | * @example [new Date(2017, 0, 1), new Date(2017, 7, 1)] 310 | * @example ['2017-01-01', '2017-08-01'] 311 | */ 312 | value?: LooseValue; 313 | /** 314 | * `aria-label` for the year input. 315 | * 316 | * @example 'Year' 317 | */ 318 | yearAriaLabel?: string; 319 | /** 320 | * `placeholder` for the year input. 321 | * 322 | * @default '----' 323 | * @example 'yyyy' 324 | */ 325 | yearPlaceholder?: string; 326 | } & Omit; 327 | 328 | export default function DateRangePicker(props: DateRangePickerProps): React.ReactElement { 329 | const { 330 | autoFocus, 331 | calendarAriaLabel, 332 | calendarIcon = CalendarIcon, 333 | className, 334 | clearAriaLabel, 335 | clearIcon = ClearIcon, 336 | closeCalendar: shouldCloseCalendarOnSelect = true, 337 | 'data-testid': dataTestid, 338 | dayAriaLabel, 339 | dayPlaceholder, 340 | disableCalendar, 341 | disabled, 342 | format, 343 | id, 344 | isOpen: isOpenProps = null, 345 | locale, 346 | maxDate, 347 | maxDetail = 'month', 348 | minDate, 349 | monthAriaLabel, 350 | monthPlaceholder, 351 | name = 'daterange', 352 | nativeInputAriaLabel, 353 | onCalendarClose, 354 | onCalendarOpen, 355 | onChange: onChangeProps, 356 | onFocus: onFocusProps, 357 | onInvalidChange, 358 | openCalendarOnFocus = true, 359 | rangeDivider = '–', 360 | required, 361 | shouldCloseCalendar, 362 | shouldOpenCalendar, 363 | showLeadingZeros, 364 | value, 365 | yearAriaLabel, 366 | yearPlaceholder, 367 | ...otherProps 368 | } = props; 369 | 370 | const [isOpen, setIsOpen] = useState(isOpenProps); 371 | const wrapper = useRef(null); 372 | const calendarWrapper = useRef(null); 373 | 374 | useEffect(() => { 375 | setIsOpen(isOpenProps); 376 | }, [isOpenProps]); 377 | 378 | function openCalendar({ reason }: { reason: OpenReason }) { 379 | if (shouldOpenCalendar) { 380 | if (!shouldOpenCalendar({ reason })) { 381 | return; 382 | } 383 | } 384 | 385 | setIsOpen(true); 386 | 387 | if (onCalendarOpen) { 388 | onCalendarOpen(); 389 | } 390 | } 391 | 392 | const closeCalendar = useCallback( 393 | ({ reason }: { reason: CloseReason }) => { 394 | if (shouldCloseCalendar) { 395 | if (!shouldCloseCalendar({ reason })) { 396 | return; 397 | } 398 | } 399 | 400 | setIsOpen(false); 401 | 402 | if (onCalendarClose) { 403 | onCalendarClose(); 404 | } 405 | }, 406 | [onCalendarClose, shouldCloseCalendar], 407 | ); 408 | 409 | function toggleCalendar() { 410 | if (isOpen) { 411 | closeCalendar({ reason: 'buttonClick' }); 412 | } else { 413 | openCalendar({ reason: 'buttonClick' }); 414 | } 415 | } 416 | 417 | function onChange(value: Value, shouldCloseCalendar: boolean = shouldCloseCalendarOnSelect) { 418 | if (shouldCloseCalendar) { 419 | closeCalendar({ reason: 'select' }); 420 | } 421 | 422 | if (onChangeProps) { 423 | onChangeProps(value); 424 | } 425 | } 426 | 427 | function onChangeFrom(nextValue: Value, closeCalendar: boolean) { 428 | const [nextValueFrom] = Array.isArray(nextValue) ? nextValue : [nextValue]; 429 | const [, valueTo] = Array.isArray(value) ? value : [value]; 430 | 431 | const valueToDate = valueTo ? new Date(valueTo) : null; 432 | 433 | onChange([nextValueFrom, valueToDate], closeCalendar); 434 | } 435 | 436 | function onChangeTo(nextValue: Value, closeCalendar: boolean) { 437 | const [, nextValueTo] = Array.isArray(nextValue) ? nextValue : [null, nextValue]; 438 | const [valueFrom] = Array.isArray(value) ? value : [value]; 439 | 440 | const valueFromDate = valueFrom ? new Date(valueFrom) : null; 441 | 442 | onChange([valueFromDate, nextValueTo], closeCalendar); 443 | } 444 | 445 | function onFocus(event: React.FocusEvent) { 446 | if (onFocusProps) { 447 | onFocusProps(event); 448 | } 449 | 450 | if ( 451 | // Internet Explorer still fires onFocus on disabled elements 452 | disabled || 453 | isOpen || 454 | !openCalendarOnFocus || 455 | event.target.dataset.select === 'true' 456 | ) { 457 | return; 458 | } 459 | 460 | openCalendar({ reason: 'focus' }); 461 | } 462 | 463 | const onKeyDown = useCallback( 464 | (event: KeyboardEvent) => { 465 | if (event.key === 'Escape') { 466 | closeCalendar({ reason: 'escape' }); 467 | } 468 | }, 469 | [closeCalendar], 470 | ); 471 | 472 | function clear() { 473 | onChange(null); 474 | } 475 | 476 | function stopPropagation(event: React.FocusEvent) { 477 | event.stopPropagation(); 478 | } 479 | 480 | const onOutsideAction = useCallback( 481 | (event: Event) => { 482 | const { current: wrapperEl } = wrapper; 483 | const { current: calendarWrapperEl } = calendarWrapper; 484 | 485 | // Try event.composedPath first to handle clicks inside a Shadow DOM. 486 | const target = ( 487 | 'composedPath' in event ? event.composedPath()[0] : (event as Event).target 488 | ) as HTMLElement; 489 | 490 | if ( 491 | target && 492 | wrapperEl && 493 | !wrapperEl.contains(target) && 494 | (!calendarWrapperEl || !calendarWrapperEl.contains(target)) 495 | ) { 496 | closeCalendar({ reason: 'outsideAction' }); 497 | } 498 | }, 499 | [closeCalendar], 500 | ); 501 | 502 | const handleOutsideActionListeners = useCallback( 503 | (shouldListen = isOpen) => { 504 | for (const event of outsideActionEvents) { 505 | if (shouldListen) { 506 | document.addEventListener(event, onOutsideAction); 507 | } else { 508 | document.removeEventListener(event, onOutsideAction); 509 | } 510 | } 511 | 512 | if (shouldListen) { 513 | document.addEventListener('keydown', onKeyDown); 514 | } else { 515 | document.removeEventListener('keydown', onKeyDown); 516 | } 517 | }, 518 | [isOpen, onOutsideAction, onKeyDown], 519 | ); 520 | 521 | // biome-ignore lint/correctness/useExhaustiveDependencies: useEffect intentionally triggered on isOpen change 522 | useEffect(() => { 523 | handleOutsideActionListeners(); 524 | 525 | return () => { 526 | handleOutsideActionListeners(false); 527 | }; 528 | }, [handleOutsideActionListeners, isOpen]); 529 | 530 | function renderInputs() { 531 | const [valueFrom, valueTo] = Array.isArray(value) ? value : [value]; 532 | 533 | const ariaLabelProps = { 534 | dayAriaLabel, 535 | monthAriaLabel, 536 | nativeInputAriaLabel, 537 | yearAriaLabel, 538 | }; 539 | 540 | const placeholderProps = { 541 | dayPlaceholder, 542 | monthPlaceholder, 543 | yearPlaceholder, 544 | }; 545 | 546 | const commonProps = { 547 | ...ariaLabelProps, 548 | ...placeholderProps, 549 | className: `${baseClassName}__inputGroup`, 550 | disabled, 551 | format, 552 | isCalendarOpen: isOpen, 553 | locale, 554 | maxDate, 555 | maxDetail, 556 | minDate, 557 | onInvalidChange, 558 | required, 559 | showLeadingZeros, 560 | }; 561 | 562 | return ( 563 |
564 | 572 | 573 | {rangeDivider} 574 | 575 | 582 | {clearIcon !== null && ( 583 | 594 | )} 595 | {calendarIcon !== null && !disableCalendar && ( 596 | 608 | )} 609 |
610 | ); 611 | } 612 | 613 | function renderCalendar() { 614 | if (isOpen === null || disableCalendar) { 615 | return null; 616 | } 617 | 618 | const { calendarProps, portalContainer, value } = props; 619 | 620 | const className = `${baseClassName}__calendar`; 621 | const classNames = clsx(className, `${className}--${isOpen ? 'open' : 'closed'}`); 622 | 623 | const calendar = ( 624 | onChange(value)} 630 | selectRange 631 | value={value} 632 | {...calendarProps} 633 | /> 634 | ); 635 | 636 | return portalContainer ? ( 637 | createPortal( 638 |
639 | {calendar} 640 |
, 641 | portalContainer, 642 | ) 643 | ) : ( 644 | 645 |
{ 647 | if (ref && !isOpen) { 648 | ref.removeAttribute('style'); 649 | } 650 | }} 651 | className={classNames} 652 | > 653 | {calendar} 654 |
655 |
656 | ); 657 | } 658 | 659 | const eventProps = useMemo( 660 | () => makeEventProps(otherProps), 661 | // biome-ignore lint/correctness/useExhaustiveDependencies: FIXME 662 | [otherProps], 663 | ); 664 | 665 | return ( 666 | // biome-ignore lint/a11y/noStaticElementInteractions: False positive caused by non interactive wrapper listening for bubbling events 667 |
680 | {renderInputs()} 681 | {renderCalendar()} 682 |
683 | ); 684 | } 685 | -------------------------------------------------------------------------------- /packages/react-daterange-picker/README.md: -------------------------------------------------------------------------------- 1 | [![npm](https://img.shields.io/npm/v/@wojtekmaj/react-daterange-picker.svg)](https://www.npmjs.com/package/@wojtekmaj/react-daterange-picker) ![downloads](https://img.shields.io/npm/dt/@wojtekmaj/react-daterange-picker.svg) [![CI](https://github.com/wojtekmaj/react-daterange-picker/actions/workflows/ci.yml/badge.svg)](https://github.com/wojtekmaj/react-daterange-picker/actions) 2 | 3 | # React-DateRange-Picker 4 | 5 | A date range picker for your React app. 6 | 7 | - Pick days, months, years, or even decades 8 | - Supports virtually any language 9 | - No moment.js needed 10 | 11 | ## tl;dr 12 | 13 | - Install by executing `npm install @wojtekmaj/react-daterange-picker` or `yarn add @wojtekmaj/react-daterange-picker`. 14 | - Import by adding `import DateRangePicker from '@wojtekmaj/react-daterange-picker'`. 15 | - Use by adding ``. Use `onChange` prop for getting new values. 16 | 17 | ## Demo 18 | 19 | A minimal demo page can be found in `sample` directory. 20 | 21 | [Online demo](https://projects.wojtekmaj.pl/react-daterange-picker/) is also available! 22 | 23 | ## Consider native alternative 24 | 25 | If you don't need to support legacy browsers and don't need the advanced features this package provides, consider using native date input instead. It's more accessible, adds no extra weight to your bundle, and works better on mobile devices. 26 | 27 | ```tsx 28 | 29 | 30 | ``` 31 | 32 | ## Looking for a time picker or a datetime picker? 33 | 34 | React-DateRange-Picker will play nicely with [React-Date-Picker](https://github.com/wojtekmaj/react-date-picker), [React-Time-Picker](https://github.com/wojtekmaj/react-time-picker) and [React-DateTime-Picker](https://github.com/wojtekmaj/react-datetime-picker). Check them out! 35 | 36 | ## Getting started 37 | 38 | ### Compatibility 39 | 40 | Your project needs to use React 16.3 or later. If you use an older version of React, please refer to the table below to find a suitable React-DateRange-Picker version. 41 | 42 | | React version | Newest compatible React-DateRange-Picker version | 43 | | ------------- | ------------------------------------------------ | 44 | | ≥16.8 | latest | 45 | | ≥16.3 | 4.x | 46 | | ≥16.0 | 2.x | 47 | 48 | [React-Calendar](https://github.com/wojtekmaj/react-calendar), on which React-DateRange-Picker relies heavily, uses modern web technologies. That's why it's so fast, lightweight and easy to style. This, however, comes at a cost of [supporting only modern browsers](https://caniuse.com/#feat=internationalization). 49 | 50 | ### Installation 51 | 52 | Add React-DateRange-Picker to your project by executing `npm install @wojtekmaj/react-daterange-picker` or `yarn add @wojtekmaj/react-daterange-picker`. 53 | 54 | ### Usage 55 | 56 | Here's an example of basic usage: 57 | 58 | ```tsx 59 | import { useState } from 'react'; 60 | import DateRangePicker from '@wojtekmaj/react-daterange-picker'; 61 | 62 | type ValuePiece = Date | null; 63 | 64 | type Value = ValuePiece | [ValuePiece, ValuePiece]; 65 | 66 | function MyApp() { 67 | const [value, onChange] = useState([new Date(), new Date()]); 68 | 69 | return ( 70 |
71 | 72 |
73 | ); 74 | } 75 | ``` 76 | 77 | ### Custom styling 78 | 79 | If you want to use default React-DateRange-Picker and React-Calendar styling to build upon it, you can import them by using: 80 | 81 | ```ts 82 | import '@wojtekmaj/react-daterange-picker/dist/DateRangePicker.css'; 83 | import 'react-calendar/dist/Calendar.css'; 84 | ``` 85 | 86 | ## User guide 87 | 88 | ### DateRangePicker 89 | 90 | Displays an input field complete with custom inputs, native input, and a calendar. 91 | 92 | #### Props 93 | 94 | | Prop name | Description | Default value | Example values | 95 | | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | 96 | | autoFocus | Automatically focuses the input on mount. | n/a | `true` | 97 | | calendarAriaLabel | `aria-label` for the calendar button. | n/a | `"Toggle calendar"` | 98 | | calendarProps | Props to pass to React-Calendar component. | n/a | See [React-Calendar documentation](https://github.com/wojtekmaj/react-calendar) | 99 | | calendarIcon | Content of the calendar button. Setting the value explicitly to `null` will hide the icon. | (default icon) |
  • String: `"Calendar"`
  • React element: ``
  • React function: `CalendarIcon`
| 100 | | className | Class name(s) that will be added along with `"react-daterange-picker"` to the main React-DateRange-Picker `
` element. | n/a |
  • String: `"class1 class2"`
  • Array of strings: `["class1", "class2 class3"]`
| 101 | | clearAriaLabel | `aria-label` for the clear button. | n/a | `"Clear value"` | 102 | | clearIcon | Content of the clear button. Setting the value explicitly to `null` will hide the icon. | (default icon) |
  • String: `"Clear"`
  • React element: ``
  • React function: `ClearIcon`
| 103 | | closeCalendar | Whether to close the calendar on value selection. **Note**: It's recommended to use `shouldCloseCalendar` function instead. | `true` | `false` | 104 | | data-testid | `data-testid` attribute for the main React-DateRange-Picker `
` element. | n/a | `"daterange-picker"` | 105 | | dayAriaLabel | `aria-label` for the day input. | n/a | `"Day"` | 106 | | dayPlaceholder | `placeholder` for the day input. | `"--"` | `"dd"` | 107 | | disableCalendar | When set to `true`, will remove the calendar and the button toggling its visibility. | `false` | `true` | 108 | | disabled | Whether the date range picker should be disabled. | `false` | `true` | 109 | | format | Input format based on [Unicode Technical Standard #35](https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table). Supported values are: `y`, `M`, `MM`, `MMM`, `MMMM`, `d`, `dd`. **Note**: When using SSR, setting this prop may help resolving hydration errors caused by locale mismatch between server and client. | n/a | `"y-MM-dd"` | 110 | | id | `id` attribute for the main React-DateRange-Picker `
` element. | n/a | `"daterange-picker"` | 111 | | isOpen | Whether the calendar should be opened. | `false` | `true` | 112 | | locale | Locale that should be used by the date range picker and the calendar. Can be any [IETF language tag](https://en.wikipedia.org/wiki/IETF_language_tag). **Note**: When using SSR, setting this prop may help resolving hydration errors caused by locale mismatch between server and client. | Server locale/User's browser settings | `"hu-HU"` | 113 | | maxDate | Maximum date that the user can select. Periods partially overlapped by maxDate will also be selectable, although React-DateRange-Picker will ensure that no later date is selected. | n/a | Date: `new Date()` | 114 | | maxDetail | The most detailed calendar view that the user shall see. View defined here also becomes the one on which clicking an item in the calendar will select a date and pass it to onChange. Can be `"month"`, `"year"`, `"decade"` or `"century"`. | `"month"` | `"year"` | 115 | | minDate | Minimum date that the user can select. Periods partially overlapped by minDate will also be selectable, although React-DateRange-Picker will ensure that no earlier date is selected. | n/a | Date: `new Date()` | 116 | | monthAriaLabel | `aria-label` for the month input. | n/a | `"Month"` | 117 | | monthPlaceholder | `placeholder` for the month input. | `"--"` | `"mm"` | 118 | | name | Input name prefix. Date from/Date to fields will be named `"yourprefix_from"` and `"yourprefix_to"` respectively. | `"daterange"` | `"myCustomName"` | 119 | | nativeInputAriaLabel | `aria-label` for the native date input. | n/a | `"Date"` | 120 | | onCalendarClose | Function called when the calendar closes. | n/a | `() => alert('Calendar closed')` | 121 | | onCalendarOpen | Function called when the calendar opens. | n/a | `() => alert('Calendar opened')` | 122 | | onChange | Function called when the user picks a valid date. If any of the fields were excluded using custom `format`, `new Date(y, 0, 1, 0, 0, 0)`, where `y` is the current year, is going to serve as a "base". | n/a | `(value) => alert('New date is: ', value)` | 123 | | onFocus | Function called when the user focuses an input. | n/a | `(event) => alert('Focused input: ', event.target.name)` | 124 | | onInvalidChange | Function called when the user picks an invalid date. | n/a | `() => alert('Invalid date')` | 125 | | openCalendarOnFocus | Whether to open the calendar on input focus. **Note**: It's recommended to use `shouldOpenCalendar` function instead. | `true` | `false` | 126 | | portalContainer | Element to render the calendar in using portal. | n/a | `document.getElementById('my-div')` | 127 | | rangeDivider | Divider between date inputs. | `"–"` | `" to "` | 128 | | required | Whether date input should be required. | `false` | `true` | 129 | | shouldCloseCalendar | Function called before the calendar closes. `reason` can be `"buttonClick"`, `"escape"`, `"outsideAction"`, or `"select"`. If it returns `false`, the calendar will not close. | n/a | `({ reason }) => reason !== 'outsideAction'` | 130 | | shouldOpenCalendar | Function called before the calendar opens. `reason` can be `"buttonClick"` or `"focus"`. If it returns `false`, the calendar will not open. | n/a | `({ reason }) => reason !== 'focus'` | 131 | | showLeadingZeros | Whether leading zeros should be rendered in date inputs. | `false` | `true` | 132 | | value | Input value. | n/a |
  • Date: `new Date(2017, 0, 1)`
  • String: `"2017-01-01"`
  • An array of dates: `[new Date(2017, 0, 1), new Date(2017, 7, 1)]`
  • An array of strings: `["2017-01-01", "2017-08-01"]`
| 133 | | yearAriaLabel | `aria-label` for the year input. | n/a | `"Year"` | 134 | | yearPlaceholder | `aria-label` for the year input. | `"----"` | `"yyyy"` | 135 | 136 | ### Calendar 137 | 138 | DateRangePicker component passes all props to React-Calendar, with the exception of `className` (you can use `calendarClassName` for that instead). There are tons of customizations you can do! For more information, see [Calendar component props](https://github.com/wojtekmaj/react-calendar#props). 139 | 140 | ## License 141 | 142 | The MIT License. 143 | 144 | ## Author 145 | 146 | 147 | 148 | 151 | 154 | 155 |
149 | Wojciech Maj 150 | 152 | Wojciech Maj 153 |
156 | -------------------------------------------------------------------------------- /packages/react-daterange-picker/src/DateRangePicker.spec.tsx: -------------------------------------------------------------------------------- 1 | import { describe, expect, it, vi } from 'vitest'; 2 | import { page, userEvent } from 'vitest/browser'; 3 | import { render } from 'vitest-browser-react'; 4 | import { act } from 'react-dom/test-utils'; 5 | 6 | import DateRangePicker from './DateRangePicker.js'; 7 | 8 | import type { Locator } from 'vitest/browser'; 9 | 10 | async function waitForElementToBeRemovedOrHidden(callback: () => HTMLElement | null) { 11 | const element = callback(); 12 | 13 | if (element) { 14 | await vi.waitFor(() => 15 | expect(element).toHaveAttribute('class', expect.stringContaining('--closed')), 16 | ); 17 | } 18 | } 19 | 20 | describe('DateRangePicker', () => { 21 | const defaultProps = { 22 | dayAriaLabel: 'day', 23 | monthAriaLabel: 'month', 24 | yearAriaLabel: 'year', 25 | }; 26 | 27 | it('passes default name to DateInput components', async () => { 28 | const { container } = await render(); 29 | 30 | const nativeInputs = container.querySelectorAll('input[type="date"]'); 31 | 32 | expect(nativeInputs[0]).toHaveAttribute('name', 'daterange_from'); 33 | expect(nativeInputs[1]).toHaveAttribute('name', 'daterange_to'); 34 | }); 35 | 36 | it('passes custom name to DateInput components', async () => { 37 | const name = 'testName'; 38 | 39 | const { container } = await render(); 40 | 41 | const nativeInputs = container.querySelectorAll('input[type="date"]'); 42 | 43 | expect(nativeInputs[0]).toHaveAttribute('name', `${name}_from`); 44 | expect(nativeInputs[1]).toHaveAttribute('name', `${name}_to`); 45 | }); 46 | 47 | it('passes autoFocus flag to first DateInput component', async () => { 48 | await render(); 49 | 50 | const customInputs = page.getByRole('spinbutton'); 51 | 52 | expect(customInputs.nth(0)).toHaveFocus(); 53 | }); 54 | 55 | it('passes disabled flag to DateInput components', async () => { 56 | const { container } = await render(); 57 | 58 | const nativeInputs = container.querySelectorAll('input[type="date"]'); 59 | 60 | expect(nativeInputs[0]).toBeDisabled(); 61 | expect(nativeInputs[1]).toBeDisabled(); 62 | }); 63 | 64 | it('passes format to DateInput components', async () => { 65 | await render(); 66 | 67 | const customInputs = page.getByRole('spinbutton'); 68 | 69 | expect(customInputs).toHaveLength(2); 70 | expect(customInputs.nth(0)).toHaveAttribute('name', 'year'); 71 | expect(customInputs.nth(1)).toHaveAttribute('name', 'year'); 72 | }); 73 | 74 | it('passes aria-label props to DateInput components', async () => { 75 | const ariaLabelProps = { 76 | calendarAriaLabel: 'Toggle calendar', 77 | clearAriaLabel: 'Clear value', 78 | dayAriaLabel: 'Day', 79 | monthAriaLabel: 'Month', 80 | nativeInputAriaLabel: 'Date', 81 | yearAriaLabel: 'Year', 82 | }; 83 | 84 | const { container } = await render(); 85 | 86 | const calendarButton = page.getByTestId('calendar-button'); 87 | const clearButton = page.getByTestId('clear-button'); 88 | const dateInputs = container.querySelectorAll( 89 | '.react-daterange-picker__inputGroup', 90 | ) as unknown as [HTMLDivElement, HTMLDivElement]; 91 | 92 | const [dateFromInput, dateToInput] = dateInputs; 93 | 94 | const nativeFromInput = dateFromInput.querySelector('input[type="date"]'); 95 | const dayFromInput = dateFromInput.querySelector('input[name="day"]'); 96 | const monthFromInput = dateFromInput.querySelector('input[name="month"]'); 97 | const yearFromInput = dateFromInput.querySelector('input[name="year"]'); 98 | 99 | const nativeToInput = dateToInput.querySelector('input[type="date"]'); 100 | const dayToInput = dateToInput.querySelector('input[name="day"]'); 101 | const monthToInput = dateToInput.querySelector('input[name="month"]'); 102 | const yearToInput = dateToInput.querySelector('input[name="year"]'); 103 | 104 | expect(calendarButton).toHaveAttribute('aria-label', ariaLabelProps.calendarAriaLabel); 105 | expect(clearButton).toHaveAttribute('aria-label', ariaLabelProps.clearAriaLabel); 106 | 107 | expect(nativeFromInput).toHaveAttribute('aria-label', ariaLabelProps.nativeInputAriaLabel); 108 | expect(dayFromInput).toHaveAttribute('aria-label', ariaLabelProps.dayAriaLabel); 109 | expect(monthFromInput).toHaveAttribute('aria-label', ariaLabelProps.monthAriaLabel); 110 | expect(yearFromInput).toHaveAttribute('aria-label', ariaLabelProps.yearAriaLabel); 111 | 112 | expect(nativeToInput).toHaveAttribute('aria-label', ariaLabelProps.nativeInputAriaLabel); 113 | expect(dayToInput).toHaveAttribute('aria-label', ariaLabelProps.dayAriaLabel); 114 | expect(monthToInput).toHaveAttribute('aria-label', ariaLabelProps.monthAriaLabel); 115 | expect(yearToInput).toHaveAttribute('aria-label', ariaLabelProps.yearAriaLabel); 116 | }); 117 | 118 | it('passes placeholder props to DateInput components', async () => { 119 | const placeholderProps = { 120 | dayPlaceholder: 'dd', 121 | monthPlaceholder: 'mm', 122 | yearPlaceholder: 'yyyy', 123 | }; 124 | 125 | const { container } = await render(); 126 | 127 | const dateInputs = container.querySelectorAll( 128 | '.react-daterange-picker__inputGroup', 129 | ) as unknown as [HTMLDivElement, HTMLDivElement]; 130 | 131 | const [dateFromInput, dateToInput] = dateInputs; 132 | 133 | const dayFromInput = dateFromInput.querySelector('input[name="day"]'); 134 | const monthFromInput = dateFromInput.querySelector('input[name="month"]'); 135 | const yearFromInput = dateFromInput.querySelector('input[name="year"]'); 136 | 137 | const dayToInput = dateToInput.querySelector('input[name="day"]'); 138 | const monthToInput = dateToInput.querySelector('input[name="month"]'); 139 | const yearToInput = dateToInput.querySelector('input[name="year"]'); 140 | 141 | expect(dayFromInput).toHaveAttribute('placeholder', placeholderProps.dayPlaceholder); 142 | expect(monthFromInput).toHaveAttribute('placeholder', placeholderProps.monthPlaceholder); 143 | expect(yearFromInput).toHaveAttribute('placeholder', placeholderProps.yearPlaceholder); 144 | 145 | expect(dayToInput).toHaveAttribute('placeholder', placeholderProps.dayPlaceholder); 146 | expect(monthToInput).toHaveAttribute('placeholder', placeholderProps.monthPlaceholder); 147 | expect(yearToInput).toHaveAttribute('placeholder', placeholderProps.yearPlaceholder); 148 | }); 149 | 150 | describe('passes value to DateInput components', () => { 151 | it('passes single value to DateInput components', async () => { 152 | const value = new Date(2019, 0, 1); 153 | 154 | const { container } = await render(); 155 | 156 | const nativeInputs = container.querySelectorAll('input[type="date"]'); 157 | 158 | expect(nativeInputs[0]).toHaveValue('2019-01-01'); 159 | expect(nativeInputs[1]).toHaveValue(''); 160 | }); 161 | 162 | it('passes the first item of an array of values to DateInput components', async () => { 163 | const value1 = new Date(2019, 0, 1); 164 | const value2 = new Date(2019, 6, 1); 165 | 166 | const { container } = await render( 167 | , 168 | ); 169 | 170 | const nativeInputs = container.querySelectorAll('input[type="date"]'); 171 | 172 | expect(nativeInputs[0]).toHaveValue('2019-01-01'); 173 | expect(nativeInputs[1]).toHaveValue('2019-07-01'); 174 | }); 175 | }); 176 | 177 | it('applies className to its wrapper when given a string', async () => { 178 | const className = 'testClassName'; 179 | 180 | const { container } = await render(); 181 | 182 | const wrapper = container.firstElementChild; 183 | 184 | expect(wrapper).toHaveClass(className); 185 | }); 186 | 187 | it('applies "--open" className to its wrapper when given isOpen flag', async () => { 188 | const { container } = await render(); 189 | 190 | const wrapper = container.firstElementChild; 191 | 192 | expect(wrapper).toHaveClass('react-daterange-picker--open'); 193 | }); 194 | 195 | it('applies calendarClassName to the calendar when given a string', async () => { 196 | const calendarClassName = 'testClassName'; 197 | 198 | const { container } = await render( 199 | , 200 | ); 201 | 202 | const calendar = container.querySelector('.react-calendar'); 203 | 204 | expect(calendar).toHaveClass(calendarClassName); 205 | }); 206 | 207 | it('renders DateInput components', async () => { 208 | const { container } = await render(); 209 | 210 | const nativeInputs = container.querySelectorAll('input[type="date"]'); 211 | 212 | expect(nativeInputs.length).toBe(2); 213 | }); 214 | 215 | it('renders range divider with default divider', async () => { 216 | await render(); 217 | 218 | const rangeDivider = page.getByTestId('range-divider'); 219 | 220 | expect(rangeDivider).toBeInTheDocument(); 221 | expect(rangeDivider).toHaveTextContent('–'); 222 | }); 223 | 224 | it('renders range divider with custom divider', async () => { 225 | await render(); 226 | 227 | const rangeDivider = page.getByTestId('range-divider'); 228 | 229 | expect(rangeDivider).toBeInTheDocument(); 230 | expect(rangeDivider).toHaveTextContent('to'); 231 | }); 232 | 233 | describe('renders clear button properly', () => { 234 | it('renders clear button', async () => { 235 | await render(); 236 | 237 | const clearButton = page.getByTestId('clear-button'); 238 | 239 | expect(clearButton).toBeInTheDocument(); 240 | }); 241 | 242 | it('renders clear icon by default when clearIcon is not given', async () => { 243 | await render(); 244 | 245 | const clearButton = page.getByTestId('clear-button'); 246 | 247 | const clearIcon = clearButton.element().querySelector('svg'); 248 | 249 | expect(clearIcon).toBeInTheDocument(); 250 | }); 251 | 252 | it('renders clear icon when given clearIcon as a string', async () => { 253 | await render(); 254 | 255 | const clearButton = page.getByTestId('clear-button'); 256 | 257 | expect(clearButton).toHaveTextContent('❌'); 258 | }); 259 | 260 | it('renders clear icon when given clearIcon as a React element', async () => { 261 | function ClearIcon() { 262 | return <>❌; 263 | } 264 | 265 | await render(} />); 266 | 267 | const clearButton = page.getByTestId('clear-button'); 268 | 269 | expect(clearButton).toHaveTextContent('❌'); 270 | }); 271 | 272 | it('renders clear icon when given clearIcon as a function', async () => { 273 | function ClearIcon() { 274 | return <>❌; 275 | } 276 | 277 | await render(); 278 | 279 | const clearButton = page.getByTestId('clear-button'); 280 | 281 | expect(clearButton).toHaveTextContent('❌'); 282 | }); 283 | }); 284 | 285 | describe('renders calendar button properly', () => { 286 | it('renders calendar button', async () => { 287 | await render(); 288 | 289 | const calendarButton = page.getByTestId('calendar-button'); 290 | 291 | expect(calendarButton).toBeInTheDocument(); 292 | }); 293 | 294 | it('renders calendar icon by default when calendarIcon is not given', async () => { 295 | await render(); 296 | 297 | const calendarButton = page.getByTestId('calendar-button'); 298 | 299 | const calendarIcon = calendarButton.element().querySelector('svg'); 300 | 301 | expect(calendarIcon).toBeInTheDocument(); 302 | }); 303 | 304 | it('renders calendar icon when given calendarIcon as a string', async () => { 305 | await render(); 306 | 307 | const calendarButton = page.getByTestId('calendar-button'); 308 | 309 | expect(calendarButton).toHaveTextContent('📅'); 310 | }); 311 | 312 | it('renders calendar icon when given calendarIcon as a React element', async () => { 313 | function CalendarIcon() { 314 | return <>📅; 315 | } 316 | 317 | await render(} />); 318 | 319 | const calendarButton = page.getByTestId('calendar-button'); 320 | 321 | expect(calendarButton).toHaveTextContent('📅'); 322 | }); 323 | 324 | it('renders calendar icon when given calendarIcon as a function', async () => { 325 | function CalendarIcon() { 326 | return <>📅; 327 | } 328 | 329 | await render(); 330 | 331 | const calendarButton = page.getByTestId('calendar-button'); 332 | 333 | expect(calendarButton).toHaveTextContent('📅'); 334 | }); 335 | }); 336 | 337 | it('renders Calendar component when given isOpen flag', async () => { 338 | const { container } = await render(); 339 | 340 | const calendar = container.querySelector('.react-calendar'); 341 | 342 | expect(calendar).toBeInTheDocument(); 343 | }); 344 | 345 | it('does not render Calendar component when given disableCalendar & isOpen flags', async () => { 346 | const { container } = await render( 347 | , 348 | ); 349 | 350 | const calendar = container.querySelector('.react-calendar'); 351 | 352 | expect(calendar).not.toBeInTheDocument(); 353 | }); 354 | 355 | it('opens Calendar component when given isOpen flag by changing props', async () => { 356 | const { container, rerender } = await render(); 357 | 358 | const calendar = container.querySelector('.react-calendar'); 359 | 360 | expect(calendar).not.toBeInTheDocument(); 361 | 362 | rerender(); 363 | 364 | const calendar2 = container.querySelector('.react-calendar'); 365 | 366 | expect(calendar2).toBeInTheDocument(); 367 | }); 368 | 369 | it('opens Calendar component when clicking on a button', async () => { 370 | const { container } = await render(); 371 | 372 | const calendar = container.querySelector('.react-calendar'); 373 | 374 | expect(calendar).not.toBeInTheDocument(); 375 | 376 | const button = page.getByTestId('calendar-button'); 377 | 378 | await userEvent.click(button); 379 | 380 | const calendar2 = container.querySelector('.react-calendar'); 381 | 382 | expect(calendar2).toBeInTheDocument(); 383 | }); 384 | 385 | function triggerFocusInEvent(locator: Locator) { 386 | const element = locator.element(); 387 | 388 | element.dispatchEvent( 389 | new FocusEvent('focusin', { bubbles: true, cancelable: false, composed: true }), 390 | ); 391 | } 392 | 393 | function triggerFocusEvent(locator: Locator) { 394 | triggerFocusInEvent(locator); 395 | 396 | const element = locator.element(); 397 | 398 | element.dispatchEvent( 399 | new FocusEvent('focus', { bubbles: false, cancelable: false, composed: true }), 400 | ); 401 | } 402 | 403 | describe('handles opening Calendar component when focusing on an input inside properly', () => { 404 | it('opens Calendar component when focusing on an input inside by default', async () => { 405 | const { container } = await render(); 406 | 407 | const calendar = container.querySelector('.react-calendar'); 408 | 409 | expect(calendar).not.toBeInTheDocument(); 410 | 411 | const input = page.getByRole('spinbutton', { name: 'day' }).first(); 412 | 413 | act(() => { 414 | triggerFocusEvent(input); 415 | }); 416 | 417 | const calendar2 = container.querySelector('.react-calendar'); 418 | 419 | expect(calendar2).toBeInTheDocument(); 420 | }); 421 | 422 | it('opens Calendar component when focusing on an input inside given openCalendarOnFocus = true', async () => { 423 | const { container } = await render(); 424 | 425 | const calendar = container.querySelector('.react-calendar'); 426 | const input = page.getByRole('spinbutton', { name: 'day' }).first(); 427 | 428 | expect(calendar).not.toBeInTheDocument(); 429 | 430 | act(() => { 431 | triggerFocusEvent(input); 432 | }); 433 | 434 | const calendar2 = container.querySelector('.react-calendar'); 435 | 436 | expect(calendar2).toBeInTheDocument(); 437 | }); 438 | 439 | it('does not open Calendar component when focusing on an input inside given openCalendarOnFocus = false', async () => { 440 | const { container } = await render( 441 | , 442 | ); 443 | 444 | const calendar = container.querySelector('.react-calendar'); 445 | const input = page.getByRole('spinbutton', { name: 'day' }).first(); 446 | 447 | expect(calendar).not.toBeInTheDocument(); 448 | 449 | act(() => { 450 | triggerFocusEvent(input); 451 | }); 452 | 453 | const calendar2 = container.querySelector('.react-calendar'); 454 | 455 | expect(calendar2).toBeFalsy(); 456 | }); 457 | 458 | it('does not open Calendar when focusing on an input inside given shouldOpenCalendar function returning false', async () => { 459 | const shouldOpenCalendar = () => false; 460 | 461 | const { container } = await render( 462 | , 463 | ); 464 | 465 | const calendar = container.querySelector('.react-calendar'); 466 | const input = page.getByRole('spinbutton', { name: 'day' }).first(); 467 | 468 | expect(calendar).not.toBeInTheDocument(); 469 | 470 | triggerFocusEvent(input); 471 | 472 | const calendar2 = container.querySelector('.react-calendar'); 473 | 474 | expect(calendar2).toBeFalsy(); 475 | }); 476 | 477 | it('does not open Calendar component when focusing on a select element', async () => { 478 | const { container } = await render( 479 | , 480 | ); 481 | 482 | const calendar = container.querySelector('.react-calendar'); 483 | const select = page.getByRole('combobox', { name: 'month' }).first(); 484 | 485 | expect(calendar).not.toBeInTheDocument(); 486 | 487 | triggerFocusEvent(select); 488 | 489 | const calendar2 = container.querySelector('.react-calendar'); 490 | 491 | expect(calendar2).toBeFalsy(); 492 | }); 493 | }); 494 | 495 | it('closes Calendar component when clicked outside', async () => { 496 | const { container } = await render(); 497 | 498 | await userEvent.click(document.body); 499 | 500 | await waitForElementToBeRemovedOrHidden(() => 501 | container.querySelector('.react-daterange-picker__calendar'), 502 | ); 503 | }); 504 | 505 | it('closes Calendar component when focused outside', async () => { 506 | const { container } = await render(); 507 | 508 | triggerFocusInEvent(page.elementLocator(document.body)); 509 | 510 | await waitForElementToBeRemovedOrHidden(() => 511 | container.querySelector('.react-daterange-picker__calendar'), 512 | ); 513 | }); 514 | 515 | function triggerTouchStart(element: HTMLElement) { 516 | element.dispatchEvent(new TouchEvent('touchstart', { bubbles: true, cancelable: true })); 517 | } 518 | 519 | it('closes Calendar component when tapped outside', async () => { 520 | const { container } = await render(); 521 | 522 | triggerTouchStart(document.body); 523 | 524 | await waitForElementToBeRemovedOrHidden(() => 525 | container.querySelector('.react-daterange-picker__calendar'), 526 | ); 527 | }); 528 | 529 | function triggerFocusOutEvent(locator: Locator) { 530 | const element = locator.element(); 531 | 532 | element.dispatchEvent( 533 | new FocusEvent('focusout', { bubbles: true, cancelable: false, composed: true }), 534 | ); 535 | } 536 | 537 | function triggerBlurEvent(locator: Locator) { 538 | triggerFocusOutEvent(locator); 539 | 540 | const element = locator.element(); 541 | 542 | element.dispatchEvent( 543 | new FocusEvent('blur', { bubbles: false, cancelable: false, composed: true }), 544 | ); 545 | } 546 | 547 | it('does not close Calendar component when focused inside', async () => { 548 | const { container } = await render(); 549 | 550 | const monthInput = page.getByRole('spinbutton', { name: 'month' }).first(); 551 | const dayInput = page.getByRole('spinbutton', { name: 'day' }).first(); 552 | 553 | triggerBlurEvent(monthInput); 554 | triggerFocusEvent(dayInput); 555 | 556 | const calendar = container.querySelector('.react-calendar'); 557 | 558 | expect(calendar).toBeInTheDocument(); 559 | }); 560 | 561 | it('closes Calendar when changing value by default', async () => { 562 | const { container } = await render(); 563 | 564 | const [firstTile, secondTile] = container.querySelectorAll( 565 | '.react-calendar__tile', 566 | ) as unknown as [HTMLButtonElement, HTMLButtonElement]; 567 | 568 | await act(async () => { 569 | await userEvent.click(firstTile); 570 | }); 571 | 572 | await act(async () => { 573 | await userEvent.click(secondTile); 574 | }); 575 | 576 | await waitForElementToBeRemovedOrHidden(() => 577 | container.querySelector('.react-daterange-picker__calendar'), 578 | ); 579 | }); 580 | 581 | it('closes Calendar when changing value with prop closeCalendar = true', async () => { 582 | const { container } = await render(); 583 | 584 | const [firstTile, secondTile] = container.querySelectorAll( 585 | '.react-calendar__tile', 586 | ) as unknown as [HTMLButtonElement, HTMLButtonElement]; 587 | 588 | await act(async () => { 589 | await userEvent.click(firstTile); 590 | }); 591 | 592 | await act(async () => { 593 | await userEvent.click(secondTile); 594 | }); 595 | 596 | await waitForElementToBeRemovedOrHidden(() => 597 | container.querySelector('.react-daterange-picker__calendar'), 598 | ); 599 | }); 600 | 601 | it('does not close Calendar when changing value with prop closeCalendar = false', async () => { 602 | const { container } = await render( 603 | , 604 | ); 605 | 606 | const [firstTile, secondTile] = container.querySelectorAll( 607 | '.react-calendar__tile', 608 | ) as unknown as [HTMLButtonElement, HTMLButtonElement]; 609 | 610 | await act(async () => { 611 | await userEvent.click(firstTile); 612 | }); 613 | 614 | await act(async () => { 615 | await userEvent.click(secondTile); 616 | }); 617 | 618 | const calendar = container.querySelector('.react-calendar'); 619 | 620 | expect(calendar).toBeInTheDocument(); 621 | }); 622 | 623 | it('does not close Calendar when changing value with shouldCloseCalendar function returning false', async () => { 624 | const shouldCloseCalendar = () => false; 625 | 626 | const { container } = await render( 627 | , 628 | ); 629 | 630 | const firstTile = container.querySelector('.react-calendar__tile') as HTMLButtonElement; 631 | 632 | await act(async () => { 633 | await userEvent.click(firstTile); 634 | }); 635 | 636 | const calendar = container.querySelector('.react-calendar'); 637 | 638 | expect(calendar).toBeInTheDocument(); 639 | }); 640 | 641 | it('does not close Calendar when changing value using inputs', async () => { 642 | const { container } = await render(); 643 | 644 | const dayInput = page.getByRole('spinbutton', { name: 'day' }).first(); 645 | 646 | await act(async () => { 647 | await userEvent.fill(dayInput, '1'); 648 | }); 649 | 650 | const calendar = container.querySelector('.react-calendar'); 651 | 652 | expect(calendar).toBeInTheDocument(); 653 | }); 654 | 655 | it('calls onChange callback when changing value', async () => { 656 | const value = new Date(2023, 0, 31); 657 | const onChange = vi.fn(); 658 | 659 | await render(); 660 | 661 | const dayInput = page.getByRole('spinbutton', { name: 'day' }).first(); 662 | 663 | await act(async () => { 664 | await userEvent.fill(dayInput, '1'); 665 | }); 666 | 667 | expect(onChange).toHaveBeenCalledWith([new Date(2023, 0, 1), null]); 668 | }); 669 | 670 | it('calls onInvalidChange callback when changing value to an invalid one', async () => { 671 | const value = new Date(2023, 0, 31); 672 | const onInvalidChange = vi.fn(); 673 | 674 | await render( 675 | , 676 | ); 677 | 678 | const dayInput = page.getByRole('spinbutton', { name: 'day' }).first(); 679 | 680 | await act(async () => { 681 | await userEvent.fill(dayInput, '32'); 682 | }); 683 | 684 | expect(onInvalidChange).toHaveBeenCalled(); 685 | }); 686 | 687 | it('clears the value when clicking on a button', async () => { 688 | const onChange = vi.fn(); 689 | 690 | const { container } = await render(); 691 | 692 | const calendar = container.querySelector('.react-calendar'); 693 | const button = page.getByTestId('clear-button'); 694 | 695 | expect(calendar).not.toBeInTheDocument(); 696 | 697 | await userEvent.click(button); 698 | 699 | expect(onChange).toHaveBeenCalledWith(null); 700 | }); 701 | 702 | describe('onChangeFrom', () => { 703 | it('calls onChange properly given no initial value', async () => { 704 | const onChange = vi.fn(); 705 | 706 | await render(); 707 | 708 | const nextValueFrom = new Date(2018, 1, 15); 709 | 710 | const monthInput = page.getByRole('spinbutton', { name: 'month' }).first(); 711 | const dayInput = page.getByRole('spinbutton', { name: 'day' }).first(); 712 | const yearInput = page.getByRole('spinbutton', { name: 'year' }).first(); 713 | 714 | await act(async () => { 715 | await userEvent.fill(monthInput, '2'); 716 | 717 | await userEvent.fill(dayInput, '15'); 718 | 719 | await userEvent.fill(yearInput, '2018'); 720 | }); 721 | 722 | expect(onChange).toHaveBeenCalled(); 723 | expect(onChange).toHaveBeenCalledWith([nextValueFrom, null]); 724 | }); 725 | 726 | it('calls onChange properly given single initial value', async () => { 727 | const onChange = vi.fn(); 728 | const value = new Date(2018, 0, 1); 729 | 730 | await render(); 731 | 732 | const nextValueFrom = new Date(2018, 1, 15); 733 | 734 | const monthInput = page.getByRole('spinbutton', { name: 'month' }).first(); 735 | const dayInput = page.getByRole('spinbutton', { name: 'day' }).first(); 736 | const yearInput = page.getByRole('spinbutton', { name: 'year' }).first(); 737 | 738 | await act(async () => { 739 | await userEvent.fill(monthInput, '2'); 740 | 741 | await userEvent.fill(dayInput, '15'); 742 | 743 | await userEvent.fill(yearInput, '2018'); 744 | }); 745 | 746 | expect(onChange).toHaveBeenCalled(); 747 | expect(onChange).toHaveBeenCalledWith([nextValueFrom, null]); 748 | }); 749 | 750 | it('calls onChange properly given initial value as an array', async () => { 751 | const onChange = vi.fn(); 752 | const valueFrom = new Date(2018, 0, 1); 753 | const valueTo = new Date(2018, 6, 1); 754 | const value = [valueFrom, valueTo] as [Date, Date]; 755 | 756 | await render(); 757 | 758 | const nextValueFrom = new Date(2018, 1, 15); 759 | 760 | const monthInput = page.getByRole('spinbutton', { name: 'month' }).first(); 761 | const dayInput = page.getByRole('spinbutton', { name: 'day' }).first(); 762 | const yearInput = page.getByRole('spinbutton', { name: 'year' }).first(); 763 | 764 | await act(async () => { 765 | await userEvent.fill(monthInput, '2'); 766 | 767 | await userEvent.fill(dayInput, '15'); 768 | 769 | await userEvent.fill(yearInput, '2018'); 770 | }); 771 | 772 | expect(onChange).toHaveBeenCalled(); 773 | expect(onChange).toHaveBeenCalledWith([nextValueFrom, valueTo]); 774 | }); 775 | }); 776 | 777 | describe('onChangeTo', () => { 778 | it('calls onChange properly given no initial value', async () => { 779 | const onChange = vi.fn(); 780 | 781 | await render(); 782 | 783 | const nextValueTo = new Date(2018, 1, 15); 784 | nextValueTo.setDate(nextValueTo.getDate() + 1); 785 | nextValueTo.setTime(nextValueTo.getTime() - 1); 786 | 787 | const monthInput = page.getByRole('spinbutton', { name: 'month' }).nth(1); 788 | const dayInput = page.getByRole('spinbutton', { name: 'day' }).nth(1); 789 | const yearInput = page.getByRole('spinbutton', { name: 'year' }).nth(1); 790 | 791 | await act(async () => { 792 | await userEvent.fill(dayInput, '15'); 793 | 794 | await userEvent.fill(monthInput, '2'); 795 | 796 | await userEvent.fill(yearInput, '2018'); 797 | }); 798 | 799 | expect(onChange).toHaveBeenCalled(); 800 | expect(onChange).toHaveBeenCalledWith([null, nextValueTo]); 801 | }); 802 | 803 | it('calls onChange properly given single initial value', async () => { 804 | const onChange = vi.fn(); 805 | const value = new Date(2018, 0, 1); 806 | 807 | await render(); 808 | 809 | const nextValueTo = new Date(2018, 1, 15); 810 | nextValueTo.setDate(nextValueTo.getDate() + 1); 811 | nextValueTo.setTime(nextValueTo.getTime() - 1); 812 | 813 | const monthInput = page.getByRole('spinbutton', { name: 'month' }).nth(1); 814 | const dayInput = page.getByRole('spinbutton', { name: 'day' }).nth(1); 815 | const yearInput = page.getByRole('spinbutton', { name: 'year' }).nth(1); 816 | 817 | await act(async () => { 818 | await userEvent.fill(dayInput, '15'); 819 | 820 | await userEvent.fill(monthInput, '2'); 821 | 822 | await userEvent.fill(yearInput, '2018'); 823 | }); 824 | 825 | expect(onChange).toHaveBeenCalled(); 826 | expect(onChange).toHaveBeenCalledWith([value, nextValueTo]); 827 | }); 828 | 829 | it('calls onChange properly given initial value as an array', async () => { 830 | const onChange = vi.fn(); 831 | const valueFrom = new Date(2018, 0, 1); 832 | const valueTo = new Date(2018, 6, 1); 833 | const value = [valueFrom, valueTo] as [Date, Date]; 834 | 835 | await render(); 836 | 837 | const nextValueTo = new Date(2018, 1, 15); 838 | nextValueTo.setDate(nextValueTo.getDate() + 1); 839 | nextValueTo.setTime(nextValueTo.getTime() - 1); 840 | 841 | const monthInput = page.getByRole('spinbutton', { name: 'month' }).nth(1); 842 | const dayInput = page.getByRole('spinbutton', { name: 'day' }).nth(1); 843 | const yearInput = page.getByRole('spinbutton', { name: 'year' }).nth(1); 844 | 845 | await act(async () => { 846 | await userEvent.fill(dayInput, '15'); 847 | 848 | await userEvent.fill(monthInput, '2'); 849 | 850 | await userEvent.fill(yearInput, '2018'); 851 | }); 852 | 853 | expect(onChange).toHaveBeenCalled(); 854 | expect(onChange).toHaveBeenCalledWith([valueFrom, nextValueTo]); 855 | }); 856 | }); 857 | 858 | it('calls onClick callback when clicked a page (sample of mouse events family)', async () => { 859 | const onClick = vi.fn(); 860 | 861 | const { container } = await render(); 862 | 863 | const wrapper = container.firstElementChild as HTMLDivElement; 864 | await userEvent.click(wrapper); 865 | 866 | expect(onClick).toHaveBeenCalled(); 867 | }); 868 | 869 | it('calls onTouchStart callback when touched a page (sample of touch events family)', async () => { 870 | const onTouchStart = vi.fn(); 871 | 872 | const { container } = await render( 873 | , 874 | ); 875 | 876 | const wrapper = container.firstElementChild as HTMLDivElement; 877 | 878 | triggerTouchStart(wrapper); 879 | 880 | expect(onTouchStart).toHaveBeenCalled(); 881 | }); 882 | }); 883 | -------------------------------------------------------------------------------- /sample/yarn.lock: -------------------------------------------------------------------------------- 1 | # This file is generated by running "yarn install" inside your project. 2 | # Manual changes might be lost - proceed with caution! 3 | 4 | __metadata: 5 | version: 8 6 | cacheKey: 10c0 7 | 8 | "@ampproject/remapping@npm:^2.2.0": 9 | version: 2.3.0 10 | resolution: "@ampproject/remapping@npm:2.3.0" 11 | dependencies: 12 | "@jridgewell/gen-mapping": "npm:^0.3.5" 13 | "@jridgewell/trace-mapping": "npm:^0.3.24" 14 | checksum: 10c0/81d63cca5443e0f0c72ae18b544cc28c7c0ec2cea46e7cb888bb0e0f411a1191d0d6b7af798d54e30777d8d1488b2ec0732aac2be342d3d7d3ffd271c6f489ed 15 | languageName: node 16 | linkType: hard 17 | 18 | "@babel/code-frame@npm:^7.27.1": 19 | version: 7.27.1 20 | resolution: "@babel/code-frame@npm:7.27.1" 21 | dependencies: 22 | "@babel/helper-validator-identifier": "npm:^7.27.1" 23 | js-tokens: "npm:^4.0.0" 24 | picocolors: "npm:^1.1.1" 25 | checksum: 10c0/5dd9a18baa5fce4741ba729acc3a3272c49c25cb8736c4b18e113099520e7ef7b545a4096a26d600e4416157e63e87d66db46aa3fbf0a5f2286da2705c12da00 26 | languageName: node 27 | linkType: hard 28 | 29 | "@babel/compat-data@npm:^7.27.2": 30 | version: 7.27.5 31 | resolution: "@babel/compat-data@npm:7.27.5" 32 | checksum: 10c0/da2751fcd0b58eea958f2b2f7ff7d6de1280712b709fa1ad054b73dc7d31f589e353bb50479b9dc96007935f3ed3cada68ac5b45ce93086b7122ddc32e60dc00 33 | languageName: node 34 | linkType: hard 35 | 36 | "@babel/core@npm:^7.27.4": 37 | version: 7.27.4 38 | resolution: "@babel/core@npm:7.27.4" 39 | dependencies: 40 | "@ampproject/remapping": "npm:^2.2.0" 41 | "@babel/code-frame": "npm:^7.27.1" 42 | "@babel/generator": "npm:^7.27.3" 43 | "@babel/helper-compilation-targets": "npm:^7.27.2" 44 | "@babel/helper-module-transforms": "npm:^7.27.3" 45 | "@babel/helpers": "npm:^7.27.4" 46 | "@babel/parser": "npm:^7.27.4" 47 | "@babel/template": "npm:^7.27.2" 48 | "@babel/traverse": "npm:^7.27.4" 49 | "@babel/types": "npm:^7.27.3" 50 | convert-source-map: "npm:^2.0.0" 51 | debug: "npm:^4.1.0" 52 | gensync: "npm:^1.0.0-beta.2" 53 | json5: "npm:^2.2.3" 54 | semver: "npm:^6.3.1" 55 | checksum: 10c0/d2d17b106a8d91d3eda754bb3f26b53a12eb7646df73c2b2d2e9b08d90529186bc69e3823f70a96ec6e5719dc2372fb54e14ad499da47ceeb172d2f7008787b5 56 | languageName: node 57 | linkType: hard 58 | 59 | "@babel/generator@npm:^7.27.3": 60 | version: 7.27.5 61 | resolution: "@babel/generator@npm:7.27.5" 62 | dependencies: 63 | "@babel/parser": "npm:^7.27.5" 64 | "@babel/types": "npm:^7.27.3" 65 | "@jridgewell/gen-mapping": "npm:^0.3.5" 66 | "@jridgewell/trace-mapping": "npm:^0.3.25" 67 | jsesc: "npm:^3.0.2" 68 | checksum: 10c0/8f649ef4cd81765c832bb11de4d6064b035ffebdecde668ba7abee68a7b0bce5c9feabb5dc5bb8aeba5bd9e5c2afa3899d852d2bd9ca77a711ba8c8379f416f0 69 | languageName: node 70 | linkType: hard 71 | 72 | "@babel/helper-compilation-targets@npm:^7.27.2": 73 | version: 7.27.2 74 | resolution: "@babel/helper-compilation-targets@npm:7.27.2" 75 | dependencies: 76 | "@babel/compat-data": "npm:^7.27.2" 77 | "@babel/helper-validator-option": "npm:^7.27.1" 78 | browserslist: "npm:^4.24.0" 79 | lru-cache: "npm:^5.1.1" 80 | semver: "npm:^6.3.1" 81 | checksum: 10c0/f338fa00dcfea931804a7c55d1a1c81b6f0a09787e528ec580d5c21b3ecb3913f6cb0f361368973ce953b824d910d3ac3e8a8ee15192710d3563826447193ad1 82 | languageName: node 83 | linkType: hard 84 | 85 | "@babel/helper-module-imports@npm:^7.27.1": 86 | version: 7.27.1 87 | resolution: "@babel/helper-module-imports@npm:7.27.1" 88 | dependencies: 89 | "@babel/traverse": "npm:^7.27.1" 90 | "@babel/types": "npm:^7.27.1" 91 | checksum: 10c0/e00aace096e4e29290ff8648455c2bc4ed982f0d61dbf2db1b5e750b9b98f318bf5788d75a4f974c151bd318fd549e81dbcab595f46b14b81c12eda3023f51e8 92 | languageName: node 93 | linkType: hard 94 | 95 | "@babel/helper-module-transforms@npm:^7.27.3": 96 | version: 7.27.3 97 | resolution: "@babel/helper-module-transforms@npm:7.27.3" 98 | dependencies: 99 | "@babel/helper-module-imports": "npm:^7.27.1" 100 | "@babel/helper-validator-identifier": "npm:^7.27.1" 101 | "@babel/traverse": "npm:^7.27.3" 102 | peerDependencies: 103 | "@babel/core": ^7.0.0 104 | checksum: 10c0/fccb4f512a13b4c069af51e1b56b20f54024bcf1591e31e978a30f3502567f34f90a80da6a19a6148c249216292a8074a0121f9e52602510ef0f32dbce95ca01 105 | languageName: node 106 | linkType: hard 107 | 108 | "@babel/helper-plugin-utils@npm:^7.27.1": 109 | version: 7.27.1 110 | resolution: "@babel/helper-plugin-utils@npm:7.27.1" 111 | checksum: 10c0/94cf22c81a0c11a09b197b41ab488d416ff62254ce13c57e62912c85700dc2e99e555225787a4099ff6bae7a1812d622c80fbaeda824b79baa10a6c5ac4cf69b 112 | languageName: node 113 | linkType: hard 114 | 115 | "@babel/helper-string-parser@npm:^7.27.1": 116 | version: 7.27.1 117 | resolution: "@babel/helper-string-parser@npm:7.27.1" 118 | checksum: 10c0/8bda3448e07b5583727c103560bcf9c4c24b3c1051a4c516d4050ef69df37bb9a4734a585fe12725b8c2763de0a265aa1e909b485a4e3270b7cfd3e4dbe4b602 119 | languageName: node 120 | linkType: hard 121 | 122 | "@babel/helper-validator-identifier@npm:^7.27.1": 123 | version: 7.27.1 124 | resolution: "@babel/helper-validator-identifier@npm:7.27.1" 125 | checksum: 10c0/c558f11c4871d526498e49d07a84752d1800bf72ac0d3dad100309a2eaba24efbf56ea59af5137ff15e3a00280ebe588560534b0e894a4750f8b1411d8f78b84 126 | languageName: node 127 | linkType: hard 128 | 129 | "@babel/helper-validator-option@npm:^7.27.1": 130 | version: 7.27.1 131 | resolution: "@babel/helper-validator-option@npm:7.27.1" 132 | checksum: 10c0/6fec5f006eba40001a20f26b1ef5dbbda377b7b68c8ad518c05baa9af3f396e780bdfded24c4eef95d14bb7b8fd56192a6ed38d5d439b97d10efc5f1a191d148 133 | languageName: node 134 | linkType: hard 135 | 136 | "@babel/helpers@npm:^7.27.4": 137 | version: 7.27.6 138 | resolution: "@babel/helpers@npm:7.27.6" 139 | dependencies: 140 | "@babel/template": "npm:^7.27.2" 141 | "@babel/types": "npm:^7.27.6" 142 | checksum: 10c0/448bac96ef8b0f21f2294a826df9de6bf4026fd023f8a6bb6c782fe3e61946801ca24381490b8e58d861fee75cd695a1882921afbf1f53b0275ee68c938bd6d3 143 | languageName: node 144 | linkType: hard 145 | 146 | "@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.27.4, @babel/parser@npm:^7.27.5": 147 | version: 7.27.5 148 | resolution: "@babel/parser@npm:7.27.5" 149 | dependencies: 150 | "@babel/types": "npm:^7.27.3" 151 | bin: 152 | parser: ./bin/babel-parser.js 153 | checksum: 10c0/f7faaebf21cc1f25d9ca8ac02c447ed38ef3460ea95be7ea760916dcf529476340d72a5a6010c6641d9ed9d12ad827c8424840277ec2295c5b082ba0f291220a 154 | languageName: node 155 | linkType: hard 156 | 157 | "@babel/plugin-transform-react-jsx-self@npm:^7.27.1": 158 | version: 7.27.1 159 | resolution: "@babel/plugin-transform-react-jsx-self@npm:7.27.1" 160 | dependencies: 161 | "@babel/helper-plugin-utils": "npm:^7.27.1" 162 | peerDependencies: 163 | "@babel/core": ^7.0.0-0 164 | checksum: 10c0/00a4f917b70a608f9aca2fb39aabe04a60aa33165a7e0105fd44b3a8531630eb85bf5572e9f242f51e6ad2fa38c2e7e780902176c863556c58b5ba6f6e164031 165 | languageName: node 166 | linkType: hard 167 | 168 | "@babel/plugin-transform-react-jsx-source@npm:^7.27.1": 169 | version: 7.27.1 170 | resolution: "@babel/plugin-transform-react-jsx-source@npm:7.27.1" 171 | dependencies: 172 | "@babel/helper-plugin-utils": "npm:^7.27.1" 173 | peerDependencies: 174 | "@babel/core": ^7.0.0-0 175 | checksum: 10c0/5e67b56c39c4d03e59e03ba80692b24c5a921472079b63af711b1d250fc37c1733a17069b63537f750f3e937ec44a42b1ee6a46cd23b1a0df5163b17f741f7f2 176 | languageName: node 177 | linkType: hard 178 | 179 | "@babel/template@npm:^7.27.2": 180 | version: 7.27.2 181 | resolution: "@babel/template@npm:7.27.2" 182 | dependencies: 183 | "@babel/code-frame": "npm:^7.27.1" 184 | "@babel/parser": "npm:^7.27.2" 185 | "@babel/types": "npm:^7.27.1" 186 | checksum: 10c0/ed9e9022651e463cc5f2cc21942f0e74544f1754d231add6348ff1b472985a3b3502041c0be62dc99ed2d12cfae0c51394bf827452b98a2f8769c03b87aadc81 187 | languageName: node 188 | linkType: hard 189 | 190 | "@babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.27.3, @babel/traverse@npm:^7.27.4": 191 | version: 7.27.4 192 | resolution: "@babel/traverse@npm:7.27.4" 193 | dependencies: 194 | "@babel/code-frame": "npm:^7.27.1" 195 | "@babel/generator": "npm:^7.27.3" 196 | "@babel/parser": "npm:^7.27.4" 197 | "@babel/template": "npm:^7.27.2" 198 | "@babel/types": "npm:^7.27.3" 199 | debug: "npm:^4.3.1" 200 | globals: "npm:^11.1.0" 201 | checksum: 10c0/6de8aa2a0637a6ee6d205bf48b9e923928a02415771fdec60085ed754dcdf605e450bb3315c2552fa51c31a4662275b45d5ae4ad527ce55a7db9acebdbbbb8ed 202 | languageName: node 203 | linkType: hard 204 | 205 | "@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.27.6, @babel/types@npm:^7.3.0": 206 | version: 7.27.6 207 | resolution: "@babel/types@npm:7.27.6" 208 | dependencies: 209 | "@babel/helper-string-parser": "npm:^7.27.1" 210 | "@babel/helper-validator-identifier": "npm:^7.27.1" 211 | checksum: 10c0/39d556be114f2a6d874ea25ad39826a9e3a0e98de0233ae6d932f6d09a4b222923a90a7274c635ed61f1ba49bbd345329226678800900ad1c8d11afabd573aaf 212 | languageName: node 213 | linkType: hard 214 | 215 | "@esbuild/aix-ppc64@npm:0.25.0": 216 | version: 0.25.0 217 | resolution: "@esbuild/aix-ppc64@npm:0.25.0" 218 | conditions: os=aix & cpu=ppc64 219 | languageName: node 220 | linkType: hard 221 | 222 | "@esbuild/android-arm64@npm:0.25.0": 223 | version: 0.25.0 224 | resolution: "@esbuild/android-arm64@npm:0.25.0" 225 | conditions: os=android & cpu=arm64 226 | languageName: node 227 | linkType: hard 228 | 229 | "@esbuild/android-arm@npm:0.25.0": 230 | version: 0.25.0 231 | resolution: "@esbuild/android-arm@npm:0.25.0" 232 | conditions: os=android & cpu=arm 233 | languageName: node 234 | linkType: hard 235 | 236 | "@esbuild/android-x64@npm:0.25.0": 237 | version: 0.25.0 238 | resolution: "@esbuild/android-x64@npm:0.25.0" 239 | conditions: os=android & cpu=x64 240 | languageName: node 241 | linkType: hard 242 | 243 | "@esbuild/darwin-arm64@npm:0.25.0": 244 | version: 0.25.0 245 | resolution: "@esbuild/darwin-arm64@npm:0.25.0" 246 | conditions: os=darwin & cpu=arm64 247 | languageName: node 248 | linkType: hard 249 | 250 | "@esbuild/darwin-x64@npm:0.25.0": 251 | version: 0.25.0 252 | resolution: "@esbuild/darwin-x64@npm:0.25.0" 253 | conditions: os=darwin & cpu=x64 254 | languageName: node 255 | linkType: hard 256 | 257 | "@esbuild/freebsd-arm64@npm:0.25.0": 258 | version: 0.25.0 259 | resolution: "@esbuild/freebsd-arm64@npm:0.25.0" 260 | conditions: os=freebsd & cpu=arm64 261 | languageName: node 262 | linkType: hard 263 | 264 | "@esbuild/freebsd-x64@npm:0.25.0": 265 | version: 0.25.0 266 | resolution: "@esbuild/freebsd-x64@npm:0.25.0" 267 | conditions: os=freebsd & cpu=x64 268 | languageName: node 269 | linkType: hard 270 | 271 | "@esbuild/linux-arm64@npm:0.25.0": 272 | version: 0.25.0 273 | resolution: "@esbuild/linux-arm64@npm:0.25.0" 274 | conditions: os=linux & cpu=arm64 275 | languageName: node 276 | linkType: hard 277 | 278 | "@esbuild/linux-arm@npm:0.25.0": 279 | version: 0.25.0 280 | resolution: "@esbuild/linux-arm@npm:0.25.0" 281 | conditions: os=linux & cpu=arm 282 | languageName: node 283 | linkType: hard 284 | 285 | "@esbuild/linux-ia32@npm:0.25.0": 286 | version: 0.25.0 287 | resolution: "@esbuild/linux-ia32@npm:0.25.0" 288 | conditions: os=linux & cpu=ia32 289 | languageName: node 290 | linkType: hard 291 | 292 | "@esbuild/linux-loong64@npm:0.25.0": 293 | version: 0.25.0 294 | resolution: "@esbuild/linux-loong64@npm:0.25.0" 295 | conditions: os=linux & cpu=loong64 296 | languageName: node 297 | linkType: hard 298 | 299 | "@esbuild/linux-mips64el@npm:0.25.0": 300 | version: 0.25.0 301 | resolution: "@esbuild/linux-mips64el@npm:0.25.0" 302 | conditions: os=linux & cpu=mips64el 303 | languageName: node 304 | linkType: hard 305 | 306 | "@esbuild/linux-ppc64@npm:0.25.0": 307 | version: 0.25.0 308 | resolution: "@esbuild/linux-ppc64@npm:0.25.0" 309 | conditions: os=linux & cpu=ppc64 310 | languageName: node 311 | linkType: hard 312 | 313 | "@esbuild/linux-riscv64@npm:0.25.0": 314 | version: 0.25.0 315 | resolution: "@esbuild/linux-riscv64@npm:0.25.0" 316 | conditions: os=linux & cpu=riscv64 317 | languageName: node 318 | linkType: hard 319 | 320 | "@esbuild/linux-s390x@npm:0.25.0": 321 | version: 0.25.0 322 | resolution: "@esbuild/linux-s390x@npm:0.25.0" 323 | conditions: os=linux & cpu=s390x 324 | languageName: node 325 | linkType: hard 326 | 327 | "@esbuild/linux-x64@npm:0.25.0": 328 | version: 0.25.0 329 | resolution: "@esbuild/linux-x64@npm:0.25.0" 330 | conditions: os=linux & cpu=x64 331 | languageName: node 332 | linkType: hard 333 | 334 | "@esbuild/netbsd-arm64@npm:0.25.0": 335 | version: 0.25.0 336 | resolution: "@esbuild/netbsd-arm64@npm:0.25.0" 337 | conditions: os=netbsd & cpu=arm64 338 | languageName: node 339 | linkType: hard 340 | 341 | "@esbuild/netbsd-x64@npm:0.25.0": 342 | version: 0.25.0 343 | resolution: "@esbuild/netbsd-x64@npm:0.25.0" 344 | conditions: os=netbsd & cpu=x64 345 | languageName: node 346 | linkType: hard 347 | 348 | "@esbuild/openbsd-arm64@npm:0.25.0": 349 | version: 0.25.0 350 | resolution: "@esbuild/openbsd-arm64@npm:0.25.0" 351 | conditions: os=openbsd & cpu=arm64 352 | languageName: node 353 | linkType: hard 354 | 355 | "@esbuild/openbsd-x64@npm:0.25.0": 356 | version: 0.25.0 357 | resolution: "@esbuild/openbsd-x64@npm:0.25.0" 358 | conditions: os=openbsd & cpu=x64 359 | languageName: node 360 | linkType: hard 361 | 362 | "@esbuild/sunos-x64@npm:0.25.0": 363 | version: 0.25.0 364 | resolution: "@esbuild/sunos-x64@npm:0.25.0" 365 | conditions: os=sunos & cpu=x64 366 | languageName: node 367 | linkType: hard 368 | 369 | "@esbuild/win32-arm64@npm:0.25.0": 370 | version: 0.25.0 371 | resolution: "@esbuild/win32-arm64@npm:0.25.0" 372 | conditions: os=win32 & cpu=arm64 373 | languageName: node 374 | linkType: hard 375 | 376 | "@esbuild/win32-ia32@npm:0.25.0": 377 | version: 0.25.0 378 | resolution: "@esbuild/win32-ia32@npm:0.25.0" 379 | conditions: os=win32 & cpu=ia32 380 | languageName: node 381 | linkType: hard 382 | 383 | "@esbuild/win32-x64@npm:0.25.0": 384 | version: 0.25.0 385 | resolution: "@esbuild/win32-x64@npm:0.25.0" 386 | conditions: os=win32 & cpu=x64 387 | languageName: node 388 | linkType: hard 389 | 390 | "@isaacs/cliui@npm:^8.0.2": 391 | version: 8.0.2 392 | resolution: "@isaacs/cliui@npm:8.0.2" 393 | dependencies: 394 | string-width: "npm:^5.1.2" 395 | string-width-cjs: "npm:string-width@^4.2.0" 396 | strip-ansi: "npm:^7.0.1" 397 | strip-ansi-cjs: "npm:strip-ansi@^6.0.1" 398 | wrap-ansi: "npm:^8.1.0" 399 | wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" 400 | checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e 401 | languageName: node 402 | linkType: hard 403 | 404 | "@isaacs/fs-minipass@npm:^4.0.0": 405 | version: 4.0.1 406 | resolution: "@isaacs/fs-minipass@npm:4.0.1" 407 | dependencies: 408 | minipass: "npm:^7.0.4" 409 | checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 410 | languageName: node 411 | linkType: hard 412 | 413 | "@jridgewell/gen-mapping@npm:^0.3.5": 414 | version: 0.3.8 415 | resolution: "@jridgewell/gen-mapping@npm:0.3.8" 416 | dependencies: 417 | "@jridgewell/set-array": "npm:^1.2.1" 418 | "@jridgewell/sourcemap-codec": "npm:^1.4.10" 419 | "@jridgewell/trace-mapping": "npm:^0.3.24" 420 | checksum: 10c0/c668feaf86c501d7c804904a61c23c67447b2137b813b9ce03eca82cb9d65ac7006d766c218685d76e3d72828279b6ee26c347aa1119dab23fbaf36aed51585a 421 | languageName: node 422 | linkType: hard 423 | 424 | "@jridgewell/resolve-uri@npm:^3.1.0": 425 | version: 3.1.2 426 | resolution: "@jridgewell/resolve-uri@npm:3.1.2" 427 | checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e 428 | languageName: node 429 | linkType: hard 430 | 431 | "@jridgewell/set-array@npm:^1.2.1": 432 | version: 1.2.1 433 | resolution: "@jridgewell/set-array@npm:1.2.1" 434 | checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 435 | languageName: node 436 | linkType: hard 437 | 438 | "@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": 439 | version: 1.5.0 440 | resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" 441 | checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 442 | languageName: node 443 | linkType: hard 444 | 445 | "@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": 446 | version: 0.3.25 447 | resolution: "@jridgewell/trace-mapping@npm:0.3.25" 448 | dependencies: 449 | "@jridgewell/resolve-uri": "npm:^3.1.0" 450 | "@jridgewell/sourcemap-codec": "npm:^1.4.14" 451 | checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 452 | languageName: node 453 | linkType: hard 454 | 455 | "@npmcli/agent@npm:^3.0.0": 456 | version: 3.0.0 457 | resolution: "@npmcli/agent@npm:3.0.0" 458 | dependencies: 459 | agent-base: "npm:^7.1.0" 460 | http-proxy-agent: "npm:^7.0.0" 461 | https-proxy-agent: "npm:^7.0.1" 462 | lru-cache: "npm:^10.0.1" 463 | socks-proxy-agent: "npm:^8.0.3" 464 | checksum: 10c0/efe37b982f30740ee77696a80c196912c274ecd2cb243bc6ae7053a50c733ce0f6c09fda085145f33ecf453be19654acca74b69e81eaad4c90f00ccffe2f9271 465 | languageName: node 466 | linkType: hard 467 | 468 | "@npmcli/fs@npm:^4.0.0": 469 | version: 4.0.0 470 | resolution: "@npmcli/fs@npm:4.0.0" 471 | dependencies: 472 | semver: "npm:^7.3.5" 473 | checksum: 10c0/c90935d5ce670c87b6b14fab04a965a3b8137e585f8b2a6257263bd7f97756dd736cb165bb470e5156a9e718ecd99413dccc54b1138c1a46d6ec7cf325982fe5 474 | languageName: node 475 | linkType: hard 476 | 477 | "@pkgjs/parseargs@npm:^0.11.0": 478 | version: 0.11.0 479 | resolution: "@pkgjs/parseargs@npm:0.11.0" 480 | checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd 481 | languageName: node 482 | linkType: hard 483 | 484 | "@rolldown/pluginutils@npm:1.0.0-beta.19": 485 | version: 1.0.0-beta.19 486 | resolution: "@rolldown/pluginutils@npm:1.0.0-beta.19" 487 | checksum: 10c0/e4205df56e6231a347ac601d044af365639741d51b5bea4e91ecc37e19e9777cb79d1daa924b8709ddf1f743ed6922e4e68e2445126434c4d420d9f4416f4feb 488 | languageName: node 489 | linkType: hard 490 | 491 | "@rollup/rollup-android-arm-eabi@npm:4.50.1": 492 | version: 4.50.1 493 | resolution: "@rollup/rollup-android-arm-eabi@npm:4.50.1" 494 | conditions: os=android & cpu=arm 495 | languageName: node 496 | linkType: hard 497 | 498 | "@rollup/rollup-android-arm64@npm:4.50.1": 499 | version: 4.50.1 500 | resolution: "@rollup/rollup-android-arm64@npm:4.50.1" 501 | conditions: os=android & cpu=arm64 502 | languageName: node 503 | linkType: hard 504 | 505 | "@rollup/rollup-darwin-arm64@npm:4.50.1": 506 | version: 4.50.1 507 | resolution: "@rollup/rollup-darwin-arm64@npm:4.50.1" 508 | conditions: os=darwin & cpu=arm64 509 | languageName: node 510 | linkType: hard 511 | 512 | "@rollup/rollup-darwin-x64@npm:4.50.1": 513 | version: 4.50.1 514 | resolution: "@rollup/rollup-darwin-x64@npm:4.50.1" 515 | conditions: os=darwin & cpu=x64 516 | languageName: node 517 | linkType: hard 518 | 519 | "@rollup/rollup-freebsd-arm64@npm:4.50.1": 520 | version: 4.50.1 521 | resolution: "@rollup/rollup-freebsd-arm64@npm:4.50.1" 522 | conditions: os=freebsd & cpu=arm64 523 | languageName: node 524 | linkType: hard 525 | 526 | "@rollup/rollup-freebsd-x64@npm:4.50.1": 527 | version: 4.50.1 528 | resolution: "@rollup/rollup-freebsd-x64@npm:4.50.1" 529 | conditions: os=freebsd & cpu=x64 530 | languageName: node 531 | linkType: hard 532 | 533 | "@rollup/rollup-linux-arm-gnueabihf@npm:4.50.1": 534 | version: 4.50.1 535 | resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.50.1" 536 | conditions: os=linux & cpu=arm & libc=glibc 537 | languageName: node 538 | linkType: hard 539 | 540 | "@rollup/rollup-linux-arm-musleabihf@npm:4.50.1": 541 | version: 4.50.1 542 | resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.50.1" 543 | conditions: os=linux & cpu=arm & libc=musl 544 | languageName: node 545 | linkType: hard 546 | 547 | "@rollup/rollup-linux-arm64-gnu@npm:4.50.1": 548 | version: 4.50.1 549 | resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.50.1" 550 | conditions: os=linux & cpu=arm64 & libc=glibc 551 | languageName: node 552 | linkType: hard 553 | 554 | "@rollup/rollup-linux-arm64-musl@npm:4.50.1": 555 | version: 4.50.1 556 | resolution: "@rollup/rollup-linux-arm64-musl@npm:4.50.1" 557 | conditions: os=linux & cpu=arm64 & libc=musl 558 | languageName: node 559 | linkType: hard 560 | 561 | "@rollup/rollup-linux-loongarch64-gnu@npm:4.50.1": 562 | version: 4.50.1 563 | resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.50.1" 564 | conditions: os=linux & cpu=loong64 & libc=glibc 565 | languageName: node 566 | linkType: hard 567 | 568 | "@rollup/rollup-linux-ppc64-gnu@npm:4.50.1": 569 | version: 4.50.1 570 | resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.50.1" 571 | conditions: os=linux & cpu=ppc64 & libc=glibc 572 | languageName: node 573 | linkType: hard 574 | 575 | "@rollup/rollup-linux-riscv64-gnu@npm:4.50.1": 576 | version: 4.50.1 577 | resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.50.1" 578 | conditions: os=linux & cpu=riscv64 & libc=glibc 579 | languageName: node 580 | linkType: hard 581 | 582 | "@rollup/rollup-linux-riscv64-musl@npm:4.50.1": 583 | version: 4.50.1 584 | resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.50.1" 585 | conditions: os=linux & cpu=riscv64 & libc=musl 586 | languageName: node 587 | linkType: hard 588 | 589 | "@rollup/rollup-linux-s390x-gnu@npm:4.50.1": 590 | version: 4.50.1 591 | resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.50.1" 592 | conditions: os=linux & cpu=s390x & libc=glibc 593 | languageName: node 594 | linkType: hard 595 | 596 | "@rollup/rollup-linux-x64-gnu@npm:4.50.1": 597 | version: 4.50.1 598 | resolution: "@rollup/rollup-linux-x64-gnu@npm:4.50.1" 599 | conditions: os=linux & cpu=x64 & libc=glibc 600 | languageName: node 601 | linkType: hard 602 | 603 | "@rollup/rollup-linux-x64-musl@npm:4.50.1": 604 | version: 4.50.1 605 | resolution: "@rollup/rollup-linux-x64-musl@npm:4.50.1" 606 | conditions: os=linux & cpu=x64 & libc=musl 607 | languageName: node 608 | linkType: hard 609 | 610 | "@rollup/rollup-openharmony-arm64@npm:4.50.1": 611 | version: 4.50.1 612 | resolution: "@rollup/rollup-openharmony-arm64@npm:4.50.1" 613 | conditions: os=openharmony & cpu=arm64 614 | languageName: node 615 | linkType: hard 616 | 617 | "@rollup/rollup-win32-arm64-msvc@npm:4.50.1": 618 | version: 4.50.1 619 | resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.50.1" 620 | conditions: os=win32 & cpu=arm64 621 | languageName: node 622 | linkType: hard 623 | 624 | "@rollup/rollup-win32-ia32-msvc@npm:4.50.1": 625 | version: 4.50.1 626 | resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.50.1" 627 | conditions: os=win32 & cpu=ia32 628 | languageName: node 629 | linkType: hard 630 | 631 | "@rollup/rollup-win32-x64-msvc@npm:4.50.1": 632 | version: 4.50.1 633 | resolution: "@rollup/rollup-win32-x64-msvc@npm:4.50.1" 634 | conditions: os=win32 & cpu=x64 635 | languageName: node 636 | linkType: hard 637 | 638 | "@types/babel__core@npm:^7.20.5": 639 | version: 7.20.5 640 | resolution: "@types/babel__core@npm:7.20.5" 641 | dependencies: 642 | "@babel/parser": "npm:^7.20.7" 643 | "@babel/types": "npm:^7.20.7" 644 | "@types/babel__generator": "npm:*" 645 | "@types/babel__template": "npm:*" 646 | "@types/babel__traverse": "npm:*" 647 | checksum: 10c0/bdee3bb69951e833a4b811b8ee9356b69a61ed5b7a23e1a081ec9249769117fa83aaaf023bb06562a038eb5845155ff663e2d5c75dd95c1d5ccc91db012868ff 648 | languageName: node 649 | linkType: hard 650 | 651 | "@types/babel__generator@npm:*": 652 | version: 7.6.4 653 | resolution: "@types/babel__generator@npm:7.6.4" 654 | dependencies: 655 | "@babel/types": "npm:^7.0.0" 656 | checksum: 10c0/e0051b450e4ba2df0a7e386f08df902a4e920f6f8d6f185d69ddbe9b0e2e2d3ae434bb51e437bc0fca2a9a0f5dc4ca44d3a1941ef75e74371e8be5bf64416fe4 657 | languageName: node 658 | linkType: hard 659 | 660 | "@types/babel__template@npm:*": 661 | version: 7.4.1 662 | resolution: "@types/babel__template@npm:7.4.1" 663 | dependencies: 664 | "@babel/parser": "npm:^7.1.0" 665 | "@babel/types": "npm:^7.0.0" 666 | checksum: 10c0/6f180e96c39765487f27e861d43eebed341ec7a2fc06cdf5a52c22872fae67f474ca165d149c708f4fd9d5482beb66c0a92f77411b234bb30262ed2303e50b1a 667 | languageName: node 668 | linkType: hard 669 | 670 | "@types/babel__traverse@npm:*": 671 | version: 7.18.3 672 | resolution: "@types/babel__traverse@npm:7.18.3" 673 | dependencies: 674 | "@babel/types": "npm:^7.3.0" 675 | checksum: 10c0/4214fd3e95925d9a7efa01142969a310263430d4f5de89be6c9c193110666677415161b474fa627d751dfd0f1eb7dc1c84c48f8b53098625c6bc78917683215a 676 | languageName: node 677 | linkType: hard 678 | 679 | "@types/estree@npm:1.0.8": 680 | version: 1.0.8 681 | resolution: "@types/estree@npm:1.0.8" 682 | checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 683 | languageName: node 684 | linkType: hard 685 | 686 | "@types/lodash.memoize@npm:^4.1.7": 687 | version: 4.1.7 688 | resolution: "@types/lodash.memoize@npm:4.1.7" 689 | dependencies: 690 | "@types/lodash": "npm:*" 691 | checksum: 10c0/979a59dbbae968a03834fdb544dc5ddd34620a2912d5030c997a1aa919326425a900c93bc69554b2a873cf54f09b4dd2752b3a1c29ab4bffac5983113c58b1b5 692 | languageName: node 693 | linkType: hard 694 | 695 | "@types/lodash@npm:*": 696 | version: 4.14.192 697 | resolution: "@types/lodash@npm:4.14.192" 698 | checksum: 10c0/6807402e293cb943808a444d1ef514ce13de4f870b3b382fe729f8235ea280c4d037b9514443723afd3d04b2cf9e8f1b3fc0075d947edfeb1078347dc2b471b0 699 | languageName: node 700 | linkType: hard 701 | 702 | "@vitejs/plugin-react@npm:^4.6.0": 703 | version: 4.6.0 704 | resolution: "@vitejs/plugin-react@npm:4.6.0" 705 | dependencies: 706 | "@babel/core": "npm:^7.27.4" 707 | "@babel/plugin-transform-react-jsx-self": "npm:^7.27.1" 708 | "@babel/plugin-transform-react-jsx-source": "npm:^7.27.1" 709 | "@rolldown/pluginutils": "npm:1.0.0-beta.19" 710 | "@types/babel__core": "npm:^7.20.5" 711 | react-refresh: "npm:^0.17.0" 712 | peerDependencies: 713 | vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 714 | checksum: 10c0/73b8f271978a0337debb255afd1667f49c2018c118962a8613120383375c4038255a5315cee2ef210dc7fd07cd30d5b12271077ad47db29980f8156b8a49be2c 715 | languageName: node 716 | linkType: hard 717 | 718 | "@wojtekmaj/date-utils@npm:^1.1.3": 719 | version: 1.1.3 720 | resolution: "@wojtekmaj/date-utils@npm:1.1.3" 721 | checksum: 10c0/c7af27dc4e5836382c44cd0a4be3b5594705e33976b99269d46b87208154f7d55b4ebb3a56bac7f1ff70136d943bd69ed454a96c672a40ff1ea98db4b6b79e1f 722 | languageName: node 723 | linkType: hard 724 | 725 | "@wojtekmaj/react-daterange-picker@npm:latest": 726 | version: 6.0.0 727 | resolution: "@wojtekmaj/react-daterange-picker@npm:6.0.0" 728 | dependencies: 729 | clsx: "npm:^2.0.0" 730 | make-event-props: "npm:^1.6.0" 731 | react-calendar: "npm:^5.0.0" 732 | react-date-picker: "npm:^11.0.0" 733 | react-fit: "npm:^2.0.0" 734 | peerDependencies: 735 | "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 736 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 737 | react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 738 | peerDependenciesMeta: 739 | "@types/react": 740 | optional: true 741 | checksum: 10c0/77da28b5e5f3b4c0c32530a12510e351e770d6c27b649e6c4f9ffac164f511fa882b0bac5e252adb3a48b5cdc9a20d1b1391537d38476c2dc329020a190f8296 742 | languageName: node 743 | linkType: hard 744 | 745 | "abbrev@npm:^3.0.0": 746 | version: 3.0.0 747 | resolution: "abbrev@npm:3.0.0" 748 | checksum: 10c0/049704186396f571650eb7b22ed3627b77a5aedf98bb83caf2eac81ca2a3e25e795394b0464cfb2d6076df3db6a5312139eac5b6a126ca296ac53c5008069c28 749 | languageName: node 750 | linkType: hard 751 | 752 | "agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": 753 | version: 7.1.3 754 | resolution: "agent-base@npm:7.1.3" 755 | checksum: 10c0/6192b580c5b1d8fb399b9c62bf8343d76654c2dd62afcb9a52b2cf44a8b6ace1e3b704d3fe3547d91555c857d3df02603341ff2cb961b9cfe2b12f9f3c38ee11 756 | languageName: node 757 | linkType: hard 758 | 759 | "ansi-regex@npm:^5.0.1": 760 | version: 5.0.1 761 | resolution: "ansi-regex@npm:5.0.1" 762 | checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 763 | languageName: node 764 | linkType: hard 765 | 766 | "ansi-regex@npm:^6.0.1": 767 | version: 6.0.1 768 | resolution: "ansi-regex@npm:6.0.1" 769 | checksum: 10c0/cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08 770 | languageName: node 771 | linkType: hard 772 | 773 | "ansi-styles@npm:^4.0.0": 774 | version: 4.3.0 775 | resolution: "ansi-styles@npm:4.3.0" 776 | dependencies: 777 | color-convert: "npm:^2.0.1" 778 | checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 779 | languageName: node 780 | linkType: hard 781 | 782 | "ansi-styles@npm:^6.1.0": 783 | version: 6.2.1 784 | resolution: "ansi-styles@npm:6.2.1" 785 | checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c 786 | languageName: node 787 | linkType: hard 788 | 789 | "balanced-match@npm:^1.0.0": 790 | version: 1.0.2 791 | resolution: "balanced-match@npm:1.0.2" 792 | checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee 793 | languageName: node 794 | linkType: hard 795 | 796 | "brace-expansion@npm:^2.0.1": 797 | version: 2.0.2 798 | resolution: "brace-expansion@npm:2.0.2" 799 | dependencies: 800 | balanced-match: "npm:^1.0.0" 801 | checksum: 10c0/6d117a4c793488af86b83172deb6af143e94c17bc53b0b3cec259733923b4ca84679d506ac261f4ba3c7ed37c46018e2ff442f9ce453af8643ecd64f4a54e6cf 802 | languageName: node 803 | linkType: hard 804 | 805 | "browserslist@npm:^4.24.0": 806 | version: 4.24.3 807 | resolution: "browserslist@npm:4.24.3" 808 | dependencies: 809 | caniuse-lite: "npm:^1.0.30001688" 810 | electron-to-chromium: "npm:^1.5.73" 811 | node-releases: "npm:^2.0.19" 812 | update-browserslist-db: "npm:^1.1.1" 813 | bin: 814 | browserslist: cli.js 815 | checksum: 10c0/bab261ef7b6e1656a719a9fa31240ae7ce4d5ba68e479f6b11e348d819346ab4c0ff6f4821f43adcc9c193a734b186775a83b37979e70a69d182965909fe569a 816 | languageName: node 817 | linkType: hard 818 | 819 | "cacache@npm:^19.0.1": 820 | version: 19.0.1 821 | resolution: "cacache@npm:19.0.1" 822 | dependencies: 823 | "@npmcli/fs": "npm:^4.0.0" 824 | fs-minipass: "npm:^3.0.0" 825 | glob: "npm:^10.2.2" 826 | lru-cache: "npm:^10.0.1" 827 | minipass: "npm:^7.0.3" 828 | minipass-collect: "npm:^2.0.1" 829 | minipass-flush: "npm:^1.0.5" 830 | minipass-pipeline: "npm:^1.2.4" 831 | p-map: "npm:^7.0.2" 832 | ssri: "npm:^12.0.0" 833 | tar: "npm:^7.4.3" 834 | unique-filename: "npm:^4.0.0" 835 | checksum: 10c0/01f2134e1bd7d3ab68be851df96c8d63b492b1853b67f2eecb2c37bb682d37cb70bb858a16f2f0554d3c0071be6dfe21456a1ff6fa4b7eed996570d6a25ffe9c 836 | languageName: node 837 | linkType: hard 838 | 839 | "caniuse-lite@npm:^1.0.30001688": 840 | version: 1.0.30001690 841 | resolution: "caniuse-lite@npm:1.0.30001690" 842 | checksum: 10c0/646bd469032afa90400a84dec30a2b00a6eda62c03ead358117e3f884cda8aacec02ec058a6dbee5eaf9714f83e483b9b0eb4fb42febb8076569f5ca40f1d347 843 | languageName: node 844 | linkType: hard 845 | 846 | "chownr@npm:^3.0.0": 847 | version: 3.0.0 848 | resolution: "chownr@npm:3.0.0" 849 | checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 850 | languageName: node 851 | linkType: hard 852 | 853 | "clsx@npm:^2.0.0": 854 | version: 2.1.1 855 | resolution: "clsx@npm:2.1.1" 856 | checksum: 10c0/c4c8eb865f8c82baab07e71bfa8897c73454881c4f99d6bc81585aecd7c441746c1399d08363dc096c550cceaf97bd4ce1e8854e1771e9998d9f94c4fe075839 857 | languageName: node 858 | linkType: hard 859 | 860 | "color-convert@npm:^2.0.1": 861 | version: 2.0.1 862 | resolution: "color-convert@npm:2.0.1" 863 | dependencies: 864 | color-name: "npm:~1.1.4" 865 | checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 866 | languageName: node 867 | linkType: hard 868 | 869 | "color-name@npm:~1.1.4": 870 | version: 1.1.4 871 | resolution: "color-name@npm:1.1.4" 872 | checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 873 | languageName: node 874 | linkType: hard 875 | 876 | "convert-source-map@npm:^2.0.0": 877 | version: 2.0.0 878 | resolution: "convert-source-map@npm:2.0.0" 879 | checksum: 10c0/8f2f7a27a1a011cc6cc88cc4da2d7d0cfa5ee0369508baae3d98c260bb3ac520691464e5bbe4ae7cdf09860c1d69ecc6f70c63c6e7c7f7e3f18ec08484dc7d9b 880 | languageName: node 881 | linkType: hard 882 | 883 | "cross-spawn@npm:^7.0.0": 884 | version: 7.0.6 885 | resolution: "cross-spawn@npm:7.0.6" 886 | dependencies: 887 | path-key: "npm:^3.1.0" 888 | shebang-command: "npm:^2.0.0" 889 | which: "npm:^2.0.1" 890 | checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 891 | languageName: node 892 | linkType: hard 893 | 894 | "debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.3.1, debug@npm:^4.3.4": 895 | version: 4.4.0 896 | resolution: "debug@npm:4.4.0" 897 | dependencies: 898 | ms: "npm:^2.1.3" 899 | peerDependenciesMeta: 900 | supports-color: 901 | optional: true 902 | checksum: 10c0/db94f1a182bf886f57b4755f85b3a74c39b5114b9377b7ab375dc2cfa3454f09490cc6c30f829df3fc8042bc8b8995f6567ce5cd96f3bc3688bd24027197d9de 903 | languageName: node 904 | linkType: hard 905 | 906 | "detect-element-overflow@npm:^1.4.0": 907 | version: 1.4.2 908 | resolution: "detect-element-overflow@npm:1.4.2" 909 | checksum: 10c0/dcc5f6d89c31f6035202cce64b96093338e777752b62c401c672e84908097ef01f833af5864e1c86c6440e4f843658f006d1084fb9090983ea5c438c8ad4a180 910 | languageName: node 911 | linkType: hard 912 | 913 | "eastasianwidth@npm:^0.2.0": 914 | version: 0.2.0 915 | resolution: "eastasianwidth@npm:0.2.0" 916 | checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 917 | languageName: node 918 | linkType: hard 919 | 920 | "electron-to-chromium@npm:^1.5.73": 921 | version: 1.5.75 922 | resolution: "electron-to-chromium@npm:1.5.75" 923 | checksum: 10c0/df769b7a5e9895a8ba8eb7f31b9525a0e00b8aef6e3ecab3faebe90756fc9ac008dddb8d9a2a78d2079cbaebd27da6e1379f77e910163f405bb1a3d622ec4276 924 | languageName: node 925 | linkType: hard 926 | 927 | "emoji-regex@npm:^8.0.0": 928 | version: 8.0.0 929 | resolution: "emoji-regex@npm:8.0.0" 930 | checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 931 | languageName: node 932 | linkType: hard 933 | 934 | "emoji-regex@npm:^9.2.2": 935 | version: 9.2.2 936 | resolution: "emoji-regex@npm:9.2.2" 937 | checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 938 | languageName: node 939 | linkType: hard 940 | 941 | "encoding@npm:^0.1.13": 942 | version: 0.1.13 943 | resolution: "encoding@npm:0.1.13" 944 | dependencies: 945 | iconv-lite: "npm:^0.6.2" 946 | checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 947 | languageName: node 948 | linkType: hard 949 | 950 | "env-paths@npm:^2.2.0": 951 | version: 2.2.1 952 | resolution: "env-paths@npm:2.2.1" 953 | checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 954 | languageName: node 955 | linkType: hard 956 | 957 | "err-code@npm:^2.0.2": 958 | version: 2.0.3 959 | resolution: "err-code@npm:2.0.3" 960 | checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 961 | languageName: node 962 | linkType: hard 963 | 964 | "esbuild@npm:^0.25.0": 965 | version: 0.25.0 966 | resolution: "esbuild@npm:0.25.0" 967 | dependencies: 968 | "@esbuild/aix-ppc64": "npm:0.25.0" 969 | "@esbuild/android-arm": "npm:0.25.0" 970 | "@esbuild/android-arm64": "npm:0.25.0" 971 | "@esbuild/android-x64": "npm:0.25.0" 972 | "@esbuild/darwin-arm64": "npm:0.25.0" 973 | "@esbuild/darwin-x64": "npm:0.25.0" 974 | "@esbuild/freebsd-arm64": "npm:0.25.0" 975 | "@esbuild/freebsd-x64": "npm:0.25.0" 976 | "@esbuild/linux-arm": "npm:0.25.0" 977 | "@esbuild/linux-arm64": "npm:0.25.0" 978 | "@esbuild/linux-ia32": "npm:0.25.0" 979 | "@esbuild/linux-loong64": "npm:0.25.0" 980 | "@esbuild/linux-mips64el": "npm:0.25.0" 981 | "@esbuild/linux-ppc64": "npm:0.25.0" 982 | "@esbuild/linux-riscv64": "npm:0.25.0" 983 | "@esbuild/linux-s390x": "npm:0.25.0" 984 | "@esbuild/linux-x64": "npm:0.25.0" 985 | "@esbuild/netbsd-arm64": "npm:0.25.0" 986 | "@esbuild/netbsd-x64": "npm:0.25.0" 987 | "@esbuild/openbsd-arm64": "npm:0.25.0" 988 | "@esbuild/openbsd-x64": "npm:0.25.0" 989 | "@esbuild/sunos-x64": "npm:0.25.0" 990 | "@esbuild/win32-arm64": "npm:0.25.0" 991 | "@esbuild/win32-ia32": "npm:0.25.0" 992 | "@esbuild/win32-x64": "npm:0.25.0" 993 | dependenciesMeta: 994 | "@esbuild/aix-ppc64": 995 | optional: true 996 | "@esbuild/android-arm": 997 | optional: true 998 | "@esbuild/android-arm64": 999 | optional: true 1000 | "@esbuild/android-x64": 1001 | optional: true 1002 | "@esbuild/darwin-arm64": 1003 | optional: true 1004 | "@esbuild/darwin-x64": 1005 | optional: true 1006 | "@esbuild/freebsd-arm64": 1007 | optional: true 1008 | "@esbuild/freebsd-x64": 1009 | optional: true 1010 | "@esbuild/linux-arm": 1011 | optional: true 1012 | "@esbuild/linux-arm64": 1013 | optional: true 1014 | "@esbuild/linux-ia32": 1015 | optional: true 1016 | "@esbuild/linux-loong64": 1017 | optional: true 1018 | "@esbuild/linux-mips64el": 1019 | optional: true 1020 | "@esbuild/linux-ppc64": 1021 | optional: true 1022 | "@esbuild/linux-riscv64": 1023 | optional: true 1024 | "@esbuild/linux-s390x": 1025 | optional: true 1026 | "@esbuild/linux-x64": 1027 | optional: true 1028 | "@esbuild/netbsd-arm64": 1029 | optional: true 1030 | "@esbuild/netbsd-x64": 1031 | optional: true 1032 | "@esbuild/openbsd-arm64": 1033 | optional: true 1034 | "@esbuild/openbsd-x64": 1035 | optional: true 1036 | "@esbuild/sunos-x64": 1037 | optional: true 1038 | "@esbuild/win32-arm64": 1039 | optional: true 1040 | "@esbuild/win32-ia32": 1041 | optional: true 1042 | "@esbuild/win32-x64": 1043 | optional: true 1044 | bin: 1045 | esbuild: bin/esbuild 1046 | checksum: 10c0/5767b72da46da3cfec51661647ec850ddbf8a8d0662771139f10ef0692a8831396a0004b2be7966cecdb08264fb16bdc16290dcecd92396fac5f12d722fa013d 1047 | languageName: node 1048 | linkType: hard 1049 | 1050 | "escalade@npm:^3.2.0": 1051 | version: 3.2.0 1052 | resolution: "escalade@npm:3.2.0" 1053 | checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 1054 | languageName: node 1055 | linkType: hard 1056 | 1057 | "exponential-backoff@npm:^3.1.1": 1058 | version: 3.1.1 1059 | resolution: "exponential-backoff@npm:3.1.1" 1060 | checksum: 10c0/160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 1061 | languageName: node 1062 | linkType: hard 1063 | 1064 | "fdir@npm:^6.5.0": 1065 | version: 6.5.0 1066 | resolution: "fdir@npm:6.5.0" 1067 | peerDependencies: 1068 | picomatch: ^3 || ^4 1069 | peerDependenciesMeta: 1070 | picomatch: 1071 | optional: true 1072 | checksum: 10c0/e345083c4306b3aed6cb8ec551e26c36bab5c511e99ea4576a16750ddc8d3240e63826cc624f5ae17ad4dc82e68a253213b60d556c11bfad064b7607847ed07f 1073 | languageName: node 1074 | linkType: hard 1075 | 1076 | "foreground-child@npm:^3.1.0": 1077 | version: 3.1.1 1078 | resolution: "foreground-child@npm:3.1.1" 1079 | dependencies: 1080 | cross-spawn: "npm:^7.0.0" 1081 | signal-exit: "npm:^4.0.1" 1082 | checksum: 10c0/9700a0285628abaeb37007c9a4d92bd49f67210f09067638774338e146c8e9c825c5c877f072b2f75f41dc6a2d0be8664f79ffc03f6576649f54a84fb9b47de0 1083 | languageName: node 1084 | linkType: hard 1085 | 1086 | "fs-minipass@npm:^3.0.0": 1087 | version: 3.0.3 1088 | resolution: "fs-minipass@npm:3.0.3" 1089 | dependencies: 1090 | minipass: "npm:^7.0.3" 1091 | checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 1092 | languageName: node 1093 | linkType: hard 1094 | 1095 | "fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": 1096 | version: 2.3.3 1097 | resolution: "fsevents@npm:2.3.3" 1098 | dependencies: 1099 | node-gyp: "npm:latest" 1100 | checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 1101 | conditions: os=darwin 1102 | languageName: node 1103 | linkType: hard 1104 | 1105 | "fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": 1106 | version: 2.3.3 1107 | resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" 1108 | dependencies: 1109 | node-gyp: "npm:latest" 1110 | conditions: os=darwin 1111 | languageName: node 1112 | linkType: hard 1113 | 1114 | "gensync@npm:^1.0.0-beta.2": 1115 | version: 1.0.0-beta.2 1116 | resolution: "gensync@npm:1.0.0-beta.2" 1117 | checksum: 10c0/782aba6cba65b1bb5af3b095d96249d20edbe8df32dbf4696fd49be2583faf676173bf4809386588828e4dd76a3354fcbeb577bab1c833ccd9fc4577f26103f8 1118 | languageName: node 1119 | linkType: hard 1120 | 1121 | "get-user-locale@npm:^2.2.1": 1122 | version: 2.2.1 1123 | resolution: "get-user-locale@npm:2.2.1" 1124 | dependencies: 1125 | "@types/lodash.memoize": "npm:^4.1.7" 1126 | lodash.memoize: "npm:^4.1.1" 1127 | checksum: 10c0/c820c890aed5fa661435f0364cde6ec90ed9f497a5451528123571f1a77db45a6e2b92462808648499573cb3f2924f90f629ce4f82a60dc1d55047932a3abe71 1128 | languageName: node 1129 | linkType: hard 1130 | 1131 | "glob@npm:^10.2.2, glob@npm:^10.3.10": 1132 | version: 10.5.0 1133 | resolution: "glob@npm:10.5.0" 1134 | dependencies: 1135 | foreground-child: "npm:^3.1.0" 1136 | jackspeak: "npm:^3.1.2" 1137 | minimatch: "npm:^9.0.4" 1138 | minipass: "npm:^7.1.2" 1139 | package-json-from-dist: "npm:^1.0.0" 1140 | path-scurry: "npm:^1.11.1" 1141 | bin: 1142 | glob: dist/esm/bin.mjs 1143 | checksum: 10c0/100705eddbde6323e7b35e1d1ac28bcb58322095bd8e63a7d0bef1a2cdafe0d0f7922a981b2b48369a4f8c1b077be5c171804534c3509dfe950dde15fbe6d828 1144 | languageName: node 1145 | linkType: hard 1146 | 1147 | "globals@npm:^11.1.0": 1148 | version: 11.12.0 1149 | resolution: "globals@npm:11.12.0" 1150 | checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 1151 | languageName: node 1152 | linkType: hard 1153 | 1154 | "graceful-fs@npm:^4.2.6": 1155 | version: 4.2.11 1156 | resolution: "graceful-fs@npm:4.2.11" 1157 | checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 1158 | languageName: node 1159 | linkType: hard 1160 | 1161 | "http-cache-semantics@npm:^4.1.1": 1162 | version: 4.1.1 1163 | resolution: "http-cache-semantics@npm:4.1.1" 1164 | checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc 1165 | languageName: node 1166 | linkType: hard 1167 | 1168 | "http-proxy-agent@npm:^7.0.0": 1169 | version: 7.0.0 1170 | resolution: "http-proxy-agent@npm:7.0.0" 1171 | dependencies: 1172 | agent-base: "npm:^7.1.0" 1173 | debug: "npm:^4.3.4" 1174 | checksum: 10c0/a11574ff39436cee3c7bc67f259444097b09474605846ddd8edf0bf4ad8644be8533db1aa463426e376865047d05dc22755e638632819317c0c2f1b2196657c8 1175 | languageName: node 1176 | linkType: hard 1177 | 1178 | "https-proxy-agent@npm:^7.0.1": 1179 | version: 7.0.2 1180 | resolution: "https-proxy-agent@npm:7.0.2" 1181 | dependencies: 1182 | agent-base: "npm:^7.0.2" 1183 | debug: "npm:4" 1184 | checksum: 10c0/7735eb90073db087e7e79312e3d97c8c04baf7ea7ca7b013382b6a45abbaa61b281041a98f4e13c8c80d88f843785bcc84ba189165b4b4087b1e3496ba656d77 1185 | languageName: node 1186 | linkType: hard 1187 | 1188 | "iconv-lite@npm:^0.6.2": 1189 | version: 0.6.3 1190 | resolution: "iconv-lite@npm:0.6.3" 1191 | dependencies: 1192 | safer-buffer: "npm:>= 2.1.2 < 3.0.0" 1193 | checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 1194 | languageName: node 1195 | linkType: hard 1196 | 1197 | "imurmurhash@npm:^0.1.4": 1198 | version: 0.1.4 1199 | resolution: "imurmurhash@npm:0.1.4" 1200 | checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 1201 | languageName: node 1202 | linkType: hard 1203 | 1204 | "ip-address@npm:^9.0.5": 1205 | version: 9.0.5 1206 | resolution: "ip-address@npm:9.0.5" 1207 | dependencies: 1208 | jsbn: "npm:1.1.0" 1209 | sprintf-js: "npm:^1.1.3" 1210 | checksum: 10c0/331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc 1211 | languageName: node 1212 | linkType: hard 1213 | 1214 | "is-fullwidth-code-point@npm:^3.0.0": 1215 | version: 3.0.0 1216 | resolution: "is-fullwidth-code-point@npm:3.0.0" 1217 | checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc 1218 | languageName: node 1219 | linkType: hard 1220 | 1221 | "isexe@npm:^2.0.0": 1222 | version: 2.0.0 1223 | resolution: "isexe@npm:2.0.0" 1224 | checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d 1225 | languageName: node 1226 | linkType: hard 1227 | 1228 | "isexe@npm:^3.1.1": 1229 | version: 3.1.1 1230 | resolution: "isexe@npm:3.1.1" 1231 | checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 1232 | languageName: node 1233 | linkType: hard 1234 | 1235 | "jackspeak@npm:^3.1.2": 1236 | version: 3.4.3 1237 | resolution: "jackspeak@npm:3.4.3" 1238 | dependencies: 1239 | "@isaacs/cliui": "npm:^8.0.2" 1240 | "@pkgjs/parseargs": "npm:^0.11.0" 1241 | dependenciesMeta: 1242 | "@pkgjs/parseargs": 1243 | optional: true 1244 | checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9 1245 | languageName: node 1246 | linkType: hard 1247 | 1248 | "js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": 1249 | version: 4.0.0 1250 | resolution: "js-tokens@npm:4.0.0" 1251 | checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed 1252 | languageName: node 1253 | linkType: hard 1254 | 1255 | "jsbn@npm:1.1.0": 1256 | version: 1.1.0 1257 | resolution: "jsbn@npm:1.1.0" 1258 | checksum: 10c0/4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 1259 | languageName: node 1260 | linkType: hard 1261 | 1262 | "jsesc@npm:^3.0.2": 1263 | version: 3.1.0 1264 | resolution: "jsesc@npm:3.1.0" 1265 | bin: 1266 | jsesc: bin/jsesc 1267 | checksum: 10c0/531779df5ec94f47e462da26b4cbf05eb88a83d9f08aac2ba04206508fc598527a153d08bd462bae82fc78b3eaa1a908e1a4a79f886e9238641c4cdefaf118b1 1268 | languageName: node 1269 | linkType: hard 1270 | 1271 | "json5@npm:^2.2.3": 1272 | version: 2.2.3 1273 | resolution: "json5@npm:2.2.3" 1274 | bin: 1275 | json5: lib/cli.js 1276 | checksum: 10c0/5a04eed94810fa55c5ea138b2f7a5c12b97c3750bc63d11e511dcecbfef758003861522a070c2272764ee0f4e3e323862f386945aeb5b85b87ee43f084ba586c 1277 | languageName: node 1278 | linkType: hard 1279 | 1280 | "lodash.memoize@npm:^4.1.1": 1281 | version: 4.1.2 1282 | resolution: "lodash.memoize@npm:4.1.2" 1283 | checksum: 10c0/c8713e51eccc650422716a14cece1809cfe34bc5ab5e242b7f8b4e2241c2483697b971a604252807689b9dd69bfe3a98852e19a5b89d506b000b4187a1285df8 1284 | languageName: node 1285 | linkType: hard 1286 | 1287 | "loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0": 1288 | version: 1.4.0 1289 | resolution: "loose-envify@npm:1.4.0" 1290 | dependencies: 1291 | js-tokens: "npm:^3.0.0 || ^4.0.0" 1292 | bin: 1293 | loose-envify: cli.js 1294 | checksum: 10c0/655d110220983c1a4b9c0c679a2e8016d4b67f6e9c7b5435ff5979ecdb20d0813f4dec0a08674fcbdd4846a3f07edbb50a36811fd37930b94aaa0d9daceb017e 1295 | languageName: node 1296 | linkType: hard 1297 | 1298 | "lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": 1299 | version: 10.4.3 1300 | resolution: "lru-cache@npm:10.4.3" 1301 | checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb 1302 | languageName: node 1303 | linkType: hard 1304 | 1305 | "lru-cache@npm:^5.1.1": 1306 | version: 5.1.1 1307 | resolution: "lru-cache@npm:5.1.1" 1308 | dependencies: 1309 | yallist: "npm:^3.0.2" 1310 | checksum: 10c0/89b2ef2ef45f543011e38737b8a8622a2f8998cddf0e5437174ef8f1f70a8b9d14a918ab3e232cb3ba343b7abddffa667f0b59075b2b80e6b4d63c3de6127482 1311 | languageName: node 1312 | linkType: hard 1313 | 1314 | "make-event-props@npm:^1.6.0": 1315 | version: 1.6.2 1316 | resolution: "make-event-props@npm:1.6.2" 1317 | checksum: 10c0/ecf0b742e43a392c07e2267baca2397e750d38cc14ef3cb72ef8bfe4a8c8b0fd99a03a2eeab84a26c2b204f7c231da6af31fa26321fbfd413ded43ba1825e867 1318 | languageName: node 1319 | linkType: hard 1320 | 1321 | "make-fetch-happen@npm:^14.0.3": 1322 | version: 14.0.3 1323 | resolution: "make-fetch-happen@npm:14.0.3" 1324 | dependencies: 1325 | "@npmcli/agent": "npm:^3.0.0" 1326 | cacache: "npm:^19.0.1" 1327 | http-cache-semantics: "npm:^4.1.1" 1328 | minipass: "npm:^7.0.2" 1329 | minipass-fetch: "npm:^4.0.0" 1330 | minipass-flush: "npm:^1.0.5" 1331 | minipass-pipeline: "npm:^1.2.4" 1332 | negotiator: "npm:^1.0.0" 1333 | proc-log: "npm:^5.0.0" 1334 | promise-retry: "npm:^2.0.1" 1335 | ssri: "npm:^12.0.0" 1336 | checksum: 10c0/c40efb5e5296e7feb8e37155bde8eb70bc57d731b1f7d90e35a092fde403d7697c56fb49334d92d330d6f1ca29a98142036d6480a12681133a0a1453164cb2f0 1337 | languageName: node 1338 | linkType: hard 1339 | 1340 | "minimatch@npm:^9.0.4": 1341 | version: 9.0.5 1342 | resolution: "minimatch@npm:9.0.5" 1343 | dependencies: 1344 | brace-expansion: "npm:^2.0.1" 1345 | checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed 1346 | languageName: node 1347 | linkType: hard 1348 | 1349 | "minipass-collect@npm:^2.0.1": 1350 | version: 2.0.1 1351 | resolution: "minipass-collect@npm:2.0.1" 1352 | dependencies: 1353 | minipass: "npm:^7.0.3" 1354 | checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e 1355 | languageName: node 1356 | linkType: hard 1357 | 1358 | "minipass-fetch@npm:^4.0.0": 1359 | version: 4.0.0 1360 | resolution: "minipass-fetch@npm:4.0.0" 1361 | dependencies: 1362 | encoding: "npm:^0.1.13" 1363 | minipass: "npm:^7.0.3" 1364 | minipass-sized: "npm:^1.0.3" 1365 | minizlib: "npm:^3.0.1" 1366 | dependenciesMeta: 1367 | encoding: 1368 | optional: true 1369 | checksum: 10c0/7fa30ce7c373fb6f94c086b374fff1589fd7e78451855d2d06c2e2d9df936d131e73e952163063016592ed3081444bd8d1ea608533313b0149156ce23311da4b 1370 | languageName: node 1371 | linkType: hard 1372 | 1373 | "minipass-flush@npm:^1.0.5": 1374 | version: 1.0.5 1375 | resolution: "minipass-flush@npm:1.0.5" 1376 | dependencies: 1377 | minipass: "npm:^3.0.0" 1378 | checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd 1379 | languageName: node 1380 | linkType: hard 1381 | 1382 | "minipass-pipeline@npm:^1.2.4": 1383 | version: 1.2.4 1384 | resolution: "minipass-pipeline@npm:1.2.4" 1385 | dependencies: 1386 | minipass: "npm:^3.0.0" 1387 | checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 1388 | languageName: node 1389 | linkType: hard 1390 | 1391 | "minipass-sized@npm:^1.0.3": 1392 | version: 1.0.3 1393 | resolution: "minipass-sized@npm:1.0.3" 1394 | dependencies: 1395 | minipass: "npm:^3.0.0" 1396 | checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb 1397 | languageName: node 1398 | linkType: hard 1399 | 1400 | "minipass@npm:^3.0.0": 1401 | version: 3.3.6 1402 | resolution: "minipass@npm:3.3.6" 1403 | dependencies: 1404 | yallist: "npm:^4.0.0" 1405 | checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c 1406 | languageName: node 1407 | linkType: hard 1408 | 1409 | "minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": 1410 | version: 7.1.2 1411 | resolution: "minipass@npm:7.1.2" 1412 | checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 1413 | languageName: node 1414 | linkType: hard 1415 | 1416 | "minizlib@npm:^3.0.1": 1417 | version: 3.0.2 1418 | resolution: "minizlib@npm:3.0.2" 1419 | dependencies: 1420 | minipass: "npm:^7.1.2" 1421 | checksum: 10c0/9f3bd35e41d40d02469cb30470c55ccc21cae0db40e08d1d0b1dff01cc8cc89a6f78e9c5d2b7c844e485ec0a8abc2238111213fdc5b2038e6d1012eacf316f78 1422 | languageName: node 1423 | linkType: hard 1424 | 1425 | "mkdirp@npm:^3.0.1": 1426 | version: 3.0.1 1427 | resolution: "mkdirp@npm:3.0.1" 1428 | bin: 1429 | mkdirp: dist/cjs/src/bin.js 1430 | checksum: 10c0/9f2b975e9246351f5e3a40dcfac99fcd0baa31fbfab615fe059fb11e51f10e4803c63de1f384c54d656e4db31d000e4767e9ef076a22e12a641357602e31d57d 1431 | languageName: node 1432 | linkType: hard 1433 | 1434 | "ms@npm:^2.1.3": 1435 | version: 2.1.3 1436 | resolution: "ms@npm:2.1.3" 1437 | checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 1438 | languageName: node 1439 | linkType: hard 1440 | 1441 | "nanoid@npm:^3.3.11": 1442 | version: 3.3.11 1443 | resolution: "nanoid@npm:3.3.11" 1444 | bin: 1445 | nanoid: bin/nanoid.cjs 1446 | checksum: 10c0/40e7f70b3d15f725ca072dfc4f74e81fcf1fbb02e491cf58ac0c79093adc9b0a73b152bcde57df4b79cd097e13023d7504acb38404a4da7bc1cd8e887b82fe0b 1447 | languageName: node 1448 | linkType: hard 1449 | 1450 | "negotiator@npm:^1.0.0": 1451 | version: 1.0.0 1452 | resolution: "negotiator@npm:1.0.0" 1453 | checksum: 10c0/4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b 1454 | languageName: node 1455 | linkType: hard 1456 | 1457 | "node-gyp@npm:latest": 1458 | version: 11.0.0 1459 | resolution: "node-gyp@npm:11.0.0" 1460 | dependencies: 1461 | env-paths: "npm:^2.2.0" 1462 | exponential-backoff: "npm:^3.1.1" 1463 | glob: "npm:^10.3.10" 1464 | graceful-fs: "npm:^4.2.6" 1465 | make-fetch-happen: "npm:^14.0.3" 1466 | nopt: "npm:^8.0.0" 1467 | proc-log: "npm:^5.0.0" 1468 | semver: "npm:^7.3.5" 1469 | tar: "npm:^7.4.3" 1470 | which: "npm:^5.0.0" 1471 | bin: 1472 | node-gyp: bin/node-gyp.js 1473 | checksum: 10c0/a3b885bbee2d271f1def32ba2e30ffcf4562a3db33af06b8b365e053153e2dd2051b9945783c3c8e852d26a0f20f65b251c7e83361623383a99635c0280ee573 1474 | languageName: node 1475 | linkType: hard 1476 | 1477 | "node-releases@npm:^2.0.19": 1478 | version: 2.0.19 1479 | resolution: "node-releases@npm:2.0.19" 1480 | checksum: 10c0/52a0dbd25ccf545892670d1551690fe0facb6a471e15f2cfa1b20142a5b255b3aa254af5f59d6ecb69c2bec7390bc643c43aa63b13bf5e64b6075952e716b1aa 1481 | languageName: node 1482 | linkType: hard 1483 | 1484 | "nopt@npm:^8.0.0": 1485 | version: 8.1.0 1486 | resolution: "nopt@npm:8.1.0" 1487 | dependencies: 1488 | abbrev: "npm:^3.0.0" 1489 | bin: 1490 | nopt: bin/nopt.js 1491 | checksum: 10c0/62e9ea70c7a3eb91d162d2c706b6606c041e4e7b547cbbb48f8b3695af457dd6479904d7ace600856bf923dd8d1ed0696f06195c8c20f02ac87c1da0e1d315ef 1492 | languageName: node 1493 | linkType: hard 1494 | 1495 | "p-map@npm:^7.0.2": 1496 | version: 7.0.3 1497 | resolution: "p-map@npm:7.0.3" 1498 | checksum: 10c0/46091610da2b38ce47bcd1d8b4835a6fa4e832848a6682cf1652bc93915770f4617afc844c10a77d1b3e56d2472bb2d5622353fa3ead01a7f42b04fc8e744a5c 1499 | languageName: node 1500 | linkType: hard 1501 | 1502 | "package-json-from-dist@npm:^1.0.0": 1503 | version: 1.0.1 1504 | resolution: "package-json-from-dist@npm:1.0.1" 1505 | checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b 1506 | languageName: node 1507 | linkType: hard 1508 | 1509 | "path-key@npm:^3.1.0": 1510 | version: 3.1.1 1511 | resolution: "path-key@npm:3.1.1" 1512 | checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c 1513 | languageName: node 1514 | linkType: hard 1515 | 1516 | "path-scurry@npm:^1.11.1": 1517 | version: 1.11.1 1518 | resolution: "path-scurry@npm:1.11.1" 1519 | dependencies: 1520 | lru-cache: "npm:^10.2.0" 1521 | minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" 1522 | checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d 1523 | languageName: node 1524 | linkType: hard 1525 | 1526 | "picocolors@npm:^1.1.0, picocolors@npm:^1.1.1": 1527 | version: 1.1.1 1528 | resolution: "picocolors@npm:1.1.1" 1529 | checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 1530 | languageName: node 1531 | linkType: hard 1532 | 1533 | "picomatch@npm:^4.0.3": 1534 | version: 4.0.3 1535 | resolution: "picomatch@npm:4.0.3" 1536 | checksum: 10c0/9582c951e95eebee5434f59e426cddd228a7b97a0161a375aed4be244bd3fe8e3a31b846808ea14ef2c8a2527a6eeab7b3946a67d5979e81694654f939473ae2 1537 | languageName: node 1538 | linkType: hard 1539 | 1540 | "postcss@npm:^8.5.6": 1541 | version: 8.5.6 1542 | resolution: "postcss@npm:8.5.6" 1543 | dependencies: 1544 | nanoid: "npm:^3.3.11" 1545 | picocolors: "npm:^1.1.1" 1546 | source-map-js: "npm:^1.2.1" 1547 | checksum: 10c0/5127cc7c91ed7a133a1b7318012d8bfa112da9ef092dddf369ae699a1f10ebbd89b1b9f25f3228795b84585c72aabd5ced5fc11f2ba467eedf7b081a66fad024 1548 | languageName: node 1549 | linkType: hard 1550 | 1551 | "proc-log@npm:^5.0.0": 1552 | version: 5.0.0 1553 | resolution: "proc-log@npm:5.0.0" 1554 | checksum: 10c0/bbe5edb944b0ad63387a1d5b1911ae93e05ce8d0f60de1035b218cdcceedfe39dbd2c697853355b70f1a090f8f58fe90da487c85216bf9671f9499d1a897e9e3 1555 | languageName: node 1556 | linkType: hard 1557 | 1558 | "promise-retry@npm:^2.0.1": 1559 | version: 2.0.1 1560 | resolution: "promise-retry@npm:2.0.1" 1561 | dependencies: 1562 | err-code: "npm:^2.0.2" 1563 | retry: "npm:^0.12.0" 1564 | checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 1565 | languageName: node 1566 | linkType: hard 1567 | 1568 | "react-calendar@npm:^5.0.0": 1569 | version: 5.0.0 1570 | resolution: "react-calendar@npm:5.0.0" 1571 | dependencies: 1572 | "@wojtekmaj/date-utils": "npm:^1.1.3" 1573 | clsx: "npm:^2.0.0" 1574 | get-user-locale: "npm:^2.2.1" 1575 | warning: "npm:^4.0.0" 1576 | peerDependencies: 1577 | "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 1578 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 1579 | react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 1580 | peerDependenciesMeta: 1581 | "@types/react": 1582 | optional: true 1583 | checksum: 10c0/d0b393b22fb1607dd2a7743f104f6d7fe2f3dba39bfbce301b5100d35bed239f51a7b08eec2a7fea77d88af60aecc0b36c2435f36d0e07b88f4a826a67c5a91e 1584 | languageName: node 1585 | linkType: hard 1586 | 1587 | "react-date-picker@npm:^11.0.0": 1588 | version: 11.0.0 1589 | resolution: "react-date-picker@npm:11.0.0" 1590 | dependencies: 1591 | "@wojtekmaj/date-utils": "npm:^1.1.3" 1592 | clsx: "npm:^2.0.0" 1593 | get-user-locale: "npm:^2.2.1" 1594 | make-event-props: "npm:^1.6.0" 1595 | react-calendar: "npm:^5.0.0" 1596 | react-fit: "npm:^2.0.0" 1597 | update-input-width: "npm:^1.4.0" 1598 | peerDependencies: 1599 | "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 1600 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 1601 | react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 1602 | peerDependenciesMeta: 1603 | "@types/react": 1604 | optional: true 1605 | checksum: 10c0/de51915831d16ebcf0f1bb5ff67d41792848c2b36a9a3c8e6e2f652b3a5f2e6751d866095fb234f92e3790ffc1d2557b5f92e839b03b11acead1ecc7d50e2dde 1606 | languageName: node 1607 | linkType: hard 1608 | 1609 | "react-daterange-picker-sample-page@workspace:.": 1610 | version: 0.0.0-use.local 1611 | resolution: "react-daterange-picker-sample-page@workspace:." 1612 | dependencies: 1613 | "@vitejs/plugin-react": "npm:^4.6.0" 1614 | "@wojtekmaj/react-daterange-picker": "npm:latest" 1615 | react: "npm:^18.2.0" 1616 | react-dom: "npm:^18.2.0" 1617 | typescript: "npm:^5.9.2" 1618 | vite: "npm:^7.1.11" 1619 | languageName: unknown 1620 | linkType: soft 1621 | 1622 | "react-dom@npm:^18.2.0": 1623 | version: 18.2.0 1624 | resolution: "react-dom@npm:18.2.0" 1625 | dependencies: 1626 | loose-envify: "npm:^1.1.0" 1627 | scheduler: "npm:^0.23.0" 1628 | peerDependencies: 1629 | react: ^18.2.0 1630 | checksum: 10c0/66dfc5f93e13d0674e78ef41f92ed21dfb80f9c4ac4ac25a4b51046d41d4d2186abc915b897f69d3d0ebbffe6184e7c5876f2af26bfa956f179225d921be713a 1631 | languageName: node 1632 | linkType: hard 1633 | 1634 | "react-fit@npm:^2.0.0": 1635 | version: 2.0.1 1636 | resolution: "react-fit@npm:2.0.1" 1637 | dependencies: 1638 | detect-element-overflow: "npm:^1.4.0" 1639 | warning: "npm:^4.0.0" 1640 | peerDependencies: 1641 | "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 1642 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 1643 | react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 1644 | peerDependenciesMeta: 1645 | "@types/react": 1646 | optional: true 1647 | "@types/react-dom": 1648 | optional: true 1649 | checksum: 10c0/0202f4e3241bd2e967ec3728c97ab57842353ae48f218ca56d28be14737a7a759e40c3cd05700d9e328ab88e377eccb296f1e33530e6775d3acc05df97084018 1650 | languageName: node 1651 | linkType: hard 1652 | 1653 | "react-refresh@npm:^0.17.0": 1654 | version: 0.17.0 1655 | resolution: "react-refresh@npm:0.17.0" 1656 | checksum: 10c0/002cba940384c9930008c0bce26cac97a9d5682bc623112c2268ba0c155127d9c178a9a5cc2212d560088d60dfd503edd808669a25f9b377f316a32361d0b23c 1657 | languageName: node 1658 | linkType: hard 1659 | 1660 | "react@npm:^18.2.0": 1661 | version: 18.2.0 1662 | resolution: "react@npm:18.2.0" 1663 | dependencies: 1664 | loose-envify: "npm:^1.1.0" 1665 | checksum: 10c0/b562d9b569b0cb315e44b48099f7712283d93df36b19a39a67c254c6686479d3980b7f013dc931f4a5a3ae7645eae6386b4aa5eea933baa54ecd0f9acb0902b8 1666 | languageName: node 1667 | linkType: hard 1668 | 1669 | "retry@npm:^0.12.0": 1670 | version: 0.12.0 1671 | resolution: "retry@npm:0.12.0" 1672 | checksum: 10c0/59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe 1673 | languageName: node 1674 | linkType: hard 1675 | 1676 | "rollup@npm:^4.43.0": 1677 | version: 4.50.1 1678 | resolution: "rollup@npm:4.50.1" 1679 | dependencies: 1680 | "@rollup/rollup-android-arm-eabi": "npm:4.50.1" 1681 | "@rollup/rollup-android-arm64": "npm:4.50.1" 1682 | "@rollup/rollup-darwin-arm64": "npm:4.50.1" 1683 | "@rollup/rollup-darwin-x64": "npm:4.50.1" 1684 | "@rollup/rollup-freebsd-arm64": "npm:4.50.1" 1685 | "@rollup/rollup-freebsd-x64": "npm:4.50.1" 1686 | "@rollup/rollup-linux-arm-gnueabihf": "npm:4.50.1" 1687 | "@rollup/rollup-linux-arm-musleabihf": "npm:4.50.1" 1688 | "@rollup/rollup-linux-arm64-gnu": "npm:4.50.1" 1689 | "@rollup/rollup-linux-arm64-musl": "npm:4.50.1" 1690 | "@rollup/rollup-linux-loongarch64-gnu": "npm:4.50.1" 1691 | "@rollup/rollup-linux-ppc64-gnu": "npm:4.50.1" 1692 | "@rollup/rollup-linux-riscv64-gnu": "npm:4.50.1" 1693 | "@rollup/rollup-linux-riscv64-musl": "npm:4.50.1" 1694 | "@rollup/rollup-linux-s390x-gnu": "npm:4.50.1" 1695 | "@rollup/rollup-linux-x64-gnu": "npm:4.50.1" 1696 | "@rollup/rollup-linux-x64-musl": "npm:4.50.1" 1697 | "@rollup/rollup-openharmony-arm64": "npm:4.50.1" 1698 | "@rollup/rollup-win32-arm64-msvc": "npm:4.50.1" 1699 | "@rollup/rollup-win32-ia32-msvc": "npm:4.50.1" 1700 | "@rollup/rollup-win32-x64-msvc": "npm:4.50.1" 1701 | "@types/estree": "npm:1.0.8" 1702 | fsevents: "npm:~2.3.2" 1703 | dependenciesMeta: 1704 | "@rollup/rollup-android-arm-eabi": 1705 | optional: true 1706 | "@rollup/rollup-android-arm64": 1707 | optional: true 1708 | "@rollup/rollup-darwin-arm64": 1709 | optional: true 1710 | "@rollup/rollup-darwin-x64": 1711 | optional: true 1712 | "@rollup/rollup-freebsd-arm64": 1713 | optional: true 1714 | "@rollup/rollup-freebsd-x64": 1715 | optional: true 1716 | "@rollup/rollup-linux-arm-gnueabihf": 1717 | optional: true 1718 | "@rollup/rollup-linux-arm-musleabihf": 1719 | optional: true 1720 | "@rollup/rollup-linux-arm64-gnu": 1721 | optional: true 1722 | "@rollup/rollup-linux-arm64-musl": 1723 | optional: true 1724 | "@rollup/rollup-linux-loongarch64-gnu": 1725 | optional: true 1726 | "@rollup/rollup-linux-ppc64-gnu": 1727 | optional: true 1728 | "@rollup/rollup-linux-riscv64-gnu": 1729 | optional: true 1730 | "@rollup/rollup-linux-riscv64-musl": 1731 | optional: true 1732 | "@rollup/rollup-linux-s390x-gnu": 1733 | optional: true 1734 | "@rollup/rollup-linux-x64-gnu": 1735 | optional: true 1736 | "@rollup/rollup-linux-x64-musl": 1737 | optional: true 1738 | "@rollup/rollup-openharmony-arm64": 1739 | optional: true 1740 | "@rollup/rollup-win32-arm64-msvc": 1741 | optional: true 1742 | "@rollup/rollup-win32-ia32-msvc": 1743 | optional: true 1744 | "@rollup/rollup-win32-x64-msvc": 1745 | optional: true 1746 | fsevents: 1747 | optional: true 1748 | bin: 1749 | rollup: dist/bin/rollup 1750 | checksum: 10c0/2029282826d5fb4e308be261b2c28329a4d2bd34304cc3960da69fd21d5acccd0267d6770b1656ffc8f166203ef7e865b4583d5f842a519c8ef059ac71854205 1751 | languageName: node 1752 | linkType: hard 1753 | 1754 | "safer-buffer@npm:>= 2.1.2 < 3.0.0": 1755 | version: 2.1.2 1756 | resolution: "safer-buffer@npm:2.1.2" 1757 | checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 1758 | languageName: node 1759 | linkType: hard 1760 | 1761 | "scheduler@npm:^0.23.0": 1762 | version: 0.23.0 1763 | resolution: "scheduler@npm:0.23.0" 1764 | dependencies: 1765 | loose-envify: "npm:^1.1.0" 1766 | checksum: 10c0/b777f7ca0115e6d93e126ac490dbd82642d14983b3079f58f35519d992fa46260be7d6e6cede433a92db70306310c6f5f06e144f0e40c484199e09c1f7be53dd 1767 | languageName: node 1768 | linkType: hard 1769 | 1770 | "semver@npm:^6.3.1": 1771 | version: 6.3.1 1772 | resolution: "semver@npm:6.3.1" 1773 | bin: 1774 | semver: bin/semver.js 1775 | checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d 1776 | languageName: node 1777 | linkType: hard 1778 | 1779 | "semver@npm:^7.3.5": 1780 | version: 7.6.3 1781 | resolution: "semver@npm:7.6.3" 1782 | bin: 1783 | semver: bin/semver.js 1784 | checksum: 10c0/88f33e148b210c153873cb08cfe1e281d518aaa9a666d4d148add6560db5cd3c582f3a08ccb91f38d5f379ead256da9931234ed122057f40bb5766e65e58adaf 1785 | languageName: node 1786 | linkType: hard 1787 | 1788 | "shebang-command@npm:^2.0.0": 1789 | version: 2.0.0 1790 | resolution: "shebang-command@npm:2.0.0" 1791 | dependencies: 1792 | shebang-regex: "npm:^3.0.0" 1793 | checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e 1794 | languageName: node 1795 | linkType: hard 1796 | 1797 | "shebang-regex@npm:^3.0.0": 1798 | version: 3.0.0 1799 | resolution: "shebang-regex@npm:3.0.0" 1800 | checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 1801 | languageName: node 1802 | linkType: hard 1803 | 1804 | "signal-exit@npm:^4.0.1": 1805 | version: 4.1.0 1806 | resolution: "signal-exit@npm:4.1.0" 1807 | checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 1808 | languageName: node 1809 | linkType: hard 1810 | 1811 | "smart-buffer@npm:^4.2.0": 1812 | version: 4.2.0 1813 | resolution: "smart-buffer@npm:4.2.0" 1814 | checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 1815 | languageName: node 1816 | linkType: hard 1817 | 1818 | "socks-proxy-agent@npm:^8.0.3": 1819 | version: 8.0.5 1820 | resolution: "socks-proxy-agent@npm:8.0.5" 1821 | dependencies: 1822 | agent-base: "npm:^7.1.2" 1823 | debug: "npm:^4.3.4" 1824 | socks: "npm:^2.8.3" 1825 | checksum: 10c0/5d2c6cecba6821389aabf18728325730504bf9bb1d9e342e7987a5d13badd7a98838cc9a55b8ed3cb866ad37cc23e1086f09c4d72d93105ce9dfe76330e9d2a6 1826 | languageName: node 1827 | linkType: hard 1828 | 1829 | "socks@npm:^2.8.3": 1830 | version: 2.8.3 1831 | resolution: "socks@npm:2.8.3" 1832 | dependencies: 1833 | ip-address: "npm:^9.0.5" 1834 | smart-buffer: "npm:^4.2.0" 1835 | checksum: 10c0/d54a52bf9325165770b674a67241143a3d8b4e4c8884560c4e0e078aace2a728dffc7f70150660f51b85797c4e1a3b82f9b7aa25e0a0ceae1a243365da5c51a7 1836 | languageName: node 1837 | linkType: hard 1838 | 1839 | "source-map-js@npm:^1.2.1": 1840 | version: 1.2.1 1841 | resolution: "source-map-js@npm:1.2.1" 1842 | checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf 1843 | languageName: node 1844 | linkType: hard 1845 | 1846 | "sprintf-js@npm:^1.1.3": 1847 | version: 1.1.3 1848 | resolution: "sprintf-js@npm:1.1.3" 1849 | checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec 1850 | languageName: node 1851 | linkType: hard 1852 | 1853 | "ssri@npm:^12.0.0": 1854 | version: 12.0.0 1855 | resolution: "ssri@npm:12.0.0" 1856 | dependencies: 1857 | minipass: "npm:^7.0.3" 1858 | checksum: 10c0/caddd5f544b2006e88fa6b0124d8d7b28208b83c72d7672d5ade44d794525d23b540f3396108c4eb9280dcb7c01f0bef50682f5b4b2c34291f7c5e211fd1417d 1859 | languageName: node 1860 | linkType: hard 1861 | 1862 | "string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0": 1863 | version: 4.2.3 1864 | resolution: "string-width@npm:4.2.3" 1865 | dependencies: 1866 | emoji-regex: "npm:^8.0.0" 1867 | is-fullwidth-code-point: "npm:^3.0.0" 1868 | strip-ansi: "npm:^6.0.1" 1869 | checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b 1870 | languageName: node 1871 | linkType: hard 1872 | 1873 | "string-width@npm:^5.0.1, string-width@npm:^5.1.2": 1874 | version: 5.1.2 1875 | resolution: "string-width@npm:5.1.2" 1876 | dependencies: 1877 | eastasianwidth: "npm:^0.2.0" 1878 | emoji-regex: "npm:^9.2.2" 1879 | strip-ansi: "npm:^7.0.1" 1880 | checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca 1881 | languageName: node 1882 | linkType: hard 1883 | 1884 | "strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": 1885 | version: 6.0.1 1886 | resolution: "strip-ansi@npm:6.0.1" 1887 | dependencies: 1888 | ansi-regex: "npm:^5.0.1" 1889 | checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 1890 | languageName: node 1891 | linkType: hard 1892 | 1893 | "strip-ansi@npm:^7.0.1": 1894 | version: 7.1.0 1895 | resolution: "strip-ansi@npm:7.1.0" 1896 | dependencies: 1897 | ansi-regex: "npm:^6.0.1" 1898 | checksum: 10c0/a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 1899 | languageName: node 1900 | linkType: hard 1901 | 1902 | "tar@npm:^7.4.3": 1903 | version: 7.4.3 1904 | resolution: "tar@npm:7.4.3" 1905 | dependencies: 1906 | "@isaacs/fs-minipass": "npm:^4.0.0" 1907 | chownr: "npm:^3.0.0" 1908 | minipass: "npm:^7.1.2" 1909 | minizlib: "npm:^3.0.1" 1910 | mkdirp: "npm:^3.0.1" 1911 | yallist: "npm:^5.0.0" 1912 | checksum: 10c0/d4679609bb2a9b48eeaf84632b6d844128d2412b95b6de07d53d8ee8baf4ca0857c9331dfa510390a0727b550fd543d4d1a10995ad86cdf078423fbb8d99831d 1913 | languageName: node 1914 | linkType: hard 1915 | 1916 | "tinyglobby@npm:^0.2.15": 1917 | version: 0.2.15 1918 | resolution: "tinyglobby@npm:0.2.15" 1919 | dependencies: 1920 | fdir: "npm:^6.5.0" 1921 | picomatch: "npm:^4.0.3" 1922 | checksum: 10c0/869c31490d0d88eedb8305d178d4c75e7463e820df5a9b9d388291daf93e8b1eb5de1dad1c1e139767e4269fe75f3b10d5009b2cc14db96ff98986920a186844 1923 | languageName: node 1924 | linkType: hard 1925 | 1926 | "typescript@npm:^5.9.2": 1927 | version: 5.9.2 1928 | resolution: "typescript@npm:5.9.2" 1929 | bin: 1930 | tsc: bin/tsc 1931 | tsserver: bin/tsserver 1932 | checksum: 10c0/cd635d50f02d6cf98ed42de2f76289701c1ec587a363369255f01ed15aaf22be0813226bff3c53e99d971f9b540e0b3cc7583dbe05faded49b1b0bed2f638a18 1933 | languageName: node 1934 | linkType: hard 1935 | 1936 | "typescript@patch:typescript@npm%3A^5.9.2#optional!builtin": 1937 | version: 5.9.2 1938 | resolution: "typescript@patch:typescript@npm%3A5.9.2#optional!builtin::version=5.9.2&hash=5786d5" 1939 | bin: 1940 | tsc: bin/tsc 1941 | tsserver: bin/tsserver 1942 | checksum: 10c0/34d2a8e23eb8e0d1875072064d5e1d9c102e0bdce56a10a25c0b917b8aa9001a9cf5c225df12497e99da107dc379360bc138163c66b55b95f5b105b50578067e 1943 | languageName: node 1944 | linkType: hard 1945 | 1946 | "unique-filename@npm:^4.0.0": 1947 | version: 4.0.0 1948 | resolution: "unique-filename@npm:4.0.0" 1949 | dependencies: 1950 | unique-slug: "npm:^5.0.0" 1951 | checksum: 10c0/38ae681cceb1408ea0587b6b01e29b00eee3c84baee1e41fd5c16b9ed443b80fba90c40e0ba69627e30855570a34ba8b06702d4a35035d4b5e198bf5a64c9ddc 1952 | languageName: node 1953 | linkType: hard 1954 | 1955 | "unique-slug@npm:^5.0.0": 1956 | version: 5.0.0 1957 | resolution: "unique-slug@npm:5.0.0" 1958 | dependencies: 1959 | imurmurhash: "npm:^0.1.4" 1960 | checksum: 10c0/d324c5a44887bd7e105ce800fcf7533d43f29c48757ac410afd42975de82cc38ea2035c0483f4de82d186691bf3208ef35c644f73aa2b1b20b8e651be5afd293 1961 | languageName: node 1962 | linkType: hard 1963 | 1964 | "update-browserslist-db@npm:^1.1.1": 1965 | version: 1.1.1 1966 | resolution: "update-browserslist-db@npm:1.1.1" 1967 | dependencies: 1968 | escalade: "npm:^3.2.0" 1969 | picocolors: "npm:^1.1.0" 1970 | peerDependencies: 1971 | browserslist: ">= 4.21.0" 1972 | bin: 1973 | update-browserslist-db: cli.js 1974 | checksum: 10c0/536a2979adda2b4be81b07e311bd2f3ad5e978690987956bc5f514130ad50cac87cd22c710b686d79731e00fbee8ef43efe5fcd72baa241045209195d43dcc80 1975 | languageName: node 1976 | linkType: hard 1977 | 1978 | "update-input-width@npm:^1.4.0": 1979 | version: 1.4.2 1980 | resolution: "update-input-width@npm:1.4.2" 1981 | checksum: 10c0/d3344f91c1c08a26f81d172dd774ca8834ddfaec1eb78e05280d303800a3236c4e122df14ea34fe7f0e1bdada733dec5d3676d38ce0777bafe603de0a6199473 1982 | languageName: node 1983 | linkType: hard 1984 | 1985 | "vite@npm:^7.1.11": 1986 | version: 7.1.11 1987 | resolution: "vite@npm:7.1.11" 1988 | dependencies: 1989 | esbuild: "npm:^0.25.0" 1990 | fdir: "npm:^6.5.0" 1991 | fsevents: "npm:~2.3.3" 1992 | picomatch: "npm:^4.0.3" 1993 | postcss: "npm:^8.5.6" 1994 | rollup: "npm:^4.43.0" 1995 | tinyglobby: "npm:^0.2.15" 1996 | peerDependencies: 1997 | "@types/node": ^20.19.0 || >=22.12.0 1998 | jiti: ">=1.21.0" 1999 | less: ^4.0.0 2000 | lightningcss: ^1.21.0 2001 | sass: ^1.70.0 2002 | sass-embedded: ^1.70.0 2003 | stylus: ">=0.54.8" 2004 | sugarss: ^5.0.0 2005 | terser: ^5.16.0 2006 | tsx: ^4.8.1 2007 | yaml: ^2.4.2 2008 | dependenciesMeta: 2009 | fsevents: 2010 | optional: true 2011 | peerDependenciesMeta: 2012 | "@types/node": 2013 | optional: true 2014 | jiti: 2015 | optional: true 2016 | less: 2017 | optional: true 2018 | lightningcss: 2019 | optional: true 2020 | sass: 2021 | optional: true 2022 | sass-embedded: 2023 | optional: true 2024 | stylus: 2025 | optional: true 2026 | sugarss: 2027 | optional: true 2028 | terser: 2029 | optional: true 2030 | tsx: 2031 | optional: true 2032 | yaml: 2033 | optional: true 2034 | bin: 2035 | vite: bin/vite.js 2036 | checksum: 10c0/c4aa7f47b1fb07f734ed6f4f605d73e5acf7ff9754d75b4adbfbdddf0e520413019834620c1f7b4a207bce7e1d20a2636c584db2b1b17f5a3ba2cd23d47e50ab 2037 | languageName: node 2038 | linkType: hard 2039 | 2040 | "warning@npm:^4.0.0": 2041 | version: 4.0.3 2042 | resolution: "warning@npm:4.0.3" 2043 | dependencies: 2044 | loose-envify: "npm:^1.0.0" 2045 | checksum: 10c0/aebab445129f3e104c271f1637fa38e55eb25f968593e3825bd2f7a12bd58dc3738bb70dc8ec85826621d80b4acfed5a29ebc9da17397c6125864d72301b937e 2046 | languageName: node 2047 | linkType: hard 2048 | 2049 | "which@npm:^2.0.1": 2050 | version: 2.0.2 2051 | resolution: "which@npm:2.0.2" 2052 | dependencies: 2053 | isexe: "npm:^2.0.0" 2054 | bin: 2055 | node-which: ./bin/node-which 2056 | checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f 2057 | languageName: node 2058 | linkType: hard 2059 | 2060 | "which@npm:^5.0.0": 2061 | version: 5.0.0 2062 | resolution: "which@npm:5.0.0" 2063 | dependencies: 2064 | isexe: "npm:^3.1.1" 2065 | bin: 2066 | node-which: bin/which.js 2067 | checksum: 10c0/e556e4cd8b7dbf5df52408c9a9dd5ac6518c8c5267c8953f5b0564073c66ed5bf9503b14d876d0e9c7844d4db9725fb0dcf45d6e911e17e26ab363dc3965ae7b 2068 | languageName: node 2069 | linkType: hard 2070 | 2071 | "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": 2072 | version: 7.0.0 2073 | resolution: "wrap-ansi@npm:7.0.0" 2074 | dependencies: 2075 | ansi-styles: "npm:^4.0.0" 2076 | string-width: "npm:^4.1.0" 2077 | strip-ansi: "npm:^6.0.0" 2078 | checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da 2079 | languageName: node 2080 | linkType: hard 2081 | 2082 | "wrap-ansi@npm:^8.1.0": 2083 | version: 8.1.0 2084 | resolution: "wrap-ansi@npm:8.1.0" 2085 | dependencies: 2086 | ansi-styles: "npm:^6.1.0" 2087 | string-width: "npm:^5.0.1" 2088 | strip-ansi: "npm:^7.0.1" 2089 | checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 2090 | languageName: node 2091 | linkType: hard 2092 | 2093 | "yallist@npm:^3.0.2": 2094 | version: 3.1.1 2095 | resolution: "yallist@npm:3.1.1" 2096 | checksum: 10c0/c66a5c46bc89af1625476f7f0f2ec3653c1a1791d2f9407cfb4c2ba812a1e1c9941416d71ba9719876530e3340a99925f697142989371b72d93b9ee628afd8c1 2097 | languageName: node 2098 | linkType: hard 2099 | 2100 | "yallist@npm:^4.0.0": 2101 | version: 4.0.0 2102 | resolution: "yallist@npm:4.0.0" 2103 | checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a 2104 | languageName: node 2105 | linkType: hard 2106 | 2107 | "yallist@npm:^5.0.0": 2108 | version: 5.0.0 2109 | resolution: "yallist@npm:5.0.0" 2110 | checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 2111 | languageName: node 2112 | linkType: hard 2113 | --------------------------------------------------------------------------------