From 226840a787bd68b7e2e095c855bd5e5f690a753a Mon Sep 17 00:00:00 2001 From: medevod Date: Sun, 6 Sep 2026 09:42:08 +0000 Subject: [PATCH 1/8] chore: build & packaging fixes, plugin cleanup, npm migration, and roadmap --- .github/actions/build-action/action.yml | 8 +- .github/workflows/npm-publish-v2.yml | 9 +- ROADMAP.md | 103 + package-lock.json | 5246 +++++++++++++++++++++++ package.json | 43 +- postcss.config.cjs | 9 - postcss.config.js | 2 - src/mgplus.ts | 11 +- src/plugins/main.ts | 188 +- src/plugins/mgCollapse.ts | 46 +- src/plugins/mgDarkMode.ts | 88 +- src/plugins/mgDropdown.ts | 131 +- src/plugins/mgModal.ts | 85 +- src/plugins/mgNav.ts | 51 +- src/plugins/mgTabs.ts | 104 +- tsconfig.json | 1 + tsconfig.lib.json | 15 + vite.lib.config.ts | 4 +- 18 files changed, 5867 insertions(+), 277 deletions(-) create mode 100644 ROADMAP.md create mode 100644 package-lock.json delete mode 100644 postcss.config.cjs create mode 100644 tsconfig.lib.json diff --git a/.github/actions/build-action/action.yml b/.github/actions/build-action/action.yml index 768d8ee..17fbb46 100644 --- a/.github/actions/build-action/action.yml +++ b/.github/actions/build-action/action.yml @@ -1,5 +1,5 @@ name: Build lib and demo page Action -desctipion: "Build and test the lib and demo page" +description: "Build and test the lib and demo page" inputs: stage: description: "Current stage" @@ -21,10 +21,10 @@ outputs: runs: using: "composite" steps: - - name: Setup Node 18.x - uses: actions/setup-node@v1 + - name: Setup Node 20.x + uses: actions/setup-node@v4 with: - node-version: "18.x" + node-version: "20.x" - name: get-npm-version id: package-version uses: martinbeentjes/npm-get-version-action@v1.3.1 diff --git a/.github/workflows/npm-publish-v2.yml b/.github/workflows/npm-publish-v2.yml index eb27031..c535a33 100644 --- a/.github/workflows/npm-publish-v2.yml +++ b/.github/workflows/npm-publish-v2.yml @@ -7,16 +7,17 @@ jobs: deploy: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: "build lib and deploy demo" uses: ./.github/actions/build-action id: "build_action" with: stage: "release" - - uses: actions/setup-node@v1 + - uses: actions/setup-node@v4 with: - node-version: 14 + node-version: 20 registry-url: "https://registry.npmjs.org" - - run: yarn publish + - run: npm publish --access public env: NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }} + diff --git a/ROADMAP.md b/ROADMAP.md new file mode 100644 index 0000000..6be9ad5 --- /dev/null +++ b/ROADMAP.md @@ -0,0 +1,103 @@ +# MgPlus (Mg+) Roadmap + +This document outlines the strategic roadmap, maintenance milestones, and refactoring priorities for **MgPlus**, a micro CSS library designed to build elegant web pages efficiently. + +--- + +## 🎯 Project Vision + +* **Ultra-lightweight**: Under 70 KB minified CSS, zero runtime JS dependencies. +* **Plug & Play**: Minimalist vanilla JS plugins for essential interactivity with zero configuration. +* **Developer Friendly**: Seamless CDN standalone usage and modern package exports for bundlers (Vite, Webpack, Rollup). +* **Standards-compliant**: Progressive enhancement, accessible semantics (WCAG), and modern CSS architecture. + +--- + +## 📍 Milestones & Status + +``` +[x] v1.5: Stability, Packaging & Standalone Priority (Current) +└── [ ] v1.6: Testing, Accessibility & SCSS Modernization + └── [ ] v1.7: Modular Builds & Component Enhancements + └── [ ] v2.0: Next-Gen CSS Architecture (@layer & light-dark) +``` + +--- + +### ✅ Milestone 1: v1.5 — Stability, Packaging & Standalone Priority + +*Goal: Stabilize the build pipeline, prioritize the standalone CDN bundle, clean up dependencies, and fix plugin bugs.* + +- [x] **Package Manager & Dependencies**: + - Standardized on **npm** (`package-lock.json` committed, yarn references removed). + - Moved demo-only dependency (`@jaames/iro`) to `devDependencies` for zero-dependency runtime. + - Fixed `repository` URL and package metadata (`files` list matching case). +- [x] **Packaging & Exports**: + - Corrected entry points in `package.json` (`main`, `module`, `types`, `style`, `unpkg`, `jsdelivr`). + - Added modern conditional `exports` map for bundlers. + - Dedicated `tsconfig.lib.json` fixing DOM type errors during TypeScript `.d.ts` declaration generation. + - Cleaned up duplicate PostCSS configs (`postcss.config.cjs` removed, unused Node `os` import stripped). +- [x] **Plugin Fixes & Refactoring**: + - **Auto-registration**: Automatic script execution on browser load supporting both `?register=` and `?plugins=` query parameters. + - **mgCollapse**: Corrected typo (`registerCollapses`, with deprecated `registergCollapses` alias) and fixed ARIA attribute management. + - **mgDropdown**: Replaced per-element document click listeners with a single delegated listener (eliminating memory leaks) and added `Escape` key dismissal. + - **mgModal**: Added support for multiple close buttons, backdrop click dismissal, `Escape` key listener, and dialog ARIA roles. + - **mgDarkMode**: Fixed theme detection to respect system `prefers-color-scheme`, added `localStorage` persistence, and exported theme utility helpers. + - **mgNav & mgTabs**: Improved nested element handling using `closest()`, proper ARIA attributes (`role="tab"`, `aria-selected`), and strict typing. + - Added initialization guards across all plugins to prevent duplicate listener bindings. + - Removed lingering `console.log` statements from production bundles. +- [x] **CI/CD Modernization**: + - Upgraded GitHub Actions to `checkout@v4`, `setup-node@v4`, and Node 20 LTS. + - Switched release workflows to `npm publish`. + +--- + +### 🚧 Milestone 2: v1.6 — Testing, Accessibility & SCSS DX + +*Goal: Add automated unit test coverage, improve keyboard navigation/a11y, and modernize SCSS modules.* + +- [ ] **Automated Testing Suite**: + - Setup [Vitest](https://vitest.dev/) with `jsdom` or `happy-dom` for automated headless DOM testing. + - Write test suites for all plugins (`mgDropdown`, `mgModal`, `mgTabs`, `mgDarkMode`, `mgCollapse`, `mgNav`). +- [ ] **Accessibility (a11y) Polish**: + - Focus trap inside `mgModal` when open, restoring focus to trigger element on close. + - Full keyboard navigation for `mgTabs` (Arrow keys `Left`/`Right`, `Home`, `End`). + - Enhanced ARIA live regions for alerts and notifications. +- [ ] **SCSS Modernization**: + - Migrate from deprecated `@import` to Dart Sass `@use` and `@forward`. + - Eliminate top-level `/* stylelint-disable */` in `mg-variables.scss` and resolve underlying Stylelint rules. +- [ ] **Bundle Size Monitoring**: + - Integrate `size-limit` into GitHub Actions to enforce strict size thresholds on PRs. + +--- + +### 🔮 Milestone 3: v1.7 — Modular Builds & Component Enhancements + +*Goal: Provide fine-grained component imports and additional common UI primitives.* + +- [ ] **Modular CSS & SCSS Exports**: + - Export standalone stylesheets: `mgplus/css/grid.css`, `mgplus/css/buttons.css`, `mgplus/css/core.css`. + - Allow selective SCSS `@use "mgplus/scss/grid"`. +- [ ] **New UI Primitives**: + - Toast / Snackbars component with auto-dismiss timers. + - Accordion component with single-expand mode built upon `mgCollapse`. + - Skeleton loading placeholders. +- [ ] **Documentation / Playground Enhancements**: + - Interactive component playground with live CSS variable tweak controls. + - Copy-to-clipboard code snippets for all components. + +--- + +### 🚀 Milestone 4: v2.0 — Next-Gen Modern CSS Architecture + +*Goal: Modernize the core architecture leveraging native modern CSS baseline features.* + +- [ ] **CSS Cascade Layers (`@layer`)**: + - Structure CSS into `@layer reset, base, components, utilities;` to cleanly eliminate specificity clashes without `!important`. +- [ ] **Native CSS Nesting**: + - Leverage native browser CSS nesting, simplifying build processing. +- [ ] **Modern Color Functions**: + - Adopt native CSS `light-dark()` for zero-JS initial dark mode rendering. + - Modern color spaces (`oklch` / `color-mix()`) for dynamic palettes. +- [ ] **Optional Web Components / Custom Elements**: + - Provide optional ``, ``, `` custom elements for zero-boilerplate usage in any frontend framework (React, Vue, Svelte, Angular, Astro). diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..2a917ed --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5246 @@ +{ + "name": "mgplus", + "version": "1.4.5", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "mgplus", + "version": "1.4.5", + "license": "MIT", + "dependencies": { + "@jaames/iro": "^5.5.2" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@types/node": "^22.13.9", + "autoprefixer": "^10.4.20", + "dotenv": "^16.4.7", + "eslint": "^10.10.0", + "globals": "^17.12.0", + "postcss": "^8.5.3", + "sass": "^1.71.1", + "stylelint": "^16.15.0", + "stylelint-config-standard-scss": "^14.0.0", + "typescript": "^5.8.2", + "typescript-eslint": "^8.69.0", + "vite": "^5.4.2", + "vite-plugin-dts": "^4.5.3", + "vite-plugin-stylelint": "^6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cacheable/memory": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.2.0.tgz", + "integrity": "sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/utils": "^2.5.0", + "@keyv/bigmap": "^1.3.1", + "hookified": "^1.15.1", + "keyv": "^5.6.0" + } + }, + "node_modules/@cacheable/utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.5.0.tgz", + "integrity": "sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hashery": "^1.5.1", + "keyv": "^5.6.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.10.tgz", + "integrity": "sha512-xBja6gaAaH2R2c7eNyl0TY4dhnnZ2uhj+KXpLdEQ6M/wuk9bYFZM8wY0ykw3VO4TgEJ56KGlerXS/9KBKVR/Cg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@dual-bundle/import-meta-resolve": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.2.1.tgz", + "integrity": "sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/JounQin" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", + "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/js": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.3.tgz", + "integrity": "sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@irojs/iro-core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@irojs/iro-core/-/iro-core-1.2.1.tgz", + "integrity": "sha512-p2OvsBSSmidsDsTSkID6jEyXDF7lcyxPrkh3qBzasBZFpjkYd6kZ3yMWai3MlAaQ3F7li/Et7rSJVV09Fpei+A==", + "license": "MPL-2.0" + }, + "node_modules/@jaames/iro": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@jaames/iro/-/iro-5.5.2.tgz", + "integrity": "sha512-Fbi5U4Vdkw6UsF+R3oMlPONqkvUDMkwzh+mX718gQsDFt3+1r1jvGsrfCbedmXAAy0WsjDHOrefK0BkDk99TQg==", + "license": "MPL-2.0", + "dependencies": { + "@irojs/iro-core": "^1.2.1", + "preact": "^10.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@keyv/bigmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.1.tgz", + "integrity": "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hashery": "^1.4.0", + "hookified": "^1.15.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "keyv": "^5.6.0" + } + }, + "node_modules/@keyv/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@microsoft/api-extractor": { + "version": "7.59.0", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.59.0.tgz", + "integrity": "sha512-KDYV8kSVjmG8JJWVg1f1aKxteNG1IQ44D07Rjhlcci8wlqrSFNhUfgv7dJhwT0W2h3NDIL5Vz2f+/DfO4OpDHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/api-extractor-model": "7.33.11", + "@microsoft/tsdoc": "~0.16.0", + "@microsoft/tsdoc-config": "~0.18.1", + "@rushstack/node-core-library": "5.24.0", + "@rushstack/rig-package": "0.7.3", + "@rushstack/terminal": "0.24.3", + "@rushstack/ts-command-line": "5.3.13", + "diff": "~8.0.2", + "minimatch": "10.2.3", + "resolve": "~1.22.1", + "semver": "~7.7.4", + "source-map": "~0.6.1", + "typescript": "5.9.3" + }, + "bin": { + "api-extractor": "bin/api-extractor" + }, + "engines": { + "node": ">=20.9.0" + } + }, + "node_modules/@microsoft/api-extractor-model": { + "version": "7.33.11", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.33.11.tgz", + "integrity": "sha512-iDu1AtuRC2Z8XVs2SieZieVavF1FXPBX1C9pMexJh8Dx/Dd/3ZZ4nRQp/PU2Vk2rUHWuBz1wOyL4DcuhVnBXwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "~0.16.0", + "@microsoft/tsdoc-config": "~0.18.1", + "@rushstack/node-core-library": "5.24.0" + }, + "engines": { + "node": ">=20.9.0" + } + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz", + "integrity": "sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.18.1.tgz", + "integrity": "sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "0.16.0", + "ajv": "~8.18.0", + "jju": "~1.4.0", + "resolve": "~1.22.2" + } + }, + "node_modules/@microsoft/tsdoc-config/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", + "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.6.0", + "@parcel/watcher-darwin-arm64": "2.6.0", + "@parcel/watcher-darwin-x64": "2.6.0", + "@parcel/watcher-freebsd-x64": "2.6.0", + "@parcel/watcher-linux-arm-glibc": "2.6.0", + "@parcel/watcher-linux-arm-musl": "2.6.0", + "@parcel/watcher-linux-arm64-glibc": "2.6.0", + "@parcel/watcher-linux-arm64-musl": "2.6.0", + "@parcel/watcher-linux-x64-glibc": "2.6.0", + "@parcel/watcher-linux-x64-musl": "2.6.0", + "@parcel/watcher-win32-arm64": "2.6.0", + "@parcel/watcher-win32-x64": "2.6.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz", + "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz", + "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz", + "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz", + "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz", + "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz", + "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz", + "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz", + "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz", + "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz", + "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz", + "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", + "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", + "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.1.tgz", + "integrity": "sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.1.tgz", + "integrity": "sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.1.tgz", + "integrity": "sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.1.tgz", + "integrity": "sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.1.tgz", + "integrity": "sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.1.tgz", + "integrity": "sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.1.tgz", + "integrity": "sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.1.tgz", + "integrity": "sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.1.tgz", + "integrity": "sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.1.tgz", + "integrity": "sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.1.tgz", + "integrity": "sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.1.tgz", + "integrity": "sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.1.tgz", + "integrity": "sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.1.tgz", + "integrity": "sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.1.tgz", + "integrity": "sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.1.tgz", + "integrity": "sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.1.tgz", + "integrity": "sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.1.tgz", + "integrity": "sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.1.tgz", + "integrity": "sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.1.tgz", + "integrity": "sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.1.tgz", + "integrity": "sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.1.tgz", + "integrity": "sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.1.tgz", + "integrity": "sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.1.tgz", + "integrity": "sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.1.tgz", + "integrity": "sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rushstack/node-core-library": { + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.24.0.tgz", + "integrity": "sha512-g/Z47ZwARn/VkTnHcyJslrR26erRf1G5JbqPlfGZGBCrOcrEt8fTQXXDVhUDDNl/g/v3TXI1dNiAAT5FEks8BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "~8.20.0", + "ajv-draft-04": "~1.0.0", + "ajv-formats": "~3.0.1", + "fs-extra": "~11.3.0", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.7.4" + }, + "engines": { + "node": ">=20.9.0" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/problem-matcher": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@rushstack/problem-matcher/-/problem-matcher-0.2.1.tgz", + "integrity": "sha512-gulfhBs6n+I5b7DvjKRfhMGyUejtSgOHTclF/eONr8hcgF1APEDjhxIsfdUYYMzC3rvLwGluqLjbwCFZ8nxrog==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/rig-package": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.7.3.tgz", + "integrity": "sha512-aAA518n6wxxjCfnTAOjQnm7ngNE0FVHxHAw2pxKlIhxrMn0XQjGcXKF0oKWpjBgJOmsaJpVob/v+zr3zxgPWuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jju": "~1.4.0", + "resolve": "~1.22.1" + } + }, + "node_modules/@rushstack/terminal": { + "version": "0.24.3", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.24.3.tgz", + "integrity": "sha512-KxphDhPGC4xDrKg8O4yrWCEpPMi87aJc1iycXqMVh1dLgV0M34hiH9ZTgWjBRmcrT/OIHoOeWf48npcQFzgp+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rushstack/node-core-library": "5.24.0", + "@rushstack/problem-matcher": "0.2.1", + "supports-color": "~8.1.1" + }, + "engines": { + "node": ">=20.9.0" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/terminal/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@rushstack/ts-command-line": { + "version": "5.3.13", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.3.13.tgz", + "integrity": "sha512-+jNbxhh8CkrZYxMk9X3GRYM2+Myr1xCCj+eHbJ9Vp+PCdNHS0TUl5QQFT6UbM/aTFRCzs5jiBTKYzBRpe5uYbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rushstack/terminal": "0.24.3", + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "string-argv": "~0.3.1" + }, + "engines": { + "node": ">=20.9.0" + } + }, + "node_modules/@rushstack/ts-command-line/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.20.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", + "integrity": "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.69.0.tgz", + "integrity": "sha512-t5jQTKPIgVW1PE6dR6H6Qz5gm8zjMlX5/2gRaOGd9eO6V7J+tQc6iWKukEe7dY8u9HyYasQ0yfF0/FSSTEO2gA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.69.0", + "@typescript-eslint/type-utils": "8.69.0", + "@typescript-eslint/utils": "8.69.0", + "@typescript-eslint/visitor-keys": "8.69.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.69.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.69.0.tgz", + "integrity": "sha512-l4b0DhWioGg6Gt2ebGlvfkFMOjRsauxtsnDRwUSRX1qHq3HdTfQHV8wW9zEXeciai6HfeaKOedQn2Zoofx3WBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.69.0", + "@typescript-eslint/types": "8.69.0", + "@typescript-eslint/typescript-estree": "8.69.0", + "@typescript-eslint/visitor-keys": "8.69.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.69.0.tgz", + "integrity": "sha512-yi4obFrHMmnsesWehHbkg9zMA7Jt8cXT+mKM08G999pH1yT6nqgsHx7MYm0uY1wAj8CqiBXYRJ7WAT0QdQHQXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.69.0", + "@typescript-eslint/types": "^8.69.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.69.0.tgz", + "integrity": "sha512-ewfspqWvSxKSOaplqAUNbaSFO0eB6w1EtQ+esfYFRm3614Ty4uNtExkcbgd6nWsXphbqKyf9ZYdbZdv2xEoWEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.69.0", + "@typescript-eslint/visitor-keys": "8.69.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.69.0.tgz", + "integrity": "sha512-xNqK7YTDZsLniQMV/4rpFR8Z5JlqeRvVjuG1YgF/mdPVH84HSD19L8CczMA0qg2RfwEV231GHH3VnToJDo4MfQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.69.0.tgz", + "integrity": "sha512-ZfoJAVg3JZndQEpEl9petVlxau3lRuElc4HRMuAlLCf8to04/iHz692RUSNmXKDjEuJmIL+KZ2/BsOcBc16dsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.69.0", + "@typescript-eslint/typescript-estree": "8.69.0", + "@typescript-eslint/utils": "8.69.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.69.0.tgz", + "integrity": "sha512-K3VrubUPhlo9VDBS6QdI8YB5j7ClpqLRdefcz6PFrhnwicehBweqQ9Evhl4l+FYz0HdDmMqIiSX0aldGRYtDCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.69.0.tgz", + "integrity": "sha512-AdFkgqck3Vudb/kWnxlyafU/4aBhHrbQ9locP2N4psXTy5mOBg0SHJumnLvx7r6g1gV4DKvUFwV2nJZBoqOD8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.69.0", + "@typescript-eslint/tsconfig-utils": "8.69.0", + "@typescript-eslint/types": "8.69.0", + "@typescript-eslint/visitor-keys": "8.69.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.69.0.tgz", + "integrity": "sha512-tUbx60BBqQa31kXF5MCsOOLL5E/WzUuxIn7YpAvq+eaUlqvk8/NXnXMBNAdLCr0icjkzem7iUA5QqWHe/hJ1aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.69.0", + "@typescript-eslint/types": "8.69.0", + "@typescript-eslint/typescript-estree": "8.69.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.69.0.tgz", + "integrity": "sha512-+rmdgPA+EXkNgKYvHvFfhrs35utXbwaC5PGpDquSXcoXQDKUA5UjV0LmTucG/4JXkM31BTu4TilHtrN8IVBe8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.69.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", + "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.28" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", + "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", + "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.42.tgz", + "integrity": "sha512-2Ye1ilMtKXxl8qZUrQ5j0CdgenFp/HFQmta6rfRyfEsTG69L6Wk+tWuNoHYHMx9E8tF2Slvdg1FuwDvAXdy1LQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@vue/shared": "3.5.42", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.42.tgz", + "integrity": "sha512-qbhQZEFmycr+ni/qyuccS4sucNN7VAbDfbkvNxWOX2VfgFm90MNs3/UhRNKoPMEIVn0F8gdlYjLPvqxHwHeQOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.42", + "@vue/shared": "3.5.42" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/language-core": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.0.tgz", + "integrity": "sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "~2.4.11", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^0.4.9", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/language-core/node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@vue/language-core/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.42.tgz", + "integrity": "sha512-2rPxex1jQf4jvl9MOHl6YaXCPcrNqz/FstMOEh3QWY+/OME9nQTvl9WYeCwhW7AFjaR0SnngZGlp/wkR6rkI6g==", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/alien-signals": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.14.tgz", + "integrity": "sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/autoprefixer": { + "version": "10.5.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.4.tgz", + "integrity": "sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.6", + "caniuse-lite": "^1.0.30001806", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.20", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.20.tgz", + "integrity": "sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/brace-expansion/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/cacheable": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.5.0.tgz", + "integrity": "sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/memory": "^2.2.0", + "@cacheable/utils": "^2.5.0", + "hookified": "^1.15.0", + "keyv": "^5.6.0", + "qified": "^0.10.1" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.10.0.tgz", + "integrity": "sha512-AidJptpBJmjTclAp9BkLwJi0T93fo5epJnbaZslpg6QVzpHjAiveF55mE9AcUJiGMqRHgMDY8soMsQtuNYMHfw==", + "dev": true, + "license": "MIT" + }, + "node_modules/compare-versions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", + "dev": true, + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz", + "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-functions-list": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.3.3.tgz", + "integrity": "sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", + "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.416", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.416.tgz", + "integrity": "sha512-K6bvB2BjnNrugtIih6ewlbBI9DXa976jIdiIlRLHhBoEI9a4JaQjjHyF+A1IQI543aQYR4LnmOrT/K5fZj0aPA==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.10.0.tgz", + "integrity": "sha512-NPXn6r5zl4uET1DAVPaOwzX3rut4c0wcmw3dWJAfOsTM5+TogXo0DDjz8pwm/hL8cyVNpHqeK4JpN0NjnyFFNw==", + "dev": true, + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.7.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.3", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "11.1.5 || >11.1.6 <12", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exsolve": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.1.tgz", + "integrity": "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.6.tgz", + "integrity": "sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", + "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-11.1.5.tgz", + "integrity": "sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^6.1.23" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "6.1.23", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.23.tgz", + "integrity": "sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cacheable": "^2.5.0", + "flatted": "^3.4.2", + "hookified": "^1.15.0" + } + }, + "node_modules/flatted": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs-extra": { + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.6.tgz", + "integrity": "sha512-w8ZNZr2mKIc7qeNaQ9AVPT1+iFaI+Avd4xudVOvdDJ8VytREi1Ft5Ih7hd9jjehod8vAM5GMsfQ/TpPf4EyoEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/globals": { + "version": "17.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.12.0.tgz", + "integrity": "sha512-cezEd/DTyyht9cvSSURyygXPfy04GtWO/5e6ZPvH7fCtjKz9PYOmuawphw1Ctd1f6C+5JypXfGD7ahNMXvevBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "dev": true, + "license": "MIT" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hashery": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.5.1.tgz", + "integrity": "sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.15.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hookified": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz", + "integrity": "sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ignore": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.7.tgz", + "integrity": "sha512-dML0wP6oak21rsNYCJpJB6O1BJIEwNpGrTw0URPfAk4hm0e3pRfCtzkfB6olBcXcVlU2rouCyz7lCyRB0OMVCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", + "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.1.0.tgz", + "integrity": "sha512-bUi/yjmtKYcRVUtWRGr0UA6xEFh2I6zWUwMrUXB3s7bmYCaZ8a+0ZsTRkrawh/mzlSD1Y0Ph8bp/U+TvBpWDNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/known-css-properties": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", + "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/local-pkg": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.2.1.tgz", + "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/minimatch": { + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.3.tgz", + "integrity": "sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mlly": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", + "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-releases": { + "version": "2.0.54", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.54.tgz", + "integrity": "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", + "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.4", + "exsolve": "^1.0.8", + "pathe": "^2.0.3" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-safe-parser": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-scss": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.29" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz", + "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/preact": { + "version": "10.29.8", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.8.tgz", + "integrity": "sha512-ej2aVZ+vZ8WO7tvlQWRM9N63A0KzF9q4mWJfDUHgYaIofWY9hu74QdnQrjoPMmZi2/nZ5gN0bJCQF49xQqx09Q==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + }, + "peerDependencies": { + "preact-render-to-string": ">=5" + }, + "peerDependenciesMeta": { + "preact-render-to-string": { + "optional": true + } + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qified": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/qified/-/qified-0.10.1.tgz", + "integrity": "sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^2.1.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/qified/node_modules/hookified": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-2.2.0.tgz", + "integrity": "sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==", + "dev": true, + "license": "MIT" + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.1.tgz", + "integrity": "sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.63.1", + "@rollup/rollup-android-arm64": "4.63.1", + "@rollup/rollup-darwin-arm64": "4.63.1", + "@rollup/rollup-darwin-x64": "4.63.1", + "@rollup/rollup-freebsd-arm64": "4.63.1", + "@rollup/rollup-freebsd-x64": "4.63.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.63.1", + "@rollup/rollup-linux-arm-musleabihf": "4.63.1", + "@rollup/rollup-linux-arm64-gnu": "4.63.1", + "@rollup/rollup-linux-arm64-musl": "4.63.1", + "@rollup/rollup-linux-loong64-gnu": "4.63.1", + "@rollup/rollup-linux-loong64-musl": "4.63.1", + "@rollup/rollup-linux-ppc64-gnu": "4.63.1", + "@rollup/rollup-linux-ppc64-musl": "4.63.1", + "@rollup/rollup-linux-riscv64-gnu": "4.63.1", + "@rollup/rollup-linux-riscv64-musl": "4.63.1", + "@rollup/rollup-linux-s390x-gnu": "4.63.1", + "@rollup/rollup-linux-x64-gnu": "4.63.1", + "@rollup/rollup-linux-x64-musl": "4.63.1", + "@rollup/rollup-openbsd-x64": "4.63.1", + "@rollup/rollup-openharmony-arm64": "4.63.1", + "@rollup/rollup-win32-arm64-msvc": "4.63.1", + "@rollup/rollup-win32-ia32-msvc": "4.63.1", + "@rollup/rollup-win32-x64-gnu": "4.63.1", + "@rollup/rollup-win32-x64-msvc": "4.63.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sass": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.103.1.tgz", + "integrity": "sha512-9icZURbP51S6S0QGoyaeqk9uB06GNWxsFYWfH5RgpFgqK5FA8tJcM3AdVxrZEVJ7dz+L87nG95gBKf4VuaMHGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^5.0.0", + "immutable": "^5.1.5", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=20.19.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint": { + "version": "16.26.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.26.1.tgz", + "integrity": "sha512-v20V59/crfc8sVTAtge0mdafI3AdnzQ2KsWe6v523L4OA1bJO02S7MO2oyXDCS6iWb9ckIPnqAFVItqSBQr7jw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-syntax-patches-for-csstree": "^1.0.19", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3", + "@csstools/selector-specificity": "^5.0.0", + "@dual-bundle/import-meta-resolve": "^4.2.1", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^9.0.0", + "css-functions-list": "^3.2.3", + "css-tree": "^3.1.0", + "debug": "^4.4.3", + "fast-glob": "^3.3.3", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^11.1.1", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.3.1", + "ignore": "^7.0.5", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.37.0", + "mathml-tag-names": "^2.1.3", + "meow": "^13.2.0", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.5.6", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-safe-parser": "^7.0.1", + "postcss-selector-parser": "^7.1.0", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", + "supports-hyperlinks": "^3.2.0", + "svg-tags": "^1.0.0", + "table": "^6.9.0", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "stylelint": "bin/stylelint.mjs" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/stylelint-config-recommended": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.1.tgz", + "integrity": "sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.1.0" + } + }, + "node_modules/stylelint-config-recommended-scss": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-14.1.0.tgz", + "integrity": "sha512-bhaMhh1u5dQqSsf6ri2GVWWQW5iUjBYgcHkh7SgDDn92ijoItC/cfO/W+fpXshgTQWhwFkP1rVcewcv4jaftRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-scss": "^4.0.9", + "stylelint-config-recommended": "^14.0.1", + "stylelint-scss": "^6.4.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "postcss": "^8.3.3", + "stylelint": "^16.6.1" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + } + } + }, + "node_modules/stylelint-config-standard": { + "version": "36.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-36.0.1.tgz", + "integrity": "sha512-8aX8mTzJ6cuO8mmD5yon61CWuIM4UD8Q5aBcWKGSf6kg+EC3uhB+iOywpTK4ca6ZL7B49en8yanOFtUW0qNzyw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "dependencies": { + "stylelint-config-recommended": "^14.0.1" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.1.0" + } + }, + "node_modules/stylelint-config-standard-scss": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-14.0.0.tgz", + "integrity": "sha512-6Pa26D9mHyi4LauJ83ls3ELqCglU6VfCXchovbEqQUiEkezvKdv6VgsIoMy58i00c854wVmOw0k8W5FTpuaVqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "stylelint-config-recommended-scss": "^14.1.0", + "stylelint-config-standard": "^36.0.1" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "postcss": "^8.3.3", + "stylelint": "^16.11.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + } + } + }, + "node_modules/stylelint-scss": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.14.0.tgz", + "integrity": "sha512-ZKmHMZolxeuYsnB+PCYrTpFce0/QWX9i9gh0hPXzp73WjuIMqUpzdQaBCrKoLWh6XtCFSaNDErkMPqdjy1/8aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^3.0.1", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.37.0", + "mdn-data": "^2.25.0", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-selector-parser": "^7.1.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.8.2" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", + "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/table": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.69.0.tgz", + "integrity": "sha512-B3MltX0VqjUBNEe3b3sSuiRbfa6XrfHFtBiPamjT5AsW/dfq+y+bc0wyuS9DxAS1LyzCxRp2+rxzpLUvqM2BvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.69.0", + "@typescript-eslint/parser": "8.69.0", + "@typescript-eslint/typescript-estree": "8.69.0", + "@typescript-eslint/utils": "8.69.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/ufo": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz", + "integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-dts": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-4.5.4.tgz", + "integrity": "sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/api-extractor": "^7.50.1", + "@rollup/pluginutils": "^5.1.4", + "@volar/typescript": "^2.4.11", + "@vue/language-core": "2.2.0", + "compare-versions": "^6.1.1", + "debug": "^4.4.0", + "kolorist": "^1.8.0", + "local-pkg": "^1.0.0", + "magic-string": "^0.30.17" + }, + "peerDependencies": { + "typescript": "*", + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite-plugin-stylelint": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/vite-plugin-stylelint/-/vite-plugin-stylelint-6.3.0.tgz", + "integrity": "sha512-46acce1cudnRu+V5HN8STc26IiRpyR1MCgdOUVK0kvrH+NkweWAi/rf3wVapKHvgdOTKWZvGMcrkK/DuMqZAxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.4.0", + "debug": "^4.4.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/stylelint": "^13.0.0", + "postcss": "^7.0.0 || ^8.0.0", + "rolldown": "^1.0.0-0 || ^1.0.0", + "rollup": "^2.0.0 || ^3.0.0 || ^4.0.0", + "stylelint": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0", + "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@types/stylelint": { + "optional": true + }, + "postcss": { + "optional": true + }, + "rolldown": { + "optional": true + }, + "rollup": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.2.0.tgz", + "integrity": "sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==", + "dev": true, + "license": "MIT" + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json index 1122185..af7cc68 100644 --- a/package.json +++ b/package.json @@ -4,42 +4,61 @@ "version": "1.4.5", "description": "mgplus a micro CSS library", "homepage": "https://evodim.github.io/mgplus", - "repository": "https://github.com/Evodim/mgplus", + "repository": "https://github.com/mgpluscss/mgplus", "license": "MIT", "author": "evodim", "type": "module", - "main": "dist/index.js", - "module": "dist/index.mjs", + "main": "dist/mgplus-vanilla.umd.cjs", + "module": "dist/mgplus-vanilla.js", + "types": "dist/types/mgplus.d.ts", "style": "dist/mgplus.css", + "unpkg": "dist/mgplus-vanilla.umd.cjs", + "jsdelivr": "dist/mgplus-vanilla.umd.cjs", + "exports": { + ".": { + "types": "./dist/types/mgplus.d.ts", + "import": "./dist/mgplus-vanilla.js", + "require": "./dist/mgplus-vanilla.umd.cjs", + "default": "./dist/mgplus-vanilla.umd.cjs" + }, + "./css": "./dist/mgplus.css", + "./dist/*": "./dist/*", + "./package.json": "./package.json" + }, "scripts": { "dev": "vite", "build": "vite build", "build:demo": "vite build --outDir demo_build", "build:lib": "vite build --config vite.lib.config.ts", "preview": "vite preview", - "lint": "stylelint **/*.scss", - "lint:fix": "stylelint **/*.scss --fix" + "typecheck": "tsc --noEmit -p tsconfig.json", + "lint:css": "stylelint **/*.scss", + "lint:css:fix": "stylelint **/*.scss --fix", + "lint:js": "eslint src/", + "lint": "npm run lint:css && npm run lint:js", + "test": "npm run typecheck && npm run lint && npm run build:lib" }, "devDependencies": { + "@eslint/js": "^10.0.1", + "@jaames/iro": "^5.5.2", "@types/node": "^22.13.9", "autoprefixer": "^10.4.20", "dotenv": "^16.4.7", + "eslint": "^10.10.0", + "globals": "^17.12.0", "postcss": "^8.5.3", "sass": "^1.71.1", "stylelint": "^16.15.0", "stylelint-config-standard-scss": "^14.0.0", "typescript": "^5.8.2", + "typescript-eslint": "^8.69.0", "vite": "^5.4.2", "vite-plugin-dts": "^4.5.3", "vite-plugin-stylelint": "^6.0.0" }, - "dependencies": { - "@jaames/iro": "^5.5.2" - }, "files": [ "dist", - "README.md", - "LICENCE" - ], - "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" + "readme.md", + "LICENSE" + ] } diff --git a/postcss.config.cjs b/postcss.config.cjs deleted file mode 100644 index 2253339..0000000 --- a/postcss.config.cjs +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = { - plugins: [ - require("postcss-url")({ - url: "inline", // Inline all assets - maxSize: 20, // Set size threshold to 20 KB (optional) - fallback: "copy", // Fallback to copy assets if too large - }), - ], -}; diff --git a/postcss.config.js b/postcss.config.js index 7a491aa..7738160 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,5 +1,3 @@ -import { version } from "os"; - export default { plugins: { autoprefixer: {}, diff --git a/src/mgplus.ts b/src/mgplus.ts index f6fa1f3..017d7ee 100644 --- a/src/mgplus.ts +++ b/src/mgplus.ts @@ -1,8 +1,17 @@ +import { autoRegister } from "./plugins/main"; + export * from "./plugins/mgCollapse"; export * from "./plugins/mgDropdown"; export * from "./plugins/mgModal"; export * from "./plugins/mgNav"; export * from "./plugins/mgTabs"; export * from "./plugins/mgDarkMode"; -export * from './scss/main.scss'; +export * from "./plugins/main"; +export * from "./scss/main.scss"; + +// Auto-register plugins when loaded as a standalone script in the browser +if (typeof window !== "undefined") { + autoRegister(); +} + diff --git a/src/plugins/main.ts b/src/plugins/main.ts index df29b13..c9d774b 100644 --- a/src/plugins/main.ts +++ b/src/plugins/main.ts @@ -1,92 +1,140 @@ -import { registergCollapses } from "./mgCollapse"; +import { registerCollapses, registergCollapses } from "./mgCollapse"; import { registerDropdowns } from "./mgDropdown"; import { registerModals } from "./mgModal"; import { registerNavs } from "./mgNav"; import { registerTabs } from "./mgTabs"; -import { registerDarkMode } from "./mgDarkMode"; - - - -export function autoRegister() { - console.log( - `mgplus - auto registering DOM plugins for query params` - ); - window.addEventListener("DOMContentLoaded", () => { - const plugins = getQueryParam("plugins", getScriptUrl()); - registerPlugins(plugins?.split(",") ?? []); - }); -} +import { registerDarkMode, applyTheme, getCurrentTheme, getPreferredTheme } from "./mgDarkMode"; +export { + registerCollapses, + registergCollapses, + registerDropdowns, + registerModals, + registerNavs, + registerTabs, + registerDarkMode, + applyTheme, + getCurrentTheme, + getPreferredTheme, +}; export function registerDarkModePlugin() { registerDarkMode(); } -//autorun : true or false -//plugins : ["dropdowns", "modals", "navs", "collapses", "darkmode"] -export function registerPlugins(plugins: string[]) { - const pluginsArgs = plugins ? plugins : []; - console.log(`mgplus - registering plugins: ${pluginsArgs}`); - if (pluginsArgs instanceof Array) { - pluginsArgs.map(function (pluginName) { - switch (pluginName) { - case "all": - registerDropdowns(); - registerModals(); - registerNavs(); - registerTabs(); - registergCollapses(); - registerDarkModePlugin(); - break; - case "dropdowns": - registerDropdowns(); - break; - case "modals": - registerModals(); - break; - case "navs": - registerNavs(); - break; - case "tabs": - registerTabs(); - break; - case "collapses": - registergCollapses(); - break; - case "darkmode": - registerDarkModePlugin(); - break; - default: - console.log(`mgplus - plugin not found: ${pluginName}`); - return; - } - console.log(`mgplus - registered plugin: ${pluginName}`); - }); +export type PluginName = + | "all" + | "dropdowns" + | "dropdown" + | "modals" + | "modal" + | "navs" + | "nav" + | "tabs" + | "tab" + | "collapses" + | "collapse" + | "darkmode" + | "theme"; + +export function registerPlugins(plugins?: string[] | string) { + if (!plugins) return; + + const list = Array.isArray(plugins) + ? plugins + : plugins.split(",").map((p) => p.trim()); + + for (const pluginName of list) { + const normalized = pluginName.toLowerCase().trim(); + switch (normalized) { + case "all": + registerDropdowns(); + registerModals(); + registerNavs(); + registerTabs(); + registerCollapses(); + registerDarkMode(); + return; + case "dropdowns": + case "dropdown": + registerDropdowns(); + break; + case "modals": + case "modal": + registerModals(); + break; + case "navs": + case "nav": + registerNavs(); + break; + case "tabs": + case "tab": + registerTabs(); + break; + case "collapses": + case "collapse": + registerCollapses(); + break; + case "darkmode": + case "theme": + registerDarkMode(); + break; + default: + console.warn(`mgplus - unknown plugin: ${pluginName}`); + break; + } } } -// extracts the params from the currently running (external) script -function getScriptUrl() { - const scripts = document.getElementsByTagName("script"); +// Extracts the params from the currently running script +function getScriptUrl(): string | null { + if (typeof document === "undefined") return null; - for (let i = 0; i < scripts.length; i++) { - const scriptUrl = scripts[i] && scripts[i].src; + const current = document.currentScript as HTMLScriptElement | null; + if (current?.src) return current.src; - if (scriptUrl.indexOf("mgplus-vanilla.js") > 0) { - return scriptUrl; + const scripts = document.getElementsByTagName("script"); + for (let i = scripts.length - 1; i >= 0; i--) { + const src = scripts[i]?.src; + if (src && (src.includes("mgplus-vanilla") || src.includes("mgplus"))) { + return src; } } return null; } -// gets the Query Params of a given query string -function getQueryParam(name: string, query: string | null) { - name = name.replace(/[[]/, "\\[").replace(/[]]/, "\\]"); - var regexS = "[\\?&]" + name + "=([^&#]*)"; - var regex = new RegExp(regexS); +// Gets Query Params from a URL string +function getQueryParam(name: string, url: string | null): string { + if (!url) return ""; + try { + const parsed = new URL(url, "https://dummy.base"); + return parsed.searchParams.get(name) || ""; + } catch { + const escaped = name.replace(/[[\]]/g, "\\[$&]"); + const regex = new RegExp("[?&]" + escaped + "=([^&#]*)"); + const results = regex.exec(url); + return results ? decodeURIComponent(results[1]) : ""; + } +} + +export function autoRegister() { + if (typeof window === "undefined" || typeof document === "undefined") return; - var results = query && regex.exec(query); + const run = () => { + const scriptUrl = getScriptUrl(); + if (!scriptUrl) return; - if (!results) return ""; - else return results[1]; -} \ No newline at end of file + // Check both ?register= and ?plugins= parameters + const plugins = getQueryParam("register", scriptUrl) || getQueryParam("plugins", scriptUrl); + if (plugins) { + registerPlugins(plugins); + } + }; + + if (document.readyState === "loading") { + window.addEventListener("DOMContentLoaded", run, { once: true }); + } else { + run(); + } +} + \ No newline at end of file diff --git a/src/plugins/mgCollapse.ts b/src/plugins/mgCollapse.ts index 7e480e1..fb9f567 100644 --- a/src/plugins/mgCollapse.ts +++ b/src/plugins/mgCollapse.ts @@ -1,32 +1,46 @@ -export function registergCollapses() { - document.querySelectorAll("[data-toggle~=collapse]").forEach(setupCollapse); - function setupCollapse(collapseToggle: Element) { +export function registerCollapses() { + document.querySelectorAll("[data-toggle~=collapse]").forEach(setupCollapse); + + function setupCollapse(collapseToggle: HTMLElement) { + if (collapseToggle.dataset.mgCollapseInitialized === "true") { + return; + } + collapseToggle.dataset.mgCollapseInitialized = "true"; + const targetToCollapse = collapseToggle.getAttribute("data-target"); collapseToggle.setAttribute("aria-haspopup", "true"); - collapseToggle.setAttribute("aria-expanded", "false"); + if (!collapseToggle.hasAttribute("aria-expanded")) { + collapseToggle.setAttribute("aria-expanded", "false"); + } const collapseContent = targetToCollapse ? document.getElementById(targetToCollapse) - : collapseToggle.nextElementSibling; + : (collapseToggle.nextElementSibling as HTMLElement | null); - collapseContent?.setAttribute("aria-hidden", "true"); + if (collapseContent && !collapseContent.hasAttribute("aria-hidden")) { + collapseContent.setAttribute("aria-hidden", "true"); + } collapseToggle.addEventListener("click", toggleCollapse); function toggleCollapse(e: Event) { e.preventDefault(); e.stopPropagation(); - if (collapseToggle.getAttribute("aria-expanded") === "true") { - collapseToggle.setAttribute("aria-expanded", "false"); - collapseToggle.setAttribute("aria-hidden", "true"); - collapseToggle.classList.remove("opened"); - return; - } - collapseToggle.setAttribute("aria-expanded", "true"); - collapseToggle.setAttribute("aria-hidden", "false"); - collapseToggle.classList.add("opened"); - return; + const isExpanded = collapseToggle.getAttribute("aria-expanded") === "true"; + const nextState = !isExpanded; + + collapseToggle.setAttribute("aria-expanded", String(nextState)); + collapseToggle.classList.toggle("opened", nextState); + + if (collapseContent) { + collapseContent.setAttribute("aria-hidden", String(!nextState)); + collapseContent.classList.toggle("opened", nextState); + } } } } + +/** @deprecated Use registerCollapses instead */ +export const registergCollapses = registerCollapses; + diff --git a/src/plugins/mgDarkMode.ts b/src/plugins/mgDarkMode.ts index a76ffc0..32f3315 100644 --- a/src/plugins/mgDarkMode.ts +++ b/src/plugins/mgDarkMode.ts @@ -1,39 +1,65 @@ -export function registerDarkMode() { - const current = document.documentElement.getAttribute("data-theme"); +let isDarkModeInitialized = false; - applyTheme(current ? current : "light"); +export function getPreferredTheme(): "dark" | "light" { + if (typeof window !== "undefined" && window.matchMedia("(prefers-color-scheme: dark)").matches) { + return "dark"; + } + return "light"; +} - window - .matchMedia("(prefers-color-scheme: dark)") - .addEventListener("change", (e) => { - const newTheme = e.matches ? "dark" : "light"; - document.documentElement.setAttribute("data-theme", newTheme); - console.log("mgplus - theme changed:", newTheme); - }); - // Select all elements with data-toggle attribute containing "theme" and setup theme for each - document.querySelectorAll("[data-toggle~=theme]").forEach(setupTheme); +export function getCurrentTheme(): string { + if (typeof document === "undefined") return "light"; + return document.documentElement.getAttribute("data-theme") || "light"; +} - function applyTheme(customTheme: string | null) { - if (customTheme && customTheme != "auto" && customTheme != "system") { - document.documentElement.setAttribute("data-theme", customTheme); - console.log("mgplus - theme applied (forced):", customTheme); - } else { - const defaultTheme = window.matchMedia("(prefers-color-scheme: dark)") - .matches - ? "dark" - : "light"; +export function applyTheme(theme: string | null, persist = true) { + if (typeof document === "undefined") return; + + const targetTheme = + !theme || theme === "auto" || theme === "system" + ? getPreferredTheme() + : theme; + + document.documentElement.setAttribute("data-theme", targetTheme); - document.documentElement.setAttribute("data-theme", defaultTheme); - console.log("mgplus - theme applied (system):", defaultTheme); + if (persist && typeof localStorage !== "undefined") { + if (theme && theme !== "auto" && theme !== "system") { + localStorage.setItem("mg-theme", theme); + } else { + localStorage.removeItem("mg-theme"); } } - // Function to setup theme for an element - function setupTheme(el: Element) { - // Select target theme - const newTheme = el.getAttribute("data-value"); - // Add event listener to the element to theme switcher - el.addEventListener("click", function () { - applyTheme(newTheme); - }); +} + +export function registerDarkMode() { + if (typeof window === "undefined" || typeof document === "undefined") return; + + // Check persisted theme or initial attribute + const savedTheme = typeof localStorage !== "undefined" ? localStorage.getItem("mg-theme") : null; + const initialTheme = savedTheme || document.documentElement.getAttribute("data-theme") || "auto"; + + applyTheme(initialTheme, false); + + if (!isDarkModeInitialized) { + isDarkModeInitialized = true; + window + .matchMedia("(prefers-color-scheme: dark)") + .addEventListener("change", () => { + const stored = typeof localStorage !== "undefined" ? localStorage.getItem("mg-theme") : null; + if (!stored) { + applyTheme("auto", false); + } + }); } + + document.querySelectorAll("[data-toggle~=theme]").forEach((el) => { + if (el.dataset.mgThemeInitialized === "true") return; + el.dataset.mgThemeInitialized = "true"; + + const targetTheme = el.getAttribute("data-value") || "auto"; + el.addEventListener("click", () => { + applyTheme(targetTheme, true); + }); + }); } + diff --git a/src/plugins/mgDropdown.ts b/src/plugins/mgDropdown.ts index 05ad898..f148894 100644 --- a/src/plugins/mgDropdown.ts +++ b/src/plugins/mgDropdown.ts @@ -1,61 +1,108 @@ +let currentDropdown: HTMLElement | null = null; +let isDropdownDocListenerInitialized = false; + +function closeDropdown(toggle: HTMLElement, content: HTMLElement | null) { + toggle.setAttribute("aria-expanded", "false"); + content?.setAttribute("aria-hidden", "true"); + toggle.classList.remove("opened"); + content?.classList.remove("opened"); + if (currentDropdown === toggle) { + currentDropdown = null; + } +} + +function openDropdown(toggle: HTMLElement, content: HTMLElement | null) { + toggle.setAttribute("aria-expanded", "true"); + content?.setAttribute("aria-hidden", "false"); + toggle.classList.add("opened"); + content?.classList.add("opened"); + + // Focus the first interactive element in the dropdown + const firstChild = content?.querySelector( + "a, button, input, [tabindex]:not([tabindex='-1'])" + ) || (content?.children[0] as HTMLElement | undefined); + + if (firstChild && typeof firstChild.focus === "function") { + firstChild.focus(); + } + + currentDropdown = toggle; +} + +function closeCurrent() { + if (currentDropdown) { + const target = currentDropdown.getAttribute("data-target"); + const content = target + ? document.getElementById(target) + : (currentDropdown.nextElementSibling as HTMLElement | null); + closeDropdown(currentDropdown, content); + } +} + export function registerDropdowns() { - let currentDropdown: Element | null = null; - document.querySelectorAll("[data-toggle~=dropdown]").forEach(setupDropdown); + if (typeof document === "undefined") return; - function setupDropdown(dropdownToggle: Element) { - dropdownToggle.setAttribute("aria-haspopup", "true"); - dropdownToggle.setAttribute("aria-expanded", "false"); + if (!isDropdownDocListenerInitialized) { + isDropdownDocListenerInitialized = true; - const dropdownContent = dropdownToggle.nextElementSibling; - dropdownContent?.setAttribute("aria-hidden", "true"); - dropdownToggle.addEventListener("click", toggleDropdown); + document.addEventListener("click", (event: Event) => { + const element = event.target as Node; + if (!currentDropdown) return; - function toggleDropdown(e: Event) { - e.preventDefault(); - e.stopPropagation(); - if (dropdownToggle.getAttribute("aria-expanded") === "true") { - closeDropdown(dropdownToggle, dropdownContent); - return; + const target = currentDropdown.getAttribute("data-target"); + const content = target + ? document.getElementById(target) + : (currentDropdown.nextElementSibling as HTMLElement | null); + + if ( + !currentDropdown.contains(element) && + (!content || !content.contains(element)) + ) { + closeCurrent(); } - closeCurrent(); + }); - openDropdown(dropdownToggle, dropdownContent); - } + document.addEventListener("keydown", (event: KeyboardEvent) => { + if (event.key === "Escape" && currentDropdown) { + const toggleToFocus = currentDropdown; + closeCurrent(); + toggleToFocus.focus(); + } + }); + } - function openDropdown(toggle: Element, content: Element | null) { - toggle.setAttribute("aria-expanded", "true"); - content?.setAttribute("aria-hidden", "false"); - toggle.classList.add("opened"); + document.querySelectorAll("[data-toggle~=dropdown]").forEach(setupDropdown); - // Focus the first element in the dropdown - if (content?.children && content.children.length > 0 && content.children[0]) { - if (content.children[0] instanceof HTMLElement) { - (content.children[0] as HTMLElement).focus(); - } - } - currentDropdown = toggle; - } + function setupDropdown(dropdownToggle: HTMLElement) { + if (dropdownToggle.dataset.mgDropdownInitialized === "true") return; + dropdownToggle.dataset.mgDropdownInitialized = "true"; - function closeDropdown(toggle: Element, content: Element | null) { - toggle.setAttribute("aria-expanded", "false"); - content?.setAttribute("aria-hidden", "true"); - toggle.classList.remove("opened"); - currentDropdown = null; + dropdownToggle.setAttribute("aria-haspopup", "true"); + if (!dropdownToggle.hasAttribute("aria-expanded")) { + dropdownToggle.setAttribute("aria-expanded", "false"); } - function closeCurrent() { - if (currentDropdown) { - const content = currentDropdown.nextElementSibling; - closeDropdown(currentDropdown, content); - } + const target = dropdownToggle.getAttribute("data-target"); + const dropdownContent = target + ? document.getElementById(target) + : (dropdownToggle.nextElementSibling as HTMLElement | null); + + if (dropdownContent && !dropdownContent.hasAttribute("aria-hidden")) { + dropdownContent.setAttribute("aria-hidden", "true"); } - document.addEventListener("click", function (event: Event) { - const element = event.target as Element; + dropdownToggle.addEventListener("click", (e: Event) => { + e.preventDefault(); + e.stopPropagation(); - if (currentDropdown && !currentDropdown.contains(element) && !dropdownContent?.contains(element)) { + const isExpanded = dropdownToggle.getAttribute("aria-expanded") === "true"; + if (isExpanded) { + closeDropdown(dropdownToggle, dropdownContent); + } else { closeCurrent(); + openDropdown(dropdownToggle, dropdownContent); } }); } } + diff --git a/src/plugins/mgModal.ts b/src/plugins/mgModal.ts index e9c9a1f..04ca47c 100644 --- a/src/plugins/mgModal.ts +++ b/src/plugins/mgModal.ts @@ -1,28 +1,77 @@ +let isModalKeydownInitialized = false; + +function openModal(modal: HTMLElement) { + modal.classList.add("opened"); + modal.setAttribute("aria-hidden", "false"); + + // Focus modal or first interactive element inside it + const focusable = modal.querySelector( + "input, button, select, textarea, a[href], [tabindex]:not([tabindex='-1'])" + ); + if (focusable) { + focusable.focus(); + } +} + +function closeModal(modal: HTMLElement) { + modal.classList.remove("opened"); + modal.setAttribute("aria-hidden", "true"); +} + export function registerModals() { - // Select all elements with data-toggle attribute containing "modal" and setup modal for each - document.querySelectorAll("[data-toggle~=modal]").forEach(setupModal); - - // Function to setup modal for an element - function setupModal(el: Element) { - // Function to handle modal removal - function removeModalHandler() { - modal?.classList.remove("opened"); + if (typeof document === "undefined") return; + + if (!isModalKeydownInitialized) { + isModalKeydownInitialized = true; + document.addEventListener("keydown", (e: KeyboardEvent) => { + if (e.key === "Escape") { + document.querySelectorAll(".mg-modal.opened").forEach((m) => { + closeModal(m); + }); + } + }); + } + + document.querySelectorAll("[data-toggle~=modal]").forEach(setupModal); + + function setupModal(trigger: HTMLElement) { + if (trigger.dataset.mgModalInitialized === "true") return; + trigger.dataset.mgModalInitialized = "true"; + + const targetId = trigger.getAttribute("data-target"); + if (!targetId) return; + + const modal = document.getElementById(targetId); + if (!modal) return; + + modal.setAttribute("role", "dialog"); + modal.setAttribute("aria-modal", "true"); + if (!modal.classList.contains("opened")) { + modal.setAttribute("aria-hidden", "true"); } - // Select the modal and close button elements - var modal = document.querySelector("#" + el.getAttribute("data-target")); + trigger.addEventListener("click", (e: Event) => { + e.preventDefault(); + openModal(modal); + }); - var close = modal?.querySelector("[data-action=close]"); + // Close on any element with data-action="close" + modal.querySelectorAll("[data-action=close]").forEach((closeBtn) => { + if (closeBtn.dataset.mgCloseInitialized === "true") return; + closeBtn.dataset.mgCloseInitialized = "true"; - // Add event listener to the element to show modal on click - el.addEventListener("click", function (_: Event) { - modal?.classList.add("opened"); + closeBtn.addEventListener("click", (ev: Event) => { + ev.stopPropagation(); + closeModal(modal); + }); }); - // Add event listener to the close button to remove modal on click - close?.addEventListener("click", function (ev) { - ev.stopPropagation(); - removeModalHandler(); + // Close on clicking backdrop (direct click on modal wrapper) + modal.addEventListener("click", (e: MouseEvent) => { + if (e.target === modal) { + closeModal(modal); + } }); } } + diff --git a/src/plugins/mgNav.ts b/src/plugins/mgNav.ts index 984d4cf..00ad8bc 100644 --- a/src/plugins/mgNav.ts +++ b/src/plugins/mgNav.ts @@ -1,37 +1,40 @@ export function registerNavs() { - document.querySelectorAll("[data-toggle~=nav]").forEach(setupNav); - function setupNav(nav: Element) { - const items = nav.getElementsByTagName("li"); + if (typeof document === "undefined") return; - for (let j = 0; j < items.length; j++) { - const item = items[j]; + document.querySelectorAll("[data-toggle~=nav]").forEach(setupNav); - if ( - item.classList.contains("active") || - item.getAttribute("data-active") === "true" - ) { + function setupNav(nav: HTMLElement) { + if (nav.dataset.mgNavInitialized === "true") return; + nav.dataset.mgNavInitialized = "true"; + + const items = nav.querySelectorAll("li"); + + items.forEach((item) => { + if (item.classList.contains("active") || item.getAttribute("data-active") === "true") { item.setAttribute("data-active", "true"); item.classList.add("active"); } - } + }); - nav.addEventListener("click", function (e: Event) { - let selector = e.target as HTMLElement; - if (selector.parentNode?.nodeName == "LI" && selector.parentNode instanceof HTMLElement) { - selector = selector.parentNode; - } - if (selector.getAttribute("data-active") !== "true") { - //disable all selected tabs - let items = nav.getElementsByTagName("li"); - for (let j = 0; j < items.length; j++) { - const item = items[j]; + nav.addEventListener("click", (e: MouseEvent) => { + const target = e.target as HTMLElement | null; + if (!target) return; + + const listItem = target.closest("li"); + if (!listItem || !nav.contains(listItem)) return; + + if (listItem.getAttribute("data-active") !== "true") { + // Deactivate all items in this nav + items.forEach((item) => { item.classList.remove("active"); item.setAttribute("data-active", "false"); - } - //activate selected tab - selector.classList.add("active"); - selector.setAttribute("data-active", "true"); + }); + + // Activate selected item + listItem.classList.add("active"); + listItem.setAttribute("data-active", "true"); } }); } } + diff --git a/src/plugins/mgTabs.ts b/src/plugins/mgTabs.ts index 5296e90..ad93cb1 100644 --- a/src/plugins/mgTabs.ts +++ b/src/plugins/mgTabs.ts @@ -1,70 +1,90 @@ export function registerTabs() { - document.querySelectorAll("[data-toggle~=tabs]").forEach(setupTabs); + if (typeof document === "undefined") return; - function setupTabs(tabs: Element) { - let items = tabs.getElementsByClassName("mg-tabs--item"); + document.querySelectorAll("[data-toggle~=tabs]").forEach(setupTabs); - for (let j = 0; j < items.length; j++) { - const item = items[j]; - if ( + function setupTabs(tabs: HTMLElement) { + if (tabs.dataset.mgTabsInitialized === "true") return; + tabs.dataset.mgTabsInitialized = "true"; + + const items = tabs.querySelectorAll(".mg-tabs--item"); + + items.forEach((item) => { + item.setAttribute("role", "tab"); + const targetToShow = item.getAttribute("data-target"); + if (targetToShow) { + item.setAttribute("aria-controls", targetToShow); + } + + const isActive = item.classList.contains("active") || - item.getAttribute("data-active") === "true" - ) { + item.getAttribute("data-active") === "true"; + + if (isActive) { item.setAttribute("data-active", "true"); + item.setAttribute("aria-selected", "true"); item.classList.add("active"); - const targetToShow = item.getAttribute("data-target"); - if (targetToShow) { const el = document.getElementById(targetToShow); if (el) { el.classList.add("active"); + el.setAttribute("aria-hidden", "false"); + } + } + } else { + item.setAttribute("data-active", "false"); + item.setAttribute("aria-selected", "false"); + if (targetToShow) { + const el = document.getElementById(targetToShow); + if (el) { + el.setAttribute("aria-hidden", "true"); } } } - } + }); - tabs.addEventListener("click", function (e) { - let selector = e.target as HTMLElement; + tabs.addEventListener("click", (e: MouseEvent) => { + const target = e.target as HTMLElement | null; + if (!target) return; - // Ensure the clicked element is a tab item or its child - while (selector && !selector.classList.contains("mg-tabs--item")) { - selector = selector.parentElement as HTMLElement; - } + const tabItem = target.closest(".mg-tabs--item"); + if (!tabItem || !tabs.contains(tabItem)) return; - if (selector && selector.classList.contains("mg-tabs--item")) { - e.stopPropagation(); - e.preventDefault(); + e.preventDefault(); - if (selector.getAttribute("data-active") !== "true") { - // Disable all selected tabs - let items = tabs.getElementsByClassName("mg-tabs--item"); + if (tabItem.getAttribute("data-active") !== "true") { + // Deactivate all tabs + items.forEach((item) => { + item.classList.remove("active"); + item.setAttribute("data-active", "false"); + item.setAttribute("aria-selected", "false"); - for (let j = 0; j < items.length; j++) { - const item = items[j]; - item.classList.remove("active"); - item.setAttribute("data-active", "false"); - let targetToHide = item.getAttribute("data-target"); - if (targetToHide) { - const el = document.getElementById(targetToHide); - if (el) { - el.classList.remove("active"); - } + const targetToHide = item.getAttribute("data-target"); + if (targetToHide) { + const el = document.getElementById(targetToHide); + if (el) { + el.classList.remove("active"); + el.setAttribute("aria-hidden", "true"); } } + }); - // Activate selected tab - selector.classList.add("active"); - selector.setAttribute("data-active", "true"); - let targetToShow = selector.getAttribute("data-target"); - if (targetToShow) { - const el = document.getElementById(targetToShow); - if (el) { - el.classList.add("active"); - } + // Activate selected tab + tabItem.classList.add("active"); + tabItem.setAttribute("data-active", "true"); + tabItem.setAttribute("aria-selected", "true"); + + const targetToShow = tabItem.getAttribute("data-target"); + if (targetToShow) { + const el = document.getElementById(targetToShow); + if (el) { + el.classList.add("active"); + el.setAttribute("aria-hidden", "false"); } } } }); } } + diff --git a/tsconfig.json b/tsconfig.json index c452f43..00d41f3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,6 +2,7 @@ "files": [], "references": [ { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.lib.json" }, { "path": "./tsconfig.node.json" } ] } \ No newline at end of file diff --git a/tsconfig.lib.json b/tsconfig.lib.json new file mode 100644 index 0000000..2269cef --- /dev/null +++ b/tsconfig.lib.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2020", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "bundler", + "skipLibCheck": true, + "strict": true, + "composite": true, + "declaration": true, + "emitDeclarationOnly": true, + "outDir": "dist/types" + }, + "include": ["src/**/*.ts"] +} diff --git a/vite.lib.config.ts b/vite.lib.config.ts index cdf6f73..0eb2182 100644 --- a/vite.lib.config.ts +++ b/vite.lib.config.ts @@ -37,8 +37,8 @@ export default defineConfig({ }, plugins: [ dts({ - tsconfigPath: './tsconfig.node.json', - include: 'src/plugins/main.ts', + tsconfigPath: './tsconfig.lib.json', + include: ['src/**/*.ts'], outDir: 'dist/types' }), stylelint({ From d85b5dd8a395a78abe2d66e481ab41c5ac68f722 Mon Sep 17 00:00:00 2001 From: medevod Date: Sun, 6 Sep 2026 09:51:50 +0000 Subject: [PATCH 2/8] docs: add multi-framework architecture guide and prioritize hybrid evolution in roadmap --- ARCHITECTURE.md | 323 ++++++++++++++++++++++++++++++++++++++++++++++++ ROADMAP.md | 68 ++++++---- 2 files changed, 364 insertions(+), 27 deletions(-) create mode 100644 ARCHITECTURE.md diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md new file mode 100644 index 0000000..f8597c6 --- /dev/null +++ b/ARCHITECTURE.md @@ -0,0 +1,323 @@ +# MgPlus Architecture: Hybrid Multi-Framework Strategy + +This document describes the architectural foundation for **MgPlus**, explaining how a single micro-library codebase delivers zero-runtime-dependency UI components that integrate seamlessly into modern reactive frameworks (**React, Vue, Svelte, Angular, Solid, Astro**) as well as traditional server-rendered applications (**PHP/Laravel, Rails, Django, static HTML**). + +--- + +## 1. Executive Summary & Design Goals + +Modern web development presents a common dilemma for UI libraries: +* **Framework-specific component libraries** (e.g., dedicated packages for React, Vue, and Svelte) incur huge maintenance overhead, code duplication, and diverging APIs. +* **Classic Vanilla JS plugins** (e.g. Bootstrap/Milligram data-attribute scripts) struggle in reactive Virtual DOMs because they do not automatically hook into component mount/unmount lifecycles, causing stale bindings and memory leaks. +* **Standard Shadow DOM Web Components** break CSS library styling because shadow boundaries block global stylesheet rules (`.mg-*` utility classes, typography, and flex grids). + +**MgPlus solves this via a 3-Tier Hybrid Architecture powered by Native Light-DOM Web Components.** + +```mermaid +flowchart TD + subgraph Tier3["Tier 3: Native Light-DOM Custom Elements"] + E1["<mg-modal>"] + E2["<mg-dropdown>"] + E3["<mg-tabs>"] + E4["<mg-collapse>"] + E5["<mg-darkmode>"] + end + + subgraph Tier2["Tier 2: Headless Core Controllers & Vanilla Plugins"] + C1["Modal Controller"] + C2["Dropdown Controller"] + C3["Tabs Controller"] + C4["Collapse Controller"] + C5["Theme Controller"] + V["Vanilla Plugin Engine (data-toggle)"] + V --> C1 + V --> C2 + V --> C3 + V --> C4 + V --> C5 + end + + subgraph Tier1["Tier 1: Pure CSS & Design Tokens"] + CSS["mgplus.css (Micro Stylesheet, Grid, Utilities)"] + Vars[":root { --mg-* CSS Variables }"] + end + + E1 --> C1 + E2 --> C2 + E3 --> C3 + E4 --> C4 + E5 --> C5 + + Tier3 -.->|"Full Access to Styles & Tokens"| Tier1 + Tier2 -.->|"Toggles Classes & Attributes"| Tier1 +``` + +--- + +## 2. The 3-Tier Layered Architecture + +### Tier 1: Pure CSS Core (`mgplus.css`) +* **Philosophy**: Components are semantic HTML elements decorated with lightweight `.mg-*` classes. +* **Theming**: Completely parameterized via CSS Custom Properties (`--mg-color-primary`, `--mg-control-radius`, `--mg-base-font-size`). +* **Independence**: Fully usable without any JavaScript whatsoever for static presentation. + +### Tier 2: Headless Core Controllers & Vanilla Plugins +* **Philosophy**: Core UI state machines (open/close, active tab index, theme toggling, keyboard navigation, and ARIA synchronization) are written as framework-free, headless JavaScript functions. +* **Progressive Enhancement**: The Vanilla plugin layer binds these controllers to standard HTML markups using `data-toggle="modal"` and `data-target="id"` attributes. +* **Ideal for**: Static websites, documentation portals, MPA backends (Laravel, Rails, Django, WordPress), and CDN standalone usage. + +### Tier 3: Native Light-DOM Custom Elements +* **Philosophy**: Thin Custom Element wrappers (``, ``, ``, ``) that delegate to the Tier 2 controllers. +* **Zero Dependencies**: Implemented using standard browser `HTMLElement` APIs (no Lit, Stencil, or runtime overhead). +* **Automatic Lifecycle**: `connectedCallback` and `disconnectedCallback` automatically attach and detach listeners, eliminating manual init/destroy calls in single-page apps. +* **Ideal for**: React, Vue, Svelte, Angular, Solid, and Astro applications. + +--- + +## 3. Why Light DOM instead of Shadow DOM? + +Standard Web Components encapsulate styles using `this.attachShadow({ mode: 'open' })`. While isolation is valuable for self-contained design systems, it is **counter-productive for a micro utility-first CSS library**: + +``` +┌────────────────────────────────────────────────────────┐ +│ Shadow DOM Problem: │ +│ Global .mg-button, .mg-col, and typography CANNOT style│ +│ elements inside the shadow tree without complex │ +│ ::part() or @adoptedStyleSheets workarounds. │ +└────────────────────────────────────────────────────────┘ + +┌────────────────────────────────────────────────────────┐ +│ Light DOM Solution: │ +│ The custom element renders directly in the host DOM! │ +│ All global mgplus.css styles and CSS variables apply │ +│ immediately and natively. │ +└────────────────────────────────────────────────────────┘ +``` + +### Benefits of Light-DOM Custom Elements for MgPlus: +1. **100% CSS Compatibility**: Consumers can freely use `.mg-row`, `.mg-col`, `.mg-card`, `.mg-button`, and utility classes anywhere inside `` or ``. +2. **Native Framework Support**: Custom elements are recognized as valid HTML elements by every modern framework parser. +3. **Automatic Lifecycle Cleanup**: When React, Vue, or Svelte unmounts ``, `disconnectedCallback()` fires automatically, unbinding global event listeners (such as `Escape` key and document click handlers) to prevent memory leaks. +4. **Zero Bundle Bloat**: No framework runtime is shipped to users; total footprint is ~2 KB gzipped. + +--- + +## 4. Shared Core Controller Pattern + +To prevent code duplication between Tier 2 (vanilla data-attributes) and Tier 3 (custom elements), both layers delegate to the same headless controller logic: + +```ts +// src/core/modalController.ts (Headless Controller) +export interface ModalControllerOptions { + onOpen?: () => void; + onClose?: () => void; +} + +export function createModalController(modal: HTMLElement, options: ModalControllerOptions = {}) { + modal.setAttribute("role", "dialog"); + modal.setAttribute("aria-modal", "true"); + + function open() { + modal.classList.add("opened"); + modal.setAttribute("aria-hidden", "false"); + options.onOpen?.(); + modal.dispatchEvent(new CustomEvent("mg:open", { bubbles: true })); + } + + function close() { + modal.classList.remove("opened"); + modal.setAttribute("aria-hidden", "true"); + options.onClose?.(); + modal.dispatchEvent(new CustomEvent("mg:close", { bubbles: true })); + } + + function handleKeydown(e: KeyboardEvent) { + if (e.key === "Escape" && modal.classList.contains("opened")) { + close(); + } + } + + return { open, close, handleKeydown }; +} +``` + +### Implementing Tier 3 with the Controller: +```ts +// src/elements/MgModal.ts +import { createModalController } from "../core/modalController"; + +export class MgModalElement extends HTMLElement { + private controller?: ReturnType; + + connectedCallback() { + this.controller = createModalController(this); + document.addEventListener("keydown", this.controller.handleKeydown); + } + + disconnectedCallback() { + if (this.controller) { + document.removeEventListener("keydown", this.controller.handleKeydown); + } + } + + open() { this.controller?.open(); } + close() { this.controller?.close(); } +} + +customElements.define("mg-modal", MgModalElement); +``` + +--- + +## 5. Framework Integration Recipes + +### React (18 & 19) +React 19 natively passes properties to custom elements and listens to custom events. For React 18, standard `ref` callbacks or small typed wrappers ensure seamless interoperability. + +```tsx +import React, { useRef } from 'react'; +import 'mgplus/css'; +import 'mgplus/elements'; + +export function UserSettingsModal() { + const modalRef = useRef void; close: () => void }>(null); + + return ( + <> + + + +
+

Settings

+

Configure preferences below.

+ +
+
+ + ); +} +``` + +### Vue 3 +Vue natively supports custom elements without extra configuration: + +```vue + + + +``` + +### Svelte 5 +Svelte compiles custom elements cleanly with full reactive binding: + +```svelte + + + + + +
+

Rendered with Svelte

+ +
+
+``` + +### Astro & SSR +Custom elements in Astro render directly to static HTML during build or server rendering. When client hydration occurs, the custom element class enhances the pre-rendered markup seamlessly: + +```astro +--- +import 'mgplus/css'; +--- + + + +
Overview
+
Specs
+
+
Overview Content
+ +``` + +--- + +## 6. TypeScript JSX Intrinsic Elements + +To provide first-class TypeScript autocomplete in JSX/TSX projects, MgPlus ships with intrinsic element typings: + +```ts +// src/types/jsx.d.ts +declare global { + namespace JSX { + interface IntrinsicElements { + 'mg-modal': React.DetailedHTMLProps, HTMLElement> & { + opened?: boolean | ''; + 'data-target'?: string; + }; + 'mg-dropdown': React.DetailedHTMLProps, HTMLElement>; + 'mg-tabs': React.DetailedHTMLProps, HTMLElement> & { + 'data-active'?: string | number; + }; + 'mg-collapse': React.DetailedHTMLProps, HTMLElement> & { + 'data-target'?: string; + }; + } + } +} +``` + +--- + +## 7. Packaging & Subpath Exports + +The library structure allows consumers to import only what they need: + +```json +"exports": { + ".": { + "types": "./dist/types/mgplus.d.ts", + "import": "./dist/mgplus-vanilla.js", + "require": "./dist/mgplus-vanilla.umd.cjs" + }, + "./elements": { + "types": "./dist/types/elements/index.d.ts", + "import": "./dist/mgplus-elements.js" + }, + "./css": "./dist/mgplus.css", + "./package.json": "./package.json" +} +``` + +| Import Statement | What it Loads | Best For | +| :--- | :--- | :--- | +| `import 'mgplus/css'` | Compiled CSS bundle (69 KB) | Pure CSS projects, Tailwind/Bootstrap replacements | +| `import 'mgplus'` | Full bundle: CSS + Vanilla JS data-attribute plugins | Static sites, MPAs, quick prototyping | +| `import 'mgplus/elements'` | Zero-dep Light-DOM Web Components (< 3 KB) | React, Vue, Svelte, Angular, Solid, Astro | diff --git a/ROADMAP.md b/ROADMAP.md index 6be9ad5..bdc7cce 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -1,13 +1,16 @@ # MgPlus (Mg+) Roadmap -This document outlines the strategic roadmap, maintenance milestones, and refactoring priorities for **MgPlus**, a micro CSS library designed to build elegant web pages efficiently. +This document outlines the strategic roadmap, maintenance milestones, and architectural evolution for **MgPlus**, a micro CSS library designed to build elegant web pages efficiently. + +For the full technical design and multi-framework integration guide, see [ARCHITECTURE.md](file:///home/modev/gh/mgpluscss/mgplus/ARCHITECTURE.md). --- ## 🎯 Project Vision -* **Ultra-lightweight**: Under 70 KB minified CSS, zero runtime JS dependencies. -* **Plug & Play**: Minimalist vanilla JS plugins for essential interactivity with zero configuration. +* **Ultra-lightweight**: Under 70 KB minified CSS, zero runtime JS framework dependencies. +* **Universal Multi-Framework Support**: A single codebase powering static HTML, SSR, and reactive frontend frameworks (React, Vue, Svelte, Angular, Solid, Astro). +* **Plug & Play**: Minimalist vanilla JS plugins (`data-toggle`) alongside native Light-DOM Web Components (``). * **Developer Friendly**: Seamless CDN standalone usage and modern package exports for bundlers (Vite, Webpack, Rollup). * **Standards-compliant**: Progressive enhancement, accessible semantics (WCAG), and modern CSS architecture. @@ -17,8 +20,8 @@ This document outlines the strategic roadmap, maintenance milestones, and refact ``` [x] v1.5: Stability, Packaging & Standalone Priority (Current) -└── [ ] v1.6: Testing, Accessibility & SCSS Modernization - └── [ ] v1.7: Modular Builds & Component Enhancements +└── [ ] v1.6: Multi-Framework Hybrid Architecture (Light-DOM Custom Elements & Controllers) ⭐ + └── [ ] v1.7: SCSS Modernization, Modular Builds & Primitives └── [ ] v2.0: Next-Gen CSS Architecture (@layer & light-dark) ``` @@ -52,29 +55,40 @@ This document outlines the strategic roadmap, maintenance milestones, and refact --- -### 🚧 Milestone 2: v1.6 — Testing, Accessibility & SCSS DX - -*Goal: Add automated unit test coverage, improve keyboard navigation/a11y, and modernize SCSS modules.* - +### 🚧 Milestone 2: v1.6 — Multi-Framework Hybrid Architecture (PRIORITY) ⭐ + +*Goal: Implement the 3-Tier Hybrid Strategy detailed in [ARCHITECTURE.md](file:///home/modev/gh/mgpluscss/mgplus/ARCHITECTURE.md), enabling seamless integration into React, Vue, Svelte, Angular, Solid, and Astro from a single codebase.* + +- [ ] **Headless Core Controllers**: + - Extract pure, framework-free UI state controllers (`createModalController`, `createDropdownController`, `createTabsController`, `createCollapseController`, `createThemeController`). + - Share 100% of UI behavior, keyboard handling, and ARIA logic between Tier 2 (Vanilla data-attributes) and Tier 3 (Custom Elements). + - Standardize custom event contracts (`mg:open`, `mg:close`, `mg:change`, `mg:theme-change`). +- [ ] **Tier 3: Native Light-DOM Web Components**: + - Implement zero-dependency Custom Elements using standard browser `HTMLElement` APIs (no Lit, Stencil, or runtime overhead): + - ``: Accessible modal dialog with backdrop dismiss, Escape key, and focus management. + - ``: Contextual menu with automatic click-outside and keyboard dismissal. + - ``: Reactive tab list and tab panel management. + - ``: Collapsible accordion panels with ARIA sync. + - ``: Declarative theme switcher syncing with `localStorage` and system preferences. + - Use **Light DOM** (no `attachShadow`) so components retain 100% access to `mgplus.css` utility classes and `--mg-*` variables. + - Automatic lifecycle cleanup in `disconnectedCallback()` to prevent memory leaks in SPAs. +- [ ] **TypeScript JSX Typings**: + - Provide `JSX.IntrinsicElements` declarations for first-class TypeScript autocomplete in React, Preact, Vue, and Solid JSX/TSX files. - [ ] **Automated Testing Suite**: - - Setup [Vitest](https://vitest.dev/) with `jsdom` or `happy-dom` for automated headless DOM testing. - - Write test suites for all plugins (`mgDropdown`, `mgModal`, `mgTabs`, `mgDarkMode`, `mgCollapse`, `mgNav`). -- [ ] **Accessibility (a11y) Polish**: - - Focus trap inside `mgModal` when open, restoring focus to trigger element on close. - - Full keyboard navigation for `mgTabs` (Arrow keys `Left`/`Right`, `Home`, `End`). - - Enhanced ARIA live regions for alerts and notifications. -- [ ] **SCSS Modernization**: - - Migrate from deprecated `@import` to Dart Sass `@use` and `@forward`. - - Eliminate top-level `/* stylelint-disable */` in `mg-variables.scss` and resolve underlying Stylelint rules. -- [ ] **Bundle Size Monitoring**: - - Integrate `size-limit` into GitHub Actions to enforce strict size thresholds on PRs. + - Setup [Vitest](https://vitest.dev/) with `jsdom` for automated testing. + - Unit-test both Vanilla plugins and Custom Elements lifecycles (mounting, unmounting, programmatic open/close, event dispatching, keyboard accessibility). +- [ ] **Subpath Packaging**: + - Add `./elements` subpath export in `package.json` (`import 'mgplus/elements'`). --- -### 🔮 Milestone 3: v1.7 — Modular Builds & Component Enhancements +### 🔮 Milestone 3: v1.7 — SCSS Modernization, Modular Builds & Primitives -*Goal: Provide fine-grained component imports and additional common UI primitives.* +*Goal: Upgrade SCSS architecture, provide selective component imports, and expand UI primitives.* +- [ ] **SCSS Modernization**: + - Migrate from deprecated `@import` to Dart Sass `@use` and `@forward`. + - Eliminate top-level `/* stylelint-disable */` in `mg-variables.scss` and resolve underlying Stylelint rules. - [ ] **Modular CSS & SCSS Exports**: - Export standalone stylesheets: `mgplus/css/grid.css`, `mgplus/css/buttons.css`, `mgplus/css/core.css`. - Allow selective SCSS `@use "mgplus/scss/grid"`. @@ -82,9 +96,8 @@ This document outlines the strategic roadmap, maintenance milestones, and refact - Toast / Snackbars component with auto-dismiss timers. - Accordion component with single-expand mode built upon `mgCollapse`. - Skeleton loading placeholders. -- [ ] **Documentation / Playground Enhancements**: - - Interactive component playground with live CSS variable tweak controls. - - Copy-to-clipboard code snippets for all components. +- [ ] **Bundle Size Monitoring**: + - Integrate `size-limit` into GitHub Actions to enforce strict size thresholds on PRs. --- @@ -99,5 +112,6 @@ This document outlines the strategic roadmap, maintenance milestones, and refact - [ ] **Modern Color Functions**: - Adopt native CSS `light-dark()` for zero-JS initial dark mode rendering. - Modern color spaces (`oklch` / `color-mix()`) for dynamic palettes. -- [ ] **Optional Web Components / Custom Elements**: - - Provide optional ``, ``, `` custom elements for zero-boilerplate usage in any frontend framework (React, Vue, Svelte, Angular, Astro). +- [ ] **Documentation / Playground Overhaul**: + - Interactive multi-framework component playground (toggle between HTML, React, Vue, Svelte). + - Live CSS variable customization and export. From cf623c4454e5448106c2a14fa3e24c640e467b2c Mon Sep 17 00:00:00 2001 From: medevod Date: Sun, 6 Sep 2026 20:46:01 +0200 Subject: [PATCH 3/8] Remove CDN purge command for mgplus-demo Removed the CDN endpoint purge command for mgplus-demo. --- .github/actions/deploy-action/action.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/actions/deploy-action/action.yml b/.github/actions/deploy-action/action.yml index 68e7aa3..65c14f8 100644 --- a/.github/actions/deploy-action/action.yml +++ b/.github/actions/deploy-action/action.yml @@ -29,5 +29,4 @@ runs: az extension add -n storage-preview -y az storage blob upload-batch -s $DEMO_SOURCE_DIR -d $DEMO_DEST_DIR --account-name $ACCOUNT_NAME az storage blob upload-batch -s $DIST_SOURCE_DIR -d $DIST_DEST_DIR --account-name $ACCOUNT_NAME - az cdn endpoint purge -g rg-devops -n mgplus-demo --profile-name cdn-evo --content-paths /${{ inputs.package_version }}/* az cdn endpoint purge -g rg-devops -n cdn-mgplus --profile-name cdn-evo2 --content-paths /${{ inputs.package_version }}/* From c367cd8c03ad829d0217119e31084bf3fb4a8cf3 Mon Sep 17 00:00:00 2001 From: medevod Date: Sun, 6 Sep 2026 19:07:54 +0000 Subject: [PATCH 4/8] chore: bump package version to 1.5.0, fix action description typo, and remove CDN purge step --- .github/actions/deploy-action/action.yml | 3 +-- package.json | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/actions/deploy-action/action.yml b/.github/actions/deploy-action/action.yml index 65c14f8..3e809e1 100644 --- a/.github/actions/deploy-action/action.yml +++ b/.github/actions/deploy-action/action.yml @@ -1,5 +1,5 @@ name: Build lib and demo page Action -desctipion: "Build and test the lib and demo page" +description: "Build and test the lib and demo page" inputs: package_version: description: "Package version related to given stage" @@ -29,4 +29,3 @@ runs: az extension add -n storage-preview -y az storage blob upload-batch -s $DEMO_SOURCE_DIR -d $DEMO_DEST_DIR --account-name $ACCOUNT_NAME az storage blob upload-batch -s $DIST_SOURCE_DIR -d $DIST_DEST_DIR --account-name $ACCOUNT_NAME - az cdn endpoint purge -g rg-devops -n cdn-mgplus --profile-name cdn-evo2 --content-paths /${{ inputs.package_version }}/* diff --git a/package.json b/package.json index af7cc68..dcf9243 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "mgplus", "private": false, - "version": "1.4.5", + "version": "1.5.0", "description": "mgplus a micro CSS library", "homepage": "https://evodim.github.io/mgplus", "repository": "https://github.com/mgpluscss/mgplus", From 60de087812f26d0a18ec9186275216b0aef5f3b9 Mon Sep 17 00:00:00 2001 From: medevod Date: Sun, 6 Sep 2026 22:32:06 +0000 Subject: [PATCH 5/8] doc: update readme --- readme.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/readme.md b/readme.md index 1fa1ef5..c600878 100644 --- a/readme.md +++ b/readme.md @@ -13,6 +13,15 @@ [CDN direct link](https://cdn.mgpluscss.com/v1.4.5/mgplus.css) +## 🎯 Project Vision + +* **Ultra-lightweight**: Under 70 KB minified CSS, zero runtime JS framework dependencies. +* **Works everywhere**: A single codebase powering static HTML, SSR, and reactive frontend frameworks. +* **Plug & Play**: Minimalist vanilla JS plugins (`data-toggle`) without dependencies. +* **Developer Friendly**: Seamless CDN standalone usage and modern package exports for bundlers (Vite, Webpack, Rollup). +* **Standards-compliant**: Progressive enhancement and modern CSS architecture. + + **Striking the perfect balance between features and simplicity** The project began in early 2021 with the goal of providing a more robust and feature-rich alternative while maintaining the minimalistic approach of Milligram From 6a9527404329ff77ebf376c53167f224dba673ed Mon Sep 17 00:00:00 2001 From: medevod Date: Sun, 6 Sep 2026 22:52:37 +0000 Subject: [PATCH 6/8] doc: update roadmap --- ARCHITECTURE.md | 2 +- ROADMAP.md | 3 --- changelog.md | 2 +- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index f8597c6..fd1f7e5 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -1,4 +1,4 @@ -# MgPlus Architecture: Hybrid Multi-Framework Strategy +# MgPlus Architecture: Hybrid Multi-Framework Strategy (plan) This document describes the architectural foundation for **MgPlus**, explaining how a single micro-library codebase delivers zero-runtime-dependency UI components that integrate seamlessly into modern reactive frameworks (**React, Vue, Svelte, Angular, Solid, Astro**) as well as traditional server-rendered applications (**PHP/Laravel, Rails, Django, static HTML**). diff --git a/ROADMAP.md b/ROADMAP.md index bdc7cce..a691f15 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -89,9 +89,6 @@ For the full technical design and multi-framework integration guide, see [ARCHIT - [ ] **SCSS Modernization**: - Migrate from deprecated `@import` to Dart Sass `@use` and `@forward`. - Eliminate top-level `/* stylelint-disable */` in `mg-variables.scss` and resolve underlying Stylelint rules. -- [ ] **Modular CSS & SCSS Exports**: - - Export standalone stylesheets: `mgplus/css/grid.css`, `mgplus/css/buttons.css`, `mgplus/css/core.css`. - - Allow selective SCSS `@use "mgplus/scss/grid"`. - [ ] **New UI Primitives**: - Toast / Snackbars component with auto-dismiss timers. - Accordion component with single-expand mode built upon `mgCollapse`. diff --git a/changelog.md b/changelog.md index ee3a234..9d42f7e 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,6 @@ All notable changes to this library will be documented in github releases page. +[Releases](https://github.com/mgpluscss/mgplus/releases) [Portal](https://www.mgpluscss.com) [Repo](https://github.com/mgpluscss/mgplus) -[Releases](https://github.com/mgpluscss/mgplus/releases) From ebdb7020dcd02d5e0c9105a747584f326a4e5ba5 Mon Sep 17 00:00:00 2001 From: medevod Date: Sun, 6 Sep 2026 22:52:59 +0000 Subject: [PATCH 7/8] refactor scss: migrate all SCSS files to use @use for variable imports and namespace-scoped access --- src/scss/core/_Base.scss | 27 ++++----- src/scss/core/_Blockquote.scss | 4 +- src/scss/core/_Button.scss | 46 ++++++++------- src/scss/core/_Code.scss | 8 ++- src/scss/core/_Divider.scss | 4 +- src/scss/core/_Form.scss | 27 ++++----- src/scss/core/_Link.scss | 6 +- src/scss/core/_Range.scss | 18 +++--- src/scss/core/_Table.scss | 4 +- src/scss/core/_Typography.scss | 14 +++-- src/scss/core/milligram.scss | 26 ++++----- src/scss/extensions/mg-alert.scss | 16 ++--- src/scss/extensions/mg-badges.scss | 14 +++-- src/scss/extensions/mg-check.scss | 14 +++-- src/scss/extensions/mg-colors.scss | 7 ++- src/scss/extensions/mg-common.scss | 4 +- src/scss/extensions/mg-display.scss | 21 ++++--- src/scss/extensions/mg-dropdown.scss | 12 ++-- src/scss/extensions/mg-grid-utilities.scss | 61 +++++++++---------- src/scss/extensions/mg-grid.scss | 65 +++++++++++---------- src/scss/extensions/mg-group.scss | 9 ++- src/scss/extensions/mg-modal.scss | 14 +++-- src/scss/extensions/mg-nav.scss | 20 ++++--- src/scss/extensions/mg-positioning.scss | 35 ++++++----- src/scss/extensions/mg-progress.scss | 11 ++-- src/scss/extensions/mg-radio.scss | 14 +++-- src/scss/extensions/mg-select.scss | 6 +- src/scss/extensions/mg-sizing.scss | 18 +++--- src/scss/extensions/mg-tabs.scss | 16 ++--- src/scss/extensions/mg-text.scss | 4 +- src/scss/extensions/mg-timeline.scss | 36 ++++++------ src/scss/extensions/mg-toggle.scss | 20 ++++--- src/scss/icons/action/_icon-check.scss | 6 +- src/scss/icons/action/_icon-close.scss | 6 +- src/scss/icons/action/_icon-minus.scss | 4 +- src/scss/icons/action/_icon-plus.scss | 6 +- src/scss/icons/action/_icon-search.scss | 4 +- src/scss/icons/action/_icon-spinner.scss | 4 +- src/scss/icons/action/_icon-stop.scss | 4 +- src/scss/icons/core.scss | 4 +- src/scss/icons/icons.scss | 26 ++++----- src/scss/icons/navigation/_icon-arrows.scss | 8 ++- src/scss/icons/navigation/_icon-menu.scss | 4 +- src/scss/main.scss | 56 +++++++++--------- src/scss/mg-variables.scss | 6 +- vite.config.ts | 3 +- vite.lib.config.ts | 1 + 47 files changed, 414 insertions(+), 329 deletions(-) diff --git a/src/scss/core/_Base.scss b/src/scss/core/_Base.scss index 89239cc..f40a237 100644 --- a/src/scss/core/_Base.scss +++ b/src/scss/core/_Base.scss @@ -1,3 +1,4 @@ +@use "../mg-variables"; @use 'sass:map'; // Base @@ -20,10 +21,10 @@ body { // Default body styles body { - background-color: $color-initial; - color: $color-secondary; + background-color: mg-variables.$color-initial; + color: mg-variables.$color-secondary; font-family: Roboto, 'Helvetica Neue', Helvetica, Arial, sans-serif; - font-size: $base-font-size; // Currently ems cause chrome bug misinterpreting rems on body element + font-size: mg-variables.$base-font-size; // Currently ems cause chrome bug misinterpreting rems on body element font-weight: 300; letter-spacing: 0.016rem; line-height: 1.6; @@ -54,7 +55,7 @@ hr { pre { font-family: monospace; - font-size: $font-size-m; + font-size: mg-variables.$font-size-m; } /** @@ -92,11 +93,11 @@ code, kbd, samp { font-family: monospace; - font-size: $font-size-m; + font-size: mg-variables.$font-size-m; } small { - font-size: $font-size-s; + font-size: mg-variables.$font-size-s; } sub, @@ -233,19 +234,19 @@ legend { progress { vertical-align: baseline; - border-radius: $input-radius; - height: $font-size-s; + border-radius: mg-variables.$input-radius; + height: mg-variables.$font-size-s; } progress::-webkit-progress-bar { - background-color: $color-quaternary; - border-radius: $input-radius; + background-color: mg-variables.$color-quaternary; + border-radius: mg-variables.$input-radius; } progress::-webkit-progress-value { - background-color: $color-primary; - border-radius: $input-radius; - min-width: calc($input-radius); + background-color: mg-variables.$color-primary; + border-radius: mg-variables.$input-radius; + min-width: calc(mg-variables.$input-radius); } diff --git a/src/scss/core/_Blockquote.scss b/src/scss/core/_Blockquote.scss index 7da23a8..d85096c 100644 --- a/src/scss/core/_Blockquote.scss +++ b/src/scss/core/_Blockquote.scss @@ -1,9 +1,11 @@ +@use "../mg-variables"; + // Blockquote // –––––––––––––––––––––––––––––––––––––––––––––––––– blockquote { - border-left: .3rem solid $color-quaternary; + border-left: .3rem solid mg-variables.$color-quaternary; margin-left: 0; margin-right: 0; padding: 1rem 1.5rem; diff --git a/src/scss/core/_Button.scss b/src/scss/core/_Button.scss index 87697bf..c794a36 100644 --- a/src/scss/core/_Button.scss +++ b/src/scss/core/_Button.scss @@ -1,3 +1,5 @@ +@use "../mg-variables"; + // Button // –––––––––––––––––––––––––––––––––––––––––––––––––– @@ -6,23 +8,23 @@ button, input[type="button"], input[type="reset"], input[type="submit"] { - background-color: $color-primary; - border: 0.2rem solid $color-primary; - border-radius: $control-radius; - color: $color-light; + background-color: mg-variables.$color-primary; + border: 0.2rem solid mg-variables.$color-primary; + border-radius: mg-variables.$control-radius; + color: mg-variables.$color-light; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; - font-size: $font-size-s; + font-size: mg-variables.$font-size-s; font-weight: 600; - height: $control-height; + height: mg-variables.$control-height; letter-spacing: 0.1rem; padding: 0 2rem; text-align: center; text-decoration: none; opacity: 1; - box-shadow: $control-shadow; + box-shadow: mg-variables.$control-shadow; position: relative; overflow: hidden; flex-wrap: nowrap; @@ -31,9 +33,9 @@ input[type="submit"] { &:focus, &:hover { transition: all 0.5s ease; - box-shadow: $control-active-shadow; + box-shadow: mg-variables.$control-active-shadow; outline: 0; - color: $color-light; + color: mg-variables.$color-light; } &[disabled] { @@ -42,19 +44,19 @@ input[type="submit"] { &:focus, &:hover { - background-color: $color-secondary; - border-color: $color-primary; + background-color: mg-variables.$color-secondary; + border-color: mg-variables.$color-primary; } } &.mg-button--outline { background-color: transparent; - color: $color-primary; + color: mg-variables.$color-primary; &:focus, &:hover { transition: all 0.5s ease; - box-shadow: $control-active-shadow; + box-shadow: mg-variables.$control-active-shadow; } &[disabled] { @@ -68,14 +70,14 @@ input[type="submit"] { &.mg-button--link { box-shadow: none; background-color: transparent; - color: $color-primary; + color: mg-variables.$color-primary; border: none; &:focus, &:hover { transition: all 0.5s ease; - box-shadow: $control-active-shadow; - color: $color-secondary; + box-shadow: mg-variables.$control-active-shadow; + color: mg-variables.$color-secondary; } &[disabled] { @@ -88,13 +90,13 @@ input[type="submit"] { &.mg-button--clear { background-color: transparent; - color: $color-primary; + color: mg-variables.$color-primary; border: none; &:focus, &:hover { transition: all 0.5s ease; - box-shadow: $control-active-shadow; + box-shadow: mg-variables.$control-active-shadow; } &[disabled] { @@ -106,15 +108,15 @@ input[type="submit"] { } &.mg-button--small { - font-size: $font-size-s; - height: $control-height-small; + font-size: mg-variables.$font-size-s; + height: mg-variables.$control-height-small; padding: 0 1.5rem; } &.mg-button--large { - font-size: $font-size-l; - height: $control-height-large; + font-size: mg-variables.$font-size-l; + height: mg-variables.$control-height-large; padding: 0 2rem; } diff --git a/src/scss/core/_Code.scss b/src/scss/core/_Code.scss index bcf1b83..6390704 100644 --- a/src/scss/core/_Code.scss +++ b/src/scss/core/_Code.scss @@ -1,8 +1,10 @@ +@use "../mg-variables"; + // Code // –––––––––––––––––––––––––––––––––––––––––––––––––– code { - background: $color-quinary; + background: mg-variables.$color-quinary; border-radius: 0.4rem; font-size: 86%; margin: 0 0.2rem; @@ -11,8 +13,8 @@ code { } pre { - background: $color-quinary; - border-left: 0.3rem solid $color-primary; + background: mg-variables.$color-quinary; + border-left: 0.3rem solid mg-variables.$color-primary; overflow-y: hidden; & > code { diff --git a/src/scss/core/_Divider.scss b/src/scss/core/_Divider.scss index bc1f906..31d7e29 100644 --- a/src/scss/core/_Divider.scss +++ b/src/scss/core/_Divider.scss @@ -1,9 +1,11 @@ +@use "../mg-variables"; + // Divider // –––––––––––––––––––––––––––––––––––––––––––––––––– hr { border: 0; - border-top: .1rem solid $color-tertiary; + border-top: .1rem solid mg-variables.$color-tertiary; margin: 3.0rem 0; } diff --git a/src/scss/core/_Form.scss b/src/scss/core/_Form.scss index 27fc159..de35753 100644 --- a/src/scss/core/_Form.scss +++ b/src/scss/core/_Form.scss @@ -1,3 +1,4 @@ +@use "../mg-variables"; @use 'sass:map'; // Form @@ -35,29 +36,29 @@ select { appearance: none; -webkit-appearance: none; background-color: transparent; - border: 0.1rem solid $color-quaternary; - border-radius: $input-radius; + border: 0.1rem solid mg-variables.$color-quaternary; + border-radius: mg-variables.$input-radius; box-shadow: none; box-sizing: inherit; // Forced to replace inherit values of the normalize.css - height: $control-height; + height: mg-variables.$control-height; padding: 1rem; width: 100%; - color: $color-secondary; + color: mg-variables.$color-secondary; &:focus { - border-color: $color-primary; + border-color: mg-variables.$color-primary; outline: 0; } &.mg-input--small { - font-size: $font-size-s; - height: $control-height-small; + font-size: mg-variables.$font-size-s; + height: mg-variables.$control-height-small; padding: 0 1rem; } &.mg-input--large { - font-size: $font-size-l; - height: $control-height-large; + font-size: mg-variables.$font-size-l; + height: mg-variables.$control-height-large; padding: 0 1.2rem; } @@ -65,7 +66,7 @@ select { /* stylelint-disable */ select { - background-color: $color-initial; + background-color: mg-variables.$color-initial; /* fix text inside select */ padding-top: 0.1rem; padding-bottom: 0.1rem; @@ -95,7 +96,7 @@ select:-webkit-autofill:focus { margin-top: 0; margin-bottom: 0; padding: 0; - -webkit-text-fill-color: $color-secondary; + -webkit-text-fill-color: mg-variables.$color-secondary; -webkit-box-shadow: none; transition: background-color 5000s ease-in-out 0s; } @@ -114,14 +115,14 @@ input[type="radio"] { } div.mg-input:focus-within { - border-color: $color-primary; + border-color: mg-variables.$color-primary; outline: 0; } label, legend { display: block; - font-size: $font-size-m; + font-size: mg-variables.$font-size-m; font-weight: 700; margin-bottom: 0.5rem; } diff --git a/src/scss/core/_Link.scss b/src/scss/core/_Link.scss index b8c4705..a863c16 100644 --- a/src/scss/core/_Link.scss +++ b/src/scss/core/_Link.scss @@ -1,12 +1,14 @@ +@use "../mg-variables"; + // Link // –––––––––––––––––––––––––––––––––––––––––––––––––– a { - color: $color-primary; + color: mg-variables.$color-primary; text-decoration: none; &:focus, &:hover { - color: $color-secondary; + color: mg-variables.$color-secondary; } } diff --git a/src/scss/core/_Range.scss b/src/scss/core/_Range.scss index a930599..e2398ec 100644 --- a/src/scss/core/_Range.scss +++ b/src/scss/core/_Range.scss @@ -1,9 +1,11 @@ +@use "../mg-variables"; + // Range input (native) // –––––––––––––––––––––––––––––––––––––––––––––––––– input[type="range"] { - background: $color-quaternary; - border-radius: $input-radius; + background: mg-variables.$color-quaternary; + border-radius: mg-variables.$input-radius; display: inline-block; height: 0.8rem; margin-right: 1.76rem; @@ -21,10 +23,10 @@ input[type="range"] { &::-moz-range-thumb { appearance: none; - background: $color-primary; + background: mg-variables.$color-primary; border-radius: 100%; border: none; - box-shadow: $control-shadow; + box-shadow: mg-variables.$control-shadow; cursor: pointer; height: 2.5rem; width: 2.5rem; @@ -33,9 +35,9 @@ input[type="range"] { &::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; - background: $color-primary; + background: mg-variables.$color-primary; border: none; - box-shadow: $control-shadow; + box-shadow: mg-variables.$control-shadow; cursor: pointer; height: 2.5rem; width: 2.5rem; @@ -46,11 +48,11 @@ input[type="range"] { opacity: 0.5; &::-moz-range-thumb { - background: $color-quaternary; + background: mg-variables.$color-quaternary; } &::-webkit-slider-thumb { - background: $color-quaternary; + background: mg-variables.$color-quaternary; } } diff --git a/src/scss/core/_Table.scss b/src/scss/core/_Table.scss index 0f8897a..ebdca56 100644 --- a/src/scss/core/_Table.scss +++ b/src/scss/core/_Table.scss @@ -1,3 +1,5 @@ +@use "../mg-variables"; + // Table (native) // –––––––––––––––––––––––––––––––––––––––––––––––––– @@ -9,7 +11,7 @@ table { td, th { - border-bottom: .1rem solid $color-quinary; + border-bottom: .1rem solid mg-variables.$color-quinary; padding: 1.2rem 1.5rem; text-align: left; diff --git a/src/scss/core/_Typography.scss b/src/scss/core/_Typography.scss index 813c33a..56f0439 100644 --- a/src/scss/core/_Typography.scss +++ b/src/scss/core/_Typography.scss @@ -1,3 +1,5 @@ +@use "../mg-variables"; + // Typography // –––––––––––––––––––––––––––––––––––––––––––––––––– @@ -21,28 +23,28 @@ h6 { } h1 { - font-size: $font-size-4xl; + font-size: mg-variables.$font-size-4xl; } h2 { - font-size: $font-size-3xl; + font-size: mg-variables.$font-size-3xl; } h3 { - font-size: $font-size-2xl; + font-size: mg-variables.$font-size-2xl; } h4 { - font-size: $font-size-xl; + font-size: mg-variables.$font-size-xl; letter-spacing: -.08rem; } h5 { - font-size: $font-size-l; + font-size: mg-variables.$font-size-l; letter-spacing: -.05rem; } h6 { - font-size: $font-size-m; + font-size: mg-variables.$font-size-m; letter-spacing: 0; } \ No newline at end of file diff --git a/src/scss/core/milligram.scss b/src/scss/core/milligram.scss index e3d1176..26a19c1 100644 --- a/src/scss/core/milligram.scss +++ b/src/scss/core/milligram.scss @@ -1,15 +1,15 @@ // Sass Modules // –––––––––––––––––––––––––––––––––––––––––––––––––– -@import "Base"; -@import "Blockquote"; -@import "Button"; -@import "Code"; -@import "Divider"; -@import "Form"; -@import "Link"; -@import "List"; -@import "Spacing"; -@import "Table"; -@import "Typography"; -@import "Image"; -@import "Range"; \ No newline at end of file +@use "Base"; +@use "Blockquote"; +@use "Button"; +@use "Code"; +@use "Divider"; +@use "Form"; +@use "Link"; +@use "List"; +@use "Spacing"; +@use "Table"; +@use "Typography"; +@use "Image"; +@use "Range"; \ No newline at end of file diff --git a/src/scss/extensions/mg-alert.scss b/src/scss/extensions/mg-alert.scss index 71313d3..13ca375 100644 --- a/src/scss/extensions/mg-alert.scss +++ b/src/scss/extensions/mg-alert.scss @@ -1,22 +1,24 @@ +@use "../mg-variables"; + .mg-alert { - border-top-right-radius: $control-radius; - border-bottom-right-radius: $control-radius; - border-left: 0.3rem solid $color-primary; + border-top-right-radius: mg-variables.$control-radius; + border-bottom-right-radius: mg-variables.$control-radius; + border-left: 0.3rem solid mg-variables.$color-primary; margin-left: 0; margin-right: 0; padding: 1rem 1.5rem; margin-bottom: 2.5rem; - background-color: $color-quinary; + background-color: mg-variables.$color-quinary; &.danger { - border-left-color: $color-danger; + border-left-color: mg-variables.$color-danger; } &.success { - border-left-color: $color-success; + border-left-color: mg-variables.$color-success; } &.warning { - border-left-color: $color-warning; + border-left-color: mg-variables.$color-warning; } } \ No newline at end of file diff --git a/src/scss/extensions/mg-badges.scss b/src/scss/extensions/mg-badges.scss index 6f07aa1..442a3d1 100644 --- a/src/scss/extensions/mg-badges.scss +++ b/src/scss/extensions/mg-badges.scss @@ -1,5 +1,7 @@ +@use "../mg-variables"; + .mg-badge { - border-radius: $control-radius; + border-radius: mg-variables.$control-radius; display: inline-block; margin-bottom: 0.5rem; padding: .5rem 1rem; @@ -8,18 +10,18 @@ text-align: center; white-space: nowrap; vertical-align: baseline; - background-color: $color-primary; - color: $color-light; + background-color: mg-variables.$color-primary; + color: mg-variables.$color-light; &.success { - background-color: $color-success; + background-color: mg-variables.$color-success; } &.warning { - background-color: $color-warning; + background-color: mg-variables.$color-warning; } &.danger { - background-color: $color-danger; + background-color: mg-variables.$color-danger; } } \ No newline at end of file diff --git a/src/scss/extensions/mg-check.scss b/src/scss/extensions/mg-check.scss index 7a0ca4c..22ae7b9 100644 --- a/src/scss/extensions/mg-check.scss +++ b/src/scss/extensions/mg-check.scss @@ -1,3 +1,5 @@ +@use "../mg-variables"; + /* Hide the browser's default checkbox */ .mg-check input { position: absolute; @@ -15,7 +17,7 @@ height: 2.4rem; width: 2.4rem; border-style: solid; - border-color: $color-quaternary; + border-color: mg-variables.$color-quaternary; border-width: thin; transition: all 0.3s; border-radius: 0.3rem; @@ -23,12 +25,12 @@ /* On mouse-over, add a grey background color */ .mg-check:hover input~.mg-check--icon { - background-color: $color-secondary; + background-color: mg-variables.$color-secondary; } /* When the checkbox is checked, add a blue background */ .mg-check input:checked~.mg-check--icon { - background-color: $color-primary; + background-color: mg-variables.$color-primary; } /* Create the mg-check--icon/indicator (hidden when not checked) */ @@ -40,7 +42,7 @@ top: 0.16rem; width: 0.8rem; height: 1.6rem; - border: solid $color-light; + border: solid mg-variables.$color-light; border-width: 0 0.25rem 0.3rem 0; transform: rotate(45deg); } @@ -55,11 +57,11 @@ /* disabled state */ .mg-check input:disabled~.mg-check--icon { - background-color: $color-quinary; + background-color: mg-variables.$color-quinary; } .mg-check input:focus~.mg-check--icon { - border-color: $color-primary; + border-color: mg-variables.$color-primary; border-style: dotted; border-width: thin; } \ No newline at end of file diff --git a/src/scss/extensions/mg-colors.scss b/src/scss/extensions/mg-colors.scss index 9048ad8..6d90923 100644 --- a/src/scss/extensions/mg-colors.scss +++ b/src/scss/extensions/mg-colors.scss @@ -1,3 +1,4 @@ -@include build-for-colors('mg', 'color'); -@include build-for-colors('mg-bg', 'background-color'); -@include build-for-colors('mg-border', 'border-color'); \ No newline at end of file +@use "mg-common"; +@include mg-common.build-for-colors('mg', 'color'); +@include mg-common.build-for-colors('mg-bg', 'background-color'); +@include mg-common.build-for-colors('mg-border', 'border-color'); \ No newline at end of file diff --git a/src/scss/extensions/mg-common.scss b/src/scss/extensions/mg-common.scss index 5ad4721..97bd911 100644 --- a/src/scss/extensions/mg-common.scss +++ b/src/scss/extensions/mg-common.scss @@ -1,3 +1,5 @@ +@use "../mg-variables"; + @keyframes mg-rotate { 0% { transform: rotate(0deg); @@ -25,7 +27,7 @@ } @mixin build-for-colors($prefix, $style) { - @each $key, $value in $color-map { + @each $key, $value in mg-variables.$color-map { .#{$prefix}-#{""+$key} { #{$style}: $value; } diff --git a/src/scss/extensions/mg-display.scss b/src/scss/extensions/mg-display.scss index a2f481c..e4b32ad 100644 --- a/src/scss/extensions/mg-display.scss +++ b/src/scss/extensions/mg-display.scss @@ -1,3 +1,6 @@ +@use "../mg-variables"; +@use "mg-common"; + .mg-block { display: block; } @@ -50,7 +53,7 @@ } .mg-shadow { - box-shadow: $control-shadow; + box-shadow: mg-variables.$control-shadow; } .mg-overflow-auto { @@ -86,10 +89,10 @@ } .mg-rounded { - border-radius: $control-radius; + border-radius: mg-variables.$control-radius; } -@each $key, $value in $rem-map { +@each $key, $value in mg-variables.$rem-map { .mg-rounded#{$key} { border-radius: $value; @@ -112,10 +115,10 @@ } } -@include build-none-half-full('mg-rounded', 'border-radius'); +@include mg-common.build-none-half-full('mg-rounded', 'border-radius'); .mg-border { - border: 0.07rem solid $color-quaternary; + border: 0.07rem solid mg-variables.$color-quaternary; } .mg-border-none { @@ -123,20 +126,20 @@ } .mg-border-t { - border-top: 0.07rem solid $color-quaternary; + border-top: 0.07rem solid mg-variables.$color-quaternary; } .mg-border-r { - border-right: 0.07rem solid $color-quaternary; + border-right: 0.07rem solid mg-variables.$color-quaternary; } .mg-border-b { - border-bottom: 0.07rem solid $color-quaternary; + border-bottom: 0.07rem solid mg-variables.$color-quaternary; } .mg-border-l { - border-left: 0.07rem solid $color-quaternary; + border-left: 0.07rem solid mg-variables.$color-quaternary; } .mg-pointer { diff --git a/src/scss/extensions/mg-dropdown.scss b/src/scss/extensions/mg-dropdown.scss index ebe8f94..f3ae724 100644 --- a/src/scss/extensions/mg-dropdown.scss +++ b/src/scss/extensions/mg-dropdown.scss @@ -1,3 +1,5 @@ +@use "../mg-variables"; + /* The container must be positioned relative: */ .mg-dropdown { position: relative; @@ -9,7 +11,7 @@ -webkit-overflow-scrolling: touch; width: 100%; min-width: max-content; - box-shadow: $control-shadow; + box-shadow: mg-variables.$control-shadow; margin-left: auto; margin-right: auto; border: 0.15rem solid; @@ -19,12 +21,12 @@ opacity: 0; visibility: hidden; position: absolute; - background-color: $color-initial; + background-color: mg-variables.$color-initial; top: 100%; - border-color: $color-quaternary; - border-radius: $control-radius; + border-color: mg-variables.$color-quaternary; + border-radius: mg-variables.$control-radius; max-width: 90vw; - z-index: $zindex-max; + z-index: mg-variables.$zindex-max; overflow: hidden auto; max-height: 60vh; } diff --git a/src/scss/extensions/mg-grid-utilities.scss b/src/scss/extensions/mg-grid-utilities.scss index b997b23..fad0a28 100644 --- a/src/scss/extensions/mg-grid-utilities.scss +++ b/src/scss/extensions/mg-grid-utilities.scss @@ -1,6 +1,7 @@ +@use "../mg-variables"; @use "sass:math"; -@mixin grid-column($_gutter: $grid__gutter) { +@mixin grid-column($_gutter: mg-variables.$grid__gutter) { flex: 0 0 100%; max-width: 100%; @@ -13,7 +14,7 @@ } // Centered container element -@mixin init-container($_gutter: $grid__gutter) { +@mixin init-container($_gutter: mg-variables.$grid__gutter) { margin-right: auto; margin-left: auto; padding-right: 0.8rem; @@ -22,76 +23,76 @@ } // Creates a wrapper for a series of columns -@mixin init-row($_gutter: $grid__gutter) { +@mixin init-row($_gutter: mg-variables.$grid__gutter) { display: flex; flex: 0 1 auto; flex-flow: row wrap; } // Generate default columns -@mixin create-x($_columns, $_gutter: $grid__gutter) { +@mixin create-x($_columns, $_gutter: mg-variables.$grid__gutter) { @include grid-column($_gutter); - max-width: math.percentage(calc($_columns / $grid__columns)); + max-width: math.percentage(calc($_columns / mg-variables.$grid__columns)); } @mixin create-x-offset($_columns) { - margin-left: math.percentage(calc($_columns / $grid__columns)); + margin-left: math.percentage(calc($_columns / mg-variables.$grid__columns)); } // Generate small columns -@mixin create-s($_columns, $_gutter: $grid__gutter) { +@mixin create-s($_columns, $_gutter: mg-variables.$grid__gutter) { @include grid-column($_gutter); - @media screen and (min-width: $screen-s) { - max-width: math.percentage(calc($_columns / $grid__columns)); + @media screen and (min-width: mg-variables.$screen-s) { + max-width: math.percentage(calc($_columns / mg-variables.$grid__columns)); } } @mixin create-s-offset($_columns) { - @media screen and (min-width: $screen-s) { - margin-left: math.percentage(calc($_columns / $grid__columns)); + @media screen and (min-width: mg-variables.$screen-s) { + margin-left: math.percentage(calc($_columns / mg-variables.$grid__columns)); } } // Generate medium columns -@mixin create-m($_columns, $_gutter: $grid__gutter) { +@mixin create-m($_columns, $_gutter: mg-variables.$grid__gutter) { @include grid-column($_gutter); - @media screen and (min-width: $screen-m) { - max-width: math.percentage(calc($_columns / $grid__columns)); + @media screen and (min-width: mg-variables.$screen-m) { + max-width: math.percentage(calc($_columns / mg-variables.$grid__columns)); } } @mixin create-m-offset($_columns) { - @media screen and (min-width: $screen-m) { - margin-left: math.percentage(calc($_columns / $grid__columns)); + @media screen and (min-width: mg-variables.$screen-m) { + margin-left: math.percentage(calc($_columns / mg-variables.$grid__columns)); } } // Generate large columns -@mixin create-l($_columns, $_gutter: $grid__gutter) { +@mixin create-l($_columns, $_gutter: mg-variables.$grid__gutter) { @include grid-column($_gutter); - @media screen and (min-width: $screen-l) { - max-width: math.percentage(calc($_columns / $grid__columns)); + @media screen and (min-width: mg-variables.$screen-l) { + max-width: math.percentage(calc($_columns / mg-variables.$grid__columns)); } } @mixin create-l-offset($_columns) { - @media screen and (min-width: $screen-l) { - margin-left: math.percentage(calc($_columns / $grid__columns)); + @media screen and (min-width: mg-variables.$screen-l) { + margin-left: math.percentage(calc($_columns / mg-variables.$grid__columns)); } } // Grid generation @mixin create-all-grid-columns($i: 1, - $list: ".#{$name-x}#{$i}, .#{$name-s}#{$i}, .#{$name-m}#{$i}, .#{$name-l}#{$i}, .#{$name-xl}#{$i}" + $list: ".#{mg-variables.$name-x}#{$i}, .#{mg-variables.$name-s}#{$i}, .#{mg-variables.$name-m}#{$i}, .#{mg-variables.$name-l}#{$i}, .#{mg-variables.$name-xl}#{$i}" ) { - @for $i from (1 + 1) through $grid__columns { - $list: "#{$list}, .#{$name-x}#{$i}, .#{$name-s}#{$i}, .#{$name-m}#{$i}, .#{$name-l}#{$i}, .#{$name-xl}#{$i}"; + @for $i from (1 + 1) through mg-variables.$grid__columns { + $list: "#{$list}, .#{mg-variables.$name-x}#{$i}, .#{mg-variables.$name-s}#{$i}, .#{mg-variables.$name-m}#{$i}, .#{mg-variables.$name-l}#{$i}, .#{mg-variables.$name-xl}#{$i}"; } #{$list} { @@ -102,14 +103,14 @@ @mixin calc-grid-column($index, $class, $type) { @if $type ==width and $index >0 { .#{$class}#{$index} { - flex-basis: math.percentage(calc($index / $grid__columns)); - max-width: math.percentage(calc($index / $grid__columns)); + flex-basis: math.percentage(calc($index / mg-variables.$grid__columns)); + max-width: math.percentage(calc($index / mg-variables.$grid__columns)); } } @if $type ==offset { .#{$class}--offset#{$index} { - margin-left: math.percentage(calc($index / $grid__columns)); + margin-left: math.percentage(calc($index / mg-variables.$grid__columns)); } } @@ -254,9 +255,9 @@ // Create grid for specific class @mixin create-grid-columns($_class) { - @include loop-grid-columns($grid__columns, $_class, width); - @include loop-grid-columns($grid__columns, $_class, offset); - @include loop-grid-columns($grid__columns, $_class, order); + @include loop-grid-columns(mg-variables.$grid__columns, $_class, width); + @include loop-grid-columns(mg-variables.$grid__columns, $_class, offset); + @include loop-grid-columns(mg-variables.$grid__columns, $_class, order); @include create-positioning-row($_class); @include create-positioning-col($_class); @include create-growing-effects($_class); diff --git a/src/scss/extensions/mg-grid.scss b/src/scss/extensions/mg-grid.scss index 6b7beef..77f4b17 100644 --- a/src/scss/extensions/mg-grid.scss +++ b/src/scss/extensions/mg-grid.scss @@ -1,3 +1,6 @@ +@use "../mg-variables"; +@use "mg-grid-utilities"; + // Make all grid columns // --------------------------------------------- @@ -10,39 +13,39 @@ -@include create-all-grid-columns; +@include mg-grid-utilities.create-all-grid-columns; // Columns X // --------------------------------------------- -@include create-grid-columns($name-x); +@include mg-grid-utilities.create-grid-columns(mg-variables.$name-x); // Columns S // --------------------------------------------- -@media screen and (min-width: $screen-s) { - @include create-grid-columns($name-s); +@media screen and (min-width: mg-variables.$screen-s) { + @include mg-grid-utilities.create-grid-columns(mg-variables.$name-s); } // Columns M // --------------------------------------------- -@media screen and (min-width: $screen-m) { - @include create-grid-columns($name-m); +@media screen and (min-width: mg-variables.$screen-m) { + @include mg-grid-utilities.create-grid-columns(mg-variables.$name-m); } // Columns L // --------------------------------------------- -@media screen and (min-width: $screen-l) { - @include create-grid-columns($name-l); +@media screen and (min-width: mg-variables.$screen-l) { + @include mg-grid-utilities.create-grid-columns(mg-variables.$name-l); } // Columns XL // --------------------------------------------- -@media screen and (min-width: $screen-xl) { - @include create-grid-columns($name-xl); +@media screen and (min-width: mg-variables.$screen-xl) { + @include mg-grid-utilities.create-grid-columns(mg-variables.$name-xl); } // Grid @@ -50,53 +53,53 @@ // Adaptative hide -@media screen and (max-width: $screen-s) { - @include create-conditional-hidden($name-s); +@media screen and (max-width: mg-variables.$screen-s) { + @include mg-grid-utilities.create-conditional-hidden(mg-variables.$name-s); } -@media screen and (max-width: $screen-m) { - @include create-conditional-hidden($name-m); +@media screen and (max-width: mg-variables.$screen-m) { + @include mg-grid-utilities.create-conditional-hidden(mg-variables.$name-m); } -@media screen and (max-width: $screen-l) { - @include create-conditional-hidden($name-l); +@media screen and (max-width: mg-variables.$screen-l) { + @include mg-grid-utilities.create-conditional-hidden(mg-variables.$name-l); } -@media screen and (max-width: $screen-xl) { - @include create-conditional-hidden($name-xl); +@media screen and (max-width: mg-variables.$screen-xl) { + @include mg-grid-utilities.create-conditional-hidden(mg-variables.$name-xl); } // Adaptative display -@media screen and (min-width: $screen-s) { - @include create-conditional-display($name-s); +@media screen and (min-width: mg-variables.$screen-s) { + @include mg-grid-utilities.create-conditional-display(mg-variables.$name-s); } -@media screen and (min-width: $screen-m) { - @include create-conditional-display($name-m); +@media screen and (min-width: mg-variables.$screen-m) { + @include mg-grid-utilities.create-conditional-display(mg-variables.$name-m); } -@media screen and (min-width: $screen-l) { - @include create-conditional-display($name-l); +@media screen and (min-width: mg-variables.$screen-l) { + @include mg-grid-utilities.create-conditional-display(mg-variables.$name-l); } -@media screen and (min-width: $screen-xl) { - @include create-conditional-display($name-xl); +@media screen and (min-width: mg-variables.$screen-xl) { + @include mg-grid-utilities.create-conditional-display(mg-variables.$name-xl); } .mg-container { - @include init-container; + @include mg-grid-utilities.init-container; - max-width: $screen-l; + max-width: mg-variables.$screen-l; } .mg-container-fluid { - @include init-container; + @include mg-grid-utilities.init-container; max-width: width auto; } .mg-row { - @include init-row; + @include mg-grid-utilities.init-row; } -@include create-gap-utilities($rem-map); \ No newline at end of file +@include mg-grid-utilities.create-gap-utilities(mg-variables.$rem-map); \ No newline at end of file diff --git a/src/scss/extensions/mg-group.scss b/src/scss/extensions/mg-group.scss index 6f24090..8047774 100644 --- a/src/scss/extensions/mg-group.scss +++ b/src/scss/extensions/mg-group.scss @@ -1,3 +1,5 @@ +@use "../mg-variables"; + .mg-group { display: inline-flex; justify-items: baseline; @@ -18,6 +20,7 @@ border-bottom-right-radius: 0; border-right: 0; } + /*inner group styling*/ .mg-group>select:not(:nth-child(1), :nth-last-child(1)), .mg-group>input:not(:nth-child(1), :nth-last-child(1)), @@ -26,8 +29,8 @@ .mg-group>.mg-button:not(:nth-child(1), :nth-last-child(1)), .mg-group>.mg-dropdown:not(:nth-child(1), :nth-last-child(1))>button, .mg-group>.mg-select:not(:nth-child(1), :nth-last-child(1))>select { - border-radius: 0; - + border-radius: 0; + } /*right group styling*/ @@ -45,5 +48,5 @@ /* stylelint-enable */ .mg-group .mg-group--outline { - box-shadow: $control-shadow; + box-shadow: mg-variables.$control-shadow; } \ No newline at end of file diff --git a/src/scss/extensions/mg-modal.scss b/src/scss/extensions/mg-modal.scss index ec2661c..0722ee0 100644 --- a/src/scss/extensions/mg-modal.scss +++ b/src/scss/extensions/mg-modal.scss @@ -1,3 +1,5 @@ +@use "../mg-variables"; + .mg-modal--content { position: fixed; margin-left: auto; @@ -16,7 +18,7 @@ height: 100%; visibility: hidden; backface-visibility: hidden; - z-index: calc($zindex-max + 1); + z-index: calc(mg-variables.$zindex-max + 1); opacity: 0; background: rgb(0 0 0 / 70%); transition: opacity 0.3s; @@ -27,13 +29,13 @@ } &>.mg-modal--content { - background-color: $color-initial; - border-radius: $control-radius; - color: $color-secondary; + background-color: mg-variables.$color-initial; + border-radius: mg-variables.$control-radius; + color: mg-variables.$color-secondary; padding: 2rem 1.5rem; margin-top: 0; - z-index: calc($zindex-max + 2); - box-shadow: $control-shadow; + z-index: calc(mg-variables.$zindex-max + 2); + box-shadow: mg-variables.$control-shadow; transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1); } diff --git a/src/scss/extensions/mg-nav.scss b/src/scss/extensions/mg-nav.scss index e03edfd..6c3a8bf 100644 --- a/src/scss/extensions/mg-nav.scss +++ b/src/scss/extensions/mg-nav.scss @@ -1,3 +1,5 @@ +@use "../mg-variables"; + .mg-nav { padding: 0.5rem; margin-left: 0; @@ -14,14 +16,14 @@ display: flex; padding: 0.5rem; text-decoration: none; - color: $color-secondary; + color: mg-variables.$color-secondary; align-items: center; - border-bottom: 0.125rem solid $color-quinary; + border-bottom: 0.125rem solid mg-variables.$color-quinary; } & li.active { color: currentcolor; - border-left: 0.3rem solid $color-primary; + border-left: 0.3rem solid mg-variables.$color-primary; font-weight: bold; } @@ -29,11 +31,11 @@ width: 100%; cursor: pointer; text-decoration: none; - color: $color-secondary; + color: mg-variables.$color-secondary; } & li:hover { - background-color: $color-quinary; + background-color: mg-variables.$color-quinary; } } @@ -52,7 +54,7 @@ /* stylelint-enable */ & li.active { border: none; - border-bottom: 0.3rem solid $color-primary; + border-bottom: 0.3rem solid mg-variables.$color-primary; } } @@ -80,13 +82,13 @@ & li button:hover, & li .mg-button:hover { - color: $color-secondary; + color: mg-variables.$color-secondary; } & li.active button, & li.active .mg-button { - border: 0.2rem solid $color-primary; - color: $color-secondary; + border: 0.2rem solid mg-variables.$color-primary; + color: mg-variables.$color-secondary; } diff --git a/src/scss/extensions/mg-positioning.scss b/src/scss/extensions/mg-positioning.scss index c7d37df..cdccc70 100644 --- a/src/scss/extensions/mg-positioning.scss +++ b/src/scss/extensions/mg-positioning.scss @@ -1,5 +1,8 @@ +@use "../mg-variables"; +@use "mg-common"; + // .mg-pad[0-10] { padding: [0-10]rem; } -@each $key, $value in $rem-map { +@each $key, $value in mg-variables.$rem-map { .mg-pad#{$key} { padding: $value; @@ -56,14 +59,14 @@ position: fixed; top: 0; left: 0; - z-index: $zindex-max; + z-index: mg-variables.$zindex-max; } .mg-fixed-bottom { position: fixed; bottom: 0; left: 0; - z-index: $zindex-max; + z-index: mg-variables.$zindex-max; } .mg-valign-middle { @@ -154,7 +157,7 @@ // mg-top[0-100]vh { width: [0-100]vh step 10 } -@each $key, $value in $step-map { +@each $key, $value in mg-variables.$step-map { .mg-top#{$key}vh { width: #{$value}vh; @@ -174,7 +177,7 @@ } // .mg-pad[0-10] { padding: [0-10]rem; } -@each $key, $value in $rem-map { +@each $key, $value in mg-variables.$rem-map { .mg-top#{$key} { top: #{$value}; @@ -193,35 +196,35 @@ } } -@include build-none-half-full('mg-top', 'top'); -@include build-none-half-full('mg-left', 'left'); -@include build-none-half-full('mg-right', 'right'); -@include build-none-half-full('mg-bottom', 'bottom'); +@include mg-common.build-none-half-full('mg-top', 'top'); +@include mg-common.build-none-half-full('mg-left', 'left'); +@include mg-common.build-none-half-full('mg-right', 'right'); +@include mg-common.build-none-half-full('mg-bottom', 'bottom'); .mg-z0 { - z-index: $zindex-0; + z-index: mg-variables.$zindex-0; } .mg-z1 { - z-index: $zindex-1; + z-index: mg-variables.$zindex-1; } .mg-z2 { - z-index: $zindex-2; + z-index: mg-variables.$zindex-2; } .mg-z3 { - z-index: $zindex-3; + z-index: mg-variables.$zindex-3; } .mg-z4 { - z-index: $zindex-4; + z-index: mg-variables.$zindex-4; } .mg-z5 { - z-index: $zindex-5; + z-index: mg-variables.$zindex-5; } .mg-z-max { - z-index: $zindex-max; + z-index: mg-variables.$zindex-max; } \ No newline at end of file diff --git a/src/scss/extensions/mg-progress.scss b/src/scss/extensions/mg-progress.scss index f1396b5..cc3cb8f 100644 --- a/src/scss/extensions/mg-progress.scss +++ b/src/scss/extensions/mg-progress.scss @@ -1,16 +1,17 @@ +@use "../mg-variables"; @use "sass:map"; .mg-progress { display: inline-block; - background-color: $color-quinary; - border-radius: $control-radius; + background-color: mg-variables.$color-quinary; + border-radius: mg-variables.$control-radius; width: 100%; - height: $font-size-s; + height: mg-variables.$font-size-s; margin-bottom: 1.2rem; &>.mg-progress--bar { - border-radius: $control-radius; - background-color: $color-primary; + border-radius: mg-variables.$control-radius; + background-color: mg-variables.$color-primary; height: 100%; } } \ No newline at end of file diff --git a/src/scss/extensions/mg-radio.scss b/src/scss/extensions/mg-radio.scss index 9b13389..be41d56 100644 --- a/src/scss/extensions/mg-radio.scss +++ b/src/scss/extensions/mg-radio.scss @@ -1,3 +1,5 @@ +@use "../mg-variables"; + /* Hide the browser's default radio button */ .mg-radio input { position: absolute; @@ -16,19 +18,19 @@ width: 2.4rem; border-radius: 50%; border-style: solid; - border-color: $color-quaternary; + border-color: mg-variables.$color-quaternary; border-width: thin; transition: all 0.4s; } /* On mouse-over, add a grey background color */ .mg-radio:hover input~.mg-radio--icon { - background-color: $color-secondary; + background-color: mg-variables.$color-secondary; } /* When the radio button is checked, add a blue background */ .mg-radio input:checked~.mg-radio--icon { - background-color: $color-primary; + background-color: mg-variables.$color-primary; } /* Style the indicator (dot/circle) */ @@ -38,7 +40,7 @@ width: 0.64rem; height: 0.64rem; border-radius: 50%; - background-color: $color-light; + background-color: mg-variables.$color-light; content: ""; position: absolute; display: none; @@ -51,11 +53,11 @@ .mg-radio input:disabled~.mg-radio--icon { - background-color: $color-quinary; + background-color: mg-variables.$color-quinary; } .mg-radio input:focus~.mg-radio--icon { - border-color: $color-primary; + border-color: mg-variables.$color-primary; border-style: dotted; border-width: thin; } diff --git a/src/scss/extensions/mg-select.scss b/src/scss/extensions/mg-select.scss index 548a51f..3b8c13b 100644 --- a/src/scss/extensions/mg-select.scss +++ b/src/scss/extensions/mg-select.scss @@ -1,3 +1,5 @@ +@use "mg-icon"; + .mg-select { display: flex; align-items: center; @@ -16,8 +18,8 @@ } &::after { - @include mg-inline-css-icon; - @include mg-toggle-effect; + @include mg-icon.mg-inline-css-icon; + @include mg-icon.mg-toggle-effect; color: currentcolor; top: calc(50% - 1.2rem); diff --git a/src/scss/extensions/mg-sizing.scss b/src/scss/extensions/mg-sizing.scss index eff40fc..0f2bf4d 100644 --- a/src/scss/extensions/mg-sizing.scss +++ b/src/scss/extensions/mg-sizing.scss @@ -1,12 +1,14 @@ -@include build-none-half-full('mg-w', 'width'); -@include build-none-half-full('mg-h', 'height'); -@include build-none-half-full('mg-min-w', 'min-width'); -@include build-none-half-full('mg-min-h', 'min-height'); -@include build-none-half-full('mg-max-w', 'max-width'); -@include build-none-half-full('mg-max-h', 'max-height'); +@use "../mg-variables"; +@use "mg-common"; +@include mg-common.build-none-half-full('mg-w', 'width'); +@include mg-common.build-none-half-full('mg-h', 'height'); +@include mg-common.build-none-half-full('mg-min-w', 'min-width'); +@include mg-common.build-none-half-full('mg-min-h', 'min-height'); +@include mg-common.build-none-half-full('mg-max-w', 'max-width'); +@include mg-common.build-none-half-full('mg-max-h', 'max-height'); // mg-w[0-100]vh { width: [0-100]vh step 10 } -@each $key, $value in $step-map { +@each $key, $value in mg-variables.$step-map { .mg-w#{$key}vh { width: #{$key}vh; @@ -33,7 +35,7 @@ } } -@each $key, $value in $rem-map { +@each $key, $value in mg-variables.$rem-map { .mg-h#{$key} { height: $value; } diff --git a/src/scss/extensions/mg-tabs.scss b/src/scss/extensions/mg-tabs.scss index 0750454..eb4f4a8 100644 --- a/src/scss/extensions/mg-tabs.scss +++ b/src/scss/extensions/mg-tabs.scss @@ -1,3 +1,5 @@ +@use "../mg-variables"; + // Tabs // –––––––––––––––––––––––––––––––––––––––––––––––––– @@ -12,28 +14,28 @@ &>li>* { - color: $color-secondary; + color: mg-variables.$color-secondary; white-space: nowrap; } &>li { font-weight: bold; border-bottom: 0.3rem solid transparent; - color: $color-tertiary; + color: mg-variables.$color-tertiary; opacity: 0.7; flex: 0 0 auto; } &>li.active { - color: $color-primary; - border-color: $color-primary; + color: mg-variables.$color-primary; + border-color: mg-variables.$color-primary; overflow-y: hidden; opacity: 1; } &>li:hover { - color: $color-secondary; - border-color: $color-tertiary; + color: mg-variables.$color-secondary; + border-color: mg-variables.$color-tertiary; opacity: 1; transition: all 0.3s; } @@ -47,7 +49,7 @@ } .mg-tabs--content { - border-top: 0.15rem solid $color-quaternary; + border-top: 0.15rem solid mg-variables.$color-quaternary; padding: 1.5rem; clear: both; opacity: 1; diff --git a/src/scss/extensions/mg-text.scss b/src/scss/extensions/mg-text.scss index 2f648a6..25e2c18 100644 --- a/src/scss/extensions/mg-text.scss +++ b/src/scss/extensions/mg-text.scss @@ -1,3 +1,5 @@ +@use "../mg-variables"; + .mg-text-left { text-align: left; } @@ -62,7 +64,7 @@ white-space: nowrap; } -@each $key, $value in $font-sizes { +@each $key, $value in mg-variables.$font-sizes { .mg-text-#{$key} { font-size: $value; } diff --git a/src/scss/extensions/mg-timeline.scss b/src/scss/extensions/mg-timeline.scss index fd8871e..d05b1e7 100644 --- a/src/scss/extensions/mg-timeline.scss +++ b/src/scss/extensions/mg-timeline.scss @@ -1,8 +1,10 @@ +@use "../mg-variables"; + $bullet-size: 2rem; @mixin bullet-sequence { content: counter(list); - font-size: $font-size-s; + font-size: mg-variables.$font-size-s; font-weight: 600; } @@ -47,7 +49,7 @@ $bullet-size: 2rem; left: -3rem; height: 100%; width: 1rem; - border-left: 0.3rem solid $color-quaternary; + border-left: 0.3rem solid mg-variables.$color-quaternary; } &>ul li:last-child::before, @@ -64,9 +66,9 @@ $bullet-size: 2rem; left: calc(-1 * ($bullet-size/2) - $bullet-size - 0.8rem); width: $bullet-size; height: $bullet-size; - border: 0.3rem solid $color-quaternary; + border: 0.3rem solid mg-variables.$color-quaternary; border-radius: 50%; - background-color: $color-initial; + background-color: mg-variables.$color-initial; text-align: center; } @@ -76,7 +78,7 @@ $bullet-size: 2rem; &>ul li.active::before, &>ol li.active::before { - border-left: 0.3rem solid $color-primary; + border-left: 0.3rem solid mg-variables.$color-primary; } &>ul li:last-of-type::before, @@ -86,17 +88,17 @@ $bullet-size: 2rem; &>ul li.active::after, &>ol li.active::after { - border-color: $color-primary; - background-color: $color-primary; + border-color: mg-variables.$color-primary; + background-color: mg-variables.$color-primary; } &>ol li.active::after { - color: $color-light; + color: mg-variables.$color-light; } &>ul li.current::after, &>ol li.current::after { - border-color: $color-primary; + border-color: mg-variables.$color-primary; } } @@ -115,7 +117,7 @@ $bullet-size: 2rem; &>ol li { counter-increment: list; padding-right: 0.15rem; - border-top: 0.3rem solid $color-quaternary; + border-top: 0.3rem solid mg-variables.$color-quaternary; flex: 1 1 0; } @@ -129,9 +131,9 @@ $bullet-size: 2rem; bottom: 1.2rem; width: $bullet-size; height: $bullet-size; - border: 0.3rem solid $color-quaternary; + border: 0.3rem solid mg-variables.$color-quaternary; border-radius: 50%; - background-color: $color-initial; + background-color: mg-variables.$color-initial; text-align: center; } @@ -142,22 +144,22 @@ $bullet-size: 2rem; /* stylelint-enable */ &>ul li.active, &>ol li.active { - border-color: $color-primary; + border-color: mg-variables.$color-primary; } &>ul li.active::before, &>ol li.active::before { - border-color: $color-primary; - background-color: $color-primary; + border-color: mg-variables.$color-primary; + background-color: mg-variables.$color-primary; } &>ol li.active::before { - color: $color-light; + color: mg-variables.$color-light; } &>ul li.current::before, &>ol li.current::before { - border-color: $color-primary; + border-color: mg-variables.$color-primary; } &>ul li:last-of-type, diff --git a/src/scss/extensions/mg-toggle.scss b/src/scss/extensions/mg-toggle.scss index 8cc9555..69e8473 100644 --- a/src/scss/extensions/mg-toggle.scss +++ b/src/scss/extensions/mg-toggle.scss @@ -1,3 +1,5 @@ +@use "../mg-variables"; + .mg-toggle { padding-left: 5.6rem; } @@ -13,41 +15,41 @@ /* Create a custom checkbox */ .mg-toggle .mg-toggle--icon { - border-radius: $control-radius; + border-radius: mg-variables.$control-radius; position: absolute; top: calc(50% - 1.2rem); left: 0; height: 2.72rem; width: 4.8rem; border-style: solid; - border-color: $color-quaternary; + border-color: mg-variables.$color-quaternary; border-width: thin; transition: all 0.3s; } /* On mouse-over, add a grey background color */ .mg-toggle input~.mg-toggle--icon { - background-color: $color-quaternary; + background-color: mg-variables.$color-quaternary; } /* When the checkbox is checked, add a blue background */ .mg-toggle input:checked~.mg-toggle--icon { - background-color: $color-primary; + background-color: mg-variables.$color-primary; } /* Create the mg-toggle--icon/indicator (hidden when not checked) */ .mg-toggle .mg-toggle--icon::after { border: none; - border-radius: $control-radius; + border-radius: mg-variables.$control-radius; position: absolute; content: ""; height: 2.08rem; width: 2.24rem; top: 0.2rem; left: 0.2rem; - background-color: $color-light; + background-color: mg-variables.$color-light; transition: 0.3s; - box-shadow: $control-shadow; + box-shadow: mg-variables.$control-shadow; } /* Show the mg-toggle-icon when checked */ @@ -57,12 +59,12 @@ /* disabled state */ .mg-toggle input:disabled~.mg-toggle--icon { - background-color: $color-quinary; + background-color: mg-variables.$color-quinary; opacity: 0.6; } .mg-toggle input:focus~.mg-toggle--icon { - border-color: $color-primary; + border-color: mg-variables.$color-primary; border-style: dotted; border-width: thin; } \ No newline at end of file diff --git a/src/scss/icons/action/_icon-check.scss b/src/scss/icons/action/_icon-check.scss index 837dfcd..8beaa93 100644 --- a/src/scss/icons/action/_icon-check.scss +++ b/src/scss/icons/action/_icon-check.scss @@ -1,7 +1,9 @@ +@use "../../mg-variables"; + .icon-rounded-check, .icon-check { &::before { - border: $icon-border-width solid currentcolor; + border: mg-variables.$icon-border-width solid currentcolor; border-right: 0; border-top: 0; height: 0.8rem; @@ -12,6 +14,6 @@ .icon-rounded-check { padding: 0.1rem; - border: $icon-border-width solid currentcolor; + border: mg-variables.$icon-border-width solid currentcolor; border-radius: 50%; } \ No newline at end of file diff --git a/src/scss/icons/action/_icon-close.scss b/src/scss/icons/action/_icon-close.scss index 4009312..320edad 100644 --- a/src/scss/icons/action/_icon-close.scss +++ b/src/scss/icons/action/_icon-close.scss @@ -1,14 +1,16 @@ +@use "../../mg-variables"; + .icon-close { &::before { background: currentcolor; - height: $icon-border-width; + height: mg-variables.$icon-border-width; width: 100%; } &::after { background: currentcolor; height: 100%; - width: $icon-border-width; + width: mg-variables.$icon-border-width; } &::before, diff --git a/src/scss/icons/action/_icon-minus.scss b/src/scss/icons/action/_icon-minus.scss index 159619f..5e59080 100644 --- a/src/scss/icons/action/_icon-minus.scss +++ b/src/scss/icons/action/_icon-minus.scss @@ -1,7 +1,9 @@ +@use "../../mg-variables"; + .icon-minus { &::before { background: currentcolor; - height: $icon-border-width; + height: mg-variables.$icon-border-width; width: 100%; } } \ No newline at end of file diff --git a/src/scss/icons/action/_icon-plus.scss b/src/scss/icons/action/_icon-plus.scss index 203020e..cdf0429 100644 --- a/src/scss/icons/action/_icon-plus.scss +++ b/src/scss/icons/action/_icon-plus.scss @@ -1,13 +1,15 @@ +@use "../../mg-variables"; + .icon-plus { &::before { background: currentcolor; - height: $icon-border-width; + height: mg-variables.$icon-border-width; width: 100%; } &::after { background: currentcolor; height: 100%; - width: $icon-border-width; + width: mg-variables.$icon-border-width; } } \ No newline at end of file diff --git a/src/scss/icons/action/_icon-search.scss b/src/scss/icons/action/_icon-search.scss index 6ae977b..aa268e3 100644 --- a/src/scss/icons/action/_icon-search.scss +++ b/src/scss/icons/action/_icon-search.scss @@ -1,6 +1,8 @@ +@use "../../mg-variables"; + .icon-search { &::before { - border: $icon-border-width solid; + border: mg-variables.$icon-border-width solid; border-radius: 100%; width: 60%; height: 60%; diff --git a/src/scss/icons/action/_icon-spinner.scss b/src/scss/icons/action/_icon-spinner.scss index 8833d6d..61bbaf0 100644 --- a/src/scss/icons/action/_icon-spinner.scss +++ b/src/scss/icons/action/_icon-spinner.scss @@ -1,5 +1,7 @@ +@use "../../mg-variables"; + .icon-spinner { - border: $icon-border-width solid currentcolor; + border: mg-variables.$icon-border-width solid currentcolor; border-radius: 50%; border-top-color: transparent; diff --git a/src/scss/icons/action/_icon-stop.scss b/src/scss/icons/action/_icon-stop.scss index 93e2fd0..38cf0f4 100644 --- a/src/scss/icons/action/_icon-stop.scss +++ b/src/scss/icons/action/_icon-stop.scss @@ -1,5 +1,7 @@ +@use "../../mg-variables"; + .icon-stop { - border: $icon-border-width solid currentcolor; + border: mg-variables.$icon-border-width solid currentcolor; border-radius: 50%; &::after, diff --git a/src/scss/icons/core.scss b/src/scss/icons/core.scss index 199cd3b..23a1d16 100644 --- a/src/scss/icons/core.scss +++ b/src/scss/icons/core.scss @@ -1,3 +1,5 @@ +@use "../mg-variables"; + $icon-border-width: .2rem; $icon-prefix: "mg-icon"; @@ -28,7 +30,7 @@ $icon-prefix: "mg-icon"; } - @each $key, $value in $font-sizes { + @each $key, $value in mg-variables.$font-sizes { &.#{$icon-prefix}--#{$key} { font-size: $value; min-width: $value; diff --git a/src/scss/icons/icons.scss b/src/scss/icons/icons.scss index 123e614..bfafa5e 100644 --- a/src/scss/icons/icons.scss +++ b/src/scss/icons/icons.scss @@ -1,15 +1,15 @@ /*! Forked from Icons.css | MIT License | github.com/picturepan2/icons.css */ -@import "core"; -@import "action/icon-check"; -@import "action/icon-close"; -@import "action/icon-minus"; -@import "action/icon-plus"; -@import "action/icon-spinner"; -@import "action/icon-stop"; -@import "action/icon-search"; -@import "navigation/icon-arrows"; -@import "navigation/icon-caret"; -@import "navigation/icon-menu"; -@import "navigation/icon-apps"; -@import "navigation/icon-more"; \ No newline at end of file +@use "core"; +@use "action/icon-check"; +@use "action/icon-close"; +@use "action/icon-minus"; +@use "action/icon-plus"; +@use "action/icon-spinner"; +@use "action/icon-stop"; +@use "action/icon-search"; +@use "navigation/icon-arrows"; +@use "navigation/icon-caret"; +@use "navigation/icon-menu"; +@use "navigation/icon-apps"; +@use "navigation/icon-more"; \ No newline at end of file diff --git a/src/scss/icons/navigation/_icon-arrows.scss b/src/scss/icons/navigation/_icon-arrows.scss index 1b89e93..13285f5 100644 --- a/src/scss/icons/navigation/_icon-arrows.scss +++ b/src/scss/icons/navigation/_icon-arrows.scss @@ -1,3 +1,5 @@ +@use "../../mg-variables"; + .icon-arrow-down, .icon-arrow-left, .icon-arrow-right, @@ -7,7 +9,7 @@ .icon-forward, .icon-upward { &::before { - border: $icon-border-width solid currentcolor; + border: mg-variables.$icon-border-width solid currentcolor; border-bottom: 0; border-right: 0; height: 1.04rem; @@ -43,7 +45,7 @@ .icon-forward { &::after { background: currentcolor; - height: $icon-border-width; + height: mg-variables.$icon-border-width; width: 1.28rem; } } @@ -53,7 +55,7 @@ &::after { background: currentcolor; height: 1.28rem; - width: $icon-border-width; + width: mg-variables.$icon-border-width; } } diff --git a/src/scss/icons/navigation/_icon-menu.scss b/src/scss/icons/navigation/_icon-menu.scss index aad255b..8ff47d2 100644 --- a/src/scss/icons/navigation/_icon-menu.scss +++ b/src/scss/icons/navigation/_icon-menu.scss @@ -1,8 +1,10 @@ +@use "../../mg-variables"; + .icon-menu { &::before { background: currentcolor; box-shadow: 0 -0.6rem, 0 0.6rem; - border: calc($icon-border-width/3) solid currentcolor; + border: calc(mg-variables.$icon-border-width/3) solid currentcolor; width: 75%; } } \ No newline at end of file diff --git a/src/scss/main.scss b/src/scss/main.scss index 7bc8a6b..0ae2ab7 100644 --- a/src/scss/main.scss +++ b/src/scss/main.scss @@ -1,28 +1,28 @@ -@import "mg-variables"; -@import "extensions/mg-theme"; -@import "core/milligram"; -@import "extensions/mg-icon"; -@import "extensions/mg-common"; -@import "extensions/mg-dropdown"; -@import "extensions/mg-tabs"; -@import "extensions/mg-select"; -@import "extensions/mg-alert"; -@import "extensions/mg-radio"; -@import "extensions/mg-check"; -@import "extensions/mg-nav"; -@import "extensions/mg-group"; -@import "extensions/mg-modal"; -@import "extensions/mg-toggle"; -@import "extensions/mg-loader"; -@import "extensions/mg-timeline"; -@import "extensions/mg-badges"; -@import "extensions/mg-text"; -@import "extensions/mg-collapse"; -@import "extensions/mg-progress"; -@import "extensions/mg-grid-utilities"; -@import "extensions/mg-grid"; -@import "extensions/mg-colors"; -@import "extensions/mg-positioning"; -@import "extensions/mg-sizing"; -@import "extensions/mg-display"; -@import "icons/icons"; \ No newline at end of file +@use "mg-variables"; +@use "extensions/mg-theme"; +@use "core/milligram"; +@use "extensions/mg-icon"; +@use "extensions/mg-common"; +@use "extensions/mg-dropdown"; +@use "extensions/mg-tabs"; +@use "extensions/mg-select"; +@use "extensions/mg-alert"; +@use "extensions/mg-radio"; +@use "extensions/mg-check"; +@use "extensions/mg-nav"; +@use "extensions/mg-group"; +@use "extensions/mg-modal"; +@use "extensions/mg-toggle"; +@use "extensions/mg-loader"; +@use "extensions/mg-timeline"; +@use "extensions/mg-badges"; +@use "extensions/mg-text"; +@use "extensions/mg-collapse"; +@use "extensions/mg-progress"; +@use "extensions/mg-grid-utilities"; +@use "extensions/mg-grid"; +@use "extensions/mg-colors"; +@use "extensions/mg-positioning"; +@use "extensions/mg-sizing"; +@use "extensions/mg-display"; +@use "icons/icons"; \ No newline at end of file diff --git a/src/scss/mg-variables.scss b/src/scss/mg-variables.scss index ca148f4..18a408b 100644 --- a/src/scss/mg-variables.scss +++ b/src/scss/mg-variables.scss @@ -1,5 +1,7 @@ -/*! mgplus.css #{$package_version} | MIT License | github.com/mgpluscss/mgplus */ -// exposed variables +$package-version: '' !default; + +/*! mgplus.css #{$package-version} | MIT License | github.com/mgpluscss/mgplus */ +// exposed variables /* stylelint-disable */ :root { --mg-color-dark: hsl(255deg 0% 5%); diff --git a/vite.config.ts b/vite.config.ts index 2265067..630c7af 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -8,6 +8,7 @@ export default defineConfig({ css: { preprocessorOptions: { scss: { + api: 'modern-compiler', additionalData: ` $package_version: "${process.env.PACKAGE_VERSION}"; ` @@ -19,7 +20,7 @@ export default defineConfig({ { name: 'html-transform', transformIndexHtml(html) { - return html.replace(/\$PACKAGE_VERSION/g, process.env.PACKAGE_VERSION); + return html.replace(/\$PACKAGE_VERSION/g, process.env.PACKAGE_VERSION || ''); } } ], diff --git a/vite.lib.config.ts b/vite.lib.config.ts index 0eb2182..45d82f4 100644 --- a/vite.lib.config.ts +++ b/vite.lib.config.ts @@ -10,6 +10,7 @@ export default defineConfig({ css: { preprocessorOptions: { scss: { + api: 'modern-compiler', additionalData: ` $package_version: "${process.env.PACKAGE_VERSION}"; ` From e85119f5520a4ea50c47846ff39eb779e82e35e9 Mon Sep 17 00:00:00 2001 From: medevod Date: Sun, 6 Sep 2026 23:10:14 +0000 Subject: [PATCH 8/8] chore: update CDN script tags to use type=module in documentation and examples --- demo/sections/getting-started.html | 6 +++--- readme.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/demo/sections/getting-started.html b/demo/sections/getting-started.html index d832a9d..554337b 100644 --- a/demo/sections/getting-started.html +++ b/demo/sections/getting-started.html @@ -15,7 +15,7 @@

Quick start (statics websites)

  • Include Mg+ plugins at the end of your page to allow user ui interactions (optional) styles: -
    +
  • Start using the predefined classes in your HTML elements. For example, to create a button, you can use:
    @@ -45,14 +45,14 @@

    JS Plugin configuration (optional)

    Auto register all plugins

    Just add following script at the end of your page

    -

    +

    Register specific plugins

    Just add following script at the end of your page with required plugin names to register separated by a comma

    -

    +

    To allow plugin works for your mgplus css components diff --git a/readme.md b/readme.md index c600878..569c11f 100644 --- a/readme.md +++ b/readme.md @@ -67,7 +67,7 @@ MgPlus is specially designed to quickly create a website or a small page with mi 2- (Optional) Include Mg+ plugins at the end of your page to allow dynamic ui interactions (dynamic class toggling) ```html - + ``` 3- Start using the predefined classes in your HTML elements. For example, to create a button, you can use: