├── .gitignore ├── README.md ├── flipClock2025-react-js ├── .gitignore ├── README.md ├── eslint.config.js ├── index.html ├── package-lock.json ├── package.json ├── public │ └── vite.svg ├── src │ ├── App.jsx │ ├── components │ │ ├── flipCard │ │ │ ├── flipCard.css │ │ │ └── index.jsx │ │ └── flipClock │ │ │ ├── flipClock.css │ │ │ └── index.jsx │ └── main.jsx └── vite.config.js ├── flipClock2025-react-ts ├── .gitignore ├── README.md ├── eslint.config.js ├── index.html ├── package-lock.json ├── package.json ├── public │ └── vite.svg ├── src │ ├── App.tsx │ ├── components │ │ ├── flipCard │ │ │ ├── flipCard.css │ │ │ ├── index.tsx │ │ │ └── interfaces.tsx │ │ └── flipClock │ │ │ ├── flipClock.css │ │ │ └── index.tsx │ ├── main.tsx │ └── vite-env.d.ts ├── tsconfig.app.json ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts ├── flipClock2025-vue-js ├── .editorconfig ├── .gitattributes ├── .gitignore ├── .prettierrc.json ├── .vscode │ └── extensions.json ├── README.md ├── eslint.config.js ├── index.html ├── jsconfig.json ├── package-lock.json ├── package.json ├── public │ └── favicon.ico ├── src │ ├── App.vue │ ├── components │ │ ├── FlipCard │ │ │ └── FlipCard.vue │ │ └── FlipClock │ │ │ └── FlipClock.vue │ └── main.js └── vite.config.js ├── flipClock2025-vue-ts ├── .editorconfig ├── .gitattributes ├── .gitignore ├── .prettierrc.json ├── .vscode │ └── extensions.json ├── README.md ├── env.d.ts ├── eslint.config.ts ├── index.html ├── package-lock.json ├── package.json ├── public │ └── favicon.ico ├── src │ ├── App.vue │ ├── components │ │ ├── FlipCard │ │ │ ├── FlipCard.vue │ │ │ └── interfaces.ts │ │ └── FlipClock │ │ │ └── FlipClock.vue │ └── main.ts ├── tsconfig.app.json ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts └── javascript └── flipper.html /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 2025新春版:干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React) 2 | 3 | 翻牌效果时钟的演示,包含原生JavaScript、Vue、React三种实现方式。 4 | 5 | 包含 5 套代码: 6 | 7 | 1. 原生Javascript 8 | 2. React18/19 (javascript) 9 | 3. React18/19 (typescript) 10 | 4. Vue3 (javascript) 11 | 5. Vue3 (typescript) 12 | 13 | ## 教程原文 14 | 15 | 📚📚 本项目有详细的讲解教程,原文请关注我的微信公众号【卧梅又闻花】📚📚 16 | 17 | 初版教程(原理讲解看这个教程): 18 | 19 | [《干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React》](https://mp.weixin.qq.com/s/cdQQrK-xG00MmxPawUzeew) 20 | 21 | 2025年春季翻新版教程(原理不变,仅更新了React和Vue代码): 22 | 23 | [《2025新春版:干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React》](https://mp.weixin.qq.com/s/0tgaR6LzainyFsJlkHyK9w) 24 | 25 | ## 教程目录 26 | 27 | ``` 28 | 1 翻牌的构建 29 | • 1.1 基本结构 30 | • 1.2 构建纸牌并用伪元素拆分上下两部分 31 | • 知识点1:伪元素的使用 32 | • 1.3 为纸牌添加文字 33 | • 知识点2:line-height: 0的妙用 34 | • 1.4 设置纸牌的层叠关系 35 | • 知识点3:transform-origin和perspective 36 | 2 翻牌动画的实现 37 | • 2.1 CSS3翻牌动画 38 | • 知识点4:backface-visibility 39 | • 2.2 JS实现翻牌交互 40 | 3 翻牌时钟的实现 41 | • 3.1 HTML构建 42 | • 3.2 构建Flipper类 43 | • 3.3 实现时钟业务逻辑 44 | • 知识点5:时间格式化函数的实现 45 | • 3.4 运行时钟 46 | 4 Vue & React封装 47 | • 项目Git源码 48 | ``` 49 | 50 | ![image](https://wx3.sinaimg.cn/large/475dd357ly1gbh774dw0dj210n0ku443.jpg) 51 | -------------------------------------------------------------------------------- /flipClock2025-react-js/.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 | -------------------------------------------------------------------------------- /flipClock2025-react-js/README.md: -------------------------------------------------------------------------------- 1 | # 2025新春版:干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React) 2 | ## React18/19 Javascript版 3 | 4 | > 本项目提供的是组件源码,并不是npm依赖包。适合直接放到实际项目中使用,可根据实际项目需求自行修改。 5 | 6 | ## 使用方法 7 | 8 | 安装依赖包: 9 | ``` 10 | npm install 11 | ``` 12 | 13 | 运行项目: 14 | ``` 15 | npm run dev 16 | ``` 17 | 18 | build项目: 19 | ``` 20 | npm run build 21 | ``` 22 | 23 | ## 教程原文 24 | 25 | 📚📚 本项目有详细的讲解教程,原文请关注我的微信公众号【卧梅又闻花】📚📚 26 | 27 | 初版教程(原理讲解看这个教程): 28 | 29 | [《干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React》](https://mp.weixin.qq.com/s/cdQQrK-xG00MmxPawUzeew) 30 | 31 | 2025年春季翻新版教程(原理不变,仅更新了React和Vue代码): 32 | 33 | [《2025新春版:干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React》](https://mp.weixin.qq.com/s/1xy10ZFPtU0cyVQi-AmRbw) 34 | 35 | ## 教程目录 36 | 37 | ``` 38 | 1 翻牌的构建 39 | • 1.1 基本结构 40 | • 1.2 构建纸牌并用伪元素拆分上下两部分 41 | • 知识点1:伪元素的使用 42 | • 1.3 为纸牌添加文字 43 | • 知识点2:line-height: 0的妙用 44 | • 1.4 设置纸牌的层叠关系 45 | • 知识点3:transform-origin和perspective 46 | 2 翻牌动画的实现 47 | • 2.1 CSS3翻牌动画 48 | • 知识点4:backface-visibility 49 | • 2.2 JS实现翻牌交互 50 | 3 翻牌时钟的实现 51 | • 3.1 HTML构建 52 | • 3.2 构建Flipper类 53 | • 3.3 实现时钟业务逻辑 54 | • 知识点5:时间格式化函数的实现 55 | • 3.4 运行时钟 56 | 4 Vue & React封装 57 | • 项目Git源码 58 | ``` 59 | 60 | ![image](https://wx3.sinaimg.cn/large/475dd357ly1gbh774dw0dj210n0ku443.jpg) 61 | -------------------------------------------------------------------------------- /flipClock2025-react-js/eslint.config.js: -------------------------------------------------------------------------------- 1 | import js from '@eslint/js' 2 | import globals from 'globals' 3 | import react from 'eslint-plugin-react' 4 | import reactHooks from 'eslint-plugin-react-hooks' 5 | import reactRefresh from 'eslint-plugin-react-refresh' 6 | 7 | export default [ 8 | { ignores: ['dist'] }, 9 | { 10 | files: ['**/*.{js,jsx}'], 11 | languageOptions: { 12 | ecmaVersion: 2020, 13 | globals: globals.browser, 14 | parserOptions: { 15 | ecmaVersion: 'latest', 16 | ecmaFeatures: { jsx: true }, 17 | sourceType: 'module', 18 | }, 19 | }, 20 | settings: { react: { version: '18.3' } }, 21 | plugins: { 22 | react, 23 | 'react-hooks': reactHooks, 24 | 'react-refresh': reactRefresh, 25 | }, 26 | rules: { 27 | ...js.configs.recommended.rules, 28 | ...react.configs.recommended.rules, 29 | ...react.configs['jsx-runtime'].rules, 30 | ...reactHooks.configs.recommended.rules, 31 | 'react/jsx-no-target-blank': 'off', 32 | 'react-refresh/only-export-components': [ 33 | 'warn', 34 | { allowConstantExport: true }, 35 | ], 36 | }, 37 | }, 38 | ] 39 | -------------------------------------------------------------------------------- /flipClock2025-react-js/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | flipClock2025-react-js 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /flipClock2025-react-js/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "flipclock2025-react-js", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "lint": "eslint .", 10 | "preview": "vite preview" 11 | }, 12 | "dependencies": { 13 | "react": "^19.0.0", 14 | "react-dom": "^19.0.0" 15 | }, 16 | "devDependencies": { 17 | "@eslint/js": "^9.21.0", 18 | "@types/react": "^19.0.10", 19 | "@types/react-dom": "^19.0.4", 20 | "@vitejs/plugin-react": "^4.3.4", 21 | "eslint": "^9.21.0", 22 | "eslint-plugin-react": "^7.37.4", 23 | "eslint-plugin-react-hooks": "^5.2.0", 24 | "eslint-plugin-react-refresh": "^0.4.19", 25 | "globals": "^16.0.0", 26 | "vite": "^6.2.0", 27 | "vite-plugin-checker": "^0.9.0" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /flipClock2025-react-js/public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /flipClock2025-react-js/src/App.jsx: -------------------------------------------------------------------------------- 1 | import FilpClock from './components/flipClock' 2 | 3 | function App() { 4 | return ( 5 |
6 | 7 |
8 | ) 9 | } 10 | 11 | export default App 12 | -------------------------------------------------------------------------------- /flipClock2025-react-js/src/components/flipCard/flipCard.css: -------------------------------------------------------------------------------- 1 | .M-FlipCard { 2 | display: inline-block; 3 | position: relative; 4 | width: 60px; 5 | height: 100px; 6 | line-height: 100px; 7 | border: solid 1px #000; 8 | border-radius: 10px; 9 | background: #fff; 10 | font-size: 66px; 11 | color: #fff; 12 | box-shadow: 0 0 6px rgba(0, 0, 0, 0.5); 13 | text-align: center; 14 | font-family: 'Helvetica Neue'; 15 | } 16 | 17 | .M-FlipCard .digital:before, 18 | .M-FlipCard .digital:after { 19 | content: ''; 20 | position: absolute; 21 | left: 0; 22 | right: 0; 23 | background: #000; 24 | overflow: hidden; 25 | box-sizing: border-box; 26 | } 27 | 28 | .M-FlipCard .digital:before { 29 | top: 0; 30 | bottom: 50%; 31 | border-radius: 10px 10px 0 0; 32 | border-bottom: solid 1px #666; 33 | } 34 | 35 | .M-FlipCard .digital:after { 36 | top: 50%; 37 | bottom: 0; 38 | border-radius: 0 0 10px 10px; 39 | line-height: 0; 40 | } 41 | 42 | /*向下翻*/ 43 | .M-FlipCard.down .front:before { 44 | z-index: 3; 45 | } 46 | 47 | .M-FlipCard.down .back:after { 48 | z-index: 2; 49 | transform-origin: 50% 0%; 50 | transform: perspective(160px) rotateX(180deg); 51 | } 52 | 53 | .M-FlipCard.down .front:after, 54 | .M-FlipCard.down .back:before { 55 | z-index: 1; 56 | } 57 | 58 | .M-FlipCard.down.go .front:before { 59 | transform-origin: 50% 100%; 60 | animation: frontFlipDown 0.6s ease-in-out both; 61 | box-shadow: 0 -2px 6px rgba(255, 255, 255, 0.3); 62 | backface-visibility: hidden; 63 | } 64 | 65 | .M-FlipCard.down.go .back:after { 66 | animation: backFlipDown 0.6s ease-in-out both; 67 | } 68 | 69 | /*向上翻*/ 70 | .M-FlipCard.up .front:after { 71 | z-index: 3; 72 | } 73 | 74 | .M-FlipCard.up .back:before { 75 | z-index: 2; 76 | transform-origin: 50% 100%; 77 | transform: perspective(160px) rotateX(-180deg); 78 | } 79 | 80 | .M-FlipCard.up .front:before, 81 | .M-FlipCard.up .back:after { 82 | z-index: 1; 83 | } 84 | 85 | .M-FlipCard.up.go .front:after { 86 | transform-origin: 50% 0; 87 | animation: frontFlipUp 0.6s ease-in-out both; 88 | box-shadow: 0 2px 6px rgba(255, 255, 255, 0.3); 89 | backface-visibility: hidden; 90 | } 91 | 92 | .M-FlipCard.up.go .back:before { 93 | animation: backFlipUp 0.6s ease-in-out both; 94 | } 95 | 96 | @keyframes frontFlipDown { 97 | 0% { 98 | transform: perspective(160px) rotateX(0deg); 99 | } 100 | 101 | 100% { 102 | transform: perspective(160px) rotateX(-180deg); 103 | } 104 | } 105 | 106 | @keyframes backFlipDown { 107 | 0% { 108 | transform: perspective(160px) rotateX(180deg); 109 | } 110 | 111 | 100% { 112 | transform: perspective(160px) rotateX(0deg); 113 | } 114 | } 115 | 116 | @keyframes frontFlipUp { 117 | 0% { 118 | transform: perspective(160px) rotateX(0deg); 119 | } 120 | 121 | 100% { 122 | transform: perspective(160px) rotateX(180deg); 123 | } 124 | } 125 | 126 | @keyframes backFlipUp { 127 | 0% { 128 | transform: perspective(160px) rotateX(-180deg); 129 | } 130 | 131 | 100% { 132 | transform: perspective(160px) rotateX(0deg); 133 | } 134 | } 135 | 136 | .M-FlipCard .number0:before, 137 | .M-FlipCard .number0:after { 138 | content: '0'; 139 | } 140 | 141 | .M-FlipCard .number1:before, 142 | .M-FlipCard .number1:after { 143 | content: '1'; 144 | } 145 | 146 | .M-FlipCard .number2:before, 147 | .M-FlipCard .number2:after { 148 | content: '2'; 149 | } 150 | 151 | .M-FlipCard .number3:before, 152 | .M-FlipCard .number3:after { 153 | content: '3'; 154 | } 155 | 156 | .M-FlipCard .number4:before, 157 | .M-FlipCard .number4:after { 158 | content: '4'; 159 | } 160 | 161 | .M-FlipCard .number5:before, 162 | .M-FlipCard .number5:after { 163 | content: '5'; 164 | } 165 | 166 | .M-FlipCard .number6:before, 167 | .M-FlipCard .number6:after { 168 | content: '6'; 169 | } 170 | 171 | .M-FlipCard .number7:before, 172 | .M-FlipCard .number7:after { 173 | content: '7'; 174 | } 175 | 176 | .M-FlipCard .number8:before, 177 | .M-FlipCard .number8:after { 178 | content: '8'; 179 | } 180 | 181 | .M-FlipCard .number9:before, 182 | .M-FlipCard .number9:after { 183 | content: '9'; 184 | } -------------------------------------------------------------------------------- /flipClock2025-react-js/src/components/flipCard/index.jsx: -------------------------------------------------------------------------------- 1 | /* 2 | * 翻牌数字 3 | * @author: 兔子先生 4 | * @media: 请关注微信公众号【卧梅又闻花】,获取最新优秀开发教程 5 | * @updateDate: 2025-03 6 | */ 7 | 8 | import { useState, useImperativeHandle, forwardRef } from 'react' 9 | import PropTypes from 'prop-types' 10 | import './flipCard.css' 11 | function FlipCard( 12 | { 13 | // 初始前牌文字 14 | initFrontText = '0', 15 | // 初始后牌文字 16 | initBackText = '1', 17 | // 翻牌动画时间,与CSS中设置的animation-duration保持一致 18 | duration = 600, 19 | }, 20 | ref 21 | ) { 22 | // 是否正在翻转中 23 | const [isFlipping, setIsFlipping] = useState(false) 24 | // 翻转类型,down=向下翻转,up=向上翻转 25 | const [flipType, setFlipType] = useState('down') 26 | // 前牌文字 27 | const [frontText, setFrontText] = useState(initFrontText) 28 | // 后牌文字 29 | const [backText, setBackText] = useState(initBackText) 30 | 31 | // 翻转 32 | const flip = ({ type, newFrontText, newBackText }) => { 33 | if (isFlipping) { 34 | return false 35 | } 36 | setFrontText(newFrontText) 37 | setBackText(newBackText) 38 | setFlipType(type) 39 | setIsFlipping(true) 40 | 41 | setTimeout(() => { 42 | setFrontText(newBackText) 43 | setIsFlipping(false) 44 | }, duration) 45 | } 46 | useImperativeHandle(ref, () => { 47 | return { 48 | // 下翻牌 49 | flipDown: (newFrontText, newBackText) => { 50 | flip({ type: 'down', newFrontText, newBackText }) 51 | }, 52 | // 上翻牌 53 | flipUp: (newFrontText, newBackText) => { 54 | flip({ type: 'up', newFrontText, newBackText }) 55 | }, 56 | } 57 | }) 58 | 59 | return ( 60 |
65 |
66 |
67 |
68 | ) 69 | } 70 | 71 | FlipCard.propTypes = { 72 | initFrontText: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), 73 | initBackText: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), 74 | duration: PropTypes.number, 75 | } 76 | 77 | export default forwardRef(FlipCard) 78 | -------------------------------------------------------------------------------- /flipClock2025-react-js/src/components/flipClock/flipClock.css: -------------------------------------------------------------------------------- 1 | .FlipClock { 2 | text-align: center; 3 | } 4 | 5 | .FlipClock .M-FlipCard { 6 | margin: 0 3px; 7 | } 8 | 9 | .FlipClock em { 10 | display: inline-block; 11 | line-height: 102px; 12 | font-size: 66px; 13 | font-style: normal; 14 | vertical-align: top; 15 | } 16 | -------------------------------------------------------------------------------- /flipClock2025-react-js/src/components/flipClock/index.jsx: -------------------------------------------------------------------------------- 1 | /* 2 | * 翻牌数字 3 | * @author: 兔子先生 4 | * @media: 请关注微信公众号【卧梅又闻花】,获取最新优秀开发教程 5 | * @updateDate: 2025-03 6 | */ 7 | 8 | import { useEffect, useRef } from 'react' 9 | import FlipCard from '../flipCard' 10 | import './flipClock.css' 11 | 12 | function FilpClock() { 13 | const timer = useRef(null) 14 | 15 | const flipCardHour1Ref = useRef(null) 16 | const flipCardHour2Ref = useRef(null) 17 | const flipCardMinute1Ref = useRef(null) 18 | const flipCardMinute2Ref = useRef(null) 19 | const flipCardSecond1Ref = useRef(null) 20 | const flipCardSecond2Ref = useRef(null) 21 | 22 | const flipCards = [ 23 | flipCardHour1Ref, 24 | flipCardHour2Ref, 25 | flipCardMinute1Ref, 26 | flipCardMinute2Ref, 27 | flipCardSecond1Ref, 28 | flipCardSecond2Ref, 29 | ] 30 | 31 | useEffect(() => { 32 | // 开始计时 33 | const run = () => { 34 | timer.current = setInterval(() => { 35 | // 获取当前时间 36 | const now = new Date() 37 | const nowTimeStr = formatDate( 38 | new Date(now.getTime() - 1000), 39 | 'hhiiss' 40 | ) 41 | const nextTimeStr = formatDate(now, 'hhiiss') 42 | for (let i = 0; i < flipCards.length; i++) { 43 | if (nowTimeStr[i] === nextTimeStr[i]) { 44 | continue 45 | } 46 | flipCards[i].current.flipDown(nowTimeStr[i], nextTimeStr[i]) 47 | } 48 | }, 1000) 49 | } 50 | run() 51 | }) 52 | 53 | // 正则格式化日期 54 | const formatDate = (date, dateFormat) => { 55 | /* 单独格式化年份,根据y的字符数量输出年份 56 | * 例如:yyyy => 2019 57 | yy => 19 58 | y => 9 59 | */ 60 | const yearMatch = dateFormat.match(/(y+)/) 61 | if (yearMatch) { 62 | dateFormat = dateFormat.replace( 63 | yearMatch[0], 64 | (date.getFullYear() + '').slice(-yearMatch[0].length) 65 | ) 66 | } 67 | // 格式化月、日、时、分、秒 68 | const formatMap = { 69 | 'm+': date.getMonth() + 1, 70 | 'd+': date.getDate(), 71 | 'h+': date.getHours(), 72 | 'i+': date.getMinutes(), 73 | 's+': date.getSeconds(), 74 | } 75 | for (const key in formatMap) { 76 | const match = dateFormat.match(new RegExp(`(${key})`)) 77 | if (match) { 78 | // 取出对应的值 79 | const str = formatMap[key] + '' 80 | /* 根据设置的格式,输出对应的字符 81 | * 例如: 早上8时,hh => 08,h => 8 82 | * 但是,当数字>=10时,无论格式为一位还是多位,不做截取,这是与年份格式化不一致的地方 83 | * 例如: 下午15时,hh => 15, h => 15 84 | */ 85 | dateFormat = dateFormat.replace( 86 | match[0], 87 | match[0].length === 1 ? str : str.padStart(2, '0') 88 | ) 89 | } 90 | } 91 | 92 | return dateFormat 93 | } 94 | 95 | // 初始化 96 | const now = new Date() 97 | const initNowTimeStr = formatDate(new Date(now.getTime()), 'hhiiss') 98 | 99 | return ( 100 |
101 | 102 | 103 | : 104 | 108 | 112 | : 113 | 117 | 121 |
122 | ) 123 | } 124 | 125 | export default FilpClock 126 | -------------------------------------------------------------------------------- /flipClock2025-react-js/src/main.jsx: -------------------------------------------------------------------------------- 1 | import { createRoot } from 'react-dom/client' 2 | import App from './App.jsx' 3 | 4 | createRoot(document.getElementById('root')).render() 5 | -------------------------------------------------------------------------------- /flipClock2025-react-js/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react' 3 | import checker from 'vite-plugin-checker' 4 | 5 | // https://vite.dev/config/ 6 | export default defineConfig({ 7 | server: { host: '0.0.0.0' }, 8 | // 静态资源引用路径,默认为"/" 9 | base: './', 10 | plugins: [ 11 | react(), 12 | checker({ 13 | eslint: { 14 | // useFlatConfig: true 表示使用扁平模式配置(eslint.config.js) 15 | // useFlatConfig: false 表示使用传统模式配置(如.eslintrc.json、.eslintrc.cjs) 16 | useFlatConfig: true, 17 | lintCommand: 'eslint "./src/**/*.{js,jsx,ts,tsx}"', 18 | }, 19 | }), 20 | ], 21 | }) 22 | -------------------------------------------------------------------------------- /flipClock2025-react-ts/.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 | -------------------------------------------------------------------------------- /flipClock2025-react-ts/README.md: -------------------------------------------------------------------------------- 1 | # 2025新春版:干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React) 2 | ## React18/19 Typescript版 3 | 4 | > 本项目提供的是组件源码,并不是npm依赖包。适合直接放到实际项目中使用,可根据实际项目需求自行修改。 5 | 6 | ## 使用方法 7 | 8 | 安装依赖包: 9 | ``` 10 | npm install 11 | ``` 12 | 13 | 运行项目: 14 | ``` 15 | npm run dev 16 | ``` 17 | 18 | build项目: 19 | ``` 20 | npm run build 21 | ``` 22 | 23 | ## 教程原文 24 | 25 | 📚📚 本项目有详细的讲解教程,原文请关注我的微信公众号【卧梅又闻花】📚📚 26 | 27 | 初版教程(原理讲解看这个教程): 28 | 29 | [《干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React》](https://mp.weixin.qq.com/s/cdQQrK-xG00MmxPawUzeew) 30 | 31 | 2025年春季翻新版教程(原理不变,仅更新了React和Vue代码): 32 | 33 | [《2025新春版:干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React》](https://mp.weixin.qq.com/s/1xy10ZFPtU0cyVQi-AmRbw) 34 | 35 | ## 教程目录 36 | 37 | ``` 38 | 1 翻牌的构建 39 | • 1.1 基本结构 40 | • 1.2 构建纸牌并用伪元素拆分上下两部分 41 | • 知识点1:伪元素的使用 42 | • 1.3 为纸牌添加文字 43 | • 知识点2:line-height: 0的妙用 44 | • 1.4 设置纸牌的层叠关系 45 | • 知识点3:transform-origin和perspective 46 | 2 翻牌动画的实现 47 | • 2.1 CSS3翻牌动画 48 | • 知识点4:backface-visibility 49 | • 2.2 JS实现翻牌交互 50 | 3 翻牌时钟的实现 51 | • 3.1 HTML构建 52 | • 3.2 构建Flipper类 53 | • 3.3 实现时钟业务逻辑 54 | • 知识点5:时间格式化函数的实现 55 | • 3.4 运行时钟 56 | 4 Vue & React封装 57 | • 项目Git源码 58 | ``` 59 | 60 | ![image](https://wx3.sinaimg.cn/large/475dd357ly1gbh774dw0dj210n0ku443.jpg) 61 | -------------------------------------------------------------------------------- /flipClock2025-react-ts/eslint.config.js: -------------------------------------------------------------------------------- 1 | import js from '@eslint/js' 2 | import globals from 'globals' 3 | import reactHooks from 'eslint-plugin-react-hooks' 4 | import reactRefresh from 'eslint-plugin-react-refresh' 5 | import tseslint from 'typescript-eslint' 6 | 7 | export default tseslint.config( 8 | { ignores: ['dist'] }, 9 | { 10 | extends: [js.configs.recommended, ...tseslint.configs.recommended], 11 | files: ['**/*.{ts,tsx}'], 12 | languageOptions: { 13 | ecmaVersion: 2020, 14 | globals: globals.browser, 15 | }, 16 | plugins: { 17 | 'react-hooks': reactHooks, 18 | 'react-refresh': reactRefresh, 19 | }, 20 | rules: { 21 | ...reactHooks.configs.recommended.rules, 22 | 'react-refresh/only-export-components': [ 23 | 'warn', 24 | { allowConstantExport: true }, 25 | ], 26 | }, 27 | }, 28 | ) 29 | -------------------------------------------------------------------------------- /flipClock2025-react-ts/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | flipClock2025-react-ts 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /flipClock2025-react-ts/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "flipclock2025-react-ts", 3 | "version": "0.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "flipclock2025-react-ts", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "react": "^19.0.0", 12 | "react-dom": "^19.0.0" 13 | }, 14 | "devDependencies": { 15 | "@eslint/js": "^9.21.0", 16 | "@types/react": "^19.0.10", 17 | "@types/react-dom": "^19.0.4", 18 | "@vitejs/plugin-react": "^4.3.4", 19 | "eslint": "^9.21.0", 20 | "eslint-plugin-react-hooks": "^5.2.0", 21 | "eslint-plugin-react-refresh": "^0.4.19", 22 | "globals": "^16.0.0", 23 | "typescript": "~5.7.3", 24 | "typescript-eslint": "^8.25.0", 25 | "vite": "^6.2.0", 26 | "vite-plugin-checker": "^0.9.0" 27 | } 28 | }, 29 | "node_modules/@ampproject/remapping": { 30 | "version": "2.3.0", 31 | "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz", 32 | "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 33 | "dev": true, 34 | "license": "Apache-2.0", 35 | "dependencies": { 36 | "@jridgewell/gen-mapping": "^0.3.5", 37 | "@jridgewell/trace-mapping": "^0.3.24" 38 | }, 39 | "engines": { 40 | "node": ">=6.0.0" 41 | } 42 | }, 43 | "node_modules/@babel/code-frame": { 44 | "version": "7.26.2", 45 | "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.26.2.tgz", 46 | "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", 47 | "dev": true, 48 | "license": "MIT", 49 | "dependencies": { 50 | "@babel/helper-validator-identifier": "^7.25.9", 51 | "js-tokens": "^4.0.0", 52 | "picocolors": "^1.0.0" 53 | }, 54 | "engines": { 55 | "node": ">=6.9.0" 56 | } 57 | }, 58 | "node_modules/@babel/compat-data": { 59 | "version": "7.26.8", 60 | "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.26.8.tgz", 61 | "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", 62 | "dev": true, 63 | "license": "MIT", 64 | "engines": { 65 | "node": ">=6.9.0" 66 | } 67 | }, 68 | "node_modules/@babel/core": { 69 | "version": "7.26.9", 70 | "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.26.9.tgz", 71 | "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", 72 | "dev": true, 73 | "license": "MIT", 74 | "dependencies": { 75 | "@ampproject/remapping": "^2.2.0", 76 | "@babel/code-frame": "^7.26.2", 77 | "@babel/generator": "^7.26.9", 78 | "@babel/helper-compilation-targets": "^7.26.5", 79 | "@babel/helper-module-transforms": "^7.26.0", 80 | "@babel/helpers": "^7.26.9", 81 | "@babel/parser": "^7.26.9", 82 | "@babel/template": "^7.26.9", 83 | "@babel/traverse": "^7.26.9", 84 | "@babel/types": "^7.26.9", 85 | "convert-source-map": "^2.0.0", 86 | "debug": "^4.1.0", 87 | "gensync": "^1.0.0-beta.2", 88 | "json5": "^2.2.3", 89 | "semver": "^6.3.1" 90 | }, 91 | "engines": { 92 | "node": ">=6.9.0" 93 | }, 94 | "funding": { 95 | "type": "opencollective", 96 | "url": "https://opencollective.com/babel" 97 | } 98 | }, 99 | "node_modules/@babel/generator": { 100 | "version": "7.26.9", 101 | "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.26.9.tgz", 102 | "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", 103 | "dev": true, 104 | "license": "MIT", 105 | "dependencies": { 106 | "@babel/parser": "^7.26.9", 107 | "@babel/types": "^7.26.9", 108 | "@jridgewell/gen-mapping": "^0.3.5", 109 | "@jridgewell/trace-mapping": "^0.3.25", 110 | "jsesc": "^3.0.2" 111 | }, 112 | "engines": { 113 | "node": ">=6.9.0" 114 | } 115 | }, 116 | "node_modules/@babel/helper-compilation-targets": { 117 | "version": "7.26.5", 118 | "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", 119 | "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", 120 | "dev": true, 121 | "license": "MIT", 122 | "dependencies": { 123 | "@babel/compat-data": "^7.26.5", 124 | "@babel/helper-validator-option": "^7.25.9", 125 | "browserslist": "^4.24.0", 126 | "lru-cache": "^5.1.1", 127 | "semver": "^6.3.1" 128 | }, 129 | "engines": { 130 | "node": ">=6.9.0" 131 | } 132 | }, 133 | "node_modules/@babel/helper-module-imports": { 134 | "version": "7.25.9", 135 | "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", 136 | "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", 137 | "dev": true, 138 | "license": "MIT", 139 | "dependencies": { 140 | "@babel/traverse": "^7.25.9", 141 | "@babel/types": "^7.25.9" 142 | }, 143 | "engines": { 144 | "node": ">=6.9.0" 145 | } 146 | }, 147 | "node_modules/@babel/helper-module-transforms": { 148 | "version": "7.26.0", 149 | "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", 150 | "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", 151 | "dev": true, 152 | "license": "MIT", 153 | "dependencies": { 154 | "@babel/helper-module-imports": "^7.25.9", 155 | "@babel/helper-validator-identifier": "^7.25.9", 156 | "@babel/traverse": "^7.25.9" 157 | }, 158 | "engines": { 159 | "node": ">=6.9.0" 160 | }, 161 | "peerDependencies": { 162 | "@babel/core": "^7.0.0" 163 | } 164 | }, 165 | "node_modules/@babel/helper-plugin-utils": { 166 | "version": "7.26.5", 167 | "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", 168 | "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", 169 | "dev": true, 170 | "license": "MIT", 171 | "engines": { 172 | "node": ">=6.9.0" 173 | } 174 | }, 175 | "node_modules/@babel/helper-string-parser": { 176 | "version": "7.25.9", 177 | "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", 178 | "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", 179 | "dev": true, 180 | "license": "MIT", 181 | "engines": { 182 | "node": ">=6.9.0" 183 | } 184 | }, 185 | "node_modules/@babel/helper-validator-identifier": { 186 | "version": "7.25.9", 187 | "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", 188 | "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", 189 | "dev": true, 190 | "license": "MIT", 191 | "engines": { 192 | "node": ">=6.9.0" 193 | } 194 | }, 195 | "node_modules/@babel/helper-validator-option": { 196 | "version": "7.25.9", 197 | "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", 198 | "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", 199 | "dev": true, 200 | "license": "MIT", 201 | "engines": { 202 | "node": ">=6.9.0" 203 | } 204 | }, 205 | "node_modules/@babel/helpers": { 206 | "version": "7.26.9", 207 | "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.26.9.tgz", 208 | "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", 209 | "dev": true, 210 | "license": "MIT", 211 | "dependencies": { 212 | "@babel/template": "^7.26.9", 213 | "@babel/types": "^7.26.9" 214 | }, 215 | "engines": { 216 | "node": ">=6.9.0" 217 | } 218 | }, 219 | "node_modules/@babel/parser": { 220 | "version": "7.26.9", 221 | "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.26.9.tgz", 222 | "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", 223 | "dev": true, 224 | "license": "MIT", 225 | "dependencies": { 226 | "@babel/types": "^7.26.9" 227 | }, 228 | "bin": { 229 | "parser": "bin/babel-parser.js" 230 | }, 231 | "engines": { 232 | "node": ">=6.0.0" 233 | } 234 | }, 235 | "node_modules/@babel/plugin-transform-react-jsx-self": { 236 | "version": "7.25.9", 237 | "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", 238 | "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", 239 | "dev": true, 240 | "license": "MIT", 241 | "dependencies": { 242 | "@babel/helper-plugin-utils": "^7.25.9" 243 | }, 244 | "engines": { 245 | "node": ">=6.9.0" 246 | }, 247 | "peerDependencies": { 248 | "@babel/core": "^7.0.0-0" 249 | } 250 | }, 251 | "node_modules/@babel/plugin-transform-react-jsx-source": { 252 | "version": "7.25.9", 253 | "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", 254 | "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", 255 | "dev": true, 256 | "license": "MIT", 257 | "dependencies": { 258 | "@babel/helper-plugin-utils": "^7.25.9" 259 | }, 260 | "engines": { 261 | "node": ">=6.9.0" 262 | }, 263 | "peerDependencies": { 264 | "@babel/core": "^7.0.0-0" 265 | } 266 | }, 267 | "node_modules/@babel/template": { 268 | "version": "7.26.9", 269 | "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.26.9.tgz", 270 | "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", 271 | "dev": true, 272 | "license": "MIT", 273 | "dependencies": { 274 | "@babel/code-frame": "^7.26.2", 275 | "@babel/parser": "^7.26.9", 276 | "@babel/types": "^7.26.9" 277 | }, 278 | "engines": { 279 | "node": ">=6.9.0" 280 | } 281 | }, 282 | "node_modules/@babel/traverse": { 283 | "version": "7.26.9", 284 | "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.26.9.tgz", 285 | "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", 286 | "dev": true, 287 | "license": "MIT", 288 | "dependencies": { 289 | "@babel/code-frame": "^7.26.2", 290 | "@babel/generator": "^7.26.9", 291 | "@babel/parser": "^7.26.9", 292 | "@babel/template": "^7.26.9", 293 | "@babel/types": "^7.26.9", 294 | "debug": "^4.3.1", 295 | "globals": "^11.1.0" 296 | }, 297 | "engines": { 298 | "node": ">=6.9.0" 299 | } 300 | }, 301 | "node_modules/@babel/traverse/node_modules/globals": { 302 | "version": "11.12.0", 303 | "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz", 304 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 305 | "dev": true, 306 | "license": "MIT", 307 | "engines": { 308 | "node": ">=4" 309 | } 310 | }, 311 | "node_modules/@babel/types": { 312 | "version": "7.26.9", 313 | "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.26.9.tgz", 314 | "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", 315 | "dev": true, 316 | "license": "MIT", 317 | "dependencies": { 318 | "@babel/helper-string-parser": "^7.25.9", 319 | "@babel/helper-validator-identifier": "^7.25.9" 320 | }, 321 | "engines": { 322 | "node": ">=6.9.0" 323 | } 324 | }, 325 | "node_modules/@esbuild/aix-ppc64": { 326 | "version": "0.25.0", 327 | "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", 328 | "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", 329 | "cpu": [ 330 | "ppc64" 331 | ], 332 | "dev": true, 333 | "license": "MIT", 334 | "optional": true, 335 | "os": [ 336 | "aix" 337 | ], 338 | "engines": { 339 | "node": ">=18" 340 | } 341 | }, 342 | "node_modules/@esbuild/android-arm": { 343 | "version": "0.25.0", 344 | "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.0.tgz", 345 | "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", 346 | "cpu": [ 347 | "arm" 348 | ], 349 | "dev": true, 350 | "license": "MIT", 351 | "optional": true, 352 | "os": [ 353 | "android" 354 | ], 355 | "engines": { 356 | "node": ">=18" 357 | } 358 | }, 359 | "node_modules/@esbuild/android-arm64": { 360 | "version": "0.25.0", 361 | "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", 362 | "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", 363 | "cpu": [ 364 | "arm64" 365 | ], 366 | "dev": true, 367 | "license": "MIT", 368 | "optional": true, 369 | "os": [ 370 | "android" 371 | ], 372 | "engines": { 373 | "node": ">=18" 374 | } 375 | }, 376 | "node_modules/@esbuild/android-x64": { 377 | "version": "0.25.0", 378 | "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.0.tgz", 379 | "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", 380 | "cpu": [ 381 | "x64" 382 | ], 383 | "dev": true, 384 | "license": "MIT", 385 | "optional": true, 386 | "os": [ 387 | "android" 388 | ], 389 | "engines": { 390 | "node": ">=18" 391 | } 392 | }, 393 | "node_modules/@esbuild/darwin-arm64": { 394 | "version": "0.25.0", 395 | "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", 396 | "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", 397 | "cpu": [ 398 | "arm64" 399 | ], 400 | "dev": true, 401 | "license": "MIT", 402 | "optional": true, 403 | "os": [ 404 | "darwin" 405 | ], 406 | "engines": { 407 | "node": ">=18" 408 | } 409 | }, 410 | "node_modules/@esbuild/darwin-x64": { 411 | "version": "0.25.0", 412 | "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", 413 | "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", 414 | "cpu": [ 415 | "x64" 416 | ], 417 | "dev": true, 418 | "license": "MIT", 419 | "optional": true, 420 | "os": [ 421 | "darwin" 422 | ], 423 | "engines": { 424 | "node": ">=18" 425 | } 426 | }, 427 | "node_modules/@esbuild/freebsd-arm64": { 428 | "version": "0.25.0", 429 | "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", 430 | "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", 431 | "cpu": [ 432 | "arm64" 433 | ], 434 | "dev": true, 435 | "license": "MIT", 436 | "optional": true, 437 | "os": [ 438 | "freebsd" 439 | ], 440 | "engines": { 441 | "node": ">=18" 442 | } 443 | }, 444 | "node_modules/@esbuild/freebsd-x64": { 445 | "version": "0.25.0", 446 | "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", 447 | "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", 448 | "cpu": [ 449 | "x64" 450 | ], 451 | "dev": true, 452 | "license": "MIT", 453 | "optional": true, 454 | "os": [ 455 | "freebsd" 456 | ], 457 | "engines": { 458 | "node": ">=18" 459 | } 460 | }, 461 | "node_modules/@esbuild/linux-arm": { 462 | "version": "0.25.0", 463 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", 464 | "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", 465 | "cpu": [ 466 | "arm" 467 | ], 468 | "dev": true, 469 | "license": "MIT", 470 | "optional": true, 471 | "os": [ 472 | "linux" 473 | ], 474 | "engines": { 475 | "node": ">=18" 476 | } 477 | }, 478 | "node_modules/@esbuild/linux-arm64": { 479 | "version": "0.25.0", 480 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", 481 | "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", 482 | "cpu": [ 483 | "arm64" 484 | ], 485 | "dev": true, 486 | "license": "MIT", 487 | "optional": true, 488 | "os": [ 489 | "linux" 490 | ], 491 | "engines": { 492 | "node": ">=18" 493 | } 494 | }, 495 | "node_modules/@esbuild/linux-ia32": { 496 | "version": "0.25.0", 497 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", 498 | "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", 499 | "cpu": [ 500 | "ia32" 501 | ], 502 | "dev": true, 503 | "license": "MIT", 504 | "optional": true, 505 | "os": [ 506 | "linux" 507 | ], 508 | "engines": { 509 | "node": ">=18" 510 | } 511 | }, 512 | "node_modules/@esbuild/linux-loong64": { 513 | "version": "0.25.0", 514 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", 515 | "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", 516 | "cpu": [ 517 | "loong64" 518 | ], 519 | "dev": true, 520 | "license": "MIT", 521 | "optional": true, 522 | "os": [ 523 | "linux" 524 | ], 525 | "engines": { 526 | "node": ">=18" 527 | } 528 | }, 529 | "node_modules/@esbuild/linux-mips64el": { 530 | "version": "0.25.0", 531 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", 532 | "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", 533 | "cpu": [ 534 | "mips64el" 535 | ], 536 | "dev": true, 537 | "license": "MIT", 538 | "optional": true, 539 | "os": [ 540 | "linux" 541 | ], 542 | "engines": { 543 | "node": ">=18" 544 | } 545 | }, 546 | "node_modules/@esbuild/linux-ppc64": { 547 | "version": "0.25.0", 548 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", 549 | "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", 550 | "cpu": [ 551 | "ppc64" 552 | ], 553 | "dev": true, 554 | "license": "MIT", 555 | "optional": true, 556 | "os": [ 557 | "linux" 558 | ], 559 | "engines": { 560 | "node": ">=18" 561 | } 562 | }, 563 | "node_modules/@esbuild/linux-riscv64": { 564 | "version": "0.25.0", 565 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", 566 | "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", 567 | "cpu": [ 568 | "riscv64" 569 | ], 570 | "dev": true, 571 | "license": "MIT", 572 | "optional": true, 573 | "os": [ 574 | "linux" 575 | ], 576 | "engines": { 577 | "node": ">=18" 578 | } 579 | }, 580 | "node_modules/@esbuild/linux-s390x": { 581 | "version": "0.25.0", 582 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", 583 | "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", 584 | "cpu": [ 585 | "s390x" 586 | ], 587 | "dev": true, 588 | "license": "MIT", 589 | "optional": true, 590 | "os": [ 591 | "linux" 592 | ], 593 | "engines": { 594 | "node": ">=18" 595 | } 596 | }, 597 | "node_modules/@esbuild/linux-x64": { 598 | "version": "0.25.0", 599 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", 600 | "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", 601 | "cpu": [ 602 | "x64" 603 | ], 604 | "dev": true, 605 | "license": "MIT", 606 | "optional": true, 607 | "os": [ 608 | "linux" 609 | ], 610 | "engines": { 611 | "node": ">=18" 612 | } 613 | }, 614 | "node_modules/@esbuild/netbsd-arm64": { 615 | "version": "0.25.0", 616 | "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", 617 | "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", 618 | "cpu": [ 619 | "arm64" 620 | ], 621 | "dev": true, 622 | "license": "MIT", 623 | "optional": true, 624 | "os": [ 625 | "netbsd" 626 | ], 627 | "engines": { 628 | "node": ">=18" 629 | } 630 | }, 631 | "node_modules/@esbuild/netbsd-x64": { 632 | "version": "0.25.0", 633 | "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", 634 | "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", 635 | "cpu": [ 636 | "x64" 637 | ], 638 | "dev": true, 639 | "license": "MIT", 640 | "optional": true, 641 | "os": [ 642 | "netbsd" 643 | ], 644 | "engines": { 645 | "node": ">=18" 646 | } 647 | }, 648 | "node_modules/@esbuild/openbsd-arm64": { 649 | "version": "0.25.0", 650 | "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", 651 | "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", 652 | "cpu": [ 653 | "arm64" 654 | ], 655 | "dev": true, 656 | "license": "MIT", 657 | "optional": true, 658 | "os": [ 659 | "openbsd" 660 | ], 661 | "engines": { 662 | "node": ">=18" 663 | } 664 | }, 665 | "node_modules/@esbuild/openbsd-x64": { 666 | "version": "0.25.0", 667 | "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", 668 | "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", 669 | "cpu": [ 670 | "x64" 671 | ], 672 | "dev": true, 673 | "license": "MIT", 674 | "optional": true, 675 | "os": [ 676 | "openbsd" 677 | ], 678 | "engines": { 679 | "node": ">=18" 680 | } 681 | }, 682 | "node_modules/@esbuild/sunos-x64": { 683 | "version": "0.25.0", 684 | "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", 685 | "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", 686 | "cpu": [ 687 | "x64" 688 | ], 689 | "dev": true, 690 | "license": "MIT", 691 | "optional": true, 692 | "os": [ 693 | "sunos" 694 | ], 695 | "engines": { 696 | "node": ">=18" 697 | } 698 | }, 699 | "node_modules/@esbuild/win32-arm64": { 700 | "version": "0.25.0", 701 | "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", 702 | "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", 703 | "cpu": [ 704 | "arm64" 705 | ], 706 | "dev": true, 707 | "license": "MIT", 708 | "optional": true, 709 | "os": [ 710 | "win32" 711 | ], 712 | "engines": { 713 | "node": ">=18" 714 | } 715 | }, 716 | "node_modules/@esbuild/win32-ia32": { 717 | "version": "0.25.0", 718 | "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", 719 | "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", 720 | "cpu": [ 721 | "ia32" 722 | ], 723 | "dev": true, 724 | "license": "MIT", 725 | "optional": true, 726 | "os": [ 727 | "win32" 728 | ], 729 | "engines": { 730 | "node": ">=18" 731 | } 732 | }, 733 | "node_modules/@esbuild/win32-x64": { 734 | "version": "0.25.0", 735 | "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", 736 | "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", 737 | "cpu": [ 738 | "x64" 739 | ], 740 | "dev": true, 741 | "license": "MIT", 742 | "optional": true, 743 | "os": [ 744 | "win32" 745 | ], 746 | "engines": { 747 | "node": ">=18" 748 | } 749 | }, 750 | "node_modules/@eslint-community/eslint-utils": { 751 | "version": "4.4.1", 752 | "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", 753 | "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", 754 | "dev": true, 755 | "license": "MIT", 756 | "dependencies": { 757 | "eslint-visitor-keys": "^3.4.3" 758 | }, 759 | "engines": { 760 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 761 | }, 762 | "funding": { 763 | "url": "https://opencollective.com/eslint" 764 | }, 765 | "peerDependencies": { 766 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 767 | } 768 | }, 769 | "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { 770 | "version": "3.4.3", 771 | "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 772 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 773 | "dev": true, 774 | "license": "Apache-2.0", 775 | "engines": { 776 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 777 | }, 778 | "funding": { 779 | "url": "https://opencollective.com/eslint" 780 | } 781 | }, 782 | "node_modules/@eslint-community/regexpp": { 783 | "version": "4.12.1", 784 | "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", 785 | "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", 786 | "dev": true, 787 | "license": "MIT", 788 | "engines": { 789 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 790 | } 791 | }, 792 | "node_modules/@eslint/config-array": { 793 | "version": "0.19.2", 794 | "resolved": "https://registry.npmmirror.com/@eslint/config-array/-/config-array-0.19.2.tgz", 795 | "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", 796 | "dev": true, 797 | "license": "Apache-2.0", 798 | "dependencies": { 799 | "@eslint/object-schema": "^2.1.6", 800 | "debug": "^4.3.1", 801 | "minimatch": "^3.1.2" 802 | }, 803 | "engines": { 804 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 805 | } 806 | }, 807 | "node_modules/@eslint/core": { 808 | "version": "0.12.0", 809 | "resolved": "https://registry.npmmirror.com/@eslint/core/-/core-0.12.0.tgz", 810 | "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", 811 | "dev": true, 812 | "license": "Apache-2.0", 813 | "dependencies": { 814 | "@types/json-schema": "^7.0.15" 815 | }, 816 | "engines": { 817 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 818 | } 819 | }, 820 | "node_modules/@eslint/eslintrc": { 821 | "version": "3.3.0", 822 | "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-3.3.0.tgz", 823 | "integrity": "sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==", 824 | "dev": true, 825 | "license": "MIT", 826 | "dependencies": { 827 | "ajv": "^6.12.4", 828 | "debug": "^4.3.2", 829 | "espree": "^10.0.1", 830 | "globals": "^14.0.0", 831 | "ignore": "^5.2.0", 832 | "import-fresh": "^3.2.1", 833 | "js-yaml": "^4.1.0", 834 | "minimatch": "^3.1.2", 835 | "strip-json-comments": "^3.1.1" 836 | }, 837 | "engines": { 838 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 839 | }, 840 | "funding": { 841 | "url": "https://opencollective.com/eslint" 842 | } 843 | }, 844 | "node_modules/@eslint/eslintrc/node_modules/globals": { 845 | "version": "14.0.0", 846 | "resolved": "https://registry.npmmirror.com/globals/-/globals-14.0.0.tgz", 847 | "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", 848 | "dev": true, 849 | "license": "MIT", 850 | "engines": { 851 | "node": ">=18" 852 | }, 853 | "funding": { 854 | "url": "https://github.com/sponsors/sindresorhus" 855 | } 856 | }, 857 | "node_modules/@eslint/js": { 858 | "version": "9.21.0", 859 | "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-9.21.0.tgz", 860 | "integrity": "sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==", 861 | "dev": true, 862 | "license": "MIT", 863 | "engines": { 864 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 865 | } 866 | }, 867 | "node_modules/@eslint/object-schema": { 868 | "version": "2.1.6", 869 | "resolved": "https://registry.npmmirror.com/@eslint/object-schema/-/object-schema-2.1.6.tgz", 870 | "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", 871 | "dev": true, 872 | "license": "Apache-2.0", 873 | "engines": { 874 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 875 | } 876 | }, 877 | "node_modules/@eslint/plugin-kit": { 878 | "version": "0.2.7", 879 | "resolved": "https://registry.npmmirror.com/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", 880 | "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", 881 | "dev": true, 882 | "license": "Apache-2.0", 883 | "dependencies": { 884 | "@eslint/core": "^0.12.0", 885 | "levn": "^0.4.1" 886 | }, 887 | "engines": { 888 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 889 | } 890 | }, 891 | "node_modules/@humanfs/core": { 892 | "version": "0.19.1", 893 | "resolved": "https://registry.npmmirror.com/@humanfs/core/-/core-0.19.1.tgz", 894 | "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", 895 | "dev": true, 896 | "license": "Apache-2.0", 897 | "engines": { 898 | "node": ">=18.18.0" 899 | } 900 | }, 901 | "node_modules/@humanfs/node": { 902 | "version": "0.16.6", 903 | "resolved": "https://registry.npmmirror.com/@humanfs/node/-/node-0.16.6.tgz", 904 | "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", 905 | "dev": true, 906 | "license": "Apache-2.0", 907 | "dependencies": { 908 | "@humanfs/core": "^0.19.1", 909 | "@humanwhocodes/retry": "^0.3.0" 910 | }, 911 | "engines": { 912 | "node": ">=18.18.0" 913 | } 914 | }, 915 | "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { 916 | "version": "0.3.1", 917 | "resolved": "https://registry.npmmirror.com/@humanwhocodes/retry/-/retry-0.3.1.tgz", 918 | "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", 919 | "dev": true, 920 | "license": "Apache-2.0", 921 | "engines": { 922 | "node": ">=18.18" 923 | }, 924 | "funding": { 925 | "type": "github", 926 | "url": "https://github.com/sponsors/nzakas" 927 | } 928 | }, 929 | "node_modules/@humanwhocodes/module-importer": { 930 | "version": "1.0.1", 931 | "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 932 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 933 | "dev": true, 934 | "license": "Apache-2.0", 935 | "engines": { 936 | "node": ">=12.22" 937 | }, 938 | "funding": { 939 | "type": "github", 940 | "url": "https://github.com/sponsors/nzakas" 941 | } 942 | }, 943 | "node_modules/@humanwhocodes/retry": { 944 | "version": "0.4.2", 945 | "resolved": "https://registry.npmmirror.com/@humanwhocodes/retry/-/retry-0.4.2.tgz", 946 | "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", 947 | "dev": true, 948 | "license": "Apache-2.0", 949 | "engines": { 950 | "node": ">=18.18" 951 | }, 952 | "funding": { 953 | "type": "github", 954 | "url": "https://github.com/sponsors/nzakas" 955 | } 956 | }, 957 | "node_modules/@jridgewell/gen-mapping": { 958 | "version": "0.3.8", 959 | "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", 960 | "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", 961 | "dev": true, 962 | "license": "MIT", 963 | "dependencies": { 964 | "@jridgewell/set-array": "^1.2.1", 965 | "@jridgewell/sourcemap-codec": "^1.4.10", 966 | "@jridgewell/trace-mapping": "^0.3.24" 967 | }, 968 | "engines": { 969 | "node": ">=6.0.0" 970 | } 971 | }, 972 | "node_modules/@jridgewell/resolve-uri": { 973 | "version": "3.1.2", 974 | "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 975 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 976 | "dev": true, 977 | "license": "MIT", 978 | "engines": { 979 | "node": ">=6.0.0" 980 | } 981 | }, 982 | "node_modules/@jridgewell/set-array": { 983 | "version": "1.2.1", 984 | "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz", 985 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 986 | "dev": true, 987 | "license": "MIT", 988 | "engines": { 989 | "node": ">=6.0.0" 990 | } 991 | }, 992 | "node_modules/@jridgewell/sourcemap-codec": { 993 | "version": "1.5.0", 994 | "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 995 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 996 | "dev": true, 997 | "license": "MIT" 998 | }, 999 | "node_modules/@jridgewell/trace-mapping": { 1000 | "version": "0.3.25", 1001 | "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 1002 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 1003 | "dev": true, 1004 | "license": "MIT", 1005 | "dependencies": { 1006 | "@jridgewell/resolve-uri": "^3.1.0", 1007 | "@jridgewell/sourcemap-codec": "^1.4.14" 1008 | } 1009 | }, 1010 | "node_modules/@nodelib/fs.scandir": { 1011 | "version": "2.1.5", 1012 | "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 1013 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 1014 | "dev": true, 1015 | "license": "MIT", 1016 | "dependencies": { 1017 | "@nodelib/fs.stat": "2.0.5", 1018 | "run-parallel": "^1.1.9" 1019 | }, 1020 | "engines": { 1021 | "node": ">= 8" 1022 | } 1023 | }, 1024 | "node_modules/@nodelib/fs.stat": { 1025 | "version": "2.0.5", 1026 | "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 1027 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 1028 | "dev": true, 1029 | "license": "MIT", 1030 | "engines": { 1031 | "node": ">= 8" 1032 | } 1033 | }, 1034 | "node_modules/@nodelib/fs.walk": { 1035 | "version": "1.2.8", 1036 | "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 1037 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 1038 | "dev": true, 1039 | "license": "MIT", 1040 | "dependencies": { 1041 | "@nodelib/fs.scandir": "2.1.5", 1042 | "fastq": "^1.6.0" 1043 | }, 1044 | "engines": { 1045 | "node": ">= 8" 1046 | } 1047 | }, 1048 | "node_modules/@rollup/rollup-android-arm-eabi": { 1049 | "version": "4.34.9", 1050 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.9.tgz", 1051 | "integrity": "sha512-qZdlImWXur0CFakn2BJ2znJOdqYZKiedEPEVNTBrpfPjc/YuTGcaYZcdmNFTkUj3DU0ZM/AElcM8Ybww3xVLzA==", 1052 | "cpu": [ 1053 | "arm" 1054 | ], 1055 | "dev": true, 1056 | "license": "MIT", 1057 | "optional": true, 1058 | "os": [ 1059 | "android" 1060 | ] 1061 | }, 1062 | "node_modules/@rollup/rollup-android-arm64": { 1063 | "version": "4.34.9", 1064 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.9.tgz", 1065 | "integrity": "sha512-4KW7P53h6HtJf5Y608T1ISKvNIYLWRKMvfnG0c44M6In4DQVU58HZFEVhWINDZKp7FZps98G3gxwC1sb0wXUUg==", 1066 | "cpu": [ 1067 | "arm64" 1068 | ], 1069 | "dev": true, 1070 | "license": "MIT", 1071 | "optional": true, 1072 | "os": [ 1073 | "android" 1074 | ] 1075 | }, 1076 | "node_modules/@rollup/rollup-darwin-arm64": { 1077 | "version": "4.34.9", 1078 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.9.tgz", 1079 | "integrity": "sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==", 1080 | "cpu": [ 1081 | "arm64" 1082 | ], 1083 | "dev": true, 1084 | "license": "MIT", 1085 | "optional": true, 1086 | "os": [ 1087 | "darwin" 1088 | ] 1089 | }, 1090 | "node_modules/@rollup/rollup-darwin-x64": { 1091 | "version": "4.34.9", 1092 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.9.tgz", 1093 | "integrity": "sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==", 1094 | "cpu": [ 1095 | "x64" 1096 | ], 1097 | "dev": true, 1098 | "license": "MIT", 1099 | "optional": true, 1100 | "os": [ 1101 | "darwin" 1102 | ] 1103 | }, 1104 | "node_modules/@rollup/rollup-freebsd-arm64": { 1105 | "version": "4.34.9", 1106 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.9.tgz", 1107 | "integrity": "sha512-2lzjQPJbN5UnHm7bHIUKFMulGTQwdvOkouJDpPysJS+QFBGDJqcfh+CxxtG23Ik/9tEvnebQiylYoazFMAgrYw==", 1108 | "cpu": [ 1109 | "arm64" 1110 | ], 1111 | "dev": true, 1112 | "license": "MIT", 1113 | "optional": true, 1114 | "os": [ 1115 | "freebsd" 1116 | ] 1117 | }, 1118 | "node_modules/@rollup/rollup-freebsd-x64": { 1119 | "version": "4.34.9", 1120 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.9.tgz", 1121 | "integrity": "sha512-SLl0hi2Ah2H7xQYd6Qaiu01kFPzQ+hqvdYSoOtHYg/zCIFs6t8sV95kaoqjzjFwuYQLtOI0RZre/Ke0nPaQV+g==", 1122 | "cpu": [ 1123 | "x64" 1124 | ], 1125 | "dev": true, 1126 | "license": "MIT", 1127 | "optional": true, 1128 | "os": [ 1129 | "freebsd" 1130 | ] 1131 | }, 1132 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 1133 | "version": "4.34.9", 1134 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.9.tgz", 1135 | "integrity": "sha512-88I+D3TeKItrw+Y/2ud4Tw0+3CxQ2kLgu3QvrogZ0OfkmX/DEppehus7L3TS2Q4lpB+hYyxhkQiYPJ6Mf5/dPg==", 1136 | "cpu": [ 1137 | "arm" 1138 | ], 1139 | "dev": true, 1140 | "license": "MIT", 1141 | "optional": true, 1142 | "os": [ 1143 | "linux" 1144 | ] 1145 | }, 1146 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 1147 | "version": "4.34.9", 1148 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.9.tgz", 1149 | "integrity": "sha512-3qyfWljSFHi9zH0KgtEPG4cBXHDFhwD8kwg6xLfHQ0IWuH9crp005GfoUUh/6w9/FWGBwEHg3lxK1iHRN1MFlA==", 1150 | "cpu": [ 1151 | "arm" 1152 | ], 1153 | "dev": true, 1154 | "license": "MIT", 1155 | "optional": true, 1156 | "os": [ 1157 | "linux" 1158 | ] 1159 | }, 1160 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 1161 | "version": "4.34.9", 1162 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.9.tgz", 1163 | "integrity": "sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==", 1164 | "cpu": [ 1165 | "arm64" 1166 | ], 1167 | "dev": true, 1168 | "license": "MIT", 1169 | "optional": true, 1170 | "os": [ 1171 | "linux" 1172 | ] 1173 | }, 1174 | "node_modules/@rollup/rollup-linux-arm64-musl": { 1175 | "version": "4.34.9", 1176 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.9.tgz", 1177 | "integrity": "sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==", 1178 | "cpu": [ 1179 | "arm64" 1180 | ], 1181 | "dev": true, 1182 | "license": "MIT", 1183 | "optional": true, 1184 | "os": [ 1185 | "linux" 1186 | ] 1187 | }, 1188 | "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 1189 | "version": "4.34.9", 1190 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.9.tgz", 1191 | "integrity": "sha512-dRAgTfDsn0TE0HI6cmo13hemKpVHOEyeciGtvlBTkpx/F65kTvShtY/EVyZEIfxFkV5JJTuQ9tP5HGBS0hfxIg==", 1192 | "cpu": [ 1193 | "loong64" 1194 | ], 1195 | "dev": true, 1196 | "license": "MIT", 1197 | "optional": true, 1198 | "os": [ 1199 | "linux" 1200 | ] 1201 | }, 1202 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 1203 | "version": "4.34.9", 1204 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.9.tgz", 1205 | "integrity": "sha512-PHcNOAEhkoMSQtMf+rJofwisZqaU8iQ8EaSps58f5HYll9EAY5BSErCZ8qBDMVbq88h4UxaNPlbrKqfWP8RfJA==", 1206 | "cpu": [ 1207 | "ppc64" 1208 | ], 1209 | "dev": true, 1210 | "license": "MIT", 1211 | "optional": true, 1212 | "os": [ 1213 | "linux" 1214 | ] 1215 | }, 1216 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 1217 | "version": "4.34.9", 1218 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.9.tgz", 1219 | "integrity": "sha512-Z2i0Uy5G96KBYKjeQFKbbsB54xFOL5/y1P5wNBsbXB8yE+At3oh0DVMjQVzCJRJSfReiB2tX8T6HUFZ2k8iaKg==", 1220 | "cpu": [ 1221 | "riscv64" 1222 | ], 1223 | "dev": true, 1224 | "license": "MIT", 1225 | "optional": true, 1226 | "os": [ 1227 | "linux" 1228 | ] 1229 | }, 1230 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 1231 | "version": "4.34.9", 1232 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.9.tgz", 1233 | "integrity": "sha512-U+5SwTMoeYXoDzJX5dhDTxRltSrIax8KWwfaaYcynuJw8mT33W7oOgz0a+AaXtGuvhzTr2tVKh5UO8GVANTxyQ==", 1234 | "cpu": [ 1235 | "s390x" 1236 | ], 1237 | "dev": true, 1238 | "license": "MIT", 1239 | "optional": true, 1240 | "os": [ 1241 | "linux" 1242 | ] 1243 | }, 1244 | "node_modules/@rollup/rollup-linux-x64-gnu": { 1245 | "version": "4.34.9", 1246 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.9.tgz", 1247 | "integrity": "sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==", 1248 | "cpu": [ 1249 | "x64" 1250 | ], 1251 | "dev": true, 1252 | "license": "MIT", 1253 | "optional": true, 1254 | "os": [ 1255 | "linux" 1256 | ] 1257 | }, 1258 | "node_modules/@rollup/rollup-linux-x64-musl": { 1259 | "version": "4.34.9", 1260 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.9.tgz", 1261 | "integrity": "sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==", 1262 | "cpu": [ 1263 | "x64" 1264 | ], 1265 | "dev": true, 1266 | "license": "MIT", 1267 | "optional": true, 1268 | "os": [ 1269 | "linux" 1270 | ] 1271 | }, 1272 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 1273 | "version": "4.34.9", 1274 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.9.tgz", 1275 | "integrity": "sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==", 1276 | "cpu": [ 1277 | "arm64" 1278 | ], 1279 | "dev": true, 1280 | "license": "MIT", 1281 | "optional": true, 1282 | "os": [ 1283 | "win32" 1284 | ] 1285 | }, 1286 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 1287 | "version": "4.34.9", 1288 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.9.tgz", 1289 | "integrity": "sha512-KB48mPtaoHy1AwDNkAJfHXvHp24H0ryZog28spEs0V48l3H1fr4i37tiyHsgKZJnCmvxsbATdZGBpbmxTE3a9w==", 1290 | "cpu": [ 1291 | "ia32" 1292 | ], 1293 | "dev": true, 1294 | "license": "MIT", 1295 | "optional": true, 1296 | "os": [ 1297 | "win32" 1298 | ] 1299 | }, 1300 | "node_modules/@rollup/rollup-win32-x64-msvc": { 1301 | "version": "4.34.9", 1302 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.9.tgz", 1303 | "integrity": "sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==", 1304 | "cpu": [ 1305 | "x64" 1306 | ], 1307 | "dev": true, 1308 | "license": "MIT", 1309 | "optional": true, 1310 | "os": [ 1311 | "win32" 1312 | ] 1313 | }, 1314 | "node_modules/@types/babel__core": { 1315 | "version": "7.20.5", 1316 | "resolved": "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.5.tgz", 1317 | "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", 1318 | "dev": true, 1319 | "license": "MIT", 1320 | "dependencies": { 1321 | "@babel/parser": "^7.20.7", 1322 | "@babel/types": "^7.20.7", 1323 | "@types/babel__generator": "*", 1324 | "@types/babel__template": "*", 1325 | "@types/babel__traverse": "*" 1326 | } 1327 | }, 1328 | "node_modules/@types/babel__generator": { 1329 | "version": "7.6.8", 1330 | "resolved": "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.6.8.tgz", 1331 | "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", 1332 | "dev": true, 1333 | "license": "MIT", 1334 | "dependencies": { 1335 | "@babel/types": "^7.0.0" 1336 | } 1337 | }, 1338 | "node_modules/@types/babel__template": { 1339 | "version": "7.4.4", 1340 | "resolved": "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.4.tgz", 1341 | "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", 1342 | "dev": true, 1343 | "license": "MIT", 1344 | "dependencies": { 1345 | "@babel/parser": "^7.1.0", 1346 | "@babel/types": "^7.0.0" 1347 | } 1348 | }, 1349 | "node_modules/@types/babel__traverse": { 1350 | "version": "7.20.6", 1351 | "resolved": "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", 1352 | "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", 1353 | "dev": true, 1354 | "license": "MIT", 1355 | "dependencies": { 1356 | "@babel/types": "^7.20.7" 1357 | } 1358 | }, 1359 | "node_modules/@types/estree": { 1360 | "version": "1.0.6", 1361 | "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.6.tgz", 1362 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 1363 | "dev": true, 1364 | "license": "MIT" 1365 | }, 1366 | "node_modules/@types/json-schema": { 1367 | "version": "7.0.15", 1368 | "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", 1369 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 1370 | "dev": true, 1371 | "license": "MIT" 1372 | }, 1373 | "node_modules/@types/react": { 1374 | "version": "19.0.10", 1375 | "resolved": "https://registry.npmmirror.com/@types/react/-/react-19.0.10.tgz", 1376 | "integrity": "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==", 1377 | "dev": true, 1378 | "license": "MIT", 1379 | "dependencies": { 1380 | "csstype": "^3.0.2" 1381 | } 1382 | }, 1383 | "node_modules/@types/react-dom": { 1384 | "version": "19.0.4", 1385 | "resolved": "https://registry.npmmirror.com/@types/react-dom/-/react-dom-19.0.4.tgz", 1386 | "integrity": "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==", 1387 | "dev": true, 1388 | "license": "MIT", 1389 | "peerDependencies": { 1390 | "@types/react": "^19.0.0" 1391 | } 1392 | }, 1393 | "node_modules/@typescript-eslint/eslint-plugin": { 1394 | "version": "8.25.0", 1395 | "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.25.0.tgz", 1396 | "integrity": "sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA==", 1397 | "dev": true, 1398 | "license": "MIT", 1399 | "dependencies": { 1400 | "@eslint-community/regexpp": "^4.10.0", 1401 | "@typescript-eslint/scope-manager": "8.25.0", 1402 | "@typescript-eslint/type-utils": "8.25.0", 1403 | "@typescript-eslint/utils": "8.25.0", 1404 | "@typescript-eslint/visitor-keys": "8.25.0", 1405 | "graphemer": "^1.4.0", 1406 | "ignore": "^5.3.1", 1407 | "natural-compare": "^1.4.0", 1408 | "ts-api-utils": "^2.0.1" 1409 | }, 1410 | "engines": { 1411 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1412 | }, 1413 | "funding": { 1414 | "type": "opencollective", 1415 | "url": "https://opencollective.com/typescript-eslint" 1416 | }, 1417 | "peerDependencies": { 1418 | "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", 1419 | "eslint": "^8.57.0 || ^9.0.0", 1420 | "typescript": ">=4.8.4 <5.8.0" 1421 | } 1422 | }, 1423 | "node_modules/@typescript-eslint/parser": { 1424 | "version": "8.25.0", 1425 | "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.25.0.tgz", 1426 | "integrity": "sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg==", 1427 | "dev": true, 1428 | "license": "MIT", 1429 | "dependencies": { 1430 | "@typescript-eslint/scope-manager": "8.25.0", 1431 | "@typescript-eslint/types": "8.25.0", 1432 | "@typescript-eslint/typescript-estree": "8.25.0", 1433 | "@typescript-eslint/visitor-keys": "8.25.0", 1434 | "debug": "^4.3.4" 1435 | }, 1436 | "engines": { 1437 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1438 | }, 1439 | "funding": { 1440 | "type": "opencollective", 1441 | "url": "https://opencollective.com/typescript-eslint" 1442 | }, 1443 | "peerDependencies": { 1444 | "eslint": "^8.57.0 || ^9.0.0", 1445 | "typescript": ">=4.8.4 <5.8.0" 1446 | } 1447 | }, 1448 | "node_modules/@typescript-eslint/scope-manager": { 1449 | "version": "8.25.0", 1450 | "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-8.25.0.tgz", 1451 | "integrity": "sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==", 1452 | "dev": true, 1453 | "license": "MIT", 1454 | "dependencies": { 1455 | "@typescript-eslint/types": "8.25.0", 1456 | "@typescript-eslint/visitor-keys": "8.25.0" 1457 | }, 1458 | "engines": { 1459 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1460 | }, 1461 | "funding": { 1462 | "type": "opencollective", 1463 | "url": "https://opencollective.com/typescript-eslint" 1464 | } 1465 | }, 1466 | "node_modules/@typescript-eslint/type-utils": { 1467 | "version": "8.25.0", 1468 | "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-8.25.0.tgz", 1469 | "integrity": "sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g==", 1470 | "dev": true, 1471 | "license": "MIT", 1472 | "dependencies": { 1473 | "@typescript-eslint/typescript-estree": "8.25.0", 1474 | "@typescript-eslint/utils": "8.25.0", 1475 | "debug": "^4.3.4", 1476 | "ts-api-utils": "^2.0.1" 1477 | }, 1478 | "engines": { 1479 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1480 | }, 1481 | "funding": { 1482 | "type": "opencollective", 1483 | "url": "https://opencollective.com/typescript-eslint" 1484 | }, 1485 | "peerDependencies": { 1486 | "eslint": "^8.57.0 || ^9.0.0", 1487 | "typescript": ">=4.8.4 <5.8.0" 1488 | } 1489 | }, 1490 | "node_modules/@typescript-eslint/types": { 1491 | "version": "8.25.0", 1492 | "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-8.25.0.tgz", 1493 | "integrity": "sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==", 1494 | "dev": true, 1495 | "license": "MIT", 1496 | "engines": { 1497 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1498 | }, 1499 | "funding": { 1500 | "type": "opencollective", 1501 | "url": "https://opencollective.com/typescript-eslint" 1502 | } 1503 | }, 1504 | "node_modules/@typescript-eslint/typescript-estree": { 1505 | "version": "8.25.0", 1506 | "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.25.0.tgz", 1507 | "integrity": "sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==", 1508 | "dev": true, 1509 | "license": "MIT", 1510 | "dependencies": { 1511 | "@typescript-eslint/types": "8.25.0", 1512 | "@typescript-eslint/visitor-keys": "8.25.0", 1513 | "debug": "^4.3.4", 1514 | "fast-glob": "^3.3.2", 1515 | "is-glob": "^4.0.3", 1516 | "minimatch": "^9.0.4", 1517 | "semver": "^7.6.0", 1518 | "ts-api-utils": "^2.0.1" 1519 | }, 1520 | "engines": { 1521 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1522 | }, 1523 | "funding": { 1524 | "type": "opencollective", 1525 | "url": "https://opencollective.com/typescript-eslint" 1526 | }, 1527 | "peerDependencies": { 1528 | "typescript": ">=4.8.4 <5.8.0" 1529 | } 1530 | }, 1531 | "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { 1532 | "version": "2.0.1", 1533 | "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", 1534 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1535 | "dev": true, 1536 | "license": "MIT", 1537 | "dependencies": { 1538 | "balanced-match": "^1.0.0" 1539 | } 1540 | }, 1541 | "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { 1542 | "version": "9.0.5", 1543 | "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz", 1544 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1545 | "dev": true, 1546 | "license": "ISC", 1547 | "dependencies": { 1548 | "brace-expansion": "^2.0.1" 1549 | }, 1550 | "engines": { 1551 | "node": ">=16 || 14 >=14.17" 1552 | }, 1553 | "funding": { 1554 | "url": "https://github.com/sponsors/isaacs" 1555 | } 1556 | }, 1557 | "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { 1558 | "version": "7.7.1", 1559 | "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.1.tgz", 1560 | "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", 1561 | "dev": true, 1562 | "license": "ISC", 1563 | "bin": { 1564 | "semver": "bin/semver.js" 1565 | }, 1566 | "engines": { 1567 | "node": ">=10" 1568 | } 1569 | }, 1570 | "node_modules/@typescript-eslint/utils": { 1571 | "version": "8.25.0", 1572 | "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-8.25.0.tgz", 1573 | "integrity": "sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA==", 1574 | "dev": true, 1575 | "license": "MIT", 1576 | "dependencies": { 1577 | "@eslint-community/eslint-utils": "^4.4.0", 1578 | "@typescript-eslint/scope-manager": "8.25.0", 1579 | "@typescript-eslint/types": "8.25.0", 1580 | "@typescript-eslint/typescript-estree": "8.25.0" 1581 | }, 1582 | "engines": { 1583 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1584 | }, 1585 | "funding": { 1586 | "type": "opencollective", 1587 | "url": "https://opencollective.com/typescript-eslint" 1588 | }, 1589 | "peerDependencies": { 1590 | "eslint": "^8.57.0 || ^9.0.0", 1591 | "typescript": ">=4.8.4 <5.8.0" 1592 | } 1593 | }, 1594 | "node_modules/@typescript-eslint/visitor-keys": { 1595 | "version": "8.25.0", 1596 | "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.25.0.tgz", 1597 | "integrity": "sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==", 1598 | "dev": true, 1599 | "license": "MIT", 1600 | "dependencies": { 1601 | "@typescript-eslint/types": "8.25.0", 1602 | "eslint-visitor-keys": "^4.2.0" 1603 | }, 1604 | "engines": { 1605 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1606 | }, 1607 | "funding": { 1608 | "type": "opencollective", 1609 | "url": "https://opencollective.com/typescript-eslint" 1610 | } 1611 | }, 1612 | "node_modules/@vitejs/plugin-react": { 1613 | "version": "4.3.4", 1614 | "resolved": "https://registry.npmmirror.com/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", 1615 | "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", 1616 | "dev": true, 1617 | "license": "MIT", 1618 | "dependencies": { 1619 | "@babel/core": "^7.26.0", 1620 | "@babel/plugin-transform-react-jsx-self": "^7.25.9", 1621 | "@babel/plugin-transform-react-jsx-source": "^7.25.9", 1622 | "@types/babel__core": "^7.20.5", 1623 | "react-refresh": "^0.14.2" 1624 | }, 1625 | "engines": { 1626 | "node": "^14.18.0 || >=16.0.0" 1627 | }, 1628 | "peerDependencies": { 1629 | "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" 1630 | } 1631 | }, 1632 | "node_modules/acorn": { 1633 | "version": "8.14.0", 1634 | "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.14.0.tgz", 1635 | "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", 1636 | "dev": true, 1637 | "license": "MIT", 1638 | "bin": { 1639 | "acorn": "bin/acorn" 1640 | }, 1641 | "engines": { 1642 | "node": ">=0.4.0" 1643 | } 1644 | }, 1645 | "node_modules/acorn-jsx": { 1646 | "version": "5.3.2", 1647 | "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 1648 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 1649 | "dev": true, 1650 | "license": "MIT", 1651 | "peerDependencies": { 1652 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 1653 | } 1654 | }, 1655 | "node_modules/ajv": { 1656 | "version": "6.12.6", 1657 | "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", 1658 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 1659 | "dev": true, 1660 | "license": "MIT", 1661 | "dependencies": { 1662 | "fast-deep-equal": "^3.1.1", 1663 | "fast-json-stable-stringify": "^2.0.0", 1664 | "json-schema-traverse": "^0.4.1", 1665 | "uri-js": "^4.2.2" 1666 | }, 1667 | "funding": { 1668 | "type": "github", 1669 | "url": "https://github.com/sponsors/epoberezkin" 1670 | } 1671 | }, 1672 | "node_modules/ansi-regex": { 1673 | "version": "6.1.0", 1674 | "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.1.0.tgz", 1675 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 1676 | "dev": true, 1677 | "license": "MIT", 1678 | "engines": { 1679 | "node": ">=12" 1680 | }, 1681 | "funding": { 1682 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 1683 | } 1684 | }, 1685 | "node_modules/ansi-styles": { 1686 | "version": "4.3.0", 1687 | "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", 1688 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1689 | "dev": true, 1690 | "license": "MIT", 1691 | "dependencies": { 1692 | "color-convert": "^2.0.1" 1693 | }, 1694 | "engines": { 1695 | "node": ">=8" 1696 | }, 1697 | "funding": { 1698 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1699 | } 1700 | }, 1701 | "node_modules/argparse": { 1702 | "version": "2.0.1", 1703 | "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", 1704 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1705 | "dev": true, 1706 | "license": "Python-2.0" 1707 | }, 1708 | "node_modules/balanced-match": { 1709 | "version": "1.0.2", 1710 | "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", 1711 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1712 | "dev": true, 1713 | "license": "MIT" 1714 | }, 1715 | "node_modules/brace-expansion": { 1716 | "version": "1.1.11", 1717 | "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", 1718 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1719 | "dev": true, 1720 | "license": "MIT", 1721 | "dependencies": { 1722 | "balanced-match": "^1.0.0", 1723 | "concat-map": "0.0.1" 1724 | } 1725 | }, 1726 | "node_modules/braces": { 1727 | "version": "3.0.3", 1728 | "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", 1729 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 1730 | "dev": true, 1731 | "license": "MIT", 1732 | "dependencies": { 1733 | "fill-range": "^7.1.1" 1734 | }, 1735 | "engines": { 1736 | "node": ">=8" 1737 | } 1738 | }, 1739 | "node_modules/browserslist": { 1740 | "version": "4.24.4", 1741 | "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.24.4.tgz", 1742 | "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", 1743 | "dev": true, 1744 | "funding": [ 1745 | { 1746 | "type": "opencollective", 1747 | "url": "https://opencollective.com/browserslist" 1748 | }, 1749 | { 1750 | "type": "tidelift", 1751 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1752 | }, 1753 | { 1754 | "type": "github", 1755 | "url": "https://github.com/sponsors/ai" 1756 | } 1757 | ], 1758 | "license": "MIT", 1759 | "dependencies": { 1760 | "caniuse-lite": "^1.0.30001688", 1761 | "electron-to-chromium": "^1.5.73", 1762 | "node-releases": "^2.0.19", 1763 | "update-browserslist-db": "^1.1.1" 1764 | }, 1765 | "bin": { 1766 | "browserslist": "cli.js" 1767 | }, 1768 | "engines": { 1769 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 1770 | } 1771 | }, 1772 | "node_modules/callsites": { 1773 | "version": "3.1.0", 1774 | "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", 1775 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1776 | "dev": true, 1777 | "license": "MIT", 1778 | "engines": { 1779 | "node": ">=6" 1780 | } 1781 | }, 1782 | "node_modules/caniuse-lite": { 1783 | "version": "1.0.30001701", 1784 | "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001701.tgz", 1785 | "integrity": "sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==", 1786 | "dev": true, 1787 | "funding": [ 1788 | { 1789 | "type": "opencollective", 1790 | "url": "https://opencollective.com/browserslist" 1791 | }, 1792 | { 1793 | "type": "tidelift", 1794 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 1795 | }, 1796 | { 1797 | "type": "github", 1798 | "url": "https://github.com/sponsors/ai" 1799 | } 1800 | ], 1801 | "license": "CC-BY-4.0" 1802 | }, 1803 | "node_modules/chalk": { 1804 | "version": "4.1.2", 1805 | "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", 1806 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1807 | "dev": true, 1808 | "license": "MIT", 1809 | "dependencies": { 1810 | "ansi-styles": "^4.1.0", 1811 | "supports-color": "^7.1.0" 1812 | }, 1813 | "engines": { 1814 | "node": ">=10" 1815 | }, 1816 | "funding": { 1817 | "url": "https://github.com/chalk/chalk?sponsor=1" 1818 | } 1819 | }, 1820 | "node_modules/chokidar": { 1821 | "version": "4.0.3", 1822 | "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.3.tgz", 1823 | "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", 1824 | "dev": true, 1825 | "license": "MIT", 1826 | "dependencies": { 1827 | "readdirp": "^4.0.1" 1828 | }, 1829 | "engines": { 1830 | "node": ">= 14.16.0" 1831 | }, 1832 | "funding": { 1833 | "url": "https://paulmillr.com/funding/" 1834 | } 1835 | }, 1836 | "node_modules/color-convert": { 1837 | "version": "2.0.1", 1838 | "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", 1839 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1840 | "dev": true, 1841 | "license": "MIT", 1842 | "dependencies": { 1843 | "color-name": "~1.1.4" 1844 | }, 1845 | "engines": { 1846 | "node": ">=7.0.0" 1847 | } 1848 | }, 1849 | "node_modules/color-name": { 1850 | "version": "1.1.4", 1851 | "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", 1852 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1853 | "dev": true, 1854 | "license": "MIT" 1855 | }, 1856 | "node_modules/concat-map": { 1857 | "version": "0.0.1", 1858 | "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", 1859 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1860 | "dev": true, 1861 | "license": "MIT" 1862 | }, 1863 | "node_modules/convert-source-map": { 1864 | "version": "2.0.0", 1865 | "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", 1866 | "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", 1867 | "dev": true, 1868 | "license": "MIT" 1869 | }, 1870 | "node_modules/cross-spawn": { 1871 | "version": "7.0.6", 1872 | "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", 1873 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 1874 | "dev": true, 1875 | "license": "MIT", 1876 | "dependencies": { 1877 | "path-key": "^3.1.0", 1878 | "shebang-command": "^2.0.0", 1879 | "which": "^2.0.1" 1880 | }, 1881 | "engines": { 1882 | "node": ">= 8" 1883 | } 1884 | }, 1885 | "node_modules/csstype": { 1886 | "version": "3.1.3", 1887 | "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz", 1888 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", 1889 | "dev": true, 1890 | "license": "MIT" 1891 | }, 1892 | "node_modules/debug": { 1893 | "version": "4.4.0", 1894 | "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz", 1895 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 1896 | "dev": true, 1897 | "license": "MIT", 1898 | "dependencies": { 1899 | "ms": "^2.1.3" 1900 | }, 1901 | "engines": { 1902 | "node": ">=6.0" 1903 | }, 1904 | "peerDependenciesMeta": { 1905 | "supports-color": { 1906 | "optional": true 1907 | } 1908 | } 1909 | }, 1910 | "node_modules/deep-is": { 1911 | "version": "0.1.4", 1912 | "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", 1913 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 1914 | "dev": true, 1915 | "license": "MIT" 1916 | }, 1917 | "node_modules/electron-to-chromium": { 1918 | "version": "1.5.109", 1919 | "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.109.tgz", 1920 | "integrity": "sha512-AidaH9JETVRr9DIPGfp1kAarm/W6hRJTPuCnkF+2MqhF4KaAgRIcBc8nvjk+YMXZhwfISof/7WG29eS4iGxQLQ==", 1921 | "dev": true, 1922 | "license": "ISC" 1923 | }, 1924 | "node_modules/esbuild": { 1925 | "version": "0.25.0", 1926 | "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.0.tgz", 1927 | "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", 1928 | "dev": true, 1929 | "hasInstallScript": true, 1930 | "license": "MIT", 1931 | "bin": { 1932 | "esbuild": "bin/esbuild" 1933 | }, 1934 | "engines": { 1935 | "node": ">=18" 1936 | }, 1937 | "optionalDependencies": { 1938 | "@esbuild/aix-ppc64": "0.25.0", 1939 | "@esbuild/android-arm": "0.25.0", 1940 | "@esbuild/android-arm64": "0.25.0", 1941 | "@esbuild/android-x64": "0.25.0", 1942 | "@esbuild/darwin-arm64": "0.25.0", 1943 | "@esbuild/darwin-x64": "0.25.0", 1944 | "@esbuild/freebsd-arm64": "0.25.0", 1945 | "@esbuild/freebsd-x64": "0.25.0", 1946 | "@esbuild/linux-arm": "0.25.0", 1947 | "@esbuild/linux-arm64": "0.25.0", 1948 | "@esbuild/linux-ia32": "0.25.0", 1949 | "@esbuild/linux-loong64": "0.25.0", 1950 | "@esbuild/linux-mips64el": "0.25.0", 1951 | "@esbuild/linux-ppc64": "0.25.0", 1952 | "@esbuild/linux-riscv64": "0.25.0", 1953 | "@esbuild/linux-s390x": "0.25.0", 1954 | "@esbuild/linux-x64": "0.25.0", 1955 | "@esbuild/netbsd-arm64": "0.25.0", 1956 | "@esbuild/netbsd-x64": "0.25.0", 1957 | "@esbuild/openbsd-arm64": "0.25.0", 1958 | "@esbuild/openbsd-x64": "0.25.0", 1959 | "@esbuild/sunos-x64": "0.25.0", 1960 | "@esbuild/win32-arm64": "0.25.0", 1961 | "@esbuild/win32-ia32": "0.25.0", 1962 | "@esbuild/win32-x64": "0.25.0" 1963 | } 1964 | }, 1965 | "node_modules/escalade": { 1966 | "version": "3.2.0", 1967 | "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", 1968 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 1969 | "dev": true, 1970 | "license": "MIT", 1971 | "engines": { 1972 | "node": ">=6" 1973 | } 1974 | }, 1975 | "node_modules/escape-string-regexp": { 1976 | "version": "4.0.0", 1977 | "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1978 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1979 | "dev": true, 1980 | "license": "MIT", 1981 | "engines": { 1982 | "node": ">=10" 1983 | }, 1984 | "funding": { 1985 | "url": "https://github.com/sponsors/sindresorhus" 1986 | } 1987 | }, 1988 | "node_modules/eslint": { 1989 | "version": "9.21.0", 1990 | "resolved": "https://registry.npmmirror.com/eslint/-/eslint-9.21.0.tgz", 1991 | "integrity": "sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==", 1992 | "dev": true, 1993 | "license": "MIT", 1994 | "dependencies": { 1995 | "@eslint-community/eslint-utils": "^4.2.0", 1996 | "@eslint-community/regexpp": "^4.12.1", 1997 | "@eslint/config-array": "^0.19.2", 1998 | "@eslint/core": "^0.12.0", 1999 | "@eslint/eslintrc": "^3.3.0", 2000 | "@eslint/js": "9.21.0", 2001 | "@eslint/plugin-kit": "^0.2.7", 2002 | "@humanfs/node": "^0.16.6", 2003 | "@humanwhocodes/module-importer": "^1.0.1", 2004 | "@humanwhocodes/retry": "^0.4.2", 2005 | "@types/estree": "^1.0.6", 2006 | "@types/json-schema": "^7.0.15", 2007 | "ajv": "^6.12.4", 2008 | "chalk": "^4.0.0", 2009 | "cross-spawn": "^7.0.6", 2010 | "debug": "^4.3.2", 2011 | "escape-string-regexp": "^4.0.0", 2012 | "eslint-scope": "^8.2.0", 2013 | "eslint-visitor-keys": "^4.2.0", 2014 | "espree": "^10.3.0", 2015 | "esquery": "^1.5.0", 2016 | "esutils": "^2.0.2", 2017 | "fast-deep-equal": "^3.1.3", 2018 | "file-entry-cache": "^8.0.0", 2019 | "find-up": "^5.0.0", 2020 | "glob-parent": "^6.0.2", 2021 | "ignore": "^5.2.0", 2022 | "imurmurhash": "^0.1.4", 2023 | "is-glob": "^4.0.0", 2024 | "json-stable-stringify-without-jsonify": "^1.0.1", 2025 | "lodash.merge": "^4.6.2", 2026 | "minimatch": "^3.1.2", 2027 | "natural-compare": "^1.4.0", 2028 | "optionator": "^0.9.3" 2029 | }, 2030 | "bin": { 2031 | "eslint": "bin/eslint.js" 2032 | }, 2033 | "engines": { 2034 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2035 | }, 2036 | "funding": { 2037 | "url": "https://eslint.org/donate" 2038 | }, 2039 | "peerDependencies": { 2040 | "jiti": "*" 2041 | }, 2042 | "peerDependenciesMeta": { 2043 | "jiti": { 2044 | "optional": true 2045 | } 2046 | } 2047 | }, 2048 | "node_modules/eslint-plugin-react-hooks": { 2049 | "version": "5.2.0", 2050 | "resolved": "https://registry.npmmirror.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", 2051 | "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", 2052 | "dev": true, 2053 | "license": "MIT", 2054 | "engines": { 2055 | "node": ">=10" 2056 | }, 2057 | "peerDependencies": { 2058 | "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" 2059 | } 2060 | }, 2061 | "node_modules/eslint-plugin-react-refresh": { 2062 | "version": "0.4.19", 2063 | "resolved": "https://registry.npmmirror.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.19.tgz", 2064 | "integrity": "sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==", 2065 | "dev": true, 2066 | "license": "MIT", 2067 | "peerDependencies": { 2068 | "eslint": ">=8.40" 2069 | } 2070 | }, 2071 | "node_modules/eslint-scope": { 2072 | "version": "8.2.0", 2073 | "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-8.2.0.tgz", 2074 | "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", 2075 | "dev": true, 2076 | "license": "BSD-2-Clause", 2077 | "dependencies": { 2078 | "esrecurse": "^4.3.0", 2079 | "estraverse": "^5.2.0" 2080 | }, 2081 | "engines": { 2082 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2083 | }, 2084 | "funding": { 2085 | "url": "https://opencollective.com/eslint" 2086 | } 2087 | }, 2088 | "node_modules/eslint-visitor-keys": { 2089 | "version": "4.2.0", 2090 | "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", 2091 | "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", 2092 | "dev": true, 2093 | "license": "Apache-2.0", 2094 | "engines": { 2095 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2096 | }, 2097 | "funding": { 2098 | "url": "https://opencollective.com/eslint" 2099 | } 2100 | }, 2101 | "node_modules/espree": { 2102 | "version": "10.3.0", 2103 | "resolved": "https://registry.npmmirror.com/espree/-/espree-10.3.0.tgz", 2104 | "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", 2105 | "dev": true, 2106 | "license": "BSD-2-Clause", 2107 | "dependencies": { 2108 | "acorn": "^8.14.0", 2109 | "acorn-jsx": "^5.3.2", 2110 | "eslint-visitor-keys": "^4.2.0" 2111 | }, 2112 | "engines": { 2113 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2114 | }, 2115 | "funding": { 2116 | "url": "https://opencollective.com/eslint" 2117 | } 2118 | }, 2119 | "node_modules/esquery": { 2120 | "version": "1.6.0", 2121 | "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.6.0.tgz", 2122 | "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", 2123 | "dev": true, 2124 | "license": "BSD-3-Clause", 2125 | "dependencies": { 2126 | "estraverse": "^5.1.0" 2127 | }, 2128 | "engines": { 2129 | "node": ">=0.10" 2130 | } 2131 | }, 2132 | "node_modules/esrecurse": { 2133 | "version": "4.3.0", 2134 | "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", 2135 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 2136 | "dev": true, 2137 | "license": "BSD-2-Clause", 2138 | "dependencies": { 2139 | "estraverse": "^5.2.0" 2140 | }, 2141 | "engines": { 2142 | "node": ">=4.0" 2143 | } 2144 | }, 2145 | "node_modules/estraverse": { 2146 | "version": "5.3.0", 2147 | "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", 2148 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 2149 | "dev": true, 2150 | "license": "BSD-2-Clause", 2151 | "engines": { 2152 | "node": ">=4.0" 2153 | } 2154 | }, 2155 | "node_modules/esutils": { 2156 | "version": "2.0.3", 2157 | "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", 2158 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 2159 | "dev": true, 2160 | "license": "BSD-2-Clause", 2161 | "engines": { 2162 | "node": ">=0.10.0" 2163 | } 2164 | }, 2165 | "node_modules/fast-deep-equal": { 2166 | "version": "3.1.3", 2167 | "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 2168 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 2169 | "dev": true, 2170 | "license": "MIT" 2171 | }, 2172 | "node_modules/fast-glob": { 2173 | "version": "3.3.3", 2174 | "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz", 2175 | "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", 2176 | "dev": true, 2177 | "license": "MIT", 2178 | "dependencies": { 2179 | "@nodelib/fs.stat": "^2.0.2", 2180 | "@nodelib/fs.walk": "^1.2.3", 2181 | "glob-parent": "^5.1.2", 2182 | "merge2": "^1.3.0", 2183 | "micromatch": "^4.0.8" 2184 | }, 2185 | "engines": { 2186 | "node": ">=8.6.0" 2187 | } 2188 | }, 2189 | "node_modules/fast-glob/node_modules/glob-parent": { 2190 | "version": "5.1.2", 2191 | "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", 2192 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2193 | "dev": true, 2194 | "license": "ISC", 2195 | "dependencies": { 2196 | "is-glob": "^4.0.1" 2197 | }, 2198 | "engines": { 2199 | "node": ">= 6" 2200 | } 2201 | }, 2202 | "node_modules/fast-json-stable-stringify": { 2203 | "version": "2.1.0", 2204 | "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 2205 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 2206 | "dev": true, 2207 | "license": "MIT" 2208 | }, 2209 | "node_modules/fast-levenshtein": { 2210 | "version": "2.0.6", 2211 | "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 2212 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 2213 | "dev": true, 2214 | "license": "MIT" 2215 | }, 2216 | "node_modules/fastq": { 2217 | "version": "1.19.1", 2218 | "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.19.1.tgz", 2219 | "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", 2220 | "dev": true, 2221 | "license": "ISC", 2222 | "dependencies": { 2223 | "reusify": "^1.0.4" 2224 | } 2225 | }, 2226 | "node_modules/file-entry-cache": { 2227 | "version": "8.0.0", 2228 | "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz", 2229 | "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", 2230 | "dev": true, 2231 | "license": "MIT", 2232 | "dependencies": { 2233 | "flat-cache": "^4.0.0" 2234 | }, 2235 | "engines": { 2236 | "node": ">=16.0.0" 2237 | } 2238 | }, 2239 | "node_modules/fill-range": { 2240 | "version": "7.1.1", 2241 | "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", 2242 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 2243 | "dev": true, 2244 | "license": "MIT", 2245 | "dependencies": { 2246 | "to-regex-range": "^5.0.1" 2247 | }, 2248 | "engines": { 2249 | "node": ">=8" 2250 | } 2251 | }, 2252 | "node_modules/find-up": { 2253 | "version": "5.0.0", 2254 | "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", 2255 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 2256 | "dev": true, 2257 | "license": "MIT", 2258 | "dependencies": { 2259 | "locate-path": "^6.0.0", 2260 | "path-exists": "^4.0.0" 2261 | }, 2262 | "engines": { 2263 | "node": ">=10" 2264 | }, 2265 | "funding": { 2266 | "url": "https://github.com/sponsors/sindresorhus" 2267 | } 2268 | }, 2269 | "node_modules/flat-cache": { 2270 | "version": "4.0.1", 2271 | "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-4.0.1.tgz", 2272 | "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", 2273 | "dev": true, 2274 | "license": "MIT", 2275 | "dependencies": { 2276 | "flatted": "^3.2.9", 2277 | "keyv": "^4.5.4" 2278 | }, 2279 | "engines": { 2280 | "node": ">=16" 2281 | } 2282 | }, 2283 | "node_modules/flatted": { 2284 | "version": "3.3.3", 2285 | "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.3.3.tgz", 2286 | "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", 2287 | "dev": true, 2288 | "license": "ISC" 2289 | }, 2290 | "node_modules/fsevents": { 2291 | "version": "2.3.3", 2292 | "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", 2293 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 2294 | "dev": true, 2295 | "hasInstallScript": true, 2296 | "license": "MIT", 2297 | "optional": true, 2298 | "os": [ 2299 | "darwin" 2300 | ], 2301 | "engines": { 2302 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 2303 | } 2304 | }, 2305 | "node_modules/gensync": { 2306 | "version": "1.0.0-beta.2", 2307 | "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", 2308 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 2309 | "dev": true, 2310 | "license": "MIT", 2311 | "engines": { 2312 | "node": ">=6.9.0" 2313 | } 2314 | }, 2315 | "node_modules/glob-parent": { 2316 | "version": "6.0.2", 2317 | "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", 2318 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 2319 | "dev": true, 2320 | "license": "ISC", 2321 | "dependencies": { 2322 | "is-glob": "^4.0.3" 2323 | }, 2324 | "engines": { 2325 | "node": ">=10.13.0" 2326 | } 2327 | }, 2328 | "node_modules/globals": { 2329 | "version": "16.0.0", 2330 | "resolved": "https://registry.npmmirror.com/globals/-/globals-16.0.0.tgz", 2331 | "integrity": "sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==", 2332 | "dev": true, 2333 | "license": "MIT", 2334 | "engines": { 2335 | "node": ">=18" 2336 | }, 2337 | "funding": { 2338 | "url": "https://github.com/sponsors/sindresorhus" 2339 | } 2340 | }, 2341 | "node_modules/graphemer": { 2342 | "version": "1.4.0", 2343 | "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz", 2344 | "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 2345 | "dev": true, 2346 | "license": "MIT" 2347 | }, 2348 | "node_modules/has-flag": { 2349 | "version": "4.0.0", 2350 | "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", 2351 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 2352 | "dev": true, 2353 | "license": "MIT", 2354 | "engines": { 2355 | "node": ">=8" 2356 | } 2357 | }, 2358 | "node_modules/ignore": { 2359 | "version": "5.3.2", 2360 | "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz", 2361 | "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 2362 | "dev": true, 2363 | "license": "MIT", 2364 | "engines": { 2365 | "node": ">= 4" 2366 | } 2367 | }, 2368 | "node_modules/import-fresh": { 2369 | "version": "3.3.1", 2370 | "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.1.tgz", 2371 | "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", 2372 | "dev": true, 2373 | "license": "MIT", 2374 | "dependencies": { 2375 | "parent-module": "^1.0.0", 2376 | "resolve-from": "^4.0.0" 2377 | }, 2378 | "engines": { 2379 | "node": ">=6" 2380 | }, 2381 | "funding": { 2382 | "url": "https://github.com/sponsors/sindresorhus" 2383 | } 2384 | }, 2385 | "node_modules/imurmurhash": { 2386 | "version": "0.1.4", 2387 | "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", 2388 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 2389 | "dev": true, 2390 | "license": "MIT", 2391 | "engines": { 2392 | "node": ">=0.8.19" 2393 | } 2394 | }, 2395 | "node_modules/is-extglob": { 2396 | "version": "2.1.1", 2397 | "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", 2398 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 2399 | "dev": true, 2400 | "license": "MIT", 2401 | "engines": { 2402 | "node": ">=0.10.0" 2403 | } 2404 | }, 2405 | "node_modules/is-glob": { 2406 | "version": "4.0.3", 2407 | "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", 2408 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2409 | "dev": true, 2410 | "license": "MIT", 2411 | "dependencies": { 2412 | "is-extglob": "^2.1.1" 2413 | }, 2414 | "engines": { 2415 | "node": ">=0.10.0" 2416 | } 2417 | }, 2418 | "node_modules/is-number": { 2419 | "version": "7.0.0", 2420 | "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", 2421 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2422 | "dev": true, 2423 | "license": "MIT", 2424 | "engines": { 2425 | "node": ">=0.12.0" 2426 | } 2427 | }, 2428 | "node_modules/isexe": { 2429 | "version": "2.0.0", 2430 | "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", 2431 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 2432 | "dev": true, 2433 | "license": "ISC" 2434 | }, 2435 | "node_modules/js-tokens": { 2436 | "version": "4.0.0", 2437 | "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", 2438 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 2439 | "dev": true, 2440 | "license": "MIT" 2441 | }, 2442 | "node_modules/js-yaml": { 2443 | "version": "4.1.0", 2444 | "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", 2445 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 2446 | "dev": true, 2447 | "license": "MIT", 2448 | "dependencies": { 2449 | "argparse": "^2.0.1" 2450 | }, 2451 | "bin": { 2452 | "js-yaml": "bin/js-yaml.js" 2453 | } 2454 | }, 2455 | "node_modules/jsesc": { 2456 | "version": "3.1.0", 2457 | "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", 2458 | "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", 2459 | "dev": true, 2460 | "license": "MIT", 2461 | "bin": { 2462 | "jsesc": "bin/jsesc" 2463 | }, 2464 | "engines": { 2465 | "node": ">=6" 2466 | } 2467 | }, 2468 | "node_modules/json-buffer": { 2469 | "version": "3.0.1", 2470 | "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", 2471 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 2472 | "dev": true, 2473 | "license": "MIT" 2474 | }, 2475 | "node_modules/json-schema-traverse": { 2476 | "version": "0.4.1", 2477 | "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 2478 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 2479 | "dev": true, 2480 | "license": "MIT" 2481 | }, 2482 | "node_modules/json-stable-stringify-without-jsonify": { 2483 | "version": "1.0.1", 2484 | "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 2485 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 2486 | "dev": true, 2487 | "license": "MIT" 2488 | }, 2489 | "node_modules/json5": { 2490 | "version": "2.2.3", 2491 | "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", 2492 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 2493 | "dev": true, 2494 | "license": "MIT", 2495 | "bin": { 2496 | "json5": "lib/cli.js" 2497 | }, 2498 | "engines": { 2499 | "node": ">=6" 2500 | } 2501 | }, 2502 | "node_modules/keyv": { 2503 | "version": "4.5.4", 2504 | "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", 2505 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 2506 | "dev": true, 2507 | "license": "MIT", 2508 | "dependencies": { 2509 | "json-buffer": "3.0.1" 2510 | } 2511 | }, 2512 | "node_modules/levn": { 2513 | "version": "0.4.1", 2514 | "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", 2515 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 2516 | "dev": true, 2517 | "license": "MIT", 2518 | "dependencies": { 2519 | "prelude-ls": "^1.2.1", 2520 | "type-check": "~0.4.0" 2521 | }, 2522 | "engines": { 2523 | "node": ">= 0.8.0" 2524 | } 2525 | }, 2526 | "node_modules/locate-path": { 2527 | "version": "6.0.0", 2528 | "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", 2529 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 2530 | "dev": true, 2531 | "license": "MIT", 2532 | "dependencies": { 2533 | "p-locate": "^5.0.0" 2534 | }, 2535 | "engines": { 2536 | "node": ">=10" 2537 | }, 2538 | "funding": { 2539 | "url": "https://github.com/sponsors/sindresorhus" 2540 | } 2541 | }, 2542 | "node_modules/lodash.merge": { 2543 | "version": "4.6.2", 2544 | "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", 2545 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 2546 | "dev": true, 2547 | "license": "MIT" 2548 | }, 2549 | "node_modules/lru-cache": { 2550 | "version": "5.1.1", 2551 | "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", 2552 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 2553 | "dev": true, 2554 | "license": "ISC", 2555 | "dependencies": { 2556 | "yallist": "^3.0.2" 2557 | } 2558 | }, 2559 | "node_modules/merge2": { 2560 | "version": "1.4.1", 2561 | "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", 2562 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 2563 | "dev": true, 2564 | "license": "MIT", 2565 | "engines": { 2566 | "node": ">= 8" 2567 | } 2568 | }, 2569 | "node_modules/micromatch": { 2570 | "version": "4.0.8", 2571 | "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", 2572 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 2573 | "dev": true, 2574 | "license": "MIT", 2575 | "dependencies": { 2576 | "braces": "^3.0.3", 2577 | "picomatch": "^2.3.1" 2578 | }, 2579 | "engines": { 2580 | "node": ">=8.6" 2581 | } 2582 | }, 2583 | "node_modules/minimatch": { 2584 | "version": "3.1.2", 2585 | "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", 2586 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2587 | "dev": true, 2588 | "license": "ISC", 2589 | "dependencies": { 2590 | "brace-expansion": "^1.1.7" 2591 | }, 2592 | "engines": { 2593 | "node": "*" 2594 | } 2595 | }, 2596 | "node_modules/ms": { 2597 | "version": "2.1.3", 2598 | "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", 2599 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2600 | "dev": true, 2601 | "license": "MIT" 2602 | }, 2603 | "node_modules/nanoid": { 2604 | "version": "3.3.8", 2605 | "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.8.tgz", 2606 | "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", 2607 | "dev": true, 2608 | "funding": [ 2609 | { 2610 | "type": "github", 2611 | "url": "https://github.com/sponsors/ai" 2612 | } 2613 | ], 2614 | "license": "MIT", 2615 | "bin": { 2616 | "nanoid": "bin/nanoid.cjs" 2617 | }, 2618 | "engines": { 2619 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 2620 | } 2621 | }, 2622 | "node_modules/natural-compare": { 2623 | "version": "1.4.0", 2624 | "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", 2625 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 2626 | "dev": true, 2627 | "license": "MIT" 2628 | }, 2629 | "node_modules/node-releases": { 2630 | "version": "2.0.19", 2631 | "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz", 2632 | "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", 2633 | "dev": true, 2634 | "license": "MIT" 2635 | }, 2636 | "node_modules/npm-run-path": { 2637 | "version": "6.0.0", 2638 | "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-6.0.0.tgz", 2639 | "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", 2640 | "dev": true, 2641 | "license": "MIT", 2642 | "dependencies": { 2643 | "path-key": "^4.0.0", 2644 | "unicorn-magic": "^0.3.0" 2645 | }, 2646 | "engines": { 2647 | "node": ">=18" 2648 | }, 2649 | "funding": { 2650 | "url": "https://github.com/sponsors/sindresorhus" 2651 | } 2652 | }, 2653 | "node_modules/npm-run-path/node_modules/path-key": { 2654 | "version": "4.0.0", 2655 | "resolved": "https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz", 2656 | "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", 2657 | "dev": true, 2658 | "license": "MIT", 2659 | "engines": { 2660 | "node": ">=12" 2661 | }, 2662 | "funding": { 2663 | "url": "https://github.com/sponsors/sindresorhus" 2664 | } 2665 | }, 2666 | "node_modules/optionator": { 2667 | "version": "0.9.4", 2668 | "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz", 2669 | "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 2670 | "dev": true, 2671 | "license": "MIT", 2672 | "dependencies": { 2673 | "deep-is": "^0.1.3", 2674 | "fast-levenshtein": "^2.0.6", 2675 | "levn": "^0.4.1", 2676 | "prelude-ls": "^1.2.1", 2677 | "type-check": "^0.4.0", 2678 | "word-wrap": "^1.2.5" 2679 | }, 2680 | "engines": { 2681 | "node": ">= 0.8.0" 2682 | } 2683 | }, 2684 | "node_modules/p-limit": { 2685 | "version": "3.1.0", 2686 | "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", 2687 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 2688 | "dev": true, 2689 | "license": "MIT", 2690 | "dependencies": { 2691 | "yocto-queue": "^0.1.0" 2692 | }, 2693 | "engines": { 2694 | "node": ">=10" 2695 | }, 2696 | "funding": { 2697 | "url": "https://github.com/sponsors/sindresorhus" 2698 | } 2699 | }, 2700 | "node_modules/p-locate": { 2701 | "version": "5.0.0", 2702 | "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", 2703 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 2704 | "dev": true, 2705 | "license": "MIT", 2706 | "dependencies": { 2707 | "p-limit": "^3.0.2" 2708 | }, 2709 | "engines": { 2710 | "node": ">=10" 2711 | }, 2712 | "funding": { 2713 | "url": "https://github.com/sponsors/sindresorhus" 2714 | } 2715 | }, 2716 | "node_modules/parent-module": { 2717 | "version": "1.0.1", 2718 | "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", 2719 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 2720 | "dev": true, 2721 | "license": "MIT", 2722 | "dependencies": { 2723 | "callsites": "^3.0.0" 2724 | }, 2725 | "engines": { 2726 | "node": ">=6" 2727 | } 2728 | }, 2729 | "node_modules/path-exists": { 2730 | "version": "4.0.0", 2731 | "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", 2732 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2733 | "dev": true, 2734 | "license": "MIT", 2735 | "engines": { 2736 | "node": ">=8" 2737 | } 2738 | }, 2739 | "node_modules/path-key": { 2740 | "version": "3.1.1", 2741 | "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", 2742 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2743 | "dev": true, 2744 | "license": "MIT", 2745 | "engines": { 2746 | "node": ">=8" 2747 | } 2748 | }, 2749 | "node_modules/picocolors": { 2750 | "version": "1.1.1", 2751 | "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", 2752 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 2753 | "dev": true, 2754 | "license": "ISC" 2755 | }, 2756 | "node_modules/picomatch": { 2757 | "version": "2.3.1", 2758 | "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", 2759 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2760 | "dev": true, 2761 | "license": "MIT", 2762 | "engines": { 2763 | "node": ">=8.6" 2764 | }, 2765 | "funding": { 2766 | "url": "https://github.com/sponsors/jonschlinkert" 2767 | } 2768 | }, 2769 | "node_modules/postcss": { 2770 | "version": "8.5.3", 2771 | "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.3.tgz", 2772 | "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", 2773 | "dev": true, 2774 | "funding": [ 2775 | { 2776 | "type": "opencollective", 2777 | "url": "https://opencollective.com/postcss/" 2778 | }, 2779 | { 2780 | "type": "tidelift", 2781 | "url": "https://tidelift.com/funding/github/npm/postcss" 2782 | }, 2783 | { 2784 | "type": "github", 2785 | "url": "https://github.com/sponsors/ai" 2786 | } 2787 | ], 2788 | "license": "MIT", 2789 | "dependencies": { 2790 | "nanoid": "^3.3.8", 2791 | "picocolors": "^1.1.1", 2792 | "source-map-js": "^1.2.1" 2793 | }, 2794 | "engines": { 2795 | "node": "^10 || ^12 || >=14" 2796 | } 2797 | }, 2798 | "node_modules/prelude-ls": { 2799 | "version": "1.2.1", 2800 | "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", 2801 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 2802 | "dev": true, 2803 | "license": "MIT", 2804 | "engines": { 2805 | "node": ">= 0.8.0" 2806 | } 2807 | }, 2808 | "node_modules/punycode": { 2809 | "version": "2.3.1", 2810 | "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", 2811 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 2812 | "dev": true, 2813 | "license": "MIT", 2814 | "engines": { 2815 | "node": ">=6" 2816 | } 2817 | }, 2818 | "node_modules/queue-microtask": { 2819 | "version": "1.2.3", 2820 | "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", 2821 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2822 | "dev": true, 2823 | "funding": [ 2824 | { 2825 | "type": "github", 2826 | "url": "https://github.com/sponsors/feross" 2827 | }, 2828 | { 2829 | "type": "patreon", 2830 | "url": "https://www.patreon.com/feross" 2831 | }, 2832 | { 2833 | "type": "consulting", 2834 | "url": "https://feross.org/support" 2835 | } 2836 | ], 2837 | "license": "MIT" 2838 | }, 2839 | "node_modules/react": { 2840 | "version": "19.0.0", 2841 | "resolved": "https://registry.npmmirror.com/react/-/react-19.0.0.tgz", 2842 | "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", 2843 | "license": "MIT", 2844 | "engines": { 2845 | "node": ">=0.10.0" 2846 | } 2847 | }, 2848 | "node_modules/react-dom": { 2849 | "version": "19.0.0", 2850 | "resolved": "https://registry.npmmirror.com/react-dom/-/react-dom-19.0.0.tgz", 2851 | "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", 2852 | "license": "MIT", 2853 | "dependencies": { 2854 | "scheduler": "^0.25.0" 2855 | }, 2856 | "peerDependencies": { 2857 | "react": "^19.0.0" 2858 | } 2859 | }, 2860 | "node_modules/react-refresh": { 2861 | "version": "0.14.2", 2862 | "resolved": "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.14.2.tgz", 2863 | "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", 2864 | "dev": true, 2865 | "license": "MIT", 2866 | "engines": { 2867 | "node": ">=0.10.0" 2868 | } 2869 | }, 2870 | "node_modules/readdirp": { 2871 | "version": "4.1.2", 2872 | "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-4.1.2.tgz", 2873 | "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", 2874 | "dev": true, 2875 | "license": "MIT", 2876 | "engines": { 2877 | "node": ">= 14.18.0" 2878 | }, 2879 | "funding": { 2880 | "type": "individual", 2881 | "url": "https://paulmillr.com/funding/" 2882 | } 2883 | }, 2884 | "node_modules/resolve-from": { 2885 | "version": "4.0.0", 2886 | "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", 2887 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2888 | "dev": true, 2889 | "license": "MIT", 2890 | "engines": { 2891 | "node": ">=4" 2892 | } 2893 | }, 2894 | "node_modules/reusify": { 2895 | "version": "1.1.0", 2896 | "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz", 2897 | "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", 2898 | "dev": true, 2899 | "license": "MIT", 2900 | "engines": { 2901 | "iojs": ">=1.0.0", 2902 | "node": ">=0.10.0" 2903 | } 2904 | }, 2905 | "node_modules/rollup": { 2906 | "version": "4.34.9", 2907 | "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.34.9.tgz", 2908 | "integrity": "sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ==", 2909 | "dev": true, 2910 | "license": "MIT", 2911 | "dependencies": { 2912 | "@types/estree": "1.0.6" 2913 | }, 2914 | "bin": { 2915 | "rollup": "dist/bin/rollup" 2916 | }, 2917 | "engines": { 2918 | "node": ">=18.0.0", 2919 | "npm": ">=8.0.0" 2920 | }, 2921 | "optionalDependencies": { 2922 | "@rollup/rollup-android-arm-eabi": "4.34.9", 2923 | "@rollup/rollup-android-arm64": "4.34.9", 2924 | "@rollup/rollup-darwin-arm64": "4.34.9", 2925 | "@rollup/rollup-darwin-x64": "4.34.9", 2926 | "@rollup/rollup-freebsd-arm64": "4.34.9", 2927 | "@rollup/rollup-freebsd-x64": "4.34.9", 2928 | "@rollup/rollup-linux-arm-gnueabihf": "4.34.9", 2929 | "@rollup/rollup-linux-arm-musleabihf": "4.34.9", 2930 | "@rollup/rollup-linux-arm64-gnu": "4.34.9", 2931 | "@rollup/rollup-linux-arm64-musl": "4.34.9", 2932 | "@rollup/rollup-linux-loongarch64-gnu": "4.34.9", 2933 | "@rollup/rollup-linux-powerpc64le-gnu": "4.34.9", 2934 | "@rollup/rollup-linux-riscv64-gnu": "4.34.9", 2935 | "@rollup/rollup-linux-s390x-gnu": "4.34.9", 2936 | "@rollup/rollup-linux-x64-gnu": "4.34.9", 2937 | "@rollup/rollup-linux-x64-musl": "4.34.9", 2938 | "@rollup/rollup-win32-arm64-msvc": "4.34.9", 2939 | "@rollup/rollup-win32-ia32-msvc": "4.34.9", 2940 | "@rollup/rollup-win32-x64-msvc": "4.34.9", 2941 | "fsevents": "~2.3.2" 2942 | } 2943 | }, 2944 | "node_modules/run-parallel": { 2945 | "version": "1.2.0", 2946 | "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", 2947 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2948 | "dev": true, 2949 | "funding": [ 2950 | { 2951 | "type": "github", 2952 | "url": "https://github.com/sponsors/feross" 2953 | }, 2954 | { 2955 | "type": "patreon", 2956 | "url": "https://www.patreon.com/feross" 2957 | }, 2958 | { 2959 | "type": "consulting", 2960 | "url": "https://feross.org/support" 2961 | } 2962 | ], 2963 | "license": "MIT", 2964 | "dependencies": { 2965 | "queue-microtask": "^1.2.2" 2966 | } 2967 | }, 2968 | "node_modules/scheduler": { 2969 | "version": "0.25.0", 2970 | "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.25.0.tgz", 2971 | "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", 2972 | "license": "MIT" 2973 | }, 2974 | "node_modules/semver": { 2975 | "version": "6.3.1", 2976 | "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", 2977 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 2978 | "dev": true, 2979 | "license": "ISC", 2980 | "bin": { 2981 | "semver": "bin/semver.js" 2982 | } 2983 | }, 2984 | "node_modules/shebang-command": { 2985 | "version": "2.0.0", 2986 | "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", 2987 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2988 | "dev": true, 2989 | "license": "MIT", 2990 | "dependencies": { 2991 | "shebang-regex": "^3.0.0" 2992 | }, 2993 | "engines": { 2994 | "node": ">=8" 2995 | } 2996 | }, 2997 | "node_modules/shebang-regex": { 2998 | "version": "3.0.0", 2999 | "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", 3000 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 3001 | "dev": true, 3002 | "license": "MIT", 3003 | "engines": { 3004 | "node": ">=8" 3005 | } 3006 | }, 3007 | "node_modules/source-map-js": { 3008 | "version": "1.2.1", 3009 | "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", 3010 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 3011 | "dev": true, 3012 | "license": "BSD-3-Clause", 3013 | "engines": { 3014 | "node": ">=0.10.0" 3015 | } 3016 | }, 3017 | "node_modules/strip-ansi": { 3018 | "version": "7.1.0", 3019 | "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz", 3020 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 3021 | "dev": true, 3022 | "license": "MIT", 3023 | "dependencies": { 3024 | "ansi-regex": "^6.0.1" 3025 | }, 3026 | "engines": { 3027 | "node": ">=12" 3028 | }, 3029 | "funding": { 3030 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 3031 | } 3032 | }, 3033 | "node_modules/strip-json-comments": { 3034 | "version": "3.1.1", 3035 | "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 3036 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 3037 | "dev": true, 3038 | "license": "MIT", 3039 | "engines": { 3040 | "node": ">=8" 3041 | }, 3042 | "funding": { 3043 | "url": "https://github.com/sponsors/sindresorhus" 3044 | } 3045 | }, 3046 | "node_modules/supports-color": { 3047 | "version": "7.2.0", 3048 | "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", 3049 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 3050 | "dev": true, 3051 | "license": "MIT", 3052 | "dependencies": { 3053 | "has-flag": "^4.0.0" 3054 | }, 3055 | "engines": { 3056 | "node": ">=8" 3057 | } 3058 | }, 3059 | "node_modules/tiny-invariant": { 3060 | "version": "1.3.3", 3061 | "resolved": "https://registry.npmmirror.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz", 3062 | "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", 3063 | "dev": true, 3064 | "license": "MIT" 3065 | }, 3066 | "node_modules/tinyglobby": { 3067 | "version": "0.2.12", 3068 | "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.12.tgz", 3069 | "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", 3070 | "dev": true, 3071 | "license": "MIT", 3072 | "dependencies": { 3073 | "fdir": "^6.4.3", 3074 | "picomatch": "^4.0.2" 3075 | }, 3076 | "engines": { 3077 | "node": ">=12.0.0" 3078 | }, 3079 | "funding": { 3080 | "url": "https://github.com/sponsors/SuperchupuDev" 3081 | } 3082 | }, 3083 | "node_modules/tinyglobby/node_modules/fdir": { 3084 | "version": "6.4.3", 3085 | "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.4.3.tgz", 3086 | "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", 3087 | "dev": true, 3088 | "license": "MIT", 3089 | "peerDependencies": { 3090 | "picomatch": "^3 || ^4" 3091 | }, 3092 | "peerDependenciesMeta": { 3093 | "picomatch": { 3094 | "optional": true 3095 | } 3096 | } 3097 | }, 3098 | "node_modules/tinyglobby/node_modules/picomatch": { 3099 | "version": "4.0.2", 3100 | "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz", 3101 | "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", 3102 | "dev": true, 3103 | "license": "MIT", 3104 | "engines": { 3105 | "node": ">=12" 3106 | }, 3107 | "funding": { 3108 | "url": "https://github.com/sponsors/jonschlinkert" 3109 | } 3110 | }, 3111 | "node_modules/to-regex-range": { 3112 | "version": "5.0.1", 3113 | "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", 3114 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3115 | "dev": true, 3116 | "license": "MIT", 3117 | "dependencies": { 3118 | "is-number": "^7.0.0" 3119 | }, 3120 | "engines": { 3121 | "node": ">=8.0" 3122 | } 3123 | }, 3124 | "node_modules/ts-api-utils": { 3125 | "version": "2.0.1", 3126 | "resolved": "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-2.0.1.tgz", 3127 | "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", 3128 | "dev": true, 3129 | "license": "MIT", 3130 | "engines": { 3131 | "node": ">=18.12" 3132 | }, 3133 | "peerDependencies": { 3134 | "typescript": ">=4.8.4" 3135 | } 3136 | }, 3137 | "node_modules/type-check": { 3138 | "version": "0.4.0", 3139 | "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", 3140 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 3141 | "dev": true, 3142 | "license": "MIT", 3143 | "dependencies": { 3144 | "prelude-ls": "^1.2.1" 3145 | }, 3146 | "engines": { 3147 | "node": ">= 0.8.0" 3148 | } 3149 | }, 3150 | "node_modules/typescript": { 3151 | "version": "5.7.3", 3152 | "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.7.3.tgz", 3153 | "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", 3154 | "dev": true, 3155 | "license": "Apache-2.0", 3156 | "bin": { 3157 | "tsc": "bin/tsc", 3158 | "tsserver": "bin/tsserver" 3159 | }, 3160 | "engines": { 3161 | "node": ">=14.17" 3162 | } 3163 | }, 3164 | "node_modules/typescript-eslint": { 3165 | "version": "8.25.0", 3166 | "resolved": "https://registry.npmmirror.com/typescript-eslint/-/typescript-eslint-8.25.0.tgz", 3167 | "integrity": "sha512-TxRdQQLH4g7JkoFlYG3caW5v1S6kEkz8rqt80iQJZUYPq1zD1Ra7HfQBJJ88ABRaMvHAXnwRvRB4V+6sQ9xN5Q==", 3168 | "dev": true, 3169 | "license": "MIT", 3170 | "dependencies": { 3171 | "@typescript-eslint/eslint-plugin": "8.25.0", 3172 | "@typescript-eslint/parser": "8.25.0", 3173 | "@typescript-eslint/utils": "8.25.0" 3174 | }, 3175 | "engines": { 3176 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 3177 | }, 3178 | "funding": { 3179 | "type": "opencollective", 3180 | "url": "https://opencollective.com/typescript-eslint" 3181 | }, 3182 | "peerDependencies": { 3183 | "eslint": "^8.57.0 || ^9.0.0", 3184 | "typescript": ">=4.8.4 <5.8.0" 3185 | } 3186 | }, 3187 | "node_modules/unicorn-magic": { 3188 | "version": "0.3.0", 3189 | "resolved": "https://registry.npmmirror.com/unicorn-magic/-/unicorn-magic-0.3.0.tgz", 3190 | "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", 3191 | "dev": true, 3192 | "license": "MIT", 3193 | "engines": { 3194 | "node": ">=18" 3195 | }, 3196 | "funding": { 3197 | "url": "https://github.com/sponsors/sindresorhus" 3198 | } 3199 | }, 3200 | "node_modules/update-browserslist-db": { 3201 | "version": "1.1.3", 3202 | "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", 3203 | "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", 3204 | "dev": true, 3205 | "funding": [ 3206 | { 3207 | "type": "opencollective", 3208 | "url": "https://opencollective.com/browserslist" 3209 | }, 3210 | { 3211 | "type": "tidelift", 3212 | "url": "https://tidelift.com/funding/github/npm/browserslist" 3213 | }, 3214 | { 3215 | "type": "github", 3216 | "url": "https://github.com/sponsors/ai" 3217 | } 3218 | ], 3219 | "license": "MIT", 3220 | "dependencies": { 3221 | "escalade": "^3.2.0", 3222 | "picocolors": "^1.1.1" 3223 | }, 3224 | "bin": { 3225 | "update-browserslist-db": "cli.js" 3226 | }, 3227 | "peerDependencies": { 3228 | "browserslist": ">= 4.21.0" 3229 | } 3230 | }, 3231 | "node_modules/uri-js": { 3232 | "version": "4.4.1", 3233 | "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", 3234 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 3235 | "dev": true, 3236 | "license": "BSD-2-Clause", 3237 | "dependencies": { 3238 | "punycode": "^2.1.0" 3239 | } 3240 | }, 3241 | "node_modules/vite": { 3242 | "version": "6.2.0", 3243 | "resolved": "https://registry.npmmirror.com/vite/-/vite-6.2.0.tgz", 3244 | "integrity": "sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==", 3245 | "dev": true, 3246 | "license": "MIT", 3247 | "dependencies": { 3248 | "esbuild": "^0.25.0", 3249 | "postcss": "^8.5.3", 3250 | "rollup": "^4.30.1" 3251 | }, 3252 | "bin": { 3253 | "vite": "bin/vite.js" 3254 | }, 3255 | "engines": { 3256 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 3257 | }, 3258 | "funding": { 3259 | "url": "https://github.com/vitejs/vite?sponsor=1" 3260 | }, 3261 | "optionalDependencies": { 3262 | "fsevents": "~2.3.3" 3263 | }, 3264 | "peerDependencies": { 3265 | "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 3266 | "jiti": ">=1.21.0", 3267 | "less": "*", 3268 | "lightningcss": "^1.21.0", 3269 | "sass": "*", 3270 | "sass-embedded": "*", 3271 | "stylus": "*", 3272 | "sugarss": "*", 3273 | "terser": "^5.16.0", 3274 | "tsx": "^4.8.1", 3275 | "yaml": "^2.4.2" 3276 | }, 3277 | "peerDependenciesMeta": { 3278 | "@types/node": { 3279 | "optional": true 3280 | }, 3281 | "jiti": { 3282 | "optional": true 3283 | }, 3284 | "less": { 3285 | "optional": true 3286 | }, 3287 | "lightningcss": { 3288 | "optional": true 3289 | }, 3290 | "sass": { 3291 | "optional": true 3292 | }, 3293 | "sass-embedded": { 3294 | "optional": true 3295 | }, 3296 | "stylus": { 3297 | "optional": true 3298 | }, 3299 | "sugarss": { 3300 | "optional": true 3301 | }, 3302 | "terser": { 3303 | "optional": true 3304 | }, 3305 | "tsx": { 3306 | "optional": true 3307 | }, 3308 | "yaml": { 3309 | "optional": true 3310 | } 3311 | } 3312 | }, 3313 | "node_modules/vite-plugin-checker": { 3314 | "version": "0.9.0", 3315 | "resolved": "https://registry.npmmirror.com/vite-plugin-checker/-/vite-plugin-checker-0.9.0.tgz", 3316 | "integrity": "sha512-gf/zc0KWX8ATEOgnpgAM1I+IbvWkkO80RB+FxlLtC5cabXSesbJmAUw6E+mMDDMGIT+VHAktmxJZpMTt3lSubQ==", 3317 | "dev": true, 3318 | "license": "MIT", 3319 | "dependencies": { 3320 | "@babel/code-frame": "^7.26.2", 3321 | "chokidar": "^4.0.3", 3322 | "npm-run-path": "^6.0.0", 3323 | "picocolors": "^1.1.1", 3324 | "picomatch": "^4.0.2", 3325 | "strip-ansi": "^7.1.0", 3326 | "tiny-invariant": "^1.3.3", 3327 | "tinyglobby": "^0.2.12", 3328 | "vscode-uri": "^3.1.0" 3329 | }, 3330 | "engines": { 3331 | "node": ">=14.16" 3332 | }, 3333 | "peerDependencies": { 3334 | "@biomejs/biome": ">=1.7", 3335 | "eslint": ">=7", 3336 | "meow": "^13.2.0", 3337 | "optionator": "^0.9.1", 3338 | "stylelint": ">=16", 3339 | "typescript": "*", 3340 | "vite": ">=2.0.0", 3341 | "vls": "*", 3342 | "vti": "*", 3343 | "vue-tsc": "~2.2.2" 3344 | }, 3345 | "peerDependenciesMeta": { 3346 | "@biomejs/biome": { 3347 | "optional": true 3348 | }, 3349 | "eslint": { 3350 | "optional": true 3351 | }, 3352 | "meow": { 3353 | "optional": true 3354 | }, 3355 | "optionator": { 3356 | "optional": true 3357 | }, 3358 | "stylelint": { 3359 | "optional": true 3360 | }, 3361 | "typescript": { 3362 | "optional": true 3363 | }, 3364 | "vls": { 3365 | "optional": true 3366 | }, 3367 | "vti": { 3368 | "optional": true 3369 | }, 3370 | "vue-tsc": { 3371 | "optional": true 3372 | } 3373 | } 3374 | }, 3375 | "node_modules/vite-plugin-checker/node_modules/picomatch": { 3376 | "version": "4.0.2", 3377 | "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz", 3378 | "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", 3379 | "dev": true, 3380 | "license": "MIT", 3381 | "engines": { 3382 | "node": ">=12" 3383 | }, 3384 | "funding": { 3385 | "url": "https://github.com/sponsors/jonschlinkert" 3386 | } 3387 | }, 3388 | "node_modules/vscode-uri": { 3389 | "version": "3.1.0", 3390 | "resolved": "https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.1.0.tgz", 3391 | "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", 3392 | "dev": true, 3393 | "license": "MIT" 3394 | }, 3395 | "node_modules/which": { 3396 | "version": "2.0.2", 3397 | "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", 3398 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3399 | "dev": true, 3400 | "license": "ISC", 3401 | "dependencies": { 3402 | "isexe": "^2.0.0" 3403 | }, 3404 | "bin": { 3405 | "node-which": "bin/node-which" 3406 | }, 3407 | "engines": { 3408 | "node": ">= 8" 3409 | } 3410 | }, 3411 | "node_modules/word-wrap": { 3412 | "version": "1.2.5", 3413 | "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz", 3414 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 3415 | "dev": true, 3416 | "license": "MIT", 3417 | "engines": { 3418 | "node": ">=0.10.0" 3419 | } 3420 | }, 3421 | "node_modules/yallist": { 3422 | "version": "3.1.1", 3423 | "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", 3424 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 3425 | "dev": true, 3426 | "license": "ISC" 3427 | }, 3428 | "node_modules/yocto-queue": { 3429 | "version": "0.1.0", 3430 | "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", 3431 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 3432 | "dev": true, 3433 | "license": "MIT", 3434 | "engines": { 3435 | "node": ">=10" 3436 | }, 3437 | "funding": { 3438 | "url": "https://github.com/sponsors/sindresorhus" 3439 | } 3440 | } 3441 | } 3442 | } 3443 | -------------------------------------------------------------------------------- /flipClock2025-react-ts/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "flipclock2025-react-ts", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "tsc -b && vite build", 9 | "lint": "eslint .", 10 | "preview": "vite preview" 11 | }, 12 | "dependencies": { 13 | "react": "^19.0.0", 14 | "react-dom": "^19.0.0" 15 | }, 16 | "devDependencies": { 17 | "@eslint/js": "^9.21.0", 18 | "@types/react": "^19.0.10", 19 | "@types/react-dom": "^19.0.4", 20 | "@vitejs/plugin-react": "^4.3.4", 21 | "eslint": "^9.21.0", 22 | "eslint-plugin-react-hooks": "^5.2.0", 23 | "eslint-plugin-react-refresh": "^0.4.19", 24 | "globals": "^16.0.0", 25 | "typescript": "~5.7.3", 26 | "typescript-eslint": "^8.25.0", 27 | "vite": "^6.2.0", 28 | "vite-plugin-checker": "^0.9.0" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /flipClock2025-react-ts/public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /flipClock2025-react-ts/src/App.tsx: -------------------------------------------------------------------------------- 1 | import FilpClock from './components/flipClock' 2 | 3 | function App() { 4 | return ( 5 |
6 | 7 |
8 | ) 9 | } 10 | 11 | export default App 12 | -------------------------------------------------------------------------------- /flipClock2025-react-ts/src/components/flipCard/flipCard.css: -------------------------------------------------------------------------------- 1 | .M-FlipCard { 2 | display: inline-block; 3 | position: relative; 4 | width: 60px; 5 | height: 100px; 6 | line-height: 100px; 7 | border: solid 1px #000; 8 | border-radius: 10px; 9 | background: #fff; 10 | font-size: 66px; 11 | color: #fff; 12 | box-shadow: 0 0 6px rgba(0, 0, 0, 0.5); 13 | text-align: center; 14 | font-family: 'Helvetica Neue'; 15 | } 16 | 17 | .M-FlipCard .digital:before, 18 | .M-FlipCard .digital:after { 19 | content: ''; 20 | position: absolute; 21 | left: 0; 22 | right: 0; 23 | background: #000; 24 | overflow: hidden; 25 | box-sizing: border-box; 26 | } 27 | 28 | .M-FlipCard .digital:before { 29 | top: 0; 30 | bottom: 50%; 31 | border-radius: 10px 10px 0 0; 32 | border-bottom: solid 1px #666; 33 | } 34 | 35 | .M-FlipCard .digital:after { 36 | top: 50%; 37 | bottom: 0; 38 | border-radius: 0 0 10px 10px; 39 | line-height: 0; 40 | } 41 | 42 | /*向下翻*/ 43 | .M-FlipCard.down .front:before { 44 | z-index: 3; 45 | } 46 | 47 | .M-FlipCard.down .back:after { 48 | z-index: 2; 49 | transform-origin: 50% 0%; 50 | transform: perspective(160px) rotateX(180deg); 51 | } 52 | 53 | .M-FlipCard.down .front:after, 54 | .M-FlipCard.down .back:before { 55 | z-index: 1; 56 | } 57 | 58 | .M-FlipCard.down.go .front:before { 59 | transform-origin: 50% 100%; 60 | animation: frontFlipDown 0.6s ease-in-out both; 61 | box-shadow: 0 -2px 6px rgba(255, 255, 255, 0.3); 62 | backface-visibility: hidden; 63 | } 64 | 65 | .M-FlipCard.down.go .back:after { 66 | animation: backFlipDown 0.6s ease-in-out both; 67 | } 68 | 69 | /*向上翻*/ 70 | .M-FlipCard.up .front:after { 71 | z-index: 3; 72 | } 73 | 74 | .M-FlipCard.up .back:before { 75 | z-index: 2; 76 | transform-origin: 50% 100%; 77 | transform: perspective(160px) rotateX(-180deg); 78 | } 79 | 80 | .M-FlipCard.up .front:before, 81 | .M-FlipCard.up .back:after { 82 | z-index: 1; 83 | } 84 | 85 | .M-FlipCard.up.go .front:after { 86 | transform-origin: 50% 0; 87 | animation: frontFlipUp 0.6s ease-in-out both; 88 | box-shadow: 0 2px 6px rgba(255, 255, 255, 0.3); 89 | backface-visibility: hidden; 90 | } 91 | 92 | .M-FlipCard.up.go .back:before { 93 | animation: backFlipUp 0.6s ease-in-out both; 94 | } 95 | 96 | @keyframes frontFlipDown { 97 | 0% { 98 | transform: perspective(160px) rotateX(0deg); 99 | } 100 | 101 | 100% { 102 | transform: perspective(160px) rotateX(-180deg); 103 | } 104 | } 105 | 106 | @keyframes backFlipDown { 107 | 0% { 108 | transform: perspective(160px) rotateX(180deg); 109 | } 110 | 111 | 100% { 112 | transform: perspective(160px) rotateX(0deg); 113 | } 114 | } 115 | 116 | @keyframes frontFlipUp { 117 | 0% { 118 | transform: perspective(160px) rotateX(0deg); 119 | } 120 | 121 | 100% { 122 | transform: perspective(160px) rotateX(180deg); 123 | } 124 | } 125 | 126 | @keyframes backFlipUp { 127 | 0% { 128 | transform: perspective(160px) rotateX(-180deg); 129 | } 130 | 131 | 100% { 132 | transform: perspective(160px) rotateX(0deg); 133 | } 134 | } 135 | 136 | .M-FlipCard .number0:before, 137 | .M-FlipCard .number0:after { 138 | content: '0'; 139 | } 140 | 141 | .M-FlipCard .number1:before, 142 | .M-FlipCard .number1:after { 143 | content: '1'; 144 | } 145 | 146 | .M-FlipCard .number2:before, 147 | .M-FlipCard .number2:after { 148 | content: '2'; 149 | } 150 | 151 | .M-FlipCard .number3:before, 152 | .M-FlipCard .number3:after { 153 | content: '3'; 154 | } 155 | 156 | .M-FlipCard .number4:before, 157 | .M-FlipCard .number4:after { 158 | content: '4'; 159 | } 160 | 161 | .M-FlipCard .number5:before, 162 | .M-FlipCard .number5:after { 163 | content: '5'; 164 | } 165 | 166 | .M-FlipCard .number6:before, 167 | .M-FlipCard .number6:after { 168 | content: '6'; 169 | } 170 | 171 | .M-FlipCard .number7:before, 172 | .M-FlipCard .number7:after { 173 | content: '7'; 174 | } 175 | 176 | .M-FlipCard .number8:before, 177 | .M-FlipCard .number8:after { 178 | content: '8'; 179 | } 180 | 181 | .M-FlipCard .number9:before, 182 | .M-FlipCard .number9:after { 183 | content: '9'; 184 | } -------------------------------------------------------------------------------- /flipClock2025-react-ts/src/components/flipCard/index.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * 翻牌数字 3 | * @author: 兔子先生 4 | * @media: 请关注微信公众号【卧梅又闻花】,获取最新优秀开发教程 5 | * @updateDate: 2025-03 6 | */ 7 | 8 | import { useState, useImperativeHandle, forwardRef } from 'react' 9 | import type { 10 | FlipCardHandleInterface, 11 | FlipCardPropsInterface, 12 | } from './interfaces' 13 | import './flipCard.css' 14 | 15 | function FlipCard( 16 | { 17 | // 初始前牌文字 18 | initFrontText = '0', 19 | // 初始后牌文字 20 | initBackText = '1', 21 | // 翻牌动画时间,与CSS中设置的animation-duration保持一致 22 | duration = 600, 23 | }: FlipCardPropsInterface, 24 | ref: React.Ref 25 | ) { 26 | // 是否正在翻转中 27 | const [isFlipping, setIsFlipping] = useState(false) 28 | // 翻转类型,down=向下翻转,up=向上翻转 29 | const [flipType, setFlipType] = useState('down') 30 | // 前牌文字 31 | const [frontText, setFrontText] = useState(initFrontText) 32 | // 后牌文字 33 | const [backText, setBackText] = useState(initBackText) 34 | 35 | // 翻转 36 | const flip = ({ 37 | type, 38 | newFrontText, 39 | newBackText, 40 | }: { 41 | type: string 42 | newFrontText: string | number 43 | newBackText: string | number 44 | }) => { 45 | if (isFlipping) { 46 | return false 47 | } 48 | setFrontText(newFrontText) 49 | setBackText(newBackText) 50 | setFlipType(type) 51 | setIsFlipping(true) 52 | 53 | setTimeout(() => { 54 | setFrontText(newBackText) 55 | setIsFlipping(false) 56 | }, duration) 57 | } 58 | useImperativeHandle(ref, () => { 59 | return { 60 | // 下翻牌 61 | flipDown: ( 62 | newFrontText: string | number, 63 | newBackText: string | number 64 | ) => { 65 | flip({ type: 'down', newFrontText, newBackText }) 66 | }, 67 | // 上翻牌 68 | flipUp: ( 69 | newFrontText: string | number, 70 | newBackText: string | number 71 | ) => { 72 | flip({ type: 'up', newFrontText, newBackText }) 73 | }, 74 | } 75 | }) 76 | 77 | return ( 78 |
83 |
84 |
85 |
86 | ) 87 | } 88 | 89 | export default forwardRef( 90 | FlipCard 91 | ) 92 | -------------------------------------------------------------------------------- /flipClock2025-react-ts/src/components/flipCard/interfaces.tsx: -------------------------------------------------------------------------------- 1 | export interface FlipCardHandleInterface { 2 | flipDown: ( 3 | newFrontText: string | number, 4 | newBackText: string | number 5 | ) => void 6 | flipUp: ( 7 | newFrontText: string | number, 8 | newBackText: string | number 9 | ) => void 10 | } 11 | 12 | export interface FlipCardPropsInterface { 13 | initFrontText?: string | number 14 | initBackText?: string | number 15 | duration?: number 16 | } 17 | -------------------------------------------------------------------------------- /flipClock2025-react-ts/src/components/flipClock/flipClock.css: -------------------------------------------------------------------------------- 1 | .FlipClock { 2 | text-align: center; 3 | } 4 | 5 | .FlipClock .M-FlipCard { 6 | margin: 0 3px; 7 | } 8 | 9 | .FlipClock em { 10 | display: inline-block; 11 | line-height: 102px; 12 | font-size: 66px; 13 | font-style: normal; 14 | vertical-align: top; 15 | } 16 | -------------------------------------------------------------------------------- /flipClock2025-react-ts/src/components/flipClock/index.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * 翻牌数字 3 | * @author: 兔子先生 4 | * @media: 请关注微信公众号【卧梅又闻花】,获取最新优秀开发教程 5 | * @updateDate: 2025-03 6 | */ 7 | 8 | import { useEffect, useRef } from 'react' 9 | import FlipCard from '../flipCard' 10 | import type { FlipCardHandleInterface } from '../flipCard/interfaces' 11 | import './flipClock.css' 12 | 13 | function FilpClock() { 14 | const timer = useRef | null>(null) 15 | 16 | const flipCardHour1Ref = useRef(null) 17 | const flipCardHour2Ref = useRef(null) 18 | const flipCardMinute1Ref = useRef(null) 19 | const flipCardMinute2Ref = useRef(null) 20 | const flipCardSecond1Ref = useRef(null) 21 | const flipCardSecond2Ref = useRef(null) 22 | 23 | const flipCards = [ 24 | flipCardHour1Ref, 25 | flipCardHour2Ref, 26 | flipCardMinute1Ref, 27 | flipCardMinute2Ref, 28 | flipCardSecond1Ref, 29 | flipCardSecond2Ref, 30 | ] 31 | 32 | useEffect(() => { 33 | // 开始计时 34 | const run = () => { 35 | timer.current = setInterval(() => { 36 | // 获取当前时间 37 | const now = new Date() 38 | const nowTimeStr = formatDate( 39 | new Date(now.getTime() - 1000), 40 | 'hhiiss' 41 | ) 42 | const nextTimeStr = formatDate(now, 'hhiiss') 43 | for (let i = 0; i < flipCards.length; i++) { 44 | if (nowTimeStr[i] === nextTimeStr[i]) { 45 | continue 46 | } 47 | flipCards[i].current?.flipDown(nowTimeStr[i], nextTimeStr[i]) 48 | } 49 | }, 1000) 50 | } 51 | run() 52 | }) 53 | 54 | // 正则格式化日期 55 | const formatDate = (date: Date, dateFormat: string) => { 56 | /* 单独格式化年份,根据y的字符数量输出年份 57 | * 例如:yyyy => 2019 58 | yy => 19 59 | y => 9 60 | */ 61 | const yearMatch = dateFormat.match(/(y+)/) 62 | if (yearMatch) { 63 | dateFormat = dateFormat.replace( 64 | yearMatch[0], 65 | (date.getFullYear() + '').slice(-yearMatch[0].length) 66 | ) 67 | } 68 | // 格式化月、日、时、分、秒 69 | const formatMap: Record = { 70 | 'm+': date.getMonth() + 1, 71 | 'd+': date.getDate(), 72 | 'h+': date.getHours(), 73 | 'i+': date.getMinutes(), 74 | 's+': date.getSeconds(), 75 | } 76 | for (const key in formatMap) { 77 | const match = dateFormat.match(new RegExp(`(${key})`)) 78 | if (match) { 79 | // 取出对应的值 80 | const str = formatMap[key] + '' 81 | /* 根据设置的格式,输出对应的字符 82 | * 例如: 早上8时,hh => 08,h => 8 83 | * 但是,当数字>=10时,无论格式为一位还是多位,不做截取,这是与年份格式化不一致的地方 84 | * 例如: 下午15时,hh => 15, h => 15 85 | */ 86 | dateFormat = dateFormat.replace( 87 | match[0], 88 | match[0].length === 1 ? str : str.padStart(2, '0') 89 | ) 90 | } 91 | } 92 | 93 | return dateFormat 94 | } 95 | 96 | // 初始化 97 | const now = new Date() 98 | const initNowTimeStr = formatDate(new Date(now.getTime()), 'hhiiss') 99 | 100 | return ( 101 |
102 | 103 | 104 | : 105 | 109 | 113 | : 114 | 118 | 122 |
123 | ) 124 | } 125 | 126 | export default FilpClock 127 | -------------------------------------------------------------------------------- /flipClock2025-react-ts/src/main.tsx: -------------------------------------------------------------------------------- 1 | import { createRoot } from 'react-dom/client' 2 | import App from './App.tsx' 3 | 4 | createRoot(document.getElementById('root')!).render() 5 | -------------------------------------------------------------------------------- /flipClock2025-react-ts/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /flipClock2025-react-ts/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", 4 | "target": "ES2020", 5 | "useDefineForClassFields": true, 6 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 7 | "module": "ESNext", 8 | "skipLibCheck": true, 9 | 10 | /* Bundler mode */ 11 | "moduleResolution": "bundler", 12 | "allowImportingTsExtensions": true, 13 | "isolatedModules": true, 14 | "moduleDetection": "force", 15 | "noEmit": true, 16 | "jsx": "react-jsx", 17 | 18 | /* Linting */ 19 | "strict": true, 20 | "noUnusedLocals": true, 21 | "noUnusedParameters": true, 22 | "noFallthroughCasesInSwitch": true, 23 | "noUncheckedSideEffectImports": true 24 | }, 25 | "include": ["src"] 26 | } 27 | -------------------------------------------------------------------------------- /flipClock2025-react-ts/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { "path": "./tsconfig.app.json" }, 5 | { "path": "./tsconfig.node.json" } 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /flipClock2025-react-ts/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 4 | "target": "ES2022", 5 | "lib": ["ES2023"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "isolatedModules": true, 13 | "moduleDetection": "force", 14 | "noEmit": true, 15 | 16 | /* Linting */ 17 | "strict": true, 18 | "noUnusedLocals": true, 19 | "noUnusedParameters": true, 20 | "noFallthroughCasesInSwitch": true, 21 | "noUncheckedSideEffectImports": true 22 | }, 23 | "include": ["vite.config.ts"] 24 | } 25 | -------------------------------------------------------------------------------- /flipClock2025-react-ts/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react' 3 | import checker from 'vite-plugin-checker' 4 | 5 | // https://vite.dev/config/ 6 | export default defineConfig({ 7 | server: { host: '0.0.0.0' }, 8 | // 静态资源引用路径,默认为"/" 9 | base: './', 10 | plugins: [ 11 | react(), 12 | checker({ 13 | eslint: { 14 | // useFlatConfig: true 表示使用扁平模式配置(eslint.config.js) 15 | // useFlatConfig: false 表示使用传统模式配置(如.eslintrc.json、.eslintrc.cjs) 16 | useFlatConfig: true, 17 | lintCommand: 'eslint "./src/**/*.{js,jsx,ts,tsx}"', 18 | }, 19 | }), 20 | ], 21 | }) 22 | -------------------------------------------------------------------------------- /flipClock2025-vue-js/.editorconfig: -------------------------------------------------------------------------------- 1 | [*.{js,jsx,mjs,cjs,ts,tsx,mts,cts,vue}] 2 | charset = utf-8 3 | indent_size = 2 4 | indent_style = space 5 | insert_final_newline = true 6 | trim_trailing_whitespace = true 7 | 8 | end_of_line = lf 9 | max_line_length = 100 10 | -------------------------------------------------------------------------------- /flipClock2025-vue-js/.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | -------------------------------------------------------------------------------- /flipClock2025-vue-js/.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 | .DS_Store 12 | dist 13 | dist-ssr 14 | coverage 15 | *.local 16 | 17 | /cypress/videos/ 18 | /cypress/screenshots/ 19 | 20 | # Editor directories and files 21 | .vscode/* 22 | !.vscode/extensions.json 23 | .idea 24 | *.suo 25 | *.ntvs* 26 | *.njsproj 27 | *.sln 28 | *.sw? 29 | 30 | *.tsbuildinfo 31 | -------------------------------------------------------------------------------- /flipClock2025-vue-js/.prettierrc.json: -------------------------------------------------------------------------------- 1 | 2 | { 3 | "$schema": "https://json.schemastore.org/prettierrc", 4 | "semi": false, 5 | "singleQuote": true, 6 | "printWidth": 100 7 | } 8 | -------------------------------------------------------------------------------- /flipClock2025-vue-js/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "Vue.volar", 4 | "dbaeumer.vscode-eslint", 5 | "EditorConfig.EditorConfig", 6 | "esbenp.prettier-vscode" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /flipClock2025-vue-js/README.md: -------------------------------------------------------------------------------- 1 | # 2025新春版:干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React) 2 | ## Vue3 Javascript版 3 | 4 | > 本项目提供的是组件源码,并不是npm依赖包。适合直接放到实际项目中使用,可根据实际项目需求自行修改。 5 | 6 | ## 使用方法 7 | 8 | 安装依赖包: 9 | ``` 10 | npm install 11 | ``` 12 | 13 | 运行项目: 14 | ``` 15 | npm run dev 16 | ``` 17 | 18 | build项目: 19 | ``` 20 | npm run build 21 | ``` 22 | 23 | ## 教程原文 24 | 25 | 📚📚 本项目有详细的讲解教程,原文请关注我的微信公众号【卧梅又闻花】📚📚 26 | 27 | 初版教程(原理讲解看这个教程): 28 | 29 | [《干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React》](https://mp.weixin.qq.com/s/cdQQrK-xG00MmxPawUzeew) 30 | 31 | 2025年春季翻新版教程(原理不变,仅更新了React和Vue代码): 32 | 33 | [《2025新春版:干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React》](https://mp.weixin.qq.com/s/1xy10ZFPtU0cyVQi-AmRbw) 34 | 35 | ## 教程目录 36 | 37 | ``` 38 | 1 翻牌的构建 39 | • 1.1 基本结构 40 | • 1.2 构建纸牌并用伪元素拆分上下两部分 41 | • 知识点1:伪元素的使用 42 | • 1.3 为纸牌添加文字 43 | • 知识点2:line-height: 0的妙用 44 | • 1.4 设置纸牌的层叠关系 45 | • 知识点3:transform-origin和perspective 46 | 2 翻牌动画的实现 47 | • 2.1 CSS3翻牌动画 48 | • 知识点4:backface-visibility 49 | • 2.2 JS实现翻牌交互 50 | 3 翻牌时钟的实现 51 | • 3.1 HTML构建 52 | • 3.2 构建Flipper类 53 | • 3.3 实现时钟业务逻辑 54 | • 知识点5:时间格式化函数的实现 55 | • 3.4 运行时钟 56 | 4 Vue & React封装 57 | • 项目Git源码 58 | ``` 59 | 60 | ![image](https://wx3.sinaimg.cn/large/475dd357ly1gbh774dw0dj210n0ku443.jpg) 61 | -------------------------------------------------------------------------------- /flipClock2025-vue-js/eslint.config.js: -------------------------------------------------------------------------------- 1 | import js from '@eslint/js' 2 | import pluginVue from 'eslint-plugin-vue' 3 | import skipFormatting from '@vue/eslint-config-prettier/skip-formatting' 4 | 5 | export default [ 6 | { 7 | name: 'app/files-to-lint', 8 | files: ['**/*.{js,mjs,jsx,vue}'], 9 | }, 10 | 11 | { 12 | name: 'app/files-to-ignore', 13 | ignores: ['**/dist/**', '**/dist-ssr/**', '**/coverage/**'], 14 | }, 15 | 16 | js.configs.recommended, 17 | ...pluginVue.configs['flat/essential'], 18 | skipFormatting, 19 | ] 20 | -------------------------------------------------------------------------------- /flipClock2025-vue-js/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | flipClock2025-vue-js 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /flipClock2025-vue-js/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "paths": { 4 | "@/*": ["./src/*"] 5 | } 6 | }, 7 | "exclude": ["node_modules", "dist"] 8 | } 9 | -------------------------------------------------------------------------------- /flipClock2025-vue-js/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "flipclock2025-vue-js", 3 | "version": "0.0.0", 4 | "private": true, 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "preview": "vite preview", 10 | "lint": "eslint . --fix", 11 | "format": "prettier --write src/" 12 | }, 13 | "dependencies": { 14 | "vue": "^3.5.13" 15 | }, 16 | "devDependencies": { 17 | "@eslint/js": "^9.21.0", 18 | "@vitejs/plugin-vue": "^5.2.1", 19 | "@vue/eslint-config-prettier": "^10.2.0", 20 | "eslint": "^9.21.0", 21 | "eslint-plugin-vue": "^9.32.0", 22 | "prettier": "^3.5.3", 23 | "vite": "^6.2.0", 24 | "vite-plugin-vue-devtools": "^7.7.2" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /flipClock2025-vue-js/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yuezi32/flipClock/7245cef4f4a72fb9e350e1b2b2b996f99a5949ee/flipClock2025-vue-js/public/favicon.ico -------------------------------------------------------------------------------- /flipClock2025-vue-js/src/App.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /flipClock2025-vue-js/src/components/FlipCard/FlipCard.vue: -------------------------------------------------------------------------------- 1 | 51 | 52 | 61 | 62 | 248 | -------------------------------------------------------------------------------- /flipClock2025-vue-js/src/components/FlipClock/FlipClock.vue: -------------------------------------------------------------------------------- 1 | 85 | 86 | 98 | 99 | 116 | -------------------------------------------------------------------------------- /flipClock2025-vue-js/src/main.js: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import App from './App.vue' 3 | 4 | createApp(App).mount('#app') 5 | -------------------------------------------------------------------------------- /flipClock2025-vue-js/vite.config.js: -------------------------------------------------------------------------------- 1 | import { fileURLToPath, URL } from 'node:url' 2 | 3 | import { defineConfig } from 'vite' 4 | import vue from '@vitejs/plugin-vue' 5 | import vueDevTools from 'vite-plugin-vue-devtools' 6 | 7 | // https://vite.dev/config/ 8 | export default defineConfig({ 9 | server: { host: '0.0.0.0' }, 10 | // 静态资源引用路径,默认为"/" 11 | base: './', 12 | plugins: [vue(), vueDevTools()], 13 | resolve: { 14 | alias: { 15 | '@': fileURLToPath(new URL('./src', import.meta.url)), 16 | }, 17 | }, 18 | }) 19 | -------------------------------------------------------------------------------- /flipClock2025-vue-ts/.editorconfig: -------------------------------------------------------------------------------- 1 | [*.{js,jsx,mjs,cjs,ts,tsx,mts,cts,vue}] 2 | charset = utf-8 3 | indent_size = 2 4 | indent_style = space 5 | insert_final_newline = true 6 | trim_trailing_whitespace = true 7 | 8 | end_of_line = lf 9 | max_line_length = 100 10 | -------------------------------------------------------------------------------- /flipClock2025-vue-ts/.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | -------------------------------------------------------------------------------- /flipClock2025-vue-ts/.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 | .DS_Store 12 | dist 13 | dist-ssr 14 | coverage 15 | *.local 16 | 17 | /cypress/videos/ 18 | /cypress/screenshots/ 19 | 20 | # Editor directories and files 21 | .vscode/* 22 | !.vscode/extensions.json 23 | .idea 24 | *.suo 25 | *.ntvs* 26 | *.njsproj 27 | *.sln 28 | *.sw? 29 | 30 | *.tsbuildinfo 31 | -------------------------------------------------------------------------------- /flipClock2025-vue-ts/.prettierrc.json: -------------------------------------------------------------------------------- 1 | 2 | { 3 | "$schema": "https://json.schemastore.org/prettierrc", 4 | "semi": false, 5 | "singleQuote": true, 6 | "printWidth": 100 7 | } 8 | -------------------------------------------------------------------------------- /flipClock2025-vue-ts/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "Vue.volar", 4 | "dbaeumer.vscode-eslint", 5 | "EditorConfig.EditorConfig", 6 | "esbenp.prettier-vscode" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /flipClock2025-vue-ts/README.md: -------------------------------------------------------------------------------- 1 | # 2025新春版:干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React) 2 | ## Vue3 Typescript版 3 | 4 | > 本项目提供的是组件源码,并不是npm依赖包。适合直接放到实际项目中使用,可根据实际项目需求自行修改。 5 | 6 | ## 使用方法 7 | 8 | 安装依赖包: 9 | ``` 10 | npm install 11 | ``` 12 | 13 | 运行项目: 14 | ``` 15 | npm run dev 16 | ``` 17 | 18 | build项目: 19 | ``` 20 | npm run build 21 | ``` 22 | 23 | ## 教程原文 24 | 25 | 📚📚 本项目有详细的讲解教程,原文请关注我的微信公众号【卧梅又闻花】📚📚 26 | 27 | 初版教程(原理讲解看这个教程): 28 | 29 | [《干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React》](https://mp.weixin.qq.com/s/cdQQrK-xG00MmxPawUzeew) 30 | 31 | 2025年春季翻新版教程(原理不变,仅更新了React和Vue代码): 32 | 33 | [《2025新春版:干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React》](https://mp.weixin.qq.com/s/1xy10ZFPtU0cyVQi-AmRbw) 34 | 35 | ## 教程目录 36 | 37 | ``` 38 | 1 翻牌的构建 39 | • 1.1 基本结构 40 | • 1.2 构建纸牌并用伪元素拆分上下两部分 41 | • 知识点1:伪元素的使用 42 | • 1.3 为纸牌添加文字 43 | • 知识点2:line-height: 0的妙用 44 | • 1.4 设置纸牌的层叠关系 45 | • 知识点3:transform-origin和perspective 46 | 2 翻牌动画的实现 47 | • 2.1 CSS3翻牌动画 48 | • 知识点4:backface-visibility 49 | • 2.2 JS实现翻牌交互 50 | 3 翻牌时钟的实现 51 | • 3.1 HTML构建 52 | • 3.2 构建Flipper类 53 | • 3.3 实现时钟业务逻辑 54 | • 知识点5:时间格式化函数的实现 55 | • 3.4 运行时钟 56 | 4 Vue & React封装 57 | • 项目Git源码 58 | ``` 59 | 60 | ![image](https://wx3.sinaimg.cn/large/475dd357ly1gbh774dw0dj210n0ku443.jpg) 61 | -------------------------------------------------------------------------------- /flipClock2025-vue-ts/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /flipClock2025-vue-ts/eslint.config.ts: -------------------------------------------------------------------------------- 1 | import pluginVue from 'eslint-plugin-vue' 2 | import { defineConfigWithVueTs, vueTsConfigs } from '@vue/eslint-config-typescript' 3 | import skipFormatting from '@vue/eslint-config-prettier/skip-formatting' 4 | 5 | // To allow more languages other than `ts` in `.vue` files, uncomment the following lines: 6 | // import { configureVueProject } from '@vue/eslint-config-typescript' 7 | // configureVueProject({ scriptLangs: ['ts', 'tsx'] }) 8 | // More info at https://github.com/vuejs/eslint-config-typescript/#advanced-setup 9 | 10 | export default defineConfigWithVueTs( 11 | { 12 | name: 'app/files-to-lint', 13 | files: ['**/*.{ts,mts,tsx,vue}'], 14 | }, 15 | 16 | { 17 | name: 'app/files-to-ignore', 18 | ignores: ['**/dist/**', '**/dist-ssr/**', '**/coverage/**'], 19 | }, 20 | 21 | pluginVue.configs['flat/essential'], 22 | vueTsConfigs.recommended, 23 | skipFormatting, 24 | ) 25 | -------------------------------------------------------------------------------- /flipClock2025-vue-ts/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | flipClock2025-vue-ts 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /flipClock2025-vue-ts/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "flipclock2025-vue-ts", 3 | "version": "0.0.0", 4 | "private": true, 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "run-p type-check \"build-only {@}\" --", 9 | "preview": "vite preview", 10 | "build-only": "vite build", 11 | "type-check": "vue-tsc --build", 12 | "lint": "eslint . --fix", 13 | "format": "prettier --write src/" 14 | }, 15 | "dependencies": { 16 | "vue": "^3.5.13" 17 | }, 18 | "devDependencies": { 19 | "@tsconfig/node22": "^22.0.0", 20 | "@types/node": "^22.13.8", 21 | "@vitejs/plugin-vue": "^5.2.1", 22 | "@vue/eslint-config-prettier": "^10.2.0", 23 | "@vue/eslint-config-typescript": "^14.4.0", 24 | "@vue/tsconfig": "^0.7.0", 25 | "eslint": "^9.21.0", 26 | "eslint-plugin-vue": "^9.32.0", 27 | "jiti": "^2.4.2", 28 | "npm-run-all2": "^7.0.2", 29 | "prettier": "^3.5.3", 30 | "typescript": "~5.8.2", 31 | "vite": "^6.2.0", 32 | "vite-plugin-vue-devtools": "^7.7.2", 33 | "vue-tsc": "^2.2.8" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /flipClock2025-vue-ts/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yuezi32/flipClock/7245cef4f4a72fb9e350e1b2b2b996f99a5949ee/flipClock2025-vue-ts/public/favicon.ico -------------------------------------------------------------------------------- /flipClock2025-vue-ts/src/App.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /flipClock2025-vue-ts/src/components/FlipCard/FlipCard.vue: -------------------------------------------------------------------------------- 1 | 56 | 57 | 66 | 67 | 253 | -------------------------------------------------------------------------------- /flipClock2025-vue-ts/src/components/FlipCard/interfaces.ts: -------------------------------------------------------------------------------- 1 | export interface FlipCardHandleInterface { 2 | flipDown: (newFrontText: string | number, newBackText: string | number) => void 3 | flipUp: (newFrontText: string | number, newBackText: string | number) => void 4 | } 5 | -------------------------------------------------------------------------------- /flipClock2025-vue-ts/src/components/FlipClock/FlipClock.vue: -------------------------------------------------------------------------------- 1 | 86 | 87 | 99 | 100 | 117 | -------------------------------------------------------------------------------- /flipClock2025-vue-ts/src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import App from './App.vue' 3 | 4 | createApp(App).mount('#app') 5 | -------------------------------------------------------------------------------- /flipClock2025-vue-ts/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@vue/tsconfig/tsconfig.dom.json", 3 | "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], 4 | "exclude": ["src/**/__tests__/*"], 5 | "compilerOptions": { 6 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", 7 | 8 | "paths": { 9 | "@/*": ["./src/*"] 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /flipClock2025-vue-ts/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { 5 | "path": "./tsconfig.node.json" 6 | }, 7 | { 8 | "path": "./tsconfig.app.json" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /flipClock2025-vue-ts/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@tsconfig/node22/tsconfig.json", 3 | "include": [ 4 | "vite.config.*", 5 | "vitest.config.*", 6 | "cypress.config.*", 7 | "nightwatch.conf.*", 8 | "playwright.config.*", 9 | "eslint.config.*" 10 | ], 11 | "compilerOptions": { 12 | "noEmit": true, 13 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 14 | 15 | "module": "ESNext", 16 | "moduleResolution": "Bundler", 17 | "types": ["node"] 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /flipClock2025-vue-ts/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { fileURLToPath, URL } from 'node:url' 2 | 3 | import { defineConfig } from 'vite' 4 | import vue from '@vitejs/plugin-vue' 5 | import vueDevTools from 'vite-plugin-vue-devtools' 6 | 7 | // https://vite.dev/config/ 8 | export default defineConfig({ 9 | server: { host: '0.0.0.0' }, 10 | // 静态资源引用路径,默认为"/" 11 | base: './', 12 | plugins: [ 13 | vue(), 14 | vueDevTools(), 15 | ], 16 | resolve: { 17 | alias: { 18 | '@': fileURLToPath(new URL('./src', import.meta.url)) 19 | }, 20 | }, 21 | }) 22 | -------------------------------------------------------------------------------- /javascript/flipper.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Flipper 7 | 8 | 9 | 10 |
11 |
12 |
13 |
14 |
15 |
16 | 17 | 18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | : 30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 | : 39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 | 49 | 276 | 485 | 486 | --------------------------------------------------------------------------------