From 5f361b2c16cdbc78f3f4a3fa049cdeea0e241f41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?He=CC=84sperus?= Date: Mon, 23 Feb 2026 23:20:12 +0800 Subject: [PATCH 1/2] refactor(types): refactor types to align with SynthKernel standard --- .github/workflows/publish.yml | 3 + README.md | 4 +- docs/.vitepress/config.ts | 5 + docs/components/playground.vue | 2 +- docs/en/basic/types.md | 6 +- docs/en/basic/use-pointeract.md | 19 +- docs/en/development/custom-modules.md | 6 +- docs/en/development/testing.md | 14 +- docs/en/index.md | 15 +- docs/en/modules/click.md | 2 +- docs/en/modules/drag.md | 2 +- docs/en/modules/lubricator.md | 8 +- docs/en/modules/multitouch-pan-zoom.md | 2 +- docs/en/modules/prevent-default.md | 2 +- docs/en/modules/wheel-pan-zoom.md | 2 +- jsr.json | 21 + package.json | 21 +- pnpm-lock.yaml | 724 +++++++++--------- src/{baseModule.ts => BaseModule.ts} | 29 +- src/{pointeract.ts => Pointeract.ts} | 32 +- src/declarations.ts | 71 -- src/index.ts | 18 +- src/modules/{click.ts => Click.ts} | 4 +- src/modules/{drag.ts => Drag.ts} | 4 +- src/modules/{lubricator.ts => Lubricator.ts} | 10 +- ...titouchPanZoom.ts => MultitouchPanZoom.ts} | 4 +- .../{preventDefault.ts => PreventDefault.ts} | 2 +- .../{wheelPanZoom.ts => WheelPanZoom.ts} | 6 +- src/types.ts | 56 ++ src/utils.ts | 11 +- tests/click.test.ts | 6 +- tests/dev/script.ts | 2 +- tests/drag.test.ts | 2 +- tests/integration.test.ts | 6 +- tests/multiTouch.test.ts | 2 +- tests/testUtils.ts | 3 +- tests/wheel.test.ts | 4 +- 37 files changed, 575 insertions(+), 555 deletions(-) create mode 100644 jsr.json rename src/{baseModule.ts => BaseModule.ts} (67%) rename src/{pointeract.ts => Pointeract.ts} (92%) delete mode 100644 src/declarations.ts rename src/modules/{click.ts => Click.ts} (92%) rename src/modules/{drag.ts => Drag.ts} (80%) rename src/modules/{lubricator.ts => Lubricator.ts} (95%) rename src/modules/{multitouchPanZoom.ts => MultitouchPanZoom.ts} (94%) rename src/modules/{preventDefault.ts => PreventDefault.ts} (94%) rename src/modules/{wheelPanZoom.ts => WheelPanZoom.ts} (92%) create mode 100644 src/types.ts diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 174aae1..2e0ce08 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -36,3 +36,6 @@ jobs: - name: Publish to npm run: pnpm publish --no-git-checks + + - name: Publish to JSR + run: pnpx jsr publish diff --git a/README.md b/README.md index b9de7f2..d723f70 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@
-

modern, lightweight, robust and extensible human gesture recognizer

+

🖱️🤏 lightweight, robust and extensible human gesture detector

@@ -89,7 +89,7 @@ Then simply grab the core class and a module: ```TypeScript import { Pointeract, Drag } from 'pointeract'; -new Pointeract({ element: yourElement }, Drag) +new Pointeract({ element: yourElement }, [Drag]) .start() .on('drag', e => console.log(e)); ``` diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 8e66d51..0be0aba 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -98,6 +98,11 @@ export default defineConfig({ ], editLink: 'https://github.com/hesprs/pointeract/edit/main/docs/:path', outline: 'deep', + footer: { + message: + 'Licensed under Apache License 2.0.', + copyright: 'Copyright © 2025-2026 Hēsperus', + }, }, markdown: { config(md) { diff --git a/docs/components/playground.vue b/docs/components/playground.vue index 45758b3..5f34629 100644 --- a/docs/components/playground.vue +++ b/docs/components/playground.vue @@ -25,7 +25,7 @@ import { zoomPreset, panPreset, } from '@'; -import { Coordinates } from '@/declarations'; +import { Coordinates } from '@/types'; function C2C(coords: Coordinates) { return { diff --git a/docs/en/basic/types.md b/docs/en/basic/types.md index 5401bc5..1afff12 100644 --- a/docs/en/basic/types.md +++ b/docs/en/basic/types.md @@ -15,9 +15,9 @@ This architecture can create highly modular apps and nice DX. Here we provide yo :::tip All the types shown below are designed to be flexible, they accept: -- a single constructor / instance -- an array of either module constructors / instances -- nothing +- an array of module constructor types +- an array of module instance types +- nothing (which means no module loaded) as their type parameters diff --git a/docs/en/basic/use-pointeract.md b/docs/en/basic/use-pointeract.md index dea5f35..d003692 100644 --- a/docs/en/basic/use-pointeract.md +++ b/docs/en/basic/use-pointeract.md @@ -6,7 +6,7 @@ Everything Pointeract does is based on this class. It serves as an orchestrator | Description | Method | | --------------------------------------- | ------------------------------------------------------------ | -| [Instantiate the Class](#instantiation) | `new Pointeract(element, modules, options?)` | +| [Instantiate the Class](#instantiation) | `new Pointeract(options, modules?)` | | [Start Base Class](#start-and-stop) | `pointeract.start()` | | [Stop Base Class](#start-and-stop) | `pointeract.stop()` | | [Start Modules](#modules) | `pointeract.start(ModuleConstructor \| ModuleConstructor[])` | @@ -63,7 +63,7 @@ const pointeract = new Pointeract(options, [Drag, PreventDefault]); ``` ::: info -Pointeract uses TypeScript generics to smartly infer the types of options, events, and class methods available by scanning every module passed into the constructor. +Powered by [SynthKernel](https://hesprs.github.io/researches/synthkernel), Pointeract uses TypeScript generics to smartly infer the types of options, events, and class methods available by scanning every module passed into the constructor. ::: ### Start and Stop @@ -109,10 +109,9 @@ All modules are instantiated during the construction of `Pointeract` and dispose To turn on/off modules at runtime, also use `start()` and `stop()`. For these two methods, if you do not pass any arguments, they will start/stop the Pointeract instance; otherwise the specified modules. All modules passed in are enabled by default at Pointeract construction. -You start/stop modules by passing in the **constructors** of modules, the methods accept a single module or an array of modules: +You start/stop modules by passing in the **constructors** of modules, the methods accept an array of modules: ```TypeScript -pointeract.start(PreventDefault); // single module pointeract.stop([PreventDefault, Drag]); // multiple modules ``` @@ -122,9 +121,9 @@ Note that the start/stop of modules are independent to the start/stop of the bas ```TypeScript // we have modules PreventDefault and Drag pointeract.stop(); // everything is paused -pointeract.stop(PreventDefault); // no apparent change, but PreventDefault is disabled at module level +pointeract.stop([PreventDefault]); // no apparent change, but PreventDefault is disabled at module level pointeract.start(); // only the base class and Drag are started -pointeract.start(PreventDefault); // PreventDefault will not be restarted unless explicitly reenabled here +pointeract.start([PreventDefault]); // PreventDefault will not be restarted unless explicitly reenabled here ``` ::: @@ -166,9 +165,10 @@ Options are defined as an object and passed as the third argument of a Pointerac ```TypeScript const options = { + element: app, coordinateOutput: 'absolute', } -const pointeract = new Pointeract(app, [Drag, PreventDefault], options); +const pointeract = new Pointeract(options, [Drag, PreventDefault]); ``` ### Base Options @@ -198,10 +198,11 @@ Pointeract uses the same `options` reference passed in the constructor, you can import { Pointeract, WheelPanZoom, Options } from 'pointeract'; const options: Options = { + element: document.body coordinateOutput: 'absolute', // output absolute coordinates } -const pointeract = new Pointeract(document.body, WheelPanZoom, options); +const pointeract = new Pointeract(options, [WheelPanZoom]); options.coordinateOutput = 'relative'; // output format instantly changes to relative ``` @@ -238,7 +239,7 @@ pointeract.stop(); pointeract.start(); // Disable PreventDefault only -pointeract.stop(PreventDefault); +pointeract.stop([PreventDefault]); // Dispose pointeract.dispose(); diff --git a/docs/en/development/custom-modules.md b/docs/en/development/custom-modules.md index 2c14efe..66d464f 100644 --- a/docs/en/development/custom-modules.md +++ b/docs/en/development/custom-modules.md @@ -91,8 +91,8 @@ class BaseModule { - `onPointerMove`: Triggered when a pointer is moved (same to `pointermove` event). - `onPointerUp`: Triggered when a pointer is released (same to `pointerup` event). - `onWheel`: Triggered when a wheel event is triggered (same to `wheel` event). -- `onStart`: Triggered when the module is started or after construction (`pointeract.start(MyModule)`). -- `onStop`: Triggered when the module is stopped or before disposal (`pointeract.stop(MyModule)`). +- `onStart`: Triggered when the module is started or after construction (`pointeract.start([MyModule])`). +- `onStop`: Triggered when the module is stopped or before disposal (`pointeract.stop([MyModule])`). - `dispose`: Triggered when the module and the Pointeract instance is disposed (`pointeract.dispose()`). ::: tip @@ -217,7 +217,7 @@ Then when you instantiate the `Pointeract` class with your module loaded, you ca import { Pointeract } from 'pointeract'; import YourModule from './your-module'; -const instance = new Pointeract({ element: app }, YourModule); +const instance = new Pointeract({ element: app }, [YourModule]); instance.log(); // Result: diff --git a/docs/en/development/testing.md b/docs/en/development/testing.md index 8790b4a..8cfd7c1 100644 --- a/docs/en/development/testing.md +++ b/docs/en/development/testing.md @@ -1,10 +1,6 @@ # Testing -Any professional library should have a test suite, Pointeract is no different. - -[![Test Coverage](https://img.shields.io/codecov/c/github/hesprs/pointeract/main?style=flat&logo=codecov&logoColor=white&label=Test%20Coverage&labelColor=ff0077&color=333333)](https://codecov.io/github/hesprs/pointeract) - -Above is the current test coverage. +Go to [Codecov](https://codecov.io/github/hesprs/pointeract) to see the current test coverage. ## Techstack @@ -13,7 +9,7 @@ Above is the current test coverage. ## Standards -Pointeract should obey the test requirements as follows: +Pointeract obeys the test requirements as follows: - When developing a new module, it is mandatory to write a unit test unless it's untestable. - The overall test coverage should be higher than 90%. @@ -28,4 +24,8 @@ The interaction denoted by the code is visualized as follows: ![Monkey Test](/monkeyTest.svg) -The aim of this test is to simulate chaotic multitouch drag, pan and zoom intends to ensure `drag` and `multitouchPanZoom` modules can survive extreme conditions. Pointeract coped it well. But when the similar test (manual human test) is conducted in other libraries like `Hammer.js` or `Interact.js`, [they failed](/whats-pointeract#how-pointeract-stands-out). +The aim of this test is to simulate chaotic multitouch drag, pan and zoom intends to ensure `drag` and `multitouchPanZoom` modules can survive extreme conditions. Pointeract handled it decently. + +But when the similar manual human test is conducted in the website demos of `Hammer.js` and `Interact.js`, [they failed for different symptoms](/whats-pointeract#how-pointeract-stands-out). + +This test demonstrates how `Pointeract` can handle extreme conditions with the least amount of code. diff --git a/docs/en/index.md b/docs/en/index.md index 06a3a84..6e865df 100644 --- a/docs/en/index.md +++ b/docs/en/index.md @@ -17,16 +17,21 @@ hero: link: /playground features: - - title: Modern + - title: Powered by SynthKernel icon: 🧪 - details: Written in TypeScript, succinct in size, wide compatibility. + details: 100% modular with precise typing and excellent extensibility. + link: https://hesprs.github.io/researches/synthkernel + linkText: Learn more about SynthKernel - title: Scale from 1KB icon: 🐣 + link: /modules details: Grab what you need via modules, the base class is only 1KB gzipped. - - title: Extensible + - title: Runtime-Flexible icon: 🧩 - details: Write your own modules and plug into Pointeract via its module API. + details: Start/stop the detector and any module at any time, update options reactively. - title: Robust icon: 🦾 - details: Full touchpad support, excels at complex gestures where most interaction libraries fail. + details: Excels at complex gestures where most contenders fail. + link: /development/testing + linkText: See testing --- diff --git a/docs/en/modules/click.md b/docs/en/modules/click.md index fc1f8d5..ce42f04 100644 --- a/docs/en/modules/click.md +++ b/docs/en/modules/click.md @@ -8,7 +8,7 @@ The click module in checks whether the mouse/touch has actually moved during dow ```TypeScript import { Click, Pointeract } from 'pointeract'; -const pointeract = new Pointeract({ element: app }, Click); +const pointeract = new Pointeract({ element: app }, [Click]); ``` ## Options diff --git a/docs/en/modules/drag.md b/docs/en/modules/drag.md index dafb758..09947b4 100644 --- a/docs/en/modules/drag.md +++ b/docs/en/modules/drag.md @@ -8,5 +8,5 @@ This module handles drag interactions, events are dispatched when a single touch ```TypeScript import { Drag, Pointeract } from 'pointeract'; -const pointeract = new Pointeract({ element: app }, Drag); +const pointeract = new Pointeract({ element: app }, [Drag]); ``` diff --git a/docs/en/modules/lubricator.md b/docs/en/modules/lubricator.md index 2234baf..32dc235 100644 --- a/docs/en/modules/lubricator.md +++ b/docs/en/modules/lubricator.md @@ -23,9 +23,11 @@ Lubricator requires a granular configuration of what and how to interpolate an e ```TypeScript interface Options extends BaseOptions { lubricator?: { + // this is the configuration for each event [Key: string]?: { decayFactor: number; fields: { + // this is the configuration for each field in the emitted event [Key: string]?: { countType: 'sum' | 'product'; diminishBoundary: number; @@ -42,7 +44,7 @@ In **per-event** configuration: `decayFactor`: controls how fast it interpolates, i.e., how the smoothified event lags behind the real-time interaction. The lower this value is, the more smooth interactions are. -`fields`: the name of fields in the event to interpolate, the fields must be the type `number`, you can find the fields of events in the [event types](/basic/types#events). The values of the items in `fields` are configurations per-field. +`fields`: the names of fields in the event to interpolate, the fields must be the type `number`, you can find the fields of events in the [event types](/basic/types#events). The values of the items in `fields` are configurations per-field. In **per-field** configuration: @@ -53,7 +55,7 @@ In **per-field** configuration: `diminishBoundary`: defines the threshold for the final dispatch. -- interpolation is infinite if you don't manually define a boundary. If the difference between the real dispatch and raw is smaller than this boundary, the interpolation will stop and lubricator will dispatch a final event to make the aggregate interpolation equals the raw. +- interpolation is infinite if you don't manually define a boundary. If the difference between the real dispatch and raw is smaller than this boundary, the interpolation will stop and lubricator will dispatch a final event to make the aggregate interpolation equal the raw. In the following example, we will smoothify `zoom` event: @@ -76,7 +78,7 @@ new Pointeract({ }, [WheelPanZoom, Lubricator]) ``` -In this example, we've configured Lubricator to intercept event `zoom`, interpolate the `factor` field in it with product goal and stops when the aggregate interpolation is less than 1% from total product. +In this example, we've configured Lubricator to intercept event `zoom`, interpolate the `factor` field in it with product goal and stops when the leftover zoom factor is less than 0.01. ## Presets diff --git a/docs/en/modules/multitouch-pan-zoom.md b/docs/en/modules/multitouch-pan-zoom.md index c6575e8..6259123 100644 --- a/docs/en/modules/multitouch-pan-zoom.md +++ b/docs/en/modules/multitouch-pan-zoom.md @@ -11,5 +11,5 @@ This module monitors touches on the screen. ```TypeScript import { MultitouchPanZoom, Pointeract } from 'pointeract'; -const pointeract = new Pointeract({ element: app }, MultitouchPanZoom); +const pointeract = new Pointeract({ element: app }, [MultitouchPanZoom]); ``` diff --git a/docs/en/modules/prevent-default.md b/docs/en/modules/prevent-default.md index 21d8315..20bb42f 100644 --- a/docs/en/modules/prevent-default.md +++ b/docs/en/modules/prevent-default.md @@ -6,5 +6,5 @@ This module disables all default browser behaviors related to touch / mouse / wh ```TypeScript import { PreventDefault, Pointeract } from 'pointeract'; -const pointeract = new Pointeract({ element: app }, PreventDefault); +const pointeract = new Pointeract({ element: app }, [PreventDefault]); ``` diff --git a/docs/en/modules/wheel-pan-zoom.md b/docs/en/modules/wheel-pan-zoom.md index 08d17e8..2e9e60f 100644 --- a/docs/en/modules/wheel-pan-zoom.md +++ b/docs/en/modules/wheel-pan-zoom.md @@ -22,7 +22,7 @@ Most devices with touchpad interpret touchpad gestures as mouse wheel + key pres ```TypeScript import { WheelPanZoom, Pointeract } from 'pointeract'; -const pointeract = new Pointeract({ element: app }, WheelPanZoom); +const pointeract = new Pointeract({ element: app }, [WheelPanZoom]); ``` ## Options diff --git a/jsr.json b/jsr.json new file mode 100644 index 0000000..a8613c3 --- /dev/null +++ b/jsr.json @@ -0,0 +1,21 @@ +{ + "name": "pointeract", + "version": "1.1.2", + "description": "A 3KB, tree-shakable, TypeScript-native alternative to Hammer.js for robust pan/zoom gestures — runtime-flexible, extensible, and safe.", + "keywords": ["lightweight", "frontend", "gesture-detection", "pan-zoom", "typescript"], + "homepage": "https://pointeract.consensia.cc", + "bugs": { + "url": "https://github.com/hesprs/pointeract/issues" + }, + "license": "MIT", + "author": { + "name": "Hēsperus", + "email": "hesprs@outlook.com" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/hesprs/pointeract.git" + }, + "exports": "./src/index.ts", + "sideEffects": false +} diff --git a/package.json b/package.json index 0277671..b898e60 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,12 @@ { "name": "pointeract", - "version": "1.1.1", - "description": "Modern, lightweight, robust and extensible human gesture recognizer.", + "version": "1.1.2", + "description": "A 3KB, tree-shakable, TypeScript-native alternative to Hammer.js for robust pan/zoom gestures — runtime-flexible and extensible.", "keywords": [ "frontend", - "interaction", - "pointer-events", + "gesture-detection", + "lightweight", + "pan-zoom", "typescript" ], "homepage": "https://pointeract.consensia.cc", @@ -49,20 +50,20 @@ "devDependencies": { "@types/node": "^25.3.0", "@vitest/coverage-v8": "^4.0.18", - "happy-dom": "^20.6.3", - "oxfmt": "^0.33.0", - "oxlint": "^1.48.0", - "oxlint-tsgolint": "^0.14.0", + "happy-dom": "^20.7.0", + "oxfmt": "^0.35.0", + "oxlint": "^1.50.0", + "oxlint-tsgolint": "^0.14.2", "terser": "^5.46.0", "tsc-alias": "^1.8.16", "typescript": "^5.9.3", "vite": "^7.3.1", "vitepress": "2.0.0-alpha.16", "vitepress-plugin-group-icons": "^1.7.1", - "vitepress-theme-trito": "^1.0.5", + "vitepress-theme-trito": "^1.0.6", "vitest": "^4.0.18", "vue": "^3.5.28", - "vue-tsc": "^3.2.4" + "vue-tsc": "^3.2.5" }, "packageManager": "pnpm@10.29.3" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4c1471e..2debf67 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,19 +13,19 @@ importers: version: 25.3.0 '@vitest/coverage-v8': specifier: ^4.0.18 - version: 4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.6.3)(jsdom@27.3.0)(terser@5.46.0)) + version: 4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.7.0)(jsdom@27.3.0)(terser@5.46.0)) happy-dom: - specifier: ^20.6.3 - version: 20.6.3 + specifier: ^20.7.0 + version: 20.7.0 oxfmt: - specifier: ^0.33.0 - version: 0.33.0 + specifier: ^0.35.0 + version: 0.35.0 oxlint: - specifier: ^1.48.0 - version: 1.48.0(oxlint-tsgolint@0.14.0) + specifier: ^1.50.0 + version: 1.50.0(oxlint-tsgolint@0.14.2) oxlint-tsgolint: - specifier: ^0.14.0 - version: 0.14.0 + specifier: ^0.14.2 + version: 0.14.2 terser: specifier: ^5.46.0 version: 5.46.0 @@ -45,17 +45,17 @@ importers: specifier: ^1.7.1 version: 1.7.1(vite@7.3.1(@types/node@25.3.0)(terser@5.46.0)) vitepress-theme-trito: - specifier: ^1.0.5 - version: 1.0.5(@types/node@25.3.0)(focus-trap@7.8.0)(postcss@8.5.6)(terser@5.46.0)(typescript@5.9.3) + specifier: ^1.0.6 + version: 1.0.6(@types/node@25.3.0)(focus-trap@7.8.0)(postcss@8.5.6)(terser@5.46.0)(typescript@5.9.3) vitest: specifier: ^4.0.18 - version: 4.0.18(@types/node@25.3.0)(happy-dom@20.6.3)(jsdom@27.3.0)(terser@5.46.0) + version: 4.0.18(@types/node@25.3.0)(happy-dom@20.7.0)(jsdom@27.3.0)(terser@5.46.0) vue: specifier: ^3.5.28 version: 3.5.28(typescript@5.9.3) vue-tsc: - specifier: ^3.2.4 - version: 3.2.4(typescript@5.9.3) + specifier: ^3.2.5 + version: 3.2.5(typescript@5.9.3) packages: @@ -95,8 +95,8 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@csstools/color-helpers@6.0.1': - resolution: {integrity: sha512-NmXRccUJMk2AWA5A7e5a//3bCIMyOu2hAtdRYrhPPHjDxINuCwX1w6rnIZ4xjLcp0ayv6h8Pc3X0eJUGiAAXHQ==} + '@csstools/color-helpers@6.0.2': + resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} engines: {node: '>=20.19.0'} '@csstools/css-calc@3.1.1': @@ -106,8 +106,8 @@ packages: '@csstools/css-parser-algorithms': ^4.0.0 '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-color-parser@4.0.1': - resolution: {integrity: sha512-vYwO15eRBEkeF6xjAno/KQ61HacNhfQuuU/eGwH67DplL0zD5ZixUa563phQvUelA07yDczIXdtmYojCphKJcw==} + '@csstools/css-color-parser@4.0.2': + resolution: {integrity: sha512-0GEfbBLmTFf0dJlpsNU7zwxRIH0/BGEMuXLTCvFYxuL1tNhqzTbtnFICyJLTNK4a+RechKP75e7w42ClXSnJQw==} engines: {node: '>=20.19.0'} peerDependencies: '@csstools/css-parser-algorithms': ^4.0.0 @@ -119,8 +119,8 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.0.27': - resolution: {integrity: sha512-sxP33Jwg1bviSUXAV43cVYdmjt2TLnLXNqCWl9xmxHawWVjGz/kEbdkr7F9pxJNBN2Mh+dq0crgItbW6tQvyow==} + '@csstools/css-syntax-patches-for-csstree@1.0.28': + resolution: {integrity: sha512-1NRf1CUBjnr3K7hu8BLxjQrKCxEe8FP/xmPTenAxCRZWVLbmGotkFvG9mfNpjA6k7Bw1bw4BilZq9cu19RA5pg==} '@csstools/css-tokenizer@4.0.0': resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} @@ -334,276 +334,276 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxfmt/binding-android-arm-eabi@0.33.0': - resolution: {integrity: sha512-ML6qRW8/HiBANteqfyFAR1Zu0VrJu+6o4gkPLsssq74hQ7wDMkufBYJXI16PGSERxEYNwKxO5fesCuMssgTv9w==} + '@oxfmt/binding-android-arm-eabi@0.35.0': + resolution: {integrity: sha512-BaRKlM3DyG81y/xWTsE6gZiv89F/3pHe2BqX2H4JbiB8HNVlWWtplzgATAE5IDSdwChdeuWLDTQzJ92Lglw3ZA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxfmt/binding-android-arm64@0.33.0': - resolution: {integrity: sha512-WimmcyrGpTOntj7F7CO9RMssncOKYall93nBnzJbI2ZZDhVRuCkvFwTpwz80cZqwYm5udXRXfF40ZXcCxjp9jg==} + '@oxfmt/binding-android-arm64@0.35.0': + resolution: {integrity: sha512-/O+EbuAJYs6nde/anv+aID6uHsGQApyE9JtYBo/79KyU8e6RBN3DMbT0ix97y1SOnCglurmL2iZ+hlohjP2PnQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxfmt/binding-darwin-arm64@0.33.0': - resolution: {integrity: sha512-PorspsX9O5ISstVaq34OK4esN0LVcuU4DVg+XuSqJsfJ//gn6z6WH2Tt7s0rTQaqEcp76g7+QdWQOmnJDZsEVg==} + '@oxfmt/binding-darwin-arm64@0.35.0': + resolution: {integrity: sha512-pGqRtqlNdn9d4VrmGUWVyQjkw79ryhI6je9y2jfqNUIZCfqceob+R97YYAoG7C5TFyt8ILdLVoN+L2vw/hSFyA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxfmt/binding-darwin-x64@0.33.0': - resolution: {integrity: sha512-8278bqQtOcHRPhhzcqwN9KIideut+cftBjF8d2TOsSQrlsJSFx41wCCJ38mFmH9NOmU1M+x9jpeobHnbRP1okw==} + '@oxfmt/binding-darwin-x64@0.35.0': + resolution: {integrity: sha512-8GmsDcSozTPjrCJeGpp+sCmS9+9V5yRrdEZ1p/sTWxPG5nYeAfSLuS0nuEYjXSO+CtdSbStIW6dxa+4NM58yRw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxfmt/binding-freebsd-x64@0.33.0': - resolution: {integrity: sha512-BiqYVwWFHLf5dkfg0aCKsXa9rpi//vH1+xePCpd7Ulz9yp9pJKP4DWgS5g+OW8MaqOtt7iyAszhxtk/j1nDKHQ==} + '@oxfmt/binding-freebsd-x64@0.35.0': + resolution: {integrity: sha512-QyfKfTe0ytHpFKHAcHCGQEzN45QSqq1AHJOYYxQMgLM3KY4xu8OsXHpCnINjDsV4XGnQzczJDU9e04Zmd8XqIQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxfmt/binding-linux-arm-gnueabihf@0.33.0': - resolution: {integrity: sha512-oAVmmurXx0OKbNOVv71oK92LsF1LwYWpnhDnX0VaAy/NLsCKf4B7Zo7lxkJh80nfhU20TibcdwYfoHVaqlStPQ==} + '@oxfmt/binding-linux-arm-gnueabihf@0.35.0': + resolution: {integrity: sha512-u+kv3JD6P3J38oOyUaiCqgY5TNESzBRZJ5lyZQ6c2czUW2v5SIN9E/KWWa9vxoc+P8AFXQFUVrdzGy1tK+nbPQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm-musleabihf@0.33.0': - resolution: {integrity: sha512-YB6S8CiRol59oRxnuclJiWoV6l+l8ru/NsuQNYjXZnnPXfSTXKtMLWHCnL/figpCFYA1E7JyjrBbar1qxe2aZg==} + '@oxfmt/binding-linux-arm-musleabihf@0.35.0': + resolution: {integrity: sha512-1NiZroCiV57I7Pf8kOH4XGR366kW5zir3VfSMBU2D0V14GpYjiYmPYFAoJboZvp8ACnZKUReWyMkNKSa5ad58A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm64-gnu@0.33.0': - resolution: {integrity: sha512-hrYy+FpWoB6N24E9oGRimhVkqlls9yeqcRmQakEPUHoAbij6rYxsHHYIp3+FHRiQZFAOUxWKn/CCQoy/Mv3Dgw==} + '@oxfmt/binding-linux-arm64-gnu@0.35.0': + resolution: {integrity: sha512-7Q0Xeg7ZnW2nxnZ4R7aF6DEbCFls4skgHZg+I63XitpNvJCbVIU8MFOTZlvZGRsY9+rPgWPQGeUpLHlyx0wvMA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-arm64-musl@0.33.0': - resolution: {integrity: sha512-O1YIzymGRdWj9cG5iVTjkP7zk9/hSaVN8ZEbqMnWZjLC1phXlv54cUvANGGXndgJp2JS4W9XENn7eo5I4jZueg==} + '@oxfmt/binding-linux-arm64-musl@0.35.0': + resolution: {integrity: sha512-5Okqi+uhYFxwKz8hcnUftNNwdm8BCkf6GSCbcz9xJxYMm87k1E4p7PEmAAbhLTk7cjSdDre6TDL0pDzNX+Y22Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-ppc64-gnu@0.33.0': - resolution: {integrity: sha512-2lrkNe+B0w1tCgQTaozfUNQCYMbqKKCGcnTDATmWCZzO77W2sh+3n04r1lk9Q1CK3bI+C3fPwhFPUR2X2BvlyQ==} + '@oxfmt/binding-linux-ppc64-gnu@0.35.0': + resolution: {integrity: sha512-9k66pbZQXM/lBJWys3Xbc5yhl4JexyfqkEf/tvtq8976VIJnLAAL3M127xHA3ifYSqxdVHfVGTg84eiBHCGcNw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-gnu@0.33.0': - resolution: {integrity: sha512-8DSG1q0M6097vowHAkEyHnKed75/BWr1IBtgCJfytnWQg+Jn1X4DryhfjqonKZOZiv74oFQl5J8TCbdDuXXdtQ==} + '@oxfmt/binding-linux-riscv64-gnu@0.35.0': + resolution: {integrity: sha512-aUcY9ofKPtjO52idT6t0SAQvEF6ctjzUQa1lLp7GDsRpSBvuTrBQGeq0rYKz3gN8dMIQ7mtMdGD9tT4LhR8jAQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-musl@0.33.0': - resolution: {integrity: sha512-eWaxnpPz7+p0QGUnw7GGviVBDOXabr6Cd0w7S/vnWTqQo9z1VroT7XXFnJEZ3dBwxMB9lphyuuYi/GLTCxqxlg==} + '@oxfmt/binding-linux-riscv64-musl@0.35.0': + resolution: {integrity: sha512-C6yhY5Hvc2sGM+mCPek9ZLe5xRUOC/BvhAt2qIWFAeXMn4il04EYIjl3DsWiJr0xDMTJhvMOmD55xTRPlNp39w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-s390x-gnu@0.33.0': - resolution: {integrity: sha512-+mH8cQTqq+Tu2CdoB2/Wmk9CqotXResi+gPvXpb+AAUt/LiwpicTQqSolMheQKogkDTYHPuUiSN23QYmy7IXNQ==} + '@oxfmt/binding-linux-s390x-gnu@0.35.0': + resolution: {integrity: sha512-RG2hlvOMK4OMZpO3mt8MpxLQ0AAezlFqhn5mI/g5YrVbPFyoCv9a34AAvbSJS501ocOxlFIRcKEuw5hFvddf9g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-gnu@0.33.0': - resolution: {integrity: sha512-fjyslAYAPE2+B6Ckrs5LuDQ6lB1re5MumPnzefAXsen3JGwiRilra6XdjUmszTNoExJKbewoxxd6bcLSTpkAJQ==} + '@oxfmt/binding-linux-x64-gnu@0.35.0': + resolution: {integrity: sha512-wzmh90Pwvqj9xOKHJjkQYBpydRkaXG77ZvDz+iFDRRQpnqIEqGm5gmim2s6vnZIkDGsvKCuTdtxm0GFmBjM1+w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-musl@0.33.0': - resolution: {integrity: sha512-ve/jGBlTt35Jl/I0A0SfCQX3wKnadzPDdyOFEwe2ZgHHIT9uhqhAv1PaVXTenSBpauICEWYH8mWy+ittzlVE/A==} + '@oxfmt/binding-linux-x64-musl@0.35.0': + resolution: {integrity: sha512-+HCqYCJPCUy5I+b2cf+gUVaApfgtoQT3HdnSg/l7NIcLHOhKstlYaGyrFZLmUpQt4WkFbpGKZZayG6zjRU0KFA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxfmt/binding-openharmony-arm64@0.33.0': - resolution: {integrity: sha512-lsWRgY9e+uPvwXnuDiJkmJ2Zs3XwwaQkaALJ3/SXU9kjZP0Qh8/tGW8Tk/Z6WL32sDxx+aOK5HuU7qFY9dHJhg==} + '@oxfmt/binding-openharmony-arm64@0.35.0': + resolution: {integrity: sha512-kFYmWfR9YL78XyO5ws+1dsxNvZoD973qfVMNFOS4e9bcHXGF7DvGC2tY5UDFwyMCeB33t3sDIuGONKggnVNSJA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxfmt/binding-win32-arm64-msvc@0.33.0': - resolution: {integrity: sha512-w8AQHyGDRZutxtQ7IURdBEddwFrtHQiG6+yIFpNJ4HiMyYEqeAWzwBQBfwSAxtSNh6Y9qqbbc1OM2mHN6AB3Uw==} + '@oxfmt/binding-win32-arm64-msvc@0.35.0': + resolution: {integrity: sha512-uD/NGdM65eKNCDGyTGdO8e9n3IHX+wwuorBvEYrPJXhDXL9qz6gzddmXH8EN04ejUXUujlq4FsoSeCfbg0Y+Jg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxfmt/binding-win32-ia32-msvc@0.33.0': - resolution: {integrity: sha512-j2X4iumKVwDzQtUx3JBDkaydx6eLuncgUZPl2ybZ8llxJMFbZIniws70FzUQePMfMtzLozIm7vo4bjkvQFsOzw==} + '@oxfmt/binding-win32-ia32-msvc@0.35.0': + resolution: {integrity: sha512-oSRD2k8J2uxYDEKR2nAE/YTY9PobOEnhZgCmspHu0+yBQ665yH8lFErQVSTE7fcGJmJp/cC6322/gc8VFuQf7g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxfmt/binding-win32-x64-msvc@0.33.0': - resolution: {integrity: sha512-lsBQxbepASwOBUh3chcKAjU+jVAQhLElbPYiagIq26cU8vA9Bttj6t20bMvCQCw31m440IRlNhrK7NpnUI8mzA==} + '@oxfmt/binding-win32-x64-msvc@0.35.0': + resolution: {integrity: sha512-WCDJjlS95NboR0ugI2BEwzt1tYvRDorDRM9Lvctls1SLyKYuNRCyrPwp1urUPFBnwgBNn9p2/gnmo7gFMySRoQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxlint-tsgolint/darwin-arm64@0.14.0': - resolution: {integrity: sha512-9JdNm9dNeCNgRxBzYb+8vJa/aPD4asc3INdRAC4oJ5EucM2yIPfmHEMlwkAe2WkC7QHPVMG3L9MheAnCrXPTyg==} + '@oxlint-tsgolint/darwin-arm64@0.14.2': + resolution: {integrity: sha512-03WxIXguCXf1pTmoG2C6vqRcbrU9GaJCW6uTIiQdIQq4BrJnVWZv99KEUQQRkuHK78lOLa9g7B4K58NcVcB54g==} cpu: [arm64] os: [darwin] - '@oxlint-tsgolint/darwin-x64@0.14.0': - resolution: {integrity: sha512-8Z6BkXV7g6BoToCqi/6M7qiDDVHoKzEKRclMXxXiM0JNdk+w4ashNQ101kZh5Xb976vwbo3GuOS8co1UrJ8MQw==} + '@oxlint-tsgolint/darwin-x64@0.14.2': + resolution: {integrity: sha512-ksMLl1cIWz3Jw+U79BhyCPdvohZcJ/xAKri5bpT6oeEM2GVnQCHBk/KZKlYrd7hZUTxz0sLnnKHE11XFnLASNQ==} cpu: [x64] os: [darwin] - '@oxlint-tsgolint/linux-arm64@0.14.0': - resolution: {integrity: sha512-OZJ/mZSY15cSk3uoqYaKkw5Ue7duaDHfYoigy9bdASeNn4fHnYqeziqOPBvD3K76BDN/mwPLydawsgfY4VPQJQ==} + '@oxlint-tsgolint/linux-arm64@0.14.2': + resolution: {integrity: sha512-2BgR535w7GLxBCyQD5DR3dBzbAgiBbG5QX1kAEVzOmWxJhhGxt5lsHdHebRo7ilukYLpBDkerz0mbMErblghCQ==} cpu: [arm64] os: [linux] - '@oxlint-tsgolint/linux-x64@0.14.0': - resolution: {integrity: sha512-NDEBWwtpmCL8AL5jkX9nj9T69QbmaQ5AMSLnMWSJcL4xwR/yh0zk92/662sE2NWiX+8jACycIOa8CzH98rk5gw==} + '@oxlint-tsgolint/linux-x64@0.14.2': + resolution: {integrity: sha512-TUHFyVHfbbGtnTQZbUFgwvv3NzXBgzNLKdMUJw06thpiC7u5OW5qdk4yVXIC/xeVvdl3NAqTfcT4sA32aiMubg==} cpu: [x64] os: [linux] - '@oxlint-tsgolint/win32-arm64@0.14.0': - resolution: {integrity: sha512-onUJNTdoi5eh9HRg0Eb7rBvUtZP8RYP5XCJJkwh1cpNfG8p5JQU0MxYujgdk4ZFGKmg81AsaGAWXDkVNlgMELw==} + '@oxlint-tsgolint/win32-arm64@0.14.2': + resolution: {integrity: sha512-OfYHa/irfVggIFEC4TbawsI7Hwrttppv//sO/e00tu4b2QRga7+VHAwtCkSFWSr0+BsO4InRYVA0+pun5BinpQ==} cpu: [arm64] os: [win32] - '@oxlint-tsgolint/win32-x64@0.14.0': - resolution: {integrity: sha512-5pV3fznLN3yZAbEbygZzM9QvcNLYjLmrnM7AYTunhDnkIqagTv5XFwHqXcZf7MZ6oNPtkcImhtzhSpxsk23n3A==} + '@oxlint-tsgolint/win32-x64@0.14.2': + resolution: {integrity: sha512-5gxwbWYE2pP+pzrO4SEeYvLk4N609eAe18rVXUx+en3qtHBkU8VM2jBmMcZdIHn+G05leu4pYvwAvw6tvT9VbA==} cpu: [x64] os: [win32] - '@oxlint/binding-android-arm-eabi@1.48.0': - resolution: {integrity: sha512-1Pz/stJvveO9ZO7ll4ZoEY3f6j2FiUgBLBcCRCiW6ylId9L9UKs+gn3X28m3eTnoiFCkhKwmJJ+VO6vwsu7Qtg==} + '@oxlint/binding-android-arm-eabi@1.50.0': + resolution: {integrity: sha512-G7MRGk/6NCe+L8ntonRdZP7IkBfEpiZ/he3buLK6JkLgMHgJShXZ+BeOwADmspXez7U7F7L1Anf4xLSkLHiGTg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxlint/binding-android-arm64@1.48.0': - resolution: {integrity: sha512-Zc42RWGE8huo6Ht0lXKjd0NH2lWNmimQHUmD0JFcvShLOuwN+RSEE/kRakc2/0LIgOUuU/R7PaDMCOdQlPgNUQ==} + '@oxlint/binding-android-arm64@1.50.0': + resolution: {integrity: sha512-GeSuMoJWCVpovJi/e3xDSNgjeR8WEZ6MCXL6EtPiCIM2NTzv7LbflARINTXTJy2oFBYyvdf/l2PwHzYo6EdXvg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxlint/binding-darwin-arm64@1.48.0': - resolution: {integrity: sha512-jgZs563/4vaG5jH2RSt2TSh8A2jwsFdmhLXrElMdm3Mmto0HPf85FgInLSNi9HcwzQFvkYV8JofcoUg2GH1HTA==} + '@oxlint/binding-darwin-arm64@1.50.0': + resolution: {integrity: sha512-w3SY5YtxGnxCHPJ8Twl3KmS9oja1gERYk3AMoZ7Hv8P43ZtB6HVfs02TxvarxfL214Tm3uzvc2vn+DhtUNeKnw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxlint/binding-darwin-x64@1.48.0': - resolution: {integrity: sha512-kvo87BujEUjCJREuWDC4aPh1WoXCRFFWE4C7uF6wuoMw2f6N2hypA/cHHcYn9DdL8R2RrgUZPefC8JExyeIMKA==} + '@oxlint/binding-darwin-x64@1.50.0': + resolution: {integrity: sha512-hNfogDqy7tvmllXKBSlHo6k5x7dhTUVOHbMSE15CCAcXzmqf5883aPvBYPOq9AE7DpDUQUZ1kVE22YbiGW+tuw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxlint/binding-freebsd-x64@1.48.0': - resolution: {integrity: sha512-eyzzPaHQKn0RIM+ueDfgfJF2RU//Wp4oaKs2JVoVYcM5HjbCL36+O0S3wO5Xe1NWpcZIG3cEHc/SuOCDRqZDSg==} + '@oxlint/binding-freebsd-x64@1.50.0': + resolution: {integrity: sha512-ykZevOWEyu0nsxolA911ucxpEv0ahw8jfEeGWOwwb/VPoE4xoexuTOAiPNlWZNJqANlJl7yp8OyzCtXTUAxotw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxlint/binding-linux-arm-gnueabihf@1.48.0': - resolution: {integrity: sha512-p3kSloztK7GRO7FyO3u38UCjZxQTl92VaLDsMQAq0eGoiNmeeEF1KPeE4+Fr+LSkQhF8WvJKSuls6TwOlurdPA==} + '@oxlint/binding-linux-arm-gnueabihf@1.50.0': + resolution: {integrity: sha512-hif3iDk7vo5GGJ4OLCCZAf2vjnU9FztGw4L0MbQL0M2iY9LKFtDMMiQAHmkF0PQGQMVbTYtPdXCLKVgdkiqWXQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm-musleabihf@1.48.0': - resolution: {integrity: sha512-uWM+wiTqLW/V0ZmY/eyTWs8ykhIkzU+K2tz/8m35YepYEzohiUGRbnkpAFXj2ioXpQL+GUe5vmM3SLH6ozlfFw==} + '@oxlint/binding-linux-arm-musleabihf@1.50.0': + resolution: {integrity: sha512-dVp9iSssiGAnTNey2Ruf6xUaQhdnvcFOJyRWd/mu5o2jVbFK15E5fbWGeFRfmuobu5QXuROtFga44+7DOS3PLg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm64-gnu@1.48.0': - resolution: {integrity: sha512-OhQNPjs/OICaYqxYJjKKMaIY7p3nJ9IirXcFoHKD+CQE1BZFCeUUAknMzUeLclDCfudH9Vb/UgjFm8+ZM5puAg==} + '@oxlint/binding-linux-arm64-gnu@1.50.0': + resolution: {integrity: sha512-1cT7yz2HA910CKA9NkH1ZJo50vTtmND2fkoW1oyiSb0j6WvNtJ0Wx2zoySfXWc/c+7HFoqRK5AbEoL41LOn9oA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-arm64-musl@1.48.0': - resolution: {integrity: sha512-adu5txuwGvQ4C4fjYHJD+vnY+OCwCixBzn7J3KF3iWlVHBBImcosSv+Ye+fbMMJui4HGjifNXzonjKm9pXmOiw==} + '@oxlint/binding-linux-arm64-musl@1.50.0': + resolution: {integrity: sha512-++B3k/HEPFVlj89cOz8kWfQccMZB/aWL9AhsW7jPIkG++63Mpwb2cE9XOEsd0PATbIan78k2Gky+09uWM1d/gQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxlint/binding-linux-ppc64-gnu@1.48.0': - resolution: {integrity: sha512-inlQQRUnHCny/7b7wA6NjEoJSSZPNea4qnDhWyeqBYWx8ukf2kzNDSiamfhOw6bfAYPm/PVlkVRYaNXQbkLeTQ==} + '@oxlint/binding-linux-ppc64-gnu@1.50.0': + resolution: {integrity: sha512-Z9b/KpFMkx66w3gVBqjIC1AJBTZAGoI9+U+K5L4QM0CB/G0JSNC1es9b3Y0Vcrlvtdn8A+IQTkYjd/Q0uCSaZw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-gnu@1.48.0': - resolution: {integrity: sha512-YiJx6sW6bYebQDZRVWLKm/Drswx/hcjIgbLIhULSn0rRcBKc7d9V6mkqPjKDbhcxJgQD5Zi0yVccJiOdF40AWA==} + '@oxlint/binding-linux-riscv64-gnu@1.50.0': + resolution: {integrity: sha512-jvmuIw8wRSohsQlFNIST5uUwkEtEJmOQYr33bf/K2FrFPXHhM4KqGekI3ShYJemFS/gARVacQFgBzzJKCAyJjg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-musl@1.48.0': - resolution: {integrity: sha512-zwSqxMgmb2ITamNfDv9Q9EKBc/4ZhCBP9gkg2hhcgR6sEVGPUDl1AKPC89CBKMxkmPUi3685C38EvqtZn5OtHw==} + '@oxlint/binding-linux-riscv64-musl@1.50.0': + resolution: {integrity: sha512-x+UrN47oYNh90nmAAyql8eQaaRpHbDPu5guasDg10+OpszUQ3/1+1J6zFMmV4xfIEgTcUXG/oI5fxJhF4eWCNA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxlint/binding-linux-s390x-gnu@1.48.0': - resolution: {integrity: sha512-c/+2oUWAOsQB5JTem0rW8ODlZllF6pAtGSGXoLSvPTonKI1vAwaKhD9Qw1X36jRbcI3Etkpu/9z/RRjMba8vFQ==} + '@oxlint/binding-linux-s390x-gnu@1.50.0': + resolution: {integrity: sha512-i/JLi2ljLUIVfekMj4ISmdt+Hn11wzYUdRRrkVUYsCWw7zAy5xV7X9iA+KMyM156LTFympa7s3oKBjuCLoTAUQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-gnu@1.48.0': - resolution: {integrity: sha512-PhauDqeFW5DGed6QxCY5lXZYKSlcBdCXJnH03ZNU6QmDZ0BFM/zSy1oPT2MNb1Afx1G6yOOVk8ErjWsQ7c59ng==} + '@oxlint/binding-linux-x64-gnu@1.50.0': + resolution: {integrity: sha512-/C7brhn6c6UUPccgSPCcpLQXcp+xKIW/3sji/5VZ8/OItL3tQ2U7KalHz887UxxSQeEOmd1kY6lrpuwFnmNqOA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-musl@1.48.0': - resolution: {integrity: sha512-6d7LIFFZGiavbHndhf1cK9kG9qmy2Dmr37sV9Ep7j3H+ciFdKSuOzdLh85mEUYMih+b+esMDlF5DU0WQRZPQjw==} + '@oxlint/binding-linux-x64-musl@1.50.0': + resolution: {integrity: sha512-oDR1f+bGOYU8LfgtEW8XtotWGB63ghtcxk5Jm6IDTCk++rTA/IRMsjOid2iMd+1bW+nP9Mdsmcdc7VbPD3+iyQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxlint/binding-openharmony-arm64@1.48.0': - resolution: {integrity: sha512-r+0KK9lK6vFp3tXAgDMOW32o12dxvKS3B9La1uYMGdWAMoSeu2RzG34KmzSpXu6MyLDl4aSVyZLFM8KGdEjwaw==} + '@oxlint/binding-openharmony-arm64@1.50.0': + resolution: {integrity: sha512-4CmRGPp5UpvXyu4jjP9Tey/SrXDQLRvZXm4pb4vdZBxAzbFZkCyh0KyRy4txld/kZKTJlW4TO8N1JKrNEk+mWw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxlint/binding-win32-arm64-msvc@1.48.0': - resolution: {integrity: sha512-Nkw/MocyT3HSp0OJsKPXrcbxZqSPMTYnLLfsqsoiFKoL1ppVNL65MFa7vuTxJehPlBkjy+95gUgacZtuNMECrg==} + '@oxlint/binding-win32-arm64-msvc@1.50.0': + resolution: {integrity: sha512-Fq0M6vsGcFsSfeuWAACDhd5KJrO85ckbEfe1EGuBj+KPyJz7KeWte2fSFrFGmNKNXyhEMyx4tbgxiWRujBM2KQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxlint/binding-win32-ia32-msvc@1.48.0': - resolution: {integrity: sha512-reO1SpefvRmeZSP+WeyWkQd1ArxxDD1MyKgMUKuB8lNuUoxk9QEohYtKnsfsxJuFwMT0JTr7p9wZjouA85GzGQ==} + '@oxlint/binding-win32-ia32-msvc@1.50.0': + resolution: {integrity: sha512-qTdWR9KwY/vxJGhHVIZG2eBOhidOQvOwzDxnX+jhW/zIVacal1nAhR8GLkiywW8BIFDkQKXo/zOfT+/DY+ns/w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxlint/binding-win32-x64-msvc@1.48.0': - resolution: {integrity: sha512-T6zwhfcsrorqAybkOglZdPkTLlEwipbtdO1qjE+flbawvwOMsISoyiuaa7vM7zEyfq1hmDvMq1ndvkYFioranA==} + '@oxlint/binding-win32-x64-msvc@1.50.0': + resolution: {integrity: sha512-682t7npLC4G2Ca+iNlI9fhAKTcFPYYXJjwoa88H4q+u5HHHlsnL/gHULapX3iqp+A8FIJbgdylL5KMYo2LaluQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -611,141 +611,141 @@ packages: '@rolldown/pluginutils@1.0.0-rc.2': resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==} - '@rollup/rollup-android-arm-eabi@4.57.1': - resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} + '@rollup/rollup-android-arm-eabi@4.59.0': + resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.57.1': - resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} + '@rollup/rollup-android-arm64@4.59.0': + resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.57.1': - resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} + '@rollup/rollup-darwin-arm64@4.59.0': + resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.57.1': - resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} + '@rollup/rollup-darwin-x64@4.59.0': + resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.57.1': - resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} + '@rollup/rollup-freebsd-arm64@4.59.0': + resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.57.1': - resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} + '@rollup/rollup-freebsd-x64@4.59.0': + resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.57.1': - resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': + resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.57.1': - resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} + '@rollup/rollup-linux-arm-musleabihf@4.59.0': + resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.57.1': - resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} + '@rollup/rollup-linux-arm64-gnu@4.59.0': + resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.57.1': - resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} + '@rollup/rollup-linux-arm64-musl@4.59.0': + resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.57.1': - resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} + '@rollup/rollup-linux-loong64-gnu@4.59.0': + resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.57.1': - resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} + '@rollup/rollup-linux-loong64-musl@4.59.0': + resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} cpu: [loong64] os: [linux] libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.57.1': - resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} + '@rollup/rollup-linux-ppc64-gnu@4.59.0': + resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.57.1': - resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} + '@rollup/rollup-linux-ppc64-musl@4.59.0': + resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} cpu: [ppc64] os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.57.1': - resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} + '@rollup/rollup-linux-riscv64-gnu@4.59.0': + resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.57.1': - resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} + '@rollup/rollup-linux-riscv64-musl@4.59.0': + resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.57.1': - resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} + '@rollup/rollup-linux-s390x-gnu@4.59.0': + resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.57.1': - resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} + '@rollup/rollup-linux-x64-gnu@4.59.0': + resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.57.1': - resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} + '@rollup/rollup-linux-x64-musl@4.59.0': + resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.57.1': - resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} + '@rollup/rollup-openbsd-x64@4.59.0': + resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.57.1': - resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} + '@rollup/rollup-openharmony-arm64@4.59.0': + resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.57.1': - resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} + '@rollup/rollup-win32-arm64-msvc@4.59.0': + resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.57.1': - resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} + '@rollup/rollup-win32-ia32-msvc@4.59.0': + resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.57.1': - resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} + '@rollup/rollup-win32-x64-gnu@4.59.0': + resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.57.1': - resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} + '@rollup/rollup-win32-x64-msvc@4.59.0': + resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==} cpu: [x64] os: [win32] @@ -776,13 +776,13 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@tabler/icons-vue@3.36.1': - resolution: {integrity: sha512-ssIu0KSmGFKvvoC5PJhSYAj/J2kTEbIVIix0528zdRKfN6yohUlQt014tGnDDdJ/MyyG/xRXsKD1U6dyQY8rrg==} + '@tabler/icons-vue@3.37.1': + resolution: {integrity: sha512-iLO8Gl2ry77C4JHFxLzVGuF505M+HHgEx+u1IyKPFdgVY3ebBCP76go/62qVHNeIIGwsw8cErKi0aQjanlTCqQ==} peerDependencies: vue: '>=3.0.1' - '@tabler/icons@3.36.1': - resolution: {integrity: sha512-f4Jg3Fof/Vru5ioix/UO4GX+sdDsF9wQo47FbtvG+utIYYVQ/QVAC0QYgcBbAjQGfbdOh2CCf0BgiFOF9Ixtjw==} + '@tabler/icons@3.37.1': + resolution: {integrity: sha512-neLCWkuyNHEPXCyYu6nbN4S3g/59BTa4qyITAugYVpq1YzYNDOZooW7/vRWH98ZItXAudxdKU8muFT7y1PqzuA==} '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -871,14 +871,14 @@ packages: '@vitest/utils@4.0.18': resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} - '@volar/language-core@2.4.27': - resolution: {integrity: sha512-DjmjBWZ4tJKxfNC1F6HyYERNHPYS7L7OPFyCrestykNdUZMFYzI9WTyvwPcaNaHlrEUwESHYsfEw3isInncZxQ==} + '@volar/language-core@2.4.28': + resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} - '@volar/source-map@2.4.27': - resolution: {integrity: sha512-ynlcBReMgOZj2i6po+qVswtDUeeBRCTgDurjMGShbm8WYZgJ0PA4RmtebBJ0BCYol1qPv3GQF6jK7C9qoVc7lg==} + '@volar/source-map@2.4.28': + resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} - '@volar/typescript@2.4.27': - resolution: {integrity: sha512-eWaYCcl/uAPInSK2Lze6IqVWaBu/itVqR5InXcHXFyles4zO++Mglt3oxdgj75BDcv1Knr9Y93nowS8U3wqhxg==} + '@volar/typescript@2.4.28': + resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} '@vue/compiler-core@3.5.28': resolution: {integrity: sha512-kviccYxTgoE8n6OCw96BNdYlBg2GOWfBuOW4Vqwrt7mSKWKwFVvI8egdTltqRgITGPsTFYtKYfxIG8ptX2PJHQ==} @@ -901,8 +901,8 @@ packages: '@vue/devtools-shared@8.0.6': resolution: {integrity: sha512-Pp1JylTqlgMJvxW6MGyfTF8vGvlBSCAvMFaDCYa82Mgw7TT5eE5kkHgDvmOGHWeJE4zIDfCpCxHapsK2LtIAJg==} - '@vue/language-core@3.2.4': - resolution: {integrity: sha512-bqBGuSG4KZM45KKTXzGtoCl9cWju5jsaBKaJJe3h5hRAAWpZUuj5G+L+eI01sPIkm4H6setKRlw7E85wLdDNew==} + '@vue/language-core@3.2.5': + resolution: {integrity: sha512-d3OIxN/+KRedeM5wQ6H6NIpwS3P5gC9nmyaHgBk+rO6dIsjY+tOh4UlPpiZbAh3YtLdCGEX4M16RmsBqPmJV+g==} '@vue/reactivity@3.5.28': resolution: {integrity: sha512-gr5hEsxvn+RNyu9/9o1WtdYdwDjg5FgjUSBEkZWqgTKlo/fvwZ2+8W6AfKsc9YN2k/+iHYdS9vZYAhpi10kNaw==} @@ -976,8 +976,8 @@ packages: peerDependencies: vue: ^3.5.0 - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} hasBin: true @@ -1157,8 +1157,8 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - happy-dom@20.6.3: - resolution: {integrity: sha512-QAMY7d228dHs8gb9NG4SJ3OxQo4r+NGN8pOXGZ3SGfQf/XYuuYubrtZ25QVY2WoUQdskhRXSXb4R4mcRk+hV1w==} + happy-dom@20.7.0: + resolution: {integrity: sha512-hR/uLYQdngTyEfxnOoa+e6KTcfBFyc1hgFj/Cc144A5JJUuHFYqIEBDcD4FeGqUeKLRZqJ9eN9u7/GDjYEgS1g==} engines: {node: '>=20.0.0'} has-flag@4.0.0: @@ -1330,21 +1330,21 @@ packages: oniguruma-to-es@4.3.4: resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==} - oxfmt@0.33.0: - resolution: {integrity: sha512-ogxBXA9R4BFeo8F1HeMIIxHr5kGnQwKTYZ5k131AEGOq1zLxInNhvYSpyRQ+xIXVMYfCN7yZHKff/lb5lp4auQ==} + oxfmt@0.35.0: + resolution: {integrity: sha512-QYeXWkP+aLt7utt5SLivNIk09glWx9QE235ODjgcEZ3sd1VMaUBSpLymh6ZRCA76gD2rMP4bXanUz/fx+nLM9Q==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - oxlint-tsgolint@0.14.0: - resolution: {integrity: sha512-BUdiXO0vX7npql4hjLjbZvyM1yDL3U2m1DSZ3jBNl/r+IZaammWN0YmkmlMmYaLnVuTH0+8hO/1rQ6cD+YaEqQ==} + oxlint-tsgolint@0.14.2: + resolution: {integrity: sha512-XJsFIQwnYJgXFlNDz2MncQMWYxwnfy4BCy73mdiFN/P13gEZrAfBU4Jmz2XXFf9UG0wPILdi7hYa6t0KmKQLhw==} hasBin: true - oxlint@1.48.0: - resolution: {integrity: sha512-m5vyVBgPtPhVCJc3xI//8je9lRc8bYuYB4R/1PH3VPGOjA4vjVhkHtyJukdEjYEjwrw4Qf1eIf+pP9xvfhfMow==} + oxlint@1.50.0: + resolution: {integrity: sha512-iSJ4IZEICBma8cZX7kxIIz9PzsYLF2FaLAYN6RKu7VwRVKdu7RIgpP99bTZaGl//Yao7fsaGZLSEo5xBrI5ReQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - oxlint-tsgolint: '>=0.12.2' + oxlint-tsgolint: '>=0.14.1' peerDependenciesMeta: oxlint-tsgolint: optional: true @@ -1431,8 +1431,8 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rollup@4.57.1: - resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} + rollup@4.59.0: + resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -1633,8 +1633,8 @@ packages: vite: optional: true - vitepress-theme-trito@1.0.5: - resolution: {integrity: sha512-+hi7QHao6atxjlNfCp5jaZsYXnKPS0drnYKsr1M/qFa1iJoD44JSOB4WKeeTaxunOh7kfkZKoJn9ZZmjE4vU4w==} + vitepress-theme-trito@1.0.6: + resolution: {integrity: sha512-bFOWJH4TZfaGDvF3t7GAMiZ2ndRz120TrpJ4WnUkLrWqy0vwLofHYElZ62oa9vDLojUVwstYx5SSZ9KdcYOXZg==} vitepress@2.0.0-alpha.16: resolution: {integrity: sha512-w1nwsefDVIsje7BZr2tsKxkZutDGjG0YoQ2yxO7+a9tvYVqfljYbwj5LMYkPy8Tb7YbPwa22HtIhk62jbrvuEQ==} @@ -1688,8 +1688,8 @@ packages: vscode-uri@3.1.0: resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} - vue-tsc@3.2.4: - resolution: {integrity: sha512-xj3YCvSLNDKt1iF9OcImWHhmYcihVu9p4b9s4PGR/qp6yhW+tZJaypGxHScRyOrdnHvaOeF+YkZOdKwbgGvp5g==} + vue-tsc@3.2.5: + resolution: {integrity: sha512-/htfTCMluQ+P2FISGAooul8kO4JMheOTCbCy4M6dYnYYjqLe3BExZudAua6MSIKSFYQtFOYAll7XobYwcpokGA==} hasBin: true peerDependencies: typescript: '>=5.0.0' @@ -1771,7 +1771,7 @@ snapshots: '@asamuzakjp/css-color@4.1.2': dependencies: '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-color-parser': 4.0.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-color-parser': 4.0.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 lru-cache: 11.2.6 @@ -1804,7 +1804,7 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@csstools/color-helpers@6.0.1': + '@csstools/color-helpers@6.0.2': optional: true '@csstools/css-calc@3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': @@ -1813,9 +1813,9 @@ snapshots: '@csstools/css-tokenizer': 4.0.0 optional: true - '@csstools/css-color-parser@4.0.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-color-parser@4.0.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: - '@csstools/color-helpers': 6.0.1 + '@csstools/color-helpers': 6.0.2 '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 @@ -1826,7 +1826,7 @@ snapshots: '@csstools/css-tokenizer': 4.0.0 optional: true - '@csstools/css-syntax-patches-for-csstree@1.0.27': + '@csstools/css-syntax-patches-for-csstree@1.0.28': optional: true '@csstools/css-tokenizer@4.0.0': @@ -1967,213 +1967,213 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@oxfmt/binding-android-arm-eabi@0.33.0': + '@oxfmt/binding-android-arm-eabi@0.35.0': optional: true - '@oxfmt/binding-android-arm64@0.33.0': + '@oxfmt/binding-android-arm64@0.35.0': optional: true - '@oxfmt/binding-darwin-arm64@0.33.0': + '@oxfmt/binding-darwin-arm64@0.35.0': optional: true - '@oxfmt/binding-darwin-x64@0.33.0': + '@oxfmt/binding-darwin-x64@0.35.0': optional: true - '@oxfmt/binding-freebsd-x64@0.33.0': + '@oxfmt/binding-freebsd-x64@0.35.0': optional: true - '@oxfmt/binding-linux-arm-gnueabihf@0.33.0': + '@oxfmt/binding-linux-arm-gnueabihf@0.35.0': optional: true - '@oxfmt/binding-linux-arm-musleabihf@0.33.0': + '@oxfmt/binding-linux-arm-musleabihf@0.35.0': optional: true - '@oxfmt/binding-linux-arm64-gnu@0.33.0': + '@oxfmt/binding-linux-arm64-gnu@0.35.0': optional: true - '@oxfmt/binding-linux-arm64-musl@0.33.0': + '@oxfmt/binding-linux-arm64-musl@0.35.0': optional: true - '@oxfmt/binding-linux-ppc64-gnu@0.33.0': + '@oxfmt/binding-linux-ppc64-gnu@0.35.0': optional: true - '@oxfmt/binding-linux-riscv64-gnu@0.33.0': + '@oxfmt/binding-linux-riscv64-gnu@0.35.0': optional: true - '@oxfmt/binding-linux-riscv64-musl@0.33.0': + '@oxfmt/binding-linux-riscv64-musl@0.35.0': optional: true - '@oxfmt/binding-linux-s390x-gnu@0.33.0': + '@oxfmt/binding-linux-s390x-gnu@0.35.0': optional: true - '@oxfmt/binding-linux-x64-gnu@0.33.0': + '@oxfmt/binding-linux-x64-gnu@0.35.0': optional: true - '@oxfmt/binding-linux-x64-musl@0.33.0': + '@oxfmt/binding-linux-x64-musl@0.35.0': optional: true - '@oxfmt/binding-openharmony-arm64@0.33.0': + '@oxfmt/binding-openharmony-arm64@0.35.0': optional: true - '@oxfmt/binding-win32-arm64-msvc@0.33.0': + '@oxfmt/binding-win32-arm64-msvc@0.35.0': optional: true - '@oxfmt/binding-win32-ia32-msvc@0.33.0': + '@oxfmt/binding-win32-ia32-msvc@0.35.0': optional: true - '@oxfmt/binding-win32-x64-msvc@0.33.0': + '@oxfmt/binding-win32-x64-msvc@0.35.0': optional: true - '@oxlint-tsgolint/darwin-arm64@0.14.0': + '@oxlint-tsgolint/darwin-arm64@0.14.2': optional: true - '@oxlint-tsgolint/darwin-x64@0.14.0': + '@oxlint-tsgolint/darwin-x64@0.14.2': optional: true - '@oxlint-tsgolint/linux-arm64@0.14.0': + '@oxlint-tsgolint/linux-arm64@0.14.2': optional: true - '@oxlint-tsgolint/linux-x64@0.14.0': + '@oxlint-tsgolint/linux-x64@0.14.2': optional: true - '@oxlint-tsgolint/win32-arm64@0.14.0': + '@oxlint-tsgolint/win32-arm64@0.14.2': optional: true - '@oxlint-tsgolint/win32-x64@0.14.0': + '@oxlint-tsgolint/win32-x64@0.14.2': optional: true - '@oxlint/binding-android-arm-eabi@1.48.0': + '@oxlint/binding-android-arm-eabi@1.50.0': optional: true - '@oxlint/binding-android-arm64@1.48.0': + '@oxlint/binding-android-arm64@1.50.0': optional: true - '@oxlint/binding-darwin-arm64@1.48.0': + '@oxlint/binding-darwin-arm64@1.50.0': optional: true - '@oxlint/binding-darwin-x64@1.48.0': + '@oxlint/binding-darwin-x64@1.50.0': optional: true - '@oxlint/binding-freebsd-x64@1.48.0': + '@oxlint/binding-freebsd-x64@1.50.0': optional: true - '@oxlint/binding-linux-arm-gnueabihf@1.48.0': + '@oxlint/binding-linux-arm-gnueabihf@1.50.0': optional: true - '@oxlint/binding-linux-arm-musleabihf@1.48.0': + '@oxlint/binding-linux-arm-musleabihf@1.50.0': optional: true - '@oxlint/binding-linux-arm64-gnu@1.48.0': + '@oxlint/binding-linux-arm64-gnu@1.50.0': optional: true - '@oxlint/binding-linux-arm64-musl@1.48.0': + '@oxlint/binding-linux-arm64-musl@1.50.0': optional: true - '@oxlint/binding-linux-ppc64-gnu@1.48.0': + '@oxlint/binding-linux-ppc64-gnu@1.50.0': optional: true - '@oxlint/binding-linux-riscv64-gnu@1.48.0': + '@oxlint/binding-linux-riscv64-gnu@1.50.0': optional: true - '@oxlint/binding-linux-riscv64-musl@1.48.0': + '@oxlint/binding-linux-riscv64-musl@1.50.0': optional: true - '@oxlint/binding-linux-s390x-gnu@1.48.0': + '@oxlint/binding-linux-s390x-gnu@1.50.0': optional: true - '@oxlint/binding-linux-x64-gnu@1.48.0': + '@oxlint/binding-linux-x64-gnu@1.50.0': optional: true - '@oxlint/binding-linux-x64-musl@1.48.0': + '@oxlint/binding-linux-x64-musl@1.50.0': optional: true - '@oxlint/binding-openharmony-arm64@1.48.0': + '@oxlint/binding-openharmony-arm64@1.50.0': optional: true - '@oxlint/binding-win32-arm64-msvc@1.48.0': + '@oxlint/binding-win32-arm64-msvc@1.50.0': optional: true - '@oxlint/binding-win32-ia32-msvc@1.48.0': + '@oxlint/binding-win32-ia32-msvc@1.50.0': optional: true - '@oxlint/binding-win32-x64-msvc@1.48.0': + '@oxlint/binding-win32-x64-msvc@1.50.0': optional: true '@rolldown/pluginutils@1.0.0-rc.2': {} - '@rollup/rollup-android-arm-eabi@4.57.1': + '@rollup/rollup-android-arm-eabi@4.59.0': optional: true - '@rollup/rollup-android-arm64@4.57.1': + '@rollup/rollup-android-arm64@4.59.0': optional: true - '@rollup/rollup-darwin-arm64@4.57.1': + '@rollup/rollup-darwin-arm64@4.59.0': optional: true - '@rollup/rollup-darwin-x64@4.57.1': + '@rollup/rollup-darwin-x64@4.59.0': optional: true - '@rollup/rollup-freebsd-arm64@4.57.1': + '@rollup/rollup-freebsd-arm64@4.59.0': optional: true - '@rollup/rollup-freebsd-x64@4.57.1': + '@rollup/rollup-freebsd-x64@4.59.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.57.1': + '@rollup/rollup-linux-arm-musleabihf@4.59.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.57.1': + '@rollup/rollup-linux-arm64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.57.1': + '@rollup/rollup-linux-arm64-musl@4.59.0': optional: true - '@rollup/rollup-linux-loong64-gnu@4.57.1': + '@rollup/rollup-linux-loong64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-loong64-musl@4.57.1': + '@rollup/rollup-linux-loong64-musl@4.59.0': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.57.1': + '@rollup/rollup-linux-ppc64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-ppc64-musl@4.57.1': + '@rollup/rollup-linux-ppc64-musl@4.59.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.57.1': + '@rollup/rollup-linux-riscv64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.57.1': + '@rollup/rollup-linux-riscv64-musl@4.59.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.57.1': + '@rollup/rollup-linux-s390x-gnu@4.59.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.57.1': + '@rollup/rollup-linux-x64-gnu@4.59.0': optional: true - '@rollup/rollup-linux-x64-musl@4.57.1': + '@rollup/rollup-linux-x64-musl@4.59.0': optional: true - '@rollup/rollup-openbsd-x64@4.57.1': + '@rollup/rollup-openbsd-x64@4.59.0': optional: true - '@rollup/rollup-openharmony-arm64@4.57.1': + '@rollup/rollup-openharmony-arm64@4.59.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.57.1': + '@rollup/rollup-win32-arm64-msvc@4.59.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.57.1': + '@rollup/rollup-win32-ia32-msvc@4.59.0': optional: true - '@rollup/rollup-win32-x64-gnu@4.57.1': + '@rollup/rollup-win32-x64-gnu@4.59.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.57.1': + '@rollup/rollup-win32-x64-msvc@4.59.0': optional: true '@shikijs/core@3.22.0': @@ -2216,12 +2216,12 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@tabler/icons-vue@3.36.1(vue@3.5.28(typescript@5.9.3))': + '@tabler/icons-vue@3.37.1(vue@3.5.28(typescript@5.9.3))': dependencies: - '@tabler/icons': 3.36.1 + '@tabler/icons': 3.37.1 vue: 3.5.28(typescript@5.9.3) - '@tabler/icons@3.36.1': {} + '@tabler/icons@3.37.1': {} '@types/chai@5.2.3': dependencies: @@ -2271,7 +2271,7 @@ snapshots: vite: 7.3.1(@types/node@25.3.0)(terser@5.46.0) vue: 3.5.28(typescript@5.9.3) - '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.6.3)(jsdom@27.3.0)(terser@5.46.0))': + '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.7.0)(jsdom@27.3.0)(terser@5.46.0))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.18 @@ -2283,7 +2283,7 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.18(@types/node@25.3.0)(happy-dom@20.6.3)(jsdom@27.3.0)(terser@5.46.0) + vitest: 4.0.18(@types/node@25.3.0)(happy-dom@20.7.0)(jsdom@27.3.0)(terser@5.46.0) '@vitest/expect@4.0.18': dependencies: @@ -2324,15 +2324,15 @@ snapshots: '@vitest/pretty-format': 4.0.18 tinyrainbow: 3.0.3 - '@volar/language-core@2.4.27': + '@volar/language-core@2.4.28': dependencies: - '@volar/source-map': 2.4.27 + '@volar/source-map': 2.4.28 - '@volar/source-map@2.4.27': {} + '@volar/source-map@2.4.28': {} - '@volar/typescript@2.4.27': + '@volar/typescript@2.4.28': dependencies: - '@volar/language-core': 2.4.27 + '@volar/language-core': 2.4.28 path-browserify: 1.0.1 vscode-uri: 3.1.0 @@ -2384,9 +2384,9 @@ snapshots: dependencies: rfdc: 1.4.1 - '@vue/language-core@3.2.4': + '@vue/language-core@3.2.5': dependencies: - '@volar/language-core': 2.4.27 + '@volar/language-core': 2.4.28 '@vue/compiler-dom': 3.5.28 '@vue/shared': 3.5.28 alien-signals: 3.1.2 @@ -2439,7 +2439,7 @@ snapshots: dependencies: vue: 3.5.28(typescript@5.9.3) - acorn@8.15.0: {} + acorn@8.16.0: {} agent-base@7.1.4: optional: true @@ -2517,7 +2517,7 @@ snapshots: cssstyle@5.3.7: dependencies: '@asamuzakjp/css-color': 4.1.2 - '@csstools/css-syntax-patches-for-csstree': 1.0.27 + '@csstools/css-syntax-patches-for-csstree': 1.0.28 css-tree: 3.1.0 lru-cache: 11.2.6 optional: true @@ -2636,7 +2636,7 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 - happy-dom@20.6.3: + happy-dom@20.7.0: dependencies: '@types/node': 25.3.0 '@types/whatwg-mimetype': 3.0.2 @@ -2826,7 +2826,7 @@ snapshots: mlly@1.8.0: dependencies: - acorn: 8.15.0 + acorn: 8.16.0 pathe: 2.0.3 pkg-types: 1.3.1 ufo: 1.6.3 @@ -2852,61 +2852,61 @@ snapshots: regex: 6.1.0 regex-recursion: 6.0.2 - oxfmt@0.33.0: + oxfmt@0.35.0: dependencies: tinypool: 2.1.0 optionalDependencies: - '@oxfmt/binding-android-arm-eabi': 0.33.0 - '@oxfmt/binding-android-arm64': 0.33.0 - '@oxfmt/binding-darwin-arm64': 0.33.0 - '@oxfmt/binding-darwin-x64': 0.33.0 - '@oxfmt/binding-freebsd-x64': 0.33.0 - '@oxfmt/binding-linux-arm-gnueabihf': 0.33.0 - '@oxfmt/binding-linux-arm-musleabihf': 0.33.0 - '@oxfmt/binding-linux-arm64-gnu': 0.33.0 - '@oxfmt/binding-linux-arm64-musl': 0.33.0 - '@oxfmt/binding-linux-ppc64-gnu': 0.33.0 - '@oxfmt/binding-linux-riscv64-gnu': 0.33.0 - '@oxfmt/binding-linux-riscv64-musl': 0.33.0 - '@oxfmt/binding-linux-s390x-gnu': 0.33.0 - '@oxfmt/binding-linux-x64-gnu': 0.33.0 - '@oxfmt/binding-linux-x64-musl': 0.33.0 - '@oxfmt/binding-openharmony-arm64': 0.33.0 - '@oxfmt/binding-win32-arm64-msvc': 0.33.0 - '@oxfmt/binding-win32-ia32-msvc': 0.33.0 - '@oxfmt/binding-win32-x64-msvc': 0.33.0 - - oxlint-tsgolint@0.14.0: + '@oxfmt/binding-android-arm-eabi': 0.35.0 + '@oxfmt/binding-android-arm64': 0.35.0 + '@oxfmt/binding-darwin-arm64': 0.35.0 + '@oxfmt/binding-darwin-x64': 0.35.0 + '@oxfmt/binding-freebsd-x64': 0.35.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.35.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.35.0 + '@oxfmt/binding-linux-arm64-gnu': 0.35.0 + '@oxfmt/binding-linux-arm64-musl': 0.35.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.35.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.35.0 + '@oxfmt/binding-linux-riscv64-musl': 0.35.0 + '@oxfmt/binding-linux-s390x-gnu': 0.35.0 + '@oxfmt/binding-linux-x64-gnu': 0.35.0 + '@oxfmt/binding-linux-x64-musl': 0.35.0 + '@oxfmt/binding-openharmony-arm64': 0.35.0 + '@oxfmt/binding-win32-arm64-msvc': 0.35.0 + '@oxfmt/binding-win32-ia32-msvc': 0.35.0 + '@oxfmt/binding-win32-x64-msvc': 0.35.0 + + oxlint-tsgolint@0.14.2: optionalDependencies: - '@oxlint-tsgolint/darwin-arm64': 0.14.0 - '@oxlint-tsgolint/darwin-x64': 0.14.0 - '@oxlint-tsgolint/linux-arm64': 0.14.0 - '@oxlint-tsgolint/linux-x64': 0.14.0 - '@oxlint-tsgolint/win32-arm64': 0.14.0 - '@oxlint-tsgolint/win32-x64': 0.14.0 - - oxlint@1.48.0(oxlint-tsgolint@0.14.0): + '@oxlint-tsgolint/darwin-arm64': 0.14.2 + '@oxlint-tsgolint/darwin-x64': 0.14.2 + '@oxlint-tsgolint/linux-arm64': 0.14.2 + '@oxlint-tsgolint/linux-x64': 0.14.2 + '@oxlint-tsgolint/win32-arm64': 0.14.2 + '@oxlint-tsgolint/win32-x64': 0.14.2 + + oxlint@1.50.0(oxlint-tsgolint@0.14.2): optionalDependencies: - '@oxlint/binding-android-arm-eabi': 1.48.0 - '@oxlint/binding-android-arm64': 1.48.0 - '@oxlint/binding-darwin-arm64': 1.48.0 - '@oxlint/binding-darwin-x64': 1.48.0 - '@oxlint/binding-freebsd-x64': 1.48.0 - '@oxlint/binding-linux-arm-gnueabihf': 1.48.0 - '@oxlint/binding-linux-arm-musleabihf': 1.48.0 - '@oxlint/binding-linux-arm64-gnu': 1.48.0 - '@oxlint/binding-linux-arm64-musl': 1.48.0 - '@oxlint/binding-linux-ppc64-gnu': 1.48.0 - '@oxlint/binding-linux-riscv64-gnu': 1.48.0 - '@oxlint/binding-linux-riscv64-musl': 1.48.0 - '@oxlint/binding-linux-s390x-gnu': 1.48.0 - '@oxlint/binding-linux-x64-gnu': 1.48.0 - '@oxlint/binding-linux-x64-musl': 1.48.0 - '@oxlint/binding-openharmony-arm64': 1.48.0 - '@oxlint/binding-win32-arm64-msvc': 1.48.0 - '@oxlint/binding-win32-ia32-msvc': 1.48.0 - '@oxlint/binding-win32-x64-msvc': 1.48.0 - oxlint-tsgolint: 0.14.0 + '@oxlint/binding-android-arm-eabi': 1.50.0 + '@oxlint/binding-android-arm64': 1.50.0 + '@oxlint/binding-darwin-arm64': 1.50.0 + '@oxlint/binding-darwin-x64': 1.50.0 + '@oxlint/binding-freebsd-x64': 1.50.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.50.0 + '@oxlint/binding-linux-arm-musleabihf': 1.50.0 + '@oxlint/binding-linux-arm64-gnu': 1.50.0 + '@oxlint/binding-linux-arm64-musl': 1.50.0 + '@oxlint/binding-linux-ppc64-gnu': 1.50.0 + '@oxlint/binding-linux-riscv64-gnu': 1.50.0 + '@oxlint/binding-linux-riscv64-musl': 1.50.0 + '@oxlint/binding-linux-s390x-gnu': 1.50.0 + '@oxlint/binding-linux-x64-gnu': 1.50.0 + '@oxlint/binding-linux-x64-musl': 1.50.0 + '@oxlint/binding-openharmony-arm64': 1.50.0 + '@oxlint/binding-win32-arm64-msvc': 1.50.0 + '@oxlint/binding-win32-ia32-msvc': 1.50.0 + '@oxlint/binding-win32-x64-msvc': 1.50.0 + oxlint-tsgolint: 0.14.2 package-manager-detector@1.6.0: {} @@ -2977,35 +2977,35 @@ snapshots: rfdc@1.4.1: {} - rollup@4.57.1: + rollup@4.59.0: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.57.1 - '@rollup/rollup-android-arm64': 4.57.1 - '@rollup/rollup-darwin-arm64': 4.57.1 - '@rollup/rollup-darwin-x64': 4.57.1 - '@rollup/rollup-freebsd-arm64': 4.57.1 - '@rollup/rollup-freebsd-x64': 4.57.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 - '@rollup/rollup-linux-arm-musleabihf': 4.57.1 - '@rollup/rollup-linux-arm64-gnu': 4.57.1 - '@rollup/rollup-linux-arm64-musl': 4.57.1 - '@rollup/rollup-linux-loong64-gnu': 4.57.1 - '@rollup/rollup-linux-loong64-musl': 4.57.1 - '@rollup/rollup-linux-ppc64-gnu': 4.57.1 - '@rollup/rollup-linux-ppc64-musl': 4.57.1 - '@rollup/rollup-linux-riscv64-gnu': 4.57.1 - '@rollup/rollup-linux-riscv64-musl': 4.57.1 - '@rollup/rollup-linux-s390x-gnu': 4.57.1 - '@rollup/rollup-linux-x64-gnu': 4.57.1 - '@rollup/rollup-linux-x64-musl': 4.57.1 - '@rollup/rollup-openbsd-x64': 4.57.1 - '@rollup/rollup-openharmony-arm64': 4.57.1 - '@rollup/rollup-win32-arm64-msvc': 4.57.1 - '@rollup/rollup-win32-ia32-msvc': 4.57.1 - '@rollup/rollup-win32-x64-gnu': 4.57.1 - '@rollup/rollup-win32-x64-msvc': 4.57.1 + '@rollup/rollup-android-arm-eabi': 4.59.0 + '@rollup/rollup-android-arm64': 4.59.0 + '@rollup/rollup-darwin-arm64': 4.59.0 + '@rollup/rollup-darwin-x64': 4.59.0 + '@rollup/rollup-freebsd-arm64': 4.59.0 + '@rollup/rollup-freebsd-x64': 4.59.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.59.0 + '@rollup/rollup-linux-arm-musleabihf': 4.59.0 + '@rollup/rollup-linux-arm64-gnu': 4.59.0 + '@rollup/rollup-linux-arm64-musl': 4.59.0 + '@rollup/rollup-linux-loong64-gnu': 4.59.0 + '@rollup/rollup-linux-loong64-musl': 4.59.0 + '@rollup/rollup-linux-ppc64-gnu': 4.59.0 + '@rollup/rollup-linux-ppc64-musl': 4.59.0 + '@rollup/rollup-linux-riscv64-gnu': 4.59.0 + '@rollup/rollup-linux-riscv64-musl': 4.59.0 + '@rollup/rollup-linux-s390x-gnu': 4.59.0 + '@rollup/rollup-linux-x64-gnu': 4.59.0 + '@rollup/rollup-linux-x64-musl': 4.59.0 + '@rollup/rollup-openbsd-x64': 4.59.0 + '@rollup/rollup-openharmony-arm64': 4.59.0 + '@rollup/rollup-win32-arm64-msvc': 4.59.0 + '@rollup/rollup-win32-ia32-msvc': 4.59.0 + '@rollup/rollup-win32-x64-gnu': 4.59.0 + '@rollup/rollup-win32-x64-msvc': 4.59.0 fsevents: 2.3.3 run-parallel@1.2.0: @@ -3075,7 +3075,7 @@ snapshots: terser@5.46.0: dependencies: '@jridgewell/source-map': 0.3.11 - acorn: 8.15.0 + acorn: 8.16.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -3171,7 +3171,7 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.57.1 + rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 25.3.0 @@ -3186,11 +3186,11 @@ snapshots: optionalDependencies: vite: 7.3.1(@types/node@25.3.0)(terser@5.46.0) - vitepress-theme-trito@1.0.5(@types/node@25.3.0)(focus-trap@7.8.0)(postcss@8.5.6)(terser@5.46.0)(typescript@5.9.3): + vitepress-theme-trito@1.0.6(@types/node@25.3.0)(focus-trap@7.8.0)(postcss@8.5.6)(terser@5.46.0)(typescript@5.9.3): dependencies: '@docsearch/css': 4.6.0 '@docsearch/js': 4.6.0 - '@tabler/icons-vue': 3.36.1(vue@3.5.28(typescript@5.9.3)) + '@tabler/icons-vue': 3.37.1(vue@3.5.28(typescript@5.9.3)) '@vueuse/core': 14.2.1(vue@3.5.28(typescript@5.9.3)) '@vueuse/integrations': 14.2.1(focus-trap@7.8.0)(vue@3.5.28(typescript@5.9.3)) mark.js: 8.11.1 @@ -3274,7 +3274,7 @@ snapshots: - universal-cookie - yaml - vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.6.3)(jsdom@27.3.0)(terser@5.46.0): + vitest@4.0.18(@types/node@25.3.0)(happy-dom@20.7.0)(jsdom@27.3.0)(terser@5.46.0): dependencies: '@vitest/expect': 4.0.18 '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.3.0)(terser@5.46.0)) @@ -3298,7 +3298,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.3.0 - happy-dom: 20.6.3 + happy-dom: 20.7.0 jsdom: 27.3.0 transitivePeerDependencies: - jiti @@ -3315,10 +3315,10 @@ snapshots: vscode-uri@3.1.0: {} - vue-tsc@3.2.4(typescript@5.9.3): + vue-tsc@3.2.5(typescript@5.9.3): dependencies: - '@volar/typescript': 2.4.27 - '@vue/language-core': 3.2.4 + '@volar/typescript': 2.4.28 + '@vue/language-core': 3.2.5 typescript: 5.9.3 vue@3.5.28(typescript@5.9.3): diff --git a/src/baseModule.ts b/src/BaseModule.ts similarity index 67% rename from src/baseModule.ts rename to src/BaseModule.ts index bc1c1eb..24d2707 100644 --- a/src/baseModule.ts +++ b/src/BaseModule.ts @@ -1,12 +1,14 @@ +import type { Pointeract, PointeractInterface } from '@/Pointeract'; import type { BaseOptions, GeneralObject, Pointer, Pointers, StdEvents, - Constrain, -} from '@/declarations'; -import type { Pointeract, PointeractInterface } from '@/pointeract'; + ModuleInput as MI, + Orchestratable, + General, +} from '@/types'; export type HookKeys = | 'onPointerDown' @@ -17,13 +19,14 @@ export type HookKeys = | 'onStop' | 'dispose'; -export type BaseArgs = [ - Pointeract<[]>['moduleUtils'], - Window, - Pointers, - HTMLElement, - GeneralObject, -]; +export type BaseArgs = ConstructorParameters; +export type ModuleCtor = typeof BaseModule; + +export type ModuleInput = MI; +export type ModuleInputCtor = ReadonlyArray; +export type Options = Orchestratable & BaseOptions; +export type Events = Orchestratable & StdEvents; +export type Augmentation = Orchestratable; export default class BaseModule< O extends BaseOptions = BaseOptions, @@ -36,7 +39,7 @@ export default class BaseModule< protected getNthPointer: Pointeract<[]>['moduleUtils']['getNthPointer']; protected toTargetCoords: Pointeract<[]>['moduleUtils']['toTargetCoords']; protected augment: (augmentation: A) => void; - protected dispatch: >( + protected dispatch: ( ...arg: undefined extends E[K] ? [K] : [K, E[K]] ) => void; options: O; @@ -51,7 +54,7 @@ export default class BaseModule< this.toTargetCoords = utils.toTargetCoords; this.augment = utils.augment; this.dispatch = utils.dispatch as typeof this.dispatch; - this.options = options; + this.options = options as O; } onPointerDown?: (...args: [event: PointerEvent, pointer: Pointer, pointers: Pointers]) => void; @@ -62,6 +65,6 @@ export default class BaseModule< onStop?: () => void; dispose?: () => void; modifiers?: { - [K in keyof Constrain]?: (event: E[K]) => boolean | E[K]; + [K in keyof E]?: (event: E[K]) => boolean | E[K]; }; } diff --git a/src/pointeract.ts b/src/Pointeract.ts similarity index 92% rename from src/pointeract.ts rename to src/Pointeract.ts index 64ff15e..2e0d24d 100644 --- a/src/pointeract.ts +++ b/src/Pointeract.ts @@ -1,18 +1,16 @@ -import type BaseModule from '@/baseModule'; +import type BaseModule from '@/BaseModule'; import type { Augmentation, - Coordinates, Events, - GeneralObject, + Options, ModuleCtor, - ModuleInput, ModuleInputCtor, - Options, - Pointers, - Reloadable, -} from '@/declarations'; -import { HookKeys } from '@/baseModule'; -import { toArray } from '@/utils'; + ModuleInput, +} from '@/BaseModule'; +import type { Coordinates, GeneralObject, Pointers } from '@/types'; +import { HookKeys } from '@/BaseModule'; + +type Reloadable = Array; export class Pointeract { #element: HTMLElement; @@ -30,7 +28,7 @@ export class Pointeract { } constructor(options: Options, _modules?: T) { - const modules = toArray(_modules ? _modules : ([] as Array)); + const modules = _modules ? _modules : []; this.#_window = options.element.ownerDocument.defaultView; this.#element = options.element; if (!options.coordinateOutput) options.coordinateOutput = 'relative'; @@ -148,7 +146,7 @@ export class Pointeract { #onWheel = (e: WheelEvent) => this.#runHooks('onWheel', e); - stop = (_toStop?: Reloadable) => { + stop = (toStop?: Reloadable) => { const stopPointeract = () => { this.#element.removeEventListener('pointerdown', this.#onPointerDown); this.#window.removeEventListener('pointermove', this.#onPointerMove); @@ -163,15 +161,15 @@ export class Pointeract { this.#pausedModules[moduleCtor.name] = module; delete this.#modules[moduleCtor.name]; }; - if (!_toStop) stopPointeract(); + if (!toStop) stopPointeract(); else - toArray(_toStop).forEach((module) => { + toStop.forEach((module) => { stopModule(module); }); return this; }; - start = (_toStart?: Reloadable) => { + start = (toStart?: Reloadable) => { const startPointeract = () => { this.#element.addEventListener('pointerdown', this.#onPointerDown); this.#window.addEventListener('pointermove', this.#onPointerMove); @@ -186,9 +184,9 @@ export class Pointeract { this.#modules[moduleCtor.name] = module; delete this.#pausedModules[moduleCtor.name]; }; - if (!_toStart) startPointeract(); + if (!toStart) startPointeract(); else - toArray(_toStart).forEach((module) => { + toStart.forEach((module) => { startModule(module); }); return this; diff --git a/src/declarations.ts b/src/declarations.ts deleted file mode 100644 index 18d88d3..0000000 --- a/src/declarations.ts +++ /dev/null @@ -1,71 +0,0 @@ -// oxlint-disable typescript/no-explicit-any -import type BaseModule from '@/baseModule'; - -// #region General Types -export type GeneralArguments = Array; -export type GeneralObject = Record; -export type Indexable = string | number | symbol; -// #endregion =============================================================================== - -// #region Conversion Helpers -type KnownKeys = keyof { - [K in keyof T as string extends K ? never : number extends K ? never : K]: T[K]; -}; -export type Constrain = Pick>; -type WrapInArray = T extends Array ? Array : [T]; -type UnionToIntersection = (U extends any ? (k: U) => void : never) extends (k: infer I) => void - ? I - : never; -type Instances = - T extends Array ? InstanceType : T[number]; -type Orchestratable< - T extends ModuleInput, - K extends 'options' | '_Events' | '_Augmentation', -> = UnionToIntersection[K]>; -// #endregion =============================================================================== - -// #region Derived Types -type ModuleInstance = BaseModule; -export type ModuleCtor = typeof BaseModule; -export type ModuleInput = ModuleCtor | ModuleInstance | Array | Array; -export type ModuleInputCtor = ModuleCtor | Array; -type ProcessedModuleInput = Array | Array; - -type AllModuleInstances = Instances>; -export type Options = Orchestratable & BaseOptions; -export type Events = Constrain< - Orchestratable & StdEvents ->; -export type Augmentation = Orchestratable; - -type ReloadableAtom = WrapInArray[number]; -export type Reloadable = ReloadableAtom | Array>; -// #endregion =============================================================================== - -// #region Informative Types -export type Coordinates = { - x: number; - y: number; -}; - -export type Pointers = Map; - -export type Pointer = { - records: Array<{ x: number; y: number; timestamp: number }>; - target: EventTarget | null; - [key: Indexable]: any; -}; - -export interface StdEvents { - pan: { deltaX: number; deltaY: number }; - drag: { deltaX: number; deltaY: number; x: number; y: number }; - trueClick: Coordinates & { target: EventTarget | null; streak: number }; - zoom: Coordinates & { factor: number }; - [key: string]: unknown; -} - -export interface BaseOptions { - coordinateOutput?: 'absolute' | 'relative' | 'relativeFraction'; - element: HTMLElement; -} -// #endregion =============================================================================== diff --git a/src/index.ts b/src/index.ts index fa36b60..21fde8f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,12 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -export { default as BaseModule, type BaseArgs } from '@/baseModule'; -export type { Options, Events, Pointer, Pointers, StdEvents, BaseOptions } from '@/declarations'; -export { default as Click } from '@/modules/click'; -export { default as Drag } from '@/modules/drag'; -export { default as MultitouchPanZoom } from '@/modules/multitouchPanZoom'; -export { default as PreventDefault } from '@/modules/preventDefault'; -export { default as WheelPanZoom } from '@/modules/wheelPanZoom'; -export { default as Lubricator, panPreset, dragPreset, zoomPreset } from '@/modules/lubricator'; -export { default as Pointeract, type PointeractInterface } from '@/pointeract'; +export { default as BaseModule, type BaseArgs, type Options, type Events } from '@/BaseModule'; +export type { Pointer, Pointers, StdEvents, BaseOptions } from '@/types'; +export { default as Click } from '@/modules/Click'; +export { default as Drag } from '@/modules/Drag'; +export { default as MultitouchPanZoom } from '@/modules/MultitouchPanZoom'; +export { default as PreventDefault } from '@/modules/PreventDefault'; +export { default as WheelPanZoom } from '@/modules/WheelPanZoom'; +export { default as Lubricator, panPreset, dragPreset, zoomPreset } from '@/modules/Lubricator'; +export { default as Pointeract, type PointeractInterface } from '@/Pointeract'; diff --git a/src/modules/click.ts b/src/modules/Click.ts similarity index 92% rename from src/modules/click.ts rename to src/modules/Click.ts index 712d7c2..49eaa73 100644 --- a/src/modules/click.ts +++ b/src/modules/Click.ts @@ -1,5 +1,5 @@ -import type { BaseOptions, Pointer, Pointers } from '@/declarations'; -import BaseModule from '@/baseModule'; +import type { BaseOptions, Pointer, Pointers } from '@/types'; +import BaseModule from '@/BaseModule'; import { getLast } from '@/utils'; interface Options extends BaseOptions { diff --git a/src/modules/drag.ts b/src/modules/Drag.ts similarity index 80% rename from src/modules/drag.ts rename to src/modules/Drag.ts index 71c9ea7..c01992b 100644 --- a/src/modules/drag.ts +++ b/src/modules/Drag.ts @@ -1,5 +1,5 @@ -import type { Pointer, Pointers } from '@/declarations'; -import BaseModule from '@/baseModule'; +import type { Pointer, Pointers } from '@/types'; +import BaseModule from '@/BaseModule'; import { getLast } from '@/utils'; export default class Drag extends BaseModule { diff --git a/src/modules/lubricator.ts b/src/modules/Lubricator.ts similarity index 95% rename from src/modules/lubricator.ts rename to src/modules/Lubricator.ts index fd54d29..f861f0e 100644 --- a/src/modules/lubricator.ts +++ b/src/modules/Lubricator.ts @@ -1,5 +1,5 @@ -import BaseModule, { BaseArgs } from '@/baseModule'; -import { BaseOptions, Events, GeneralObject } from '@/declarations'; +import BaseModule, { BaseArgs, Events } from '@/BaseModule'; +import { BaseOptions, GeneralDictionary } from '@/types'; interface Options extends BaseOptions { lubricator?: Record; @@ -11,7 +11,7 @@ type PerEventOption = { }; type PerEventStates = { - sample: GeneralObject; + sample: GeneralDictionary; fields: Record< string, { @@ -64,7 +64,7 @@ export default class Lubricator extends BaseModule { }; #makeLubricate = - (states: PerEventStates, options: PerEventOption) => (detail: GeneralObject) => { + (states: PerEventStates, options: PerEventOption) => (detail: GeneralDictionary) => { if (detail.lubricated) return true; states.sample = detail; this.#accumulate(states.fields, options.fields, detail); @@ -74,7 +74,7 @@ export default class Lubricator extends BaseModule { #accumulate = ( stateFields: PerEventStates['fields'], optionsFields: PerEventOption['fields'], - detail: GeneralObject, + detail: GeneralDictionary, ) => { Object.entries(stateFields).forEach(([key, value]) => { if (typeof detail[key] !== 'number') return; diff --git a/src/modules/multitouchPanZoom.ts b/src/modules/MultitouchPanZoom.ts similarity index 94% rename from src/modules/multitouchPanZoom.ts rename to src/modules/MultitouchPanZoom.ts index f1c7dd8..dd6f5a4 100644 --- a/src/modules/multitouchPanZoom.ts +++ b/src/modules/MultitouchPanZoom.ts @@ -1,5 +1,5 @@ -import type { Coordinates, Pointer, Pointers } from '@/declarations'; -import BaseModule from '@/baseModule'; +import type { Coordinates, Pointer, Pointers } from '@/types'; +import BaseModule from '@/BaseModule'; import { getLast } from '@/utils'; export default class MultitouchPanZoom extends BaseModule { diff --git a/src/modules/preventDefault.ts b/src/modules/PreventDefault.ts similarity index 94% rename from src/modules/preventDefault.ts rename to src/modules/PreventDefault.ts index 5b86a10..a151df1 100644 --- a/src/modules/preventDefault.ts +++ b/src/modules/PreventDefault.ts @@ -1,4 +1,4 @@ -import BaseModule from '@/baseModule'; +import BaseModule from '@/BaseModule'; export default class PreventDefault extends BaseModule { onWheel = (e: WheelEvent) => e.preventDefault(); diff --git a/src/modules/wheelPanZoom.ts b/src/modules/WheelPanZoom.ts similarity index 92% rename from src/modules/wheelPanZoom.ts rename to src/modules/WheelPanZoom.ts index 0e5d38d..e9de83f 100644 --- a/src/modules/wheelPanZoom.ts +++ b/src/modules/WheelPanZoom.ts @@ -1,10 +1,8 @@ -import type { Coordinates, BaseOptions } from '@/declarations'; -import BaseModule, { BaseArgs } from '@/baseModule'; +import type { Coordinates, BaseOptions } from '@/types'; +import BaseModule, { BaseArgs } from '@/BaseModule'; import { fillIn } from '@/utils'; /* -to normal computer users: - # normal schema diff y > 0 => zooms in => zoom factor < 1 diff y < 0 => zooms out => zoom factor > 1 diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..9fdd1af --- /dev/null +++ b/src/types.ts @@ -0,0 +1,56 @@ +// #region SynthKernel Core Types +// oxlint-disable-next-line typescript/no-explicit-any +export type General = any; +export type GeneralArray = ReadonlyArray; +export type GeneralObject = object; +export type GeneralDictionary = Record; +export type GeneralConstructor = new (...args: General[]) => General; +type Indexable = string | number | symbol; + +type UnionToIntersection = (U extends General ? (k: U) => void : never) extends ( + k: infer I, +) => void + ? I + : never; + +type GeneralModuleInput = ReadonlyArray | ReadonlyArray; + +export type ModuleInput = + | ReadonlyArray + | ReadonlyArray>; + +type Instances = + T extends ReadonlyArray ? InstanceType : T[number]; + +export type Orchestratable< + T extends GeneralModuleInput, + K extends keyof Instances, +> = UnionToIntersection[K]>; +// #endregion ============================================================================== + +// #region Informative Types +export type Coordinates = { + x: number; + y: number; +}; + +export type Pointers = Map; + +export type Pointer = { + records: Array<{ x: number; y: number; timestamp: number }>; + target: EventTarget | null; + [key: Indexable]: General; +}; + +export interface StdEvents { + pan: { deltaX: number; deltaY: number }; + drag: { deltaX: number; deltaY: number; x: number; y: number }; + trueClick: Coordinates & { target: EventTarget | null; streak: number }; + zoom: Coordinates & { factor: number }; +} + +export interface BaseOptions { + coordinateOutput?: 'absolute' | 'relative' | 'relativeFraction'; + element: HTMLElement; +} +// #endregion =============================================================================== diff --git a/src/utils.ts b/src/utils.ts index 2d8b146..a563da7 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,13 +1,10 @@ -import { GeneralObject } from '@/declarations'; +import { GeneralDictionary } from '@/types'; export function getLast(arr: Array, num: number = 0) { return arr[arr.length - 1 - num]; } -export function fillIn(patch: GeneralObject, target: GeneralObject) { - for (const [k, v] of Object.entries(patch)) if (!(k in target)) target[k] = v; -} - -export function toArray(toTrans: T | Array) { - return Array.isArray(toTrans) ? toTrans : [toTrans]; +export function fillIn(patch: GeneralDictionary, target: GeneralDictionary) { + for (const [k, v] of Object.entries(patch)) + if (!(k in target)) (target as Record)[k] = v; } diff --git a/tests/click.test.ts b/tests/click.test.ts index e19c000..e3569e4 100644 --- a/tests/click.test.ts +++ b/tests/click.test.ts @@ -3,7 +3,7 @@ import { expect, test } from 'vitest'; import setup from './testUtils'; test('trigger a trueClick', async () => { - const { acc, dispose, Pointer } = setup(Click); + const { acc, dispose, Pointer } = setup([Click]); const p = new Pointer(); for (let i = 0; i < 3; i++) { p.down(); @@ -14,7 +14,7 @@ test('trigger a trueClick', async () => { }); test('trigger an shifted click that is not a trueClick', async () => { - const { acc, dispose, Pointer } = setup(Click); + const { acc, dispose, Pointer } = setup([Click]); const p = new Pointer(); p.down(); p.move({ x: 10, y: 10 }); @@ -24,7 +24,7 @@ test('trigger an shifted click that is not a trueClick', async () => { }); test('trigger an interrupted click that is not a trueClick', async () => { - const { acc, dispose, Pointer } = setup(Click); + const { acc, dispose, Pointer } = setup([Click]); const p1 = new Pointer(); const p2 = new Pointer(); p1.down(); diff --git a/tests/dev/script.ts b/tests/dev/script.ts index e4a23d8..13d9f52 100644 --- a/tests/dev/script.ts +++ b/tests/dev/script.ts @@ -11,7 +11,7 @@ import { zoomPreset, dragPreset, } from '@'; -import { Coordinates } from '@/declarations'; +import { Coordinates } from '@/types'; const square = document.getElementById('test-square') as HTMLElement; const squareRect = square.getBoundingClientRect(); diff --git a/tests/drag.test.ts b/tests/drag.test.ts index e999db0..98efe4a 100644 --- a/tests/drag.test.ts +++ b/tests/drag.test.ts @@ -3,7 +3,7 @@ import { expect, test } from 'vitest'; import setup from './testUtils'; test('drag', async () => { - const { acc, dispose, Pointer } = setup(Drag); + const { acc, dispose, Pointer } = setup([Drag]); const p = new Pointer(); p.down(); p.move({ x: 100, y: 100 }); diff --git a/tests/integration.test.ts b/tests/integration.test.ts index 420169d..fed502d 100644 --- a/tests/integration.test.ts +++ b/tests/integration.test.ts @@ -17,14 +17,14 @@ test('hot stop / start a module', async () => { }); const p = new Pointer(); - pointeract.stop(Click); + pointeract.stop([Click]); for (let i = 0; i < 3; i++) { p.down(); p.up(); } expect(acc.clicks).toBe(0); - pointeract.start(Click); + pointeract.start([Click]); for (let i = 0; i < 3; i++) { p.down(); p.up(); @@ -97,7 +97,7 @@ test('augmentation', async () => { private sample = () => {}; } - const { pointeract, dispose } = setup(Aug); + const { pointeract, dispose } = setup([Aug]); expect(pointeract.sample).toBeDefined(); await dispose(); diff --git a/tests/multiTouch.test.ts b/tests/multiTouch.test.ts index 463e5e7..bda5c82 100644 --- a/tests/multiTouch.test.ts +++ b/tests/multiTouch.test.ts @@ -3,7 +3,7 @@ import { expect, test } from 'vitest'; import setup from './testUtils'; test('two touches 100px apart, zoom in and pan up', async () => { - const { acc, dispose, Pointer } = setup(MultitouchPanZoom); + const { acc, dispose, Pointer } = setup([MultitouchPanZoom]); const p1 = new Pointer(); const p2 = new Pointer(); diff --git a/tests/testUtils.ts b/tests/testUtils.ts index a3d45cb..1299109 100644 --- a/tests/testUtils.ts +++ b/tests/testUtils.ts @@ -1,7 +1,8 @@ import { type Click, type Drag, PointeractInterface, type WheelPanZoom, Pointeract } from '@'; import { Window as HappyWindow, PointerEvent, HTMLDivElement, WheelEvent } from 'happy-dom'; import { beforeEach, vi } from 'vitest'; -import type { Coordinates, ModuleInputCtor, Options, StdEvents } from '@/declarations'; +import type { Coordinates, StdEvents } from '@/types'; +import { ModuleInputCtor, Options } from '@/BaseModule'; beforeEach(() => { vi.spyOn(HTMLElement.prototype, 'getBoundingClientRect').mockImplementation( diff --git a/tests/wheel.test.ts b/tests/wheel.test.ts index 0d1b912..b060e28 100644 --- a/tests/wheel.test.ts +++ b/tests/wheel.test.ts @@ -3,7 +3,7 @@ import { expect, test } from 'vitest'; import setup from './testUtils'; test('normal wheel', async () => { - const { acc, dispose, wheel } = setup(WheelPanZoom); + const { acc, dispose, wheel } = setup([WheelPanZoom]); wheel({ x: 0, y: 50 }); const smallerScale = acc.scale; expect(smallerScale < 0.9).toBe(true); @@ -14,7 +14,7 @@ test('normal wheel', async () => { test('professional control schema', async () => { const options = { proControlSchema: false }; - const { acc, dispose, wheel } = setup(WheelPanZoom, options); + const { acc, dispose, wheel } = setup([WheelPanZoom], options); // normal schema wheel({ x: 0, y: 200 }); From 965055a6dfeb94e6bd1730dcc0a1b48abc748624 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?He=CC=84sperus?= Date: Mon, 23 Feb 2026 23:30:35 +0800 Subject: [PATCH 2/2] add deno docs --- README.md | 15 ++++++++++++--- docs/en/get-started.md | 10 +++++++++- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index d723f70..5b8353d 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,9 @@ npm package + + JSR package + library security @@ -65,13 +68,19 @@ Install Pointeract using your favorite package manager: ```sh # npm -$ npm add pointeract +npm add pointeract # pnpm -$ pnpm add pointeract +pnpm add pointeract # yarn -$ yarn add pointeract +yarn add pointeract + +# bun +bun add pointeract + +# deno +deno add jsr:@hesprs/pointeract ``` Or include the following lines directly in your HTML file: diff --git a/docs/en/get-started.md b/docs/en/get-started.md index c5cb3e3..2f42372 100644 --- a/docs/en/get-started.md +++ b/docs/en/get-started.md @@ -24,6 +24,14 @@ pnpm add pointeract yarn add pointeract ``` +```sh [bun] +bun add pointeract +``` + +```sh [deno] +deno add jsr:@hesprs/pointeract +``` + ::: Or include the following lines directly in your HTML file: @@ -43,7 +51,7 @@ Simply grab the core class and a module: ```TypeScript import { Pointeract, Drag } from 'pointeract'; -new Pointeract({ element: yourElement }, Drag) +new Pointeract({ element: yourElement }, [Drag]) .start() .on('drag', e => console.log(e)); ```