diff --git a/.changeset/active-element-solid2-migration.md b/.changeset/active-element-solid2-migration.md new file mode 100644 index 000000000..5f8139a51 --- /dev/null +++ b/.changeset/active-element-solid2-migration.md @@ -0,0 +1,18 @@ +--- +"@solid-primitives/active-element": major +--- + +Migrate to Solid.js v2.0 (beta.12) + +## Breaking Changes + +**Peer dependencies**: `solid-js@^2.0.0-beta.12` and `@solidjs/web@^2.0.0-beta.12` are now required. + +- `makeFocusListener` and `createFocusSignal` have moved to `@solid-primitives/focus`. Import them from there instead: + ```ts + // Before + import { makeFocusListener, createFocusSignal } from "@solid-primitives/active-element"; + // After + import { makeFocusListener, createFocusSignal } from "@solid-primitives/focus"; + ``` +- `isServer` is now sourced from `@solidjs/web` internally (no user-facing API change) diff --git a/.changeset/autofocus-solid2-migration.md b/.changeset/autofocus-solid2-migration.md deleted file mode 100644 index a9c43b560..000000000 --- a/.changeset/autofocus-solid2-migration.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -"@solid-primitives/autofocus": major ---- - -Migrate to Solid.js v2.0 (beta.10) - -## Breaking Changes - -**Peer dependencies**: `solid-js@^2.0.0-beta.10` and `@solidjs/web@^2.0.0-beta.10` are now required. - -- `autofocus` is now a **ref callback factory** (`use:autofocus` directive removed; Solid 2.0 no longer supports `use:` directives): - ```tsx - // Before - - // After - - - // Before - - // After - - ``` -- `JSX` type is now imported from `@solidjs/web` (was `solid-js`) -- `onMount` replaced by `onSettled` from `solid-js` -- `createAutofocus` uses split `createEffect(compute, apply)` form with proper timeout cleanup on re-focus diff --git a/.changeset/focus-solid2-migration.md b/.changeset/focus-solid2-migration.md new file mode 100644 index 000000000..fb95c2c84 --- /dev/null +++ b/.changeset/focus-solid2-migration.md @@ -0,0 +1,40 @@ +--- +"@solid-primitives/focus": major +--- + +Migrate to Solid.js v2.0 (beta.12) + +## Breaking Changes + +**Peer dependencies**: `solid-js@^2.0.0-beta.12` and `@solidjs/web@^2.0.0-beta.12` are now required. + +- `autofocus` is now a **ref callback factory** (`use:autofocus` directive removed; Solid 2.0 no longer supports `use:` directives): + ```tsx + // Before + + // After + + + // Before + + // After + + ``` +- `JSX` type is now imported from `@solidjs/web` (was `solid-js`) +- `onMount` replaced by `onSettled` from `solid-js` +- `createAutofocus` uses split `createEffect(compute, apply)` form with proper timeout cleanup on re-focus + +## New Primitives + +`makeFocusListener` and `createFocusSignal` have moved here from `@solid-primitives/active-element`: + +- **`makeFocusListener(target, callback, useCapture?)`** — attaches `focus`/`blur` listeners to an element, calling `callback` with the new boolean focus state. Returns a cleanup function. + ```ts + const clear = makeFocusListener(el, isFocused => console.log(isFocused)); + clear(); // remove listeners + ``` +- **`createFocusSignal(target)`** — reactive signal that tracks whether `target` is focused. + ```ts + const isFocused = createFocusSignal(() => el); + isFocused(); // boolean + ``` diff --git a/.changeset/pre.json b/.changeset/pre.json index ae0287918..c41689783 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -5,7 +5,7 @@ "@solid-primitives/active-element": "2.1.5", "@solid-primitives/analytics": "0.2.1", "@solid-primitives/audio": "1.4.4", - "@solid-primitives/autofocus": "0.1.4", + "@solid-primitives/focus": "0.1.4", "@solid-primitives/bounds": "0.1.5", "@solid-primitives/broadcast-channel": "0.1.1", "@solid-primitives/clipboard": "1.6.4", diff --git a/README.md b/README.md index 1ddd4dda8..6b4a25686 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ The goal of Solid Primitives is to wrap client and server side functionality to |----|----|----|----|----|----| |

*Inputs*

| |[active-element](https://github.com/solidjs-community/solid-primitives/tree/main/packages/active-element#readme)|[![STAGE](https://img.shields.io/endpoint?style=for-the-badge&label=&url=https%3A%2F%2Fraw.githubusercontent.com%2Fsolidjs-community%2Fsolid-primitives%2Fmain%2Fassets%2Fbadges%2Fstage-3.json)](https://github.com/solidjs-community/solid-primitives/blob/main/CONTRIBUTING.md#contribution-process)|[createActiveElement](https://github.com/solidjs-community/solid-primitives/tree/main/packages/active-element#createactiveelement)
[createFocusSignal](https://github.com/solidjs-community/solid-primitives/tree/main/packages/active-element#createfocussignal)|[![SIZE](https://img.shields.io/bundlephobia/minzip/@solid-primitives/active-element?style=for-the-badge&label=)](https://bundlephobia.com/package/@solid-primitives/active-element)|[![VERSION](https://img.shields.io/npm/v/@solid-primitives/active-element?style=for-the-badge&label=)](https://www.npmjs.com/package/@solid-primitives/active-element)|| -|[autofocus](https://github.com/solidjs-community/solid-primitives/tree/main/packages/autofocus#readme)|[![STAGE](https://img.shields.io/endpoint?style=for-the-badge&label=&url=https%3A%2F%2Fraw.githubusercontent.com%2Fsolidjs-community%2Fsolid-primitives%2Fmain%2Fassets%2Fbadges%2Fstage-1.json)](https://github.com/solidjs-community/solid-primitives/blob/main/CONTRIBUTING.md#contribution-process)|[autofocus](https://github.com/solidjs-community/solid-primitives/tree/main/packages/autofocus#autofocus)
[createAutofocus](https://github.com/solidjs-community/solid-primitives/tree/main/packages/autofocus#createautofocus)|[![SIZE](https://img.shields.io/bundlephobia/minzip/@solid-primitives/autofocus?style=for-the-badge&label=)](https://bundlephobia.com/package/@solid-primitives/autofocus)|[![VERSION](https://img.shields.io/npm/v/@solid-primitives/autofocus?style=for-the-badge&label=)](https://www.npmjs.com/package/@solid-primitives/autofocus)|✓| +|[focus](https://github.com/solidjs-community/solid-primitives/tree/main/packages/focus#readme)|[![STAGE](https://img.shields.io/endpoint?style=for-the-badge&label=&url=https%3A%2F%2Fraw.githubusercontent.com%2Fsolidjs-community%2Fsolid-primitives%2Fmain%2Fassets%2Fbadges%2Fstage-1.json)](https://github.com/solidjs-community/solid-primitives/blob/main/CONTRIBUTING.md#contribution-process)|[autofocus](https://github.com/solidjs-community/solid-primitives/tree/main/packages/focus#autofocus)
[createAutofocus](https://github.com/solidjs-community/solid-primitives/tree/main/packages/focus#createautofocus)
[makeFocusListener](https://github.com/solidjs-community/solid-primitives/tree/main/packages/focus#makefocuslistener)
[createFocusSignal](https://github.com/solidjs-community/solid-primitives/tree/main/packages/focus#createfocussignal)
[createFocusTrap](https://github.com/solidjs-community/solid-primitives/tree/main/packages/focus#createfocustrap)|[![SIZE](https://img.shields.io/bundlephobia/minzip/@solid-primitives/focus?style=for-the-badge&label=)](https://bundlephobia.com/package/@solid-primitives/focus)|[![VERSION](https://img.shields.io/npm/v/@solid-primitives/focus?style=for-the-badge&label=)](https://www.npmjs.com/package/@solid-primitives/focus)|✓| |[input-mask](https://github.com/solidjs-community/solid-primitives/tree/main/packages/input-mask#readme)|[![STAGE](https://img.shields.io/endpoint?style=for-the-badge&label=&url=https%3A%2F%2Fraw.githubusercontent.com%2Fsolidjs-community%2Fsolid-primitives%2Fmain%2Fassets%2Fbadges%2Fstage-1.json)](https://github.com/solidjs-community/solid-primitives/blob/main/CONTRIBUTING.md#contribution-process)|[createInputMask](https://github.com/solidjs-community/solid-primitives/tree/main/packages/input-mask#createinputmask)
[createMaskPattern](https://github.com/solidjs-community/solid-primitives/tree/main/packages/input-mask#createmaskpattern)|[![SIZE](https://img.shields.io/bundlephobia/minzip/@solid-primitives/input-mask?style=for-the-badge&label=)](https://bundlephobia.com/package/@solid-primitives/input-mask)|[![VERSION](https://img.shields.io/npm/v/@solid-primitives/input-mask?style=for-the-badge&label=)](https://www.npmjs.com/package/@solid-primitives/input-mask)|✓| |[keyboard](https://github.com/solidjs-community/solid-primitives/tree/main/packages/keyboard#readme)|[![STAGE](https://img.shields.io/endpoint?style=for-the-badge&label=&url=https%3A%2F%2Fraw.githubusercontent.com%2Fsolidjs-community%2Fsolid-primitives%2Fmain%2Fassets%2Fbadges%2Fstage-1.json)](https://github.com/solidjs-community/solid-primitives/blob/main/CONTRIBUTING.md#contribution-process)|[useKeyDownList](https://github.com/solidjs-community/solid-primitives/tree/main/packages/keyboard#usekeydownlist)
[useCurrentlyHeldKey](https://github.com/solidjs-community/solid-primitives/tree/main/packages/keyboard#usecurrentlyheldkey)
[useKeyDownSequence](https://github.com/solidjs-community/solid-primitives/tree/main/packages/keyboard#usekeydownsequence)
[createKeyHold](https://github.com/solidjs-community/solid-primitives/tree/main/packages/keyboard#createkeyhold)
[createShortcut](https://github.com/solidjs-community/solid-primitives/tree/main/packages/keyboard#createshortcut)|[![SIZE](https://img.shields.io/bundlephobia/minzip/@solid-primitives/keyboard?style=for-the-badge&label=)](https://bundlephobia.com/package/@solid-primitives/keyboard)|[![VERSION](https://img.shields.io/npm/v/@solid-primitives/keyboard?style=for-the-badge&label=)](https://www.npmjs.com/package/@solid-primitives/keyboard)|| |[mouse](https://github.com/solidjs-community/solid-primitives/tree/main/packages/mouse#readme)|[![STAGE](https://img.shields.io/endpoint?style=for-the-badge&label=&url=https%3A%2F%2Fraw.githubusercontent.com%2Fsolidjs-community%2Fsolid-primitives%2Fmain%2Fassets%2Fbadges%2Fstage-3.json)](https://github.com/solidjs-community/solid-primitives/blob/main/CONTRIBUTING.md#contribution-process)|[createMousePosition](https://github.com/solidjs-community/solid-primitives/tree/main/packages/mouse#createmouseposition)
[createPositionToElement](https://github.com/solidjs-community/solid-primitives/tree/main/packages/mouse#createpositiontoelement)|[![SIZE](https://img.shields.io/bundlephobia/minzip/@solid-primitives/mouse?style=for-the-badge&label=)](https://bundlephobia.com/package/@solid-primitives/mouse)|[![VERSION](https://img.shields.io/npm/v/@solid-primitives/mouse?style=for-the-badge&label=)](https://www.npmjs.com/package/@solid-primitives/mouse)|| diff --git a/packages/active-element/package.json b/packages/active-element/package.json index 0c43a6a2a..2230c4aa4 100644 --- a/packages/active-element/package.json +++ b/packages/active-element/package.json @@ -16,8 +16,7 @@ "name": "active-element", "stage": 3, "list": [ - "createActiveElement", - "createFocusSignal" + "createActiveElement" ], "category": "Inputs" }, @@ -55,10 +54,12 @@ "@solid-primitives/utils": "workspace:^" }, "peerDependencies": { - "solid-js": "^1.6.12" + "@solidjs/web": "^2.0.0-beta.12", + "solid-js": "^2.0.0-beta.12" }, "typesVersions": {}, "devDependencies": { - "solid-js": "^1.9.7" + "@solidjs/web": "2.0.0-beta.12", + "solid-js": "2.0.0-beta.12" } } diff --git a/packages/active-element/src/index.ts b/packages/active-element/src/index.ts index 307bcb7c3..4afc9b0d2 100644 --- a/packages/active-element/src/index.ts +++ b/packages/active-element/src/index.ts @@ -1,11 +1,7 @@ import { type Accessor, type JSX } from "solid-js"; -import { isServer } from "solid-js/web"; -import { - type MaybeAccessor, - type Directive, - createHydratableSignal, -} from "@solid-primitives/utils"; -import { makeEventListener, createEventListener } from "@solid-primitives/event-listener"; +import { isServer } from "@solidjs/web"; +import { type Directive, createHydratableSignal } from "@solid-primitives/utils"; +import { makeEventListener } from "@solid-primitives/event-listener"; declare module "solid-js" { namespace JSX { @@ -15,7 +11,7 @@ declare module "solid-js" { } } // This ensures the `JSX` import won't fall victim to tree shaking -export type E = JSX.Element; +export type E = JSX.Directives; const getActiveElement = () => document.activeElement === document.body ? null : document.activeElement; @@ -60,54 +56,6 @@ export function createActiveElement(): Accessor { return active; } -/** - * Attaches "blur" and "focus" event listeners to the element. - * @see https://github.com/solidjs-community/solid-primitives/tree/main/packages/active-element#makeFocusListener - * @param target element - * @param callback handle focus change - * @param useCapture activates capturing, which allows to listen on events at the root that don't support bubbling. - * @returns function for clearing event listeners - * @example - * const [isFocused, setIsFocused] = createSignal(false) - * const clear = makeFocusListener(focused => setIsFocused(focused)); - * // remove listeners (happens also on cleanup) - * clear(); - */ -export function makeFocusListener( - target: Element, - callback: (isActive: boolean) => void, - useCapture = true, -): VoidFunction { - if (isServer) { - return () => void 0; - } - const clear1 = makeEventListener(target, "blur", callback.bind(void 0, false), useCapture); - const clear2 = makeEventListener(target, "focus", callback.bind(void 0, true), useCapture); - return () => (clear1(), clear2()); -} - -/** - * Provides a signal representing element's focus state. - * @param target element or a reactive function returning one - * @returns boolean signal representing element's focus state - * @see https://github.com/solidjs-community/solid-primitives/tree/main/packages/active-element#createFocusSignal - * @example - * const isFocused = createFocusSignal(() => el) - * isFocused() // T: boolean - */ -export function createFocusSignal(target: MaybeAccessor): Accessor { - if (isServer) { - return () => false; - } - const [isActive, setIsActive] = createHydratableSignal( - false, - () => document.activeElement === target, - ); - createEventListener(target, "blur", () => setIsActive(false), true); - createEventListener(target, "focus", () => setIsActive(true), true); - return isActive; -} - /** * A directive that notifies you when the element becomes active or inactive. * @@ -123,5 +71,6 @@ export const focus: Directive<(isActive: boolean) => void> = (target, props) => } const callback = props(); callback(document.activeElement === target); - makeFocusListener(target, callback); + makeEventListener(target, "blur", callback.bind(void 0, false), true); + makeEventListener(target, "focus", callback.bind(void 0, true), true); }; diff --git a/packages/active-element/test/index.test.ts b/packages/active-element/test/index.test.ts index 25d67e2eb..591fc886d 100644 --- a/packages/active-element/test/index.test.ts +++ b/packages/active-element/test/index.test.ts @@ -1,12 +1,6 @@ import { createRoot } from "solid-js"; import { describe, test, expect } from "vitest"; -import { - makeActiveElementListener, - createActiveElement, - makeFocusListener, - createFocusSignal, - focus, -} from "../src/index.js"; +import { makeActiveElementListener, createActiveElement, focus } from "../src/index.js"; const dispatchFocusEvent = ( target: Element | Window = window, @@ -40,29 +34,6 @@ describe("makeActiveElementListener", () => { })); }); -describe("makeFocusListener", () => { - test("works properly", () => - createRoot(dispose => { - const el = document.createElement("div"); - const captured: any[] = []; - const clear = makeFocusListener(el, e => captured.push(e)); - expect(captured).toEqual([]); - dispatchFocusEvent(el, "focus"); - expect(captured).toEqual([true]); - dispatchFocusEvent(el, "blur"); - expect(captured).toEqual([true, false]); - clear(); - dispatchFocusEvent(el, "focus"); - expect(captured).toEqual([true, false]); - makeFocusListener(el, e => captured.push(e)); - dispatchFocusEvent(el, "blur"); - expect(captured).toEqual([true, false, false]); - dispose(); - dispatchFocusEvent(el, "focus"); - expect(captured).toEqual([true, false, false]); - })); -}); - describe("createActiveElement", () => { test("works properly", () => createRoot(dispose => { @@ -72,22 +43,6 @@ describe("createActiveElement", () => { })); }); -describe("createFocusSignal", () => { - test("works properly", () => - createRoot(dispose => { - const el = document.createElement("div"); - const activeEl = createFocusSignal(el); - expect(activeEl()).toBe(false); - dispatchFocusEvent(el, "focus"); - expect(activeEl()).toBe(true); - dispatchFocusEvent(el, "blur"); - expect(activeEl()).toBe(false); - dispose(); - dispatchFocusEvent(el, "focus"); - expect(activeEl()).toBe(false); - })); -}); - describe("use:focus", () => { test("works properly", () => createRoot(dispose => { diff --git a/packages/active-element/test/server.test.ts b/packages/active-element/test/server.test.ts index 830c9fb3d..558d9566d 100644 --- a/packages/active-element/test/server.test.ts +++ b/packages/active-element/test/server.test.ts @@ -1,8 +1,7 @@ import { describe, test, expect, vi } from "vitest"; -import { makeActiveElementListener, createActiveElement, createFocusSignal } from "../src/index.js"; +import { makeActiveElementListener, createActiveElement } from "../src/index.js"; describe("API doesn't break in SSR", () => { - // check if the API doesn't throw when calling it in SSR test("makeActiveElementListener() - SSR", () => { const cb = vi.fn(); expect(() => makeActiveElementListener(cb)).not.toThrow(); @@ -12,10 +11,4 @@ describe("API doesn't break in SSR", () => { test("createActiveElement() - SSR", () => { expect(() => createActiveElement()).not.toThrow(); }); - - test("createFocusSignal() - SSR", () => { - const el = vi.fn(); - expect(() => createFocusSignal(el)).not.toThrow(); - expect(el).not.toBeCalled(); - }); }); diff --git a/packages/autofocus/README.md b/packages/autofocus/README.md deleted file mode 100644 index d07bdfa56..000000000 --- a/packages/autofocus/README.md +++ /dev/null @@ -1,81 +0,0 @@ -

- Solid Primitives Autofocus -

- -# @solid-primitives/autofocus - -[![size](https://img.shields.io/bundlephobia/minzip/@solid-primitives/autofocus?style=for-the-badge&label=size)](https://bundlephobia.com/package/@solid-primitives/autofocus) -[![version](https://img.shields.io/npm/v/@solid-primitives/autofocus?style=for-the-badge)](https://www.npmjs.com/package/@solid-primitives/autofocus) -[![stage](https://img.shields.io/endpoint?style=for-the-badge&url=https%3A%2F%2Fraw.githubusercontent.com%2Fsolidjs-community%2Fsolid-primitives%2Fmain%2Fassets%2Fbadges%2Fstage-1.json)](https://github.com/solidjs-community/solid-primitives#contribution-process) - -Primitives for autofocusing HTML elements. - -The native autofocus attribute only works on page load, which makes it incompatible with SolidJS. These primitives run on render, allowing autofocus on initial render as well as dynamically added components. - -- [`autofocus`](#autofocus) - Directive to autofocus an element on render. -- [`createAutofocus`](#createautofocus) - Reactive primitive to autofocus an element on render. - -## Installation - -```bash -npm install @solid-primitives/autofocus -# or -yarn add @solid-primitives/autofocus -# or -pnpm add @solid-primitives/autofocus -``` - -## `autofocus` - -### How to use it - -`autofocus` is a ref callback factory. It uses the native `autofocus` attribute to determine whether to focus the element. - -```tsx -import { autofocus } from "@solid-primitives/autofocus"; - -; -``` - -To conditionally enable autofocus, control the `autofocus` attribute directly — the `autofocus()` ref only focuses when the attribute is present, so removing it is sufficient to opt out: - -```tsx -// Conditionally autofocus by toggling the attribute -; -``` - -> **Note:** The `enabled` parameter was removed because it was redundant — the same effect is achieved by omitting the `autofocus` attribute. Previously, Solid directives always received an accessor argument whether you used it or not, which gave the impression an explicit toggle was necessary. - -### `createAutofocus` - -`createAutofocus` reactively autofocuses an element passed in as a signal. - -```tsx -import { createAutofocus } from "@solid-primitives/autofocus"; - -// Using ref -let ref!: HTMLButtonElement; -createAutofocus(() => ref); - -; - -// Using ref signal -const [ref, setRef] = createSignal(); -createAutofocus(ref); - -; -``` - -## Demo - -You may see the working example here: https://primitives.solidjs.community/playground/autofocus/ - -Source code: https://github.com/solidjs-community/solid-primitives/blob/main/packages/autofocus/dev/index.tsx - -## Changelog - -See [CHANGELOG.md](./CHANGELOG.md) diff --git a/packages/autofocus/test/index.test.tsx b/packages/autofocus/test/index.test.tsx deleted file mode 100644 index d7bc0b901..000000000 --- a/packages/autofocus/test/index.test.tsx +++ /dev/null @@ -1,116 +0,0 @@ -import { describe, test, expect, vi, beforeEach, afterAll, beforeAll } from "vitest"; -import { createRoot, createSignal, flush } from "solid-js"; -import { autofocus, createAutofocus } from "../src/index.js"; - -let focused: HTMLElement | null = null; - -const original_focus = HTMLElement.prototype.focus; -HTMLElement.prototype.focus = function (this) { - focused = this; -}; - -beforeAll(() => { - vi.useFakeTimers(); -}); - -beforeEach(() => { - vi.clearAllTimers(); - focused = null; -}); - -afterAll(() => { - vi.useRealTimers(); - HTMLElement.prototype.focus = original_focus; -}); - -describe("autofocus", () => { - test("focuses the element with autofocus attribute", () => { - const el = document.createElement("button"); - el.setAttribute("autofocus", ""); - - const dispose = createRoot(dispose => { - // Phase 1: factory registers onSettled - const ref = autofocus(); - // Phase 2: ref callback receives the element - ref(el); - return dispose; - }); - - flush(); - expect(focused).toBe(null); - vi.runAllTimers(); - expect(focused).toBe(el); - - dispose(); - }); - - test("doesn't focus when autofocus HTML attribute is absent", () => { - const el = document.createElement("button"); - - const dispose = createRoot(dispose => { - const ref = autofocus(); - ref(el); - return dispose; - }); - - flush(); - expect(focused).toBe(null); - vi.runAllTimers(); - expect(focused).toBe(null); - - dispose(); - }); - -}); - -describe("createAutofocus", () => { - const el = document.createElement("button"), - el2 = document.createElement("button"); - - test("createAutofocus focuses the element", () => { - const dispose = createRoot(dispose => { - createAutofocus(() => el); - return dispose; - }); - - flush(); - expect(focused).toBe(null); - vi.runAllTimers(); - expect(focused).toBe(el); - - dispose(); - }); - - test("createAutofocus works with signal", () => { - const [ref, setRef] = createSignal(); - - const dispose = createRoot(dispose => { - createAutofocus(ref); - return dispose; - }); - - flush(); - expect(focused).toBe(null); - vi.runAllTimers(); - expect(focused).toBe(null); - - setRef(el); - flush(); - expect(focused).toBe(null); - vi.runAllTimers(); - expect(focused).toBe(el); - - setRef(el2); - flush(); - expect(focused).toBe(el); - vi.runAllTimers(); - expect(focused).toBe(el2); - - dispose(); - - setRef(el); - expect(focused).toBe(el2); - vi.runAllTimers(); - expect(focused).toBe(el2); - }); -}); diff --git a/packages/autofocus/CHANGELOG.md b/packages/focus/CHANGELOG.md similarity index 98% rename from packages/autofocus/CHANGELOG.md rename to packages/focus/CHANGELOG.md index 976ecae9d..ac009a623 100644 --- a/packages/autofocus/CHANGELOG.md +++ b/packages/focus/CHANGELOG.md @@ -1,4 +1,4 @@ -# @solid-primitives/autofocus +# @solid-primitives/focus ## 0.1.4 diff --git a/packages/autofocus/LICENSE b/packages/focus/LICENSE similarity index 84% rename from packages/autofocus/LICENSE rename to packages/focus/LICENSE index 38b41d975..7a35c2e14 100644 --- a/packages/autofocus/LICENSE +++ b/packages/focus/LICENSE @@ -2,6 +2,10 @@ MIT License Copyright (c) 2021 Solid Primitives Working Group +The `createFocusTrap` primitive is ported from solid-focus-trap: + Copyright (c) 2023 Jasmin Noetzli (GiyoMoon) + https://github.com/corvudev/corvu/tree/main/packages/solid-focus-trap + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights @@ -18,4 +22,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +SOFTWARE. diff --git a/packages/focus/README.md b/packages/focus/README.md new file mode 100644 index 000000000..92772a3e6 --- /dev/null +++ b/packages/focus/README.md @@ -0,0 +1,165 @@ +

+ Solid Primitives Focus +

+ +# @solid-primitives/focus + +[![size](https://img.shields.io/bundlephobia/minzip/@solid-primitives/focus?style=for-the-badge&label=size)](https://bundlephobia.com/package/@solid-primitives/focus) +[![version](https://img.shields.io/npm/v/@solid-primitives/focus?style=for-the-badge)](https://www.npmjs.com/package/@solid-primitives/focus) +[![stage](https://img.shields.io/endpoint?style=for-the-badge&url=https%3A%2F%2Fraw.githubusercontent.com%2Fsolidjs-community%2Fsolid-primitives%2Fmain%2Fassets%2Fbadges%2Fstage-1.json)](https://github.com/solidjs-community/solid-primitives#contribution-process) + +Primitives for autofocusing HTML elements and trapping focus within a container. + +The native `autofocus` attribute only works on page load, which makes it incompatible with SolidJS. These primitives run on render, allowing autofocus on initial render as well as dynamically added components. + +- [`autofocus`](#autofocus) - Ref callback factory to autofocus an element on render. +- [`createAutofocus`](#createautofocus) - Reactive primitive to autofocus an element on render. +- [`createFocusTrap`](#createfocustrap) - Traps focus inside a given DOM element. + +## Installation + +```bash +npm install @solid-primitives/focus +# or +yarn add @solid-primitives/focus +# or +pnpm add @solid-primitives/focus +``` + +## `autofocus` + +### How to use it + +`autofocus` is a ref callback factory. It uses the native `autofocus` attribute to determine whether to focus the element. + +```tsx +import { autofocus } from "@solid-primitives/focus"; + +; +``` + +To conditionally enable autofocus, control the `autofocus` attribute directly — the `autofocus()` ref only focuses when the attribute is present, so removing it is sufficient to opt out: + +```tsx +// Conditionally autofocus by toggling the attribute +; +``` + +> **Note:** The `enabled` parameter was removed because it was redundant — the same effect is achieved by omitting the `autofocus` attribute. Previously, Solid directives always received an accessor argument whether you used it or not, which gave the impression an explicit toggle was necessary. + +## `createAutofocus` + +`createAutofocus` reactively autofocuses an element passed in as a signal. + +```tsx +import { createAutofocus } from "@solid-primitives/focus"; + +// Using ref +let ref!: HTMLButtonElement; +createAutofocus(() => ref); + +; + +// Using ref signal +const [ref, setRef] = createSignal(); +createAutofocus(ref); + +; +``` + +## `createFocusTrap` + +`createFocusTrap` traps keyboard focus inside a given DOM element, cycling through focusable children on Tab / Shift+Tab. It uses a `MutationObserver` to stay up to date with DOM changes and restores focus to the previously focused element when deactivated. + +> Ported from [solid-focus-trap](https://github.com/corvudev/corvu/tree/main/packages/solid-focus-trap) by [Jasmin Noetzli (GiyoMoon)](https://github.com/GiyoMoon), adapted for Solid.js 2.0. + +### How to use it + +```tsx +import { createFocusTrap } from "@solid-primitives/focus"; + +const DialogContent: Component<{ open: boolean }> = props => { + const [contentRef, setContentRef] = createSignal(null); + + createFocusTrap({ + element: contentRef, + enabled: () => props.open, + }); + + return ( + +
+ + +
+
+ ); +}; +``` + +### Props + +| Prop | Type | Default | Description | +| -------------------- | --------------------------------- | -------------------------------- | --------------------------------------------------------------------------------- | +| `element` | `MaybeAccessor` | — | Element to trap focus within. | +| `enabled` | `MaybeAccessor` | `true` | Whether the trap is active. | +| `observeChanges` | `MaybeAccessor` | `true` | Watch for DOM mutations inside the container and refresh focusable elements. | +| `initialFocusElement`| `MaybeAccessor` | First focusable element | Element to focus when the trap activates. | +| `restoreFocus` | `MaybeAccessor` | `true` | Restore focus to the previously focused element when the trap deactivates. | +| `finalFocusElement` | `MaybeAccessor` | Previously focused element | Element to focus when the trap deactivates. | +| `onInitialFocus` | `(event: Event) => void` | — | Callback when focus moves into the trap. Call `event.preventDefault()` to cancel.| +| `onFinalFocus` | `(event: Event) => void` | — | Callback when focus restores. Call `event.preventDefault()` to cancel. | + +### Custom initial focus + +```tsx +const [contentRef, setContentRef] = createSignal(null); +const [inputRef, setInputRef] = createSignal(null); + +createFocusTrap({ + element: contentRef, + enabled: () => props.open, + initialFocusElement: inputRef, +}); + +return ( + +
+ + +
+
+); +``` + +### Preventing focus moves + +```tsx +createFocusTrap({ + element: contentRef, + onInitialFocus: event => { + event.preventDefault(); // focus won't move on activation + }, + onFinalFocus: event => { + event.preventDefault(); // focus won't restore on deactivation + }, +}); +``` + +## Demo + +You may see the working example here: https://primitives.solidjs.community/playground/focus/ + +Source code: https://github.com/solidjs-community/solid-primitives/blob/main/packages/focus/dev/index.tsx + +## Credits + +`createFocusTrap` is ported from [solid-focus-trap](https://github.com/corvudev/corvu/tree/main/packages/solid-focus-trap), part of the [corvu](https://corvu.dev) UI toolkit by [Jasmin Noetzli (GiyoMoon)](https://github.com/GiyoMoon). Licensed under the MIT License. + +## Changelog + +See [CHANGELOG.md](./CHANGELOG.md) diff --git a/packages/autofocus/dev/index.tsx b/packages/focus/dev/index.tsx similarity index 100% rename from packages/autofocus/dev/index.tsx rename to packages/focus/dev/index.tsx diff --git a/packages/autofocus/package.json b/packages/focus/package.json similarity index 68% rename from packages/autofocus/package.json rename to packages/focus/package.json index 3900eab73..189cca07d 100644 --- a/packages/autofocus/package.json +++ b/packages/focus/package.json @@ -1,11 +1,20 @@ { - "name": "@solid-primitives/autofocus", + "name": "@solid-primitives/focus", "version": "0.2.0", - "description": "Primitives for autofocusing HTML elements", + "description": "Primitives for autofocusing HTML elements and trapping focus within a container", "author": "jer3m01 ", - "contributors": [], + "contributors": [ + { + "name": "Jasmin Noetzli", + "url": "https://github.com/GiyoMoon" + }, + { + "name": "David Di Biase", + "url": "https://github.com/davedbase" + } + ], "license": "MIT", - "homepage": "https://primitives.solidjs.community/package/autofocus", + "homepage": "https://primitives.solidjs.community/package/focus", "repository": { "type": "git", "url": "git+https://github.com/solidjs-community/solid-primitives.git" @@ -14,11 +23,14 @@ "url": "https://github.com/solidjs-community/solid-primitives/issues" }, "primitive": { - "name": "autofocus", + "name": "focus", "stage": 1, "list": [ "autofocus", - "createAutofocus" + "createAutofocus", + "createFocusTrap", + "makeFocusListener", + "createFocusSignal" ], "category": "Inputs" }, @@ -26,7 +38,11 @@ "solid", "primitives", "focus", - "autofocus" + "autofocus", + "focus-trap", + "trap", + "accessibility", + "a11y" ], "private": false, "sideEffects": false, @@ -56,6 +72,7 @@ "solid-js": "^2.0.0-beta.14" }, "dependencies": { + "@solid-primitives/event-listener": "workspace:^", "@solid-primitives/utils": "workspace:^" }, "typesVersions": {}, diff --git a/packages/autofocus/src/index.ts b/packages/focus/src/autofocus.ts similarity index 100% rename from packages/autofocus/src/index.ts rename to packages/focus/src/autofocus.ts diff --git a/packages/focus/src/focusSignal.ts b/packages/focus/src/focusSignal.ts new file mode 100644 index 000000000..c24e09e6c --- /dev/null +++ b/packages/focus/src/focusSignal.ts @@ -0,0 +1,52 @@ +import { type Accessor } from "solid-js"; +import { isServer } from "@solidjs/web"; +import { type MaybeAccessor, createHydratableSignal } from "@solid-primitives/utils"; +import { makeEventListener, createEventListener } from "@solid-primitives/event-listener"; + +/** + * Attaches "blur" and "focus" event listeners to the element. + * @see https://github.com/solidjs-community/solid-primitives/tree/main/packages/focus#makeFocusListener + * @param target element + * @param callback handle focus change + * @param useCapture activates capturing, which allows to listen on events at the root that don't support bubbling. + * @returns function for clearing event listeners + * @example + * const [isFocused, setIsFocused] = createSignal(false) + * const clear = makeFocusListener(el, focused => setIsFocused(focused)); + * // remove listeners (happens also on cleanup) + * clear(); + */ +export function makeFocusListener( + target: Element, + callback: (isActive: boolean) => void, + useCapture = true, +): VoidFunction { + if (isServer) { + return () => {}; + } + const clear1 = makeEventListener(target, "blur", callback.bind(undefined, false), useCapture); + const clear2 = makeEventListener(target, "focus", callback.bind(undefined, true), useCapture); + return () => (clear1(), clear2()); +} + +/** + * Provides a signal representing element's focus state. + * @param target element or a reactive function returning one + * @returns boolean signal representing element's focus state + * @see https://github.com/solidjs-community/solid-primitives/tree/main/packages/focus#createFocusSignal + * @example + * const isFocused = createFocusSignal(() => el) + * isFocused() // T: boolean + */ +export function createFocusSignal(target: MaybeAccessor): Accessor { + if (isServer) { + return () => false; + } + const [isActive, setIsActive] = createHydratableSignal( + false, + () => document.activeElement === target, + ); + createEventListener(target, "blur", () => setIsActive(false), true); + createEventListener(target, "focus", () => setIsActive(true), true); + return isActive; +} diff --git a/packages/focus/src/focusTrap.ts b/packages/focus/src/focusTrap.ts new file mode 100644 index 000000000..06391279e --- /dev/null +++ b/packages/focus/src/focusTrap.ts @@ -0,0 +1,214 @@ +/* + * Ported from solid-focus-trap by Jasmin Noetzli (GiyoMoon) + * MIT License — https://github.com/corvudev/corvu/tree/main/packages/solid-focus-trap + * Adapted for Solid.js 2.0 and @solid-primitives/focus by the Solid Primitives Working Group. + */ + +import { access, afterPaint, INTERNAL_OPTIONS, type MaybeAccessor } from "@solid-primitives/utils"; +import { createEffect, createMemo, createSignal } from "solid-js"; + +const FOCUSABLE_SELECTOR = + 'a[href]:not([tabindex="-1"]), button:not([tabindex="-1"]), input:not([tabindex="-1"]), textarea:not([tabindex="-1"]), select:not([tabindex="-1"]), details:not([tabindex="-1"]), [tabindex]:not([tabindex="-1"])'; + +const EVENT_INITIAL_FOCUS = "focusTrap.initialFocus"; +const EVENT_FINAL_FOCUS = "focusTrap.finalFocus"; +const EVENT_OPTIONS = { bubbles: false, cancelable: true } as const; + +export type CreateFocusTrapProps = { + /** Element to trap focus within. */ + element: MaybeAccessor; + /** Whether the focus trap is active. Default: `true` */ + enabled?: MaybeAccessor; + /** + * Watch for DOM mutations inside the container and reload the list of + * focusable elements accordingly. Default: `true` + */ + observeChanges?: MaybeAccessor; + /** + * Element to focus when the trap activates. + * Default: the first focusable element inside `element`. + */ + initialFocusElement?: MaybeAccessor; + /** + * Restore focus to the element that was focused before the trap activated + * when the trap is deactivated. Default: `true` + */ + restoreFocus?: MaybeAccessor; + /** + * Element to focus when the trap deactivates. + * Default: the element that was focused before the trap activated. + */ + finalFocusElement?: MaybeAccessor; + /** + * Callback fired when focus moves into the trap. + * Call `event.preventDefault()` to suppress the focus move. + */ + onInitialFocus?: (event: Event) => void; + /** + * Callback fired when focus is restored after deactivation. + * Call `event.preventDefault()` to suppress the focus move. + */ + onFinalFocus?: (event: Event) => void; +}; + +/** + * Traps focus inside the given element. Aware of DOM changes inside the trap + * via a MutationObserver. Properly restores focus when deactivated. + * + * Ported from [solid-focus-trap](https://github.com/corvudev/corvu/tree/main/packages/solid-focus-trap) + * by Jasmin Noetzli (GiyoMoon), adapted for Solid.js 2.0. + * + * @example + * ```tsx + * const [ref, setRef] = createSignal(null); + * createFocusTrap({ element: ref, enabled: () => isOpen() }); + *
...
+ * ``` + */ +export const createFocusTrap = (props: CreateFocusTrapProps): void => { + const [focusableElements, setFocusableElements] = createSignal( + undefined, + INTERNAL_OPTIONS, + ); + + const firstFocusElement = createMemo(() => { + const els = focusableElements(); + return els ? (els[0] ?? null) : null; + }); + + const lastFocusElement = createMemo(() => { + const els = focusableElements(); + return els ? (els[els.length - 1] ?? null) : null; + }); + + let originalFocusedElement: HTMLElement | null = null; + + const loadFocusableElements = (container: HTMLElement) => { + const sorted = Array.from(container.querySelectorAll(FOCUSABLE_SELECTOR)) + .map((element, domIndex) => ({ element, domIndex, tabIndex: element.tabIndex })) + .sort((a, b) => + a.tabIndex === b.tabIndex ? a.domIndex - b.domIndex : a.tabIndex - b.tabIndex, + ); + setFocusableElements(sorted.map(({ element }) => element)); + }; + + const triggerInitialFocus = (container: HTMLElement) => { + afterPaint(() => { + const target = access(props.initialFocusElement ?? null) ?? firstFocusElement() ?? container; + const { onInitialFocus } = props; + if (onInitialFocus) { + const event = new CustomEvent(EVENT_INITIAL_FOCUS, EVENT_OPTIONS); + container.addEventListener(EVENT_INITIAL_FOCUS, onInitialFocus); + container.dispatchEvent(event); + container.removeEventListener(EVENT_INITIAL_FOCUS, onInitialFocus); + if (event.defaultPrevented) return; + } + target.focus(); + }); + }; + + const triggerRestoreFocus = (container: HTMLElement) => { + afterPaint(() => { + if (!access(props.restoreFocus ?? true)) return; + const target = access(props.finalFocusElement ?? null) ?? originalFocusedElement; + if (!target) return; + const { onFinalFocus } = props; + if (onFinalFocus) { + const event = new CustomEvent(EVENT_FINAL_FOCUS, EVENT_OPTIONS); + container.addEventListener(EVENT_FINAL_FOCUS, onFinalFocus); + container.dispatchEvent(event); + container.removeEventListener(EVENT_FINAL_FOCUS, onFinalFocus); + if (event.defaultPrevented) return; + } + target.focus(); + }); + }; + + const onFirstElementKeyDown = (event: KeyboardEvent) => { + if (event.key === "Tab" && event.shiftKey) { + event.preventDefault(); + lastFocusElement()!.focus(); + } + }; + + const onLastElementKeyDown = (event: KeyboardEvent) => { + if (event.key === "Tab" && !event.shiftKey) { + event.preventDefault(); + firstFocusElement()!.focus(); + } + }; + + const preventTab = (event: KeyboardEvent) => { + if (event.key === "Tab") event.preventDefault(); + }; + + // Activate / deactivate the trap when element or enabled changes. + createEffect( + () => ({ + container: access(props.element), + enabled: access(props.enabled ?? true), + observeChanges: access(props.observeChanges ?? true), + }), + ({ container, enabled, observeChanges }) => { + if (!container || !enabled) return; + + originalFocusedElement = document.activeElement as HTMLElement | null; + loadFocusableElements(container); + triggerInitialFocus(container); + + const observer = new MutationObserver(() => { + afterPaint(() => { + loadFocusableElements(container); + if (!document.activeElement || document.activeElement === document.body) { + triggerInitialFocus(container); + } + }); + }); + + if (observeChanges) { + observer.observe(container, { + subtree: true, + childList: true, + attributes: true, + attributeFilter: ["tabindex"], + }); + } + + return () => { + if (observeChanges) observer.disconnect(); + setFocusableElements(undefined); + triggerRestoreFocus(container); + }; + }, + ); + + // When there are no focusable elements, block all Tab key presses. + createEffect( + () => focusableElements(), + elements => { + if (!elements || elements.length !== 0) return; + document.addEventListener("keydown", preventTab); + return () => document.removeEventListener("keydown", preventTab); + }, + ); + + // Shift+Tab on the first element → wrap to last. + createEffect( + () => firstFocusElement(), + el => { + if (!el) return; + el.addEventListener("keydown", onFirstElementKeyDown); + return () => el.removeEventListener("keydown", onFirstElementKeyDown); + }, + ); + + // Tab on the last element → wrap to first. + createEffect( + () => lastFocusElement(), + el => { + if (!el) return; + el.addEventListener("keydown", onLastElementKeyDown); + return () => el.removeEventListener("keydown", onLastElementKeyDown); + }, + ); +}; diff --git a/packages/focus/src/index.ts b/packages/focus/src/index.ts new file mode 100644 index 000000000..678243b0b --- /dev/null +++ b/packages/focus/src/index.ts @@ -0,0 +1,5 @@ +export { autofocus, createAutofocus } from "./autofocus.js"; +export type { E } from "./autofocus.js"; +export { createFocusTrap } from "./focusTrap.js"; +export type { CreateFocusTrapProps } from "./focusTrap.js"; +export { makeFocusListener, createFocusSignal } from "./focusSignal.js"; diff --git a/packages/focus/test/index.test.tsx b/packages/focus/test/index.test.tsx new file mode 100644 index 000000000..d1c8aa578 --- /dev/null +++ b/packages/focus/test/index.test.tsx @@ -0,0 +1,438 @@ +import { describe, test, expect, vi, beforeEach, afterAll, beforeAll } from "vitest"; +import { createRoot, createSignal, flush } from "solid-js"; +import { autofocus, createAutofocus, createFocusTrap } from "../src/index.js"; + +// ─── Shared focus tracking ──────────────────────────────────────────────────── + +let focused: HTMLElement | null = null; + +const original_focus = HTMLElement.prototype.focus; +HTMLElement.prototype.focus = function (this: HTMLElement) { + focused = this; +}; + +// ─── Fake timers + rAF stub ─────────────────────────────────────────────────── + +beforeAll(() => { + vi.useFakeTimers(); + // afterPaint uses double rAF; stub it as setTimeout so vi.runAllTimers() drives it. + vi.stubGlobal("requestAnimationFrame", (fn: FrameRequestCallback) => + setTimeout(() => fn(performance.now()), 0), + ); + vi.stubGlobal("cancelAnimationFrame", (id: number) => clearTimeout(id)); +}); + +beforeEach(() => { + vi.clearAllTimers(); + focused = null; +}); + +afterAll(() => { + vi.useRealTimers(); + vi.unstubAllGlobals(); + HTMLElement.prototype.focus = original_focus; +}); + +// ─── Helper ─────────────────────────────────────────────────────────────────── + +/** Run all pending effects then drain all timers (including nested rAFs). */ +const settle = () => { + flush(); + vi.runAllTimers(); +}; + +// ─── autofocus ──────────────────────────────────────────────────────────────── + +describe("autofocus", () => { + test("focuses the element with autofocus attribute", () => { + const el = document.createElement("button"); + el.setAttribute("autofocus", ""); + + const dispose = createRoot(dispose => { + const ref = autofocus(); + ref(el); + return dispose; + }); + + settle(); + expect(focused).toBe(el); + dispose(); + }); + + test("doesn't focus when autofocus attribute is absent", () => { + const el = document.createElement("button"); + + const dispose = createRoot(dispose => { + const ref = autofocus(); + ref(el); + return dispose; + }); + + settle(); + expect(focused).toBe(null); + dispose(); + }); +}); + +// ─── createAutofocus ────────────────────────────────────────────────────────── + +describe("createAutofocus", () => { + const el = document.createElement("button"), + el2 = document.createElement("button"); + + test("focuses the element", () => { + const dispose = createRoot(dispose => { + createAutofocus(() => el); + return dispose; + }); + + settle(); + expect(focused).toBe(el); + dispose(); + }); + + test("works with signal — focuses when signal is set", () => { + const [ref, setRef] = createSignal(); + + const dispose = createRoot(dispose => { + createAutofocus(ref); + return dispose; + }); + + settle(); + expect(focused).toBe(null); + + setRef(el); + settle(); + expect(focused).toBe(el); + + setRef(el2); + settle(); + expect(focused).toBe(el2); + + dispose(); + + setRef(el); + vi.runAllTimers(); + expect(focused).toBe(el2); // no focus after dispose + }); +}); + +// ─── createFocusTrap ────────────────────────────────────────────────────────── + +/** Build a container with `n` focusable buttons and return them. */ +function makeContainer(n: number): { container: HTMLElement; buttons: HTMLButtonElement[] } { + const container = document.createElement("div"); + const buttons: HTMLButtonElement[] = []; + for (let i = 0; i < n; i++) { + const btn = document.createElement("button"); + btn.textContent = `btn${i}`; + container.appendChild(btn); + buttons.push(btn); + } + return { container, buttons }; +} + +function tabKey(shiftKey = false) { + return new KeyboardEvent("keydown", { key: "Tab", shiftKey, bubbles: true, cancelable: true }); +} + +describe("createFocusTrap", () => { + test("focuses the first focusable element on activation", () => { + const { container, buttons } = makeContainer(3); + + const dispose = createRoot(dispose => { + createFocusTrap({ element: container }); + return dispose; + }); + + settle(); + expect(focused).toBe(buttons[0]); + dispose(); + }); + + test("Tab on last element wraps to first", () => { + const { container, buttons } = makeContainer(3); + + const dispose = createRoot(dispose => { + createFocusTrap({ element: container }); + return dispose; + }); + + settle(); + buttons[2]!.dispatchEvent(tabKey(false)); + expect(focused).toBe(buttons[0]); + dispose(); + }); + + test("Shift+Tab on first element wraps to last", () => { + const { container, buttons } = makeContainer(3); + + const dispose = createRoot(dispose => { + createFocusTrap({ element: container }); + return dispose; + }); + + settle(); + buttons[0]!.dispatchEvent(tabKey(true)); + expect(focused).toBe(buttons[2]); + dispose(); + }); + + test("blocks Tab when there are no focusable elements", () => { + const container = document.createElement("div"); // no children + + let tabPrevented = false; + const dispose = createRoot(dispose => { + createFocusTrap({ element: container }); + return dispose; + }); + + flush(); // run effects so preventTab listener is added + + const event = tabKey(); + Object.defineProperty(event, "defaultPrevented", { get: () => tabPrevented }); + const originalPreventDefault = event.preventDefault.bind(event); + event.preventDefault = () => { + tabPrevented = true; + originalPreventDefault(); + }; + + document.dispatchEvent(event); + expect(tabPrevented).toBe(true); + dispose(); + }); + + test("does not activate when enabled is false", () => { + const { container } = makeContainer(2); + + const dispose = createRoot(dispose => { + createFocusTrap({ element: container, enabled: false }); + return dispose; + }); + + settle(); + expect(focused).toBe(null); + dispose(); + }); + + test("activates and deactivates reactively via enabled signal", () => { + const { container, buttons } = makeContainer(2); + const [enabled, setEnabled] = createSignal(false); + + const dispose = createRoot(dispose => { + createFocusTrap({ element: container, enabled }); + return dispose; + }); + + settle(); + expect(focused).toBe(null); // not yet enabled + + setEnabled(true); + settle(); + expect(focused).toBe(buttons[0]); // initial focus + + dispose(); + }); + + test("restores focus to the previously focused element on deactivation", () => { + const { container, buttons } = makeContainer(2); + const trigger = document.createElement("button"); + const [enabled, setEnabled] = createSignal(true); + + // Pretend `trigger` is the element that was focused before the trap. + const origActiveElement = Object.getOwnPropertyDescriptor(Document.prototype, "activeElement")!; + Object.defineProperty(document, "activeElement", { + get: () => trigger, + configurable: true, + }); + + const dispose = createRoot(dispose => { + createFocusTrap({ element: container, enabled }); + return dispose; + }); + + settle(); + expect(focused).toBe(buttons[0]); // initial focus inside trap + + // Restore the real activeElement descriptor before deactivating + Object.defineProperty(document, "activeElement", origActiveElement); + + setEnabled(false); + settle(); + expect(focused).toBe(trigger); // focus restored + dispose(); + }); + + test("uses initialFocusElement when provided", () => { + const { container, buttons } = makeContainer(3); + + const dispose = createRoot(dispose => { + createFocusTrap({ element: container, initialFocusElement: buttons[2] }); + return dispose; + }); + + settle(); + expect(focused).toBe(buttons[2]); + dispose(); + }); + + test("uses finalFocusElement when provided on deactivation", () => { + const { container } = makeContainer(2); + const customFinal = document.createElement("button"); + const [enabled, setEnabled] = createSignal(true); + + const dispose = createRoot(dispose => { + createFocusTrap({ element: container, enabled, finalFocusElement: customFinal }); + return dispose; + }); + + settle(); + + setEnabled(false); + settle(); + expect(focused).toBe(customFinal); + dispose(); + }); + + test("onInitialFocus callback is called when trap activates", () => { + const { container } = makeContainer(1); + const onInitialFocus = vi.fn(); + + const dispose = createRoot(dispose => { + createFocusTrap({ element: container, onInitialFocus }); + return dispose; + }); + + settle(); + expect(onInitialFocus).toHaveBeenCalledOnce(); + dispose(); + }); + + test("onInitialFocus preventDefault suppresses initial focus", () => { + const { container } = makeContainer(1); + + const dispose = createRoot(dispose => { + createFocusTrap({ + element: container, + onInitialFocus: e => e.preventDefault(), + }); + return dispose; + }); + + settle(); + expect(focused).toBe(null); + dispose(); + }); + + test("onFinalFocus callback is called on deactivation", () => { + const { container } = makeContainer(1); + const [enabled, setEnabled] = createSignal(true); + const onFinalFocus = vi.fn(); + + const dispose = createRoot(dispose => { + createFocusTrap({ element: container, enabled, onFinalFocus }); + return dispose; + }); + + settle(); + setEnabled(false); + settle(); + expect(onFinalFocus).toHaveBeenCalledOnce(); + dispose(); + }); + + test("onFinalFocus preventDefault suppresses focus restore", () => { + const { container } = makeContainer(1); + const trigger = document.createElement("button"); + const [enabled, setEnabled] = createSignal(true); + + const origActiveElement = Object.getOwnPropertyDescriptor(Document.prototype, "activeElement")!; + Object.defineProperty(document, "activeElement", { + get: () => trigger, + configurable: true, + }); + + const dispose = createRoot(dispose => { + createFocusTrap({ + element: container, + enabled, + onFinalFocus: e => e.preventDefault(), + }); + return dispose; + }); + + settle(); + Object.defineProperty(document, "activeElement", origActiveElement); + + focused = null; + setEnabled(false); + settle(); + expect(focused).toBe(null); // prevented + dispose(); + }); + + test("does not restore focus when restoreFocus is false", () => { + const { container } = makeContainer(1); + const [enabled, setEnabled] = createSignal(true); + + const dispose = createRoot(dispose => { + createFocusTrap({ element: container, enabled, restoreFocus: false }); + return dispose; + }); + + settle(); + focused = null; + setEnabled(false); + settle(); + expect(focused).toBe(null); + dispose(); + }); + + test("respects tabIndex ordering for focusable elements", () => { + const container = document.createElement("div"); + const a = document.createElement("button"); // tabIndex 0 + const b = document.createElement("button"); + b.tabIndex = 2; + const c = document.createElement("button"); + c.tabIndex = 1; + // DOM order: a(0), b(2), c(1) → sorted: a(0), c(1), b(2) + container.append(a, b, c); + + const dispose = createRoot(dispose => { + createFocusTrap({ element: container }); + return dispose; + }); + + settle(); + expect(focused).toBe(a); // first by tabIndex order + + // Tab on last (b, tabIndex=2) wraps to first (a, tabIndex=0) + b.dispatchEvent(tabKey(false)); + expect(focused).toBe(a); + + // Shift+Tab on first (a) wraps to last (b) + a.dispatchEvent(tabKey(true)); + expect(focused).toBe(b); + + dispose(); + }); + + test("element as reactive signal — activates when signal becomes non-null", () => { + const { container, buttons } = makeContainer(2); + const [el, setEl] = createSignal(null); + + const dispose = createRoot(dispose => { + createFocusTrap({ element: el }); + return dispose; + }); + + settle(); + expect(focused).toBe(null); + + setEl(container); + settle(); + expect(focused).toBe(buttons[0]); + dispose(); + }); +}); diff --git a/packages/autofocus/test/server.test.ts b/packages/focus/test/server.test.ts similarity index 55% rename from packages/autofocus/test/server.test.ts rename to packages/focus/test/server.test.ts index d8c2b5f8b..9b4ae4800 100644 --- a/packages/autofocus/test/server.test.ts +++ b/packages/focus/test/server.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest"; import { createRoot } from "solid-js"; -import { createAutofocus } from "../src/index.js"; +import { createAutofocus, createFocusTrap } from "../src/index.js"; describe("API doesn't break in SSR", () => { it("createAutofocus() - SSR", () => { @@ -9,4 +9,11 @@ describe("API doesn't break in SSR", () => { dispose(); }); }); + + it("createFocusTrap() - SSR", () => { + createRoot(dispose => { + expect(() => createFocusTrap({ element: null })).not.toThrow(); + dispose(); + }); + }); }); diff --git a/packages/autofocus/tsconfig.json b/packages/focus/tsconfig.json similarity index 82% rename from packages/autofocus/tsconfig.json rename to packages/focus/tsconfig.json index dc1970e16..b9b2b6782 100644 --- a/packages/autofocus/tsconfig.json +++ b/packages/focus/tsconfig.json @@ -6,6 +6,9 @@ "rootDir": "src" }, "references": [ + { + "path": "../event-listener" + }, { "path": "../utils" } diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index c13ddf0ca..3d00f01d9 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -321,6 +321,16 @@ export function handleDiffArray( } } +/** + * Schedules `fn` to run after the browser has painted by nesting two + * requestAnimationFrame calls. No-op in non-browser environments. + */ +export const afterPaint = (fn: () => void): void => { + if (typeof requestAnimationFrame === "function") { + requestAnimationFrame(() => requestAnimationFrame(fn)); + } +}; + // ─── String transforms ──────────────────────────────────────────────────────── /** diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ee1923c5f..e9335f9cc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: devDependencies: '@babel/core': specifier: ^7.27.0 - version: 7.27.4 + version: 7.29.0 '@changesets/cli': specifier: ^2.29.4 version: 2.29.4 @@ -34,7 +34,7 @@ importers: version: 8.34.0(eslint@9.28.0(jiti@1.21.7))(typescript@5.8.3) babel-preset-solid: specifier: 2.0.0-beta.14 - version: 2.0.0-beta.14(@babel/core@7.27.4)(solid-js@2.0.0-beta.14) + version: 2.0.0-beta.14(@babel/core@7.29.0)(solid-js@2.0.0-beta.14) esbuild: specifier: ^0.25.5 version: 0.25.5 @@ -82,10 +82,10 @@ importers: version: 5.8.3 vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) + version: 6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0) vite-plugin-solid: specifier: 3.0.0-next.5 - version: 3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + version: 3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0)) vitest: specifier: ^2.1.9 version: 2.1.9(@types/node@22.15.31)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.77.8) @@ -99,9 +99,12 @@ importers: specifier: workspace:^ version: link:../utils devDependencies: + '@solidjs/web': + specifier: 2.0.0-beta.12 + version: 2.0.0-beta.12(solid-js@2.0.0-beta.12) solid-js: - specifier: ^1.9.7 - version: 1.9.7 + specifier: 2.0.0-beta.12 + version: 2.0.0-beta.12 packages/analytics: devDependencies: @@ -125,19 +128,6 @@ importers: specifier: 2.0.0-beta.14 version: 2.0.0-beta.14 - packages/autofocus: - dependencies: - '@solid-primitives/utils': - specifier: workspace:^ - version: link:../utils - devDependencies: - '@solidjs/web': - specifier: 2.0.0-beta.14 - version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) - solid-js: - specifier: 2.0.0-beta.14 - version: 2.0.0-beta.14 - packages/bounds: dependencies: '@solid-primitives/event-listener': @@ -364,6 +354,22 @@ importers: specifier: ^1.9.7 version: 1.9.7 + packages/focus: + dependencies: + '@solid-primitives/event-listener': + specifier: workspace:^ + version: link:../event-listener + '@solid-primitives/utils': + specifier: workspace:^ + version: link:../utils + devDependencies: + '@solidjs/web': + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) + solid-js: + specifier: 2.0.0-beta.14 + version: 2.0.0-beta.14 + packages/fullscreen: dependencies: '@solid-primitives/utils': @@ -1110,13 +1116,13 @@ importers: devDependencies: '@babel/core': specifier: ^7.27.0 - version: 7.27.4 + version: 7.29.0 '@solidjs/web': specifier: 2.0.0-beta.14 version: 2.0.0-beta.14(solid-js@2.0.0-beta.14) babel-preset-solid: specifier: 2.0.0-beta.14 - version: 2.0.0-beta.14(@babel/core@7.27.4)(solid-js@2.0.0-beta.14) + version: 2.0.0-beta.14(@babel/core@7.29.0)(solid-js@2.0.0-beta.14) solid-js: specifier: 2.0.0-beta.14 version: 2.0.0-beta.14 @@ -1194,7 +1200,7 @@ importers: version: 2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14) '@tanstack/solid-start': specifier: ^2.0.0-beta.17 - version: 2.0.0-beta.18(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + version: 2.0.0-beta.18(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.28.0)(jiti@1.21.7)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0)))(vite@8.0.10(@types/node@22.15.31)(esbuild@0.28.0)(jiti@1.21.7)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0)) clsx: specifier: ^2.0.0 version: 2.1.1 @@ -1243,7 +1249,7 @@ importers: version: 8.5.5 react: specifier: ^19.2.5 - version: 19.2.6 + version: 19.2.5 tailwindcss: specifier: 3.3.3 version: 3.3.3 @@ -1252,10 +1258,10 @@ importers: version: 4.0.0 vite: specifier: ^8.0.8 - version: 8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) + version: 8.0.10(@types/node@22.15.31)(esbuild@0.28.0)(jiti@1.21.7)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0) vite-plugin-solid: specifier: 3.0.0-next.5 - version: 3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + version: 3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.28.0)(jiti@1.21.7)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0)) packages: @@ -1263,10 +1269,6 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - '@ardatan/relay-compiler@12.0.0': resolution: {integrity: sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q==} hasBin: true @@ -1288,18 +1290,10 @@ packages: resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.27.5': - resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} - engines: {node: '>=6.9.0'} - '@babel/compat-data@7.29.3': resolution: {integrity: sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==} engines: {node: '>=6.9.0'} - '@babel/core@7.27.4': - resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} - engines: {node: '>=6.9.0'} - '@babel/core@7.29.0': resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} engines: {node: '>=6.9.0'} @@ -1316,10 +1310,6 @@ packages: resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.27.2': - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} - engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.28.6': resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} engines: {node: '>=6.9.0'} @@ -1342,20 +1332,10 @@ packages: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.27.1': - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} - engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.28.6': resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.27.3': - resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-module-transforms@7.28.6': resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} engines: {node: '>=6.9.0'} @@ -1370,10 +1350,6 @@ packages: resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.28.6': - resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} - engines: {node: '>=6.9.0'} - '@babel/helper-replace-supers@7.27.1': resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} engines: {node: '>=6.9.0'} @@ -1400,10 +1376,6 @@ packages: resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.27.6': - resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} - engines: {node: '>=6.9.0'} - '@babel/helpers@7.29.2': resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} engines: {node: '>=6.9.0'} @@ -1455,12 +1427,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.28.6': - resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-object-rest-spread@7.8.3': resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: @@ -1616,10 +1582,6 @@ packages: resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.27.4': - resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} - engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.0': resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} @@ -1736,6 +1698,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.28.0': + resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} @@ -1748,6 +1716,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.28.0': + resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} @@ -1760,6 +1734,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.28.0': + resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} @@ -1772,6 +1752,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.28.0': + resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} @@ -1784,6 +1770,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.28.0': + resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} @@ -1796,6 +1788,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.28.0': + resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} @@ -1808,6 +1806,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.28.0': + resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} @@ -1820,6 +1824,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.28.0': + resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} @@ -1832,6 +1842,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.28.0': + resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} @@ -1844,6 +1860,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.28.0': + resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} @@ -1856,6 +1878,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.28.0': + resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} @@ -1868,6 +1896,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.28.0': + resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} @@ -1880,6 +1914,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.28.0': + resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} @@ -1892,6 +1932,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.28.0': + resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} @@ -1904,6 +1950,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.28.0': + resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} @@ -1916,6 +1968,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.28.0': + resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} @@ -1928,12 +1986,24 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.28.0': + resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.5': resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.28.0': + resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} @@ -1946,12 +2016,24 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.28.0': + resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.25.5': resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.28.0': + resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} @@ -1964,6 +2046,18 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.28.0': + resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.28.0': + resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} @@ -1976,6 +2070,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.28.0': + resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} @@ -1988,6 +2088,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.28.0': + resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} @@ -2000,6 +2106,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.28.0': + resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} @@ -2012,6 +2124,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.28.0': + resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.7.0': resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2325,6 +2443,9 @@ packages: '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -2381,8 +2502,8 @@ packages: resolution: {integrity: sha512-hAX0pT/73190NLqBPPWSdBVGtbY6VOhWYK3qqHqtXQ1gK7kS2yz4+ivsN07hpJ6I3aeMtKP6J6npsEKOAzuTLA==} engines: {node: '>=20.0'} - '@oxc-project/types@0.130.0': - resolution: {integrity: sha512-ibD2usx9JRu7f5pu2tMKMI4cpA4NgXJQoYRP4pQ7Pxmn1l6k/53qWtQWZayhYy3X4QZkt90Ot+mJEaeXouio6Q==} + '@oxc-project/types@0.127.0': + resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} '@peculiar/asn1-schema@2.3.13': resolution: {integrity: sha512-3Xq3a01WkHRZL8X04Zsfg//mGaA21xlL4tlVn4v2xGT0JStiztATRkMwa5b+f/HXmY2smsiLXYK46Gwgzvfg3g==} @@ -2413,97 +2534,97 @@ packages: '@repeaterjs/repeater@3.0.6': resolution: {integrity: sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==} - '@rolldown/binding-android-arm64@1.0.1': - resolution: {integrity: sha512-fJI3I0r3C3Oj/zdBCpaCmBRZYf07xpaq4yCfDDoSFm+beWNzbIl26puW8RraUdugoJw/95zerNOn6jasAhzSmg==} + '@rolldown/binding-android-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.1': - resolution: {integrity: sha512-cKnAhWEsV7TPcA/5EAteDp6KcJZBQ2G+BqE7zayMMi7kMvwRsbv7WT9aOnn0WNl4SKEIf43vjS31iUPu80nzXg==} + '@rolldown/binding-darwin-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.1': - resolution: {integrity: sha512-YKrVwQjIRBPo+5G/u03wGjbdy4q7pyzCe93DK9VJ7zkVmeg8LJ7GbgsiHWdR4xSoe4CAXRD7Bcjgbtr64bkXNg==} + '@rolldown/binding-darwin-x64@1.0.0-rc.17': + resolution: {integrity: sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.1': - resolution: {integrity: sha512-z/oBsREo46SsFqBwYtFe0kpJeBijAT48O/WXLI4suiCLBkr03RTtTJMCzSdDd2znlh8VJizL09XVkQgk8IZonw==} + '@rolldown/binding-freebsd-x64@1.0.0-rc.17': + resolution: {integrity: sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.1': - resolution: {integrity: sha512-ik8q7GM11zxvYxFc2PeDcT6TBvhCQMaUxfph/M5l9sKuTs/Sjg3L+Byw0F7w0ZVLBZmx30P+gG0ECzzN+MFcmQ==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': + resolution: {integrity: sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.1': - resolution: {integrity: sha512-QoSx2EkyrrdZ6kcyE8stqZ62t0Yra8Fs5ia9lOxJrh6TMQJK7gQKmscdTHf7pOXKREKrVwOtJcQG3qVSfc866A==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.1': - resolution: {integrity: sha512-uwNwFpwKeNiZawfAWBgg0VIztPTV3ihhh1vV334h9ivnNLorxnQMU6Fz8wG1Zb4Qh9LC1/MkcyT3YlDXG3Rsgg==} + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': + resolution: {integrity: sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.0.1': - resolution: {integrity: sha512-zY1bul7OWr7DFBiJ++wofXvnr8B45ce3QsQUhKrIhXsygAh7bTkwyeM1bi1a2g5C/yC/N8TZyGDEoMfm/l9mpg==} + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.0.1': - resolution: {integrity: sha512-0frlsT/f4Ft6I7SMESTKnF3cZsdicQn1dCMkF/jT9wDLE+gGoiQfv1nmT9e+s7s/fekvvy6tZM2jHvI2tkbJDQ==} + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.1': - resolution: {integrity: sha512-XABVmGp9Tg0WspTVvwduTc4fpqy6JnAUrSQe6OuyqD/03nI7r0O9OWUkMIwFrjKAIqolvqoA4ZrJppgwE0Gxmw==} + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.1': - resolution: {integrity: sha512-bV4fzswuzVcKD90o/VM6QqKxnxlDq0g2BISDLNVmxrnhpv1DDbyPhCIjYfvzYLV+MvkKKnQt2Q6AO86SEBULUQ==} + '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': + resolution: {integrity: sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.1': - resolution: {integrity: sha512-/Mh0Zhq3OP7fVs0kcQHZP6lZEthMGTaSf8UBQYSFEZDWGXXlEC+nJ6EqenaK2t4LBXMe3A+K/G2BVXXdtOr4PQ==} + '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.1': - resolution: {integrity: sha512-+1xc9X45l8ufsBAm6Gjvx2qDRIY9lTVt0cgWNcJ+1gdhXvkbxePA60yRTwSTuXL09CMhyJmjpV7E3NoyxbqFQQ==} + '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': + resolution: {integrity: sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.1': - resolution: {integrity: sha512-1D+UqZdfnuR+Jy1GgMJwi85bD40H21uNmOPRWQhw4oRSuolZ/B5rixZ45DK2KXOTCvmVCecauWgEhbw8bI7tOw==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': + resolution: {integrity: sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.1': - resolution: {integrity: sha512-INAycaWuhlOK3wk4mRHGsdgwYWmd9cChdPdE9bwWmy6rn9VqVNYNFGhOdXrofXUxwHIncSiPNb8tNm8knDVIeQ==} + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': + resolution: {integrity: sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -2511,8 +2632,8 @@ packages: '@rolldown/pluginutils@1.0.0-beta.40': resolution: {integrity: sha512-s3GeJKSQOwBlzdUrj4ISjJj5SfSh+aqn0wjOar4Bx95iV1ETI7F6S/5hLcfAxZ9kXDcyrAkxPlqmd1ZITttf+w==} - '@rolldown/pluginutils@1.0.1': - resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + '@rolldown/pluginutils@1.0.0-rc.17': + resolution: {integrity: sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==} '@rollup/rollup-android-arm-eabi@4.43.0': resolution: {integrity: sha512-Krjy9awJl6rKbruhQDgivNbD1WuLb8xAclM4IR4cN5pHGAs2oIMMQJEiC3IC/9TZJ+QZkmZhlMO/6MBGxPidpw==} @@ -2719,9 +2840,17 @@ packages: peerDependencies: solid-js: '>=1.8.4' + '@solidjs/signals@2.0.0-beta.13': + resolution: {integrity: sha512-jc+wLRK+eyUFerH8Mjed4HikdJwz3z95TT7tqyG+K00IV9jfgZWvR1nZDUEZc6kXffmtW/z+w6PNn62ea5KjIw==} + '@solidjs/signals@2.0.0-beta.14': resolution: {integrity: sha512-y72nYtD7ogwX/UR5g2Y+meyeO6Q/xbQGtmvVTQX6USkMwEGOMnytqDnHj5amUzD7Fzqg32svwtCSx/q8hsOXAA==} + '@solidjs/web@2.0.0-beta.12': + resolution: {integrity: sha512-Wc+/LctUqfNQs98VnijoEu4gWFOSu/kUcZiBIjQ+S9ZUuT6Z77CRkmiZ0C8dyOhNPbTgpU2JYH6B5wqY2eqS0A==} + peerDependencies: + solid-js: ^2.0.0-beta.12 + '@solidjs/web@2.0.0-beta.13': resolution: {integrity: sha512-ugSnWcNc18osJZ24+op7mQpm6LlyHSgTnvSaYqEwL9PVmLxXpmAS7/dt5nc7MLLZtwgf1J1rmRfZb7mT8fTL2w==} peerDependencies: @@ -2873,8 +3002,8 @@ packages: '@tauri-apps/plugin-store@2.0.0': resolution: {integrity: sha512-l4xsbxAXrKGdBdYNNswrLfcRv3v1kOatdycOcVPYW+jKwkznCr1HEOrPXkPhXsZLSLyYmNXpgfOmdSZNmcykDg==} - '@tybys/wasm-util@0.10.2': - resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -3184,8 +3313,8 @@ packages: babel-dead-code-elimination@1.0.12: resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==} - babel-plugin-jsx-dom-expressions@0.40.7: - resolution: {integrity: sha512-/O6JWUmjv03OI9lL2ry9bUjpD5S3PclM55RRJEyCdcFZ5W2SEA/59d+l2hNsk3gI6kiWRdRPdOtqZmsQzFN1pQ==} + babel-plugin-jsx-dom-expressions@0.39.8: + resolution: {integrity: sha512-/MVOIIjonylDXnrWmG23ZX82m9mtKATsVHB7zYlPfDR9Vdd/NBE48if+wv27bSkBtyO7EPMUlcUc4J63QwuACQ==} peerDependencies: '@babel/core': ^7.20.12 @@ -3207,14 +3336,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - babel-preset-solid@1.9.12: - resolution: {integrity: sha512-LLqnuKVDlKpyBlMPcH6qEvs/wmS9a+NczppxJ3ryS/c0O5IiSFOIBQi9GzyiGDSbcJpx4Gr87jyFTos1MyEuWg==} + babel-preset-solid@1.9.6: + resolution: {integrity: sha512-HXTK9f93QxoH8dYn1M2mJdOlWgMsR88Lg/ul6QCZGkNTktjTE5HAf93YxQumHoCudLEtZrU1cFCMFOVho6GqFg==} peerDependencies: '@babel/core': ^7.0.0 - solid-js: ^1.9.12 - peerDependenciesMeta: - solid-js: - optional: true babel-preset-solid@2.0.0-beta.13: resolution: {integrity: sha512-VX5fa4b6Sn92v+vFw3ITEvDv0f5vZZZhGgGcqYaAzjP7RF45+VZcZBoG0pHwCGA7UfXdYLUQuqXb4tG1uV3cQA==} @@ -3696,6 +3821,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.28.0: + resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -3929,9 +4059,6 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-tsconfig@4.10.1: - resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} - github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -4226,8 +4353,8 @@ packages: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} - isbot@5.1.40: - resolution: {integrity: sha512-yNeeynhhtIVRBk12tBV4eHNxwB42HzR4Q3Ea7vCOiJhImGaAIdIMrbJtacQlBizGLjUPw+akkFI5Dn9T70XoVQ==} + isbot@5.1.39: + resolution: {integrity: sha512-obH0yYahGXdzNxo+djmHhBYThUKDkz565cxkIlt2L9hXfv1NlaLKoDBHo6KxXsYrIXx2RK3x5vY36CfZcobxEw==} engines: {node: '>=18'} isexe@2.0.0: @@ -4972,8 +5099,8 @@ packages: resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} engines: {node: '>=6.0.0'} - postcss@8.5.14: - resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} + postcss@8.5.13: + resolution: {integrity: sha512-qif0+jGGZoLWdHey3UFHHWP0H7Gbmsk8T5VEqyYFbWqPr1XqvLGBbk/sl8V5exGmcYJklJOhOQq1pV9IcsiFag==} engines: {node: ^10 || ^12 || >=14} postcss@8.5.5: @@ -5083,8 +5210,8 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - react@19.2.6: - resolution: {integrity: sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==} + react@19.2.5: + resolution: {integrity: sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==} engines: {node: '>=0.10.0'} read-cache@1.0.0: @@ -5178,9 +5305,6 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.10: resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} engines: {node: '>= 0.4'} @@ -5197,8 +5321,8 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rolldown@1.0.1: - resolution: {integrity: sha512-X0KQHljNnEkWNqqiz9zJrGunh1B0HgOxLXvnFpCOcadzcy5qohZ3tqMEUg00vncoRovXuK3ZqCT9KnnKzoInFQ==} + rolldown@1.0.0-rc.17: + resolution: {integrity: sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -5268,12 +5392,6 @@ packages: peerDependencies: seroval: ^1.0 - seroval-plugins@1.5.4: - resolution: {integrity: sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw==} - engines: {node: '>=10'} - peerDependencies: - seroval: ^1.0 - seroval@1.3.2: resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} engines: {node: '>=10'} @@ -5282,10 +5400,6 @@ packages: resolution: {integrity: sha512-xcRN39BdsnO9Tf+VzsE7b3JyTJASItIV1FVFewJKCFcW4s4haIKS3e6vj8PGB9qBwC7tnuOywQMdv5N4qkzi7Q==} engines: {node: '>=10'} - seroval@1.5.4: - resolution: {integrity: sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw==} - engines: {node: '>=10'} - set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -5341,6 +5455,9 @@ packages: solid-js@1.9.7: resolution: {integrity: sha512-/saTKi8iWEM233n5OSi1YHCCuh66ZIQ7aK2hsToPe4tqGm7qAejU1SwNuTPivbWAYq7SjuHVVYxxuZQNRbICiw==} + solid-js@2.0.0-beta.12: + resolution: {integrity: sha512-UJC4gc0Dgbm6BTBFhUdrfIEXiQ/jaQuUGxYfZnEkywwD5FX16MhlM/e6bq2+94mhXUExYI9VJoGBh7CpOZ/1XA==} + solid-js@2.0.0-beta.14: resolution: {integrity: sha512-gbbvlxhs1GgL1IsnwHNtkTCRBBQcIDMwznBw3T05iYvP+fuUKMyIPku+ZLjeALyX4RaSLR99JSL6NttyHsYb8Q==} @@ -5563,8 +5680,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.20.2: - resolution: {integrity: sha512-He0ZWr41gLa4vD30Au3yuwpe0HXaCZbclvl8RBieUiJ9aFnPMWUPIyvw3RU8+1Crjfcrauvitae2a4tUzRAGsw==} + tsx@4.22.3: + resolution: {integrity: sha512-mdoNxBC/cSQObGGVQ5Bpn5i+yv7j68gk3Nfm3wFjcJg3Z0Mix9jzAFfP12prmm5eVGmDKtp0yyArrs0Q+8gZHg==} engines: {node: '>=18.0.0'} hasBin: true @@ -5663,8 +5780,8 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - validate-html-nesting@1.2.4: - resolution: {integrity: sha512-doQi7e8EJ2OWneSG1aZpJluS6A49aZM0+EICXWKm1i6WvqTLmq0tpUcImc4KTWG50mORO0C4YDBtOCSYvElftw==} + validate-html-nesting@1.2.2: + resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} value-or-promise@1.0.12: resolution: {integrity: sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==} @@ -5763,13 +5880,13 @@ packages: yaml: optional: true - vite@8.0.13: - resolution: {integrity: sha512-MFtjBYgzmSxmgA4RAfjIyXWpGe1oALnjgUTzzV7QLx/TKxCzjtMH6Fd9/eVK+5Fg1qNoz5VAwsmMs/NofrmJvw==} + vite@8.0.10: + resolution: {integrity: sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.1.18 + '@vitejs/devtools': ^0.1.0 esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 @@ -5986,11 +6103,6 @@ snapshots: '@alloc/quick-lru@5.2.0': {} - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - '@ardatan/relay-compiler@12.0.0(graphql@16.9.0)': dependencies: '@babel/core': 7.29.0 @@ -6041,30 +6153,8 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.27.5': {} - '@babel/compat-data@7.29.3': {} - '@babel/core@7.27.4': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) - '@babel/helpers': 7.27.6 - '@babel/parser': 7.27.5 - '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 - convert-source-map: 2.0.0 - debug: 4.4.1 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/core@7.29.0': dependencies: '@babel/code-frame': 7.29.0 @@ -6105,14 +6195,6 @@ snapshots: dependencies: '@babel/types': 7.29.0 - '@babel/helper-compilation-targets@7.27.2': - dependencies: - '@babel/compat-data': 7.27.5 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.0 - lru-cache: 5.1.1 - semver: 6.3.1 - '@babel/helper-compilation-targets@7.28.6': dependencies: '@babel/compat-data': 7.29.3 @@ -6121,19 +6203,6 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.27.1 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.29.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -6160,13 +6229,6 @@ snapshots: dependencies: '@babel/types': 7.29.0 - '@babel/helper-module-imports@7.27.1': - dependencies: - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 - transitivePeerDependencies: - - supports-color - '@babel/helper-module-imports@7.28.6': dependencies: '@babel/traverse': 7.29.0 @@ -6174,24 +6236,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.4 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.27.3(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.4 - transitivePeerDependencies: - - supports-color - '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -6207,17 +6251,6 @@ snapshots: '@babel/helper-plugin-utils@7.27.1': {} - '@babel/helper-plugin-utils@7.28.6': {} - - '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-member-expression-to-functions': 7.27.1 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - '@babel/helper-replace-supers@7.27.1(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -6242,11 +6275,6 @@ snapshots: '@babel/helper-validator-option@7.27.1': {} - '@babel/helpers@7.27.6': - dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.27.6 - '@babel/helpers@7.29.2': dependencies: '@babel/template': 7.28.6 @@ -6254,7 +6282,7 @@ snapshots: '@babel/parser@7.27.5': dependencies: - '@babel/types': 7.27.6 + '@babel/types': 7.29.0 '@babel/parser@7.29.3': dependencies: @@ -6264,7 +6292,7 @@ snapshots: dependencies: '@babel/core': 7.29.0 '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color @@ -6273,48 +6301,33 @@ snapshots: '@babel/compat-data': 7.29.3 '@babel/core': 7.29.0 '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.0) '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.29.0) '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-flow@7.24.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-import-assertions@7.24.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.29.0)': @@ -6325,24 +6338,24 @@ snapshots: '@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-block-scoping@7.25.0(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-classes@7.25.0(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-replace-supers': 7.27.1(@babel/core@7.29.0) '@babel/traverse': 7.29.0 globals: 11.12.0 @@ -6352,24 +6365,24 @@ snapshots: '@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.27.1 '@babel/template': 7.28.6 '@babel/plugin-transform-destructuring@7.24.8(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-flow-strip-types@7.25.2(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.29.0) '@babel/plugin-transform-for-of@7.24.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color @@ -6378,7 +6391,7 @@ snapshots: dependencies: '@babel/core': 7.29.0 '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.27.1 '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color @@ -6386,25 +6399,17 @@ snapshots: '@babel/plugin-transform-literals@7.25.2(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.29.0) + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color @@ -6412,7 +6417,7 @@ snapshots: '@babel/plugin-transform-object-super@7.24.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-replace-supers': 7.27.1(@babel/core@7.29.0) transitivePeerDependencies: - supports-color @@ -6420,25 +6425,25 @@ snapshots: '@babel/plugin-transform-parameters@7.24.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-react-display-name@7.24.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-module-imports': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -6446,12 +6451,12 @@ snapshots: '@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-spread@7.24.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color @@ -6459,27 +6464,27 @@ snapshots: '@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typescript@7.27.1(@babel/core@7.27.4)': + '@babel/plugin-transform-typescript@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.29.0) transitivePeerDependencies: - supports-color - '@babel/preset-typescript@7.27.1(@babel/core@7.27.4)': + '@babel/preset-typescript@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.29.0) transitivePeerDependencies: - supports-color @@ -6497,18 +6502,6 @@ snapshots: '@babel/parser': 7.29.3 '@babel/types': 7.29.0 - '@babel/traverse@7.27.4': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.5 - '@babel/template': 7.27.2 - '@babel/types': 7.27.6 - debug: 4.4.1 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - '@babel/traverse@7.29.0': dependencies: '@babel/code-frame': 7.29.0 @@ -6715,144 +6708,222 @@ snapshots: '@esbuild/aix-ppc64@0.25.5': optional: true + '@esbuild/aix-ppc64@0.28.0': + optional: true + '@esbuild/android-arm64@0.21.5': optional: true '@esbuild/android-arm64@0.25.5': optional: true + '@esbuild/android-arm64@0.28.0': + optional: true + '@esbuild/android-arm@0.21.5': optional: true '@esbuild/android-arm@0.25.5': optional: true + '@esbuild/android-arm@0.28.0': + optional: true + '@esbuild/android-x64@0.21.5': optional: true '@esbuild/android-x64@0.25.5': optional: true + '@esbuild/android-x64@0.28.0': + optional: true + '@esbuild/darwin-arm64@0.21.5': optional: true '@esbuild/darwin-arm64@0.25.5': optional: true + '@esbuild/darwin-arm64@0.28.0': + optional: true + '@esbuild/darwin-x64@0.21.5': optional: true '@esbuild/darwin-x64@0.25.5': optional: true + '@esbuild/darwin-x64@0.28.0': + optional: true + '@esbuild/freebsd-arm64@0.21.5': optional: true '@esbuild/freebsd-arm64@0.25.5': optional: true + '@esbuild/freebsd-arm64@0.28.0': + optional: true + '@esbuild/freebsd-x64@0.21.5': optional: true '@esbuild/freebsd-x64@0.25.5': optional: true + '@esbuild/freebsd-x64@0.28.0': + optional: true + '@esbuild/linux-arm64@0.21.5': optional: true '@esbuild/linux-arm64@0.25.5': optional: true + '@esbuild/linux-arm64@0.28.0': + optional: true + '@esbuild/linux-arm@0.21.5': optional: true '@esbuild/linux-arm@0.25.5': optional: true + '@esbuild/linux-arm@0.28.0': + optional: true + '@esbuild/linux-ia32@0.21.5': optional: true '@esbuild/linux-ia32@0.25.5': optional: true + '@esbuild/linux-ia32@0.28.0': + optional: true + '@esbuild/linux-loong64@0.21.5': optional: true '@esbuild/linux-loong64@0.25.5': optional: true + '@esbuild/linux-loong64@0.28.0': + optional: true + '@esbuild/linux-mips64el@0.21.5': optional: true '@esbuild/linux-mips64el@0.25.5': optional: true + '@esbuild/linux-mips64el@0.28.0': + optional: true + '@esbuild/linux-ppc64@0.21.5': optional: true '@esbuild/linux-ppc64@0.25.5': optional: true + '@esbuild/linux-ppc64@0.28.0': + optional: true + '@esbuild/linux-riscv64@0.21.5': optional: true '@esbuild/linux-riscv64@0.25.5': optional: true + '@esbuild/linux-riscv64@0.28.0': + optional: true + '@esbuild/linux-s390x@0.21.5': optional: true '@esbuild/linux-s390x@0.25.5': optional: true + '@esbuild/linux-s390x@0.28.0': + optional: true + '@esbuild/linux-x64@0.21.5': optional: true '@esbuild/linux-x64@0.25.5': optional: true + '@esbuild/linux-x64@0.28.0': + optional: true + '@esbuild/netbsd-arm64@0.25.5': optional: true + '@esbuild/netbsd-arm64@0.28.0': + optional: true + '@esbuild/netbsd-x64@0.21.5': optional: true '@esbuild/netbsd-x64@0.25.5': optional: true + '@esbuild/netbsd-x64@0.28.0': + optional: true + '@esbuild/openbsd-arm64@0.25.5': optional: true + '@esbuild/openbsd-arm64@0.28.0': + optional: true + '@esbuild/openbsd-x64@0.21.5': optional: true '@esbuild/openbsd-x64@0.25.5': optional: true + '@esbuild/openbsd-x64@0.28.0': + optional: true + + '@esbuild/openharmony-arm64@0.28.0': + optional: true + '@esbuild/sunos-x64@0.21.5': optional: true '@esbuild/sunos-x64@0.25.5': optional: true + '@esbuild/sunos-x64@0.28.0': + optional: true + '@esbuild/win32-arm64@0.21.5': optional: true '@esbuild/win32-arm64@0.25.5': optional: true + '@esbuild/win32-arm64@0.28.0': + optional: true + '@esbuild/win32-ia32@0.21.5': optional: true '@esbuild/win32-ia32@0.25.5': optional: true + '@esbuild/win32-ia32@0.28.0': + optional: true + '@esbuild/win32-x64@0.21.5': optional: true '@esbuild/win32-x64@0.25.5': optional: true + '@esbuild/win32-x64@0.28.0': + optional: true + '@eslint-community/eslint-utils@4.7.0(eslint@9.28.0(jiti@1.21.7))': dependencies: eslint: 9.28.0(jiti@1.21.7) @@ -7370,7 +7441,7 @@ snapshots: '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/gen-mapping@0.3.8': @@ -7390,6 +7461,8 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -7398,7 +7471,7 @@ snapshots: '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 '@kamilkisiela/fast-url-parser@1.1.4': {} @@ -7422,7 +7495,7 @@ snapshots: dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@tybys/wasm-util': 0.10.2 + '@tybys/wasm-util': 0.10.1 optional: true '@nodelib/fs.scandir@2.1.5': @@ -7458,7 +7531,7 @@ snapshots: '@oozcitak/util@10.0.0': {} - '@oxc-project/types@0.130.0': {} + '@oxc-project/types@0.127.0': {} '@peculiar/asn1-schema@2.3.13': dependencies: @@ -7490,58 +7563,58 @@ snapshots: '@repeaterjs/repeater@3.0.6': {} - '@rolldown/binding-android-arm64@1.0.1': + '@rolldown/binding-android-arm64@1.0.0-rc.17': optional: true - '@rolldown/binding-darwin-arm64@1.0.1': + '@rolldown/binding-darwin-arm64@1.0.0-rc.17': optional: true - '@rolldown/binding-darwin-x64@1.0.1': + '@rolldown/binding-darwin-x64@1.0.0-rc.17': optional: true - '@rolldown/binding-freebsd-x64@1.0.1': + '@rolldown/binding-freebsd-x64@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.1': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.1': + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.1': + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.1': + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.1': + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.1': + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-x64-musl@1.0.1': + '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': optional: true - '@rolldown/binding-openharmony-arm64@1.0.1': + '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': optional: true - '@rolldown/binding-wasm32-wasi@1.0.1': + '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.1': + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.1': + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': optional: true '@rolldown/pluginutils@1.0.0-beta.40': {} - '@rolldown/pluginutils@1.0.1': {} + '@rolldown/pluginutils@1.0.0-rc.17': {} '@rollup/rollup-android-arm-eabi@4.43.0': optional: true @@ -7734,8 +7807,16 @@ snapshots: dependencies: solid-js: 2.0.0-beta.14 + '@solidjs/signals@2.0.0-beta.13': {} + '@solidjs/signals@2.0.0-beta.14': {} + '@solidjs/web@2.0.0-beta.12(solid-js@2.0.0-beta.12)': + dependencies: + seroval: 1.5.2 + seroval-plugins: 1.5.2(seroval@1.5.2) + solid-js: 2.0.0-beta.12 + '@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14)': dependencies: seroval: 1.5.2 @@ -7744,8 +7825,8 @@ snapshots: '@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14)': dependencies: - seroval: 1.5.4 - seroval-plugins: 1.5.4(seroval@1.5.4) + seroval: 1.5.2 + seroval-plugins: 1.5.2(seroval@1.5.2) solid-js: 2.0.0-beta.14 '@supabase/auth-js@2.67.3': @@ -7808,8 +7889,8 @@ snapshots: dependencies: '@tanstack/history': 1.161.6 cookie-es: 2.0.0 - seroval: 1.5.4 - seroval-plugins: 1.5.4(seroval@1.5.4) + seroval: 1.5.2 + seroval-plugins: 1.5.2(seroval@1.5.2) '@tanstack/router-generator@1.166.24': dependencies: @@ -7819,15 +7900,15 @@ snapshots: prettier: 3.5.3 recast: 0.23.11 source-map: 0.7.6 - tsx: 4.20.2 + tsx: 4.22.3 zod: 3.25.63 transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.167.12(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0))': + '@tanstack/router-plugin@1.167.12(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.28.0)(jiti@1.21.7)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0)))(vite@8.0.10(@types/node@22.15.31)(esbuild@0.28.0)(jiti@1.21.7)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0))': dependencies: '@babel/core': 7.29.0 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.29.0) '@babel/template': 7.28.6 '@babel/traverse': 7.29.0 @@ -7840,8 +7921,8 @@ snapshots: unplugin: 2.3.5 zod: 3.25.63 optionalDependencies: - vite: 8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) - vite-plugin-solid: 3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + vite: 8.0.10(@types/node@22.15.31)(esbuild@0.28.0)(jiti@1.21.7)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0) + vite-plugin-solid: 3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.28.0)(jiti@1.21.7)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0)) transitivePeerDependencies: - supports-color @@ -7866,7 +7947,7 @@ snapshots: '@solidjs/web': 2.0.0-beta.13(solid-js@2.0.0-beta.14) '@tanstack/history': 1.161.6 '@tanstack/router-core': 1.168.9 - isbot: 5.1.40 + isbot: 5.1.39 solid-js: 2.0.0-beta.14 '@tanstack/solid-start-client@2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)': @@ -7890,18 +7971,18 @@ snapshots: transitivePeerDependencies: - crossws - '@tanstack/solid-start@2.0.0-beta.18(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0))': + '@tanstack/solid-start@2.0.0-beta.18(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.28.0)(jiti@1.21.7)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0)))(vite@8.0.10(@types/node@22.15.31)(esbuild@0.28.0)(jiti@1.21.7)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0))': dependencies: '@solidjs/web': 2.0.0-beta.13(solid-js@2.0.0-beta.14) '@tanstack/solid-router': 2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14) '@tanstack/solid-start-client': 2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14) '@tanstack/solid-start-server': 2.0.0-beta.17(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14) '@tanstack/start-client-core': 1.167.9 - '@tanstack/start-plugin-core': 1.167.17(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + '@tanstack/start-plugin-core': 1.167.17(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.28.0)(jiti@1.21.7)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0)))(vite@8.0.10(@types/node@22.15.31)(esbuild@0.28.0)(jiti@1.21.7)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0)) '@tanstack/start-server-core': 1.167.9 pathe: 2.0.3 solid-js: 2.0.0-beta.14 - vite: 8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) + vite: 8.0.10(@types/node@22.15.31)(esbuild@0.28.0)(jiti@1.21.7)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0) transitivePeerDependencies: - '@rsbuild/core' - '@tanstack/react-router' @@ -7915,11 +7996,11 @@ snapshots: '@tanstack/router-core': 1.168.9 '@tanstack/start-fn-stubs': 1.161.6 '@tanstack/start-storage-context': 1.166.23 - seroval: 1.5.4 + seroval: 1.5.2 '@tanstack/start-fn-stubs@1.161.6': {} - '@tanstack/start-plugin-core@1.167.17(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0))': + '@tanstack/start-plugin-core@1.167.17(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.28.0)(jiti@1.21.7)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0)))(vite@8.0.10(@types/node@22.15.31)(esbuild@0.28.0)(jiti@1.21.7)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.29.0 @@ -7927,7 +8008,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.40 '@tanstack/router-core': 1.168.9 '@tanstack/router-generator': 1.166.24 - '@tanstack/router-plugin': 1.167.12(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)))(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + '@tanstack/router-plugin': 1.167.12(vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.28.0)(jiti@1.21.7)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0)))(vite@8.0.10(@types/node@22.15.31)(esbuild@0.28.0)(jiti@1.21.7)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0)) '@tanstack/router-utils': 1.161.6 '@tanstack/start-client-core': 1.167.9 '@tanstack/start-server-core': 1.167.9 @@ -7939,8 +8020,8 @@ snapshots: srvx: 0.11.15 tinyglobby: 0.2.16 ufo: 1.6.1 - vite: 8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) - vitefu: 1.1.3(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + vite: 8.0.10(@types/node@22.15.31)(esbuild@0.28.0)(jiti@1.21.7)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0) + vitefu: 1.1.3(vite@8.0.10(@types/node@22.15.31)(esbuild@0.28.0)(jiti@1.21.7)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0)) xmlbuilder2: 4.0.3 zod: 3.25.63 transitivePeerDependencies: @@ -7958,7 +8039,7 @@ snapshots: '@tanstack/start-client-core': 1.167.9 '@tanstack/start-storage-context': 1.166.23 h3-v2: h3@2.0.1-rc.16 - seroval: 1.5.4 + seroval: 1.5.2 transitivePeerDependencies: - crossws @@ -7976,7 +8057,7 @@ snapshots: dependencies: '@tauri-apps/api': 2.0.1 - '@tybys/wasm-util@0.10.2': + '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 optional: true @@ -8346,34 +8427,35 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-jsx-dom-expressions@0.40.7(@babel/core@7.27.4): + babel-plugin-jsx-dom-expressions@0.39.8(@babel/core@7.29.0): dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.18.6 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.27.4) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) '@babel/types': 7.29.0 html-entities: 2.3.3 parse5: 7.3.0 + validate-html-nesting: 1.2.2 babel-plugin-jsx-dom-expressions@0.50.0-next.11(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.18.6 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) '@babel/types': 7.29.0 html-entities: 2.3.3 parse5: 7.3.0 - validate-html-nesting: 1.2.4 + validate-html-nesting: 1.2.2 - babel-plugin-jsx-dom-expressions@0.50.0-next.13(@babel/core@7.27.4): + babel-plugin-jsx-dom-expressions@0.50.0-next.13(@babel/core@7.29.0): dependencies: - '@babel/core': 7.27.4 + '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.18.6 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.27.4) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) '@babel/types': 7.29.0 html-entities: 2.3.3 parse5: 7.3.0 - validate-html-nesting: 1.2.4 + validate-html-nesting: 1.2.2 babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: {} @@ -8384,7 +8466,7 @@ snapshots: '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.29.0) '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.0) '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.29.0) - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.0) '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.29.0) '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.29.0) @@ -8410,12 +8492,10 @@ snapshots: transitivePeerDependencies: - supports-color - babel-preset-solid@1.9.12(@babel/core@7.27.4)(solid-js@2.0.0-beta.14): + babel-preset-solid@1.9.6(@babel/core@7.29.0): dependencies: - '@babel/core': 7.27.4 - babel-plugin-jsx-dom-expressions: 0.40.7(@babel/core@7.27.4) - optionalDependencies: - solid-js: 2.0.0-beta.14 + '@babel/core': 7.29.0 + babel-plugin-jsx-dom-expressions: 0.39.8(@babel/core@7.29.0) babel-preset-solid@2.0.0-beta.13(@babel/core@7.29.0)(solid-js@2.0.0-beta.14): dependencies: @@ -8424,10 +8504,10 @@ snapshots: optionalDependencies: solid-js: 2.0.0-beta.14 - babel-preset-solid@2.0.0-beta.14(@babel/core@7.27.4)(solid-js@2.0.0-beta.14): + babel-preset-solid@2.0.0-beta.14(@babel/core@7.29.0)(solid-js@2.0.0-beta.14): dependencies: - '@babel/core': 7.27.4 - babel-plugin-jsx-dom-expressions: 0.50.0-next.13(@babel/core@7.27.4) + '@babel/core': 7.29.0 + babel-plugin-jsx-dom-expressions: 0.50.0-next.13(@babel/core@7.29.0) optionalDependencies: solid-js: 2.0.0-beta.14 @@ -8886,9 +8966,9 @@ snapshots: esbuild-plugin-solid@0.6.0(esbuild@0.25.5)(solid-js@2.0.0-beta.14): dependencies: - '@babel/core': 7.27.4 - '@babel/preset-typescript': 7.27.1(@babel/core@7.27.4) - babel-preset-solid: 1.9.12(@babel/core@7.27.4)(solid-js@2.0.0-beta.14) + '@babel/core': 7.29.0 + '@babel/preset-typescript': 7.27.1(@babel/core@7.29.0) + babel-preset-solid: 1.9.6(@babel/core@7.29.0) esbuild: 0.25.5 solid-js: 2.0.0-beta.14 transitivePeerDependencies: @@ -8948,6 +9028,35 @@ snapshots: '@esbuild/win32-ia32': 0.25.5 '@esbuild/win32-x64': 0.25.5 + esbuild@0.28.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.0 + '@esbuild/android-arm': 0.28.0 + '@esbuild/android-arm64': 0.28.0 + '@esbuild/android-x64': 0.28.0 + '@esbuild/darwin-arm64': 0.28.0 + '@esbuild/darwin-x64': 0.28.0 + '@esbuild/freebsd-arm64': 0.28.0 + '@esbuild/freebsd-x64': 0.28.0 + '@esbuild/linux-arm': 0.28.0 + '@esbuild/linux-arm64': 0.28.0 + '@esbuild/linux-ia32': 0.28.0 + '@esbuild/linux-loong64': 0.28.0 + '@esbuild/linux-mips64el': 0.28.0 + '@esbuild/linux-ppc64': 0.28.0 + '@esbuild/linux-riscv64': 0.28.0 + '@esbuild/linux-s390x': 0.28.0 + '@esbuild/linux-x64': 0.28.0 + '@esbuild/netbsd-arm64': 0.28.0 + '@esbuild/netbsd-x64': 0.28.0 + '@esbuild/openbsd-arm64': 0.28.0 + '@esbuild/openbsd-x64': 0.28.0 + '@esbuild/openharmony-arm64': 0.28.0 + '@esbuild/sunos-x64': 0.28.0 + '@esbuild/win32-arm64': 0.28.0 + '@esbuild/win32-ia32': 0.28.0 + '@esbuild/win32-x64': 0.28.0 + escalade@3.2.0: {} escape-string-regexp@1.0.5: {} @@ -9205,10 +9314,6 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-tsconfig@4.10.1: - dependencies: - resolve-pkg-maps: 1.0.0 - github-slugger@2.0.0: {} glob-parent@5.1.2: @@ -9517,7 +9622,7 @@ snapshots: is-windows@1.0.2: {} - isbot@5.1.40: {} + isbot@5.1.39: {} isexe@2.0.0: {} @@ -10397,7 +10502,7 @@ snapshots: picocolors: 0.2.1 source-map: 0.6.1 - postcss@8.5.14: + postcss@8.5.13: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -10448,7 +10553,7 @@ snapshots: queue-microtask@1.2.3: {} - react@19.2.6: {} + react@19.2.5: {} read-cache@1.0.0: dependencies: @@ -10594,8 +10699,6 @@ snapshots: resolve-from@5.0.0: {} - resolve-pkg-maps@1.0.0: {} - resolve@1.22.10: dependencies: is-core-module: 2.16.1 @@ -10611,26 +10714,26 @@ snapshots: rfdc@1.4.1: {} - rolldown@1.0.1: + rolldown@1.0.0-rc.17: dependencies: - '@oxc-project/types': 0.130.0 - '@rolldown/pluginutils': 1.0.1 + '@oxc-project/types': 0.127.0 + '@rolldown/pluginutils': 1.0.0-rc.17 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.1 - '@rolldown/binding-darwin-arm64': 1.0.1 - '@rolldown/binding-darwin-x64': 1.0.1 - '@rolldown/binding-freebsd-x64': 1.0.1 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.1 - '@rolldown/binding-linux-arm64-gnu': 1.0.1 - '@rolldown/binding-linux-arm64-musl': 1.0.1 - '@rolldown/binding-linux-ppc64-gnu': 1.0.1 - '@rolldown/binding-linux-s390x-gnu': 1.0.1 - '@rolldown/binding-linux-x64-gnu': 1.0.1 - '@rolldown/binding-linux-x64-musl': 1.0.1 - '@rolldown/binding-openharmony-arm64': 1.0.1 - '@rolldown/binding-wasm32-wasi': 1.0.1 - '@rolldown/binding-win32-arm64-msvc': 1.0.1 - '@rolldown/binding-win32-x64-msvc': 1.0.1 + '@rolldown/binding-android-arm64': 1.0.0-rc.17 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.17 + '@rolldown/binding-darwin-x64': 1.0.0-rc.17 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.17 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.17 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.17 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.17 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.17 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.17 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.17 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.17 rollup@4.43.0: dependencies: @@ -10708,16 +10811,10 @@ snapshots: dependencies: seroval: 1.5.2 - seroval-plugins@1.5.4(seroval@1.5.4): - dependencies: - seroval: 1.5.4 - seroval@1.3.2: {} seroval@1.5.2: {} - seroval@1.5.4: {} - set-blocking@2.0.0: {} setimmediate@1.0.5: {} @@ -10771,12 +10868,19 @@ snapshots: seroval: 1.3.2 seroval-plugins: 1.3.2(seroval@1.3.2) + solid-js@2.0.0-beta.12: + dependencies: + '@solidjs/signals': 2.0.0-beta.13 + csstype: 3.1.3 + seroval: 1.5.2 + seroval-plugins: 1.5.2(seroval@1.5.2) + solid-js@2.0.0-beta.14: dependencies: '@solidjs/signals': 2.0.0-beta.14 csstype: 3.1.3 - seroval: 1.5.4 - seroval-plugins: 1.5.4(seroval@1.5.4) + seroval: 1.5.2 + seroval-plugins: 1.5.2(seroval@1.5.2) solid-refresh@0.8.0-next.7(solid-js@2.0.0-beta.14): dependencies: @@ -11022,10 +11126,9 @@ snapshots: tslib@2.8.1: {} - tsx@4.20.2: + tsx@4.22.3: dependencies: - esbuild: 0.25.5 - get-tsconfig: 4.10.1 + esbuild: 0.28.0 optionalDependencies: fsevents: 2.3.3 @@ -11127,7 +11230,7 @@ snapshots: util-deprecate@1.0.2: {} - validate-html-nesting@1.2.4: {} + validate-html-nesting@1.2.2: {} value-or-promise@1.0.12: {} @@ -11159,7 +11262,7 @@ snapshots: - supports-color - terser - vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)): + vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.13(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@8.0.10(@types/node@22.15.31)(esbuild@0.28.0)(jiti@1.21.7)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0)): dependencies: '@babel/core': 7.29.0 '@solidjs/web': 2.0.0-beta.13(solid-js@2.0.0-beta.14) @@ -11168,12 +11271,12 @@ snapshots: merge-anything: 5.1.7 solid-js: 2.0.0-beta.14 solid-refresh: 0.8.0-next.7(solid-js@2.0.0-beta.14) - vite: 8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) - vitefu: 1.1.3(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + vite: 8.0.10(@types/node@22.15.31)(esbuild@0.28.0)(jiti@1.21.7)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0) + vitefu: 1.1.3(vite@8.0.10(@types/node@22.15.31)(esbuild@0.28.0)(jiti@1.21.7)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0)) transitivePeerDependencies: - supports-color - vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)): + vite-plugin-solid@3.0.0-next.5(@solidjs/web@2.0.0-beta.14(solid-js@2.0.0-beta.14))(solid-js@2.0.0-beta.14)(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0)): dependencies: '@babel/core': 7.29.0 '@solidjs/web': 2.0.0-beta.14(solid-js@2.0.0-beta.14) @@ -11182,8 +11285,8 @@ snapshots: merge-anything: 5.1.7 solid-js: 2.0.0-beta.14 solid-refresh: 0.8.0-next.7(solid-js@2.0.0-beta.14) - vite: 6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) - vitefu: 1.1.3(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)) + vite: 6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0) + vitefu: 1.1.3(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0)) transitivePeerDependencies: - supports-color @@ -11198,7 +11301,7 @@ snapshots: lightningcss: 1.32.0 sass: 1.77.8 - vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0): + vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0): dependencies: esbuild: 0.25.5 fdir: 6.4.6(picomatch@4.0.2) @@ -11212,32 +11315,32 @@ snapshots: jiti: 1.21.7 lightningcss: 1.32.0 sass: 1.77.8 - tsx: 4.20.2 + tsx: 4.22.3 yaml: 2.5.0 - vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0): + vite@8.0.10(@types/node@22.15.31)(esbuild@0.28.0)(jiti@1.21.7)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 - postcss: 8.5.14 - rolldown: 1.0.1 + postcss: 8.5.13 + rolldown: 1.0.0-rc.17 tinyglobby: 0.2.16 optionalDependencies: '@types/node': 22.15.31 - esbuild: 0.25.5 + esbuild: 0.28.0 fsevents: 2.3.3 jiti: 1.21.7 sass: 1.77.8 - tsx: 4.20.2 + tsx: 4.22.3 yaml: 2.5.0 - vitefu@1.1.3(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)): + vitefu@1.1.3(vite@6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0)): optionalDependencies: - vite: 6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) + vite: 6.3.5(@types/node@22.15.31)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0) - vitefu@1.1.3(vite@8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0)): + vitefu@1.1.3(vite@8.0.10(@types/node@22.15.31)(esbuild@0.28.0)(jiti@1.21.7)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0)): optionalDependencies: - vite: 8.0.13(@types/node@22.15.31)(esbuild@0.25.5)(jiti@1.21.7)(sass@1.77.8)(tsx@4.20.2)(yaml@2.5.0) + vite: 8.0.10(@types/node@22.15.31)(esbuild@0.28.0)(jiti@1.21.7)(sass@1.77.8)(tsx@4.22.3)(yaml@2.5.0) vitest@2.1.9(@types/node@22.15.31)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.77.8): dependencies: