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 (
+ <>
+ modalRef.current?.open()}>
+ Open Settings
+
+
+
+
+
Settings
+
Configure preferences below.
+
Close
+
+
+ >
+ );
+}
+```
+
+### Vue 3
+Vue natively supports custom elements without extra configuration:
+
+```vue
+
+
+
+
+ Actions
+
+
+
+```
+
+### Svelte 5
+Svelte compiles custom elements cleanly with full reactive binding:
+
+```svelte
+
+
+ modalEl.open()}>
+ Open Svelte Modal
+
+
+
+
+
Rendered with Svelte
+
Dismiss
+
+
+```
+
+### 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
+Specs 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:
Click me
@@ -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: