├── src ├── vite-env.d.ts ├── DatePickerNP │ ├── components │ │ ├── Icons │ │ │ ├── index.ts │ │ │ ├── Calendar.tsx │ │ │ └── Arrow.tsx │ │ ├── Calendar │ │ │ ├── Header │ │ │ │ ├── Selector │ │ │ │ │ ├── MonthSelector.tsx │ │ │ │ │ ├── YearSelector.tsx │ │ │ │ │ └── index.tsx │ │ │ │ └── index.tsx │ │ │ ├── Footer │ │ │ │ └── index.tsx │ │ │ ├── index.tsx │ │ │ └── Dates │ │ │ │ └── index.tsx │ │ └── DatePickerInput.tsx │ ├── enums │ │ └── index.ts │ ├── types │ │ ├── Constant.ts │ │ ├── DatePickerNP.ts │ │ ├── DatePickerCalendar.ts │ │ ├── DatePickerInput.ts │ │ └── Calendar.ts │ ├── constants │ │ ├── number.ts │ │ ├── calendar.ts │ │ └── dates.ts │ ├── utils │ │ ├── index.ts │ │ ├── formatter.ts │ │ ├── number.ts │ │ ├── event.ts │ │ ├── calendar.ts │ │ ├── position.ts │ │ ├── converter.ts │ │ └── dates.ts │ ├── index.ts │ ├── styles │ │ ├── calendar-footer.css │ │ ├── index.css │ │ ├── calendar-dates.css │ │ └── calendar-header.css │ └── DatePickerNP.tsx └── main.tsx ├── tsconfig.node.json ├── index.html ├── .gitignore ├── .eslintrc.cjs ├── tsconfig.json ├── vite.config.ts ├── LICENSE ├── package.json ├── README.md └── yarn.lock /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /src/DatePickerNP/components/Icons/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./Arrow"; 2 | export * from "./Calendar"; 3 | -------------------------------------------------------------------------------- /src/DatePickerNP/enums/index.ts: -------------------------------------------------------------------------------- 1 | export const enum MenuPositionEnum { 2 | AUTO = "auto", 3 | TOP = "top", 4 | BOTTOM = "bottom", 5 | } 6 | -------------------------------------------------------------------------------- /src/DatePickerNP/types/Constant.ts: -------------------------------------------------------------------------------- 1 | export type NepaliDatesType = { 2 | year: number; 3 | months: number[]; 4 | startWeek: number[]; 5 | }; 6 | -------------------------------------------------------------------------------- /src/DatePickerNP/constants/number.ts: -------------------------------------------------------------------------------- 1 | export const NEPALI_NUMBERS = [ 2 | "०", 3 | "१", 4 | "२", 5 | "३", 6 | "४", 7 | "५", 8 | "६", 9 | "७", 10 | "८", 11 | "९", 12 | ]; 13 | -------------------------------------------------------------------------------- /src/DatePickerNP/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./calendar"; 2 | export * from "./converter"; 3 | export * from "./dates"; 4 | export * from "./event"; 5 | export * from "./formatter"; 6 | export * from "./position"; 7 | -------------------------------------------------------------------------------- /src/DatePickerNP/index.ts: -------------------------------------------------------------------------------- 1 | import DatePickerNP from "./DatePickerNP"; 2 | import { getTodayBSDate } from "./utils"; 3 | export * from "./utils/converter"; 4 | 5 | export { getTodayBSDate }; 6 | 7 | export default DatePickerNP; 8 | -------------------------------------------------------------------------------- /src/DatePickerNP/utils/formatter.ts: -------------------------------------------------------------------------------- 1 | export const formatDate = (date?: string) => { 2 | if (typeof date !== "string") return ""; 3 | 4 | return date 5 | .split("-") 6 | .map((d) => (d.length === 1 ? d.padStart(2, "0") : d)) 7 | .join("-"); 8 | }; 9 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true, 8 | "strict": true 9 | }, 10 | "include": ["vite.config.ts"] 11 | } 12 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | date-picker-np 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /src/DatePickerNP/styles/calendar-footer.css: -------------------------------------------------------------------------------- 1 | .date-picker-calendar-footer { 2 | display: flex; 3 | justify-content: space-between; 4 | padding: 10px; 5 | line-height: 24px; 6 | } 7 | 8 | .date-picker-calendar-footer > .date-picker-calendar-footer-btn { 9 | font-weight: medium; 10 | color: darkblue; 11 | cursor: pointer; 12 | } 13 | 14 | .date-picker-calendar-footer-btn.date-picker-calendar-footer-btn-disabled { 15 | cursor: default; 16 | opacity: 0.4; 17 | } 18 | -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { browser: true, es2020: true }, 4 | extends: [ 5 | 'eslint:recommended', 6 | 'plugin:@typescript-eslint/recommended', 7 | 'plugin:react-hooks/recommended', 8 | ], 9 | ignorePatterns: ['dist', '.eslintrc.cjs'], 10 | parser: '@typescript-eslint/parser', 11 | plugins: ['react-refresh'], 12 | rules: { 13 | 'react-refresh/only-export-components': [ 14 | 'warn', 15 | { allowConstantExport: true }, 16 | ], 17 | }, 18 | } 19 | -------------------------------------------------------------------------------- /src/DatePickerNP/utils/number.ts: -------------------------------------------------------------------------------- 1 | import { NEPALI_NUMBERS } from "../constants/number"; 2 | 3 | export const numberConversion = (lang?: "en" | "np", num?: number | string) => { 4 | // Mapping of English digits to Nepali digits 5 | 6 | if (!num || lang === "en") return num; 7 | 8 | // Convert the number to a string and replace each digit 9 | return num 10 | .toString() 11 | .split("") 12 | .map((char) => { 13 | return char >= "0" && char <= "9" ? NEPALI_NUMBERS[+char] : char; 14 | }) 15 | .join(""); 16 | }; 17 | -------------------------------------------------------------------------------- /src/DatePickerNP/utils/event.ts: -------------------------------------------------------------------------------- 1 | import { isValidNepaliDate } from "./dates"; 2 | 3 | export const clickEvent = ({ 4 | event, 5 | container, 6 | input, 7 | }: { 8 | event: MouseEvent; 9 | container: HTMLDivElement; 10 | input: HTMLInputElement; 11 | }) => { 12 | const clickedElement = event.target as Node; 13 | 14 | if (clickedElement === container || container.contains(clickedElement)) 15 | return; 16 | 17 | const currentValue = input.value; 18 | const isValid = isValidNepaliDate(currentValue); 19 | 20 | return isValid ? currentValue : ""; 21 | }; 22 | -------------------------------------------------------------------------------- /src/DatePickerNP/types/DatePickerNP.ts: -------------------------------------------------------------------------------- 1 | import { CalendarStyles } from "./Calendar"; 2 | import { DatePickerCommonInputProps } from "./DatePickerInput"; 3 | 4 | export type DatePickerCommonProps = { 5 | lang?: "en" | "np"; 6 | 7 | max?: string; 8 | min?: string; 9 | }; 10 | 11 | export type DatePickerNPProps = DatePickerCommonInputProps & 12 | DatePickerCommonProps & { 13 | menuPosition?: MenuPositionType; 14 | position?: PositionType; 15 | calendarStyles?: CalendarStyles; 16 | }; 17 | 18 | export type MenuPositionType = "auto" | "top" | "bottom"; 19 | 20 | export type PositionType = "absolute" | "fixed"; 21 | -------------------------------------------------------------------------------- /src/main.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | import ReactDOM from "react-dom/client"; 3 | 4 | import DatePickerNP from "./DatePickerNP"; 5 | 6 | const App = () => { 7 | const [selectedDate, setSelectedDate] = useState(""); 8 | 9 | return ( 10 | setSelectedDate(date)} 13 | inputContainerStyles={{ 14 | width: "100%", 15 | }} 16 | position="fixed" 17 | /> 18 | ); 19 | }; 20 | 21 | ReactDOM.createRoot(document.getElementById("root")!).render( 22 | 23 | 24 | 25 | ); 26 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 5 | "module": "ESNext", 6 | "jsx": "react-jsx", 7 | "skipLibCheck": true, 8 | "strict": true, 9 | "noUnusedLocals": true, 10 | "noUnusedParameters": true, 11 | "declaration": true, 12 | "emitDeclarationOnly": true, 13 | "noEmit": false, 14 | "declarationMap": false, 15 | "outDir": "dist", 16 | "resolveJsonModule": true, 17 | "moduleResolution": "node", 18 | "esModuleInterop": true 19 | }, 20 | "include": ["src/DatePickerNP/**/*"], 21 | "exclude": ["node_modules"] 22 | } 23 | -------------------------------------------------------------------------------- /src/DatePickerNP/types/DatePickerCalendar.ts: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | import { DatePickerCommonProps, PositionType } from "./DatePickerNP"; 4 | import { CalendarStyles } from "./Calendar"; 5 | 6 | export type DatePickerCalendarProps = DatePickerCommonProps & { 7 | value?: string; 8 | onChange: (date?: string) => void; 9 | 10 | calendarPositions?: React.CSSProperties; 11 | calendarStyles: CalendarStyles; 12 | position?: PositionType; 13 | }; 14 | 15 | export type CalendarFooterProps = DatePickerCommonProps & { 16 | hasValidValue: boolean; 17 | onChange: (date?: string) => void; 18 | 19 | calendarStyles: CalendarStyles; 20 | }; 21 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import react from "@vitejs/plugin-react"; 3 | import cssInjectedByJsPlugin from "vite-plugin-css-injected-by-js"; 4 | 5 | export default defineConfig({ 6 | plugins: [react(), cssInjectedByJsPlugin()], 7 | build: { 8 | lib: { 9 | entry: "./src/DatePickerNP/index.ts", 10 | name: "DatePickerNP", 11 | formats: ["es", "umd"], // Build both ESM and UMD formats 12 | fileName: (format) => `index.${format}.js`, 13 | }, 14 | rollupOptions: { 15 | external: ["react", /^react\/.*/], // support all react versions 16 | output: { 17 | globals: { 18 | react: "React", 19 | }, 20 | }, 21 | }, 22 | }, 23 | }); 24 | -------------------------------------------------------------------------------- /src/DatePickerNP/types/DatePickerInput.ts: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export type InputStyles = Pick< 4 | React.CSSProperties, 5 | | "padding" 6 | | "background" 7 | | "width" 8 | | "border" 9 | | "borderRadius" 10 | | "lineHeight" 11 | | "color" 12 | | "fontSize" 13 | > & { 14 | height?: number; // make sure height is number for the calculation of the calendar menu position 15 | }; 16 | 17 | export type DatePickerInputProps = DatePickerCommonInputProps & { 18 | setIsCalendarOpen: React.Dispatch>; 19 | }; 20 | 21 | export type DatePickerCommonInputProps = { 22 | value: string; 23 | onChange: (date: string) => void; 24 | disabled?: boolean; 25 | inputElement?: React.ReactNode; 26 | placeholder?: string; 27 | hasCalendarIcon?: boolean; 28 | calendarIcon?: React.ReactNode; 29 | calendarColor?: string; 30 | inputContainerStyles?: InputStyles; 31 | }; 32 | -------------------------------------------------------------------------------- /src/DatePickerNP/components/Icons/Calendar.tsx: -------------------------------------------------------------------------------- 1 | export const CalendarIcon = () => { 2 | return ( 3 | 10 | 17 | 18 | ); 19 | }; 20 | -------------------------------------------------------------------------------- /src/DatePickerNP/components/Calendar/Header/Selector/MonthSelector.tsx: -------------------------------------------------------------------------------- 1 | import { MONTHS_IN_WORDS } from "../../../../constants/calendar"; 2 | import { MonthSelectorProps } from "../../../../types/Calendar"; 3 | 4 | const MonthSelector = ({ 5 | handleMonthChange, 6 | minMonth, 7 | maxMonth, 8 | lang, 9 | }: MonthSelectorProps) => { 10 | return ( 11 |
12 | {MONTHS_IN_WORDS.map(({ name_en, name_np, month_position }) => { 13 | const isDisabled = 14 | month_position < minMonth || month_position > maxMonth; 15 | 16 | return ( 17 |
!isDisabled && handleMonthChange(month_position)} 20 | className={ 21 | isDisabled ? "date-picker-selector-block-disabled" : undefined 22 | } 23 | > 24 |
{lang === "en" ? name_en : name_np}
25 |
26 | ); 27 | })} 28 |
29 | ); 30 | }; 31 | 32 | export default MonthSelector; 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Dipendra Paudel 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 | -------------------------------------------------------------------------------- /src/DatePickerNP/styles/index.css: -------------------------------------------------------------------------------- 1 | .date-picker-container, 2 | .date-picker-container * { 3 | box-sizing: border-box; 4 | margin: 0; 5 | } 6 | 7 | .date-picker-container { 8 | position: relative; 9 | font-family: sans-serif; 10 | font-size: 12px; 11 | user-select: none; 12 | color: rgb(14, 14, 14); 13 | width: fit-content; 14 | } 15 | 16 | /* input styles */ 17 | .date-picker-input-container { 18 | position: relative; 19 | border-radius: 4px; 20 | border: 1px solid gray; 21 | overflow: hidden; 22 | } 23 | .date-picker-input { 24 | border-radius: 4px; 25 | border: none; 26 | outline: none; 27 | min-width: 140px; 28 | width: 100%; 29 | min-height: 28px; 30 | padding: 0 10px; 31 | display: flex; 32 | align-items: center; 33 | background: transparent; 34 | } 35 | .date-picker-input:focus { 36 | outline: none; 37 | } 38 | .date-picker-input-container-disabled { 39 | opacity: 0.5; 40 | cursor: not-allowed; 41 | } 42 | .date-picker-input-disabled { 43 | cursor: not-allowed; 44 | } 45 | .date-picker-input-right-icon { 46 | display: flex; 47 | position: absolute; 48 | right: 8px; 49 | top: 50%; 50 | transform: translateY(-50%); 51 | pointer-events: none; 52 | } 53 | -------------------------------------------------------------------------------- /src/DatePickerNP/styles/calendar-dates.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --date-picker-np-hover-color: rgb(218, 218, 218); 3 | } 4 | 5 | .date-picker-body-container { 6 | display: grid; 7 | grid-template-columns: repeat(7, 1fr); 8 | text-align: center; 9 | } 10 | 11 | .date-picker-week-days-container > div { 12 | line-height: 14px; 13 | padding: 4px 0 8px; 14 | } 15 | 16 | .date-picker-dates-container > div { 17 | /* padding: 8px 0; */ 18 | line-height: 30px; 19 | height: 30px; 20 | cursor: pointer; 21 | } 22 | 23 | .date-picker-dates-container .prev-month-days, 24 | .date-picker-dates-container .next-month-days { 25 | opacity: 0.4; 26 | cursor: default; 27 | } 28 | 29 | .date-picker-dates-container 30 | > div:not( 31 | .prev-month-days, 32 | .next-month-days, 33 | .date-picker-date-disabled, 34 | .date-picker-selected-date 35 | ):hover { 36 | background: var(--date-picker-np-hover-color); 37 | } 38 | 39 | /* For today date */ 40 | .date-picker-dates-container .date-picker-selected-date { 41 | background: rgb(0, 133, 177); 42 | color: white; 43 | } 44 | 45 | .date-picker-dates-container > .date-picker-date-disabled { 46 | background: white; 47 | opacity: 0.4; 48 | cursor: default; 49 | } 50 | -------------------------------------------------------------------------------- /src/DatePickerNP/components/Icons/Arrow.tsx: -------------------------------------------------------------------------------- 1 | import { ArrowIconProps } from "../../types/Calendar"; 2 | 3 | export const ArrowRightIcon = ({ onClick }: ArrowIconProps) => { 4 | return ( 5 | 13 | 20 | 21 | ); 22 | }; 23 | 24 | export const ArrowLeftIcon = ({ onClick }: ArrowIconProps) => { 25 | return ( 26 |
32 | 33 |
34 | ); 35 | }; 36 | 37 | export const ArrowTopIcon = ({ onClick }: ArrowIconProps) => { 38 | return ( 39 |
45 | 46 |
47 | ); 48 | }; 49 | 50 | export const ArrowBottomIcon = ({ onClick }: ArrowIconProps) => { 51 | return ( 52 |
58 | 59 |
60 | ); 61 | }; 62 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "date-picker-np", 3 | "version": "1.0.33", 4 | "description": "Nepali Date Picker for React", 5 | "type": "module", 6 | "main": "dist/index.es.js", 7 | "types": "dist/index.d.ts", 8 | "scripts": { 9 | "dev": "vite", 10 | "build": "tsc & vite build", 11 | "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", 12 | "preview": "vite preview" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "git+https://github.com/DipendraPaudel/date-picker-np.git" 17 | }, 18 | "keywords": [ 19 | "date-picker-np", 20 | "nepali-date-picker", 21 | "nepali-date-picker-react", 22 | "react-date-picker", 23 | "react-nepali-date-picker", 24 | "date-picker" 25 | ], 26 | "author": "Dipendra Paudel", 27 | "license": "MIT", 28 | "bugs": { 29 | "url": "https://github.com/DipendraPaudel/date-picker-np/issues" 30 | }, 31 | "homepage": "https://github.com/DipendraPaudel/date-picker-np#readme", 32 | "dependencies": { 33 | "react": "^18.2.0", 34 | "react-dom": "^18.2.0" 35 | }, 36 | "devDependencies": { 37 | "@types/react": "^18.2.66", 38 | "@types/react-dom": "^18.2.22", 39 | "@typescript-eslint/eslint-plugin": "^7.2.0", 40 | "@typescript-eslint/parser": "^7.2.0", 41 | "@vitejs/plugin-react": "^4.2.1", 42 | "eslint": "^8.57.0", 43 | "eslint-plugin-react-hooks": "^4.6.0", 44 | "eslint-plugin-react-refresh": "^0.4.6", 45 | "typescript": "^5.2.2", 46 | "vite": "^5.2.0", 47 | "vite-plugin-css-injected-by-js": "^3.5.2" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/DatePickerNP/types/Calendar.ts: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { DatePickerCommonProps } from "./DatePickerNP"; 3 | 4 | export type ArrowIconProps = { 5 | onClick?: () => void; 6 | }; 7 | 8 | export type SelectorProps = DatePickerCommonProps & { 9 | year: number; 10 | handleChange: (value: string) => void; 11 | setIsDropdownOpen: React.Dispatch>; 12 | }; 13 | 14 | export type CalendarHeaderProps = DatePickerCommonProps & { 15 | date: string; 16 | handleChange: (value: string) => void; 17 | 18 | calendarStyles: CalendarStyles; 19 | }; 20 | 21 | export type CalendarDatesProps = DatePickerCommonProps & { 22 | date: string; 23 | handleChange: (day: number) => void; 24 | 25 | calendarStyles: CalendarStyles; 26 | }; 27 | 28 | export type YearSelectorProps = Pick & { 29 | selectedYear: number; 30 | setSelectedYear: React.Dispatch>; 31 | setActiveSelector: React.Dispatch>; 32 | 33 | minYear: number; 34 | maxYear: number; 35 | }; 36 | 37 | export type MonthSelectorProps = Pick & { 38 | handleMonthChange: (month: number) => void; 39 | 40 | minMonth: number; 41 | maxMonth: number; 42 | }; 43 | 44 | export type WeeksProps = Pick; 45 | 46 | export type CalendarStyles = { 47 | dates?: { 48 | hoverBackgroundColor?: string; 49 | activeBackgroundColor?: string; 50 | activeTextColor?: string; 51 | }; 52 | footer?: { 53 | textColor?: string; 54 | }; 55 | }; 56 | -------------------------------------------------------------------------------- /src/DatePickerNP/utils/calendar.ts: -------------------------------------------------------------------------------- 1 | import { 2 | getTodayBSDate, 3 | isGreaterThanOrEqualToMinDate, 4 | isLessThanOrEqualToMaxDate, 5 | isValidNepaliDate, 6 | } from "./dates"; 7 | import { formatDate } from "./formatter"; 8 | 9 | export const getFormattedDate = (date?: string) => { 10 | if (!date) return [0, 0, 0]; 11 | 12 | return date.split("-").map((d) => +d); 13 | }; 14 | 15 | export const liesInBetween = (value: string, min?: string, max?: string) => { 16 | if (!min && !max) return true; 17 | 18 | let isValid = false; 19 | 20 | if (min && isValidNepaliDate(min)) { 21 | if (isGreaterThanOrEqualToMinDate(value, min ?? "")) isValid = true; 22 | else return false; 23 | } 24 | 25 | if (max && isValidNepaliDate(max)) { 26 | if (isLessThanOrEqualToMaxDate(value, max ?? "")) isValid = true; 27 | else return false; 28 | } 29 | 30 | return isValid; 31 | }; 32 | 33 | export const getDisplayDate = ( 34 | value: string, 35 | min?: string, 36 | max?: string, 37 | isValid?: boolean 38 | ) => { 39 | /* 40 | Display date priority 41 | --> passed value if valid 42 | --> today bs date if lies in between min and max 43 | --> min date if valid 44 | --> max date if valid 45 | */ 46 | 47 | const todayBSDate = getTodayBSDate(); 48 | 49 | let displayValue = todayBSDate; 50 | 51 | if (isValid && liesInBetween(value, min, max)) return value; 52 | else { 53 | if (liesInBetween(todayBSDate, min, max)) displayValue = todayBSDate; 54 | else if (min && isValidNepaliDate(min)) displayValue = min; 55 | else if (max && isValidNepaliDate(max)) displayValue = max; 56 | } 57 | 58 | displayValue = formatDate(displayValue); 59 | displayValue = displayValue.slice(0, 8) + "dd"; 60 | 61 | return displayValue; 62 | }; 63 | -------------------------------------------------------------------------------- /src/DatePickerNP/constants/calendar.ts: -------------------------------------------------------------------------------- 1 | import { NEPALI_DATES } from "./dates"; 2 | 3 | export const INITIAL_YEAR_OF_CALENDAR = NEPALI_DATES[0].year; 4 | export const FINAL_YEAR_OF_CALENDAR = 5 | NEPALI_DATES[NEPALI_DATES.length - 1].year; 6 | 7 | export const YEARS_LIST = Array.from({ length: NEPALI_DATES.length }).map( 8 | (_, index) => INITIAL_YEAR_OF_CALENDAR + index 9 | ); 10 | 11 | export const MONTHS_IN_WORDS = [ 12 | { name_np: "बैशाख", name_en: "Baisakh", month_position: 1 }, 13 | { name_np: "जेठ", name_en: "Jestha", month_position: 2 }, 14 | { name_np: "असार", name_en: "Asar", month_position: 3 }, 15 | { name_np: "साउन", name_en: "Shrawan", month_position: 4 }, 16 | { name_np: "भदौ", name_en: "Bhadra", month_position: 5 }, 17 | { name_np: "असोज", name_en: "Ashoj", month_position: 6 }, 18 | { name_np: "कार्तिक", name_en: "Kartik", month_position: 7 }, 19 | { name_np: "मंसिर", name_en: "Mangsir", month_position: 8 }, 20 | { name_np: "पुष", name_en: "Poush", month_position: 9 }, 21 | { name_np: "माघ", name_en: "Magh", month_position: 10 }, 22 | { name_np: "फागुन", name_en: "Falgun", month_position: 11 }, 23 | { name_np: "चैत", name_en: "Chaitra", month_position: 12 }, 24 | ]; 25 | 26 | export const DAYS_OF_WEEK = [ 27 | { name_en: "Sun", name_np: "आइत", week_position: 1 }, 28 | { name_en: "Mon", name_np: "सोम", week_position: 2 }, 29 | { name_en: "Tue", name_np: "मंगल", week_position: 3 }, 30 | { name_en: "Wed", name_np: "बुध", week_position: 4 }, 31 | { name_en: "Thu", name_np: "बिही", week_position: 5 }, 32 | { name_en: "Fri", name_np: "शुक्र", week_position: 6 }, 33 | { name_en: "Sat", name_np: "शनि", week_position: 7 }, 34 | ]; 35 | 36 | export const DEFAULT_INPUT_HEIGHT = 32; 37 | export const DEFAULT_CALENDAR_ICON_COLOR = "gray"; 38 | export const DEFAULT_INPUT_CONTAINER_BACKGROUND = "white"; 39 | export const CALENDAR_WIDTH = 220; 40 | export const CALENDAR_HEIGHT = 284; 41 | -------------------------------------------------------------------------------- /src/DatePickerNP/components/Calendar/Footer/index.tsx: -------------------------------------------------------------------------------- 1 | import { CalendarFooterProps } from "../../../types/DatePickerCalendar"; 2 | import { 3 | getTodayBSDate, 4 | isGreaterThanOrEqualToMinDate, 5 | isLessThanOrEqualToMaxDate, 6 | isValidNepaliDate, 7 | } from "../../../utils"; 8 | 9 | const CalendarFooter = ({ 10 | hasValidValue, 11 | onChange, 12 | min, 13 | max, 14 | lang, 15 | calendarStyles, 16 | }: CalendarFooterProps) => { 17 | let isTodayDateDisabled = false; 18 | const todayDate = getTodayBSDate(); 19 | 20 | // check if today button should be disabled 21 | if (min && isValidNepaliDate(min)) { 22 | isTodayDateDisabled = !isGreaterThanOrEqualToMinDate(todayDate, min); 23 | } 24 | 25 | // only check the max date if current date is not disabled by min date only 26 | if (!isTodayDateDisabled && max && isValidNepaliDate(max)) { 27 | isTodayDateDisabled = !isLessThanOrEqualToMaxDate(todayDate, max); 28 | } 29 | 30 | const footerTextColor = calendarStyles?.footer?.textColor; 31 | 32 | return ( 33 |
34 |
hasValidValue && onChange("")} 42 | > 43 | {lang === "en" ? "Clear" : "हटाउनुहोस्"} 44 |
45 |
!isTodayDateDisabled && onChange(getTodayBSDate())} 53 | > 54 | {lang === "en" ? "Today" : "आज"} 55 |
56 |
57 | ); 58 | }; 59 | 60 | export default CalendarFooter; 61 | -------------------------------------------------------------------------------- /src/DatePickerNP/components/Calendar/Header/Selector/YearSelector.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useRef } from "react"; 2 | 3 | import { YearSelectorProps } from "../../../../types/Calendar"; 4 | import { YEARS_LIST } from "../../../../constants/calendar"; 5 | import { numberConversion } from "../../../../utils/number"; 6 | 7 | const YearSelector = ({ 8 | selectedYear, 9 | setSelectedYear, 10 | setActiveSelector, 11 | lang, 12 | minYear, 13 | maxYear, 14 | }: YearSelectorProps) => { 15 | const containerRef = useRef(null); 16 | 17 | // function to handle year change and display months selector active 18 | const handleYearChange = (year: number) => { 19 | setSelectedYear(year); 20 | setActiveSelector("month"); 21 | }; 22 | 23 | useEffect(() => { 24 | const container = containerRef.current!; 25 | 26 | const yearsElement = container.children; 27 | 28 | // loop through every elements and scroll into the current selected year 29 | // finally break out of the loop if selected year is found and scoll upto that element 30 | for (let i = 0; i < yearsElement.length; i++) { 31 | if ( 32 | yearsElement[i].textContent === 33 | String(numberConversion(lang, selectedYear)) 34 | ) { 35 | yearsElement[i].scrollIntoView({ 36 | block: "nearest", 37 | inline: "nearest", 38 | }); 39 | break; 40 | } 41 | } 42 | }, [selectedYear, lang]); 43 | 44 | return ( 45 |
49 | {YEARS_LIST.map((year) => { 50 | const isSelected = year === selectedYear; 51 | const isDisabled = year < minYear || year > maxYear; 52 | 53 | return ( 54 |
!isDisabled && handleYearChange(year)} 57 | className={` 58 | ${isSelected ? "date-picker-year-selector-block-selected" : ""} ${ 59 | isDisabled ? "date-picker-selector-block-disabled" : "" 60 | }`} 61 | > 62 | {numberConversion(lang, year)} 63 |
64 | ); 65 | })} 66 |
67 | ); 68 | }; 69 | 70 | export default YearSelector; 71 | -------------------------------------------------------------------------------- /src/DatePickerNP/utils/position.ts: -------------------------------------------------------------------------------- 1 | import { CALENDAR_HEIGHT, CALENDAR_WIDTH } from "../constants/calendar"; 2 | import { MenuPositionEnum } from "../enums"; 3 | import { MenuPositionType, PositionType } from "../types/DatePickerNP"; 4 | 5 | export const calculateCalendarPosition = ( 6 | container: HTMLDivElement, 7 | position: PositionType 8 | ) => { 9 | let x = 0, 10 | y = 0; 11 | 12 | const containerPositions = container.getBoundingClientRect(); 13 | 14 | const xPosition = containerPositions.left; 15 | const yPosition = containerPositions.top; 16 | 17 | const innerWidth = window.document.documentElement.scrollWidth; 18 | 19 | const combinedX = xPosition + CALENDAR_WIDTH; 20 | const combinedY = yPosition + CALENDAR_HEIGHT + containerPositions.height; 21 | 22 | if (position === "fixed") { 23 | x = 24 | combinedX > innerWidth 25 | ? innerWidth - CALENDAR_WIDTH 26 | : containerPositions.x; 27 | 28 | y = containerPositions.y; 29 | } else { 30 | x = combinedX > innerWidth ? -combinedX + innerWidth : 0; 31 | 32 | if ( 33 | combinedY > innerHeight && 34 | innerHeight > CALENDAR_HEIGHT + containerPositions.height && 35 | yPosition > CALENDAR_HEIGHT 36 | ) 37 | y = -1; 38 | else y = 1; 39 | } 40 | 41 | return { x, y }; 42 | }; 43 | 44 | export const getVerticalScrollbarWidth = () => { 45 | return window.innerWidth - window.document.documentElement.clientWidth; 46 | }; 47 | 48 | // function to get the top position of the calendar menu 49 | export const getMenuTopPosition = ( 50 | menuPosition: MenuPositionType, 51 | yCoordinate: number, 52 | inputContainerHeight: number, 53 | position: PositionType 54 | ) => { 55 | if (position === "fixed") { 56 | if (yCoordinate > 0) { 57 | if ( 58 | yCoordinate + CALENDAR_HEIGHT + inputContainerHeight > 59 | window.innerHeight && 60 | yCoordinate > CALENDAR_HEIGHT 61 | ) { 62 | return yCoordinate - CALENDAR_HEIGHT; 63 | } 64 | } 65 | 66 | return yCoordinate + inputContainerHeight; 67 | } 68 | 69 | if (menuPosition === MenuPositionEnum.AUTO) { 70 | return yCoordinate > 0 ? inputContainerHeight + 2 : -CALENDAR_HEIGHT; 71 | } 72 | 73 | if (menuPosition === MenuPositionEnum.TOP) return -CALENDAR_HEIGHT; 74 | 75 | return inputContainerHeight + 2; 76 | }; 77 | -------------------------------------------------------------------------------- /src/DatePickerNP/components/Calendar/index.tsx: -------------------------------------------------------------------------------- 1 | import { useLayoutEffect, useState } from "react"; 2 | 3 | import { DatePickerCalendarProps } from "../../types/DatePickerCalendar"; 4 | import CalendarDates from "./Dates"; 5 | import CalendarFooter from "./Footer"; 6 | import CalendarHeader from "./Header"; 7 | import { 8 | extractDateData, 9 | getDisplayDate, 10 | isValidNepaliDate, 11 | } from "../../utils"; 12 | 13 | const DatePickerCalendar = ({ 14 | value = "yyyy-mm-dd", 15 | onChange, 16 | calendarPositions, 17 | min, 18 | max, 19 | lang, 20 | calendarStyles, 21 | position, 22 | }: DatePickerCalendarProps) => { 23 | const isValid = isValidNepaliDate(value); 24 | 25 | const [virtualDate, setVirtualDate] = useState(""); 26 | 27 | const handleDateChange = (day: number) => { 28 | const { year, month } = extractDateData(virtualDate); 29 | onChange( 30 | `${year}-${month.toString().padStart(2, "0")}-${day 31 | .toString() 32 | .padStart(2, "0")}` 33 | ); 34 | }; 35 | 36 | useLayoutEffect(() => { 37 | const displayDate = getDisplayDate(value, min, max, isValid); 38 | 39 | setVirtualDate(displayDate); 40 | 41 | // eslint-disable-next-line 42 | }, [value]); 43 | 44 | // if there is a value and when virtual date is returned back to the same month make that day active 45 | const calendarDisplayDate = 46 | virtualDate.slice(0, 7) === value?.slice(0, 7) ? value : virtualDate; 47 | 48 | return ( 49 |
56 | setVirtualDate(date)} 59 | min={min} 60 | max={max} 61 | lang={lang} 62 | calendarStyles={calendarStyles} 63 | /> 64 | 65 | 73 | 74 | 82 |
83 | ); 84 | }; 85 | 86 | export default DatePickerCalendar; 87 | -------------------------------------------------------------------------------- /src/DatePickerNP/utils/converter.ts: -------------------------------------------------------------------------------- 1 | import { 2 | NEPALI_DATES, 3 | START_ENGLISH_DATE_OF_1978_BS, 4 | } from "../constants/dates"; 5 | import { extractDateData, isValidNepaliDate } from "./dates"; 6 | 7 | // convert english to nepali dates 8 | export const convertADToBS = (englishDate: string) => { 9 | if (!englishDate || typeof englishDate !== "string") return ""; 10 | 11 | try { 12 | const englishDaysDifferenceFrom1978BS = 13 | Math.ceil( 14 | (new Date(englishDate).getTime() - 15 | new Date(START_ENGLISH_DATE_OF_1978_BS).getTime()) / 16 | (86400 * 1000) 17 | ) + 1; 18 | 19 | let nepaliDateCount = 0; 20 | 21 | for (let i = 0; i < NEPALI_DATES.length; i++) { 22 | const { year, months } = NEPALI_DATES[i]; 23 | 24 | for (let j = 0; j < months.length; j++) { 25 | const addedCount = nepaliDateCount + months[j]; 26 | 27 | if (addedCount < englishDaysDifferenceFrom1978BS) { 28 | nepaliDateCount = addedCount; 29 | } else { 30 | const month = (j + 1).toString().padStart(2, "0"); 31 | const today = (englishDaysDifferenceFrom1978BS - nepaliDateCount) 32 | .toString() 33 | .padStart(2, "0"); 34 | 35 | return `${year}-${month}-${today}`; 36 | } 37 | } 38 | } 39 | } catch (e) { 40 | return ""; 41 | } 42 | 43 | return ""; 44 | }; 45 | 46 | // convert nepali to english dates 47 | export const convertBSToAD = (nepaliDate: string) => { 48 | if ( 49 | !nepaliDate || 50 | typeof nepaliDate !== "string" || 51 | !isValidNepaliDate(nepaliDate) 52 | ) { 53 | return ""; 54 | } 55 | 56 | try { 57 | let nepaliDaysDifferenceFrom1978BS = 0; 58 | 59 | const { year, month, day } = extractDateData(nepaliDate); 60 | 61 | for (let i = 0; i < NEPALI_DATES.length; i++) { 62 | const currentNepaliDateData = NEPALI_DATES[i]; 63 | 64 | if (currentNepaliDateData.year === +year) { 65 | for (let j = 0; j < currentNepaliDateData.months.length; j++) { 66 | const currentMonthCount = currentNepaliDateData.months[j]; 67 | 68 | if (j + 1 < +month) { 69 | nepaliDaysDifferenceFrom1978BS += currentMonthCount; 70 | } else { 71 | // break out of loop when month matches 72 | nepaliDaysDifferenceFrom1978BS += +day - 1; 73 | break; 74 | } 75 | } 76 | 77 | // break out of the loop when year matches 78 | break; 79 | } else { 80 | // keep adding the number of days of each months in nepaliDaysDifferenceFrom1978BS 81 | currentNepaliDateData.months.forEach((month) => { 82 | nepaliDaysDifferenceFrom1978BS += month; 83 | }); 84 | } 85 | } 86 | 87 | const englishDate = new Date( 88 | nepaliDaysDifferenceFrom1978BS * 24 * 60 * 60 * 1000 + 89 | new Date(START_ENGLISH_DATE_OF_1978_BS).getTime() 90 | ); 91 | 92 | return englishDate.toISOString().split("T")[0]; 93 | } catch (e) { 94 | return ""; 95 | } 96 | }; 97 | -------------------------------------------------------------------------------- /src/DatePickerNP/components/Calendar/Header/Selector/index.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react"; 2 | 3 | import { SelectorProps } from "../../../../types/Calendar"; 4 | import YearSelector from "./YearSelector"; 5 | import MonthSelector from "./MonthSelector"; 6 | import { 7 | FINAL_YEAR_OF_CALENDAR, 8 | INITIAL_YEAR_OF_CALENDAR, 9 | } from "../../../../constants/calendar"; 10 | import { extractDateData, isValidNepaliDate } from "../../../../utils"; 11 | import { numberConversion } from "../../../../utils/number"; 12 | 13 | const Selector = ({ 14 | year, 15 | handleChange, 16 | setIsDropdownOpen, 17 | min, 18 | max, 19 | lang, 20 | }: SelectorProps) => { 21 | // to detect whether to display year selector or month selector 22 | const [activeSelector, setActiveSelector] = useState<"year" | "month">( 23 | "year" 24 | ); 25 | 26 | // store selected year in the store so that handleChange can be called when selecting the month 27 | const [selectedYear, setSelectedYear] = useState(year); 28 | 29 | let minYear = INITIAL_YEAR_OF_CALENDAR; 30 | let maxYear = FINAL_YEAR_OF_CALENDAR; 31 | let minMonth = 1; 32 | let maxMonth = 12; 33 | 34 | // only change minYear if passed min value is valid 35 | if (min && isValidNepaliDate(min)) { 36 | const { year, month } = extractDateData(min); 37 | minYear = +year; 38 | 39 | if (selectedYear === +year) minMonth = +month; 40 | } 41 | 42 | // only change maxYear if passed max value is valid 43 | if (max && isValidNepaliDate(max)) { 44 | const { year, month } = extractDateData(max); 45 | maxYear = +year; 46 | 47 | if (selectedYear === +year) maxMonth = +month; 48 | } 49 | 50 | // function to handle month change and close the selector 51 | const handleMonthChange = (month: number) => { 52 | handleChange(`${selectedYear}-${month.toString().padStart(2, "0")}-dd`); 53 | setTimeout(() => setIsDropdownOpen(false)); // settimeout is used because the click event is trigger after this and could not find the element which is resulting in the close of the entire calendar 54 | }; 55 | 56 | // close the selector when 'Escape' key is clicked 57 | useEffect(() => { 58 | const handleKeyDown = (event: KeyboardEvent) => { 59 | if (event.key === "Escape") setIsDropdownOpen(false); 60 | }; 61 | 62 | window.addEventListener("keydown", handleKeyDown); 63 | return () => window.removeEventListener("keydown", handleKeyDown); 64 | 65 | // eslint-disable-next-line 66 | }, []); 67 | 68 | const headerText = activeSelector === "year" ? "Select Year" : "Select Month"; 69 | 70 | return ( 71 |
72 |
73 |
74 | {numberConversion(lang, headerText)} 75 |
76 |
77 | 78 | {activeSelector === "year" && ( 79 | 87 | )} 88 | 89 | {activeSelector === "month" && ( 90 | 96 | )} 97 |
98 | ); 99 | }; 100 | 101 | export default Selector; 102 | -------------------------------------------------------------------------------- /src/DatePickerNP/components/Calendar/Header/index.tsx: -------------------------------------------------------------------------------- 1 | import { useState } from "react"; 2 | 3 | import { ArrowLeftIcon, ArrowRightIcon } from "../../Icons"; 4 | import { CalendarHeaderProps } from "../../../types/Calendar"; 5 | import { 6 | FINAL_YEAR_OF_CALENDAR, 7 | INITIAL_YEAR_OF_CALENDAR, 8 | MONTHS_IN_WORDS, 9 | } from "../../../constants/calendar"; 10 | import { 11 | getFormattedDate, 12 | getNextMonth, 13 | getPreviousMonth, 14 | isGreaterThanOrEqualToMinDate, 15 | isLessThanOrEqualToMaxDate, 16 | isValidNepaliDate, 17 | } from "../../../utils"; 18 | import Selector from "./Selector"; 19 | import { numberConversion } from "../../../utils/number"; 20 | 21 | const CalendarHeader = ({ 22 | date, 23 | handleChange, 24 | min, 25 | max, 26 | lang, 27 | }: CalendarHeaderProps) => { 28 | const [isDropdownOpen, setIsDropdownOpen] = useState(false); 29 | 30 | // function which are triggered on left and right arrow click 31 | const handleNext = () => handleChange(getNextMonth(date)); 32 | const handlePrev = () => handleChange(getPreviousMonth(date)); 33 | 34 | const [year, month] = getFormattedDate(date); 35 | 36 | // disable the prev and next arrow button based on the initial and final dates possible on the calendar 37 | let isPrevArrowDisabled = year === INITIAL_YEAR_OF_CALENDAR && month === 1; 38 | let isNextArrowDisabled = year === FINAL_YEAR_OF_CALENDAR && month === 12; 39 | 40 | // also check if prev month has valid days 41 | if (min && isValidNepaliDate(min) && !isPrevArrowDisabled) { 42 | const isGreaterThanMinDate = isGreaterThanOrEqualToMinDate( 43 | getPreviousMonth(date), 44 | min 45 | ); 46 | 47 | isPrevArrowDisabled = !isGreaterThanMinDate; 48 | } 49 | 50 | // also check if next month has valid days 51 | if (max && isValidNepaliDate(max) && !isNextArrowDisabled) { 52 | const isGreaterThanMinDate = isLessThanOrEqualToMaxDate( 53 | getNextMonth(date), 54 | max 55 | ); 56 | 57 | isNextArrowDisabled = !isGreaterThanMinDate; 58 | } 59 | 60 | const headerDisplayText = `${ 61 | MONTHS_IN_WORDS[month - 1]?.[lang === "en" ? "name_en" : "name_np"] 62 | } ${numberConversion(lang, year)}`; 63 | 64 | return ( 65 |
66 |
!isPrevArrowDisabled && handlePrev()} 73 | > 74 | 75 |
76 | 77 |
78 |

setIsDropdownOpen(!isDropdownOpen)} 81 | > 82 | {headerDisplayText} 83 |

84 | 85 | {isDropdownOpen && ( 86 | 94 | )} 95 |
96 | 97 |
!isNextArrowDisabled && handleNext()} 104 | > 105 | 106 |
107 |
108 | ); 109 | }; 110 | 111 | export default CalendarHeader; 112 | -------------------------------------------------------------------------------- /src/DatePickerNP/styles/calendar-header.css: -------------------------------------------------------------------------------- 1 | /* calendar styles */ 2 | .date-picker-calendar { 3 | position: absolute; 4 | top: 20%; 5 | border: 1px solid rgb(226, 226, 226); 6 | box-shadow: 0 0 20px rgb(0, 0, 0, 0.1); 7 | border-radius: 4px; 8 | min-width: 220px; 9 | width: 220px; 10 | min-height: 284px; 11 | height: 284px; 12 | background: white; 13 | padding: 4px 8px; 14 | } 15 | .date-picker-calendar-header { 16 | display: flex; 17 | justify-content: space-between; 18 | align-items: center; 19 | margin: 2px 0; 20 | height: 30px; 21 | line-height: 16px; 22 | } 23 | 24 | .date-picker-calendar-header-arrow { 25 | display: flex; 26 | justify-content: center; 27 | align-items: center; 28 | cursor: pointer; 29 | width: 30px; 30 | height: 30px; 31 | } 32 | .date-picker-calendar-header-arrow.date-picker-calendar-header-arrow-disabled { 33 | opacity: 0.4; 34 | cursor: default; 35 | } 36 | 37 | .date-picker-calendar-header-dropdown-text { 38 | border: 1px solid gray; 39 | padding: 4px 10px; 40 | cursor: pointer; 41 | } 42 | .date-picker-selector-container { 43 | position: absolute; 44 | bottom: 0; 45 | left: 0; 46 | z-index: 1; 47 | display: flex; 48 | flex-direction: column; 49 | width: 100%; 50 | height: 100%; 51 | background: white; 52 | padding: 4px 8px 10px; 53 | } 54 | 55 | .date-picker-selector-header { 56 | display: flex; 57 | align-items: center; 58 | justify-content: center; 59 | height: 34px; 60 | flex-shrink: 0; 61 | } 62 | 63 | /* selector container for month */ 64 | .date-picker-selector-block-container { 65 | display: grid; 66 | grid-template-columns: repeat(3, 1fr); 67 | overflow: hidden; 68 | flex: 1; 69 | } 70 | .date-picker-selector-block-container > div { 71 | display: grid; 72 | place-items: center; 73 | cursor: pointer; 74 | } 75 | .date-picker-selector-block-container > div > div { 76 | padding: 10px 10px; 77 | } 78 | .date-picker-selector-block-container 79 | > div 80 | > div.date-picker-selector-block-selected { 81 | color: white; 82 | background: rgb(2, 118, 156); 83 | } 84 | 85 | .date-picker-selector-block-container 86 | > div.date-picker-selector-block-disabled { 87 | opacity: 0.4; 88 | cursor: default; 89 | } 90 | .date-picker-selector-block-container 91 | > div:hover:not(.date-picker-selector-block-disabled) 92 | > div:not(.date-picker-selector-block-selected) { 93 | background: rgb(226, 226, 226); 94 | } 95 | 96 | /* selector container for year */ 97 | .date-picker-year-selector-block-container { 98 | display: grid; 99 | grid-template-columns: repeat(3, 1fr); 100 | overflow: auto; 101 | margin: 4px 0 2px; 102 | } 103 | 104 | .date-picker-year-selector-block-container > div { 105 | height: 38px; 106 | line-height: 38px; 107 | text-align: center; 108 | cursor: pointer; 109 | } 110 | .date-picker-year-selector-block-container 111 | > div:not( 112 | .date-picker-selector-block-disabled, 113 | .date-picker-year-selector-block-selected 114 | ):hover { 115 | background: rgb(226, 226, 226); 116 | } 117 | .date-picker-year-selector-block-container 118 | > div.date-picker-year-selector-block-selected { 119 | background: rgb(2, 118, 156); 120 | color: white; 121 | } 122 | .date-picker-year-selector-block-container 123 | > div.date-picker-selector-block-disabled { 124 | opacity: 0.4; 125 | cursor: default; 126 | } 127 | 128 | /* scrollbar for the year menu */ 129 | .date-picker-year-selector-block-container::-webkit-scrollbar { 130 | width: 4px; 131 | } 132 | 133 | .date-picker-year-selector-block-container::-webkit-scrollbar-thumb { 134 | background: #888; 135 | border-radius: 4px; 136 | } 137 | 138 | .date-picker-year-selector-block-container::-webkit-scrollbar-thumb:hover { 139 | background: #555; 140 | } 141 | -------------------------------------------------------------------------------- /src/DatePickerNP/components/DatePickerInput.tsx: -------------------------------------------------------------------------------- 1 | import { forwardRef, useEffect } from "react"; 2 | 3 | import { DatePickerInputProps, InputStyles } from "../types/DatePickerInput"; 4 | import { CalendarIcon } from "./Icons"; 5 | import { DEFAULT_CALENDAR_ICON_COLOR } from "../constants/calendar"; 6 | 7 | const DatePickerInput = forwardRef( 8 | ( 9 | { 10 | value, 11 | onChange, 12 | inputContainerStyles, 13 | setIsCalendarOpen, 14 | disabled, 15 | placeholder, 16 | inputElement: passedInputElement, 17 | hasCalendarIcon = true, 18 | calendarIcon, 19 | calendarColor, 20 | }, 21 | ref 22 | ) => { 23 | const focusInputElement = () => { 24 | const inputElement = (ref && 25 | "current" in ref && 26 | ref.current) as HTMLInputElement; 27 | 28 | inputElement?.focus(); 29 | }; 30 | 31 | useEffect(() => { 32 | const inputElement = (ref && 33 | "current" in ref && 34 | ref.current) as HTMLInputElement; 35 | 36 | if (!inputElement) return; 37 | 38 | // open calendar menu when input element is focused 39 | const handleInputFocus = () => { 40 | setIsCalendarOpen(true); 41 | inputElement.setSelectionRange(10, 10); // to point the cursor at the end of the date value 42 | }; 43 | 44 | // open calendar menu when space or enter is pressed in the input element 45 | const handleKeyDown = (event: KeyboardEvent) => { 46 | if (event.key === "Enter" && inputElement.value) { 47 | onChange(inputElement.value); 48 | setIsCalendarOpen(false); 49 | inputElement.blur(); 50 | } else if (event.key === "Tab") { 51 | // when tab is pressed input element is blurred then close the calendar menu 52 | onChange(inputElement.value); 53 | setIsCalendarOpen(false); 54 | } 55 | }; 56 | 57 | inputElement.addEventListener("focus", handleInputFocus); 58 | inputElement.addEventListener("keydown", handleKeyDown); 59 | 60 | passedInputElement && 61 | inputElement.addEventListener("click", handleInputFocus); // only capture "click" event if element is passed from props 62 | 63 | return () => { 64 | inputElement.removeEventListener("focus", handleInputFocus); 65 | inputElement.removeEventListener("keydown", handleKeyDown); 66 | 67 | passedInputElement && 68 | inputElement.removeEventListener("click", handleInputFocus); 69 | }; 70 | 71 | // eslint-disable-next-line 72 | }, []); 73 | 74 | const { height, ...restStyles } = inputContainerStyles as InputStyles; 75 | 76 | return ( 77 | <> 78 | {passedInputElement ? ( 79 |
85 | {passedInputElement} 86 |
87 | ) : ( 88 |
98 | {}, 114 | } 115 | : {})} 116 | /> 117 | 118 | {hasCalendarIcon && ( 119 |
126 | {calendarIcon ?? } 127 |
128 | )} 129 |
130 | )} 131 | 132 | ); 133 | } 134 | ); 135 | 136 | export default DatePickerInput; 137 | -------------------------------------------------------------------------------- /src/DatePickerNP/components/Calendar/Dates/index.tsx: -------------------------------------------------------------------------------- 1 | import { DAYS_OF_WEEK } from "../../../constants/calendar"; 2 | import { NEPALI_DATES } from "../../../constants/dates"; 3 | import { CalendarDatesProps, WeeksProps } from "../../../types/Calendar"; 4 | import { 5 | extractDateData, 6 | getNumberOfDaysInMonth, 7 | getNumberOfDaysInPreviousMonth, 8 | isGreaterThanOrEqualToMinDate, 9 | isLessThanOrEqualToMaxDate, 10 | isValidNepaliDate, 11 | } from "../../../utils"; 12 | import { numberConversion } from "../../../utils/number"; 13 | 14 | const Weeks = ({ lang }: WeeksProps) => { 15 | return ( 16 |
17 | {DAYS_OF_WEEK.map(({ name_en, name_np }) => ( 18 |
{lang === "en" ? name_en : name_np}
19 | ))} 20 |
21 | ); 22 | }; 23 | 24 | const CalendarDates = ({ 25 | date, 26 | handleChange, 27 | min, 28 | max, 29 | lang, 30 | calendarStyles, 31 | }: CalendarDatesProps) => { 32 | const numberOfDays = getNumberOfDaysInMonth(date); 33 | const numberOfDaysInPreviousMonth = getNumberOfDaysInPreviousMonth(date); 34 | 35 | const { year, month, day: selectedDate } = extractDateData(date); 36 | 37 | const startingWeekDay = NEPALI_DATES.find((data) => data.year === +year) 38 | ?.startWeek[+month - 1] as number; 39 | 40 | const prevStartPosition = numberOfDaysInPreviousMonth - startingWeekDay + 2; 41 | 42 | const totalNextMonthDays = (numberOfDays + startingWeekDay - 1) % 7; 43 | let currentNextMonthDaysCount = 44 | totalNextMonthDays > 0 ? 7 - totalNextMonthDays : 0; 45 | 46 | const totalCurrentRows = 47 | (startingWeekDay - 48 | 1 + 49 | numberOfDays + 50 | (totalNextMonthDays > 0 ? 7 - totalNextMonthDays : 0)) / 51 | 7; 52 | 53 | // Add one additional row i.e. 7 days, if there are only 5 rows 54 | // to make the calendar height consistent 55 | if (totalCurrentRows === 5) 56 | currentNextMonthDaysCount = currentNextMonthDaysCount + 7; 57 | 58 | return ( 59 | <> 60 | 61 | 62 |
63 | {/* Previous Months days which are in the same first week of current month */} 64 | {Array.from({ length: startingWeekDay - 1 }).map((_, index) => ( 65 |
66 | {numberConversion( 67 | lang, 68 | numberOfDaysInPreviousMonth > 0 69 | ? prevStartPosition + index 70 | : undefined 71 | )} 72 |
73 | ))} 74 | 75 | {Array.from({ length: numberOfDays }).map((_, index) => { 76 | const day = index + 1; 77 | 78 | let isDateDisabled = false; 79 | 80 | // check if min and max dates are passed 81 | // this function is causing lagging issue due to many renders and new check for every months 82 | if (min && isValidNepaliDate(min)) { 83 | isDateDisabled = !isGreaterThanOrEqualToMinDate( 84 | date.slice(0, 8) + day, 85 | min 86 | ); 87 | } 88 | 89 | // only check the max date if current date is not disabled by min date only 90 | if (!isDateDisabled && max && isValidNepaliDate(max)) { 91 | isDateDisabled = !isLessThanOrEqualToMaxDate( 92 | date.slice(0, 8) + day, 93 | max 94 | ); 95 | } 96 | 97 | const isSelected = day === +selectedDate; 98 | 99 | return ( 100 |
!isDateDisabled && handleChange(day)} 106 | style={{ 107 | ...(isSelected 108 | ? { 109 | color: calendarStyles?.dates?.activeTextColor, 110 | backgroundColor: 111 | calendarStyles?.dates?.activeBackgroundColor, 112 | } 113 | : { 114 | ["--date-picker-np-hover-color" as string]: 115 | calendarStyles?.dates?.hoverBackgroundColor, 116 | }), 117 | }} 118 | > 119 | {numberConversion(lang, day)} 120 |
121 | ); 122 | })} 123 | 124 | {/* Upcoming Months days which are in the same last week of current month */} 125 | {Array.from({ 126 | length: currentNextMonthDaysCount, 127 | }).map((_, index) => ( 128 |
129 | {numberConversion(lang, index + 1)} 130 |
131 | ))} 132 |
133 | 134 | ); 135 | }; 136 | 137 | export default CalendarDates; 138 | -------------------------------------------------------------------------------- /src/DatePickerNP/DatePickerNP.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useLayoutEffect, useRef, useState } from "react"; 2 | 3 | import DatePickerInput from "./components/DatePickerInput"; 4 | import DatePickerCalendar from "./components/Calendar"; 5 | import { DatePickerNPProps } from "./types/DatePickerNP"; 6 | import { 7 | DEFAULT_INPUT_CONTAINER_BACKGROUND, 8 | DEFAULT_INPUT_HEIGHT, 9 | } from "./constants/calendar"; 10 | import { 11 | calculateCalendarPosition, 12 | clickEvent, 13 | formatDate, 14 | getMenuTopPosition, 15 | isValidNepaliDate, 16 | liesInBetween, 17 | } from "./utils"; 18 | 19 | import "./styles/index.css"; 20 | import "./styles/calendar-dates.css"; 21 | import "./styles/calendar-header.css"; 22 | import "./styles/calendar-footer.css"; 23 | 24 | const DatePickerNP = ({ 25 | value, 26 | onChange, 27 | min, 28 | max, 29 | disabled, 30 | placeholder, 31 | inputElement, 32 | inputContainerStyles = {}, 33 | calendarStyles = {}, 34 | hasCalendarIcon, 35 | calendarIcon, 36 | calendarColor, 37 | lang = "en", 38 | menuPosition = "auto", 39 | position = "absolute", 40 | }: DatePickerNPProps) => { 41 | const containerRef = useRef(null); 42 | const inputRef = useRef(null); 43 | 44 | const [coordinates, setCoordinates] = useState({ 45 | x: 0, 46 | y: 0, 47 | }); 48 | 49 | const [isCalendarOpen, setIsCalendarOpen] = useState(false); 50 | 51 | // function to change the date and close the calendar menu 52 | const handleDateChange = (date?: string) => { 53 | if (disabled) return; 54 | 55 | const formattedDate = formatDate(date); 56 | 57 | onChange( 58 | liesInBetween(formattedDate as string, min, max) ? formattedDate : "" 59 | ); 60 | setIsCalendarOpen(false); 61 | 62 | if (inputRef.current) inputRef.current.value = formattedDate ?? ""; 63 | }; 64 | 65 | // change the position of the calendar menu when browser is resized 66 | useLayoutEffect(() => { 67 | const handleScrollAndResize = () => { 68 | if (!isCalendarOpen) return; 69 | 70 | const { x, y } = calculateCalendarPosition( 71 | containerRef?.current as HTMLDivElement, 72 | position 73 | ); 74 | 75 | setCoordinates({ x, y }); 76 | }; 77 | 78 | handleScrollAndResize(); 79 | 80 | window.addEventListener("resize", handleScrollAndResize, true); 81 | window.addEventListener("scroll", handleScrollAndResize, true); 82 | return () => { 83 | window.removeEventListener("resize", handleScrollAndResize, true); 84 | window.removeEventListener("scroll", handleScrollAndResize, true); 85 | }; 86 | }, [isCalendarOpen, position]); 87 | 88 | useEffect(() => { 89 | const input = inputRef?.current as HTMLInputElement; 90 | const container = containerRef?.current as HTMLDivElement; 91 | 92 | if (!input || !isCalendarOpen) return; 93 | 94 | const handleClick = (event: MouseEvent) => { 95 | const currentValue = clickEvent({ 96 | event, 97 | container, 98 | input, 99 | }); 100 | 101 | if (currentValue !== undefined) { 102 | if (currentValue !== value) handleDateChange(currentValue); 103 | else setIsCalendarOpen(false); 104 | } 105 | }; 106 | 107 | window.addEventListener("mousedown", handleClick); 108 | return () => { 109 | window.removeEventListener("mousedown", handleClick); 110 | }; 111 | 112 | // eslint-disable-next-line 113 | }, [isCalendarOpen]); 114 | 115 | useEffect(() => { 116 | if (inputRef.current) { 117 | inputRef.current.value = isValidNepaliDate(value) ? value ?? "" : ""; 118 | } 119 | // eslint-disable-next-line 120 | }, [value]); 121 | 122 | const inputContainerHeight = 123 | inputContainerStyles?.height || DEFAULT_INPUT_HEIGHT; 124 | 125 | const top = getMenuTopPosition( 126 | menuPosition, 127 | coordinates.y, 128 | inputContainerHeight, 129 | position 130 | ); 131 | 132 | return ( 133 |
140 | 159 | 160 | {!disabled && isCalendarOpen && ( 161 | 177 | )} 178 |
179 | ); 180 | }; 181 | 182 | export default DatePickerNP; 183 | -------------------------------------------------------------------------------- /src/DatePickerNP/utils/dates.ts: -------------------------------------------------------------------------------- 1 | import { 2 | NEPALI_DATES, 3 | START_ENGLISH_DATE_OF_1978_BS, 4 | } from "../constants/dates"; 5 | 6 | // helper function to return year, month and day 7 | export const extractDateData = (date: string) => { 8 | try { 9 | const [year, month, day] = date.split("-"); 10 | 11 | return { 12 | year, 13 | month, 14 | day, 15 | }; 16 | } catch (e) { 17 | return { 18 | year: "yyyy", 19 | month: "mm", 20 | day: "dd", 21 | }; 22 | } 23 | }; 24 | 25 | // helper function to check is passed date is valid nepali date 26 | export const isValidNepaliDate = (date?: string) => { 27 | if (!date) return false; 28 | 29 | try { 30 | const { year, month, day } = extractDateData(date); 31 | 32 | const activeYear = NEPALI_DATES.find(({ year: year1 }) => year1 === +year); 33 | 34 | // if year is not in the list, date is not valid 35 | if (!activeYear) return false; 36 | 37 | // if day lies between 1 and total days count in month; 38 | return (+day >= 1 && +day <= activeYear.months[+month - 1]) || day === "dd"; 39 | } catch (e) { 40 | return false; 41 | } 42 | }; 43 | 44 | // helper function to get number of days in certain month 45 | export const getNumberOfDaysInMonth = (date: string) => { 46 | try { 47 | const { year, month } = extractDateData(date); 48 | 49 | const activeData = NEPALI_DATES.find(({ year: year1 }) => year1 === +year); 50 | 51 | if (!activeData) return 0; 52 | 53 | return activeData.months[+month - 1]; 54 | } catch (e) { 55 | return 0; 56 | } 57 | }; 58 | 59 | // helper function to get number of days in previous month 60 | export const getNumberOfDaysInPreviousMonth = (date: string) => { 61 | try { 62 | const { year, month } = extractDateData(date); 63 | 64 | // if the current month is baisakh 65 | if (+month === 1) { 66 | if (+year > NEPALI_DATES[0].year) { 67 | return getNumberOfDaysInMonth(`${+year - 1}-12-dd`); // since number of day in months is not dependent in day, value 'dd' is passed 68 | } else return 0; 69 | } 70 | 71 | return getNumberOfDaysInMonth(`${year}-${+month - 1}-dd`); 72 | } catch (e) { 73 | return 0; 74 | } 75 | }; 76 | 77 | // helper function to move to previous month 78 | export const getPreviousMonth = (date: string) => { 79 | try { 80 | const { year, month } = extractDateData(date); 81 | 82 | if (+month === 1) { 83 | if (+year > NEPALI_DATES[0].year) { 84 | return `${+year - 1}-12-dd`; 85 | } 86 | } 87 | 88 | return `${year}-${(+month - 1).toString().padStart(2, "0")}-dd`; 89 | } catch (e) { 90 | return ""; 91 | } 92 | }; 93 | 94 | // helper function to move to next month 95 | export const getNextMonth = (date: string) => { 96 | try { 97 | const { year, month } = extractDateData(date); 98 | 99 | if (+month === 12) { 100 | if (+year < NEPALI_DATES[NEPALI_DATES.length - 1].year) { 101 | return `${+year + 1}-01-dd`; 102 | } 103 | } 104 | 105 | return `${year}-${(+month + 1).toString().padStart(2, "0")}-dd`; 106 | } catch (e) { 107 | return ""; 108 | } 109 | }; 110 | 111 | // helper function to get today nepali date 112 | export const getTodayBSDate = () => { 113 | const englishDaysDifferenceFrom1978BS = Math.ceil( 114 | (new Date().getTime() - new Date(START_ENGLISH_DATE_OF_1978_BS).getTime()) / 115 | (86400 * 1000) 116 | ); 117 | 118 | let nepaliDateCountUptoTodayEnglishDate = 0; 119 | 120 | for (let i = 0; i < NEPALI_DATES.length; i++) { 121 | const { year, months } = NEPALI_DATES[i]; 122 | 123 | for (let j = 0; j < months.length; j++) { 124 | const addedCount = nepaliDateCountUptoTodayEnglishDate + months[j]; 125 | 126 | if (addedCount < englishDaysDifferenceFrom1978BS) { 127 | nepaliDateCountUptoTodayEnglishDate = addedCount; 128 | } else { 129 | const month = (j + 1).toString().padStart(2, "0"); 130 | const today = ( 131 | englishDaysDifferenceFrom1978BS - nepaliDateCountUptoTodayEnglishDate 132 | ) 133 | .toString() 134 | .padStart(2, "0"); 135 | 136 | return `${year}-${month}-${today}`; 137 | } 138 | } 139 | } 140 | 141 | return ""; 142 | }; 143 | 144 | // helper function to detect if given date is greater than or equal to min date 145 | // to disable dates which are less than min dates 146 | export const isGreaterThanOrEqualToMinDate = ( 147 | date: string, 148 | minDate: string 149 | ) => { 150 | const { year: year1, month: month1, day: day1 } = extractDateData(date); 151 | const { year: year2, month: month2, day: day2 } = extractDateData(minDate); 152 | 153 | const isDayNotValid = isNaN(+day1) || isNaN(+day2); 154 | 155 | if (year1 === year2) { 156 | if (month1 === month2) { 157 | return isDayNotValid ? true : +day1 >= +day2; 158 | } else return +month1 >= +month2; 159 | } else return +year1 >= +year2; 160 | }; 161 | 162 | // helper function to detect if given date is greater than or equal to min date 163 | // to disable dates which are greater than max dates 164 | export const isLessThanOrEqualToMaxDate = (date: string, maxDate: string) => { 165 | const { year: year1, month: month1, day: day1 } = extractDateData(date); 166 | const { year: year2, month: month2, day: day2 } = extractDateData(maxDate); 167 | 168 | const isDayNotValid = isNaN(+day1) || isNaN(+day2); 169 | 170 | if (year1 === year2) { 171 | if (month1 === month2) { 172 | return isDayNotValid ? true : +day1 <= +day2; 173 | } else return +month1 <= +month2; 174 | } else return +year1 <= +year2; 175 | }; 176 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # date-picker-np 2 | 3 | A lightweight and customizable Nepali Date Picker component for React, enabling users to select dates using the Nepali calendar. This component behaves similarly to the native HTML ``, making it easy to integrate into your React applications with full support for Nepali dates. It uses only CSS and core Javascript logic, with no external dependencies. 4 | 5 | ![Output](https://github.com/user-attachments/assets/692ea094-498e-49c6-a87c-0aa9891aed51) 6 | 7 | ## Installation 8 | 9 | Install the package using npm: 10 | 11 | ```bash 12 | npm install date-picker-np 13 | ``` 14 | 15 | or using yarn: 16 | 17 | ```bash 18 | yarn add date-picker-np 19 | ``` 20 | 21 | ## Usage 22 | 23 | Here's a basic example of how to use the date-picker-np in your React project: 24 | 25 | ```jsx 26 | import React, { useState } from "react"; 27 | import DatePickerNP from "date-picker-np"; 28 | 29 | const App = () => { 30 | const [selectedDate, setSelectedDate] = useState(""); 31 | 32 | return ( 33 | setSelectedDate(date)} 36 | /> 37 | ); 38 | }; 39 | 40 | export default App; 41 | ``` 42 | 43 | ## Props 44 | 45 | | Prop | Type | Description | Required | 46 | | ---------------------- | ----------------------------- | ---------------------------------------------------------------------------------------------------- | -------- | 47 | | `value` | `string` | The current date value in `YYYY-MM-DD` format. | Yes | 48 | | `onChange` | `(date: string) => void` | Callback function triggered when the date changes. Returns the selected date in `YYYY-MM-DD` format. | Yes | 49 | | `disabled` | `boolean` | Disables the date picker input if set to `true`. | No | 50 | | `placeholder` | `string` | Placeholder text for the input field. | No | 51 | | `min` | `string` | Minimum selectable date (in `YYYY-MM-DD` format). | No | 52 | | `max` | `string` | Maximum selectable date (in `YYYY-MM-DD` format). | No | 53 | | `lang` | `'en' \| 'np'` | Sets the language for the date picker. Defaults to `'en'`. | No | 54 | | `inputElement` | `React.ReactNode` | Custom React node to render as the input field. | No | 55 | | `inputContainerStyles` | `InputStyles` | Custom styles for the input container (see details below). | No | 56 | | `menuPosition` | `'auto' \| 'top' \| 'bottom'` | Specifies the placement of the calendar dropdown menu. Defaults to `'auto'`. | No | 57 | | `position` | `'absolute' \| 'fixed'` | Specifies the position of the calendar dropdown menu. Defaults to `'absolute'`. | No | 58 | | `hasCalendarIcon` | `boolean` | Shows a calendar icon inside the input field if set to `true`. | No | 59 | | `calendarIcon` | `React.ReactNode` | Custom React node to render as the calendar icon. | No | 60 | | `calendarColor` | `string` | Specifies the color of the calendar icon. | No | 61 | | `calendarStyles` | `CalendarStyles` | Custom styles for calendar dates and footer (see details below). | No | 62 | 63 | ### InputStyles 64 | 65 | The `inputContainerStyles` prop accepts the following properties: 66 | 67 | - **border**: Sets the border style of the input. 68 | - **borderRadius**: Sets the border-radius of the input. 69 | - **width**: Specifies the width of the input field. 70 | - **height**: Specifies the width of the input field. 71 | - **padding**: Sets the padding inside the input field. 72 | - **background**: Defines the background color of the input. 73 | - **lineHeight**: Sets the lineHeight of text inside the input field. 74 | - **color**: Defines the color of text inside the input field. 75 | - **fontSize**: Sets the font-size of text inside the input field. 76 | 77 | ### CalendarStyles 78 | 79 | The `calendarStyles` prop accepts the following properties: 80 | 81 | #### `dates` 82 | 83 | Styles for calendar date cells. 84 | 85 | - **`hoverBackgroundColor`**: Background color when hovering over a date. 86 | - **`activeBackgroundColor`**: Background color of the selected date. 87 | - **`activeTextColor`**: Text color of the selected date. 88 | 89 | #### `footer` 90 | 91 | Styles for the footer section of the calendar. 92 | 93 | - **`textColor`**: Text color of the footer. 94 | 95 | **Example Usage:** 96 | 97 | ```jsx 98 | 110 | ``` 111 | 112 | ### Default Input Height and Minimum Height 113 | 114 | - The default height of the input is 32px. 115 | - The minimum height of the input is 28px. 116 | 117 | ## Utility Functions 118 | 119 | The package also includes two utility functions for date conversion: 120 | 121 | ### `convertADToBS` 122 | 123 | Converts english date to nepali date (AD to BS). 124 | 125 | **Parameters:** 126 | 127 | - `date: string` — A date string in `YYYY-MM-DD` format. 128 | 129 | **Returns:** 130 | 131 | - `string` — The equivalent BS date in `YYYY-MM-DD` format. 132 | 133 | **Example:** 134 | 135 | ```js 136 | import { convertADToBS } from "date-picker-np"; 137 | 138 | const bsDate = convertADToBS("2010-10-12"); 139 | console.log(bsDate); // Output: equivalent BS date 140 | ``` 141 | 142 | ### `convertBSToAD` 143 | 144 | Converts nepali date to english date (BS to AD). 145 | 146 | **Parameters:** 147 | 148 | - `date: string` — A date string in `YYYY-MM-DD` format. 149 | 150 | **Returns:** 151 | 152 | - `string` — The equivalent AD date in `YYYY-MM-DD` format. 153 | 154 | **Example:** 155 | 156 | ```js 157 | import { convertBSToAD } from "date-picker-np"; 158 | 159 | const adDate = convertBSToAD("2074-04-12"); 160 | console.log(adDate); // Output: equivalent AD date 161 | ``` 162 | 163 | ### `getTodayBSDate` 164 | 165 | **Parameters:** 166 | 167 | - No parameters needed. 168 | 169 | **Returns:** 170 | 171 | - `string` — Today BS date in `YYYY-MM-DD` format. 172 | 173 | **Example:** 174 | 175 | ```js 176 | import { getTodayBSDate } from "date-picker-np"; 177 | 178 | const todayDate = getTodayBSDate(); 179 | console.log(todayDate); // Output: today BS date 180 | ``` 181 | 182 | ## Supported Nepali Date Range 183 | 184 | The date picker supports selecting dates within the range: 185 | 186 | - **Minimum Date**: `1978-01-01` 187 | - **Maximum Date**: `2099-12-31` 188 | 189 | ## License 190 | 191 | This project is licensed under the MIT License - see the [LICENSE](https://github.com/DipendraPaudel/date-picker-np/blob/main/LICENSE) file for details. 192 | 193 | ## Support 194 | 195 | If you have any questions, issues, or feature requests, please open an issue in the [GitHub repository](https://github.com/DipendraPaudel/date-picker-np). 196 | -------------------------------------------------------------------------------- /src/DatePickerNP/constants/dates.ts: -------------------------------------------------------------------------------- 1 | import { NepaliDatesType } from "../types/Constant"; 2 | 3 | export const START_WEEK_DAY_OF_1978 = 4; 4 | export const START_ENGLISH_DATE_OF_1978_BS = "1921-04-13"; 5 | 6 | const ALL_NEPALI_DATES: Partial[] = [ 7 | { year: 1978, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 8 | { year: 1979, months: [31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30] }, 9 | { year: 1980, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31] }, 10 | { year: 1981, months: [31, 31, 31, 32, 31, 31, 29, 30, 30, 29, 30, 30] }, 11 | { year: 1982, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 12 | { year: 1983, months: [31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30] }, 13 | { year: 1984, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31] }, 14 | { year: 1985, months: [31, 31, 31, 32, 31, 31, 29, 30, 30, 29, 30, 30] }, 15 | { year: 1986, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 16 | { year: 1987, months: [31, 32, 31, 32, 31, 30, 30, 29, 30, 29, 30, 30] }, 17 | { year: 1988, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31] }, 18 | { year: 1989, months: [31, 31, 31, 32, 31, 31, 29, 30, 30, 29, 30, 30] }, 19 | { year: 1990, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 20 | { year: 1991, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 30] }, 21 | { year: 1992, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31] }, 22 | { year: 1993, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 23 | { year: 1994, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 24 | { year: 1995, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 30] }, 25 | { year: 1996, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31] }, 26 | { year: 1997, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 27 | { year: 1998, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 28 | { year: 1999, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31] }, 29 | { year: 2000, months: [30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31] }, 30 | { year: 2001, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 31 | { year: 2002, months: [31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30] }, 32 | { year: 2003, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31] }, 33 | { year: 2004, months: [30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31] }, 34 | { year: 2005, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 35 | { year: 2006, months: [31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30] }, 36 | { year: 2007, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31] }, 37 | { year: 2008, months: [31, 31, 31, 32, 31, 31, 29, 30, 30, 29, 29, 31] }, 38 | { year: 2009, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 39 | { year: 2010, months: [31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30] }, 40 | { year: 2011, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31] }, 41 | { year: 2012, months: [31, 31, 31, 32, 31, 31, 29, 30, 30, 29, 30, 30] }, 42 | { year: 2013, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 43 | { year: 2014, months: [31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30] }, 44 | { year: 2015, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31] }, 45 | { year: 2016, months: [31, 31, 31, 32, 31, 31, 29, 30, 30, 29, 30, 30] }, 46 | { year: 2017, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 47 | { year: 2018, months: [31, 32, 31, 32, 31, 30, 30, 29, 30, 29, 30, 30] }, 48 | { year: 2019, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31] }, 49 | { year: 2020, months: [31, 31, 31, 32, 31, 31, 30, 29, 30, 29, 30, 30] }, 50 | { year: 2021, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 51 | { year: 2022, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 30] }, 52 | { year: 2023, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31] }, 53 | { year: 2024, months: [31, 31, 31, 32, 31, 31, 30, 29, 30, 29, 30, 30] }, 54 | { year: 2025, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 55 | { year: 2026, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31] }, 56 | { year: 2027, months: [30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31] }, 57 | { year: 2028, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 58 | { year: 2029, months: [31, 31, 32, 31, 32, 30, 30, 29, 30, 29, 30, 30] }, 59 | { year: 2030, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31] }, 60 | { year: 2031, months: [30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31] }, 61 | { year: 2032, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 62 | { year: 2033, months: [31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30] }, 63 | { year: 2034, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31] }, 64 | { year: 2035, months: [30, 32, 31, 32, 31, 31, 29, 30, 30, 29, 29, 31] }, 65 | { year: 2036, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 66 | { year: 2037, months: [31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30] }, 67 | { year: 2038, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31] }, 68 | { year: 2039, months: [31, 31, 31, 32, 31, 31, 29, 30, 30, 29, 30, 30] }, 69 | { year: 2040, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 70 | { year: 2041, months: [31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30] }, 71 | { year: 2042, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31] }, 72 | { year: 2043, months: [31, 31, 31, 32, 31, 31, 29, 30, 30, 29, 30, 30] }, 73 | { year: 2044, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 74 | { year: 2045, months: [31, 32, 31, 32, 31, 30, 30, 29, 30, 29, 30, 30] }, 75 | { year: 2046, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31] }, 76 | { year: 2047, months: [31, 31, 31, 32, 31, 31, 30, 29, 30, 29, 30, 30] }, 77 | { year: 2048, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 78 | { year: 2049, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 30] }, 79 | { year: 2050, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31] }, 80 | { year: 2051, months: [31, 31, 31, 32, 31, 31, 30, 29, 30, 29, 30, 30] }, 81 | { year: 2052, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 82 | { year: 2053, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 30] }, 83 | { year: 2054, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31] }, 84 | { year: 2055, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 85 | { year: 2056, months: [31, 31, 32, 31, 32, 30, 30, 29, 30, 29, 30, 30] }, 86 | { year: 2057, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31] }, 87 | { year: 2058, months: [30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31] }, 88 | { year: 2059, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 89 | { year: 2060, months: [31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30] }, 90 | { year: 2061, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31] }, 91 | { year: 2062, months: [31, 31, 31, 32, 31, 31, 29, 30, 29, 30, 29, 31] }, 92 | { year: 2063, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 93 | { year: 2064, months: [31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30] }, 94 | { year: 2065, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31] }, 95 | { year: 2066, months: [31, 31, 31, 32, 31, 31, 29, 30, 30, 29, 29, 31] }, 96 | { year: 2067, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 97 | { year: 2068, months: [31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30] }, 98 | { year: 2069, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31] }, 99 | { year: 2070, months: [31, 31, 31, 32, 31, 31, 29, 30, 30, 29, 30, 30] }, 100 | { year: 2071, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 101 | { year: 2072, months: [31, 32, 31, 32, 31, 30, 30, 29, 30, 29, 30, 30] }, 102 | { year: 2073, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31] }, 103 | { year: 2074, months: [31, 31, 31, 32, 31, 31, 30, 29, 30, 29, 30, 30] }, 104 | { year: 2075, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 105 | { year: 2076, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 30] }, 106 | { year: 2077, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31] }, 107 | { year: 2078, months: [31, 31, 31, 32, 31, 31, 30, 29, 30, 29, 30, 30] }, 108 | { year: 2079, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30] }, 109 | { year: 2080, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 30] }, 110 | { year: 2081, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31] }, 111 | { year: 2082, months: [31, 31, 31, 32, 31, 30, 30, 30, 29, 30, 30, 30] }, 112 | { year: 2083, months: [31, 31, 32, 31, 31, 30, 30, 30, 29, 30, 30, 30] }, 113 | { year: 2084, months: [31, 31, 32, 31, 31, 30, 30, 30, 29, 30, 30, 30] }, 114 | { year: 2085, months: [31, 32, 31, 32, 30, 31, 30, 30, 29, 30, 30, 30] }, 115 | { year: 2086, months: [30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 30, 30] }, 116 | { year: 2087, months: [31, 31, 32, 31, 31, 31, 30, 30, 30, 30, 30, 30] }, 117 | { year: 2088, months: [30, 31, 32, 32, 30, 31, 30, 30, 29, 30, 30, 30] }, 118 | { year: 2089, months: [30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 30, 30] }, 119 | { year: 2090, months: [30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 30, 30] }, 120 | { year: 2091, months: [31, 31, 32, 31, 31, 31, 30, 30, 29, 30, 30, 30] }, 121 | { year: 2092, months: [30, 31, 32, 32, 31, 30, 30, 30, 29, 30, 30, 30] }, 122 | { year: 2093, months: [30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 30, 30] }, 123 | { year: 2094, months: [31, 31, 32, 31, 31, 30, 30, 30, 29, 30, 30, 30] }, 124 | { year: 2095, months: [31, 31, 32, 31, 31, 31, 30, 29, 30, 30, 30, 30] }, 125 | { year: 2096, months: [30, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30] }, 126 | { year: 2097, months: [31, 32, 31, 31, 31, 30, 30, 30, 29, 30, 30, 30] }, 127 | { year: 2098, months: [31, 31, 32, 31, 31, 31, 29, 30, 29, 30, 29, 31] }, 128 | { year: 2099, months: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31] }, 129 | ]; 130 | 131 | export const getStartWeek = () => { 132 | let lastWeekDay = START_WEEK_DAY_OF_1978; 133 | 134 | for (let i = 0; i < ALL_NEPALI_DATES.length; i++) { 135 | const currentData = ALL_NEPALI_DATES[i] as NepaliDatesType; 136 | 137 | ALL_NEPALI_DATES[i].startWeek = currentData.months.map((month) => { 138 | const startWeekDay = lastWeekDay; 139 | lastWeekDay = (month + startWeekDay) % 7; 140 | lastWeekDay = lastWeekDay === 0 ? 7 : lastWeekDay; 141 | 142 | return startWeekDay; 143 | }); 144 | } 145 | }; 146 | 147 | getStartWeek(); 148 | 149 | export const NEPALI_DATES = ALL_NEPALI_DATES as NepaliDatesType[]; 150 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@ampproject/remapping@^2.2.0": 6 | version "2.3.0" 7 | resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" 8 | integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== 9 | dependencies: 10 | "@jridgewell/gen-mapping" "^0.3.5" 11 | "@jridgewell/trace-mapping" "^0.3.24" 12 | 13 | "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0": 14 | version "7.26.2" 15 | resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz" 16 | integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== 17 | dependencies: 18 | "@babel/helper-validator-identifier" "^7.25.9" 19 | js-tokens "^4.0.0" 20 | picocolors "^1.0.0" 21 | 22 | "@babel/compat-data@^7.25.9": 23 | version "7.26.2" 24 | resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz" 25 | integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg== 26 | 27 | "@babel/core@^7.25.2": 28 | version "7.26.0" 29 | resolved "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz" 30 | integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== 31 | dependencies: 32 | "@ampproject/remapping" "^2.2.0" 33 | "@babel/code-frame" "^7.26.0" 34 | "@babel/generator" "^7.26.0" 35 | "@babel/helper-compilation-targets" "^7.25.9" 36 | "@babel/helper-module-transforms" "^7.26.0" 37 | "@babel/helpers" "^7.26.0" 38 | "@babel/parser" "^7.26.0" 39 | "@babel/template" "^7.25.9" 40 | "@babel/traverse" "^7.25.9" 41 | "@babel/types" "^7.26.0" 42 | convert-source-map "^2.0.0" 43 | debug "^4.1.0" 44 | gensync "^1.0.0-beta.2" 45 | json5 "^2.2.3" 46 | semver "^6.3.1" 47 | 48 | "@babel/generator@^7.25.9", "@babel/generator@^7.26.0": 49 | version "7.26.2" 50 | resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz" 51 | integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw== 52 | dependencies: 53 | "@babel/parser" "^7.26.2" 54 | "@babel/types" "^7.26.0" 55 | "@jridgewell/gen-mapping" "^0.3.5" 56 | "@jridgewell/trace-mapping" "^0.3.25" 57 | jsesc "^3.0.2" 58 | 59 | "@babel/helper-compilation-targets@^7.25.9": 60 | version "7.25.9" 61 | resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz" 62 | integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== 63 | dependencies: 64 | "@babel/compat-data" "^7.25.9" 65 | "@babel/helper-validator-option" "^7.25.9" 66 | browserslist "^4.24.0" 67 | lru-cache "^5.1.1" 68 | semver "^6.3.1" 69 | 70 | "@babel/helper-module-imports@^7.25.9": 71 | version "7.25.9" 72 | resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz" 73 | integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== 74 | dependencies: 75 | "@babel/traverse" "^7.25.9" 76 | "@babel/types" "^7.25.9" 77 | 78 | "@babel/helper-module-transforms@^7.26.0": 79 | version "7.26.0" 80 | resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz" 81 | integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== 82 | dependencies: 83 | "@babel/helper-module-imports" "^7.25.9" 84 | "@babel/helper-validator-identifier" "^7.25.9" 85 | "@babel/traverse" "^7.25.9" 86 | 87 | "@babel/helper-plugin-utils@^7.25.9": 88 | version "7.25.9" 89 | resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz" 90 | integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== 91 | 92 | "@babel/helper-string-parser@^7.25.9": 93 | version "7.25.9" 94 | resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz" 95 | integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== 96 | 97 | "@babel/helper-validator-identifier@^7.25.9": 98 | version "7.25.9" 99 | resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz" 100 | integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== 101 | 102 | "@babel/helper-validator-option@^7.25.9": 103 | version "7.25.9" 104 | resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz" 105 | integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== 106 | 107 | "@babel/helpers@^7.26.0": 108 | version "7.26.0" 109 | resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz" 110 | integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== 111 | dependencies: 112 | "@babel/template" "^7.25.9" 113 | "@babel/types" "^7.26.0" 114 | 115 | "@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2": 116 | version "7.26.2" 117 | resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz" 118 | integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ== 119 | dependencies: 120 | "@babel/types" "^7.26.0" 121 | 122 | "@babel/plugin-transform-react-jsx-self@^7.24.7": 123 | version "7.25.9" 124 | resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz" 125 | integrity sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg== 126 | dependencies: 127 | "@babel/helper-plugin-utils" "^7.25.9" 128 | 129 | "@babel/plugin-transform-react-jsx-source@^7.24.7": 130 | version "7.25.9" 131 | resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz" 132 | integrity sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg== 133 | dependencies: 134 | "@babel/helper-plugin-utils" "^7.25.9" 135 | 136 | "@babel/template@^7.25.9": 137 | version "7.25.9" 138 | resolved "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz" 139 | integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== 140 | dependencies: 141 | "@babel/code-frame" "^7.25.9" 142 | "@babel/parser" "^7.25.9" 143 | "@babel/types" "^7.25.9" 144 | 145 | "@babel/traverse@^7.25.9": 146 | version "7.25.9" 147 | resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz" 148 | integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== 149 | dependencies: 150 | "@babel/code-frame" "^7.25.9" 151 | "@babel/generator" "^7.25.9" 152 | "@babel/parser" "^7.25.9" 153 | "@babel/template" "^7.25.9" 154 | "@babel/types" "^7.25.9" 155 | debug "^4.3.1" 156 | globals "^11.1.0" 157 | 158 | "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0": 159 | version "7.26.0" 160 | resolved "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz" 161 | integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== 162 | dependencies: 163 | "@babel/helper-string-parser" "^7.25.9" 164 | "@babel/helper-validator-identifier" "^7.25.9" 165 | 166 | "@esbuild/aix-ppc64@0.21.5": 167 | version "0.21.5" 168 | resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" 169 | integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== 170 | 171 | "@esbuild/android-arm64@0.21.5": 172 | version "0.21.5" 173 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" 174 | integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== 175 | 176 | "@esbuild/android-arm@0.21.5": 177 | version "0.21.5" 178 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" 179 | integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== 180 | 181 | "@esbuild/android-x64@0.21.5": 182 | version "0.21.5" 183 | resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" 184 | integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== 185 | 186 | "@esbuild/darwin-arm64@0.21.5": 187 | version "0.21.5" 188 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" 189 | integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== 190 | 191 | "@esbuild/darwin-x64@0.21.5": 192 | version "0.21.5" 193 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" 194 | integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== 195 | 196 | "@esbuild/freebsd-arm64@0.21.5": 197 | version "0.21.5" 198 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" 199 | integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== 200 | 201 | "@esbuild/freebsd-x64@0.21.5": 202 | version "0.21.5" 203 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" 204 | integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== 205 | 206 | "@esbuild/linux-arm64@0.21.5": 207 | version "0.21.5" 208 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" 209 | integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== 210 | 211 | "@esbuild/linux-arm@0.21.5": 212 | version "0.21.5" 213 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" 214 | integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== 215 | 216 | "@esbuild/linux-ia32@0.21.5": 217 | version "0.21.5" 218 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" 219 | integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== 220 | 221 | "@esbuild/linux-loong64@0.21.5": 222 | version "0.21.5" 223 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" 224 | integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== 225 | 226 | "@esbuild/linux-mips64el@0.21.5": 227 | version "0.21.5" 228 | resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" 229 | integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== 230 | 231 | "@esbuild/linux-ppc64@0.21.5": 232 | version "0.21.5" 233 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" 234 | integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== 235 | 236 | "@esbuild/linux-riscv64@0.21.5": 237 | version "0.21.5" 238 | resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" 239 | integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== 240 | 241 | "@esbuild/linux-s390x@0.21.5": 242 | version "0.21.5" 243 | resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" 244 | integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== 245 | 246 | "@esbuild/linux-x64@0.21.5": 247 | version "0.21.5" 248 | resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz" 249 | integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== 250 | 251 | "@esbuild/netbsd-x64@0.21.5": 252 | version "0.21.5" 253 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" 254 | integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== 255 | 256 | "@esbuild/openbsd-x64@0.21.5": 257 | version "0.21.5" 258 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" 259 | integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== 260 | 261 | "@esbuild/sunos-x64@0.21.5": 262 | version "0.21.5" 263 | resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" 264 | integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== 265 | 266 | "@esbuild/win32-arm64@0.21.5": 267 | version "0.21.5" 268 | resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" 269 | integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== 270 | 271 | "@esbuild/win32-ia32@0.21.5": 272 | version "0.21.5" 273 | resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" 274 | integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== 275 | 276 | "@esbuild/win32-x64@0.21.5": 277 | version "0.21.5" 278 | resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" 279 | integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== 280 | 281 | "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": 282 | version "4.4.0" 283 | resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" 284 | integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== 285 | dependencies: 286 | eslint-visitor-keys "^3.3.0" 287 | 288 | "@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": 289 | version "4.10.1" 290 | resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz" 291 | integrity sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA== 292 | 293 | "@eslint/eslintrc@^2.1.4": 294 | version "2.1.4" 295 | resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz" 296 | integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== 297 | dependencies: 298 | ajv "^6.12.4" 299 | debug "^4.3.2" 300 | espree "^9.6.0" 301 | globals "^13.19.0" 302 | ignore "^5.2.0" 303 | import-fresh "^3.2.1" 304 | js-yaml "^4.1.0" 305 | minimatch "^3.1.2" 306 | strip-json-comments "^3.1.1" 307 | 308 | "@eslint/js@8.57.0": 309 | version "8.57.0" 310 | resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz" 311 | integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== 312 | 313 | "@humanwhocodes/config-array@^0.11.14": 314 | version "0.11.14" 315 | resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz" 316 | integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== 317 | dependencies: 318 | "@humanwhocodes/object-schema" "^2.0.2" 319 | debug "^4.3.1" 320 | minimatch "^3.0.5" 321 | 322 | "@humanwhocodes/module-importer@^1.0.1": 323 | version "1.0.1" 324 | resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" 325 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== 326 | 327 | "@humanwhocodes/object-schema@^2.0.2": 328 | version "2.0.3" 329 | resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz" 330 | integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== 331 | 332 | "@jridgewell/gen-mapping@^0.3.5": 333 | version "0.3.5" 334 | resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" 335 | integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== 336 | dependencies: 337 | "@jridgewell/set-array" "^1.2.1" 338 | "@jridgewell/sourcemap-codec" "^1.4.10" 339 | "@jridgewell/trace-mapping" "^0.3.24" 340 | 341 | "@jridgewell/resolve-uri@^3.1.0": 342 | version "3.1.2" 343 | resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" 344 | integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== 345 | 346 | "@jridgewell/set-array@^1.2.1": 347 | version "1.2.1" 348 | resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" 349 | integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== 350 | 351 | "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": 352 | version "1.5.0" 353 | resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" 354 | integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== 355 | 356 | "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": 357 | version "0.3.25" 358 | resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" 359 | integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== 360 | dependencies: 361 | "@jridgewell/resolve-uri" "^3.1.0" 362 | "@jridgewell/sourcemap-codec" "^1.4.14" 363 | 364 | "@nodelib/fs.scandir@2.1.5": 365 | version "2.1.5" 366 | resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" 367 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 368 | dependencies: 369 | "@nodelib/fs.stat" "2.0.5" 370 | run-parallel "^1.1.9" 371 | 372 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 373 | version "2.0.5" 374 | resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" 375 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 376 | 377 | "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": 378 | version "1.2.8" 379 | resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" 380 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 381 | dependencies: 382 | "@nodelib/fs.scandir" "2.1.5" 383 | fastq "^1.6.0" 384 | 385 | "@rollup/rollup-android-arm-eabi@4.27.4": 386 | version "4.27.4" 387 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.4.tgz#e3c9cc13f144ba033df4d2c3130a214dc8e3473e" 388 | integrity sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw== 389 | 390 | "@rollup/rollup-android-arm64@4.27.4": 391 | version "4.27.4" 392 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.4.tgz#0474250fcb5871aca952e249a0c3270fc4310b55" 393 | integrity sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA== 394 | 395 | "@rollup/rollup-darwin-arm64@4.27.4": 396 | version "4.27.4" 397 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.4.tgz#77c29b4f9c430c1624f1a6835f2a7e82be3d16f2" 398 | integrity sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q== 399 | 400 | "@rollup/rollup-darwin-x64@4.27.4": 401 | version "4.27.4" 402 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.4.tgz#7d87711f641a458868758cbf110fb32eabd6a25a" 403 | integrity sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ== 404 | 405 | "@rollup/rollup-freebsd-arm64@4.27.4": 406 | version "4.27.4" 407 | resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.4.tgz#662f808d2780e4e91021ac9ee7ed800862bb9a57" 408 | integrity sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw== 409 | 410 | "@rollup/rollup-freebsd-x64@4.27.4": 411 | version "4.27.4" 412 | resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.4.tgz#71e5a7bcfcbe51d8b65d158675acec1307edea79" 413 | integrity sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA== 414 | 415 | "@rollup/rollup-linux-arm-gnueabihf@4.27.4": 416 | version "4.27.4" 417 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.4.tgz#08f67fcec61ee18f8b33b3f403a834ab8f3aa75d" 418 | integrity sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w== 419 | 420 | "@rollup/rollup-linux-arm-musleabihf@4.27.4": 421 | version "4.27.4" 422 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.4.tgz#2e1ad4607f86475b1731556359c6070eb8f4b109" 423 | integrity sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A== 424 | 425 | "@rollup/rollup-linux-arm64-gnu@4.27.4": 426 | version "4.27.4" 427 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.4.tgz#c65d559dcb0d3dabea500cf7b8215959ae6cccf8" 428 | integrity sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg== 429 | 430 | "@rollup/rollup-linux-arm64-musl@4.27.4": 431 | version "4.27.4" 432 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.4.tgz#6739f7eb33e20466bb88748519c98ce8dee23922" 433 | integrity sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA== 434 | 435 | "@rollup/rollup-linux-powerpc64le-gnu@4.27.4": 436 | version "4.27.4" 437 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.4.tgz#8d9fe9471c256e55278cb1f7b1c977cd8fe6df20" 438 | integrity sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ== 439 | 440 | "@rollup/rollup-linux-riscv64-gnu@4.27.4": 441 | version "4.27.4" 442 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.4.tgz#9a467f7ad5b61c9d66b24e79a3c57cb755d02c35" 443 | integrity sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw== 444 | 445 | "@rollup/rollup-linux-s390x-gnu@4.27.4": 446 | version "4.27.4" 447 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.4.tgz#efaddf22df27b87a267a731fbeb9539e92cd4527" 448 | integrity sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg== 449 | 450 | "@rollup/rollup-linux-x64-gnu@4.27.4": 451 | version "4.27.4" 452 | resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.4.tgz" 453 | integrity sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q== 454 | 455 | "@rollup/rollup-linux-x64-musl@4.27.4": 456 | version "4.27.4" 457 | resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.4.tgz" 458 | integrity sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw== 459 | 460 | "@rollup/rollup-win32-arm64-msvc@4.27.4": 461 | version "4.27.4" 462 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.4.tgz#030b6cc607d845da23dced624e47fb45de105840" 463 | integrity sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A== 464 | 465 | "@rollup/rollup-win32-ia32-msvc@4.27.4": 466 | version "4.27.4" 467 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.4.tgz#3457a3f44a84f51d8097c3606429e01f0d2d0ec2" 468 | integrity sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ== 469 | 470 | "@rollup/rollup-win32-x64-msvc@4.27.4": 471 | version "4.27.4" 472 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.4.tgz#67d516613c9f2fe42e2d8b78e252d0003179d92c" 473 | integrity sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug== 474 | 475 | "@types/babel__core@^7.20.5": 476 | version "7.20.5" 477 | resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" 478 | integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== 479 | dependencies: 480 | "@babel/parser" "^7.20.7" 481 | "@babel/types" "^7.20.7" 482 | "@types/babel__generator" "*" 483 | "@types/babel__template" "*" 484 | "@types/babel__traverse" "*" 485 | 486 | "@types/babel__generator@*": 487 | version "7.6.8" 488 | resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz" 489 | integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== 490 | dependencies: 491 | "@babel/types" "^7.0.0" 492 | 493 | "@types/babel__template@*": 494 | version "7.4.4" 495 | resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz" 496 | integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== 497 | dependencies: 498 | "@babel/parser" "^7.1.0" 499 | "@babel/types" "^7.0.0" 500 | 501 | "@types/babel__traverse@*": 502 | version "7.20.6" 503 | resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz" 504 | integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== 505 | dependencies: 506 | "@babel/types" "^7.20.7" 507 | 508 | "@types/estree@1.0.6": 509 | version "1.0.6" 510 | resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz" 511 | integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== 512 | 513 | "@types/prop-types@*": 514 | version "15.7.13" 515 | resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz" 516 | integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA== 517 | 518 | "@types/react-dom@^18.2.22": 519 | version "18.3.1" 520 | resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz" 521 | integrity sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ== 522 | dependencies: 523 | "@types/react" "*" 524 | 525 | "@types/react@*", "@types/react@^18.2.66": 526 | version "18.3.12" 527 | resolved "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz" 528 | integrity sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw== 529 | dependencies: 530 | "@types/prop-types" "*" 531 | csstype "^3.0.2" 532 | 533 | "@typescript-eslint/eslint-plugin@^7.2.0": 534 | version "7.18.0" 535 | resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz" 536 | integrity sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw== 537 | dependencies: 538 | "@eslint-community/regexpp" "^4.10.0" 539 | "@typescript-eslint/scope-manager" "7.18.0" 540 | "@typescript-eslint/type-utils" "7.18.0" 541 | "@typescript-eslint/utils" "7.18.0" 542 | "@typescript-eslint/visitor-keys" "7.18.0" 543 | graphemer "^1.4.0" 544 | ignore "^5.3.1" 545 | natural-compare "^1.4.0" 546 | ts-api-utils "^1.3.0" 547 | 548 | "@typescript-eslint/parser@^7.2.0": 549 | version "7.18.0" 550 | resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz" 551 | integrity sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg== 552 | dependencies: 553 | "@typescript-eslint/scope-manager" "7.18.0" 554 | "@typescript-eslint/types" "7.18.0" 555 | "@typescript-eslint/typescript-estree" "7.18.0" 556 | "@typescript-eslint/visitor-keys" "7.18.0" 557 | debug "^4.3.4" 558 | 559 | "@typescript-eslint/scope-manager@7.18.0": 560 | version "7.18.0" 561 | resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz" 562 | integrity sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA== 563 | dependencies: 564 | "@typescript-eslint/types" "7.18.0" 565 | "@typescript-eslint/visitor-keys" "7.18.0" 566 | 567 | "@typescript-eslint/type-utils@7.18.0": 568 | version "7.18.0" 569 | resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz" 570 | integrity sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA== 571 | dependencies: 572 | "@typescript-eslint/typescript-estree" "7.18.0" 573 | "@typescript-eslint/utils" "7.18.0" 574 | debug "^4.3.4" 575 | ts-api-utils "^1.3.0" 576 | 577 | "@typescript-eslint/types@7.18.0": 578 | version "7.18.0" 579 | resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz" 580 | integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== 581 | 582 | "@typescript-eslint/typescript-estree@7.18.0": 583 | version "7.18.0" 584 | resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz" 585 | integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA== 586 | dependencies: 587 | "@typescript-eslint/types" "7.18.0" 588 | "@typescript-eslint/visitor-keys" "7.18.0" 589 | debug "^4.3.4" 590 | globby "^11.1.0" 591 | is-glob "^4.0.3" 592 | minimatch "^9.0.4" 593 | semver "^7.6.0" 594 | ts-api-utils "^1.3.0" 595 | 596 | "@typescript-eslint/utils@7.18.0": 597 | version "7.18.0" 598 | resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz" 599 | integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw== 600 | dependencies: 601 | "@eslint-community/eslint-utils" "^4.4.0" 602 | "@typescript-eslint/scope-manager" "7.18.0" 603 | "@typescript-eslint/types" "7.18.0" 604 | "@typescript-eslint/typescript-estree" "7.18.0" 605 | 606 | "@typescript-eslint/visitor-keys@7.18.0": 607 | version "7.18.0" 608 | resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz" 609 | integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg== 610 | dependencies: 611 | "@typescript-eslint/types" "7.18.0" 612 | eslint-visitor-keys "^3.4.3" 613 | 614 | "@ungap/structured-clone@^1.2.0": 615 | version "1.2.0" 616 | resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" 617 | integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== 618 | 619 | "@vitejs/plugin-react@^4.2.1": 620 | version "4.3.3" 621 | resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.3.tgz" 622 | integrity sha512-NooDe9GpHGqNns1i8XDERg0Vsg5SSYRhRxxyTGogUdkdNt47jal+fbuYi+Yfq6pzRCKXyoPcWisfxE6RIM3GKA== 623 | dependencies: 624 | "@babel/core" "^7.25.2" 625 | "@babel/plugin-transform-react-jsx-self" "^7.24.7" 626 | "@babel/plugin-transform-react-jsx-source" "^7.24.7" 627 | "@types/babel__core" "^7.20.5" 628 | react-refresh "^0.14.2" 629 | 630 | acorn-jsx@^5.3.2: 631 | version "5.3.2" 632 | resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" 633 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 634 | 635 | acorn@^8.9.0: 636 | version "8.12.0" 637 | resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz" 638 | integrity sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw== 639 | 640 | ajv@^6.12.4: 641 | version "6.12.6" 642 | resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" 643 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 644 | dependencies: 645 | fast-deep-equal "^3.1.1" 646 | fast-json-stable-stringify "^2.0.0" 647 | json-schema-traverse "^0.4.1" 648 | uri-js "^4.2.2" 649 | 650 | ansi-regex@^5.0.1: 651 | version "5.0.1" 652 | resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" 653 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 654 | 655 | ansi-styles@^4.1.0: 656 | version "4.3.0" 657 | resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" 658 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 659 | dependencies: 660 | color-convert "^2.0.1" 661 | 662 | argparse@^2.0.1: 663 | version "2.0.1" 664 | resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" 665 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 666 | 667 | array-union@^2.1.0: 668 | version "2.1.0" 669 | resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" 670 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 671 | 672 | balanced-match@^1.0.0: 673 | version "1.0.2" 674 | resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" 675 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 676 | 677 | brace-expansion@^1.1.7: 678 | version "1.1.11" 679 | resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" 680 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 681 | dependencies: 682 | balanced-match "^1.0.0" 683 | concat-map "0.0.1" 684 | 685 | brace-expansion@^2.0.1: 686 | version "2.0.1" 687 | resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" 688 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 689 | dependencies: 690 | balanced-match "^1.0.0" 691 | 692 | braces@^3.0.3: 693 | version "3.0.3" 694 | resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" 695 | integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== 696 | dependencies: 697 | fill-range "^7.1.1" 698 | 699 | browserslist@^4.24.0: 700 | version "4.24.2" 701 | resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz" 702 | integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== 703 | dependencies: 704 | caniuse-lite "^1.0.30001669" 705 | electron-to-chromium "^1.5.41" 706 | node-releases "^2.0.18" 707 | update-browserslist-db "^1.1.1" 708 | 709 | callsites@^3.0.0: 710 | version "3.1.0" 711 | resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" 712 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 713 | 714 | caniuse-lite@^1.0.30001669: 715 | version "1.0.30001683" 716 | resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001683.tgz" 717 | integrity sha512-iqmNnThZ0n70mNwvxpEC2nBJ037ZHZUoBI5Gorh1Mw6IlEAZujEoU1tXA628iZfzm7R9FvFzxbfdgml82a3k8Q== 718 | 719 | chalk@^4.0.0: 720 | version "4.1.2" 721 | resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" 722 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 723 | dependencies: 724 | ansi-styles "^4.1.0" 725 | supports-color "^7.1.0" 726 | 727 | color-convert@^2.0.1: 728 | version "2.0.1" 729 | resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" 730 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 731 | dependencies: 732 | color-name "~1.1.4" 733 | 734 | color-name@~1.1.4: 735 | version "1.1.4" 736 | resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" 737 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 738 | 739 | concat-map@0.0.1: 740 | version "0.0.1" 741 | resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" 742 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 743 | 744 | convert-source-map@^2.0.0: 745 | version "2.0.0" 746 | resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" 747 | integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== 748 | 749 | cross-spawn@^7.0.2: 750 | version "7.0.6" 751 | resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" 752 | integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== 753 | dependencies: 754 | path-key "^3.1.0" 755 | shebang-command "^2.0.0" 756 | which "^2.0.1" 757 | 758 | csstype@^3.0.2: 759 | version "3.1.3" 760 | resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" 761 | integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== 762 | 763 | debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: 764 | version "4.3.5" 765 | resolved "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz" 766 | integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== 767 | dependencies: 768 | ms "2.1.2" 769 | 770 | deep-is@^0.1.3: 771 | version "0.1.4" 772 | resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" 773 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 774 | 775 | dir-glob@^3.0.1: 776 | version "3.0.1" 777 | resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" 778 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 779 | dependencies: 780 | path-type "^4.0.0" 781 | 782 | doctrine@^3.0.0: 783 | version "3.0.0" 784 | resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" 785 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 786 | dependencies: 787 | esutils "^2.0.2" 788 | 789 | electron-to-chromium@^1.5.41: 790 | version "1.5.64" 791 | resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.64.tgz" 792 | integrity sha512-IXEuxU+5ClW2IGEYFC2T7szbyVgehupCWQe5GNh+H065CD6U6IFN0s4KeAMFGNmQolRU4IV7zGBWSYMmZ8uuqQ== 793 | 794 | esbuild@^0.21.3: 795 | version "0.21.5" 796 | resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz" 797 | integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== 798 | optionalDependencies: 799 | "@esbuild/aix-ppc64" "0.21.5" 800 | "@esbuild/android-arm" "0.21.5" 801 | "@esbuild/android-arm64" "0.21.5" 802 | "@esbuild/android-x64" "0.21.5" 803 | "@esbuild/darwin-arm64" "0.21.5" 804 | "@esbuild/darwin-x64" "0.21.5" 805 | "@esbuild/freebsd-arm64" "0.21.5" 806 | "@esbuild/freebsd-x64" "0.21.5" 807 | "@esbuild/linux-arm" "0.21.5" 808 | "@esbuild/linux-arm64" "0.21.5" 809 | "@esbuild/linux-ia32" "0.21.5" 810 | "@esbuild/linux-loong64" "0.21.5" 811 | "@esbuild/linux-mips64el" "0.21.5" 812 | "@esbuild/linux-ppc64" "0.21.5" 813 | "@esbuild/linux-riscv64" "0.21.5" 814 | "@esbuild/linux-s390x" "0.21.5" 815 | "@esbuild/linux-x64" "0.21.5" 816 | "@esbuild/netbsd-x64" "0.21.5" 817 | "@esbuild/openbsd-x64" "0.21.5" 818 | "@esbuild/sunos-x64" "0.21.5" 819 | "@esbuild/win32-arm64" "0.21.5" 820 | "@esbuild/win32-ia32" "0.21.5" 821 | "@esbuild/win32-x64" "0.21.5" 822 | 823 | escalade@^3.2.0: 824 | version "3.2.0" 825 | resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" 826 | integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== 827 | 828 | escape-string-regexp@^4.0.0: 829 | version "4.0.0" 830 | resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" 831 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 832 | 833 | eslint-plugin-react-hooks@^4.6.0: 834 | version "4.6.2" 835 | resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz" 836 | integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== 837 | 838 | eslint-plugin-react-refresh@^0.4.6: 839 | version "0.4.14" 840 | resolved "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.14.tgz" 841 | integrity sha512-aXvzCTK7ZBv1e7fahFuR3Z/fyQQSIQ711yPgYRj+Oj64tyTgO4iQIDmYXDBqvSWQ/FA4OSCsXOStlF+noU0/NA== 842 | 843 | eslint-scope@^7.2.2: 844 | version "7.2.2" 845 | resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" 846 | integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== 847 | dependencies: 848 | esrecurse "^4.3.0" 849 | estraverse "^5.2.0" 850 | 851 | eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: 852 | version "3.4.3" 853 | resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" 854 | integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== 855 | 856 | eslint@^8.57.0: 857 | version "8.57.0" 858 | resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz" 859 | integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== 860 | dependencies: 861 | "@eslint-community/eslint-utils" "^4.2.0" 862 | "@eslint-community/regexpp" "^4.6.1" 863 | "@eslint/eslintrc" "^2.1.4" 864 | "@eslint/js" "8.57.0" 865 | "@humanwhocodes/config-array" "^0.11.14" 866 | "@humanwhocodes/module-importer" "^1.0.1" 867 | "@nodelib/fs.walk" "^1.2.8" 868 | "@ungap/structured-clone" "^1.2.0" 869 | ajv "^6.12.4" 870 | chalk "^4.0.0" 871 | cross-spawn "^7.0.2" 872 | debug "^4.3.2" 873 | doctrine "^3.0.0" 874 | escape-string-regexp "^4.0.0" 875 | eslint-scope "^7.2.2" 876 | eslint-visitor-keys "^3.4.3" 877 | espree "^9.6.1" 878 | esquery "^1.4.2" 879 | esutils "^2.0.2" 880 | fast-deep-equal "^3.1.3" 881 | file-entry-cache "^6.0.1" 882 | find-up "^5.0.0" 883 | glob-parent "^6.0.2" 884 | globals "^13.19.0" 885 | graphemer "^1.4.0" 886 | ignore "^5.2.0" 887 | imurmurhash "^0.1.4" 888 | is-glob "^4.0.0" 889 | is-path-inside "^3.0.3" 890 | js-yaml "^4.1.0" 891 | json-stable-stringify-without-jsonify "^1.0.1" 892 | levn "^0.4.1" 893 | lodash.merge "^4.6.2" 894 | minimatch "^3.1.2" 895 | natural-compare "^1.4.0" 896 | optionator "^0.9.3" 897 | strip-ansi "^6.0.1" 898 | text-table "^0.2.0" 899 | 900 | espree@^9.6.0, espree@^9.6.1: 901 | version "9.6.1" 902 | resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" 903 | integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== 904 | dependencies: 905 | acorn "^8.9.0" 906 | acorn-jsx "^5.3.2" 907 | eslint-visitor-keys "^3.4.1" 908 | 909 | esquery@^1.4.2: 910 | version "1.5.0" 911 | resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" 912 | integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== 913 | dependencies: 914 | estraverse "^5.1.0" 915 | 916 | esrecurse@^4.3.0: 917 | version "4.3.0" 918 | resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" 919 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 920 | dependencies: 921 | estraverse "^5.2.0" 922 | 923 | estraverse@^5.1.0, estraverse@^5.2.0: 924 | version "5.3.0" 925 | resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" 926 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 927 | 928 | esutils@^2.0.2: 929 | version "2.0.3" 930 | resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" 931 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 932 | 933 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 934 | version "3.1.3" 935 | resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" 936 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 937 | 938 | fast-glob@^3.2.9: 939 | version "3.3.2" 940 | resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" 941 | integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== 942 | dependencies: 943 | "@nodelib/fs.stat" "^2.0.2" 944 | "@nodelib/fs.walk" "^1.2.3" 945 | glob-parent "^5.1.2" 946 | merge2 "^1.3.0" 947 | micromatch "^4.0.4" 948 | 949 | fast-json-stable-stringify@^2.0.0: 950 | version "2.1.0" 951 | resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" 952 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 953 | 954 | fast-levenshtein@^2.0.6: 955 | version "2.0.6" 956 | resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" 957 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== 958 | 959 | fastq@^1.6.0: 960 | version "1.17.1" 961 | resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz" 962 | integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== 963 | dependencies: 964 | reusify "^1.0.4" 965 | 966 | file-entry-cache@^6.0.1: 967 | version "6.0.1" 968 | resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" 969 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 970 | dependencies: 971 | flat-cache "^3.0.4" 972 | 973 | fill-range@^7.1.1: 974 | version "7.1.1" 975 | resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" 976 | integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== 977 | dependencies: 978 | to-regex-range "^5.0.1" 979 | 980 | find-up@^5.0.0: 981 | version "5.0.0" 982 | resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" 983 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 984 | dependencies: 985 | locate-path "^6.0.0" 986 | path-exists "^4.0.0" 987 | 988 | flat-cache@^3.0.4: 989 | version "3.2.0" 990 | resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" 991 | integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== 992 | dependencies: 993 | flatted "^3.2.9" 994 | keyv "^4.5.3" 995 | rimraf "^3.0.2" 996 | 997 | flatted@^3.2.9: 998 | version "3.3.1" 999 | resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz" 1000 | integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== 1001 | 1002 | fs.realpath@^1.0.0: 1003 | version "1.0.0" 1004 | resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" 1005 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 1006 | 1007 | fsevents@~2.3.2, fsevents@~2.3.3: 1008 | version "2.3.3" 1009 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 1010 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 1011 | 1012 | gensync@^1.0.0-beta.2: 1013 | version "1.0.0-beta.2" 1014 | resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" 1015 | integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== 1016 | 1017 | glob-parent@^5.1.2: 1018 | version "5.1.2" 1019 | resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" 1020 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 1021 | dependencies: 1022 | is-glob "^4.0.1" 1023 | 1024 | glob-parent@^6.0.2: 1025 | version "6.0.2" 1026 | resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" 1027 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 1028 | dependencies: 1029 | is-glob "^4.0.3" 1030 | 1031 | glob@^7.1.3: 1032 | version "7.2.3" 1033 | resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" 1034 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 1035 | dependencies: 1036 | fs.realpath "^1.0.0" 1037 | inflight "^1.0.4" 1038 | inherits "2" 1039 | minimatch "^3.1.1" 1040 | once "^1.3.0" 1041 | path-is-absolute "^1.0.0" 1042 | 1043 | globals@^11.1.0: 1044 | version "11.12.0" 1045 | resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" 1046 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 1047 | 1048 | globals@^13.19.0: 1049 | version "13.24.0" 1050 | resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" 1051 | integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== 1052 | dependencies: 1053 | type-fest "^0.20.2" 1054 | 1055 | globby@^11.1.0: 1056 | version "11.1.0" 1057 | resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" 1058 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== 1059 | dependencies: 1060 | array-union "^2.1.0" 1061 | dir-glob "^3.0.1" 1062 | fast-glob "^3.2.9" 1063 | ignore "^5.2.0" 1064 | merge2 "^1.4.1" 1065 | slash "^3.0.0" 1066 | 1067 | graphemer@^1.4.0: 1068 | version "1.4.0" 1069 | resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" 1070 | integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== 1071 | 1072 | has-flag@^4.0.0: 1073 | version "4.0.0" 1074 | resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" 1075 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 1076 | 1077 | ignore@^5.2.0, ignore@^5.3.1: 1078 | version "5.3.1" 1079 | resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz" 1080 | integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== 1081 | 1082 | import-fresh@^3.2.1: 1083 | version "3.3.0" 1084 | resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" 1085 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 1086 | dependencies: 1087 | parent-module "^1.0.0" 1088 | resolve-from "^4.0.0" 1089 | 1090 | imurmurhash@^0.1.4: 1091 | version "0.1.4" 1092 | resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" 1093 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 1094 | 1095 | inflight@^1.0.4: 1096 | version "1.0.6" 1097 | resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" 1098 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 1099 | dependencies: 1100 | once "^1.3.0" 1101 | wrappy "1" 1102 | 1103 | inherits@2: 1104 | version "2.0.4" 1105 | resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" 1106 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1107 | 1108 | is-extglob@^2.1.1: 1109 | version "2.1.1" 1110 | resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" 1111 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 1112 | 1113 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: 1114 | version "4.0.3" 1115 | resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" 1116 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1117 | dependencies: 1118 | is-extglob "^2.1.1" 1119 | 1120 | is-number@^7.0.0: 1121 | version "7.0.0" 1122 | resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" 1123 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1124 | 1125 | is-path-inside@^3.0.3: 1126 | version "3.0.3" 1127 | resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" 1128 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 1129 | 1130 | isexe@^2.0.0: 1131 | version "2.0.0" 1132 | resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" 1133 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 1134 | 1135 | "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: 1136 | version "4.0.0" 1137 | resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" 1138 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1139 | 1140 | js-yaml@^4.1.0: 1141 | version "4.1.0" 1142 | resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" 1143 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 1144 | dependencies: 1145 | argparse "^2.0.1" 1146 | 1147 | jsesc@^3.0.2: 1148 | version "3.0.2" 1149 | resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz" 1150 | integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== 1151 | 1152 | json-buffer@3.0.1: 1153 | version "3.0.1" 1154 | resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" 1155 | integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== 1156 | 1157 | json-schema-traverse@^0.4.1: 1158 | version "0.4.1" 1159 | resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" 1160 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1161 | 1162 | json-stable-stringify-without-jsonify@^1.0.1: 1163 | version "1.0.1" 1164 | resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" 1165 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 1166 | 1167 | json5@^2.2.3: 1168 | version "2.2.3" 1169 | resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" 1170 | integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== 1171 | 1172 | keyv@^4.5.3: 1173 | version "4.5.4" 1174 | resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" 1175 | integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== 1176 | dependencies: 1177 | json-buffer "3.0.1" 1178 | 1179 | levn@^0.4.1: 1180 | version "0.4.1" 1181 | resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" 1182 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 1183 | dependencies: 1184 | prelude-ls "^1.2.1" 1185 | type-check "~0.4.0" 1186 | 1187 | locate-path@^6.0.0: 1188 | version "6.0.0" 1189 | resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" 1190 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 1191 | dependencies: 1192 | p-locate "^5.0.0" 1193 | 1194 | lodash.merge@^4.6.2: 1195 | version "4.6.2" 1196 | resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" 1197 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 1198 | 1199 | loose-envify@^1.1.0: 1200 | version "1.4.0" 1201 | resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" 1202 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 1203 | dependencies: 1204 | js-tokens "^3.0.0 || ^4.0.0" 1205 | 1206 | lru-cache@^5.1.1: 1207 | version "5.1.1" 1208 | resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" 1209 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 1210 | dependencies: 1211 | yallist "^3.0.2" 1212 | 1213 | merge2@^1.3.0, merge2@^1.4.1: 1214 | version "1.4.1" 1215 | resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" 1216 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1217 | 1218 | micromatch@^4.0.4: 1219 | version "4.0.8" 1220 | resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" 1221 | integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== 1222 | dependencies: 1223 | braces "^3.0.3" 1224 | picomatch "^2.3.1" 1225 | 1226 | minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: 1227 | version "3.1.2" 1228 | resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" 1229 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1230 | dependencies: 1231 | brace-expansion "^1.1.7" 1232 | 1233 | minimatch@^9.0.4: 1234 | version "9.0.5" 1235 | resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" 1236 | integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== 1237 | dependencies: 1238 | brace-expansion "^2.0.1" 1239 | 1240 | ms@2.1.2: 1241 | version "2.1.2" 1242 | resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" 1243 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1244 | 1245 | nanoid@^3.3.7: 1246 | version "3.3.8" 1247 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" 1248 | integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== 1249 | 1250 | natural-compare@^1.4.0: 1251 | version "1.4.0" 1252 | resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" 1253 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 1254 | 1255 | node-releases@^2.0.18: 1256 | version "2.0.18" 1257 | resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz" 1258 | integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== 1259 | 1260 | once@^1.3.0: 1261 | version "1.4.0" 1262 | resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" 1263 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 1264 | dependencies: 1265 | wrappy "1" 1266 | 1267 | optionator@^0.9.3: 1268 | version "0.9.4" 1269 | resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" 1270 | integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== 1271 | dependencies: 1272 | deep-is "^0.1.3" 1273 | fast-levenshtein "^2.0.6" 1274 | levn "^0.4.1" 1275 | prelude-ls "^1.2.1" 1276 | type-check "^0.4.0" 1277 | word-wrap "^1.2.5" 1278 | 1279 | p-limit@^3.0.2: 1280 | version "3.1.0" 1281 | resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" 1282 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1283 | dependencies: 1284 | yocto-queue "^0.1.0" 1285 | 1286 | p-locate@^5.0.0: 1287 | version "5.0.0" 1288 | resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" 1289 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1290 | dependencies: 1291 | p-limit "^3.0.2" 1292 | 1293 | parent-module@^1.0.0: 1294 | version "1.0.1" 1295 | resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" 1296 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1297 | dependencies: 1298 | callsites "^3.0.0" 1299 | 1300 | path-exists@^4.0.0: 1301 | version "4.0.0" 1302 | resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" 1303 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1304 | 1305 | path-is-absolute@^1.0.0: 1306 | version "1.0.1" 1307 | resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" 1308 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 1309 | 1310 | path-key@^3.1.0: 1311 | version "3.1.1" 1312 | resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" 1313 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1314 | 1315 | path-type@^4.0.0: 1316 | version "4.0.0" 1317 | resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" 1318 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 1319 | 1320 | picocolors@^1.0.0, picocolors@^1.1.0, picocolors@^1.1.1: 1321 | version "1.1.1" 1322 | resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" 1323 | integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== 1324 | 1325 | picomatch@^2.3.1: 1326 | version "2.3.1" 1327 | resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" 1328 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1329 | 1330 | postcss@^8.4.43: 1331 | version "8.4.49" 1332 | resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz" 1333 | integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== 1334 | dependencies: 1335 | nanoid "^3.3.7" 1336 | picocolors "^1.1.1" 1337 | source-map-js "^1.2.1" 1338 | 1339 | prelude-ls@^1.2.1: 1340 | version "1.2.1" 1341 | resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" 1342 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 1343 | 1344 | punycode@^2.1.0: 1345 | version "2.3.1" 1346 | resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" 1347 | integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== 1348 | 1349 | queue-microtask@^1.2.2: 1350 | version "1.2.3" 1351 | resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" 1352 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1353 | 1354 | react-dom@^18.2.0: 1355 | version "18.3.1" 1356 | resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" 1357 | integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== 1358 | dependencies: 1359 | loose-envify "^1.1.0" 1360 | scheduler "^0.23.2" 1361 | 1362 | react-refresh@^0.14.2: 1363 | version "0.14.2" 1364 | resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz" 1365 | integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== 1366 | 1367 | react@^18.2.0: 1368 | version "18.3.1" 1369 | resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" 1370 | integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== 1371 | dependencies: 1372 | loose-envify "^1.1.0" 1373 | 1374 | resolve-from@^4.0.0: 1375 | version "4.0.0" 1376 | resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" 1377 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1378 | 1379 | reusify@^1.0.4: 1380 | version "1.0.4" 1381 | resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" 1382 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1383 | 1384 | rimraf@^3.0.2: 1385 | version "3.0.2" 1386 | resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" 1387 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1388 | dependencies: 1389 | glob "^7.1.3" 1390 | 1391 | rollup@^4.20.0: 1392 | version "4.27.4" 1393 | resolved "https://registry.npmjs.org/rollup/-/rollup-4.27.4.tgz" 1394 | integrity sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw== 1395 | dependencies: 1396 | "@types/estree" "1.0.6" 1397 | optionalDependencies: 1398 | "@rollup/rollup-android-arm-eabi" "4.27.4" 1399 | "@rollup/rollup-android-arm64" "4.27.4" 1400 | "@rollup/rollup-darwin-arm64" "4.27.4" 1401 | "@rollup/rollup-darwin-x64" "4.27.4" 1402 | "@rollup/rollup-freebsd-arm64" "4.27.4" 1403 | "@rollup/rollup-freebsd-x64" "4.27.4" 1404 | "@rollup/rollup-linux-arm-gnueabihf" "4.27.4" 1405 | "@rollup/rollup-linux-arm-musleabihf" "4.27.4" 1406 | "@rollup/rollup-linux-arm64-gnu" "4.27.4" 1407 | "@rollup/rollup-linux-arm64-musl" "4.27.4" 1408 | "@rollup/rollup-linux-powerpc64le-gnu" "4.27.4" 1409 | "@rollup/rollup-linux-riscv64-gnu" "4.27.4" 1410 | "@rollup/rollup-linux-s390x-gnu" "4.27.4" 1411 | "@rollup/rollup-linux-x64-gnu" "4.27.4" 1412 | "@rollup/rollup-linux-x64-musl" "4.27.4" 1413 | "@rollup/rollup-win32-arm64-msvc" "4.27.4" 1414 | "@rollup/rollup-win32-ia32-msvc" "4.27.4" 1415 | "@rollup/rollup-win32-x64-msvc" "4.27.4" 1416 | fsevents "~2.3.2" 1417 | 1418 | run-parallel@^1.1.9: 1419 | version "1.2.0" 1420 | resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" 1421 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1422 | dependencies: 1423 | queue-microtask "^1.2.2" 1424 | 1425 | scheduler@^0.23.2: 1426 | version "0.23.2" 1427 | resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz" 1428 | integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== 1429 | dependencies: 1430 | loose-envify "^1.1.0" 1431 | 1432 | semver@^6.3.1: 1433 | version "6.3.1" 1434 | resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" 1435 | integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== 1436 | 1437 | semver@^7.6.0: 1438 | version "7.6.3" 1439 | resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" 1440 | integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== 1441 | 1442 | shebang-command@^2.0.0: 1443 | version "2.0.0" 1444 | resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" 1445 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1446 | dependencies: 1447 | shebang-regex "^3.0.0" 1448 | 1449 | shebang-regex@^3.0.0: 1450 | version "3.0.0" 1451 | resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" 1452 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1453 | 1454 | slash@^3.0.0: 1455 | version "3.0.0" 1456 | resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" 1457 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1458 | 1459 | source-map-js@^1.2.1: 1460 | version "1.2.1" 1461 | resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" 1462 | integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== 1463 | 1464 | strip-ansi@^6.0.1: 1465 | version "6.0.1" 1466 | resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" 1467 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1468 | dependencies: 1469 | ansi-regex "^5.0.1" 1470 | 1471 | strip-json-comments@^3.1.1: 1472 | version "3.1.1" 1473 | resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" 1474 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1475 | 1476 | supports-color@^7.1.0: 1477 | version "7.2.0" 1478 | resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" 1479 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1480 | dependencies: 1481 | has-flag "^4.0.0" 1482 | 1483 | text-table@^0.2.0: 1484 | version "0.2.0" 1485 | resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" 1486 | integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== 1487 | 1488 | to-regex-range@^5.0.1: 1489 | version "5.0.1" 1490 | resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" 1491 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1492 | dependencies: 1493 | is-number "^7.0.0" 1494 | 1495 | ts-api-utils@^1.3.0: 1496 | version "1.4.0" 1497 | resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.0.tgz" 1498 | integrity sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ== 1499 | 1500 | type-check@^0.4.0, type-check@~0.4.0: 1501 | version "0.4.0" 1502 | resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" 1503 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 1504 | dependencies: 1505 | prelude-ls "^1.2.1" 1506 | 1507 | type-fest@^0.20.2: 1508 | version "0.20.2" 1509 | resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" 1510 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 1511 | 1512 | typescript@^5.2.2: 1513 | version "5.4.5" 1514 | resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz" 1515 | integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== 1516 | 1517 | update-browserslist-db@^1.1.1: 1518 | version "1.1.1" 1519 | resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz" 1520 | integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== 1521 | dependencies: 1522 | escalade "^3.2.0" 1523 | picocolors "^1.1.0" 1524 | 1525 | uri-js@^4.2.2: 1526 | version "4.4.1" 1527 | resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" 1528 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 1529 | dependencies: 1530 | punycode "^2.1.0" 1531 | 1532 | vite-plugin-css-injected-by-js@^3.5.2: 1533 | version "3.5.2" 1534 | resolved "https://registry.yarnpkg.com/vite-plugin-css-injected-by-js/-/vite-plugin-css-injected-by-js-3.5.2.tgz#1f75d16ad5c05b6b49bf18018099a189ec2e46ad" 1535 | integrity sha512-2MpU/Y+SCZyWUB6ua3HbJCrgnF0KACAsmzOQt1UvRVJCGF6S8xdA3ZUhWcWdM9ivG4I5az8PnQmwwrkC2CAQrQ== 1536 | 1537 | vite@^5.2.0: 1538 | version "5.4.11" 1539 | resolved "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz" 1540 | integrity sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q== 1541 | dependencies: 1542 | esbuild "^0.21.3" 1543 | postcss "^8.4.43" 1544 | rollup "^4.20.0" 1545 | optionalDependencies: 1546 | fsevents "~2.3.3" 1547 | 1548 | which@^2.0.1: 1549 | version "2.0.2" 1550 | resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" 1551 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1552 | dependencies: 1553 | isexe "^2.0.0" 1554 | 1555 | word-wrap@^1.2.5: 1556 | version "1.2.5" 1557 | resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" 1558 | integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== 1559 | 1560 | wrappy@1: 1561 | version "1.0.2" 1562 | resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" 1563 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1564 | 1565 | yallist@^3.0.2: 1566 | version "3.1.1" 1567 | resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" 1568 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 1569 | 1570 | yocto-queue@^0.1.0: 1571 | version "0.1.0" 1572 | resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" 1573 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1574 | --------------------------------------------------------------------------------