├── .github ├── FUNDING.yml └── workflows │ ├── main.yml │ └── npm-release.yml ├── .gitignore ├── .npmignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── app ├── index.html └── src │ ├── App.tsx │ ├── assets │ ├── analysis-300px.png │ ├── analysis.png │ ├── favicon.svg │ ├── index.css │ └── screenshot.png │ ├── components │ ├── Categories.tsx │ ├── Category.tsx │ ├── Colors.tsx │ ├── Header.tsx │ └── OverviewStats.tsx │ ├── main.tsx │ ├── pages │ └── index.tsx │ ├── utils │ └── fetcher.ts │ └── vite-env.d.ts ├── index.js ├── package.json ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── src ├── analyzer.ts ├── helpers │ ├── camelToTitleCase.ts │ ├── categories.ts │ ├── readModule.ts │ └── server.ts ├── index.ts ├── parse │ └── index.ts └── types │ ├── classnameInfo.ts │ └── metrics.ts ├── test └── index.test.ts ├── tsconfig.json └── vite.config.mts /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [apvarun] 2 | custom: ['https://www.buymeacoffee.com/apvarun'] -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | on: [push] 3 | jobs: 4 | build: 5 | name: Build, lint, and test on Node ${{ matrix.node }} and ${{ matrix.os }} 6 | 7 | runs-on: ${{ matrix.os }} 8 | strategy: 9 | matrix: 10 | node: ['22.x'] 11 | os: [windows-latest, macOS-latest] 12 | 13 | steps: 14 | - name: Checkout repo 15 | uses: actions/checkout@v2 16 | 17 | - name: Use Node ${{ matrix.node }} 18 | uses: actions/setup-node@v1 19 | with: 20 | node-version: ${{ matrix.node }} 21 | 22 | - uses: pnpm/action-setup@v2 23 | name: Install pnpm 24 | with: 25 | version: 10 26 | run_install: false 27 | 28 | - name: Install dependencies 29 | run: pnpm install 30 | 31 | # - name: Lint 32 | # run: pnpm lint 33 | 34 | # - name: Test 35 | # run: pnpm test --ci --coverage --maxWorkers=2 36 | 37 | - name: Build 38 | run: pnpm run build 39 | -------------------------------------------------------------------------------- /.github/workflows/npm-release.yml: -------------------------------------------------------------------------------- 1 | name: Node.js Package 2 | on: 3 | push: 4 | branches: 5 | - main 6 | jobs: 7 | build: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v2 11 | # Setup .npmrc file to publish to npm 12 | - uses: actions/setup-node@v2 13 | with: 14 | node-version: '22.x' 15 | registry-url: 'https://registry.npmjs.org' 16 | # Defaults to the user or organization that owns the workflow file 17 | scope: '' 18 | 19 | - uses: pnpm/action-setup@v2 20 | name: Install pnpm 21 | with: 22 | version: 10 23 | run_install: false 24 | 25 | - name: Install dependencies 26 | run: pnpm install 27 | 28 | - run: npm publish 29 | env: 30 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 31 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.log 2 | .DS_Store 3 | node_modules 4 | dist 5 | dist-ssr 6 | *.local 7 | *.tgz 8 | tailwind-output.css 9 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .github 2 | *.log 3 | .DS_Store 4 | node_modules 5 | dist-ssr 6 | *.local 7 | tailwind-output.css 8 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 | 8 | ## [0.4.0] - 2023-10-26 9 | 10 | - Polish UI 11 | - Responsive output page 12 | - Fixes #6 13 | 14 | ## [0.3.2] - 2023-10-25 15 | 16 | - Use `cross-spawn` for cross platform compatibility 17 | 18 | ## [0.3.1] - 2023-10-24 19 | 20 | - Update `purge` path to `content` key in tailwind config check 21 | 22 | ## [0.3.0] - 2023-10-17 23 | 24 | - Support Tailwind v3 25 | - Add colors preview in UI 26 | - Update dependencies 27 | 28 | ## [0.2.1] - 2021-07-17 29 | 30 | - Fix packaging for npx 31 | 32 | ## [0.2.0] - 2021-07-12 33 | 34 | - Fix the tailwindcss version dependency 35 | - Update dependencies 36 | 37 | ## [0.1.0] - 2021-07-11 38 | 39 | Initial Release with ability to analyse the TailwindCSS project and show stats. 40 | 41 | [0.2.0]: https://github.com/apvarun/tailwindcss-analysis/compare/v0.1.0...v0.2.0 42 | [0.1.0]: https://github.com/apvarun/tailwindcss-analysis/compare/1107327025a962308d7dd223521e00a07314016c...v0.1.0 43 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Varun A P 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TailwindCSS Analysis 2 | 3 | ![GitHub](https://img.shields.io/github/license/apvarun/tailwindcss-analysis) 4 | ![npm](https://img.shields.io/npm/v/tailwindcss-analysis) 5 | 6 | Analyse the TailwindCSS classes used in your application 7 | 8 | ![TailwindCSS Analysis](https://github.com/apvarun/tailwindcss-analysis/raw/main/app/src/assets/analysis-300px.png) 9 | 10 | Here's why: 11 | 12 | - Get overall view of the styles used in your project. Helps to monitor if any styles are prohibited in your organization. (One might not prefer CSS grid if the application needs to support IE browser) 13 | - View the overview of colors and fonts used in the application. Useful for verification by the design team 14 | 15 | ## Usage 16 | 17 | Navigate to the project that uses the TailwindCSS and run the command to generate the analysis report. 18 | 19 | ``` 20 | npx tailwindcss-analysis 21 | ``` 22 | 23 | ## Screenshots 24 | 25 | ![TailwindCSS Analysis Report](https://github.com/apvarun/tailwindcss-analysis/raw/main/app/src/assets/screenshot.png) 26 | 27 | [View Live Report](https://tailwindcss-analysis.netlify.app/) 28 | 29 | ## Roadmap 30 | 31 | - [ ] Display file size (minified and gzipped) 32 | - [ ] Cleanup CSS output after execution 33 | - [-] Show human-readable values for colors and fonts 34 | 35 | See the [open issues](https://github.com/apvarun/tailwindcss-analysis/issues) for a list of proposed features (and known issues). 36 | 37 | ## Contributing 38 | 39 | Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. 40 | 41 | ## Authors 42 | 43 | - [@apvarun](https://twitter.com/apvarun) 44 | 45 | See also the list of [contributors](https://github.com/apvarun/tailwindcss-analysis/contributors) who participated in this project. 46 | 47 | 48 | ## Acknowledgments 49 | 50 | This project is inspired by [windicss-analysis](https://github.com/windicss/windicss-analysis). 51 | 52 | ## 🤝 Support 53 | 54 | Contributions, issues, and feature requests are welcome! 55 | 56 | Give a ⭐️ if you like this project! 57 | 58 | Buy Me A Coffee 59 | 60 | ## License 61 | 62 | [MIT](LICENSE) 63 | -------------------------------------------------------------------------------- /app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | TailwindCSS Analysis 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/App.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Home from './pages'; 3 | 4 | function App() { 5 | return ; 6 | } 7 | 8 | export default App; 9 | -------------------------------------------------------------------------------- /app/src/assets/analysis-300px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apvarun/tailwindcss-analysis/82b3f1dad83e1cd507484c9b8d367c55f65f93a1/app/src/assets/analysis-300px.png -------------------------------------------------------------------------------- /app/src/assets/analysis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apvarun/tailwindcss-analysis/82b3f1dad83e1cd507484c9b8d367c55f65f93a1/app/src/assets/analysis.png -------------------------------------------------------------------------------- /app/src/assets/favicon.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 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 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /app/src/assets/index.css: -------------------------------------------------------------------------------- 1 | @import 'tailwindcss'; 2 | -------------------------------------------------------------------------------- /app/src/assets/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apvarun/tailwindcss-analysis/82b3f1dad83e1cd507484c9b8d367c55f65f93a1/app/src/assets/screenshot.png -------------------------------------------------------------------------------- /app/src/components/Categories.tsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect } from 'react'; 2 | import { useState } from 'react'; 3 | import ClassnameInfo from '../../../src/types/classnameInfo'; 4 | import Category from './Category'; 5 | 6 | export default function Categories({ data }: { data: ClassnameInfo[] }) { 7 | const [groups, setGroups] = useState>({}); 8 | 9 | useEffect(() => { 10 | let newGroups: Record = {}; 11 | 12 | data.forEach((item) => { 13 | if (item.category === 'Unknown' || item.category === 'Variable') { 14 | return; 15 | } 16 | 17 | if (newGroups[item.category]) { 18 | if ( 19 | !newGroups[item.category].find((exItem) => exItem.name === item.name) 20 | ) { 21 | newGroups[item.category].push(item); 22 | } 23 | } else { 24 | newGroups[item.category] = [item]; 25 | } 26 | }); 27 | 28 | setGroups(newGroups); 29 | }, [data]); 30 | 31 | return ( 32 |
33 |

34 | Class names based on categories 35 |

36 |
37 | {Object.entries(groups).map(([groupName, items]) => ( 38 | 39 | ))} 40 |
41 |
42 | ); 43 | } 44 | -------------------------------------------------------------------------------- /app/src/components/Category.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ClassnameInfo from '../../../src/types/classnameInfo'; 3 | 4 | export default function Category({ 5 | name, 6 | items, 7 | }: { 8 | name: string; 9 | items: ClassnameInfo[]; 10 | }) { 11 | return ( 12 |
13 |

14 | {name} 15 |

16 |
17 | {items.map((item) => ( 18 | 22 | {item.name.replaceAll('\\', '')} 23 | 24 | ))} 25 |
26 |
27 | ); 28 | } 29 | -------------------------------------------------------------------------------- /app/src/components/Colors.tsx: -------------------------------------------------------------------------------- 1 | import React, { useMemo } from 'react' 2 | import ClassnameInfo from '../../../src/types/classnameInfo' 3 | 4 | export const Colors = ({ data }: { data: ClassnameInfo[] }) => { 5 | 6 | const colors = useMemo(() => { 7 | const textAndBg = data.filter(item => item.category === 'Text' || item.category === 'Background') 8 | const allTags = textAndBg.map(item => item.name); 9 | 10 | const colorTags = allTags.filter(tag => { 11 | const hexCodeRegex = /(?:$|^|)#?([0-9a-f]{6}|[0-9a-f]{3})(?:$|^|)/gi 12 | const colorRegex = /(?:$|^|)(red-|blue-|indigo-|cool-gray-|pink-|yellow-|teal-|gray-|orange-|green-|purple-)(50|100|200|300|400|500|600|700|800|900)(?:$|^|)/gi 13 | if (tag.includes('[')) { 14 | return hexCodeRegex.test(tag); 15 | } 16 | return colorRegex.test(tag) 17 | }) 18 | 19 | return colorTags 20 | }, data); 21 | 22 | return ( 23 |
24 |

25 | Colors 26 |

27 |
28 | {colors.map(color =>
29 |
 
30 |

{color.replaceAll('\\', '')}

31 |
)} 32 |
33 |
34 | ) 35 | } 36 | -------------------------------------------------------------------------------- /app/src/components/Header.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import logo from '../assets/analysis-300px.png'; 3 | 4 | export default function Header() { 5 | return ( 6 |
7 | 11 |
12 | 13 |

14 | TailwindCSS Analysis 15 |

16 |
17 |
18 | 23 | GitHub 24 | 25 |
26 | ); 27 | } 28 | -------------------------------------------------------------------------------- /app/src/components/OverviewStats.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Metrics } from '../../../src/types/metrics'; 3 | 4 | const keyNames: { [key: string]: string } = { 5 | colors: 'Colors', 6 | mediaQueries: 'Media Queries', 7 | selectors: 'Selectors', 8 | selectorsByAttribute: 'Selectors By Attribute', 9 | selectorsByClass: 'Selectors By Class', 10 | selectorsById: 'Selectors By Id', 11 | selectorsByPseudo: 'Selectors By Pseudo Class', 12 | selectorsByTag: 'Selectors By Tag', 13 | rules: 'Total CSS Rules', 14 | declarations: 'Total Properties Declared', 15 | }; 16 | 17 | export default function OverviewStats({ data }: { data: Metrics }) { 18 | const secondaryStats: Array = [ 19 | 'selectorsByAttribute', 20 | 'selectorsByClass', 21 | 'selectorsById', 22 | 'selectorsByPseudo', 23 | 'selectorsByTag', 24 | ]; 25 | 26 | const tertiaryStats: Array = ['rules', 'declarations']; 27 | 28 | return ( 29 |
30 |

Overall Stats

31 | 32 |
33 |
34 |
35 |
{data.colors}
36 |
{keyNames.colors}
37 |
38 |
39 |
40 |
41 |
{data.mediaQueries}
42 |
{keyNames.mediaQueries}
43 |
44 |
45 |
46 |
47 |
{data.selectors}
48 |
{keyNames.selectors}
49 |
50 |
51 |
52 | 53 |
54 | {secondaryStats.map((stat) => ( 55 |
59 |
60 | {keyNames[stat]} 61 |
62 |
{data[stat]}
63 |
64 | ))} 65 |
66 | 67 |
68 | {tertiaryStats.map((stat) => ( 69 |
70 |
{keyNames[stat]}
71 |
{data[stat]}
72 |
73 | ))} 74 |
75 |
76 | ); 77 | } 78 | -------------------------------------------------------------------------------- /app/src/main.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { createRoot } from 'react-dom/client'; 3 | import App from './App'; 4 | 5 | import './assets/index.css'; 6 | 7 | const root = createRoot(document.getElementById('root')!); 8 | 9 | root.render( 10 | 11 | 12 | 13 | ); 14 | -------------------------------------------------------------------------------- /app/src/pages/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | // import useSWR from 'swr'; 3 | import Categories from '../components/Categories'; 4 | import Header from '../components/Header'; 5 | import OverviewStats from '../components/OverviewStats'; 6 | import { Colors } from '../components/Colors'; 7 | // import { fetcher } from '../utils/fetcher'; 8 | 9 | export default function Home() { 10 | // const { data, error } = useSWR('/api/stats', fetcher); 11 | const data = { 12 | metrics: { 13 | colors: 8, 14 | mediaQueries: 7, 15 | selectors: 203, 16 | selectorsByAttribute: 1, 17 | selectorsByClass: 113, 18 | selectorsById: 0, 19 | selectorsByPseudo: 14, 20 | selectorsByTag: 69, 21 | rules: 148, 22 | declarations: 274, 23 | }, 24 | categories: [ 25 | { name: '*', category: 'Unknown' }, 26 | { prefixes: [''], name: 'after', category: 'Unknown' }, 27 | { prefixes: [''], name: 'before', category: 'Unknown' }, 28 | { prefixes: [''], name: 'after', category: 'Unknown' }, 29 | { prefixes: [''], name: 'before', category: 'Unknown' }, 30 | { name: 'html', category: 'Unknown' }, 31 | { name: 'body', category: 'Unknown' }, 32 | { name: 'hr', category: 'Unknown' }, 33 | { prefixes: ['abbr'], name: 'where([title])', category: 'Variable' }, 34 | { name: 'h1', category: 'Unknown' }, 35 | { name: 'h2', category: 'Unknown' }, 36 | { name: 'h3', category: 'Unknown' }, 37 | { name: 'h4', category: 'Unknown' }, 38 | { name: 'h5', category: 'Unknown' }, 39 | { name: 'h6', category: 'Unknown' }, 40 | { name: 'a', category: 'Unknown' }, 41 | { name: 'b', category: 'Unknown' }, 42 | { name: 'strong', category: 'Unknown' }, 43 | { name: 'code', category: 'Unknown' }, 44 | { name: 'kbd', category: 'Unknown' }, 45 | { name: 'pre', category: 'Unknown' }, 46 | { name: 'samp', category: 'Unknown' }, 47 | { name: 'small', category: 'Unknown' }, 48 | { name: 'sub', category: 'Unknown' }, 49 | { name: 'sup', category: 'Unknown' }, 50 | { name: 'sub', category: 'Unknown' }, 51 | { name: 'sup', category: 'Unknown' }, 52 | { name: 'table', category: 'Display' }, 53 | { name: 'button', category: 'Unknown' }, 54 | { name: 'input', category: 'Unknown' }, 55 | { name: 'optgroup', category: 'Unknown' }, 56 | { name: 'select', category: 'Unknown' }, 57 | { name: 'textarea', category: 'Unknown' }, 58 | { name: 'button', category: 'Unknown' }, 59 | { name: 'select', category: 'Unknown' }, 60 | { name: '[type=button]', category: 'Variable' }, 61 | { name: '[type=reset]', category: 'Variable' }, 62 | { name: '[type=submit]', category: 'Variable' }, 63 | { name: 'button', category: 'Unknown' }, 64 | { prefixes: [''], name: '-moz-focusring', category: 'Unknown' }, 65 | { prefixes: [''], name: '-moz-ui-invalid', category: 'Unknown' }, 66 | { name: 'progress', category: 'Unknown' }, 67 | { 68 | prefixes: ['', ''], 69 | name: '-webkit-inner-spin-button', 70 | category: 'Unknown', 71 | }, 72 | { 73 | prefixes: ['', ''], 74 | name: '-webkit-outer-spin-button', 75 | category: 'Unknown', 76 | }, 77 | { name: '[type=search]', category: 'Variable' }, 78 | { 79 | prefixes: ['', ''], 80 | name: '-webkit-search-decoration', 81 | category: 'Unknown', 82 | }, 83 | { 84 | prefixes: ['', ''], 85 | name: '-webkit-file-upload-button', 86 | category: 'Unknown', 87 | }, 88 | { name: 'summary', category: 'Unknown' }, 89 | { name: 'blockquote', category: 'Unknown' }, 90 | { name: 'dd', category: 'Unknown' }, 91 | { name: 'dl', category: 'Unknown' }, 92 | { name: 'figure', category: 'Unknown' }, 93 | { name: 'h1', category: 'Unknown' }, 94 | { name: 'h2', category: 'Unknown' }, 95 | { name: 'h3', category: 'Unknown' }, 96 | { name: 'h4', category: 'Unknown' }, 97 | { name: 'h5', category: 'Unknown' }, 98 | { name: 'h6', category: 'Unknown' }, 99 | { name: 'hr', category: 'Unknown' }, 100 | { name: 'p', category: 'Unknown' }, 101 | { name: 'pre', category: 'Unknown' }, 102 | { name: 'fieldset', category: 'Unknown' }, 103 | { name: 'fieldset', category: 'Unknown' }, 104 | { name: 'legend', category: 'Unknown' }, 105 | { name: 'menu', category: 'Unknown' }, 106 | { name: 'ol', category: 'Unknown' }, 107 | { name: 'ul', category: 'Unknown' }, 108 | { name: 'dialog', category: 'Unknown' }, 109 | { name: 'textarea', category: 'Unknown' }, 110 | { 111 | prefixes: ['input', ''], 112 | name: '-moz-placeholder', 113 | category: 'Unknown', 114 | }, 115 | { 116 | prefixes: ['textarea', ''], 117 | name: '-moz-placeholder', 118 | category: 'Unknown', 119 | }, 120 | { prefixes: ['input', ''], name: 'placeholder', category: 'Unknown' }, 121 | { prefixes: ['textarea', ''], name: 'placeholder', category: 'Unknown' }, 122 | { name: '[role=button]', category: 'Variable' }, 123 | { name: 'button', category: 'Unknown' }, 124 | { prefixes: [''], name: 'disabled', category: 'Unknown' }, 125 | { name: 'audio', category: 'Unknown' }, 126 | { name: 'canvas', category: 'Unknown' }, 127 | { name: 'embed', category: 'Unknown' }, 128 | { name: 'iframe', category: 'Unknown' }, 129 | { name: 'img', category: 'Unknown' }, 130 | { name: 'object', category: 'Unknown' }, 131 | { name: 'svg', category: 'Unknown' }, 132 | { name: 'video', category: 'Unknown' }, 133 | { name: 'img', category: 'Unknown' }, 134 | { name: 'video', category: 'Unknown' }, 135 | { name: '[hidden]', category: 'Variable' }, 136 | { name: '*', category: 'Unknown' }, 137 | { prefixes: ['', ''], name: 'backdrop', category: 'Unknown' }, 138 | { prefixes: [''], name: 'after', category: 'Unknown' }, 139 | { prefixes: [''], name: 'before', category: 'Unknown' }, 140 | { name: 'container', category: 'Unknown' }, 141 | { category: '@media', name: '@media (min-width:640px)' }, 142 | { category: '@media', name: '@media (min-width:768px)' }, 143 | { category: '@media', name: '@media (min-width:1024px)' }, 144 | { category: '@media', name: '@media (min-width:1280px)' }, 145 | { category: '@media', name: '@media (min-width:1536px)' }, 146 | { name: 'mx-auto', category: 'Margin' }, 147 | { name: 'my-2', category: 'Margin' }, 148 | { name: 'my-8', category: 'Margin' }, 149 | { name: 'mb-2', category: 'Margin' }, 150 | { name: 'mb-4', category: 'Margin' }, 151 | { name: 'mb-8', category: 'Margin' }, 152 | { name: 'mr-2', category: 'Margin' }, 153 | { name: 'block', category: 'Display' }, 154 | { name: 'flex', category: 'Display' }, 155 | { name: 'inline-flex', category: 'Display' }, 156 | { name: 'table', category: 'Display' }, 157 | { name: 'grid', category: 'Display' }, 158 | { name: 'hidden', category: 'Display' }, 159 | { name: 'h-12', category: 'Size' }, 160 | { name: 'h-16', category: 'Size' }, 161 | { name: 'w-12', category: 'Size' }, 162 | { name: 'w-16', category: 'Size' }, 163 | { name: 'w-auto', category: 'Size' }, 164 | { name: '-skew-x-12', category: 'Transform' }, 165 | { name: '-skew-x-12', category: 'Transform' }, 166 | { name: 'skew-x-12', category: 'Transform' }, 167 | { name: 'skew-x-12', category: 'Transform' }, 168 | { name: 'transform', category: 'Transform' }, 169 | { name: 'cursor-default', category: 'Cursor' }, 170 | { name: 'cursor-pointer', category: 'Cursor' }, 171 | { name: 'grid-cols-3', category: 'Grid' }, 172 | { name: 'grid-cols-5', category: 'Grid' }, 173 | { name: 'flex-col', category: 'Flex' }, 174 | { name: 'flex-wrap', category: 'Flex' }, 175 | { name: 'items-end', category: 'Align Items' }, 176 | { name: 'items-center', category: 'Align Items' }, 177 | { name: 'justify-start', category: 'Justify Content' }, 178 | { name: 'justify-between', category: 'Justify Content' }, 179 | { name: 'gap-10', category: 'Gap' }, 180 | { name: 'gap-2', category: 'Gap' }, 181 | { name: 'gap-4', category: 'Gap' }, 182 | { name: 'gap-5', category: 'Gap' }, 183 | { name: 'rounded', category: 'Unknown' }, 184 | { name: 'rounded-full', category: 'Border Radius' }, 185 | { name: 'rounded-lg', category: 'Border Radius' }, 186 | { name: 'rounded-md', category: 'Border Radius' }, 187 | { name: 'border', category: 'Unknown' }, 188 | { name: 'border-r-2', category: 'Border' }, 189 | { name: 'border-gray-600', category: 'Border' }, 190 | { name: 'bg-black\\/60', category: 'Background' }, 191 | { name: 'bg-gray-100', category: 'Background' }, 192 | { name: 'bg-gray-600', category: 'Background' }, 193 | { name: 'bg-white', category: 'Background' }, 194 | { name: 'p-2', category: 'Padding' }, 195 | { name: 'p-4', category: 'Padding' }, 196 | { name: 'p-5', category: 'Padding' }, 197 | { name: 'px-16', category: 'Padding' }, 198 | { name: 'px-2', category: 'Padding' }, 199 | { name: 'px-2\\.5', category: 'Padding' }, 200 | { name: 'px-6', category: 'Padding' }, 201 | { name: 'px-8', category: 'Padding' }, 202 | { name: 'py-0', category: 'Padding' }, 203 | { name: 'py-0\\.5', category: 'Padding' }, 204 | { name: 'py-2', category: 'Padding' }, 205 | { name: 'py-4', category: 'Padding' }, 206 | { name: 'pb-2', category: 'Padding' }, 207 | { name: 'pr-2', category: 'Padding' }, 208 | { name: 'pt-4', category: 'Padding' }, 209 | { name: 'text-2xl', category: 'Text' }, 210 | { name: 'text-6xl', category: 'Text' }, 211 | { name: 'text-base', category: 'Text' }, 212 | { name: 'text-lg', category: 'Text' }, 213 | { name: 'text-lg', category: 'Text' }, 214 | { name: 'text-xl', category: 'Text' }, 215 | { name: 'text-xl', category: 'Text' }, 216 | { name: 'font-bold', category: 'Font' }, 217 | { name: 'font-extralight', category: 'Font' }, 218 | { name: 'font-medium', category: 'Font' }, 219 | { name: 'font-semibold', category: 'Font' }, 220 | { name: 'leading-none', category: 'Line Height' }, 221 | { name: 'tracking-tight', category: 'Letter Spacing' }, 222 | { name: 'text-\\[\\#ff0000\\]', category: 'Text' }, 223 | { name: 'text-gray-400', category: 'Text' }, 224 | { name: 'text-green-500', category: 'Text' }, 225 | { name: 'text-white', category: 'Text' }, 226 | { name: 'shadow', category: 'Unknown' }, 227 | { name: 'shadow', category: 'Unknown' }, 228 | { name: 'shadow-sm', category: 'Box Shadow' }, 229 | { name: 'shadow-sm', category: 'Box Shadow' }, 230 | { name: 'outline-none', category: 'Outline' }, 231 | { name: 'ring', category: 'Unknown' }, 232 | { name: 'ring', category: 'Unknown' }, 233 | { name: 'ring-2', category: 'Ring' }, 234 | { name: 'ring-2', category: 'Ring' }, 235 | { name: 'ring-offset-2', category: 'Ring' }, 236 | { name: 'ring-offset-current', category: 'Ring' }, 237 | { name: 'filter', category: 'Unknown' }, 238 | { name: 'transition', category: 'Unknown' }, 239 | { name: 'transition-colors', category: 'Animation' }, 240 | { name: 'transition-shadow', category: 'Animation' }, 241 | { name: 'duration-500', category: 'Animation' }, 242 | { name: 'ease-in-out', category: 'Animation' }, 243 | { 244 | prefixes: ['hover\\', 'shadow-md'], 245 | name: 'hover', 246 | category: 'Unknown', 247 | }, 248 | { 249 | prefixes: ['focus\\', 'outline-none'], 250 | name: 'focus', 251 | category: 'Unknown', 252 | }, 253 | { prefixes: ['focus\\', 'ring-2'], name: 'focus', category: 'Unknown' }, 254 | { 255 | prefixes: ['group', 'hover .group-hover\\'], 256 | name: 'bg-black\\/80', 257 | category: 'Background', 258 | }, 259 | ], 260 | }; 261 | const error = false; 262 | 263 | return ( 264 |
265 |
266 |
267 | {error && ( 268 |

Error Loading data. Try again.

269 | )} 270 | {!data &&

Loading data. Please wait.

} 271 | {!error && data && ( 272 | <> 273 | 274 | 275 | 276 | 277 | )} 278 |
279 |
280 | ); 281 | } 282 | -------------------------------------------------------------------------------- /app/src/utils/fetcher.ts: -------------------------------------------------------------------------------- 1 | export const fetcher = (url: string) => fetch(url).then(res => res.json()); 2 | -------------------------------------------------------------------------------- /app/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | 'use strict'; 4 | 5 | require('./dist/index') -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tailwindcss-analysis", 3 | "version": "0.4.0", 4 | "description": "Analyse the TailwindCSS classes used in your application", 5 | "license": "MIT", 6 | "main": "dist/index.js", 7 | "typings": "dist/index.d.ts", 8 | "type": "commonjs", 9 | "files": [ 10 | "dist", 11 | "app/dist/**/*" 12 | ], 13 | "engines": { 14 | "node": ">=16" 15 | }, 16 | "bin": { 17 | "tailwindcss-analysis": "index.js" 18 | }, 19 | "scripts": { 20 | "start": "tsup src/index.ts --watch", 21 | "build": "tsup src/index.ts --minify terser --format esm,cjs --dts", 22 | "prepare": "pnpm run build && pnpm run build:app", 23 | "size": "size-limit", 24 | "analyze": "size-limit --why", 25 | "dev:app": "vite", 26 | "build:app": "tsc && vite build", 27 | "serve:app": "vite preview" 28 | }, 29 | "husky": { 30 | "hooks": { 31 | "pre-commit": "" 32 | } 33 | }, 34 | "prettier": { 35 | "printWidth": 80, 36 | "semi": true, 37 | "singleQuote": true, 38 | "trailingComma": "es5" 39 | }, 40 | "keywords": [ 41 | "analysis", 42 | "tailwindcss" 43 | ], 44 | "author": "Varun A P", 45 | "module": "dist/index.mjs", 46 | "size-limit": [ 47 | { 48 | "path": "dist/index.js", 49 | "limit": "10 KB" 50 | }, 51 | { 52 | "path": "dist/index.mjs", 53 | "limit": "10 KB" 54 | } 55 | ], 56 | "devDependencies": { 57 | "@size-limit/file": "^11.2.0", 58 | "@tailwindcss/vite": "^4.1.7", 59 | "@types/connect": "^3.4.38", 60 | "@types/cross-spawn": "^6.0.6", 61 | "@types/fs-extra": "^11.0.4", 62 | "@types/react": "^19.1.6", 63 | "@types/react-dom": "^19.1.5", 64 | "@vitejs/plugin-react": "^4.5.0", 65 | "autoprefixer": "^10.4.21", 66 | "husky": "^9.1.7", 67 | "postcss": "^8.5.3", 68 | "size-limit": "^11.2.0", 69 | "size-limit-node-esbuild": "^0.4.0", 70 | "terser": "^5.40.0", 71 | "tslib": "^2.8.1", 72 | "tsup": "^8.5.0", 73 | "typescript": "^5.8.3", 74 | "vite": "^6.3.5" 75 | }, 76 | "dependencies": { 77 | "analyze-css": "^2.4.5", 78 | "cac": "^6.7.14", 79 | "connect": "^3.7.0", 80 | "cross-spawn": "^7.0.6", 81 | "cssjson": "^2.1.3", 82 | "fs-extra": "^11.3.0", 83 | "get-port": "^7.1.0", 84 | "open": "^10.1.2", 85 | "react": "^19.1.0", 86 | "react-dom": "^19.1.0", 87 | "sirv": "^3.0.1", 88 | "swr": "^2.3.3", 89 | "tailwindcss": "^4.1.7", 90 | "tmp": "^0.2.3" 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | analyze-css: 12 | specifier: ^2.4.5 13 | version: 2.4.5 14 | cac: 15 | specifier: ^6.7.14 16 | version: 6.7.14 17 | connect: 18 | specifier: ^3.7.0 19 | version: 3.7.0 20 | cross-spawn: 21 | specifier: ^7.0.6 22 | version: 7.0.6 23 | cssjson: 24 | specifier: ^2.1.3 25 | version: 2.1.3 26 | fs-extra: 27 | specifier: ^11.3.0 28 | version: 11.3.0 29 | get-port: 30 | specifier: ^7.1.0 31 | version: 7.1.0 32 | open: 33 | specifier: ^10.1.2 34 | version: 10.1.2 35 | react: 36 | specifier: ^19.1.0 37 | version: 19.1.0 38 | react-dom: 39 | specifier: ^19.1.0 40 | version: 19.1.0(react@19.1.0) 41 | sirv: 42 | specifier: ^3.0.1 43 | version: 3.0.1 44 | swr: 45 | specifier: ^2.3.3 46 | version: 2.3.3(react@19.1.0) 47 | tailwindcss: 48 | specifier: ^4.1.7 49 | version: 4.1.7 50 | tmp: 51 | specifier: ^0.2.3 52 | version: 0.2.3 53 | devDependencies: 54 | '@size-limit/file': 55 | specifier: ^11.2.0 56 | version: 11.2.0(size-limit@11.2.0) 57 | '@tailwindcss/vite': 58 | specifier: ^4.1.7 59 | version: 4.1.7(vite@6.3.5(@types/node@22.15.23)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.0)(terser@5.40.0)) 60 | '@types/connect': 61 | specifier: ^3.4.38 62 | version: 3.4.38 63 | '@types/cross-spawn': 64 | specifier: ^6.0.6 65 | version: 6.0.6 66 | '@types/fs-extra': 67 | specifier: ^11.0.4 68 | version: 11.0.4 69 | '@types/react': 70 | specifier: ^19.1.6 71 | version: 19.1.6 72 | '@types/react-dom': 73 | specifier: ^19.1.5 74 | version: 19.1.5(@types/react@19.1.6) 75 | '@vitejs/plugin-react': 76 | specifier: ^4.5.0 77 | version: 4.5.0(vite@6.3.5(@types/node@22.15.23)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.0)(terser@5.40.0)) 78 | autoprefixer: 79 | specifier: ^10.4.21 80 | version: 10.4.21(postcss@8.5.3) 81 | husky: 82 | specifier: ^9.1.7 83 | version: 9.1.7 84 | postcss: 85 | specifier: ^8.5.3 86 | version: 8.5.3 87 | size-limit: 88 | specifier: ^11.2.0 89 | version: 11.2.0 90 | size-limit-node-esbuild: 91 | specifier: ^0.4.0 92 | version: 0.4.0 93 | terser: 94 | specifier: ^5.40.0 95 | version: 5.40.0 96 | tslib: 97 | specifier: ^2.8.1 98 | version: 2.8.1 99 | tsup: 100 | specifier: ^8.5.0 101 | version: 8.5.0(jiti@2.4.2)(postcss@8.5.3)(typescript@5.8.3) 102 | typescript: 103 | specifier: ^5.8.3 104 | version: 5.8.3 105 | vite: 106 | specifier: ^6.3.5 107 | version: 6.3.5(@types/node@22.15.23)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.0)(terser@5.40.0) 108 | 109 | packages: 110 | 111 | '@adobe/css-tools@4.4.3': 112 | resolution: {integrity: sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==} 113 | 114 | '@ampproject/remapping@2.3.0': 115 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 116 | engines: {node: '>=6.0.0'} 117 | 118 | '@babel/code-frame@7.27.1': 119 | resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} 120 | engines: {node: '>=6.9.0'} 121 | 122 | '@babel/compat-data@7.27.3': 123 | resolution: {integrity: sha512-V42wFfx1ymFte+ecf6iXghnnP8kWTO+ZLXIyZq+1LAXHHvTZdVxicn4yiVYdYMGaCO3tmqub11AorKkv+iodqw==} 124 | engines: {node: '>=6.9.0'} 125 | 126 | '@babel/core@7.27.3': 127 | resolution: {integrity: sha512-hyrN8ivxfvJ4i0fIJuV4EOlV0WDMz5Ui4StRTgVaAvWeiRCilXgwVvxJKtFQ3TKtHgJscB2YiXKGNJuVwhQMtA==} 128 | engines: {node: '>=6.9.0'} 129 | 130 | '@babel/generator@7.27.3': 131 | resolution: {integrity: sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q==} 132 | engines: {node: '>=6.9.0'} 133 | 134 | '@babel/helper-compilation-targets@7.27.2': 135 | resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} 136 | engines: {node: '>=6.9.0'} 137 | 138 | '@babel/helper-module-imports@7.27.1': 139 | resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} 140 | engines: {node: '>=6.9.0'} 141 | 142 | '@babel/helper-module-transforms@7.27.3': 143 | resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} 144 | engines: {node: '>=6.9.0'} 145 | peerDependencies: 146 | '@babel/core': ^7.0.0 147 | 148 | '@babel/helper-plugin-utils@7.27.1': 149 | resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} 150 | engines: {node: '>=6.9.0'} 151 | 152 | '@babel/helper-string-parser@7.27.1': 153 | resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 154 | engines: {node: '>=6.9.0'} 155 | 156 | '@babel/helper-validator-identifier@7.27.1': 157 | resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 158 | engines: {node: '>=6.9.0'} 159 | 160 | '@babel/helper-validator-option@7.27.1': 161 | resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} 162 | engines: {node: '>=6.9.0'} 163 | 164 | '@babel/helpers@7.27.3': 165 | resolution: {integrity: sha512-h/eKy9agOya1IGuLaZ9tEUgz+uIRXcbtOhRtUyyMf8JFmn1iT13vnl/IGVWSkdOCG/pC57U4S1jnAabAavTMwg==} 166 | engines: {node: '>=6.9.0'} 167 | 168 | '@babel/parser@7.27.3': 169 | resolution: {integrity: sha512-xyYxRj6+tLNDTWi0KCBcZ9V7yg3/lwL9DWh9Uwh/RIVlIfFidggcgxKX3GCXwCiswwcGRawBKbEg2LG/Y8eJhw==} 170 | engines: {node: '>=6.0.0'} 171 | hasBin: true 172 | 173 | '@babel/plugin-transform-react-jsx-self@7.27.1': 174 | resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} 175 | engines: {node: '>=6.9.0'} 176 | peerDependencies: 177 | '@babel/core': ^7.0.0-0 178 | 179 | '@babel/plugin-transform-react-jsx-source@7.27.1': 180 | resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} 181 | engines: {node: '>=6.9.0'} 182 | peerDependencies: 183 | '@babel/core': ^7.0.0-0 184 | 185 | '@babel/template@7.27.2': 186 | resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} 187 | engines: {node: '>=6.9.0'} 188 | 189 | '@babel/traverse@7.27.3': 190 | resolution: {integrity: sha512-lId/IfN/Ye1CIu8xG7oKBHXd2iNb2aW1ilPszzGcJug6M8RCKfVNcYhpI5+bMvFYjK7lXIM0R+a+6r8xhHp2FQ==} 191 | engines: {node: '>=6.9.0'} 192 | 193 | '@babel/types@7.27.3': 194 | resolution: {integrity: sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==} 195 | engines: {node: '>=6.9.0'} 196 | 197 | '@esbuild/aix-ppc64@0.25.5': 198 | resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} 199 | engines: {node: '>=18'} 200 | cpu: [ppc64] 201 | os: [aix] 202 | 203 | '@esbuild/android-arm64@0.25.5': 204 | resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} 205 | engines: {node: '>=18'} 206 | cpu: [arm64] 207 | os: [android] 208 | 209 | '@esbuild/android-arm@0.25.5': 210 | resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} 211 | engines: {node: '>=18'} 212 | cpu: [arm] 213 | os: [android] 214 | 215 | '@esbuild/android-x64@0.25.5': 216 | resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} 217 | engines: {node: '>=18'} 218 | cpu: [x64] 219 | os: [android] 220 | 221 | '@esbuild/darwin-arm64@0.25.5': 222 | resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} 223 | engines: {node: '>=18'} 224 | cpu: [arm64] 225 | os: [darwin] 226 | 227 | '@esbuild/darwin-x64@0.25.5': 228 | resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} 229 | engines: {node: '>=18'} 230 | cpu: [x64] 231 | os: [darwin] 232 | 233 | '@esbuild/freebsd-arm64@0.25.5': 234 | resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} 235 | engines: {node: '>=18'} 236 | cpu: [arm64] 237 | os: [freebsd] 238 | 239 | '@esbuild/freebsd-x64@0.25.5': 240 | resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} 241 | engines: {node: '>=18'} 242 | cpu: [x64] 243 | os: [freebsd] 244 | 245 | '@esbuild/linux-arm64@0.25.5': 246 | resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} 247 | engines: {node: '>=18'} 248 | cpu: [arm64] 249 | os: [linux] 250 | 251 | '@esbuild/linux-arm@0.25.5': 252 | resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} 253 | engines: {node: '>=18'} 254 | cpu: [arm] 255 | os: [linux] 256 | 257 | '@esbuild/linux-ia32@0.25.5': 258 | resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} 259 | engines: {node: '>=18'} 260 | cpu: [ia32] 261 | os: [linux] 262 | 263 | '@esbuild/linux-loong64@0.25.5': 264 | resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} 265 | engines: {node: '>=18'} 266 | cpu: [loong64] 267 | os: [linux] 268 | 269 | '@esbuild/linux-mips64el@0.25.5': 270 | resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} 271 | engines: {node: '>=18'} 272 | cpu: [mips64el] 273 | os: [linux] 274 | 275 | '@esbuild/linux-ppc64@0.25.5': 276 | resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} 277 | engines: {node: '>=18'} 278 | cpu: [ppc64] 279 | os: [linux] 280 | 281 | '@esbuild/linux-riscv64@0.25.5': 282 | resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} 283 | engines: {node: '>=18'} 284 | cpu: [riscv64] 285 | os: [linux] 286 | 287 | '@esbuild/linux-s390x@0.25.5': 288 | resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} 289 | engines: {node: '>=18'} 290 | cpu: [s390x] 291 | os: [linux] 292 | 293 | '@esbuild/linux-x64@0.25.5': 294 | resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} 295 | engines: {node: '>=18'} 296 | cpu: [x64] 297 | os: [linux] 298 | 299 | '@esbuild/netbsd-arm64@0.25.5': 300 | resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} 301 | engines: {node: '>=18'} 302 | cpu: [arm64] 303 | os: [netbsd] 304 | 305 | '@esbuild/netbsd-x64@0.25.5': 306 | resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} 307 | engines: {node: '>=18'} 308 | cpu: [x64] 309 | os: [netbsd] 310 | 311 | '@esbuild/openbsd-arm64@0.25.5': 312 | resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} 313 | engines: {node: '>=18'} 314 | cpu: [arm64] 315 | os: [openbsd] 316 | 317 | '@esbuild/openbsd-x64@0.25.5': 318 | resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} 319 | engines: {node: '>=18'} 320 | cpu: [x64] 321 | os: [openbsd] 322 | 323 | '@esbuild/sunos-x64@0.25.5': 324 | resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} 325 | engines: {node: '>=18'} 326 | cpu: [x64] 327 | os: [sunos] 328 | 329 | '@esbuild/win32-arm64@0.25.5': 330 | resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} 331 | engines: {node: '>=18'} 332 | cpu: [arm64] 333 | os: [win32] 334 | 335 | '@esbuild/win32-ia32@0.25.5': 336 | resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} 337 | engines: {node: '>=18'} 338 | cpu: [ia32] 339 | os: [win32] 340 | 341 | '@esbuild/win32-x64@0.25.5': 342 | resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} 343 | engines: {node: '>=18'} 344 | cpu: [x64] 345 | os: [win32] 346 | 347 | '@isaacs/cliui@8.0.2': 348 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 349 | engines: {node: '>=12'} 350 | 351 | '@isaacs/fs-minipass@4.0.1': 352 | resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} 353 | engines: {node: '>=18.0.0'} 354 | 355 | '@jridgewell/gen-mapping@0.3.8': 356 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 357 | engines: {node: '>=6.0.0'} 358 | 359 | '@jridgewell/resolve-uri@3.1.2': 360 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 361 | engines: {node: '>=6.0.0'} 362 | 363 | '@jridgewell/set-array@1.2.1': 364 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 365 | engines: {node: '>=6.0.0'} 366 | 367 | '@jridgewell/source-map@0.3.6': 368 | resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} 369 | 370 | '@jridgewell/sourcemap-codec@1.5.0': 371 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 372 | 373 | '@jridgewell/trace-mapping@0.3.25': 374 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 375 | 376 | '@parcel/watcher-android-arm64@2.5.1': 377 | resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} 378 | engines: {node: '>= 10.0.0'} 379 | cpu: [arm64] 380 | os: [android] 381 | 382 | '@parcel/watcher-darwin-arm64@2.5.1': 383 | resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} 384 | engines: {node: '>= 10.0.0'} 385 | cpu: [arm64] 386 | os: [darwin] 387 | 388 | '@parcel/watcher-darwin-x64@2.5.1': 389 | resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} 390 | engines: {node: '>= 10.0.0'} 391 | cpu: [x64] 392 | os: [darwin] 393 | 394 | '@parcel/watcher-freebsd-x64@2.5.1': 395 | resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} 396 | engines: {node: '>= 10.0.0'} 397 | cpu: [x64] 398 | os: [freebsd] 399 | 400 | '@parcel/watcher-linux-arm-glibc@2.5.1': 401 | resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} 402 | engines: {node: '>= 10.0.0'} 403 | cpu: [arm] 404 | os: [linux] 405 | 406 | '@parcel/watcher-linux-arm-musl@2.5.1': 407 | resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} 408 | engines: {node: '>= 10.0.0'} 409 | cpu: [arm] 410 | os: [linux] 411 | 412 | '@parcel/watcher-linux-arm64-glibc@2.5.1': 413 | resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} 414 | engines: {node: '>= 10.0.0'} 415 | cpu: [arm64] 416 | os: [linux] 417 | 418 | '@parcel/watcher-linux-arm64-musl@2.5.1': 419 | resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} 420 | engines: {node: '>= 10.0.0'} 421 | cpu: [arm64] 422 | os: [linux] 423 | 424 | '@parcel/watcher-linux-x64-glibc@2.5.1': 425 | resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} 426 | engines: {node: '>= 10.0.0'} 427 | cpu: [x64] 428 | os: [linux] 429 | 430 | '@parcel/watcher-linux-x64-musl@2.5.1': 431 | resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} 432 | engines: {node: '>= 10.0.0'} 433 | cpu: [x64] 434 | os: [linux] 435 | 436 | '@parcel/watcher-win32-arm64@2.5.1': 437 | resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} 438 | engines: {node: '>= 10.0.0'} 439 | cpu: [arm64] 440 | os: [win32] 441 | 442 | '@parcel/watcher-win32-ia32@2.5.1': 443 | resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} 444 | engines: {node: '>= 10.0.0'} 445 | cpu: [ia32] 446 | os: [win32] 447 | 448 | '@parcel/watcher-win32-x64@2.5.1': 449 | resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} 450 | engines: {node: '>= 10.0.0'} 451 | cpu: [x64] 452 | os: [win32] 453 | 454 | '@parcel/watcher@2.5.1': 455 | resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} 456 | engines: {node: '>= 10.0.0'} 457 | 458 | '@pkgjs/parseargs@0.11.0': 459 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 460 | engines: {node: '>=14'} 461 | 462 | '@polka/url@1.0.0-next.29': 463 | resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} 464 | 465 | '@rolldown/pluginutils@1.0.0-beta.9': 466 | resolution: {integrity: sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==} 467 | 468 | '@rollup/rollup-android-arm-eabi@4.41.1': 469 | resolution: {integrity: sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==} 470 | cpu: [arm] 471 | os: [android] 472 | 473 | '@rollup/rollup-android-arm64@4.41.1': 474 | resolution: {integrity: sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==} 475 | cpu: [arm64] 476 | os: [android] 477 | 478 | '@rollup/rollup-darwin-arm64@4.41.1': 479 | resolution: {integrity: sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==} 480 | cpu: [arm64] 481 | os: [darwin] 482 | 483 | '@rollup/rollup-darwin-x64@4.41.1': 484 | resolution: {integrity: sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==} 485 | cpu: [x64] 486 | os: [darwin] 487 | 488 | '@rollup/rollup-freebsd-arm64@4.41.1': 489 | resolution: {integrity: sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==} 490 | cpu: [arm64] 491 | os: [freebsd] 492 | 493 | '@rollup/rollup-freebsd-x64@4.41.1': 494 | resolution: {integrity: sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==} 495 | cpu: [x64] 496 | os: [freebsd] 497 | 498 | '@rollup/rollup-linux-arm-gnueabihf@4.41.1': 499 | resolution: {integrity: sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==} 500 | cpu: [arm] 501 | os: [linux] 502 | 503 | '@rollup/rollup-linux-arm-musleabihf@4.41.1': 504 | resolution: {integrity: sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==} 505 | cpu: [arm] 506 | os: [linux] 507 | 508 | '@rollup/rollup-linux-arm64-gnu@4.41.1': 509 | resolution: {integrity: sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==} 510 | cpu: [arm64] 511 | os: [linux] 512 | 513 | '@rollup/rollup-linux-arm64-musl@4.41.1': 514 | resolution: {integrity: sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==} 515 | cpu: [arm64] 516 | os: [linux] 517 | 518 | '@rollup/rollup-linux-loongarch64-gnu@4.41.1': 519 | resolution: {integrity: sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==} 520 | cpu: [loong64] 521 | os: [linux] 522 | 523 | '@rollup/rollup-linux-powerpc64le-gnu@4.41.1': 524 | resolution: {integrity: sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==} 525 | cpu: [ppc64] 526 | os: [linux] 527 | 528 | '@rollup/rollup-linux-riscv64-gnu@4.41.1': 529 | resolution: {integrity: sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==} 530 | cpu: [riscv64] 531 | os: [linux] 532 | 533 | '@rollup/rollup-linux-riscv64-musl@4.41.1': 534 | resolution: {integrity: sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==} 535 | cpu: [riscv64] 536 | os: [linux] 537 | 538 | '@rollup/rollup-linux-s390x-gnu@4.41.1': 539 | resolution: {integrity: sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==} 540 | cpu: [s390x] 541 | os: [linux] 542 | 543 | '@rollup/rollup-linux-x64-gnu@4.41.1': 544 | resolution: {integrity: sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==} 545 | cpu: [x64] 546 | os: [linux] 547 | 548 | '@rollup/rollup-linux-x64-musl@4.41.1': 549 | resolution: {integrity: sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==} 550 | cpu: [x64] 551 | os: [linux] 552 | 553 | '@rollup/rollup-win32-arm64-msvc@4.41.1': 554 | resolution: {integrity: sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==} 555 | cpu: [arm64] 556 | os: [win32] 557 | 558 | '@rollup/rollup-win32-ia32-msvc@4.41.1': 559 | resolution: {integrity: sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==} 560 | cpu: [ia32] 561 | os: [win32] 562 | 563 | '@rollup/rollup-win32-x64-msvc@4.41.1': 564 | resolution: {integrity: sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==} 565 | cpu: [x64] 566 | os: [win32] 567 | 568 | '@size-limit/file@11.2.0': 569 | resolution: {integrity: sha512-OZHE3putEkQ/fgzz3Tp/0hSmfVo3wyTpOJSRNm6AmcwX4Nm9YtTfbQQ/hZRwbBFR23S7x2Sd9EbqYzngKwbRoA==} 570 | engines: {node: ^18.0.0 || >=20.0.0} 571 | peerDependencies: 572 | size-limit: 11.2.0 573 | 574 | '@tailwindcss/node@4.1.7': 575 | resolution: {integrity: sha512-9rsOpdY9idRI2NH6CL4wORFY0+Q6fnx9XP9Ju+iq/0wJwGD5IByIgFmwVbyy4ymuyprj8Qh4ErxMKTUL4uNh3g==} 576 | 577 | '@tailwindcss/oxide-android-arm64@4.1.7': 578 | resolution: {integrity: sha512-IWA410JZ8fF7kACus6BrUwY2Z1t1hm0+ZWNEzykKmMNM09wQooOcN/VXr0p/WJdtHZ90PvJf2AIBS/Ceqx1emg==} 579 | engines: {node: '>= 10'} 580 | cpu: [arm64] 581 | os: [android] 582 | 583 | '@tailwindcss/oxide-darwin-arm64@4.1.7': 584 | resolution: {integrity: sha512-81jUw9To7fimGGkuJ2W5h3/oGonTOZKZ8C2ghm/TTxbwvfSiFSDPd6/A/KE2N7Jp4mv3Ps9OFqg2fEKgZFfsvg==} 585 | engines: {node: '>= 10'} 586 | cpu: [arm64] 587 | os: [darwin] 588 | 589 | '@tailwindcss/oxide-darwin-x64@4.1.7': 590 | resolution: {integrity: sha512-q77rWjEyGHV4PdDBtrzO0tgBBPlQWKY7wZK0cUok/HaGgbNKecegNxCGikuPJn5wFAlIywC3v+WMBt0PEBtwGw==} 591 | engines: {node: '>= 10'} 592 | cpu: [x64] 593 | os: [darwin] 594 | 595 | '@tailwindcss/oxide-freebsd-x64@4.1.7': 596 | resolution: {integrity: sha512-RfmdbbK6G6ptgF4qqbzoxmH+PKfP4KSVs7SRlTwcbRgBwezJkAO3Qta/7gDy10Q2DcUVkKxFLXUQO6J3CRvBGw==} 597 | engines: {node: '>= 10'} 598 | cpu: [x64] 599 | os: [freebsd] 600 | 601 | '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.7': 602 | resolution: {integrity: sha512-OZqsGvpwOa13lVd1z6JVwQXadEobmesxQ4AxhrwRiPuE04quvZHWn/LnihMg7/XkN+dTioXp/VMu/p6A5eZP3g==} 603 | engines: {node: '>= 10'} 604 | cpu: [arm] 605 | os: [linux] 606 | 607 | '@tailwindcss/oxide-linux-arm64-gnu@4.1.7': 608 | resolution: {integrity: sha512-voMvBTnJSfKecJxGkoeAyW/2XRToLZ227LxswLAwKY7YslG/Xkw9/tJNH+3IVh5bdYzYE7DfiaPbRkSHFxY1xA==} 609 | engines: {node: '>= 10'} 610 | cpu: [arm64] 611 | os: [linux] 612 | 613 | '@tailwindcss/oxide-linux-arm64-musl@4.1.7': 614 | resolution: {integrity: sha512-PjGuNNmJeKHnP58M7XyjJyla8LPo+RmwHQpBI+W/OxqrwojyuCQ+GUtygu7jUqTEexejZHr/z3nBc/gTiXBj4A==} 615 | engines: {node: '>= 10'} 616 | cpu: [arm64] 617 | os: [linux] 618 | 619 | '@tailwindcss/oxide-linux-x64-gnu@4.1.7': 620 | resolution: {integrity: sha512-HMs+Va+ZR3gC3mLZE00gXxtBo3JoSQxtu9lobbZd+DmfkIxR54NO7Z+UQNPsa0P/ITn1TevtFxXTpsRU7qEvWg==} 621 | engines: {node: '>= 10'} 622 | cpu: [x64] 623 | os: [linux] 624 | 625 | '@tailwindcss/oxide-linux-x64-musl@4.1.7': 626 | resolution: {integrity: sha512-MHZ6jyNlutdHH8rd+YTdr3QbXrHXqwIhHw9e7yXEBcQdluGwhpQY2Eku8UZK6ReLaWtQ4gijIv5QoM5eE+qlsA==} 627 | engines: {node: '>= 10'} 628 | cpu: [x64] 629 | os: [linux] 630 | 631 | '@tailwindcss/oxide-wasm32-wasi@4.1.7': 632 | resolution: {integrity: sha512-ANaSKt74ZRzE2TvJmUcbFQ8zS201cIPxUDm5qez5rLEwWkie2SkGtA4P+GPTj+u8N6JbPrC8MtY8RmJA35Oo+A==} 633 | engines: {node: '>=14.0.0'} 634 | cpu: [wasm32] 635 | bundledDependencies: 636 | - '@napi-rs/wasm-runtime' 637 | - '@emnapi/core' 638 | - '@emnapi/runtime' 639 | - '@tybys/wasm-util' 640 | - '@emnapi/wasi-threads' 641 | - tslib 642 | 643 | '@tailwindcss/oxide-win32-arm64-msvc@4.1.7': 644 | resolution: {integrity: sha512-HUiSiXQ9gLJBAPCMVRk2RT1ZrBjto7WvqsPBwUrNK2BcdSxMnk19h4pjZjI7zgPhDxlAbJSumTC4ljeA9y0tEw==} 645 | engines: {node: '>= 10'} 646 | cpu: [arm64] 647 | os: [win32] 648 | 649 | '@tailwindcss/oxide-win32-x64-msvc@4.1.7': 650 | resolution: {integrity: sha512-rYHGmvoHiLJ8hWucSfSOEmdCBIGZIq7SpkPRSqLsH2Ab2YUNgKeAPT1Fi2cx3+hnYOrAb0jp9cRyode3bBW4mQ==} 651 | engines: {node: '>= 10'} 652 | cpu: [x64] 653 | os: [win32] 654 | 655 | '@tailwindcss/oxide@4.1.7': 656 | resolution: {integrity: sha512-5SF95Ctm9DFiUyjUPnDGkoKItPX/k+xifcQhcqX5RA85m50jw1pT/KzjdvlqxRja45Y52nR4MR9fD1JYd7f8NQ==} 657 | engines: {node: '>= 10'} 658 | 659 | '@tailwindcss/vite@4.1.7': 660 | resolution: {integrity: sha512-tYa2fO3zDe41I7WqijyVbRd8oWT0aEID1Eokz5hMT6wShLIHj3yvwj9XbfuloHP9glZ6H+aG2AN/+ZrxJ1Y5RQ==} 661 | peerDependencies: 662 | vite: ^5.2.0 || ^6 663 | 664 | '@types/babel__core@7.20.5': 665 | resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 666 | 667 | '@types/babel__generator@7.27.0': 668 | resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} 669 | 670 | '@types/babel__template@7.4.4': 671 | resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 672 | 673 | '@types/babel__traverse@7.20.7': 674 | resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} 675 | 676 | '@types/connect@3.4.38': 677 | resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} 678 | 679 | '@types/cross-spawn@6.0.6': 680 | resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==} 681 | 682 | '@types/estree@1.0.7': 683 | resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} 684 | 685 | '@types/fs-extra@11.0.4': 686 | resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} 687 | 688 | '@types/jsonfile@6.1.4': 689 | resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} 690 | 691 | '@types/node@22.15.23': 692 | resolution: {integrity: sha512-7Ec1zaFPF4RJ0eXu1YT/xgiebqwqoJz8rYPDi/O2BcZ++Wpt0Kq9cl0eg6NN6bYbPnR67ZLo7St5Q3UK0SnARw==} 693 | 694 | '@types/react-dom@19.1.5': 695 | resolution: {integrity: sha512-CMCjrWucUBZvohgZxkjd6S9h0nZxXjzus6yDfUb+xLxYM7VvjKNH1tQrE9GWLql1XoOP4/Ds3bwFqShHUYraGg==} 696 | peerDependencies: 697 | '@types/react': ^19.0.0 698 | 699 | '@types/react@19.1.6': 700 | resolution: {integrity: sha512-JeG0rEWak0N6Itr6QUx+X60uQmN+5t3j9r/OVDtWzFXKaj6kD1BwJzOksD0FF6iWxZlbE1kB0q9vtnU2ekqa1Q==} 701 | 702 | '@vitejs/plugin-react@4.5.0': 703 | resolution: {integrity: sha512-JuLWaEqypaJmOJPLWwO335Ig6jSgC1FTONCWAxnqcQthLTK/Yc9aH6hr9z/87xciejbQcnP3GnA1FWUSWeXaeg==} 704 | engines: {node: ^14.18.0 || >=16.0.0} 705 | peerDependencies: 706 | vite: ^4.2.0 || ^5.0.0 || ^6.0.0 707 | 708 | acorn@8.14.1: 709 | resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} 710 | engines: {node: '>=0.4.0'} 711 | hasBin: true 712 | 713 | agent-base@7.1.3: 714 | resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} 715 | engines: {node: '>= 14'} 716 | 717 | analyze-css@2.4.5: 718 | resolution: {integrity: sha512-Y74rsPkzt6kaIjm78MpemEOs1EgXB3SU36nwZVUMdXGZsQwhaFgNsE1QHNr3nh1Nx9e8T2RSA/vr+vaQVJXgUg==} 719 | engines: {node: '>18'} 720 | hasBin: true 721 | 722 | ansi-regex@5.0.1: 723 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 724 | engines: {node: '>=8'} 725 | 726 | ansi-regex@6.1.0: 727 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 728 | engines: {node: '>=12'} 729 | 730 | ansi-styles@4.3.0: 731 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 732 | engines: {node: '>=8'} 733 | 734 | ansi-styles@6.2.1: 735 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 736 | engines: {node: '>=12'} 737 | 738 | any-promise@1.3.0: 739 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 740 | 741 | autoprefixer@10.4.21: 742 | resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} 743 | engines: {node: ^10 || ^12 || >=14} 744 | hasBin: true 745 | peerDependencies: 746 | postcss: ^8.1.0 747 | 748 | balanced-match@1.0.2: 749 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 750 | 751 | brace-expansion@1.1.11: 752 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 753 | 754 | brace-expansion@2.0.1: 755 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 756 | 757 | braces@3.0.3: 758 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 759 | engines: {node: '>=8'} 760 | 761 | browserslist@4.24.5: 762 | resolution: {integrity: sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==} 763 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 764 | hasBin: true 765 | 766 | buffer-from@1.1.2: 767 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 768 | 769 | bundle-name@4.1.0: 770 | resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} 771 | engines: {node: '>=18'} 772 | 773 | bundle-require@5.1.0: 774 | resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} 775 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 776 | peerDependencies: 777 | esbuild: '>=0.18' 778 | 779 | bytes-iec@3.1.1: 780 | resolution: {integrity: sha512-fey6+4jDK7TFtFg/klGSvNKJctyU7n2aQdnM+CO0ruLPbqqMOM8Tio0Pc+deqUeVKX1tL5DQep1zQ7+37aTAsA==} 781 | engines: {node: '>= 0.8'} 782 | 783 | cac@6.7.14: 784 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 785 | engines: {node: '>=8'} 786 | 787 | caniuse-lite@1.0.30001718: 788 | resolution: {integrity: sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==} 789 | 790 | chokidar@4.0.3: 791 | resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 792 | engines: {node: '>= 14.16.0'} 793 | 794 | chownr@3.0.0: 795 | resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} 796 | engines: {node: '>=18'} 797 | 798 | cli@1.0.1: 799 | resolution: {integrity: sha512-41U72MB56TfUMGndAKK8vJ78eooOD4Z5NOL4xEfjc0c23s+6EYKXlXsmACBVclLP1yOfWCgEganVzddVrSNoTg==} 800 | engines: {node: '>=0.2.5'} 801 | 802 | color-convert@2.0.1: 803 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 804 | engines: {node: '>=7.0.0'} 805 | 806 | color-name@1.1.4: 807 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 808 | 809 | commander@13.1.0: 810 | resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} 811 | engines: {node: '>=18'} 812 | 813 | commander@2.20.3: 814 | resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 815 | 816 | commander@4.1.1: 817 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 818 | engines: {node: '>= 6'} 819 | 820 | concat-map@0.0.1: 821 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 822 | 823 | confbox@0.1.8: 824 | resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} 825 | 826 | connect@3.7.0: 827 | resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} 828 | engines: {node: '>= 0.10.0'} 829 | 830 | consola@3.4.2: 831 | resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} 832 | engines: {node: ^14.18.0 || >=16.10.0} 833 | 834 | convert-source-map@2.0.0: 835 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 836 | 837 | cross-spawn@7.0.6: 838 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 839 | engines: {node: '>= 8'} 840 | 841 | css-shorthand-properties@1.1.2: 842 | resolution: {integrity: sha512-C2AugXIpRGQTxaCW0N7n5jD/p5irUmCrwl03TrnMFBHDbdq44CFWR2zO7rK9xPN4Eo3pUxC4vQzQgbIpzrD1PQ==} 843 | 844 | css-tree@2.3.1: 845 | resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} 846 | engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} 847 | 848 | css-what@6.1.0: 849 | resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} 850 | engines: {node: '>= 6'} 851 | 852 | cssjson@2.1.3: 853 | resolution: {integrity: sha512-VKzsSbYW4gwfS6Fg+z1mEII+cvurP/Vr7G3cDLEkvR0tcQD20LpF/ljOOFVVT9XYkOFo4TQWRcB/mSmbrKsXxA==} 854 | 855 | csstype@3.1.3: 856 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 857 | 858 | data-uri-to-buffer@4.0.1: 859 | resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} 860 | engines: {node: '>= 12'} 861 | 862 | debug@2.6.9: 863 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 864 | peerDependencies: 865 | supports-color: '*' 866 | peerDependenciesMeta: 867 | supports-color: 868 | optional: true 869 | 870 | debug@4.4.1: 871 | resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 872 | engines: {node: '>=6.0'} 873 | peerDependencies: 874 | supports-color: '*' 875 | peerDependenciesMeta: 876 | supports-color: 877 | optional: true 878 | 879 | default-browser-id@5.0.0: 880 | resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} 881 | engines: {node: '>=18'} 882 | 883 | default-browser@5.2.1: 884 | resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} 885 | engines: {node: '>=18'} 886 | 887 | define-lazy-prop@3.0.0: 888 | resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} 889 | engines: {node: '>=12'} 890 | 891 | dequal@2.0.3: 892 | resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 893 | engines: {node: '>=6'} 894 | 895 | detect-libc@1.0.3: 896 | resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} 897 | engines: {node: '>=0.10'} 898 | hasBin: true 899 | 900 | detect-libc@2.0.4: 901 | resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} 902 | engines: {node: '>=8'} 903 | 904 | eastasianwidth@0.2.0: 905 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 906 | 907 | ee-first@1.1.1: 908 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 909 | 910 | electron-to-chromium@1.5.159: 911 | resolution: {integrity: sha512-CEvHptWAMV5p6GJ0Lq8aheyvVbfzVrv5mmidu1D3pidoVNkB3tTBsTMVtPJ+rzRK5oV229mCLz9Zj/hNvU8GBA==} 912 | 913 | emoji-regex@8.0.0: 914 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 915 | 916 | emoji-regex@9.2.2: 917 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 918 | 919 | encodeurl@1.0.2: 920 | resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} 921 | engines: {node: '>= 0.8'} 922 | 923 | enhanced-resolve@5.18.1: 924 | resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} 925 | engines: {node: '>=10.13.0'} 926 | 927 | esbuild@0.25.5: 928 | resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} 929 | engines: {node: '>=18'} 930 | hasBin: true 931 | 932 | escalade@3.2.0: 933 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 934 | engines: {node: '>=6'} 935 | 936 | escape-html@1.0.3: 937 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 938 | 939 | exit@0.1.2: 940 | resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} 941 | engines: {node: '>= 0.8.0'} 942 | 943 | fast-stats@0.0.7: 944 | resolution: {integrity: sha512-AEMvohEfd/pkvRSlJOUh6JlWjlBaIHNuL9hFz0bT/glLHbooj2+fV71TrVB3VebfYg1GLI3PnIcWH+T6gNH8HA==} 945 | 946 | fdir@6.4.5: 947 | resolution: {integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==} 948 | peerDependencies: 949 | picomatch: ^3 || ^4 950 | peerDependenciesMeta: 951 | picomatch: 952 | optional: true 953 | 954 | fetch-blob@3.2.0: 955 | resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} 956 | engines: {node: ^12.20 || >= 14.13} 957 | 958 | fill-range@7.1.1: 959 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 960 | engines: {node: '>=8'} 961 | 962 | finalhandler@1.1.2: 963 | resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} 964 | engines: {node: '>= 0.8'} 965 | 966 | fix-dts-default-cjs-exports@1.0.1: 967 | resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} 968 | 969 | foreground-child@3.3.1: 970 | resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} 971 | engines: {node: '>=14'} 972 | 973 | formdata-polyfill@4.0.10: 974 | resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} 975 | engines: {node: '>=12.20.0'} 976 | 977 | fraction.js@4.3.7: 978 | resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} 979 | 980 | fs-extra@11.3.0: 981 | resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} 982 | engines: {node: '>=14.14'} 983 | 984 | fs.realpath@1.0.0: 985 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 986 | 987 | fsevents@2.3.3: 988 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 989 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 990 | os: [darwin] 991 | 992 | gensync@1.0.0-beta.2: 993 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 994 | engines: {node: '>=6.9.0'} 995 | 996 | get-port@7.1.0: 997 | resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} 998 | engines: {node: '>=16'} 999 | 1000 | glob@10.4.5: 1001 | resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} 1002 | hasBin: true 1003 | 1004 | glob@11.0.2: 1005 | resolution: {integrity: sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==} 1006 | engines: {node: 20 || >=22} 1007 | hasBin: true 1008 | 1009 | glob@7.2.3: 1010 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1011 | deprecated: Glob versions prior to v9 are no longer supported 1012 | 1013 | globals@11.12.0: 1014 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 1015 | engines: {node: '>=4'} 1016 | 1017 | graceful-fs@4.2.11: 1018 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1019 | 1020 | http-proxy-agent@7.0.2: 1021 | resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} 1022 | engines: {node: '>= 14'} 1023 | 1024 | husky@9.1.7: 1025 | resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} 1026 | engines: {node: '>=18'} 1027 | hasBin: true 1028 | 1029 | immutable@5.1.2: 1030 | resolution: {integrity: sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==} 1031 | 1032 | inflight@1.0.6: 1033 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1034 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 1035 | 1036 | inherits@2.0.4: 1037 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1038 | 1039 | is-docker@3.0.0: 1040 | resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} 1041 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1042 | hasBin: true 1043 | 1044 | is-extglob@2.1.1: 1045 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1046 | engines: {node: '>=0.10.0'} 1047 | 1048 | is-fullwidth-code-point@3.0.0: 1049 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1050 | engines: {node: '>=8'} 1051 | 1052 | is-glob@4.0.3: 1053 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1054 | engines: {node: '>=0.10.0'} 1055 | 1056 | is-inside-container@1.0.0: 1057 | resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} 1058 | engines: {node: '>=14.16'} 1059 | hasBin: true 1060 | 1061 | is-number@7.0.0: 1062 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1063 | engines: {node: '>=0.12.0'} 1064 | 1065 | is-wsl@3.1.0: 1066 | resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} 1067 | engines: {node: '>=16'} 1068 | 1069 | isexe@2.0.0: 1070 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1071 | 1072 | jackspeak@3.4.3: 1073 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 1074 | 1075 | jackspeak@4.1.1: 1076 | resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} 1077 | engines: {node: 20 || >=22} 1078 | 1079 | jiti@2.4.2: 1080 | resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} 1081 | hasBin: true 1082 | 1083 | joycon@3.1.1: 1084 | resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} 1085 | engines: {node: '>=10'} 1086 | 1087 | js-tokens@4.0.0: 1088 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1089 | 1090 | jsesc@3.1.0: 1091 | resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 1092 | engines: {node: '>=6'} 1093 | hasBin: true 1094 | 1095 | json5@2.2.3: 1096 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 1097 | engines: {node: '>=6'} 1098 | hasBin: true 1099 | 1100 | jsonfile@6.1.0: 1101 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} 1102 | 1103 | lightningcss-darwin-arm64@1.30.1: 1104 | resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} 1105 | engines: {node: '>= 12.0.0'} 1106 | cpu: [arm64] 1107 | os: [darwin] 1108 | 1109 | lightningcss-darwin-x64@1.30.1: 1110 | resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} 1111 | engines: {node: '>= 12.0.0'} 1112 | cpu: [x64] 1113 | os: [darwin] 1114 | 1115 | lightningcss-freebsd-x64@1.30.1: 1116 | resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} 1117 | engines: {node: '>= 12.0.0'} 1118 | cpu: [x64] 1119 | os: [freebsd] 1120 | 1121 | lightningcss-linux-arm-gnueabihf@1.30.1: 1122 | resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} 1123 | engines: {node: '>= 12.0.0'} 1124 | cpu: [arm] 1125 | os: [linux] 1126 | 1127 | lightningcss-linux-arm64-gnu@1.30.1: 1128 | resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} 1129 | engines: {node: '>= 12.0.0'} 1130 | cpu: [arm64] 1131 | os: [linux] 1132 | 1133 | lightningcss-linux-arm64-musl@1.30.1: 1134 | resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} 1135 | engines: {node: '>= 12.0.0'} 1136 | cpu: [arm64] 1137 | os: [linux] 1138 | 1139 | lightningcss-linux-x64-gnu@1.30.1: 1140 | resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} 1141 | engines: {node: '>= 12.0.0'} 1142 | cpu: [x64] 1143 | os: [linux] 1144 | 1145 | lightningcss-linux-x64-musl@1.30.1: 1146 | resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} 1147 | engines: {node: '>= 12.0.0'} 1148 | cpu: [x64] 1149 | os: [linux] 1150 | 1151 | lightningcss-win32-arm64-msvc@1.30.1: 1152 | resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} 1153 | engines: {node: '>= 12.0.0'} 1154 | cpu: [arm64] 1155 | os: [win32] 1156 | 1157 | lightningcss-win32-x64-msvc@1.30.1: 1158 | resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} 1159 | engines: {node: '>= 12.0.0'} 1160 | cpu: [x64] 1161 | os: [win32] 1162 | 1163 | lightningcss@1.30.1: 1164 | resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} 1165 | engines: {node: '>= 12.0.0'} 1166 | 1167 | lilconfig@3.1.3: 1168 | resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} 1169 | engines: {node: '>=14'} 1170 | 1171 | lines-and-columns@1.2.4: 1172 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1173 | 1174 | load-tsconfig@0.2.5: 1175 | resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} 1176 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1177 | 1178 | lodash.sortby@4.7.0: 1179 | resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} 1180 | 1181 | lru-cache@10.4.3: 1182 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 1183 | 1184 | lru-cache@11.1.0: 1185 | resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} 1186 | engines: {node: 20 || >=22} 1187 | 1188 | lru-cache@5.1.1: 1189 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 1190 | 1191 | magic-string@0.30.17: 1192 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 1193 | 1194 | mdn-data@2.0.30: 1195 | resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} 1196 | 1197 | micromatch@4.0.8: 1198 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1199 | engines: {node: '>=8.6'} 1200 | 1201 | minimatch@10.0.1: 1202 | resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} 1203 | engines: {node: 20 || >=22} 1204 | 1205 | minimatch@3.1.2: 1206 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1207 | 1208 | minimatch@9.0.5: 1209 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 1210 | engines: {node: '>=16 || 14 >=14.17'} 1211 | 1212 | minipass@7.1.2: 1213 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 1214 | engines: {node: '>=16 || 14 >=14.17'} 1215 | 1216 | minizlib@3.0.2: 1217 | resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} 1218 | engines: {node: '>= 18'} 1219 | 1220 | mkdirp@3.0.1: 1221 | resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} 1222 | engines: {node: '>=10'} 1223 | hasBin: true 1224 | 1225 | mlly@1.7.4: 1226 | resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} 1227 | 1228 | mrmime@2.0.1: 1229 | resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} 1230 | engines: {node: '>=10'} 1231 | 1232 | ms@2.0.0: 1233 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 1234 | 1235 | ms@2.1.3: 1236 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1237 | 1238 | mz@2.7.0: 1239 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 1240 | 1241 | nanoid@3.3.11: 1242 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 1243 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1244 | hasBin: true 1245 | 1246 | nanoid@5.1.5: 1247 | resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==} 1248 | engines: {node: ^18 || >=20} 1249 | hasBin: true 1250 | 1251 | nanospinner@1.2.2: 1252 | resolution: {integrity: sha512-Zt/AmG6qRU3e+WnzGGLuMCEAO/dAu45stNbHY223tUxldaDAeE+FxSPsd9Q+j+paejmm0ZbrNVs5Sraqy3dRxA==} 1253 | 1254 | node-addon-api@7.1.1: 1255 | resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} 1256 | 1257 | node-domexception@1.0.0: 1258 | resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} 1259 | engines: {node: '>=10.5.0'} 1260 | deprecated: Use your platform's native DOMException instead 1261 | 1262 | node-fetch@3.3.2: 1263 | resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} 1264 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1265 | 1266 | node-releases@2.0.19: 1267 | resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 1268 | 1269 | normalize-range@0.1.2: 1270 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} 1271 | engines: {node: '>=0.10.0'} 1272 | 1273 | object-assign@4.1.1: 1274 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1275 | engines: {node: '>=0.10.0'} 1276 | 1277 | on-finished@2.3.0: 1278 | resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} 1279 | engines: {node: '>= 0.8'} 1280 | 1281 | once@1.4.0: 1282 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1283 | 1284 | onecolor@4.1.0: 1285 | resolution: {integrity: sha512-kDUtnWdWlt5iWx85wrGZxMh8tB4058Bk1YyVpb+Zjl+2wLH/OvqIacbchJma0gjGXocwUTueLwMDVYKrbI+0zA==} 1286 | engines: {node: '>=0.4.8'} 1287 | 1288 | open@10.1.2: 1289 | resolution: {integrity: sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==} 1290 | engines: {node: '>=18'} 1291 | 1292 | package-json-from-dist@1.0.1: 1293 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 1294 | 1295 | parseurl@1.3.3: 1296 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 1297 | engines: {node: '>= 0.8'} 1298 | 1299 | path-is-absolute@1.0.1: 1300 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1301 | engines: {node: '>=0.10.0'} 1302 | 1303 | path-key@3.1.1: 1304 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1305 | engines: {node: '>=8'} 1306 | 1307 | path-scurry@1.11.1: 1308 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 1309 | engines: {node: '>=16 || 14 >=14.18'} 1310 | 1311 | path-scurry@2.0.0: 1312 | resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} 1313 | engines: {node: 20 || >=22} 1314 | 1315 | pathe@2.0.3: 1316 | resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 1317 | 1318 | picocolors@1.1.1: 1319 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1320 | 1321 | picomatch@2.3.1: 1322 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1323 | engines: {node: '>=8.6'} 1324 | 1325 | picomatch@4.0.2: 1326 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 1327 | engines: {node: '>=12'} 1328 | 1329 | pirates@4.0.7: 1330 | resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} 1331 | engines: {node: '>= 6'} 1332 | 1333 | pkg-types@1.3.1: 1334 | resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} 1335 | 1336 | postcss-load-config@6.0.1: 1337 | resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} 1338 | engines: {node: '>= 18'} 1339 | peerDependencies: 1340 | jiti: '>=1.21.0' 1341 | postcss: '>=8.0.9' 1342 | tsx: ^4.8.1 1343 | yaml: ^2.4.2 1344 | peerDependenciesMeta: 1345 | jiti: 1346 | optional: true 1347 | postcss: 1348 | optional: true 1349 | tsx: 1350 | optional: true 1351 | yaml: 1352 | optional: true 1353 | 1354 | postcss-value-parser@4.2.0: 1355 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 1356 | 1357 | postcss@8.5.3: 1358 | resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} 1359 | engines: {node: ^10 || ^12 || >=14} 1360 | 1361 | punycode@2.3.1: 1362 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1363 | engines: {node: '>=6'} 1364 | 1365 | react-dom@19.1.0: 1366 | resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} 1367 | peerDependencies: 1368 | react: ^19.1.0 1369 | 1370 | react-refresh@0.17.0: 1371 | resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} 1372 | engines: {node: '>=0.10.0'} 1373 | 1374 | react@19.1.0: 1375 | resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} 1376 | engines: {node: '>=0.10.0'} 1377 | 1378 | readdirp@4.1.2: 1379 | resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 1380 | engines: {node: '>= 14.18.0'} 1381 | 1382 | resolve-from@5.0.0: 1383 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1384 | engines: {node: '>=8'} 1385 | 1386 | rollup@4.41.1: 1387 | resolution: {integrity: sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==} 1388 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1389 | hasBin: true 1390 | 1391 | run-applescript@7.0.0: 1392 | resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} 1393 | engines: {node: '>=18'} 1394 | 1395 | sass@1.89.0: 1396 | resolution: {integrity: sha512-ld+kQU8YTdGNjOLfRWBzewJpU5cwEv/h5yyqlSeJcj6Yh8U4TDA9UA5FPicqDz/xgRPWRSYIQNiFks21TbA9KQ==} 1397 | engines: {node: '>=14.0.0'} 1398 | hasBin: true 1399 | 1400 | scheduler@0.26.0: 1401 | resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} 1402 | 1403 | semver@6.3.1: 1404 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1405 | hasBin: true 1406 | 1407 | shebang-command@2.0.0: 1408 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1409 | engines: {node: '>=8'} 1410 | 1411 | shebang-regex@3.0.0: 1412 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1413 | engines: {node: '>=8'} 1414 | 1415 | signal-exit@4.1.0: 1416 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1417 | engines: {node: '>=14'} 1418 | 1419 | sirv@3.0.1: 1420 | resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} 1421 | engines: {node: '>=18'} 1422 | 1423 | size-limit-node-esbuild@0.4.0: 1424 | resolution: {integrity: sha512-s48KM50Qgdx/C9UwZgBjo0eMnqdHNKDFDr7uqH0SA1y76testX2CxlM5r3JwaT4NcgcpwZ3KJOUEPDN/a3QvPg==} 1425 | engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} 1426 | 1427 | size-limit@11.2.0: 1428 | resolution: {integrity: sha512-2kpQq2DD/pRpx3Tal/qRW1SYwcIeQ0iq8li5CJHQgOC+FtPn2BVmuDtzUCgNnpCrbgtfEHqh+iWzxK+Tq6C+RQ==} 1429 | engines: {node: ^18.0.0 || >=20.0.0} 1430 | hasBin: true 1431 | 1432 | source-map-js@1.2.1: 1433 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1434 | engines: {node: '>=0.10.0'} 1435 | 1436 | source-map-support@0.5.21: 1437 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 1438 | 1439 | source-map@0.6.1: 1440 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1441 | engines: {node: '>=0.10.0'} 1442 | 1443 | source-map@0.8.0-beta.0: 1444 | resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} 1445 | engines: {node: '>= 8'} 1446 | 1447 | specificity@1.0.0: 1448 | resolution: {integrity: sha512-nCtHb5/MTfZ1D36EpLLz03AcUf1v+PxWFFieW4O721MaJUo/anSMckB94Ylj5VQPrjdlx+4BXcKD+s1N0yT+ww==} 1449 | 1450 | statuses@1.5.0: 1451 | resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} 1452 | engines: {node: '>= 0.6'} 1453 | 1454 | string-width@4.2.3: 1455 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1456 | engines: {node: '>=8'} 1457 | 1458 | string-width@5.1.2: 1459 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1460 | engines: {node: '>=12'} 1461 | 1462 | strip-ansi@6.0.1: 1463 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1464 | engines: {node: '>=8'} 1465 | 1466 | strip-ansi@7.1.0: 1467 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1468 | engines: {node: '>=12'} 1469 | 1470 | sucrase@3.35.0: 1471 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 1472 | engines: {node: '>=16 || 14 >=14.17'} 1473 | hasBin: true 1474 | 1475 | swr@2.3.3: 1476 | resolution: {integrity: sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==} 1477 | peerDependencies: 1478 | react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 1479 | 1480 | tailwindcss@4.1.7: 1481 | resolution: {integrity: sha512-kr1o/ErIdNhTz8uzAYL7TpaUuzKIE6QPQ4qmSdxnoX/lo+5wmUHQA6h3L5yIqEImSRnAAURDirLu/BgiXGPAhg==} 1482 | 1483 | tapable@2.2.2: 1484 | resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} 1485 | engines: {node: '>=6'} 1486 | 1487 | tar@7.4.3: 1488 | resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} 1489 | engines: {node: '>=18'} 1490 | 1491 | terser@5.40.0: 1492 | resolution: {integrity: sha512-cfeKl/jjwSR5ar7d0FGmave9hFGJT8obyo0z+CrQOylLDbk7X81nPU6vq9VORa5jU30SkDnT2FXjLbR8HLP+xA==} 1493 | engines: {node: '>=10'} 1494 | hasBin: true 1495 | 1496 | thenify-all@1.6.0: 1497 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 1498 | engines: {node: '>=0.8'} 1499 | 1500 | thenify@3.3.1: 1501 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 1502 | 1503 | tinyexec@0.3.2: 1504 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 1505 | 1506 | tinyglobby@0.2.14: 1507 | resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} 1508 | engines: {node: '>=12.0.0'} 1509 | 1510 | tmp@0.2.3: 1511 | resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} 1512 | engines: {node: '>=14.14'} 1513 | 1514 | to-regex-range@5.0.1: 1515 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1516 | engines: {node: '>=8.0'} 1517 | 1518 | totalist@3.0.1: 1519 | resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} 1520 | engines: {node: '>=6'} 1521 | 1522 | tr46@1.0.1: 1523 | resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} 1524 | 1525 | tree-kill@1.2.2: 1526 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 1527 | hasBin: true 1528 | 1529 | ts-interface-checker@0.1.13: 1530 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 1531 | 1532 | tslib@2.8.1: 1533 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 1534 | 1535 | tsup@8.5.0: 1536 | resolution: {integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==} 1537 | engines: {node: '>=18'} 1538 | hasBin: true 1539 | peerDependencies: 1540 | '@microsoft/api-extractor': ^7.36.0 1541 | '@swc/core': ^1 1542 | postcss: ^8.4.12 1543 | typescript: '>=4.5.0' 1544 | peerDependenciesMeta: 1545 | '@microsoft/api-extractor': 1546 | optional: true 1547 | '@swc/core': 1548 | optional: true 1549 | postcss: 1550 | optional: true 1551 | typescript: 1552 | optional: true 1553 | 1554 | typescript@5.8.3: 1555 | resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 1556 | engines: {node: '>=14.17'} 1557 | hasBin: true 1558 | 1559 | ufo@1.6.1: 1560 | resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} 1561 | 1562 | undici-types@6.21.0: 1563 | resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 1564 | 1565 | universalify@2.0.1: 1566 | resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} 1567 | engines: {node: '>= 10.0.0'} 1568 | 1569 | unpipe@1.0.0: 1570 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 1571 | engines: {node: '>= 0.8'} 1572 | 1573 | update-browserslist-db@1.1.3: 1574 | resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} 1575 | hasBin: true 1576 | peerDependencies: 1577 | browserslist: '>= 4.21.0' 1578 | 1579 | use-sync-external-store@1.5.0: 1580 | resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} 1581 | peerDependencies: 1582 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 1583 | 1584 | utils-merge@1.0.1: 1585 | resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} 1586 | engines: {node: '>= 0.4.0'} 1587 | 1588 | vite@6.3.5: 1589 | resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} 1590 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1591 | hasBin: true 1592 | peerDependencies: 1593 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1594 | jiti: '>=1.21.0' 1595 | less: '*' 1596 | lightningcss: ^1.21.0 1597 | sass: '*' 1598 | sass-embedded: '*' 1599 | stylus: '*' 1600 | sugarss: '*' 1601 | terser: ^5.16.0 1602 | tsx: ^4.8.1 1603 | yaml: ^2.4.2 1604 | peerDependenciesMeta: 1605 | '@types/node': 1606 | optional: true 1607 | jiti: 1608 | optional: true 1609 | less: 1610 | optional: true 1611 | lightningcss: 1612 | optional: true 1613 | sass: 1614 | optional: true 1615 | sass-embedded: 1616 | optional: true 1617 | stylus: 1618 | optional: true 1619 | sugarss: 1620 | optional: true 1621 | terser: 1622 | optional: true 1623 | tsx: 1624 | optional: true 1625 | yaml: 1626 | optional: true 1627 | 1628 | web-streams-polyfill@3.3.3: 1629 | resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} 1630 | engines: {node: '>= 8'} 1631 | 1632 | webidl-conversions@4.0.2: 1633 | resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} 1634 | 1635 | whatwg-url@7.1.0: 1636 | resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} 1637 | 1638 | which@2.0.2: 1639 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1640 | engines: {node: '>= 8'} 1641 | hasBin: true 1642 | 1643 | wrap-ansi@7.0.0: 1644 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1645 | engines: {node: '>=10'} 1646 | 1647 | wrap-ansi@8.1.0: 1648 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1649 | engines: {node: '>=12'} 1650 | 1651 | wrappy@1.0.2: 1652 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1653 | 1654 | yallist@3.1.1: 1655 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1656 | 1657 | yallist@5.0.0: 1658 | resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} 1659 | engines: {node: '>=18'} 1660 | 1661 | snapshots: 1662 | 1663 | '@adobe/css-tools@4.4.3': {} 1664 | 1665 | '@ampproject/remapping@2.3.0': 1666 | dependencies: 1667 | '@jridgewell/gen-mapping': 0.3.8 1668 | '@jridgewell/trace-mapping': 0.3.25 1669 | 1670 | '@babel/code-frame@7.27.1': 1671 | dependencies: 1672 | '@babel/helper-validator-identifier': 7.27.1 1673 | js-tokens: 4.0.0 1674 | picocolors: 1.1.1 1675 | 1676 | '@babel/compat-data@7.27.3': {} 1677 | 1678 | '@babel/core@7.27.3': 1679 | dependencies: 1680 | '@ampproject/remapping': 2.3.0 1681 | '@babel/code-frame': 7.27.1 1682 | '@babel/generator': 7.27.3 1683 | '@babel/helper-compilation-targets': 7.27.2 1684 | '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.3) 1685 | '@babel/helpers': 7.27.3 1686 | '@babel/parser': 7.27.3 1687 | '@babel/template': 7.27.2 1688 | '@babel/traverse': 7.27.3 1689 | '@babel/types': 7.27.3 1690 | convert-source-map: 2.0.0 1691 | debug: 4.4.1 1692 | gensync: 1.0.0-beta.2 1693 | json5: 2.2.3 1694 | semver: 6.3.1 1695 | transitivePeerDependencies: 1696 | - supports-color 1697 | 1698 | '@babel/generator@7.27.3': 1699 | dependencies: 1700 | '@babel/parser': 7.27.3 1701 | '@babel/types': 7.27.3 1702 | '@jridgewell/gen-mapping': 0.3.8 1703 | '@jridgewell/trace-mapping': 0.3.25 1704 | jsesc: 3.1.0 1705 | 1706 | '@babel/helper-compilation-targets@7.27.2': 1707 | dependencies: 1708 | '@babel/compat-data': 7.27.3 1709 | '@babel/helper-validator-option': 7.27.1 1710 | browserslist: 4.24.5 1711 | lru-cache: 5.1.1 1712 | semver: 6.3.1 1713 | 1714 | '@babel/helper-module-imports@7.27.1': 1715 | dependencies: 1716 | '@babel/traverse': 7.27.3 1717 | '@babel/types': 7.27.3 1718 | transitivePeerDependencies: 1719 | - supports-color 1720 | 1721 | '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.3)': 1722 | dependencies: 1723 | '@babel/core': 7.27.3 1724 | '@babel/helper-module-imports': 7.27.1 1725 | '@babel/helper-validator-identifier': 7.27.1 1726 | '@babel/traverse': 7.27.3 1727 | transitivePeerDependencies: 1728 | - supports-color 1729 | 1730 | '@babel/helper-plugin-utils@7.27.1': {} 1731 | 1732 | '@babel/helper-string-parser@7.27.1': {} 1733 | 1734 | '@babel/helper-validator-identifier@7.27.1': {} 1735 | 1736 | '@babel/helper-validator-option@7.27.1': {} 1737 | 1738 | '@babel/helpers@7.27.3': 1739 | dependencies: 1740 | '@babel/template': 7.27.2 1741 | '@babel/types': 7.27.3 1742 | 1743 | '@babel/parser@7.27.3': 1744 | dependencies: 1745 | '@babel/types': 7.27.3 1746 | 1747 | '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.27.3)': 1748 | dependencies: 1749 | '@babel/core': 7.27.3 1750 | '@babel/helper-plugin-utils': 7.27.1 1751 | 1752 | '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.27.3)': 1753 | dependencies: 1754 | '@babel/core': 7.27.3 1755 | '@babel/helper-plugin-utils': 7.27.1 1756 | 1757 | '@babel/template@7.27.2': 1758 | dependencies: 1759 | '@babel/code-frame': 7.27.1 1760 | '@babel/parser': 7.27.3 1761 | '@babel/types': 7.27.3 1762 | 1763 | '@babel/traverse@7.27.3': 1764 | dependencies: 1765 | '@babel/code-frame': 7.27.1 1766 | '@babel/generator': 7.27.3 1767 | '@babel/parser': 7.27.3 1768 | '@babel/template': 7.27.2 1769 | '@babel/types': 7.27.3 1770 | debug: 4.4.1 1771 | globals: 11.12.0 1772 | transitivePeerDependencies: 1773 | - supports-color 1774 | 1775 | '@babel/types@7.27.3': 1776 | dependencies: 1777 | '@babel/helper-string-parser': 7.27.1 1778 | '@babel/helper-validator-identifier': 7.27.1 1779 | 1780 | '@esbuild/aix-ppc64@0.25.5': 1781 | optional: true 1782 | 1783 | '@esbuild/android-arm64@0.25.5': 1784 | optional: true 1785 | 1786 | '@esbuild/android-arm@0.25.5': 1787 | optional: true 1788 | 1789 | '@esbuild/android-x64@0.25.5': 1790 | optional: true 1791 | 1792 | '@esbuild/darwin-arm64@0.25.5': 1793 | optional: true 1794 | 1795 | '@esbuild/darwin-x64@0.25.5': 1796 | optional: true 1797 | 1798 | '@esbuild/freebsd-arm64@0.25.5': 1799 | optional: true 1800 | 1801 | '@esbuild/freebsd-x64@0.25.5': 1802 | optional: true 1803 | 1804 | '@esbuild/linux-arm64@0.25.5': 1805 | optional: true 1806 | 1807 | '@esbuild/linux-arm@0.25.5': 1808 | optional: true 1809 | 1810 | '@esbuild/linux-ia32@0.25.5': 1811 | optional: true 1812 | 1813 | '@esbuild/linux-loong64@0.25.5': 1814 | optional: true 1815 | 1816 | '@esbuild/linux-mips64el@0.25.5': 1817 | optional: true 1818 | 1819 | '@esbuild/linux-ppc64@0.25.5': 1820 | optional: true 1821 | 1822 | '@esbuild/linux-riscv64@0.25.5': 1823 | optional: true 1824 | 1825 | '@esbuild/linux-s390x@0.25.5': 1826 | optional: true 1827 | 1828 | '@esbuild/linux-x64@0.25.5': 1829 | optional: true 1830 | 1831 | '@esbuild/netbsd-arm64@0.25.5': 1832 | optional: true 1833 | 1834 | '@esbuild/netbsd-x64@0.25.5': 1835 | optional: true 1836 | 1837 | '@esbuild/openbsd-arm64@0.25.5': 1838 | optional: true 1839 | 1840 | '@esbuild/openbsd-x64@0.25.5': 1841 | optional: true 1842 | 1843 | '@esbuild/sunos-x64@0.25.5': 1844 | optional: true 1845 | 1846 | '@esbuild/win32-arm64@0.25.5': 1847 | optional: true 1848 | 1849 | '@esbuild/win32-ia32@0.25.5': 1850 | optional: true 1851 | 1852 | '@esbuild/win32-x64@0.25.5': 1853 | optional: true 1854 | 1855 | '@isaacs/cliui@8.0.2': 1856 | dependencies: 1857 | string-width: 5.1.2 1858 | string-width-cjs: string-width@4.2.3 1859 | strip-ansi: 7.1.0 1860 | strip-ansi-cjs: strip-ansi@6.0.1 1861 | wrap-ansi: 8.1.0 1862 | wrap-ansi-cjs: wrap-ansi@7.0.0 1863 | 1864 | '@isaacs/fs-minipass@4.0.1': 1865 | dependencies: 1866 | minipass: 7.1.2 1867 | 1868 | '@jridgewell/gen-mapping@0.3.8': 1869 | dependencies: 1870 | '@jridgewell/set-array': 1.2.1 1871 | '@jridgewell/sourcemap-codec': 1.5.0 1872 | '@jridgewell/trace-mapping': 0.3.25 1873 | 1874 | '@jridgewell/resolve-uri@3.1.2': {} 1875 | 1876 | '@jridgewell/set-array@1.2.1': {} 1877 | 1878 | '@jridgewell/source-map@0.3.6': 1879 | dependencies: 1880 | '@jridgewell/gen-mapping': 0.3.8 1881 | '@jridgewell/trace-mapping': 0.3.25 1882 | 1883 | '@jridgewell/sourcemap-codec@1.5.0': {} 1884 | 1885 | '@jridgewell/trace-mapping@0.3.25': 1886 | dependencies: 1887 | '@jridgewell/resolve-uri': 3.1.2 1888 | '@jridgewell/sourcemap-codec': 1.5.0 1889 | 1890 | '@parcel/watcher-android-arm64@2.5.1': 1891 | optional: true 1892 | 1893 | '@parcel/watcher-darwin-arm64@2.5.1': 1894 | optional: true 1895 | 1896 | '@parcel/watcher-darwin-x64@2.5.1': 1897 | optional: true 1898 | 1899 | '@parcel/watcher-freebsd-x64@2.5.1': 1900 | optional: true 1901 | 1902 | '@parcel/watcher-linux-arm-glibc@2.5.1': 1903 | optional: true 1904 | 1905 | '@parcel/watcher-linux-arm-musl@2.5.1': 1906 | optional: true 1907 | 1908 | '@parcel/watcher-linux-arm64-glibc@2.5.1': 1909 | optional: true 1910 | 1911 | '@parcel/watcher-linux-arm64-musl@2.5.1': 1912 | optional: true 1913 | 1914 | '@parcel/watcher-linux-x64-glibc@2.5.1': 1915 | optional: true 1916 | 1917 | '@parcel/watcher-linux-x64-musl@2.5.1': 1918 | optional: true 1919 | 1920 | '@parcel/watcher-win32-arm64@2.5.1': 1921 | optional: true 1922 | 1923 | '@parcel/watcher-win32-ia32@2.5.1': 1924 | optional: true 1925 | 1926 | '@parcel/watcher-win32-x64@2.5.1': 1927 | optional: true 1928 | 1929 | '@parcel/watcher@2.5.1': 1930 | dependencies: 1931 | detect-libc: 1.0.3 1932 | is-glob: 4.0.3 1933 | micromatch: 4.0.8 1934 | node-addon-api: 7.1.1 1935 | optionalDependencies: 1936 | '@parcel/watcher-android-arm64': 2.5.1 1937 | '@parcel/watcher-darwin-arm64': 2.5.1 1938 | '@parcel/watcher-darwin-x64': 2.5.1 1939 | '@parcel/watcher-freebsd-x64': 2.5.1 1940 | '@parcel/watcher-linux-arm-glibc': 2.5.1 1941 | '@parcel/watcher-linux-arm-musl': 2.5.1 1942 | '@parcel/watcher-linux-arm64-glibc': 2.5.1 1943 | '@parcel/watcher-linux-arm64-musl': 2.5.1 1944 | '@parcel/watcher-linux-x64-glibc': 2.5.1 1945 | '@parcel/watcher-linux-x64-musl': 2.5.1 1946 | '@parcel/watcher-win32-arm64': 2.5.1 1947 | '@parcel/watcher-win32-ia32': 2.5.1 1948 | '@parcel/watcher-win32-x64': 2.5.1 1949 | optional: true 1950 | 1951 | '@pkgjs/parseargs@0.11.0': 1952 | optional: true 1953 | 1954 | '@polka/url@1.0.0-next.29': {} 1955 | 1956 | '@rolldown/pluginutils@1.0.0-beta.9': {} 1957 | 1958 | '@rollup/rollup-android-arm-eabi@4.41.1': 1959 | optional: true 1960 | 1961 | '@rollup/rollup-android-arm64@4.41.1': 1962 | optional: true 1963 | 1964 | '@rollup/rollup-darwin-arm64@4.41.1': 1965 | optional: true 1966 | 1967 | '@rollup/rollup-darwin-x64@4.41.1': 1968 | optional: true 1969 | 1970 | '@rollup/rollup-freebsd-arm64@4.41.1': 1971 | optional: true 1972 | 1973 | '@rollup/rollup-freebsd-x64@4.41.1': 1974 | optional: true 1975 | 1976 | '@rollup/rollup-linux-arm-gnueabihf@4.41.1': 1977 | optional: true 1978 | 1979 | '@rollup/rollup-linux-arm-musleabihf@4.41.1': 1980 | optional: true 1981 | 1982 | '@rollup/rollup-linux-arm64-gnu@4.41.1': 1983 | optional: true 1984 | 1985 | '@rollup/rollup-linux-arm64-musl@4.41.1': 1986 | optional: true 1987 | 1988 | '@rollup/rollup-linux-loongarch64-gnu@4.41.1': 1989 | optional: true 1990 | 1991 | '@rollup/rollup-linux-powerpc64le-gnu@4.41.1': 1992 | optional: true 1993 | 1994 | '@rollup/rollup-linux-riscv64-gnu@4.41.1': 1995 | optional: true 1996 | 1997 | '@rollup/rollup-linux-riscv64-musl@4.41.1': 1998 | optional: true 1999 | 2000 | '@rollup/rollup-linux-s390x-gnu@4.41.1': 2001 | optional: true 2002 | 2003 | '@rollup/rollup-linux-x64-gnu@4.41.1': 2004 | optional: true 2005 | 2006 | '@rollup/rollup-linux-x64-musl@4.41.1': 2007 | optional: true 2008 | 2009 | '@rollup/rollup-win32-arm64-msvc@4.41.1': 2010 | optional: true 2011 | 2012 | '@rollup/rollup-win32-ia32-msvc@4.41.1': 2013 | optional: true 2014 | 2015 | '@rollup/rollup-win32-x64-msvc@4.41.1': 2016 | optional: true 2017 | 2018 | '@size-limit/file@11.2.0(size-limit@11.2.0)': 2019 | dependencies: 2020 | size-limit: 11.2.0 2021 | 2022 | '@tailwindcss/node@4.1.7': 2023 | dependencies: 2024 | '@ampproject/remapping': 2.3.0 2025 | enhanced-resolve: 5.18.1 2026 | jiti: 2.4.2 2027 | lightningcss: 1.30.1 2028 | magic-string: 0.30.17 2029 | source-map-js: 1.2.1 2030 | tailwindcss: 4.1.7 2031 | 2032 | '@tailwindcss/oxide-android-arm64@4.1.7': 2033 | optional: true 2034 | 2035 | '@tailwindcss/oxide-darwin-arm64@4.1.7': 2036 | optional: true 2037 | 2038 | '@tailwindcss/oxide-darwin-x64@4.1.7': 2039 | optional: true 2040 | 2041 | '@tailwindcss/oxide-freebsd-x64@4.1.7': 2042 | optional: true 2043 | 2044 | '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.7': 2045 | optional: true 2046 | 2047 | '@tailwindcss/oxide-linux-arm64-gnu@4.1.7': 2048 | optional: true 2049 | 2050 | '@tailwindcss/oxide-linux-arm64-musl@4.1.7': 2051 | optional: true 2052 | 2053 | '@tailwindcss/oxide-linux-x64-gnu@4.1.7': 2054 | optional: true 2055 | 2056 | '@tailwindcss/oxide-linux-x64-musl@4.1.7': 2057 | optional: true 2058 | 2059 | '@tailwindcss/oxide-wasm32-wasi@4.1.7': 2060 | optional: true 2061 | 2062 | '@tailwindcss/oxide-win32-arm64-msvc@4.1.7': 2063 | optional: true 2064 | 2065 | '@tailwindcss/oxide-win32-x64-msvc@4.1.7': 2066 | optional: true 2067 | 2068 | '@tailwindcss/oxide@4.1.7': 2069 | dependencies: 2070 | detect-libc: 2.0.4 2071 | tar: 7.4.3 2072 | optionalDependencies: 2073 | '@tailwindcss/oxide-android-arm64': 4.1.7 2074 | '@tailwindcss/oxide-darwin-arm64': 4.1.7 2075 | '@tailwindcss/oxide-darwin-x64': 4.1.7 2076 | '@tailwindcss/oxide-freebsd-x64': 4.1.7 2077 | '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.7 2078 | '@tailwindcss/oxide-linux-arm64-gnu': 4.1.7 2079 | '@tailwindcss/oxide-linux-arm64-musl': 4.1.7 2080 | '@tailwindcss/oxide-linux-x64-gnu': 4.1.7 2081 | '@tailwindcss/oxide-linux-x64-musl': 4.1.7 2082 | '@tailwindcss/oxide-wasm32-wasi': 4.1.7 2083 | '@tailwindcss/oxide-win32-arm64-msvc': 4.1.7 2084 | '@tailwindcss/oxide-win32-x64-msvc': 4.1.7 2085 | 2086 | '@tailwindcss/vite@4.1.7(vite@6.3.5(@types/node@22.15.23)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.0)(terser@5.40.0))': 2087 | dependencies: 2088 | '@tailwindcss/node': 4.1.7 2089 | '@tailwindcss/oxide': 4.1.7 2090 | tailwindcss: 4.1.7 2091 | vite: 6.3.5(@types/node@22.15.23)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.0)(terser@5.40.0) 2092 | 2093 | '@types/babel__core@7.20.5': 2094 | dependencies: 2095 | '@babel/parser': 7.27.3 2096 | '@babel/types': 7.27.3 2097 | '@types/babel__generator': 7.27.0 2098 | '@types/babel__template': 7.4.4 2099 | '@types/babel__traverse': 7.20.7 2100 | 2101 | '@types/babel__generator@7.27.0': 2102 | dependencies: 2103 | '@babel/types': 7.27.3 2104 | 2105 | '@types/babel__template@7.4.4': 2106 | dependencies: 2107 | '@babel/parser': 7.27.3 2108 | '@babel/types': 7.27.3 2109 | 2110 | '@types/babel__traverse@7.20.7': 2111 | dependencies: 2112 | '@babel/types': 7.27.3 2113 | 2114 | '@types/connect@3.4.38': 2115 | dependencies: 2116 | '@types/node': 22.15.23 2117 | 2118 | '@types/cross-spawn@6.0.6': 2119 | dependencies: 2120 | '@types/node': 22.15.23 2121 | 2122 | '@types/estree@1.0.7': {} 2123 | 2124 | '@types/fs-extra@11.0.4': 2125 | dependencies: 2126 | '@types/jsonfile': 6.1.4 2127 | '@types/node': 22.15.23 2128 | 2129 | '@types/jsonfile@6.1.4': 2130 | dependencies: 2131 | '@types/node': 22.15.23 2132 | 2133 | '@types/node@22.15.23': 2134 | dependencies: 2135 | undici-types: 6.21.0 2136 | 2137 | '@types/react-dom@19.1.5(@types/react@19.1.6)': 2138 | dependencies: 2139 | '@types/react': 19.1.6 2140 | 2141 | '@types/react@19.1.6': 2142 | dependencies: 2143 | csstype: 3.1.3 2144 | 2145 | '@vitejs/plugin-react@4.5.0(vite@6.3.5(@types/node@22.15.23)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.0)(terser@5.40.0))': 2146 | dependencies: 2147 | '@babel/core': 7.27.3 2148 | '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.3) 2149 | '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.3) 2150 | '@rolldown/pluginutils': 1.0.0-beta.9 2151 | '@types/babel__core': 7.20.5 2152 | react-refresh: 0.17.0 2153 | vite: 6.3.5(@types/node@22.15.23)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.0)(terser@5.40.0) 2154 | transitivePeerDependencies: 2155 | - supports-color 2156 | 2157 | acorn@8.14.1: {} 2158 | 2159 | agent-base@7.1.3: {} 2160 | 2161 | analyze-css@2.4.5: 2162 | dependencies: 2163 | '@adobe/css-tools': 4.4.3 2164 | cli: 1.0.1 2165 | commander: 13.1.0 2166 | css-shorthand-properties: 1.1.2 2167 | css-what: 6.1.0 2168 | debug: 4.4.1 2169 | fast-stats: 0.0.7 2170 | glob: 11.0.2 2171 | http-proxy-agent: 7.0.2 2172 | node-fetch: 3.3.2 2173 | onecolor: 4.1.0 2174 | specificity: 1.0.0 2175 | optionalDependencies: 2176 | sass: 1.89.0 2177 | transitivePeerDependencies: 2178 | - supports-color 2179 | 2180 | ansi-regex@5.0.1: {} 2181 | 2182 | ansi-regex@6.1.0: {} 2183 | 2184 | ansi-styles@4.3.0: 2185 | dependencies: 2186 | color-convert: 2.0.1 2187 | 2188 | ansi-styles@6.2.1: {} 2189 | 2190 | any-promise@1.3.0: {} 2191 | 2192 | autoprefixer@10.4.21(postcss@8.5.3): 2193 | dependencies: 2194 | browserslist: 4.24.5 2195 | caniuse-lite: 1.0.30001718 2196 | fraction.js: 4.3.7 2197 | normalize-range: 0.1.2 2198 | picocolors: 1.1.1 2199 | postcss: 8.5.3 2200 | postcss-value-parser: 4.2.0 2201 | 2202 | balanced-match@1.0.2: {} 2203 | 2204 | brace-expansion@1.1.11: 2205 | dependencies: 2206 | balanced-match: 1.0.2 2207 | concat-map: 0.0.1 2208 | 2209 | brace-expansion@2.0.1: 2210 | dependencies: 2211 | balanced-match: 1.0.2 2212 | 2213 | braces@3.0.3: 2214 | dependencies: 2215 | fill-range: 7.1.1 2216 | optional: true 2217 | 2218 | browserslist@4.24.5: 2219 | dependencies: 2220 | caniuse-lite: 1.0.30001718 2221 | electron-to-chromium: 1.5.159 2222 | node-releases: 2.0.19 2223 | update-browserslist-db: 1.1.3(browserslist@4.24.5) 2224 | 2225 | buffer-from@1.1.2: {} 2226 | 2227 | bundle-name@4.1.0: 2228 | dependencies: 2229 | run-applescript: 7.0.0 2230 | 2231 | bundle-require@5.1.0(esbuild@0.25.5): 2232 | dependencies: 2233 | esbuild: 0.25.5 2234 | load-tsconfig: 0.2.5 2235 | 2236 | bytes-iec@3.1.1: {} 2237 | 2238 | cac@6.7.14: {} 2239 | 2240 | caniuse-lite@1.0.30001718: {} 2241 | 2242 | chokidar@4.0.3: 2243 | dependencies: 2244 | readdirp: 4.1.2 2245 | 2246 | chownr@3.0.0: {} 2247 | 2248 | cli@1.0.1: 2249 | dependencies: 2250 | exit: 0.1.2 2251 | glob: 7.2.3 2252 | 2253 | color-convert@2.0.1: 2254 | dependencies: 2255 | color-name: 1.1.4 2256 | 2257 | color-name@1.1.4: {} 2258 | 2259 | commander@13.1.0: {} 2260 | 2261 | commander@2.20.3: {} 2262 | 2263 | commander@4.1.1: {} 2264 | 2265 | concat-map@0.0.1: {} 2266 | 2267 | confbox@0.1.8: {} 2268 | 2269 | connect@3.7.0: 2270 | dependencies: 2271 | debug: 2.6.9 2272 | finalhandler: 1.1.2 2273 | parseurl: 1.3.3 2274 | utils-merge: 1.0.1 2275 | transitivePeerDependencies: 2276 | - supports-color 2277 | 2278 | consola@3.4.2: {} 2279 | 2280 | convert-source-map@2.0.0: {} 2281 | 2282 | cross-spawn@7.0.6: 2283 | dependencies: 2284 | path-key: 3.1.1 2285 | shebang-command: 2.0.0 2286 | which: 2.0.2 2287 | 2288 | css-shorthand-properties@1.1.2: {} 2289 | 2290 | css-tree@2.3.1: 2291 | dependencies: 2292 | mdn-data: 2.0.30 2293 | source-map-js: 1.2.1 2294 | 2295 | css-what@6.1.0: {} 2296 | 2297 | cssjson@2.1.3: {} 2298 | 2299 | csstype@3.1.3: {} 2300 | 2301 | data-uri-to-buffer@4.0.1: {} 2302 | 2303 | debug@2.6.9: 2304 | dependencies: 2305 | ms: 2.0.0 2306 | 2307 | debug@4.4.1: 2308 | dependencies: 2309 | ms: 2.1.3 2310 | 2311 | default-browser-id@5.0.0: {} 2312 | 2313 | default-browser@5.2.1: 2314 | dependencies: 2315 | bundle-name: 4.1.0 2316 | default-browser-id: 5.0.0 2317 | 2318 | define-lazy-prop@3.0.0: {} 2319 | 2320 | dequal@2.0.3: {} 2321 | 2322 | detect-libc@1.0.3: 2323 | optional: true 2324 | 2325 | detect-libc@2.0.4: {} 2326 | 2327 | eastasianwidth@0.2.0: {} 2328 | 2329 | ee-first@1.1.1: {} 2330 | 2331 | electron-to-chromium@1.5.159: {} 2332 | 2333 | emoji-regex@8.0.0: {} 2334 | 2335 | emoji-regex@9.2.2: {} 2336 | 2337 | encodeurl@1.0.2: {} 2338 | 2339 | enhanced-resolve@5.18.1: 2340 | dependencies: 2341 | graceful-fs: 4.2.11 2342 | tapable: 2.2.2 2343 | 2344 | esbuild@0.25.5: 2345 | optionalDependencies: 2346 | '@esbuild/aix-ppc64': 0.25.5 2347 | '@esbuild/android-arm': 0.25.5 2348 | '@esbuild/android-arm64': 0.25.5 2349 | '@esbuild/android-x64': 0.25.5 2350 | '@esbuild/darwin-arm64': 0.25.5 2351 | '@esbuild/darwin-x64': 0.25.5 2352 | '@esbuild/freebsd-arm64': 0.25.5 2353 | '@esbuild/freebsd-x64': 0.25.5 2354 | '@esbuild/linux-arm': 0.25.5 2355 | '@esbuild/linux-arm64': 0.25.5 2356 | '@esbuild/linux-ia32': 0.25.5 2357 | '@esbuild/linux-loong64': 0.25.5 2358 | '@esbuild/linux-mips64el': 0.25.5 2359 | '@esbuild/linux-ppc64': 0.25.5 2360 | '@esbuild/linux-riscv64': 0.25.5 2361 | '@esbuild/linux-s390x': 0.25.5 2362 | '@esbuild/linux-x64': 0.25.5 2363 | '@esbuild/netbsd-arm64': 0.25.5 2364 | '@esbuild/netbsd-x64': 0.25.5 2365 | '@esbuild/openbsd-arm64': 0.25.5 2366 | '@esbuild/openbsd-x64': 0.25.5 2367 | '@esbuild/sunos-x64': 0.25.5 2368 | '@esbuild/win32-arm64': 0.25.5 2369 | '@esbuild/win32-ia32': 0.25.5 2370 | '@esbuild/win32-x64': 0.25.5 2371 | 2372 | escalade@3.2.0: {} 2373 | 2374 | escape-html@1.0.3: {} 2375 | 2376 | exit@0.1.2: {} 2377 | 2378 | fast-stats@0.0.7: {} 2379 | 2380 | fdir@6.4.5(picomatch@4.0.2): 2381 | optionalDependencies: 2382 | picomatch: 4.0.2 2383 | 2384 | fetch-blob@3.2.0: 2385 | dependencies: 2386 | node-domexception: 1.0.0 2387 | web-streams-polyfill: 3.3.3 2388 | 2389 | fill-range@7.1.1: 2390 | dependencies: 2391 | to-regex-range: 5.0.1 2392 | optional: true 2393 | 2394 | finalhandler@1.1.2: 2395 | dependencies: 2396 | debug: 2.6.9 2397 | encodeurl: 1.0.2 2398 | escape-html: 1.0.3 2399 | on-finished: 2.3.0 2400 | parseurl: 1.3.3 2401 | statuses: 1.5.0 2402 | unpipe: 1.0.0 2403 | transitivePeerDependencies: 2404 | - supports-color 2405 | 2406 | fix-dts-default-cjs-exports@1.0.1: 2407 | dependencies: 2408 | magic-string: 0.30.17 2409 | mlly: 1.7.4 2410 | rollup: 4.41.1 2411 | 2412 | foreground-child@3.3.1: 2413 | dependencies: 2414 | cross-spawn: 7.0.6 2415 | signal-exit: 4.1.0 2416 | 2417 | formdata-polyfill@4.0.10: 2418 | dependencies: 2419 | fetch-blob: 3.2.0 2420 | 2421 | fraction.js@4.3.7: {} 2422 | 2423 | fs-extra@11.3.0: 2424 | dependencies: 2425 | graceful-fs: 4.2.11 2426 | jsonfile: 6.1.0 2427 | universalify: 2.0.1 2428 | 2429 | fs.realpath@1.0.0: {} 2430 | 2431 | fsevents@2.3.3: 2432 | optional: true 2433 | 2434 | gensync@1.0.0-beta.2: {} 2435 | 2436 | get-port@7.1.0: {} 2437 | 2438 | glob@10.4.5: 2439 | dependencies: 2440 | foreground-child: 3.3.1 2441 | jackspeak: 3.4.3 2442 | minimatch: 9.0.5 2443 | minipass: 7.1.2 2444 | package-json-from-dist: 1.0.1 2445 | path-scurry: 1.11.1 2446 | 2447 | glob@11.0.2: 2448 | dependencies: 2449 | foreground-child: 3.3.1 2450 | jackspeak: 4.1.1 2451 | minimatch: 10.0.1 2452 | minipass: 7.1.2 2453 | package-json-from-dist: 1.0.1 2454 | path-scurry: 2.0.0 2455 | 2456 | glob@7.2.3: 2457 | dependencies: 2458 | fs.realpath: 1.0.0 2459 | inflight: 1.0.6 2460 | inherits: 2.0.4 2461 | minimatch: 3.1.2 2462 | once: 1.4.0 2463 | path-is-absolute: 1.0.1 2464 | 2465 | globals@11.12.0: {} 2466 | 2467 | graceful-fs@4.2.11: {} 2468 | 2469 | http-proxy-agent@7.0.2: 2470 | dependencies: 2471 | agent-base: 7.1.3 2472 | debug: 4.4.1 2473 | transitivePeerDependencies: 2474 | - supports-color 2475 | 2476 | husky@9.1.7: {} 2477 | 2478 | immutable@5.1.2: 2479 | optional: true 2480 | 2481 | inflight@1.0.6: 2482 | dependencies: 2483 | once: 1.4.0 2484 | wrappy: 1.0.2 2485 | 2486 | inherits@2.0.4: {} 2487 | 2488 | is-docker@3.0.0: {} 2489 | 2490 | is-extglob@2.1.1: 2491 | optional: true 2492 | 2493 | is-fullwidth-code-point@3.0.0: {} 2494 | 2495 | is-glob@4.0.3: 2496 | dependencies: 2497 | is-extglob: 2.1.1 2498 | optional: true 2499 | 2500 | is-inside-container@1.0.0: 2501 | dependencies: 2502 | is-docker: 3.0.0 2503 | 2504 | is-number@7.0.0: 2505 | optional: true 2506 | 2507 | is-wsl@3.1.0: 2508 | dependencies: 2509 | is-inside-container: 1.0.0 2510 | 2511 | isexe@2.0.0: {} 2512 | 2513 | jackspeak@3.4.3: 2514 | dependencies: 2515 | '@isaacs/cliui': 8.0.2 2516 | optionalDependencies: 2517 | '@pkgjs/parseargs': 0.11.0 2518 | 2519 | jackspeak@4.1.1: 2520 | dependencies: 2521 | '@isaacs/cliui': 8.0.2 2522 | 2523 | jiti@2.4.2: {} 2524 | 2525 | joycon@3.1.1: {} 2526 | 2527 | js-tokens@4.0.0: {} 2528 | 2529 | jsesc@3.1.0: {} 2530 | 2531 | json5@2.2.3: {} 2532 | 2533 | jsonfile@6.1.0: 2534 | dependencies: 2535 | universalify: 2.0.1 2536 | optionalDependencies: 2537 | graceful-fs: 4.2.11 2538 | 2539 | lightningcss-darwin-arm64@1.30.1: 2540 | optional: true 2541 | 2542 | lightningcss-darwin-x64@1.30.1: 2543 | optional: true 2544 | 2545 | lightningcss-freebsd-x64@1.30.1: 2546 | optional: true 2547 | 2548 | lightningcss-linux-arm-gnueabihf@1.30.1: 2549 | optional: true 2550 | 2551 | lightningcss-linux-arm64-gnu@1.30.1: 2552 | optional: true 2553 | 2554 | lightningcss-linux-arm64-musl@1.30.1: 2555 | optional: true 2556 | 2557 | lightningcss-linux-x64-gnu@1.30.1: 2558 | optional: true 2559 | 2560 | lightningcss-linux-x64-musl@1.30.1: 2561 | optional: true 2562 | 2563 | lightningcss-win32-arm64-msvc@1.30.1: 2564 | optional: true 2565 | 2566 | lightningcss-win32-x64-msvc@1.30.1: 2567 | optional: true 2568 | 2569 | lightningcss@1.30.1: 2570 | dependencies: 2571 | detect-libc: 2.0.4 2572 | optionalDependencies: 2573 | lightningcss-darwin-arm64: 1.30.1 2574 | lightningcss-darwin-x64: 1.30.1 2575 | lightningcss-freebsd-x64: 1.30.1 2576 | lightningcss-linux-arm-gnueabihf: 1.30.1 2577 | lightningcss-linux-arm64-gnu: 1.30.1 2578 | lightningcss-linux-arm64-musl: 1.30.1 2579 | lightningcss-linux-x64-gnu: 1.30.1 2580 | lightningcss-linux-x64-musl: 1.30.1 2581 | lightningcss-win32-arm64-msvc: 1.30.1 2582 | lightningcss-win32-x64-msvc: 1.30.1 2583 | 2584 | lilconfig@3.1.3: {} 2585 | 2586 | lines-and-columns@1.2.4: {} 2587 | 2588 | load-tsconfig@0.2.5: {} 2589 | 2590 | lodash.sortby@4.7.0: {} 2591 | 2592 | lru-cache@10.4.3: {} 2593 | 2594 | lru-cache@11.1.0: {} 2595 | 2596 | lru-cache@5.1.1: 2597 | dependencies: 2598 | yallist: 3.1.1 2599 | 2600 | magic-string@0.30.17: 2601 | dependencies: 2602 | '@jridgewell/sourcemap-codec': 1.5.0 2603 | 2604 | mdn-data@2.0.30: {} 2605 | 2606 | micromatch@4.0.8: 2607 | dependencies: 2608 | braces: 3.0.3 2609 | picomatch: 2.3.1 2610 | optional: true 2611 | 2612 | minimatch@10.0.1: 2613 | dependencies: 2614 | brace-expansion: 2.0.1 2615 | 2616 | minimatch@3.1.2: 2617 | dependencies: 2618 | brace-expansion: 1.1.11 2619 | 2620 | minimatch@9.0.5: 2621 | dependencies: 2622 | brace-expansion: 2.0.1 2623 | 2624 | minipass@7.1.2: {} 2625 | 2626 | minizlib@3.0.2: 2627 | dependencies: 2628 | minipass: 7.1.2 2629 | 2630 | mkdirp@3.0.1: {} 2631 | 2632 | mlly@1.7.4: 2633 | dependencies: 2634 | acorn: 8.14.1 2635 | pathe: 2.0.3 2636 | pkg-types: 1.3.1 2637 | ufo: 1.6.1 2638 | 2639 | mrmime@2.0.1: {} 2640 | 2641 | ms@2.0.0: {} 2642 | 2643 | ms@2.1.3: {} 2644 | 2645 | mz@2.7.0: 2646 | dependencies: 2647 | any-promise: 1.3.0 2648 | object-assign: 4.1.1 2649 | thenify-all: 1.6.0 2650 | 2651 | nanoid@3.3.11: {} 2652 | 2653 | nanoid@5.1.5: {} 2654 | 2655 | nanospinner@1.2.2: 2656 | dependencies: 2657 | picocolors: 1.1.1 2658 | 2659 | node-addon-api@7.1.1: 2660 | optional: true 2661 | 2662 | node-domexception@1.0.0: {} 2663 | 2664 | node-fetch@3.3.2: 2665 | dependencies: 2666 | data-uri-to-buffer: 4.0.1 2667 | fetch-blob: 3.2.0 2668 | formdata-polyfill: 4.0.10 2669 | 2670 | node-releases@2.0.19: {} 2671 | 2672 | normalize-range@0.1.2: {} 2673 | 2674 | object-assign@4.1.1: {} 2675 | 2676 | on-finished@2.3.0: 2677 | dependencies: 2678 | ee-first: 1.1.1 2679 | 2680 | once@1.4.0: 2681 | dependencies: 2682 | wrappy: 1.0.2 2683 | 2684 | onecolor@4.1.0: {} 2685 | 2686 | open@10.1.2: 2687 | dependencies: 2688 | default-browser: 5.2.1 2689 | define-lazy-prop: 3.0.0 2690 | is-inside-container: 1.0.0 2691 | is-wsl: 3.1.0 2692 | 2693 | package-json-from-dist@1.0.1: {} 2694 | 2695 | parseurl@1.3.3: {} 2696 | 2697 | path-is-absolute@1.0.1: {} 2698 | 2699 | path-key@3.1.1: {} 2700 | 2701 | path-scurry@1.11.1: 2702 | dependencies: 2703 | lru-cache: 10.4.3 2704 | minipass: 7.1.2 2705 | 2706 | path-scurry@2.0.0: 2707 | dependencies: 2708 | lru-cache: 11.1.0 2709 | minipass: 7.1.2 2710 | 2711 | pathe@2.0.3: {} 2712 | 2713 | picocolors@1.1.1: {} 2714 | 2715 | picomatch@2.3.1: 2716 | optional: true 2717 | 2718 | picomatch@4.0.2: {} 2719 | 2720 | pirates@4.0.7: {} 2721 | 2722 | pkg-types@1.3.1: 2723 | dependencies: 2724 | confbox: 0.1.8 2725 | mlly: 1.7.4 2726 | pathe: 2.0.3 2727 | 2728 | postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3): 2729 | dependencies: 2730 | lilconfig: 3.1.3 2731 | optionalDependencies: 2732 | jiti: 2.4.2 2733 | postcss: 8.5.3 2734 | 2735 | postcss-value-parser@4.2.0: {} 2736 | 2737 | postcss@8.5.3: 2738 | dependencies: 2739 | nanoid: 3.3.11 2740 | picocolors: 1.1.1 2741 | source-map-js: 1.2.1 2742 | 2743 | punycode@2.3.1: {} 2744 | 2745 | react-dom@19.1.0(react@19.1.0): 2746 | dependencies: 2747 | react: 19.1.0 2748 | scheduler: 0.26.0 2749 | 2750 | react-refresh@0.17.0: {} 2751 | 2752 | react@19.1.0: {} 2753 | 2754 | readdirp@4.1.2: {} 2755 | 2756 | resolve-from@5.0.0: {} 2757 | 2758 | rollup@4.41.1: 2759 | dependencies: 2760 | '@types/estree': 1.0.7 2761 | optionalDependencies: 2762 | '@rollup/rollup-android-arm-eabi': 4.41.1 2763 | '@rollup/rollup-android-arm64': 4.41.1 2764 | '@rollup/rollup-darwin-arm64': 4.41.1 2765 | '@rollup/rollup-darwin-x64': 4.41.1 2766 | '@rollup/rollup-freebsd-arm64': 4.41.1 2767 | '@rollup/rollup-freebsd-x64': 4.41.1 2768 | '@rollup/rollup-linux-arm-gnueabihf': 4.41.1 2769 | '@rollup/rollup-linux-arm-musleabihf': 4.41.1 2770 | '@rollup/rollup-linux-arm64-gnu': 4.41.1 2771 | '@rollup/rollup-linux-arm64-musl': 4.41.1 2772 | '@rollup/rollup-linux-loongarch64-gnu': 4.41.1 2773 | '@rollup/rollup-linux-powerpc64le-gnu': 4.41.1 2774 | '@rollup/rollup-linux-riscv64-gnu': 4.41.1 2775 | '@rollup/rollup-linux-riscv64-musl': 4.41.1 2776 | '@rollup/rollup-linux-s390x-gnu': 4.41.1 2777 | '@rollup/rollup-linux-x64-gnu': 4.41.1 2778 | '@rollup/rollup-linux-x64-musl': 4.41.1 2779 | '@rollup/rollup-win32-arm64-msvc': 4.41.1 2780 | '@rollup/rollup-win32-ia32-msvc': 4.41.1 2781 | '@rollup/rollup-win32-x64-msvc': 4.41.1 2782 | fsevents: 2.3.3 2783 | 2784 | run-applescript@7.0.0: {} 2785 | 2786 | sass@1.89.0: 2787 | dependencies: 2788 | chokidar: 4.0.3 2789 | immutable: 5.1.2 2790 | source-map-js: 1.2.1 2791 | optionalDependencies: 2792 | '@parcel/watcher': 2.5.1 2793 | optional: true 2794 | 2795 | scheduler@0.26.0: {} 2796 | 2797 | semver@6.3.1: {} 2798 | 2799 | shebang-command@2.0.0: 2800 | dependencies: 2801 | shebang-regex: 3.0.0 2802 | 2803 | shebang-regex@3.0.0: {} 2804 | 2805 | signal-exit@4.1.0: {} 2806 | 2807 | sirv@3.0.1: 2808 | dependencies: 2809 | '@polka/url': 1.0.0-next.29 2810 | mrmime: 2.0.1 2811 | totalist: 3.0.1 2812 | 2813 | size-limit-node-esbuild@0.4.0: 2814 | dependencies: 2815 | nanoid: 5.1.5 2816 | size-limit: 11.2.0 2817 | tslib: 2.8.1 2818 | 2819 | size-limit@11.2.0: 2820 | dependencies: 2821 | bytes-iec: 3.1.1 2822 | chokidar: 4.0.3 2823 | jiti: 2.4.2 2824 | lilconfig: 3.1.3 2825 | nanospinner: 1.2.2 2826 | picocolors: 1.1.1 2827 | tinyglobby: 0.2.14 2828 | 2829 | source-map-js@1.2.1: {} 2830 | 2831 | source-map-support@0.5.21: 2832 | dependencies: 2833 | buffer-from: 1.1.2 2834 | source-map: 0.6.1 2835 | 2836 | source-map@0.6.1: {} 2837 | 2838 | source-map@0.8.0-beta.0: 2839 | dependencies: 2840 | whatwg-url: 7.1.0 2841 | 2842 | specificity@1.0.0: 2843 | dependencies: 2844 | css-tree: 2.3.1 2845 | 2846 | statuses@1.5.0: {} 2847 | 2848 | string-width@4.2.3: 2849 | dependencies: 2850 | emoji-regex: 8.0.0 2851 | is-fullwidth-code-point: 3.0.0 2852 | strip-ansi: 6.0.1 2853 | 2854 | string-width@5.1.2: 2855 | dependencies: 2856 | eastasianwidth: 0.2.0 2857 | emoji-regex: 9.2.2 2858 | strip-ansi: 7.1.0 2859 | 2860 | strip-ansi@6.0.1: 2861 | dependencies: 2862 | ansi-regex: 5.0.1 2863 | 2864 | strip-ansi@7.1.0: 2865 | dependencies: 2866 | ansi-regex: 6.1.0 2867 | 2868 | sucrase@3.35.0: 2869 | dependencies: 2870 | '@jridgewell/gen-mapping': 0.3.8 2871 | commander: 4.1.1 2872 | glob: 10.4.5 2873 | lines-and-columns: 1.2.4 2874 | mz: 2.7.0 2875 | pirates: 4.0.7 2876 | ts-interface-checker: 0.1.13 2877 | 2878 | swr@2.3.3(react@19.1.0): 2879 | dependencies: 2880 | dequal: 2.0.3 2881 | react: 19.1.0 2882 | use-sync-external-store: 1.5.0(react@19.1.0) 2883 | 2884 | tailwindcss@4.1.7: {} 2885 | 2886 | tapable@2.2.2: {} 2887 | 2888 | tar@7.4.3: 2889 | dependencies: 2890 | '@isaacs/fs-minipass': 4.0.1 2891 | chownr: 3.0.0 2892 | minipass: 7.1.2 2893 | minizlib: 3.0.2 2894 | mkdirp: 3.0.1 2895 | yallist: 5.0.0 2896 | 2897 | terser@5.40.0: 2898 | dependencies: 2899 | '@jridgewell/source-map': 0.3.6 2900 | acorn: 8.14.1 2901 | commander: 2.20.3 2902 | source-map-support: 0.5.21 2903 | 2904 | thenify-all@1.6.0: 2905 | dependencies: 2906 | thenify: 3.3.1 2907 | 2908 | thenify@3.3.1: 2909 | dependencies: 2910 | any-promise: 1.3.0 2911 | 2912 | tinyexec@0.3.2: {} 2913 | 2914 | tinyglobby@0.2.14: 2915 | dependencies: 2916 | fdir: 6.4.5(picomatch@4.0.2) 2917 | picomatch: 4.0.2 2918 | 2919 | tmp@0.2.3: {} 2920 | 2921 | to-regex-range@5.0.1: 2922 | dependencies: 2923 | is-number: 7.0.0 2924 | optional: true 2925 | 2926 | totalist@3.0.1: {} 2927 | 2928 | tr46@1.0.1: 2929 | dependencies: 2930 | punycode: 2.3.1 2931 | 2932 | tree-kill@1.2.2: {} 2933 | 2934 | ts-interface-checker@0.1.13: {} 2935 | 2936 | tslib@2.8.1: {} 2937 | 2938 | tsup@8.5.0(jiti@2.4.2)(postcss@8.5.3)(typescript@5.8.3): 2939 | dependencies: 2940 | bundle-require: 5.1.0(esbuild@0.25.5) 2941 | cac: 6.7.14 2942 | chokidar: 4.0.3 2943 | consola: 3.4.2 2944 | debug: 4.4.1 2945 | esbuild: 0.25.5 2946 | fix-dts-default-cjs-exports: 1.0.1 2947 | joycon: 3.1.1 2948 | picocolors: 1.1.1 2949 | postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.3) 2950 | resolve-from: 5.0.0 2951 | rollup: 4.41.1 2952 | source-map: 0.8.0-beta.0 2953 | sucrase: 3.35.0 2954 | tinyexec: 0.3.2 2955 | tinyglobby: 0.2.14 2956 | tree-kill: 1.2.2 2957 | optionalDependencies: 2958 | postcss: 8.5.3 2959 | typescript: 5.8.3 2960 | transitivePeerDependencies: 2961 | - jiti 2962 | - supports-color 2963 | - tsx 2964 | - yaml 2965 | 2966 | typescript@5.8.3: {} 2967 | 2968 | ufo@1.6.1: {} 2969 | 2970 | undici-types@6.21.0: {} 2971 | 2972 | universalify@2.0.1: {} 2973 | 2974 | unpipe@1.0.0: {} 2975 | 2976 | update-browserslist-db@1.1.3(browserslist@4.24.5): 2977 | dependencies: 2978 | browserslist: 4.24.5 2979 | escalade: 3.2.0 2980 | picocolors: 1.1.1 2981 | 2982 | use-sync-external-store@1.5.0(react@19.1.0): 2983 | dependencies: 2984 | react: 19.1.0 2985 | 2986 | utils-merge@1.0.1: {} 2987 | 2988 | vite@6.3.5(@types/node@22.15.23)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.0)(terser@5.40.0): 2989 | dependencies: 2990 | esbuild: 0.25.5 2991 | fdir: 6.4.5(picomatch@4.0.2) 2992 | picomatch: 4.0.2 2993 | postcss: 8.5.3 2994 | rollup: 4.41.1 2995 | tinyglobby: 0.2.14 2996 | optionalDependencies: 2997 | '@types/node': 22.15.23 2998 | fsevents: 2.3.3 2999 | jiti: 2.4.2 3000 | lightningcss: 1.30.1 3001 | sass: 1.89.0 3002 | terser: 5.40.0 3003 | 3004 | web-streams-polyfill@3.3.3: {} 3005 | 3006 | webidl-conversions@4.0.2: {} 3007 | 3008 | whatwg-url@7.1.0: 3009 | dependencies: 3010 | lodash.sortby: 4.7.0 3011 | tr46: 1.0.1 3012 | webidl-conversions: 4.0.2 3013 | 3014 | which@2.0.2: 3015 | dependencies: 3016 | isexe: 2.0.0 3017 | 3018 | wrap-ansi@7.0.0: 3019 | dependencies: 3020 | ansi-styles: 4.3.0 3021 | string-width: 4.2.3 3022 | strip-ansi: 6.0.1 3023 | 3024 | wrap-ansi@8.1.0: 3025 | dependencies: 3026 | ansi-styles: 6.2.1 3027 | string-width: 5.1.2 3028 | strip-ansi: 7.1.0 3029 | 3030 | wrappy@1.0.2: {} 3031 | 3032 | yallist@3.1.1: {} 3033 | 3034 | yallist@5.0.0: {} 3035 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | onlyBuiltDependencies: 2 | - '@parcel/watcher' 3 | - esbuild 4 | - '@tailwindcss/oxide' 5 | 6 | -------------------------------------------------------------------------------- /src/analyzer.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | import analyzer from 'analyze-css'; 3 | import { Metrics } from './types/metrics'; 4 | 5 | const opts = { 6 | noOffenders: true, 7 | }; 8 | 9 | export async function analyze(css: string) { 10 | return new Promise(async (res, rej) => { 11 | try { 12 | const results = await analyzer(css, opts) 13 | 14 | const { 15 | metrics: { 16 | colors, 17 | mediaQueries, 18 | selectors, 19 | selectorsByAttribute, 20 | selectorsByClass, 21 | selectorsById, 22 | selectorsByPseudo, 23 | selectorsByTag, 24 | rules, 25 | declarations, 26 | }, 27 | } = results; 28 | 29 | res({ 30 | colors, 31 | mediaQueries, 32 | selectors, 33 | selectorsByAttribute, 34 | selectorsByClass, 35 | selectorsById, 36 | selectorsByPseudo, 37 | selectorsByTag, 38 | rules, 39 | declarations, 40 | }); 41 | } catch (err) { 42 | 43 | rej(err) 44 | } 45 | }); 46 | } -------------------------------------------------------------------------------- /src/helpers/camelToTitleCase.ts: -------------------------------------------------------------------------------- 1 | const camelToTitleCase = (str: string) => 2 | str.replace(/([A-Z])/g, ' $1').replace(/^./, function (s) { 3 | return s.toUpperCase(); 4 | }); 5 | 6 | export default camelToTitleCase; 7 | -------------------------------------------------------------------------------- /src/helpers/categories.ts: -------------------------------------------------------------------------------- 1 | export const staticUtilities: Record = { 2 | 'box-border': 'boxSizing', 3 | 'box-content': 'boxSizing', 4 | block: 'display', 5 | 'inline-block': 'display', 6 | inline: 'display', 7 | flex: 'display', 8 | 'inline-flex': 'display', 9 | table: 'display', 10 | 'table-caption': 'display', 11 | 'table-cell': 'display', 12 | 'table-column': 'display', 13 | 'table-column-group': 'display', 14 | 'table-footer-group': 'display', 15 | 'table-header-group': 'display', 16 | 'table-row-group': 'display', 17 | 'table-row': 'display', 18 | 'flow-root': 'display', 19 | grid: 'display', 20 | 'inline-grid': 'display', 21 | contents: 'display', 22 | hidden: 'display', 23 | 'float-right': 'float', 24 | 'float-left': 'float', 25 | 'float-none': 'float', 26 | 'clear-left': 'clear', 27 | 'clear-right': 'clear', 28 | 'clear-both': 'clear', 29 | 'clear-none': 'clear', 30 | 'object-contain': 'objectFit', 31 | 'object-cover': 'objectFit', 32 | 'object-fill': 'objectFit', 33 | 'object-none': 'objectFit', 34 | 'object-scale-down': 'objectFit', 35 | 'overflow-auto': 'overflow', 36 | 'overflow-hidden': 'overflow', 37 | 'overflow-visible': 'overflow', 38 | 'overflow-scroll': 'overflow', 39 | 'overflow-x-auto': 'overflow', 40 | 'overflow-y-auto': 'overflow', 41 | 'overflow-x-hidden': 'overflow', 42 | 'overflow-y-hidden': 'overflow', 43 | 'overflow-x-visible': 'overflow', 44 | 'overflow-y-visible': 'overflow', 45 | 'overflow-x-scroll': 'overflow', 46 | 'overflow-y-scroll': 'overflow', 47 | 'overscroll-auto': 'overscrollBehavior', 48 | 'overscroll-contain': 'overscrollBehavior', 49 | 'overscroll-none': 'overscrollBehavior', 50 | 'overscroll-y-auto': 'overscrollBehavior', 51 | 'overscroll-y-contain': 'overscrollBehavior', 52 | 'overscroll-y-none': 'overscrollBehavior', 53 | 'overscroll-x-auto': 'overscrollBehavior', 54 | 'overscroll-x-contain': 'overscrollBehavior', 55 | 'overscroll-x-none': 'overscrollBehavior', 56 | static: 'position', 57 | fixed: 'position', 58 | absolute: 'position', 59 | relative: 'position', 60 | sticky: 'position', 61 | visible: 'visibility', 62 | invisible: 'visibility', 63 | 'flex-row': 'flex', 64 | 'flex-row-reverse': 'flex', 65 | 'flex-col': 'flex', 66 | 'flex-col-reverse': 'flex', 67 | 'flex-wrap': 'flex', 68 | 'flex-wrap-reverse': 'flex', 69 | 'flex-nowrap': 'flex', 70 | 'col-auto': 'grid', 71 | 'row-auto': 'grid', 72 | 'grid-flow-row': 'grid', 73 | 'grid-flow-col': 'grid', 74 | 'grid-flow-row-dense': 'grid', 75 | 'grid-flow-col-dense': 'grid', 76 | 'justify-start': 'justifyContent', 77 | 'justify-end': 'justifyContent', 78 | 'justify-center': 'justifyContent', 79 | 'justify-between': 'justifyContent', 80 | 'justify-around': 'justifyContent', 81 | 'justify-evenly': 'justifyContent', 82 | 'justify-items-auto': 'justifyItems', 83 | 'justify-items-start': 'justifyItems', 84 | 'justify-items-end': 'justifyItems', 85 | 'justify-items-center': 'justifyItems', 86 | 'justify-items-stretch': 'justifyItems', 87 | 'justify-self-auto': 'justifySelf', 88 | 'justify-self-start': 'justifySelf', 89 | 'justify-self-end': 'justifySelf', 90 | 'justify-self-center': 'justifySelf', 91 | 'justify-self-stretch': 'justifySelf', 92 | 'content-center': 'alignContent', 93 | 'content-start': 'alignContent', 94 | 'content-end': 'alignContent', 95 | 'content-between': 'alignContent', 96 | 'content-around': 'alignContent', 97 | 'content-evenly': 'alignContent', 98 | 'items-start': 'alignItems', 99 | 'items-end': 'alignItems', 100 | 'items-center': 'alignItems', 101 | 'items-baseline': 'alignItems', 102 | 'items-stretch': 'alignItems', 103 | 'self-auto': 'alignSelf', 104 | 'self-start': 'alignSelf', 105 | 'self-end': 'alignSelf', 106 | 'self-center': 'alignSelf', 107 | 'self-stretch': 'alignSelf', 108 | 'place-content-center': 'placeContent', 109 | 'place-content-start': 'placeContent', 110 | 'place-content-end': 'placeContent', 111 | 'place-content-between': 'placeContent', 112 | 'place-content-around': 'placeContent', 113 | 'place-content-evenly': 'placeContent', 114 | 'place-content-stretch': 'placeContent', 115 | 'place-items-auto': 'placeItems', 116 | 'place-items-start': 'placeItems', 117 | 'place-items-end': 'placeItems', 118 | 'place-items-center': 'placeItems', 119 | 'place-items-stretch': 'placeItems', 120 | 'place-self-auto': 'placeSelf', 121 | 'place-self-start': 'placeSelf', 122 | 'place-self-end': 'placeSelf', 123 | 'place-self-center': 'placeSelf', 124 | 'place-self-stretch': 'placeSelf', 125 | antialiased: 'fontSmoothing', 126 | 'subpixel-antialiased': 'font', 127 | italic: 'font', 128 | 'not-italic': 'font', 129 | 'normal-nums': 'font', 130 | ordinal: 'font', 131 | 'slashed-zero': 'font', 132 | 'lining-nums': 'font', 133 | 'oldstyle-nums': 'font', 134 | 'proportional-nums': 'font', 135 | 'tabular-nums': 'font', 136 | 'diagonal-fractions': 'font', 137 | 'stacked-fractions': 'font', 138 | 'list-inside': 'listStylePosition', 139 | 'list-outside': 'listStylePosition', 140 | 'text-left': 'textAlign', 141 | 'text-center': 'textAlign', 142 | 'text-right': 'textAlign', 143 | 'text-justify': 'textAlign', 144 | underline: 'textDecoration', 145 | 'line-through': 'textDecoration', 146 | 'no-underline': 'textDecoration', 147 | uppercase: 'textTransform', 148 | lowercase: 'textTransform', 149 | capitalize: 'textTransform', 150 | 'normal-case': 'textTransform', 151 | truncate: 'textOverflow', 152 | 'overflow-ellipsis': 'textOverflow', 153 | 'overflow-clip': 'textOverflow', 154 | 'align-baseline': 'verticalAlign', 155 | 'align-top': 'verticalAlign', 156 | 'align-middle': 'verticalAlign', 157 | 'align-bottom': 'verticalAlign', 158 | 'align-text-top': 'verticalAlign', 159 | 'align-text-bottom': 'verticalAlign', 160 | 'whitespace-normal': 'whitespace', 161 | 'whitespace-nowrap': 'whitespace', 162 | 'whitespace-pre': 'whitespace', 163 | 'whitespace-pre-line': 'whitespace', 164 | 'whitespace-pre-wrap': 'whitespace', 165 | 'break-normal': 'wordBreak', 166 | 'break-words': 'wordBreak', 167 | 'break-all': 'wordBreak', 168 | 'bg-fixed': 'background', 169 | 'bg-local': 'background', 170 | 'bg-scroll': 'background', 171 | 'bg-clip-border': 'background', 172 | 'bg-clip-padding': 'background', 173 | 'bg-clip-content': 'background', 174 | 'bg-clip-text': 'background', 175 | 'bg-repeat': 'background', 176 | 'bg-no-repeat': 'background', 177 | 'bg-repeat-x': 'background', 178 | 'bg-repeat-y': 'background', 179 | 'bg-repeat-round': 'background', 180 | 'bg-repeat-space': 'background', 181 | 'border-solid': 'border', 182 | 'border-dashed': 'border', 183 | 'border-dotted': 'border', 184 | 'border-double': 'border', 185 | 'border-none': 'border', 186 | 'border-collapse': 'border', 187 | 'border-separate': 'border', 188 | 'table-auto': 'table', 189 | 'table-fixed': 'table', 190 | transform: 'transform', 191 | 'transform-gpu': 'transform', 192 | 'transform-none': 'transform', 193 | 'appearance-none': 'appearance', 194 | 'pointer-events-none': 'pointerEvents', 195 | 'pointer-events-auto': 'pointerEvents', 196 | 'resize-none': 'resize', 197 | 'resize-y': 'resize', 198 | 'resize-x': 'resize', 199 | resize: 'resize', 200 | 'select-none': 'userSelect', 201 | 'select-text': 'userSelect', 202 | 'select-all': 'userSelect', 203 | 'select-auto': 'userSelect', 204 | 'fill-current': 'fill', 205 | 'stroke-current': 'stroke', 206 | 'sr-only': 'accessibility', 207 | 'not-sr-only': 'accessibility', 208 | }; 209 | 210 | export const dynamicUtilities: Record = { 211 | container: 'container', 212 | space: 'space', 213 | divide: 'divide', 214 | bg: 'background', 215 | from: 'gradientColor', 216 | via: 'gradientColor', 217 | to: 'gradientColor', 218 | border: 'border', 219 | rounded: 'borderRadius', 220 | cursor: 'cursor', 221 | flex: 'flex', 222 | order: 'order', 223 | font: 'font', 224 | h: 'size', 225 | leading: 'lineHeight', 226 | list: 'listStyleType', 227 | m: 'margin', 228 | my: 'margin', 229 | mx: 'margin', 230 | mt: 'margin', 231 | mr: 'margin', 232 | mb: 'margin', 233 | ml: 'margin', 234 | min: 'size', 235 | max: 'size', 236 | object: 'objectPosition', 237 | opacity: 'opacity', 238 | outline: 'outline', 239 | p: 'padding', 240 | py: 'padding', 241 | px: 'padding', 242 | pt: 'padding', 243 | pr: 'padding', 244 | pb: 'padding', 245 | pl: 'padding', 246 | placeholder: 'placeholder', 247 | inset: 'inset', 248 | top: 'position', 249 | right: 'position', 250 | bottom: 'position', 251 | left: 'position', 252 | shadow: 'boxShadow', 253 | ring: 'ring', 254 | fill: 'fill', 255 | stroke: 'stroke', 256 | text: 'text', 257 | tracking: 'letterSpacing', 258 | w: 'size', 259 | z: 'zIndex', 260 | gap: 'gap', 261 | auto: 'grid', 262 | grid: 'grid', 263 | col: 'grid', 264 | row: 'grid', 265 | origin: 'transform', 266 | scale: 'transform', 267 | rotate: 'transform', 268 | translate: 'transform', 269 | skew: 'transform', 270 | transition: 'animation', 271 | ease: 'animation', 272 | duration: 'animation', 273 | delay: 'animation', 274 | animate: 'animation', 275 | }; 276 | -------------------------------------------------------------------------------- /src/helpers/readModule.ts: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import { existsSync } from 'fs-extra'; 3 | 4 | export function readModule(file: string) { 5 | const filePath = path.resolve(file); 6 | if (existsSync(filePath)) { 7 | return require(filePath); 8 | } 9 | return false; 10 | } 11 | -------------------------------------------------------------------------------- /src/helpers/server.ts: -------------------------------------------------------------------------------- 1 | import { resolve } from 'path'; 2 | import http from 'http'; 3 | import connect from 'connect'; 4 | import sirv from 'sirv'; 5 | import { version } from '../../package.json'; 6 | import { Metrics } from '../types/metrics'; 7 | import ClassnameInfo from '../types/classnameInfo'; 8 | 9 | export async function startServer(output: { 10 | metrics: Metrics; 11 | categories: ClassnameInfo[]; 12 | }) { 13 | const getPort = await import('get-port'); 14 | const port = await getPort.default(); 15 | const app = connect(); 16 | const url = `http://localhost:${port}`; 17 | 18 | app.use('/api', async function fooMiddleware(_, res) { 19 | res.write(JSON.stringify(output)); 20 | res.statusCode = 500; 21 | return res.end(); 22 | }); 23 | 24 | app.use(sirv(resolve(__dirname, '../app/dist'), { dev: true, single: true })); 25 | 26 | http.createServer(app).listen(port); 27 | 28 | const openUrl = await import('open') 29 | openUrl.default(url); 30 | 31 | console.log(`TailwindCSS Analysis ${version} report open at ${url}`); 32 | 33 | return app; 34 | } 35 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { resolve, join } from 'path'; 2 | import { readFileSync, writeFileSync } from 'fs'; 3 | import cac from 'cac'; 4 | import spawn from 'cross-spawn'; 5 | import { version } from '../package.json'; 6 | import { readModule } from './helpers/readModule'; 7 | import { analyze } from './analyzer'; 8 | import parseCSS from './parse'; 9 | import { startServer } from './helpers/server'; 10 | 11 | const cli = cac('tailwindcss-analysis'); 12 | 13 | cli 14 | .help() 15 | .version(version) 16 | .option('--open', 'Open in browser', { default: true }) 17 | .option('--json [filepath]', 'Output analysis result file in JSON'); 18 | 19 | const parsed = cli.parse(); 20 | 21 | async function run() { 22 | const root = resolve(process.cwd()); 23 | 24 | if (parsed.options.help) { 25 | return; 26 | } 27 | 28 | try { 29 | const tailwindConfig = readModule(join(root, '/tailwind.config.js')); 30 | if ( 31 | !tailwindConfig || 32 | ((!tailwindConfig.purge || tailwindConfig.purge.length === 0) && 33 | (!tailwindConfig.content || tailwindConfig.content.length === 0)) 34 | ) { 35 | console.log( 36 | 'Ensure that files to `purge/content` are configured in your tailwind config file' 37 | ); 38 | return; 39 | } 40 | } catch { 41 | console.log('tailwind.config.js file does not exist in the project'); 42 | return; 43 | } 44 | 45 | spawn.sync('npx', ['tailwindcss', '--minify', '-o', 'tailwind-output.css'], { 46 | env: { ...process.env, NODE_ENV: 'production' }, 47 | stdio: 'ignore', 48 | }); 49 | 50 | let tailwindCSSFile = ''; 51 | 52 | try { 53 | tailwindCSSFile = readFileSync(join(root, 'tailwind-output.css'), { 54 | encoding: 'utf-8', 55 | }); 56 | } catch { 57 | console.log('Failed to parse and generate the tailwind css output'); 58 | return; 59 | } 60 | 61 | const metrics = await analyze(tailwindCSSFile); 62 | 63 | const categories = parseCSS(tailwindCSSFile); 64 | 65 | const output = { 66 | metrics, 67 | categories, 68 | }; 69 | 70 | if (parsed.options.json) { 71 | let jsonPath = join(root, parsed.options.json); 72 | if (!jsonPath.endsWith('.json')) { 73 | jsonPath = join(jsonPath, 'tailwindcss-analysis-report.json'); 74 | } 75 | 76 | // generate JSON 77 | await writeFileSync(jsonPath, JSON.stringify(output), 'utf-8'); 78 | } 79 | 80 | if (parsed.options.open) { 81 | startServer(output); 82 | } 83 | } 84 | 85 | run(); 86 | -------------------------------------------------------------------------------- /src/parse/index.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | import { toJSON } from 'cssjson'; 3 | import { dynamicUtilities, staticUtilities } from '../helpers/categories'; 4 | import ClassnameInfo from '../types/classnameInfo'; 5 | import camelToTitleCase from '../helpers/camelToTitleCase'; 6 | 7 | export default function parseCSS(cssString: string) { 8 | const json = toJSON(cssString) as Record; 9 | 10 | const categorizedCSS: ClassnameInfo[] = []; 11 | 12 | Object.entries(json?.children || {}).forEach(([classNames]) => { 13 | 14 | classNames.split(',').forEach(className => { 15 | 16 | const info: Partial = {}; 17 | 18 | let name = className.startsWith('.') ? className.slice(1) : className; 19 | 20 | if (name[0] === '!') { 21 | info.important = true; 22 | name = name.slice(1); 23 | } 24 | if (name.startsWith('@media')) { 25 | info.category = '@media'; 26 | } else if (name.includes(':')) { 27 | const variants = name.split(/:/g); 28 | info.prefixes = variants.slice(0, -1); 29 | name = variants.slice(-1)[0]; 30 | } 31 | 32 | info.name = name; 33 | 34 | const [type] = (name.startsWith('-') ? name.slice(1) : name).split('-'); 35 | 36 | if (!info.category) { 37 | if (name in staticUtilities) { 38 | info.category = staticUtilities[name]; 39 | } else if (type in dynamicUtilities && type !== name) { 40 | info.category = dynamicUtilities[type]; 41 | } else if (name.includes('[') && name.includes(']')) { 42 | info.category = 'variable'; 43 | } 44 | } 45 | 46 | info.category = info.category || 'unknown'; 47 | 48 | info.category = camelToTitleCase(info.category); 49 | 50 | categorizedCSS.push(info as ClassnameInfo); 51 | 52 | }) 53 | }); 54 | 55 | return categorizedCSS; 56 | } 57 | -------------------------------------------------------------------------------- /src/types/classnameInfo.ts: -------------------------------------------------------------------------------- 1 | export default interface ClassnameInfo { 2 | name: string; 3 | category: string; 4 | prefixes?: string[]; 5 | important?: boolean; 6 | } 7 | -------------------------------------------------------------------------------- /src/types/metrics.ts: -------------------------------------------------------------------------------- 1 | export interface Metrics { 2 | colors: number; 3 | mediaQueries: number; 4 | selectors: number; 5 | selectorsByAttribute: number; 6 | selectorsByClass: number; 7 | selectorsById: number; 8 | selectorsByPseudo: number; 9 | selectorsByTag: number; 10 | rules: number; // CSS Rules 11 | declarations: number; // Properties 12 | } 13 | -------------------------------------------------------------------------------- /test/index.test.ts: -------------------------------------------------------------------------------- 1 | // test 2 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // see https://www.typescriptlang.org/tsconfig to better understand tsconfigs 3 | "include": ["src", "types", "app/src"], 4 | "exclude": ["test"], 5 | "compilerOptions": { 6 | "module": "esnext", 7 | "lib": ["dom", "esnext", "DOM.Iterable"], 8 | "importHelpers": true, 9 | // output .d.ts declaration files for consumers 10 | "declaration": true, 11 | // output .js.map sourcemap files for consumers 12 | "sourceMap": true, 13 | // match output dir to input dir. e.g. dist/index instead of dist/src/index 14 | // "rootDir": ".", 15 | // stricter type-checking for stronger correctness. Recommended by TS 16 | "strict": true, 17 | // linter checks for common issues 18 | "noImplicitReturns": true, 19 | "noFallthroughCasesInSwitch": true, 20 | // noUnused* overlap with @typescript-eslint/no-unused-vars, can disable if duplicative 21 | "noUnusedLocals": true, 22 | "noUnusedParameters": true, 23 | // use Node's module resolution algorithm, instead of the legacy TS one 24 | "moduleResolution": "node", 25 | // transpile JSX to React.createElement 26 | "jsx": "react", 27 | // interop between ESM and CJS modules. Recommended by TS 28 | "esModuleInterop": true, 29 | // significant perf increase by skipping checking .d.ts files, particularly those in node_modules. Recommended by TS 30 | "skipLibCheck": true, 31 | // error out if import and file system have a casing mismatch. Recommended by TS 32 | "forceConsistentCasingInFileNames": true, 33 | 34 | "noEmit": true, 35 | "resolveJsonModule": true, 36 | "target": "ES2020", 37 | "allowJs": false, 38 | "allowSyntheticDefaultImports": true, 39 | "isolatedModules": true, 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /vite.config.mts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | import react from '@vitejs/plugin-react'; 3 | import tailwindcss from '@tailwindcss/vite'; 4 | 5 | export default defineConfig({ 6 | plugins: [react(), tailwindcss()], 7 | root: './app', 8 | }); 9 | --------------------------------------------------------------------------------