diff --git a/.eslintrc b/.eslintrc index afc7936..fb99f30 100644 --- a/.eslintrc +++ b/.eslintrc @@ -4,7 +4,13 @@ "plugins": ["@typescript-eslint", "no-only-tests", "eslint-comments"], "ignorePatterns": ["node_modules", "dist"], "parserOptions": { - "project": ["./tsconfig.json", "./tsconfig.node.json", "./test/tsconfig.json"], + "project": [ + "./tsconfig.json", + "./tsconfig.node.json", + "./test/tsconfig.json", + "./e2e/tsconfig.json", + "./playground/tsconfig.json" + ], "tsconfigRootDir": ".", "sourceType": "module" }, diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml index e9360de..a5c274f 100644 --- a/.github/workflows/format.yml +++ b/.github/workflows/format.yml @@ -21,7 +21,7 @@ jobs: - name: Setup Node.js environment uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: pnpm - name: Install dependencies diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 45e50d8..444839b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,10 +17,14 @@ jobs: - uses: pnpm/action-setup@v4 + # Node 22, not 20: jsdom 30 pulls in undici, which reads + # `markAsUncloneable` off node:worker_threads unconditionally. That only + # exists from Node 22.10, so on Node 20 every jsdom test worker dies at + # startup with "[vitest-pool]: Failed to start forks worker". - name: Setup Node.js environment uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: pnpm - name: Install dependencies @@ -34,3 +38,33 @@ jobs: - name: Lint run: pnpm lint + + e2e: + name: End-to-end + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + + - name: Setup Node.js environment + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: pnpm + + - name: Install dependencies + run: pnpm install --no-frozen-lockfile --ignore-scripts + + - name: Install Playwright browsers + run: pnpm exec playwright install --with-deps chromium firefox webkit + + - name: Run Playwright tests + run: pnpm run test:e2e + + - uses: actions/upload-artifact@v4 + if: ${{ !cancelled() }} + with: + name: playwright-report + path: playwright-report/ + retention-days: 7 diff --git a/.gitignore b/.gitignore index 36b6469..c27beed 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,6 @@ dist node_modules -storybook-static +test-results +playwright-report +coverage diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..2bd5a0a --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +22 diff --git a/.prettierignore b/.prettierignore index c4cbfff..d34c7b0 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,3 +1,6 @@ dist node_modules pnpm-lock.yaml +test-results +playwright-report +coverage diff --git a/.storybook/main.ts b/.storybook/main.ts deleted file mode 100644 index 6920050..0000000 --- a/.storybook/main.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type {StorybookConfig} from "storybook-solidjs-vite" - -export default { - stories: ["../stories/**/*.stories.@(ts|tsx)"], - framework: "storybook-solidjs-vite", -} satisfies StorybookConfig diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx deleted file mode 100644 index 4b1c9d5..0000000 --- a/.storybook/preview.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import type {Preview} from "storybook-solidjs-vite" - -export default { - parameters: { - controls: {expanded: true}, - }, -} satisfies Preview diff --git a/README.md b/README.md index 9571c22..dd7fbe9 100644 --- a/README.md +++ b/README.md @@ -323,7 +323,6 @@ For cases where you don't want to render a `` component — e.g. animati ```tsx import {motion} from "solid-motion" - ;
({ initial: {opacity: 0}, @@ -391,9 +390,21 @@ The following types are exported for typing your own components and helpers: ## Examples -Every feature documented above has a live, interactive example in this repo's Storybook. Run it locally with: +Every feature documented above has a live example in this repo's playground. Run it locally with: ```bash pnpm install -pnpm run storybook +pnpm run dev ``` + +That serves an index of every demo; each one is also reachable directly at `?demo=`. The playground doubles as the app the Playwright suite drives, so the demos are kept working by the tests rather than by hand. + +## Testing + +```bash +pnpm test # Vitest: the state machine, in jsdom and in SSR +pnpm run test:coverage +pnpm run test:e2e # Playwright: real browsers, across Chromium, Firefox and WebKit +``` + +Vitest covers the engine's own logic. Playwright covers everything jsdom cannot reach: real animation interpolation through the Web Animations API, real `IntersectionObserver` for `inView`, real pointer input for `hover`/`press`, and real scrolling for `useScroll`. diff --git a/e2e/animate.spec.ts b/e2e/animate.spec.ts new file mode 100644 index 0000000..54375a3 --- /dev/null +++ b/e2e/animate.spec.ts @@ -0,0 +1,126 @@ +import {expect, test} from "@playwright/test" +import {computed, opacity, openDemo, settled, translateX} from "./helpers.js" + +test.describe("animate", () => { + test("animates from initial to the animate target", async ({page}) => { + await openDemo(page, "basic-enter") + + const box = page.getByTestId("box") + // starts at the initial target rather than jumping to animate + expect(await opacity(box)).toBeLessThan(1) + expect(Number(await settled(box))).toBeCloseTo(1, 1) + }) + + test("initial={false} applies the animate target with no transition", async ({page}) => { + await openDemo(page, "initial-false") + + // the demo's transition is 5s, so anything but an instant apply is visible + const box = page.getByTestId("box") + expect(await opacity(box)).toBeCloseTo(0.4, 1) + expect(await computed(box, "transform")).toContain("100") + }) + + test("no animation runs when initial already equals animate", async ({page}) => { + await openDemo(page, "no-op-when-equal") + + await page.waitForTimeout(300) + await expect(page.getByTestId("starts")).toHaveText("0") + expect(await opacity(page.getByTestId("box"))).toBeCloseTo(0.6, 1) + }) + + test("a reactive animate target re-triggers the animation", async ({page}) => { + await openDemo(page, "reactive-animate") + + const box = page.getByTestId("box") + expect(Number(await settled(box))).toBeCloseTo(0.25, 1) + + await page.getByTestId("toggle").click() + expect(Number(await settled(box))).toBeCloseTo(1, 1) + + await page.getByTestId("toggle").click() + expect(Number(await settled(box))).toBeCloseTo(0.25, 1) + }) +}) + +test.describe("transitions", () => { + test("Motion One's `easing` spelling is accepted", async ({page}) => { + await openDemo(page, "legacy-easing") + + // an unrecognised easing would throw or snap; this should interpolate + const box = page.getByTestId("box") + expect(Number(await settled(box))).toBeCloseTo(1, 1) + }) + + /* + The per-value override sets only `duration`, so it has to inherit the rest + of the base transition. `x` runs 1.5s against the base 0.2s, so opacity + must finish well before x does. + */ + test("a per-value override inherits the base transition", async ({page}) => { + await openDemo(page, "per-value-override") + + const box = page.getByTestId("box") + await expect.poll(() => opacity(box)).toBeGreaterThan(0.95) + + const x = await computed(box, "transform") + expect(x).not.toContain("120") + + await expect.poll(() => computed(box, "transform"), {timeout: 4000}).toContain("120") + }) + + test("a target's own transition overrides the component transition", async ({page}) => { + await openDemo(page, "per-target-override") + + // base duration is 0.05s, the target's own is 1.5s: still mid-flight here + await page.waitForTimeout(300) + expect(await opacity(page.getByTestId("box"))).toBeLessThan(0.95) + expect(Number(await settled(page.getByTestId("box")))).toBeCloseTo(1, 1) + }) + + test("keyframe arrays step through every value", async ({page}) => { + await openDemo(page, "keyframes") + + const box = page.getByTestId("box") + const seen = new Set() + for (let i = 0; i < 25; i++) { + seen.add(await computed(box, "transform")) + await page.waitForTimeout(20) + } + // a single jump to the end would give one or two distinct values + expect(seen.size).toBeGreaterThan(3) + await expect.poll(() => computed(box, "transform")).toContain("40") + }) +}) + +test.describe("variants", () => { + test("string keys resolve against the variants map", async ({page}) => { + await openDemo(page, "variants") + + expect(Number(await settled(page.getByTestId("box")))).toBeCloseTo(1, 1) + }) + + test("a descendant inherits the ancestor's initial variant key", async ({page}) => { + await openDemo(page, "variant-inheritance") + + /* + The child sets no `initial` of its own, so it inherits the key "hidden" + from its parent and resolves it against its own variants map, starting + translated by 60px rather than at rest. + */ + const child = page.getByTestId("child") + expect(await translateX(child)).toBeGreaterThan(40) + + await settled(child, "transform") + expect(await translateX(child)).toBeCloseTo(0, 1) + }) + + test("swapping the variants map re-animates an unchanged key", async ({page}) => { + await openDemo(page, "reactive-variants") + + const box = page.getByTestId("box") + expect(Number(await settled(box))).toBeCloseTo(0.3, 1) + + await page.getByTestId("swap").click() + expect(Number(await settled(box))).toBeCloseTo(0.9, 1) + }) +}) diff --git a/e2e/gestures.spec.ts b/e2e/gestures.spec.ts new file mode 100644 index 0000000..2a301cf --- /dev/null +++ b/e2e/gestures.spec.ts @@ -0,0 +1,170 @@ +import {expect, test} from "@playwright/test" +import {opacity, openDemo, settled, translateX} from "./helpers.js" + +test.describe("gestures", () => { + test("hover animates in and back out", async ({page}) => { + await openDemo(page, "hover") + + const box = page.getByTestId("box") + await expect(page.getByTestId("hover")).toHaveText("idle") + + await box.hover() + await expect(page.getByTestId("hover")).toHaveText("active") + expect(Number(await settled(box))).toBeCloseTo(0.4, 1) + + await page.mouse.move(0, 0) + await expect(page.getByTestId("hover")).toHaveText("idle") + expect(Number(await settled(box))).toBeCloseTo(1, 1) + }) + + test("press animates in and back out", async ({page}) => { + await openDemo(page, "press") + + const box = page.getByTestId("box") + await box.hover() + await page.mouse.down() + + await expect(page.getByTestId("press")).toHaveText("active") + expect(Number(await settled(box))).toBeCloseTo(0.3, 1) + + await page.mouse.up() + await expect(page.getByTestId("press")).toHaveText("idle") + expect(Number(await settled(box))).toBeCloseTo(1, 1) + }) + + test("press layers on top of hover and reverts to it on release", async ({page}) => { + await openDemo(page, "hover-and-press") + + const box = page.getByTestId("box") + await box.hover() + await expect(page.getByTestId("hover")).toHaveText("active") + expect(Number(await settled(box))).toBeCloseTo(0.7, 1) + + await page.mouse.down() + await expect(page.getByTestId("press")).toHaveText("active") + // press wins over hover for the shared key + expect(Number(await settled(box))).toBeCloseTo(0.2, 1) + + await page.mouse.up() + // still hovering, so it falls back to the hover target rather than base + await expect(page.getByTestId("press")).toHaveText("idle") + await expect(page.getByTestId("hover")).toHaveText("active") + expect(Number(await settled(box))).toBeCloseTo(0.7, 1) + }) + + /* + Regression guard: with no `animate` prop the target resolved on hover-out + holds no values at all, and an empty target is a no-op. The engine now + remembers what the element showed before the gesture introduced the key, + so it has something to animate back to. + */ + test("a gesture with no animate base reverts on leave", async ({page}) => { + await openDemo(page, "hover-no-base") + + const box = page.getByTestId("box") + await box.hover() + expect(Number(await settled(box))).toBeCloseTo(0.4, 1) + + await page.mouse.move(0, 0) + expect(Number(await settled(box))).toBeCloseTo(1, 1) + }) +}) + +test.describe("inView", () => { + test("entering the viewport triggers the inView target", async ({page}) => { + await openDemo(page, "in-view") + + const box = page.getByTestId("box") + await expect(page.getByTestId("view")).toHaveText("not yet") + + await box.scrollIntoViewIfNeeded() + await expect(page.getByTestId("view")).toHaveText("entered") + expect(Number(await settled(box))).toBeCloseTo(0.2, 1) + }) + + /* + Motion's `inView` hands its callback `(element, entry)`. Reading the first + argument as the entry would put the element into `originalEntry`, and this + assertion would see "undefined" instead of a boolean. + */ + test("onViewEnter receives the IntersectionObserverEntry", async ({page}) => { + await openDemo(page, "in-view") + + await page.getByTestId("box").scrollIntoViewIfNeeded() + await expect(page.getByTestId("entry")).toHaveText("true") + }) + + test("leaving the viewport reverses the inView target", async ({page}) => { + await openDemo(page, "in-view") + + const box = page.getByTestId("box") + await box.scrollIntoViewIfNeeded() + await expect(page.getByTestId("view")).toHaveText("entered") + + await page.evaluate(() => window.scrollTo(0, 0)) + await expect(page.getByTestId("view")).toHaveText("left") + expect(Number(await settled(box))).toBeCloseTo(1, 1) + }) + + /* + inView is a layer under hover, so hovering must not discard its values. + Before inView had its own active flag, the recompute triggered by the + hover dropped the inView target entirely. + */ + test("hovering does not discard the inView target", async ({page}) => { + await openDemo(page, "in-view-with-hover") + + const box = page.getByTestId("box") + await box.scrollIntoViewIfNeeded() + await settled(box, "transform") + expect(await translateX(box)).toBeCloseTo(120, 0) + + await box.hover() + expect(Number(await settled(box))).toBeCloseTo(0.5, 1) + // the inView translation is still applied underneath the hover + expect(await translateX(box)).toBeCloseTo(120, 0) + }) + + test("inViewOptions.amount holds the trigger until enough is visible", async ({page}) => { + await openDemo(page, "in-view-amount") + + // scroll just far enough to reveal the top sliver of the tall box + await page.evaluate(() => { + const el = document.querySelector('[data-testid="box"]')! + window.scrollTo( + 0, + el.getBoundingClientRect().top + window.scrollY - window.innerHeight + 40, + ) + }) + await page.waitForTimeout(300) + await expect(page.getByTestId("view")).toHaveText("not yet") + + await page.getByTestId("box").scrollIntoViewIfNeeded() + await expect(page.getByTestId("view")).toHaveText("entered") + await expect.poll(() => opacity(page.getByTestId("box"))).toBeLessThan(1) + }) +}) + +test.describe("useScroll", () => { + test("reports scroll progress reactively", async ({page}) => { + await openDemo(page, "use-scroll") + + await expect(page.getByTestId("progress")).toHaveText("0.00") + + await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight)) + await expect.poll(() => page.getByTestId("progress").textContent()).toBe("1.00") + + await page.evaluate(() => window.scrollTo(0, 0)) + await expect.poll(() => page.getByTestId("progress").textContent()).toBe("0.00") + }) +}) + +test.describe("primitives", () => { + test("the motion ref factory animates a plain element", async ({page}) => { + await openDemo(page, "ref-factory") + + const box = page.getByTestId("box") + expect(Number(await settled(box))).toBeCloseTo(1, 1) + expect(await translateX(box)).toBeCloseTo(0, 1) + }) +}) diff --git a/e2e/helpers.ts b/e2e/helpers.ts new file mode 100644 index 0000000..101b21d --- /dev/null +++ b/e2e/helpers.ts @@ -0,0 +1,45 @@ +import {expect, type Locator, type Page} from "@playwright/test" + +/** Navigates to one playground demo. */ +export async function openDemo(page: Page, id: string): Promise { + await page.goto(`/?demo=${id}`) + await expect(page.getByTestId("unknown-demo")).toHaveCount(0) +} + +/** + * Reads a resolved style value off an element. Unlike the inline `style` + * attribute the unit tests assert on, this is what the browser actually + * computed, so it reflects a running animation. + */ +export function computed(locator: Locator, property: string): Promise { + return locator.evaluate((el, prop) => getComputedStyle(el).getPropertyValue(prop), property) +} + +/** Resolved opacity as a number, for range assertions during an animation. */ +export async function opacity(locator: Locator): Promise { + return Number(await computed(locator, "opacity")) +} + +/** + * Waits until an element's computed property stops changing, i.e. its + * animation has settled. Avoids sleeping for a fixed duration, which is + * flaky across the three browser engines. + */ +export async function settled(locator: Locator, property = "opacity"): Promise { + let previous = await computed(locator, property) + for (let i = 0; i < 60; i++) { + await locator.page().waitForTimeout(50) + const next = await computed(locator, property) + if (next === previous) return next + previous = next + } + throw new Error(`"${property}" never settled (last value ${previous})`) +} + +/** The horizontal translation of an element's computed transform, in pixels. */ +export async function translateX(locator: Locator): Promise { + const transform = await computed(locator, "transform") + if (transform === "none") return 0 + const values = transform.match(/matrix\(([^)]+)\)/)?.[1]?.split(",") + return Number(values?.[4] ?? 0) +} diff --git a/e2e/presence.spec.ts b/e2e/presence.spec.ts new file mode 100644 index 0000000..11228bd --- /dev/null +++ b/e2e/presence.spec.ts @@ -0,0 +1,99 @@ +import {expect, test} from "@playwright/test" +import {opacity, openDemo, settled} from "./helpers.js" + +test.describe("Presence", () => { + test("an element animates out before it is removed", async ({page}) => { + await openDemo(page, "presence-basic") + + const box = page.getByTestId("box") + await expect(box).toBeVisible() + + await page.getByTestId("toggle").click() + // still in the DOM while the exit animation runs + await expect(box).toBeAttached() + expect(await opacity(box)).toBeLessThan(1) + + await expect(box).toHaveCount(0) + }) + + /* + `exit="missing"` resolves to no values at all. The element still has to be + removed: the exit has to report itself finished even when there is nothing + to animate, or Presence waits forever. + */ + test("an exit that resolves to no values still removes the element", async ({page}) => { + await openDemo(page, "presence-empty-exit") + + await expect(page.getByTestId("box")).toBeVisible() + await page.getByTestId("toggle").click() + await expect(page.getByTestId("box")).toHaveCount(0) + }) + + test("exitBeforeEnter holds the incoming element until the outgoing one leaves", async ({ + page, + }) => { + await openDemo(page, "presence-exit-before-enter") + + await expect(page.getByTestId("box-a")).toBeVisible() + + await page.getByTestId("toggle").click() + // b must not appear while a is still exiting + await expect(page.getByTestId("box-a")).toBeAttached() + await expect(page.getByTestId("box-b")).toHaveCount(0) + + await expect(page.getByTestId("box-a")).toHaveCount(0) + await expect(page.getByTestId("box-b")).toBeVisible() + + // and back again + await page.getByTestId("toggle").click() + await expect(page.getByTestId("box-b")).toHaveCount(0) + await expect(page.getByTestId("box-a")).toBeVisible() + }) + + /* + In the default parallel mode the incoming element is torn down and + remounted while the outgoing one exits. If its exit flag survives that + remount it stays pinned to the exit target and ignores every later update. + */ + test("an element that entered during an exit still animates afterwards", async ({page}) => { + await openDemo(page, "presence-parallel-swap") + + expect(Number(await settled(page.getByTestId("box-1")))).toBeCloseTo(0.5, 1) + + await page.getByTestId("swap").click() + const second = page.getByTestId("box-2") + await expect(second).toBeVisible() + await expect(page.getByTestId("box-1")).toHaveCount(0) + expect(Number(await settled(second))).toBeCloseTo(0.5, 1) + + await page.getByTestId("fade").click() + expect(Number(await settled(second))).toBeCloseTo(0.9, 1) + }) + + test("every nested descendant runs its own exit before the subtree goes", async ({page}) => { + await openDemo(page, "presence-nested-exit") + + await expect(page.getByTestId("parent")).toBeVisible() + await expect(page.getByTestId("child")).toBeVisible() + + await page.getByTestId("toggle").click() + // both are still attached and both are fading + await expect(page.getByTestId("parent")).toBeAttached() + await expect.poll(() => opacity(page.getByTestId("child"))).toBeLessThan(1) + await expect.poll(() => opacity(page.getByTestId("parent"))).toBeLessThan(1) + + await expect(page.getByTestId("parent")).toHaveCount(0) + await expect(page.getByTestId("child")).toHaveCount(0) + }) + + test("initial={false} suppresses only the first render's children", async ({page}) => { + await openDemo(page, "presence-initial-false") + + // present on the first render: jumps straight to animate despite a 5s transition + expect(await opacity(page.getByTestId("first"))).toBeCloseTo(1, 1) + + await page.getByTestId("toggle").click() + // added later: animates in normally, so it starts from its initial + expect(await opacity(page.getByTestId("late"))).toBeLessThan(0.5) + }) +}) diff --git a/e2e/rendering.spec.ts b/e2e/rendering.spec.ts new file mode 100644 index 0000000..ef15932 --- /dev/null +++ b/e2e/rendering.spec.ts @@ -0,0 +1,47 @@ +import {expect, test} from "@playwright/test" +import {computed, openDemo, settled} from "./helpers.js" + +test.describe("rendering", () => { + test("the proxy and the tag prop both pick the rendered element", async ({page}) => { + await openDemo(page, "proxy-tags") + + await expect(page.getByTestId("span")).toHaveJSProperty("tagName", "SPAN") + await expect(page.getByTestId("button")).toHaveJSProperty("tagName", "BUTTON") + await expect(page.getByTestId("li")).toHaveJSProperty("tagName", "LI") + await expect(page.getByTestId("default")).toHaveJSProperty("tagName", "DIV") + }) + + test("svg elements render and keep their attributes", async ({page}) => { + await openDemo(page, "proxy-tags") + + const circle = page.getByTestId("circle") + await expect(circle).toHaveAttribute("r", "28") + await expect(circle).toHaveAttribute("fill", "darkorange") + }) + + /* + Regression guard: the `initial` target used to be applied as an inline + style even on SVG elements, which outranked the attribute Motion animates + and pinned the rect to its starting height forever. + */ + test("animated svg geometry interpolates", async ({page}) => { + await openDemo(page, "svg-attrs") + + const rect = page.getByTestId("rect") + await expect + .poll(() => rect.evaluate(el => (el as SVGGraphicsElement).getBBox().height)) + .toBeGreaterThan(70) + }) + + test("a user style is merged with the animated one, not replaced", async ({page}) => { + await openDemo(page, "style-merging") + + for (const id of ["object-style", "string-style"]) { + const el = page.getByTestId(id) + // the user's own declarations survive + expect(await computed(el, "width")).toBe("80px") + // and the animated value still lands + expect(Number(await settled(el))).toBeCloseTo(1, 1) + } + }) +}) diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json new file mode 100644 index 0000000..92cb2b0 --- /dev/null +++ b/e2e/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "lib": ["ESNext", "DOM"], + "types": ["node"] + } +} diff --git a/jest/jest.config.cjs b/jest/jest.config.cjs deleted file mode 100644 index fd9419a..0000000 --- a/jest/jest.config.cjs +++ /dev/null @@ -1,57 +0,0 @@ -const transform_client_path = require.resolve("./transform-client.cjs") -const transform_ssr_path = require.resolve("./transform-ssr.cjs") -const resolver_path = require.resolve("./resolver.cjs") - -/** @type {import('@jest/types').Config.InitialOptions} */ -const common_config = { - rootDir: "../", - globals: {"ts-jest": {useESM: true}}, - transformIgnorePatterns: ["node_modules/(?!solid-js.*|.*(?<=.[tj]sx))$"], - /* handles @solid-primitives/* ESM-only next-tag resolution, see resolver.cjs */ - resolver: resolver_path, - /* - to support NodeNext module imports - https://stackoverflow.com/questions/73735202/typescript-jest-imports-with-js-extension-cause-error-cannot-find-module - */ - moduleNameMapper: { - "(.+)\\.js": "$1", - "(.+)\\.jsx": "$1", - }, - extensionsToTreatAsEsm: [".ts", ".tsx"], -} - -/** @type {import('@jest/types').Config.InitialOptions} */ -const client_config = { - ...common_config, - testEnvironment: "jsdom", - testMatch: ["/test/**/*.test.(js|ts)?(x)"], - testPathIgnorePatterns: ["/node_modules/", "ssr"], - setupFilesAfterEnv: ["/test/setup.js"], - /* picks the "browser" exports condition so @solidjs/web resolves its DOM build */ - testEnvironmentOptions: { - customExportConditions: ["browser"], - }, - /* transform ts, tsx, and esm .mjs files */ - transform: { - "\\.[jt]sx$": transform_client_path, - "\\.[jt]s$": transform_client_path, - "\\.mjs$": transform_client_path, - }, -} - -/** @type {import('@jest/types').Config.InitialOptions} */ -const server_config = { - ...common_config, - // avoid loading jsdom. - testEnvironment: "node", - testMatch: ["/test/ssr.test.(js|ts)?(x)"], - /* transform ts, tsx, and esm .mjs files */ - transform: { - "\\.[jt]sx$": transform_ssr_path, - "\\.[jt]s$": transform_ssr_path, - "\\.mjs$": transform_ssr_path, - }, -} - -/** @type {import('@jest/types').Config.InitialOptions} */ -module.exports = process.env["SSR"] ? server_config : client_config diff --git a/jest/resolver.cjs b/jest/resolver.cjs deleted file mode 100644 index a35a520..0000000 --- a/jest/resolver.cjs +++ /dev/null @@ -1,33 +0,0 @@ -const fs = require("fs") -const path = require("path") - -/* -@solid-primitives/* next-tag prereleases only publish an ESM "import" export -condition (no "require"/"main" fallback), which our CJS-based babel-jest -pipeline can't require() through package.json exports resolution. Walk up -node_modules by hand (mirroring Node's own lookup algorithm) to find the -package directory without going through the exports gate, then point -straight at its "module" (or "main") entry. -*/ -function findPackageDir(specifier, fromDir) { - let dir = fromDir - for (;;) { - const candidate = path.join(dir, "node_modules", specifier) - if (fs.existsSync(candidate)) return candidate - const parent = path.dirname(dir) - if (parent === dir) return null - dir = parent - } -} - -module.exports = function resolver(request, options) { - if (request.startsWith("@solid-primitives/")) { - const pkg_dir = findPackageDir(request, options.basedir) - if (pkg_dir) { - const pkg_json = JSON.parse(fs.readFileSync(path.join(pkg_dir, "package.json"), "utf8")) - const entry = pkg_json.module || pkg_json.main - if (entry) return path.join(pkg_dir, entry) - } - } - return options.defaultResolver(request, options) -} diff --git a/jest/transform-client.cjs b/jest/transform-client.cjs deleted file mode 100644 index bcc5a2b..0000000 --- a/jest/transform-client.cjs +++ /dev/null @@ -1,9 +0,0 @@ -const babelJest = require("babel-jest") - -module.exports = babelJest.default.createTransformer({ - presets: [ - "@babel/preset-env", - "babel-preset-solid", - ["@babel/preset-typescript", {onlyRemoveTypeImports: true}], - ], -}) diff --git a/jest/transform-ssr.cjs b/jest/transform-ssr.cjs deleted file mode 100644 index c914494..0000000 --- a/jest/transform-ssr.cjs +++ /dev/null @@ -1,15 +0,0 @@ -const babelJest = require("babel-jest") - -module.exports = babelJest.default.createTransformer({ - presets: [ - "@babel/preset-env", - [ - "babel-preset-solid", - { - generate: "ssr", - hydratable: true, - }, - ], - ["@babel/preset-typescript", {onlyRemoveTypeImports: true}], - ], -}) diff --git a/package.json b/package.json index d2d94cb..4ac2c46 100644 --- a/package.json +++ b/package.json @@ -13,15 +13,16 @@ "scripts": { "prepublishOnly": "pnpm build", "build": "tsup", - "test": "pnpm run test:client && pnpm run test:ssr", - "test:client": "jest --config jest/jest.config.cjs", - "test:ssr": "SSR=true jest --config jest/jest.config.cjs", + "dev": "vite --config playground/vite.config.ts", + "test": "vitest run", + "test:watch": "vitest", + "test:coverage": "vitest run --coverage", + "test:e2e": "playwright test", + "test:e2e:ui": "playwright test --ui", "format": "prettier --cache -w .", - "lint": "pnpm run lint:code & pnpm run lint:types", - "lint:code": "eslint --ignore-path .gitignore --max-warnings 0 src/**/*.{js,ts,tsx,jsx}", - "lint:types": "tsc --noEmit", - "storybook": "storybook dev -p 6006", - "build-storybook": "storybook build" + "lint": "pnpm run lint:code && pnpm run lint:types", + "lint:code": "eslint --ignore-path .gitignore --max-warnings 0 --ext .js,.jsx,.ts,.tsx src test e2e playground", + "lint:types": "tsc --noEmit && tsc --noEmit -p test && tsc --noEmit -p e2e && tsc --noEmit -p playground" }, "type": "module", "files": [ @@ -54,31 +55,26 @@ "motion-utils": "^13.0.0" }, "devDependencies": { - "@babel/preset-env": "^7.23.7", - "@babel/preset-typescript": "^7.23.3", - "@jest/types": "^29.6.3", + "@playwright/test": "^1.62.1", "@solidjs/testing-library": "1.0.0-beta.2", + "@solidjs/vite-plugin": "^3.0.0-next.37", "@solidjs/web": "2.0.0-rc.3", - "@types/jest": "^29.5.11", - "@types/node": "^20.10.6", + "@testing-library/jest-dom": "^6.9.1", + "@types/node": "^22.12.0", "@typescript-eslint/eslint-plugin": "^6.17.0", "@typescript-eslint/parser": "^6.17.0", - "babel-jest": "^29.7.0", - "babel-preset-solid": "2.0.0-rc.2", + "@vitest/coverage-v8": "^4.1.11", "eslint": "^8.56.0", "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-no-only-tests": "^3.1.0", - "jest": "^29.7.0", - "jest-environment-jsdom": "^29.7.0", + "jsdom": "^30.0.1", "prettier": "^3.1.1", "solid-js": "2.0.0-rc.3", - "storybook": "10.5.10", - "storybook-solidjs-vite": "10.7.1", "tsup": "^8.0.1", "tsup-preset-solid": "^2.2.0", "typescript": "^5.3.3", "vite": "^8.2.2", - "vite-plugin-solid": "3.0.0-next.27" + "vitest": "^4.1.11" }, "peerDependencies": { "solid-js": "^2.0.0-rc.0" diff --git a/playground/index.html b/playground/index.html new file mode 100644 index 0000000..31a2252 --- /dev/null +++ b/playground/index.html @@ -0,0 +1,40 @@ + + + + + + solid-motion playground + + + +
+ + + diff --git a/playground/src/demos.tsx b/playground/src/demos.tsx new file mode 100644 index 0000000..3091e83 --- /dev/null +++ b/playground/src/demos.tsx @@ -0,0 +1,595 @@ +import {createSignal, Show} from "solid-js" +import type {JSX} from "@solidjs/web" +import {Motion, Presence, motion, useScroll} from "../../src/index.jsx" +import type {AnimationOptions} from "../../src/index.jsx" + +/* +Every demo the Playwright suite drives, keyed by the `?demo=` id it is +reached at. Each one exposes the state a test needs to assert on as text +inside a `data-testid` node, so assertions do not depend on reading a +half-finished animation's interpolated style. +*/ + +const box = { + width: "80px", + height: "80px", + "border-radius": "8px", + background: "royalblue", +} as const + +function Status(props: {id: string; value: string}): JSX.Element { + return ( +

+ {props.value} +

+ ) +} + +/* -------------------------------- rendering ------------------------------- */ + +const ProxyTags = (): JSX.Element => ( +
+ + span + + button + + + + + li via tag prop + + +
+) + +const StyleMerging = (): JSX.Element => ( +
+ + +
+) + +const SvgAttrs = (): JSX.Element => ( + + + +) + +/* --------------------------------- animate -------------------------------- */ + +const BasicEnter = (): JSX.Element => ( + +) + +const InitialFalse = (): JSX.Element => ( + +) + +const NoOpWhenEqual = (): JSX.Element => { + const [starts, setStarts] = createSignal(0) + const target = {opacity: 0.6} + return ( +
+ + setStarts(n => n + 1)} + /> +
+ ) +} + +const ReactiveAnimate = (): JSX.Element => { + const [opacity, setOpacity] = createSignal(0.25) + return ( +
+ + +
+ ) +} + +/* -------------------------------- gestures -------------------------------- */ + +const Hover = (): JSX.Element => { + const [status, setStatus] = createSignal("idle") + return ( +
+ + setStatus("active")} + onHoverEnd={() => setStatus("idle")} + /> +
+ ) +} + +const Press = (): JSX.Element => { + const [status, setStatus] = createSignal("idle") + return ( +
+ + setStatus("active")} + onPressEnd={() => setStatus("idle")} + /> +
+ ) +} + +/* Press must win over hover for overlapping keys, since it layers on top. */ +const HoverAndPress = (): JSX.Element => { + const [hover, setHover] = createSignal("idle") + const [press, setPress] = createSignal("idle") + return ( +
+ + + setHover("active")} + onHoverEnd={() => setHover("idle")} + onPressStart={() => setPress("active")} + onPressEnd={() => setPress("idle")} + /> +
+ ) +} + +/* +A gesture with no `animate` base: the resolved target on hover-out is empty, +which currently leaves the element stuck on the hover values. +*/ +const HoverNoBase = (): JSX.Element => ( + +) + +/* --------------------------------- inView --------------------------------- */ + +const InView = (): JSX.Element => { + const [status, setStatus] = createSignal("not yet") + const [entries, setEntries] = createSignal("none") + return ( +
+ + +
+ { + setStatus("entered") + // guards against the handler being handed the element instead + setEntries(String(event.detail.originalEntry.isIntersecting)) + }} + onViewLeave={() => setStatus("left")} + /> +
+
+ ) +} + +/* inView layered under hover: hovering must not drop the inView values. */ +const InViewWithHover = (): JSX.Element => ( +
+
+ +
+
+) + +const InViewAmount = (): JSX.Element => { + const [status, setStatus] = createSignal("not yet") + return ( +
+ +
+ setStatus("entered")} + onViewLeave={() => setStatus("left")} + /> +
+
+ ) +} + +/* -------------------------------- presence -------------------------------- */ + +const PresenceBasic = (): JSX.Element => { + const [show, setShow] = createSignal(true) + return ( +
+ + + + + + +
+ ) +} + +/* An `exit` that resolves to nothing must still let the element be removed. */ +const PresenceEmptyExit = (): JSX.Element => { + const [show, setShow] = createSignal(true) + return ( +
+ + + + + + +
+ ) +} + +const PresenceExitBeforeEnter = (): JSX.Element => { + const [condition, setCondition] = createSignal(true) + const El = (props: {label: string}): JSX.Element => ( + + ) + return ( +
+ + + } fallback={} /> + +
+ ) +} + +/* +The parallel-mode swap: the incoming element is briefly torn down and +remounted while the outgoing one exits, and must not be left pinned to its +exit target afterwards. +*/ +const PresenceParallelSwap = (): JSX.Element => { + const [key, setKey] = createSignal(1) + const [opacity, setOpacity] = createSignal(0.5) + return ( +
+ + + + + {k => ( + + )} + + +
+ ) +} + +const PresenceNestedExit = (): JSX.Element => { + const [show, setShow] = createSignal(true) + // long enough that a mid-exit assertion cannot race the animation finishing + const exit = {opacity: 0, transition: {duration: 1}} + return ( +
+ + + + + + + + +
+ ) +} + +/* `initial={false}` suppresses only the children present on the first render. */ +const PresenceInitialFalse = (): JSX.Element => { + const [show, setShow] = createSignal(false) + return ( +
+ + + + } + > + + + +
+ ) +} + +/* -------------------------------- variants -------------------------------- */ + +const Variants = (): JSX.Element => ( + +) + +/* A descendant with no `initial` inherits the ancestor's variant key. */ +const VariantInheritance = (): JSX.Element => ( + + + +) + +/* Swapping the variants map under an unchanged `animate` key must re-animate. */ +const ReactiveVariants = (): JSX.Element => { + const [variants, setVariants] = createSignal({on: {opacity: 0.3}}) + return ( +
+ + +
+ ) +} + +/* ------------------------------- transitions ------------------------------ */ + +/* `easing` is Motion One's spelling, translated internally to `ease`. */ +const LegacyEasing = (): JSX.Element => ( + +) + +/* A per-value override inherits what it does not restate from the base. */ +const PerValueOverride = (): JSX.Element => ( + +) + +/* A target's own `transition` wins over the component-level one. */ +const PerTargetOverride = (): JSX.Element => ( + +) + +const Keyframes = (): JSX.Element => ( + +) + +/* ------------------------------- primitives ------------------------------- */ + +const RefFactory = (): JSX.Element => ( +
({ + initial: {opacity: 0, y: -20}, + animate: {opacity: 1, y: 0}, + transition: {duration: 0.2}, + }))} + /> +) + +const UseScroll = (): JSX.Element => { + const {scrollY} = useScroll() + return ( +
+

+ {scrollY().progress.toFixed(2)} +

+
Scroll
+
+ ) +} + +export const DEMOS: Record JSX.Element> = { + "proxy-tags": ProxyTags, + "style-merging": StyleMerging, + "svg-attrs": SvgAttrs, + "basic-enter": BasicEnter, + "initial-false": InitialFalse, + "no-op-when-equal": NoOpWhenEqual, + "reactive-animate": ReactiveAnimate, + hover: Hover, + press: Press, + "hover-and-press": HoverAndPress, + "hover-no-base": HoverNoBase, + "in-view": InView, + "in-view-with-hover": InViewWithHover, + "in-view-amount": InViewAmount, + "presence-basic": PresenceBasic, + "presence-empty-exit": PresenceEmptyExit, + "presence-exit-before-enter": PresenceExitBeforeEnter, + "presence-parallel-swap": PresenceParallelSwap, + "presence-nested-exit": PresenceNestedExit, + "presence-initial-false": PresenceInitialFalse, + variants: Variants, + "variant-inheritance": VariantInheritance, + "reactive-variants": ReactiveVariants, + "legacy-easing": LegacyEasing, + "per-value-override": PerValueOverride, + "per-target-override": PerTargetOverride, + keyframes: Keyframes, + "ref-factory": RefFactory, + "use-scroll": UseScroll, +} diff --git a/playground/src/main.tsx b/playground/src/main.tsx new file mode 100644 index 0000000..cb7b612 --- /dev/null +++ b/playground/src/main.tsx @@ -0,0 +1,39 @@ +import {render} from "@solidjs/web" +import {Show} from "solid-js" +import type {JSX} from "@solidjs/web" +import {DEMOS} from "./demos.jsx" + +/* +No router: the demo is picked from `?demo=` so a Playwright test can +navigate straight to one. Without the parameter this renders an index of +every demo, which doubles as the manual replacement for the Storybook +sidebar when running `pnpm dev`. +*/ +function App(): JSX.Element { + const id = new URLSearchParams(window.location.search).get("demo") + const Demo = id ? DEMOS[id] : undefined + + return ( + +

solid-motion playground

+ +

Unknown demo: {id}

+
+
    + {Object.keys(DEMOS).map(key => ( +
  • + {key} +
  • + ))} +
+ + } + /> + ) +} + +render(() => , document.getElementById("root")!) diff --git a/stories/tsconfig.json b/playground/tsconfig.json similarity index 66% rename from stories/tsconfig.json rename to playground/tsconfig.json index 943cb4d..ee9dddd 100644 --- a/stories/tsconfig.json +++ b/playground/tsconfig.json @@ -3,6 +3,7 @@ "compilerOptions": { "lib": ["ESNext", "DOM"], "jsx": "preserve", - "jsxImportSource": "@solidjs/web" + "jsxImportSource": "@solidjs/web", + "types": ["node"] } } diff --git a/playground/vite.config.ts b/playground/vite.config.ts new file mode 100644 index 0000000..e3b0fac --- /dev/null +++ b/playground/vite.config.ts @@ -0,0 +1,15 @@ +import {defineConfig} from "vite" +import solid from "@solidjs/vite-plugin" +import {fileURLToPath} from "node:url" + +/* +The playground is the app the Playwright suite drives. It replaces the old +Storybook setup: every demo is a plain route, so a test can navigate straight +to `?demo=` instead of going through a story runner. +*/ +export default defineConfig({ + root: fileURLToPath(new URL(".", import.meta.url)), + plugins: [solid()], + server: {port: 5173}, + preview: {port: 5173}, +}) diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..ee9b5da --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,38 @@ +import {defineConfig, devices} from "@playwright/test" + +const PORT = 5173 +const BASE_URL = `http://localhost:${PORT}` + +/* +The Playwright suite covers what jsdom cannot: real animation interpolation +through the Web Animations API, real IntersectionObserver for `inView`, real +pointer input for `hover`/`press`, and real scrolling for `useScroll`. The +Vitest suite covers the state machine itself. + +Tests run against the playground app in `playground/`, which exposes one demo +per `?demo=` route. +*/ +export default defineConfig({ + testDir: "./e2e", + fullyParallel: true, + forbidOnly: !!process.env["CI"], + retries: process.env["CI"] ? 2 : 0, + workers: process.env["CI"] ? 1 : undefined, + reporter: process.env["CI"] ? "github" : "list", + use: { + baseURL: BASE_URL, + trace: "on-first-retry", + }, + projects: [ + {name: "chromium", use: {...devices["Desktop Chrome"]}}, + {name: "firefox", use: {...devices["Desktop Firefox"]}}, + {name: "webkit", use: {...devices["Desktop Safari"]}}, + ], + webServer: { + command: `pnpm run dev --port ${PORT}`, + url: BASE_URL, + reuseExistingServer: !process.env["CI"], + stdout: "ignore", + stderr: "pipe", + }, +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ac7bf14..1f8ec92 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,39 +36,33 @@ importers: specifier: ^13.0.0 version: 13.0.0 devDependencies: - '@babel/preset-env': - specifier: ^7.23.7 - version: 7.26.9(@babel/core@7.26.10) - '@babel/preset-typescript': - specifier: ^7.23.3 - version: 7.27.0(@babel/core@7.26.10) - '@jest/types': - specifier: ^29.6.3 - version: 29.6.3 + '@playwright/test': + specifier: ^1.62.1 + version: 1.62.1 '@solidjs/testing-library': specifier: 1.0.0-beta.2 version: 1.0.0-beta.2(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(solid-js@2.0.0-rc.3) + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.37 + version: 3.0.0-next.37(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.3)(vite@8.2.2(@types/node@22.20.1)(esbuild@0.25.3)) '@solidjs/web': specifier: 2.0.0-rc.3 version: 2.0.0-rc.3(solid-js@2.0.0-rc.3) - '@types/jest': - specifier: ^29.5.11 - version: 29.5.14 + '@testing-library/jest-dom': + specifier: ^6.9.1 + version: 6.9.1 '@types/node': - specifier: ^20.10.6 - version: 20.17.31 + specifier: ^22.12.0 + version: 22.20.1 '@typescript-eslint/eslint-plugin': specifier: ^6.17.0 version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^6.17.0 version: 6.21.0(eslint@8.57.1)(typescript@5.8.3) - babel-jest: - specifier: ^29.7.0 - version: 29.7.0(@babel/core@7.26.10) - babel-preset-solid: - specifier: 2.0.0-rc.2 - version: 2.0.0-rc.2(@babel/core@7.26.10)(solid-js@2.0.0-rc.3) + '@vitest/coverage-v8': + specifier: ^4.1.11 + version: 4.1.11(vitest@4.1.11) eslint: specifier: ^8.56.0 version: 8.57.1 @@ -78,24 +72,15 @@ importers: eslint-plugin-no-only-tests: specifier: ^3.1.0 version: 3.3.0 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@20.17.31) - jest-environment-jsdom: - specifier: ^29.7.0 - version: 29.7.0 + jsdom: + specifier: ^30.0.1 + version: 30.0.1 prettier: specifier: ^3.1.1 version: 3.5.3 solid-js: specifier: 2.0.0-rc.3 version: 2.0.0-rc.3 - storybook: - specifier: 10.5.10 - version: 10.5.10(prettier@3.5.3)(react@19.2.8) - storybook-solidjs-vite: - specifier: 10.7.1 - version: 10.7.1(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(esbuild@0.25.3)(rollup@4.40.0)(solid-js@2.0.0-rc.3)(storybook@10.5.10(prettier@3.5.3)(react@19.2.8))(typescript@5.8.3)(vite-plugin-solid@3.0.0-next.27(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.3)(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)))(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)) tsup: specifier: ^8.0.1 version: 8.4.0(postcss@8.5.26)(typescript@5.8.3) @@ -107,10 +92,10 @@ importers: version: 5.8.3 vite: specifier: ^8.2.2 - version: 8.2.2(@types/node@20.17.31)(esbuild@0.25.3) - vite-plugin-solid: - specifier: 3.0.0-next.27 - version: 3.0.0-next.27(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.3)(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)) + version: 8.2.2(@types/node@22.20.1)(esbuild@0.25.3) + vitest: + specifier: ^4.1.11 + version: 4.1.11(@types/node@22.20.1)(@vitest/coverage-v8@4.1.11)(jsdom@30.0.1)(vite@8.2.2(@types/node@22.20.1)(esbuild@0.25.3)) packages: @@ -121,6 +106,14 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@asamuzakjp/css-color@6.0.7': + resolution: {integrity: sha512-vC/bk1Lz7Tn/EfU9/apOTBk80/8dyGyWMowPoV1tJ52muDGsDqt2HPT2klrFUiY60MQmQv9q8yIht15JnBgDGw==} + engines: {node: ^22.13.0 || >=24.0.0} + + '@asamuzakjp/dom-selector@8.3.2': + resolution: {integrity: sha512-93Z1N+BQNXysodoicpOIyNh2drHfz/CTf9nnT0FEx72GJcIiwgydD7tGAr78j41LsYn3hlRn+LdGPuBLn1Bl8Q==} + engines: {node: ^22.13.0 || >=24.0.0} + '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} @@ -151,17 +144,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.27.0': - resolution: {integrity: sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-define-polyfill-provider@0.6.4': - resolution: {integrity: sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@babel/helper-member-expression-to-functions@7.25.9': resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} engines: {node: '>=6.9.0'} @@ -188,12 +170,6 @@ packages: resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.25.9': - resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.26.5': resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} engines: {node: '>=6.9.0'} @@ -208,16 +184,20 @@ packages: resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.9': resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.25.9': - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.25.9': - resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} '@babel/helpers@7.27.0': @@ -229,84 +209,10 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': - resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': - resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': - resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': - resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': - resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-async-generators@7.8.4': - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-bigint@7.8.3': - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-class-properties@7.12.13': - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-class-static-block@7.14.5': - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-assertions@7.26.0': - resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-attributes@7.26.0': - resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-meta@7.10.4': - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-json-strings@7.8.3': - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/parser@7.29.8': + resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} + engines: {node: '>=6.0.0'} + hasBin: true '@babel/plugin-syntax-jsx@7.25.9': resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} @@ -314,493 +220,167 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4': - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-numeric-separator@7.10.4': - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-object-rest-spread@7.8.3': - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3': - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-chaining@7.8.3': - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-private-property-in-object@7.14.5': - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-top-level-await@7.14.5': - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.25.9': resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6': - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-arrow-functions@7.25.9': - resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-async-generator-functions@7.26.8': - resolution: {integrity: sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==} + '@babel/plugin-transform-modules-commonjs@7.26.3': + resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.25.9': - resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} + '@babel/plugin-transform-typescript@7.27.0': + resolution: {integrity: sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.26.5': - resolution: {integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==} + '@babel/preset-typescript@7.27.0': + resolution: {integrity: sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.27.0': - resolution: {integrity: sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==} + '@babel/runtime@7.27.0': + resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.25.9': - resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} + '@babel/template@7.27.0': + resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.26.0': - resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} + '@babel/traverse@7.27.0': + resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.25.9': - resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} + '@babel/types@7.27.0': + resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.25.9': - resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.25.9': - resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} - '@babel/plugin-transform-dotall-regex@7.25.9': - resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@bramus/specificity@2.4.2': + resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} + hasBin: true - '@babel/plugin-transform-duplicate-keys@7.25.9': - resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@csstools/color-helpers@6.1.1': + resolution: {integrity: sha512-gLNsunvwf3mCi5u5o46/Z/JcJMnhbHSaZ69rkgPzNM3J4s8hWwpPUQB6/tt0EDFyCiWzxANlx+2LJwpYj4zS1w==} + engines: {node: '>=20.19.0'} - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} - engines: {node: '>=6.9.0'} + '@csstools/css-calc@3.3.0': + resolution: {integrity: sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==} + engines: {node: '>=20.19.0'} peerDependencies: - '@babel/core': ^7.0.0 + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 - '@babel/plugin-transform-dynamic-import@7.25.9': - resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} - engines: {node: '>=6.9.0'} + '@csstools/css-color-parser@4.2.2': + resolution: {integrity: sha512-3QKjR/vxyjcSXBLgb6lP0S3MGdvwbmqSsvLPbYdVORqPDc8FX1HAJ0Spk38bxaRXgvENTA47tlhhbb5Z2e8hEg==} + engines: {node: '>=20.19.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 - '@babel/plugin-transform-exponentiation-operator@7.26.3': - resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==} - engines: {node: '>=6.9.0'} + '@csstools/css-parser-algorithms@4.0.0': + resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} + engines: {node: '>=20.19.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@csstools/css-tokenizer': ^4.0.0 - '@babel/plugin-transform-export-namespace-from@7.25.9': - resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} - engines: {node: '>=6.9.0'} + '@csstools/css-syntax-patches-for-csstree@1.1.12': + resolution: {integrity: sha512-3vLQK+dXxhBMR2Wx99PTCifE+vHtW2ndZWyla8yK813ev6oGhyn8Lja8jCyGAWTJ+LEYZK7EVtJxrDj8ztevJw==} peerDependencies: - '@babel/core': ^7.0.0-0 + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true - '@babel/plugin-transform-for-of@7.26.9': - resolution: {integrity: sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@csstools/css-tokenizer@4.0.0': + resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} + engines: {node: '>=20.19.0'} - '@babel/plugin-transform-function-name@7.25.9': - resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} - engines: {node: '>=6.9.0'} + '@dom-expressions/babel-plugin-jsx@0.50.0-next.44': + resolution: {integrity: sha512-f1kx6TeMQgaLVkGfuxMn0BkH0+HvsycFf1qPHbYoBqmBQd6Ag/EXOxkSpfcaC+UOBMSaF4BKXegGDchRNTWKrg==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.20.12 - '@babel/plugin-transform-json-strings@7.25.9': - resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@emnapi/core@1.11.3': + resolution: {integrity: sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==} - '@babel/plugin-transform-literals@7.25.9': - resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@emnapi/runtime@1.11.3': + resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} - '@babel/plugin-transform-logical-assignment-operators@7.25.9': - resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@emnapi/wasi-threads@1.2.3': + resolution: {integrity: sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==} - '@babel/plugin-transform-member-expression-literals@7.25.9': - resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/aix-ppc64@0.25.3': + resolution: {integrity: sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] - '@babel/plugin-transform-modules-amd@7.25.9': - resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/android-arm64@0.25.3': + resolution: {integrity: sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] - '@babel/plugin-transform-modules-commonjs@7.26.3': - resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/android-arm@0.25.3': + resolution: {integrity: sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] - '@babel/plugin-transform-modules-systemjs@7.25.9': - resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/android-x64@0.25.3': + resolution: {integrity: sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] - '@babel/plugin-transform-modules-umd@7.25.9': - resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/darwin-arm64@0.25.3': + resolution: {integrity: sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@esbuild/darwin-x64@0.25.3': + resolution: {integrity: sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] - '@babel/plugin-transform-new-target@7.25.9': - resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/freebsd-arm64@0.25.3': + resolution: {integrity: sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] - '@babel/plugin-transform-nullish-coalescing-operator@7.26.6': - resolution: {integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/freebsd-x64@0.25.3': + resolution: {integrity: sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] - '@babel/plugin-transform-numeric-separator@7.25.9': - resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-arm64@0.25.3': + resolution: {integrity: sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] - '@babel/plugin-transform-object-rest-spread@7.25.9': - resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-object-super@7.25.9': - resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-optional-catch-binding@7.25.9': - resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-optional-chaining@7.25.9': - resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-parameters@7.25.9': - resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-private-methods@7.25.9': - resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-private-property-in-object@7.25.9': - resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-property-literals@7.25.9': - resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-regenerator@7.27.0': - resolution: {integrity: sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-regexp-modifiers@7.26.0': - resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-reserved-words@7.25.9': - resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-shorthand-properties@7.25.9': - resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-spread@7.25.9': - resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-sticky-regex@7.25.9': - resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-template-literals@7.26.8': - resolution: {integrity: sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typeof-symbol@7.27.0': - resolution: {integrity: sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typescript@7.27.0': - resolution: {integrity: sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-escapes@7.25.9': - resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-property-regex@7.25.9': - resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-regex@7.25.9': - resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-sets-regex@7.25.9': - resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/preset-env@7.26.9': - resolution: {integrity: sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/preset-modules@0.1.6-no-external-plugins': - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - - '@babel/preset-typescript@7.27.0': - resolution: {integrity: sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/runtime@7.27.0': - resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.27.0': - resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.27.0': - resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.27.0': - resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} - engines: {node: '>=6.9.0'} - - '@bcoe/v8-coverage@0.2.3': - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - - '@dom-expressions/babel-plugin-jsx@0.50.0-next.44': - resolution: {integrity: sha512-f1kx6TeMQgaLVkGfuxMn0BkH0+HvsycFf1qPHbYoBqmBQd6Ag/EXOxkSpfcaC+UOBMSaF4BKXegGDchRNTWKrg==} - peerDependencies: - '@babel/core': ^7.20.12 - - '@emnapi/core@1.11.0': - resolution: {integrity: sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q==} - - '@emnapi/core@1.11.3': - resolution: {integrity: sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==} - - '@emnapi/core@1.9.2': - resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} - - '@emnapi/runtime@1.11.0': - resolution: {integrity: sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg==} - - '@emnapi/runtime@1.11.3': - resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} - - '@emnapi/runtime@1.9.2': - resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} - - '@emnapi/wasi-threads@1.2.1': - resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - - '@emnapi/wasi-threads@1.2.2': - resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} - - '@emnapi/wasi-threads@1.2.3': - resolution: {integrity: sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==} - - '@esbuild/aix-ppc64@0.25.3': - resolution: {integrity: sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.25.3': - resolution: {integrity: sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.25.3': - resolution: {integrity: sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.25.3': - resolution: {integrity: sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.25.3': - resolution: {integrity: sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.25.3': - resolution: {integrity: sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.25.3': - resolution: {integrity: sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.25.3': - resolution: {integrity: sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.25.3': - resolution: {integrity: sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.25.3': - resolution: {integrity: sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] + '@esbuild/linux-arm@0.25.3': + resolution: {integrity: sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] '@esbuild/linux-ia32@0.25.3': resolution: {integrity: sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==} @@ -910,6 +490,15 @@ packages: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@exodus/bytes@1.15.1': + resolution: {integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@noble/hashes': ^1.8.0 || ^2.0.0 + peerDependenciesMeta: + '@noble/hashes': + optional: true + '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} @@ -927,87 +516,10 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@istanbuljs/load-nyc-config@1.1.0': - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - - '@jest/console@29.7.0': - resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/core@29.7.0': - resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - '@jest/environment@29.7.0': - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/expect-utils@29.7.0': - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/expect@29.7.0': - resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/fake-timers@29.7.0': - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/globals@29.7.0': - resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/reporters@29.7.0': - resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/source-map@29.6.3': - resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/test-result@29.7.0': - resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/test-sequencer@29.7.0': - resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/transform@29.7.0': - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/types@29.6.3': - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} - '@jridgewell/remapping@2.3.5': - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -1019,9 +531,15 @@ packages: '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@napi-rs/wasm-runtime@1.2.3': resolution: {integrity: sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} @@ -1041,292 +559,80 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxc-parser/binding-android-arm-eabi@0.127.0': - resolution: {integrity: sha512-0LC7ye4hvqbIKxAzThzvswgHLFu2AURKzYLeSVvLdu2TBOYWQDmHnTqPLeA597BcUCxiLqLsS4CJ5uoI5WYWCQ==} + '@oxc-project/types@0.147.0': + resolution: {integrity: sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@playwright/test@1.62.1': + resolution: {integrity: sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ==} + engines: {node: '>=20'} + hasBin: true + + '@rolldown/binding-android-arm-eabi@1.2.6': + resolution: {integrity: sha512-b+jTcARdTiFLI6jB4a5XjTm0RWd6KcRfQj/I2356fxUZemiho9zQLxo0RtCuMDAyKcLo6cEltkgbQp6d1+sjjQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxc-parser/binding-android-arm64@0.127.0': - resolution: {integrity: sha512-b5jtVTH6AU5CJXHNdj7Jj9IEiR9yVjjnwHzPJhGyHGPdcsZSzBCkS9GBbV33niRMvKthDwQRFRJfI4a+k4PvYg==} + '@rolldown/binding-android-arm64@1.2.6': + resolution: {integrity: sha512-lkWU8ZJaRk9q3CIEY1Tc7vIFALp3Xw5NfGJo2hQg5oIqNgxWi1zI+IiDEK3r70BF5Dzol1tcXsnzsRc8NLhG+Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxc-parser/binding-darwin-arm64@0.127.0': - resolution: {integrity: sha512-obCE8B7ISKkJidjlhv9xRGJPOSDG2Yu6PRga9Ruaz35uintHxbp1Ki/Yc71wx4rj3Edrm0a1kzG1TAwit0wFpg==} + '@rolldown/binding-darwin-arm64@1.2.6': + resolution: {integrity: sha512-dgR56NYnvAszm7Ob1B2/Vn0e8bUQYZH2UjVaMMtMVOCKFSfjhfLmuA/9+O+F+ajUdG6B/bSssrKW6JJYASa8jA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxc-parser/binding-darwin-x64@0.127.0': - resolution: {integrity: sha512-JL6Xb5IwPQT8rUzlpsX7E+AgfcdNklXNPFp8pjCQQ5MQOQo5rtEB2ui+3Hgg9Sn7Y9Egj6YOLLiHhLpdAe12Aw==} + '@rolldown/binding-darwin-x64@1.2.6': + resolution: {integrity: sha512-vpVxFvUCFioJqug7OTvqptkc4yb8UX0AwfDmJpaR/0sWz+BUmqSVAf7c8JkUgnN8YLspb4a/N6NhTyMAmdyQ7Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxc-parser/binding-freebsd-x64@0.127.0': - resolution: {integrity: sha512-SDQ/3MQFw58fqQz3Z1PhSKFF3JoCF4gmlNjziDm8X02tTahCw0qJbd7FGPDKw1i4VTBZene9JPyC3mHtSvi+wA==} + '@rolldown/binding-freebsd-x64@1.2.6': + resolution: {integrity: sha512-h1wG6Y6K3JlRswxsI64qQJqBAy4vrLuHgRbc8CZMGSWTOFRY6ghMApM1NKzB2I0n5xV1fjkE18SuVl2QpLeNpA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxc-parser/binding-linux-arm-gnueabihf@0.127.0': - resolution: {integrity: sha512-Av+D1MIqzV0YMGPT9we2SIZaMKD7Cxs4CvXSx/yxaWHewZjYEjScpOf5igc8IILASViw4WTnjlwUdI1KzVtDHQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - - '@oxc-parser/binding-linux-arm-musleabihf@0.127.0': - resolution: {integrity: sha512-Cs2fdJ8cPpFdeebj6p4dag8A4+56hPvZ0AhQQzlaLswGz1tz7bXt1nETLeorrM9+AMcWFFkqxcXwDGfTVidY8g==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.6': + resolution: {integrity: sha512-tbCiqub0q2MVWJKgF5PoAlNWCtQydiOYSLIkd8sByqK/6MMYLJRcSXSYodqYtd0O+Fw7QaVmKKlS4oL94YRZ0w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm64-gnu@0.127.0': - resolution: {integrity: sha512-qdOfTcT6SY8gsJrrV92uyEUyjqMGPpIB5JZUG6QN5dukYd+7/j0kX6MwK1DgQj39jtUYixxPiaRUiEN1+0CXgQ==} + '@rolldown/binding-linux-arm64-gnu@1.2.6': + resolution: {integrity: sha512-oxK9+baEBPhZG5HB4URY+uU04zJWeZlH6Tb9rB5DK4DF9XR1uXNLXt5Q5ZsugTKayNCNLhkcwz/ye74hRI98dg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@oxc-parser/binding-linux-arm64-musl@0.127.0': - resolution: {integrity: sha512-EoTCZneNFU/P2qrpEM+RHmQwt+CvDkyGESG6qhr7KaegXLZwePfbrkCDfAk8/rhxbDUVGsZILX+2tqPzFtoFWA==} + '@rolldown/binding-linux-arm64-musl@1.2.6': + resolution: {integrity: sha512-muWCk27FVBEZtv0MsK8gnfSmgczA8KQ0uRVJbTABKhkRfQc38aUrcb7fhi3BNiyseFmgcRsoMfQsSNJ+DbZdSw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@oxc-parser/binding-linux-ppc64-gnu@0.127.0': - resolution: {integrity: sha512-zALjmZYgxFLHjXeudcDF0xFGNydTAtkAeXAr2EuC17ywCyFxcmQra4w0BMde0Yi/re4Bi4iwEoEXtYN7l6eBLQ==} + '@rolldown/binding-linux-ppc64-gnu@1.2.6': + resolution: {integrity: sha512-eWDoSfU7Co2qj3vgB3Dt4lj1mG6CoWbcJQkRMP3XJplyCMtuaq3LHvPFjS9QIPvMGWVadJC04Xiy0IdcVPtnwQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - '@oxc-parser/binding-linux-riscv64-gnu@0.127.0': - resolution: {integrity: sha512-fPP8M6zQLS7Jz7o9d5ArUSuAuSK3e+WCYVrCpdzeCOejidtZExJ9tjhDrAd3HEPqARBCPmdpqxESPFqy44vkBQ==} + '@rolldown/binding-linux-s390x-gnu@1.2.6': + resolution: {integrity: sha512-2bWNjRSIayvupRKxXUY2tWG9fYdoUlTqWywHRvE8Eq3GvuQ+f2HeIkve697fIt+IQs/PV8yFsdWuhp1aJ1PdnA==} engines: {node: ^20.19.0 || >=22.12.0} - cpu: [riscv64] + cpu: [s390x] os: [linux] - '@oxc-parser/binding-linux-riscv64-musl@0.127.0': - resolution: {integrity: sha512-7IcC4Ao02oGpfnjt+X/oF4U2mllo2qoSkw5xxiXNKL9MCTsTiAC6616beOuehdxGcnz1bRoPC1RQ2f1GQDdN+g==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [riscv64] - os: [linux] - - '@oxc-parser/binding-linux-s390x-gnu@0.127.0': - resolution: {integrity: sha512-pbXIhiNFHoqWeqDNLiJ9JkpHz1IM9k4DXa66x+1GTWMG7iLxtkXgE53iiuKSXwmk3zIYmaPVfBvgcAhS583K4Q==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [s390x] - os: [linux] - - '@oxc-parser/binding-linux-x64-gnu@0.127.0': - resolution: {integrity: sha512-MYCguB9RvBvlSd6gbuNI7QwiLoCCAlGnlRJFPrzLI6U1/9wkC/WK6LtBAUln55H1Ctqw45PWmqrobKoMhsYQzQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - - '@oxc-parser/binding-linux-x64-musl@0.127.0': - resolution: {integrity: sha512-5eY0B/bxf1xIUxb4NOTvOI3KWtBQfPWYyKAzgcrCt0mDibSZygVpO1Pz8bkeiSZ5Jj9+M09dkggG3H8I5d0Uyg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - - '@oxc-parser/binding-openharmony-arm64@0.127.0': - resolution: {integrity: sha512-Gld0ajrFTUXNtdw20fVBuTQx66FA75nIVg+//pPfR3sXkuABB4mTBhl3r9JNzrJpgW//qiwxf0nWXUWGJSL3UQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [openharmony] - - '@oxc-parser/binding-wasm32-wasi@0.127.0': - resolution: {integrity: sha512-T6KVD7rhLzFlwGRXMnxUFfkCZD8FHnb968wVXW1mXzgRFc5RNXOBY2mPPDZ77x5Ln76ltLMgtPg0cOkU1NSrEQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [wasm32] - - '@oxc-parser/binding-win32-arm64-msvc@0.127.0': - resolution: {integrity: sha512-Ujvw4X+LD1CCGULcsQcvb4YNVoBGqt+JHgNNzGGaCImELiZLk477ifUH53gIbE7EKd933NdTi25JWEr9K2HwXw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] - - '@oxc-parser/binding-win32-ia32-msvc@0.127.0': - resolution: {integrity: sha512-0cwxKO7KHQQQfo4Uf4B2SQrhgm+cJaP9OvFFhx52Tkg4bezsacu83GB2/In5bC415Ueeym+kXdnge/57rbSfTw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ia32] - os: [win32] - - '@oxc-parser/binding-win32-x64-msvc@0.127.0': - resolution: {integrity: sha512-rOrnSQSCbhI2kowr9XxE7m9a8oQXnBHjnS6j95LxxAnEZ0+Fz20WlRXG4ondQb+ejjt2KOsa65sE6++L6kUd+w==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] - - '@oxc-project/types@0.127.0': - resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} - - '@oxc-project/types@0.147.0': - resolution: {integrity: sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg==} - - '@oxc-resolver/binding-android-arm-eabi@11.21.2': - resolution: {integrity: sha512-xQoCRv+gKax9KTdwdaQNnAFOai8neay7g3jExDIORzhbrejwGSJaZNTdOJHR5ziLg2joMxOCMOFMo4zuxza2uQ==} - cpu: [arm] - os: [android] - - '@oxc-resolver/binding-android-arm64@11.21.2': - resolution: {integrity: sha512-HF5oiE2L05yInPYCFD/4uxSrEZW4SuIfn99Y6L1xnJnzl066JR+MJs2rIdstw8A2MPlAKH+13dpFPNycjqzvGg==} - cpu: [arm64] - os: [android] - - '@oxc-resolver/binding-darwin-arm64@11.21.2': - resolution: {integrity: sha512-UX4u49CVCAD8QZNELaW8eMGgMAGwFWYEPbvNsh+3r/gs4NX3KfpiACMVwRQT0EuH3uat9hM5Zl+Ppm9pJD8tgg==} - cpu: [arm64] - os: [darwin] - - '@oxc-resolver/binding-darwin-x64@11.21.2': - resolution: {integrity: sha512-J9xPx7YBkrRmJ+xl561ztnMWEc1aOyjEIxBiGX1dVb3u7bGSnfObfcZk+Pd+uM0HZAPNsQ1xvD8j52A/uOSqNQ==} - cpu: [x64] - os: [darwin] - - '@oxc-resolver/binding-freebsd-x64@11.21.2': - resolution: {integrity: sha512-fRlt7OvSaQkWj6+EDTVxawVxOlqJB2QSnBfkeCyK4RTvsGctbw3BiH2Tb7DzMs7bikc4BRBpvWP5zF9K8b54Zg==} - cpu: [x64] - os: [freebsd] - - '@oxc-resolver/binding-linux-arm-gnueabihf@11.21.2': - resolution: {integrity: sha512-gK+vPUcPQITkGwBKpZGrcDHSlU6eDGl7AQacxS2CEKAZIBHWkOVFeJwLZ4tYnA1acJqRM5lt7yYwPCVqGHIJ7A==} - cpu: [arm] - os: [linux] - - '@oxc-resolver/binding-linux-arm-musleabihf@11.21.2': - resolution: {integrity: sha512-L/Rgas7SrOKy/z7IH+HxSFRqVO4PuLDKLEGKvnhoCBBq3UJ0YzGBou3qMzaAGgkJwsIvX2pBF+7ojzfUhLiZxQ==} - cpu: [arm] - os: [linux] - - '@oxc-resolver/binding-linux-arm64-gnu@11.21.2': - resolution: {integrity: sha512-CUEYvlX1Fk7E9kUMzuswru1J9HLxMwnpDeQGjQuI4ZH+iNCoa2X9T+pvyzrbsgl7WnIeTFTlNlHsRfVdf5g9/g==} - cpu: [arm64] - os: [linux] - - '@oxc-resolver/binding-linux-arm64-musl@11.21.2': - resolution: {integrity: sha512-ViN1ZibQyxwC67GpoP33oo+S9UyUnkog13vzQb9+v9bCNvrVzJuk0MRdacjtv/9xfRMVF/eqHFyl8YOeykI10Q==} - cpu: [arm64] - os: [linux] - - '@oxc-resolver/binding-linux-ppc64-gnu@11.21.2': - resolution: {integrity: sha512-CU1sCqWnhGqYD5I1HedHk5pujrn7ssDkNB/AEQd/pd3D/EojVSgJUlpbafwIbyhia3PgIfkvdFpRPWSALzVumA==} - cpu: [ppc64] - os: [linux] - - '@oxc-resolver/binding-linux-riscv64-gnu@11.21.2': - resolution: {integrity: sha512-jWVyZtIHca4Gb96x7dag+y69vlei7ffjrsveLkmf2ZhqEAz6ZSBnY1GWvgZUaZlwZP62A3xD092BW97Q5VGc+g==} - cpu: [riscv64] - os: [linux] - - '@oxc-resolver/binding-linux-riscv64-musl@11.21.2': - resolution: {integrity: sha512-LF29obFqNgBUgDX7rmUK7M4D0JQG5LxhYzn3xXmECcHU9aQAdWG7NiY052qybtesEdwHQXKNTWYQ7mTsybNvWg==} - cpu: [riscv64] - os: [linux] - - '@oxc-resolver/binding-linux-s390x-gnu@11.21.2': - resolution: {integrity: sha512-+NYcm+cCHBbtdQQ3A4phQTSuVRYnNHz7wrl9XRAPEovcdoqi0mb1K5ZOl+jN54ZD+q1zz3V0vltbFJmzecJKmw==} - cpu: [s390x] - os: [linux] - - '@oxc-resolver/binding-linux-x64-gnu@11.21.2': - resolution: {integrity: sha512-UQqZDdG2r2HhAOsZEgufkIWHPQ886IUyuJQkoZByvzhW8j51R4UNzGBJFkTiTnLhQnggwJRdJgFWK4uY6ZVIMw==} - cpu: [x64] - os: [linux] - - '@oxc-resolver/binding-linux-x64-musl@11.21.2': - resolution: {integrity: sha512-3Q9PMRjalWkT6NZ4jfujuqTCFwoWErg3y3BnOgb544B8IMw4PktiwWOigMfOHNRLMghZeJ7hpfpZf4CP7rV7Og==} - cpu: [x64] - os: [linux] - - '@oxc-resolver/binding-openharmony-arm64@11.21.2': - resolution: {integrity: sha512-Eljeq3ndtyKhM+Es8LITi4Zl2htzuRZcrPMF3kMCsrILztvU6AjZ3FuEhHHKobPUB9rMpzLpJP5bDqXI7r+iog==} - cpu: [arm64] - os: [openharmony] - - '@oxc-resolver/binding-wasm32-wasi@11.21.2': - resolution: {integrity: sha512-HGDbNsIywqc4LxU38+CTJNnB/6BF7rheWOJ259b4eE0aEnelYblC8x+1tEd63bp31fYne63RQz9Jb4yVnC7Yig==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@oxc-resolver/binding-win32-arm64-msvc@11.21.2': - resolution: {integrity: sha512-iWx25CBEgH49iE9q5coEGI/jb1jl5kkCY9z6U5Og67xCkQ/WFMDc2J5U78+AE91SUxM2NqSLhJC8/PLfWnImww==} - cpu: [arm64] - os: [win32] - - '@oxc-resolver/binding-win32-x64-msvc@11.21.2': - resolution: {integrity: sha512-VPoCAhKvCQTlG7vxqaBXcmuvbh77BfnGXj8g0pbvVXpm1F/R8rDVwqIWcEbMzrI1JvJlm8v7T9uMVQb6UctMRg==} - cpu: [x64] - os: [win32] - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@rolldown/binding-android-arm-eabi@1.2.6': - resolution: {integrity: sha512-b+jTcARdTiFLI6jB4a5XjTm0RWd6KcRfQj/I2356fxUZemiho9zQLxo0RtCuMDAyKcLo6cEltkgbQp6d1+sjjQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [android] - - '@rolldown/binding-android-arm64@1.2.6': - resolution: {integrity: sha512-lkWU8ZJaRk9q3CIEY1Tc7vIFALp3Xw5NfGJo2hQg5oIqNgxWi1zI+IiDEK3r70BF5Dzol1tcXsnzsRc8NLhG+Q==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [android] - - '@rolldown/binding-darwin-arm64@1.2.6': - resolution: {integrity: sha512-dgR56NYnvAszm7Ob1B2/Vn0e8bUQYZH2UjVaMMtMVOCKFSfjhfLmuA/9+O+F+ajUdG6B/bSssrKW6JJYASa8jA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [darwin] - - '@rolldown/binding-darwin-x64@1.2.6': - resolution: {integrity: sha512-vpVxFvUCFioJqug7OTvqptkc4yb8UX0AwfDmJpaR/0sWz+BUmqSVAf7c8JkUgnN8YLspb4a/N6NhTyMAmdyQ7Q==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [darwin] - - '@rolldown/binding-freebsd-x64@1.2.6': - resolution: {integrity: sha512-h1wG6Y6K3JlRswxsI64qQJqBAy4vrLuHgRbc8CZMGSWTOFRY6ghMApM1NKzB2I0n5xV1fjkE18SuVl2QpLeNpA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] - - '@rolldown/binding-linux-arm-gnueabihf@1.2.6': - resolution: {integrity: sha512-tbCiqub0q2MVWJKgF5PoAlNWCtQydiOYSLIkd8sByqK/6MMYLJRcSXSYodqYtd0O+Fw7QaVmKKlS4oL94YRZ0w==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - - '@rolldown/binding-linux-arm64-gnu@1.2.6': - resolution: {integrity: sha512-oxK9+baEBPhZG5HB4URY+uU04zJWeZlH6Tb9rB5DK4DF9XR1uXNLXt5Q5ZsugTKayNCNLhkcwz/ye74hRI98dg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - - '@rolldown/binding-linux-arm64-musl@1.2.6': - resolution: {integrity: sha512-muWCk27FVBEZtv0MsK8gnfSmgczA8KQ0uRVJbTABKhkRfQc38aUrcb7fhi3BNiyseFmgcRsoMfQsSNJ+DbZdSw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - - '@rolldown/binding-linux-ppc64-gnu@1.2.6': - resolution: {integrity: sha512-eWDoSfU7Co2qj3vgB3Dt4lj1mG6CoWbcJQkRMP3XJplyCMtuaq3LHvPFjS9QIPvMGWVadJC04Xiy0IdcVPtnwQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ppc64] - os: [linux] - - '@rolldown/binding-linux-s390x-gnu@1.2.6': - resolution: {integrity: sha512-2bWNjRSIayvupRKxXUY2tWG9fYdoUlTqWywHRvE8Eq3GvuQ+f2HeIkve697fIt+IQs/PV8yFsdWuhp1aJ1PdnA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [s390x] - os: [linux] - - '@rolldown/binding-linux-x64-gnu@1.2.6': - resolution: {integrity: sha512-KekI0gS0wLxe1UBSQSjenBVwou/JkcQPDzBPICGZjxUv9k3RteHDPBQaiOicZUFKRIH2wKEimGwVpnJsbPzu7w==} + '@rolldown/binding-linux-x64-gnu@1.2.6': + resolution: {integrity: sha512-KekI0gS0wLxe1UBSQSjenBVwou/JkcQPDzBPICGZjxUv9k3RteHDPBQaiOicZUFKRIH2wKEimGwVpnJsbPzu7w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -1458,15 +764,6 @@ packages: cpu: [x64] os: [win32] - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - - '@sinonjs/commons@3.0.1': - resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - - '@sinonjs/fake-timers@10.3.0': - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - '@solid-primitives/props@4.0.0-next.3': resolution: {integrity: sha512-V2Gn96sQLLhwyiAcGogExqP8+5++Itv0/KBQMNiNp/ldNwbQkr8Q11Ku5VXswYFiFmuiHJ/pGANfwzgsla7zpA==} peerDependencies: @@ -1490,42 +787,42 @@ packages: '@solidjs/web': ^2.0.0-rc.0 solid-js: ^2.0.0-rc.0 - '@solidjs/babel-plugin@2.0.0-rc.4': - resolution: {integrity: sha512-4RYR4PWAlQIz1dmIyPheaUvVb9EnSIw5KIGsEISmHod5qfT1IPVKgtb9bctyQ5FeDAuc7JcpbkFYN2heLrk6rQ==} + '@solidjs/babel-plugin@2.0.0-rc.5': + resolution: {integrity: sha512-Wd2cHNSRBxisVXTsl0Nq+21+0DFVYeKLQxnZqQqxCqXM8cEnijv6tfcIUzlSEp3esEyQD0gXnbQpSOyoLkHCwg==} peerDependencies: '@babel/core': ^7.20.12 - '@solidjs/compiler-darwin-arm64@2.0.0-rc.4': - resolution: {integrity: sha512-YR4T15ucsV1Vb4J6yaHxss2hakdcbZ353ye53AhX+FWNayuEhO/Cyjdtb9uS38Dfzysok/rIEQdaeZcaXt+rPA==} + '@solidjs/compiler-darwin-arm64@2.0.0-rc.5': + resolution: {integrity: sha512-rCSbArP+hLkYeUPdw6OisdQD313VxP+oaI7FOLohSx1FfiEOVwyAvKgYqGROe4T0ZZXjgTkSZUKHBzbG468j4A==} cpu: [arm64] os: [darwin] - '@solidjs/compiler-darwin-x64@2.0.0-rc.4': - resolution: {integrity: sha512-95SkVSyXP2eh7PvPWi+fTeH5aTcTwOUvRV7ubeUrutE4akW3ndq1N8cvg2WZ+LhKrf2pvDO0eSDEZ72I769CLg==} + '@solidjs/compiler-darwin-x64@2.0.0-rc.5': + resolution: {integrity: sha512-l1P0zal1yKy2k/TNMqnh2jFf7CkCr2Iu/AM45Rai65NW2n7zgPO+2LY6kDKCO/ooU4ZZ3FdnTKpwza6mT1xqUQ==} cpu: [x64] os: [darwin] - '@solidjs/compiler-linux-arm64-gnu@2.0.0-rc.4': - resolution: {integrity: sha512-36Ht+EUAVUt8fAxq8zlfPS0+vZ61hfJRJDiX1HDNXvlAwZE1B7FH/ym1wfXrhG1TvrNA63Sjjj5CeccYO2H4Tg==} + '@solidjs/compiler-linux-arm64-gnu@2.0.0-rc.5': + resolution: {integrity: sha512-G2BBNzwIUJHtAxPISMjtMi+IsgyCWfJ29tS4MxfUC+Q4aEykTV55ybItAAffwF9YgeHA6JtQY3iVU002QGJDuw==} cpu: [arm64] os: [linux] - '@solidjs/compiler-linux-x64-gnu@2.0.0-rc.4': - resolution: {integrity: sha512-DSFOQEjfYmmRQ70pNLamRXPNQ+aP+5vyh1rMjSKwAzONt0xB2rcy9Alt02GU38gztW9YN6ZyxM4rwkYe+7MfaQ==} + '@solidjs/compiler-linux-x64-gnu@2.0.0-rc.5': + resolution: {integrity: sha512-3ckN7cot0FiUiGUSnnKJON+sOJgIS8zuEXUPUv/ijjE+gA9pEepX8u06/DXzvEXkrDzPHGWrFx+v19Aogl+l5g==} cpu: [x64] os: [linux] - '@solidjs/compiler-wasm32-wasi@2.0.0-rc.4': - resolution: {integrity: sha512-zVxXS+01rbv+0yOp2vaGjIu0om5I1UhhPpzNYeE+AmfpVc2eCWxqDsPai3dIxFDGPTjaJ+npwjKJRmOTaoknRw==} + '@solidjs/compiler-wasm32-wasi@2.0.0-rc.5': + resolution: {integrity: sha512-1l35k2lCYtpIV/RZBqpy9y7JNMruGAlMBZVxjIHDxCJDs9vKLue/7WPT0qg7cm3dCqa69hVxRNBQYqRHLa4P2g==} engines: {node: '>=14.0.0'} - '@solidjs/compiler-win32-x64-msvc@2.0.0-rc.4': - resolution: {integrity: sha512-DkzTHMZXzaiL/KhL76UJWN24pKkkXeLpPYtDxUqX6VaKuOCPDmp/m7GLWSDrqCdF7leuYsig2MuMJTXZRLOkbQ==} + '@solidjs/compiler-win32-x64-msvc@2.0.0-rc.5': + resolution: {integrity: sha512-ZYumQABKyBWv0iEonwcMnrjOt1cKWdjdBeKc9xQ0eNxqMlJsOQvRFMB3Ow7OS2U2aYKfAIzfcPCKgsXv9JbIvA==} cpu: [x64] os: [win32] - '@solidjs/compiler@2.0.0-rc.4': - resolution: {integrity: sha512-lKx6Jp1KbHxqO+v+g7cRbm8I1DHx/10Lj8bKG4vmdGnCfSlFbyhCd8cPTLdLV0YVG7GGSzzF5m8NkC9NlfGN5w==} + '@solidjs/compiler@2.0.0-rc.5': + resolution: {integrity: sha512-DQF24zYiTW4GDhhOTITEjjK1PGvPGx8P3qR6ogWBeaXggeMN6vV2s0oqyrYoJr2g2ufJj1vf2FIdLVDu8Ip7zw==} '@solidjs/signals@2.0.0-rc.3': resolution: {integrity: sha512-/yPhTf3xS1FRR4MX8kTYCd4MjsFxzwkO+KyOTfbu35lTEiaJ4Fxy+JL91XonDzt31GV1mYaZ9CGD2TQIzvXuNA==} @@ -1537,8 +834,8 @@ packages: '@solidjs/web': '>=2.0.0' solid-js: '>=2.0.0' - '@solidjs/vite-plugin@3.0.0-next.36': - resolution: {integrity: sha512-PMreKx9IeQwSRt6xt8LQHe58Gk79CVaB57PQMlvXUdbyL5JliaehOSg5a4W6bKoJfeWku7nryEWUvTDKyZ2PBg==} + '@solidjs/vite-plugin@3.0.0-next.37': + resolution: {integrity: sha512-P1mWQ4TnqZexlVJHGHRlsVRLXfOklx7HrGgC4KBvPZX5v3MUYBNnmIrpxi+nOac5//Qo2pJHzhLj4J5Fx6Mh9g==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: '@solidjs/start-devtools': ^1.0.0-next.2 @@ -1557,37 +854,8 @@ packages: peerDependencies: solid-js: ^2.0.0-rc.3 - '@storybook/builder-vite@10.5.10': - resolution: {integrity: sha512-O4GgIP0tKLRueom3EmU3OaBUHKjNYj+jkOvmTIkn3PYTiWVkCuHqSKEs4ADvRyaQuLH+peHhFe4JtkNC9KbtrQ==} - peerDependencies: - storybook: ^10.5.10 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - - '@storybook/csf-plugin@10.5.10': - resolution: {integrity: sha512-TaCLBrqVEr767+w58QDotDUiCTuE5cyRJuRcDlsKQyUIyGBv+lYD3lu8wBiVCYxgIjB/gu9HmqiC+0yx1rHzaw==} - peerDependencies: - esbuild: '*' - rollup: '*' - storybook: ^10.5.10 - vite: '*' - webpack: '*' - peerDependenciesMeta: - esbuild: - optional: true - rollup: - optional: true - vite: - optional: true - webpack: - optional: true - - '@storybook/global@5.0.0': - resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} - - '@storybook/icons@2.1.0': - resolution: {integrity: sha512-Fxh9vYpX9bQqFeHRiY8h2ApeRGDzRSMLwJwNZ/AIRqnyOKHxRKL+yFe+ctEkVJmuptRE9u1Hrn8ZZNHyfDKKNg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} '@testing-library/dom@10.4.1': resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} @@ -1597,16 +865,6 @@ packages: resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - '@testing-library/user-event@14.6.6': - resolution: {integrity: sha512-Jbs9FpkkIDw8FgSc6kOVsOv8JuuqGAL7J4X1oot77JxAoDlkNn2GRkd0aYRVuQ+pVQAiHWVkE4rX/dkF5fBiCw==} - engines: {node: '>=12', npm: '>=6'} - peerDependencies: - '@testing-library/dom': '>=7.21.4' - - '@tootallnate/once@2.0.0': - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - '@tybys/wasm-util@0.10.3': resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} @@ -1622,8 +880,8 @@ packages: '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.7': - resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -1634,45 +892,15 @@ packages: '@types/estree@1.0.7': resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} - '@types/graceful-fs@4.1.9': - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} - - '@types/istanbul-lib-coverage@2.0.6': - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - - '@types/istanbul-lib-report@3.0.3': - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - - '@types/istanbul-reports@3.0.4': - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - - '@types/jest@29.5.14': - resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} - - '@types/jsdom@20.0.1': - resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} - '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@20.17.31': - resolution: {integrity: sha512-quODOCNXQAbNf1Q7V+fI8WyErOCh0D5Yd31vHnKu4GkSztGQ7rlltAaqXhHhLl33tlVyUXs2386MkANSwgDn6A==} + '@types/node@22.20.1': + resolution: {integrity: sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==} '@types/semver@7.7.0': resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} - '@types/stack-utils@2.0.3': - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - - '@types/tough-cookie@4.0.5': - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - - '@types/yargs-parser@21.0.3': - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - - '@types/yargs@17.0.33': - resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - '@typescript-eslint/eslint-plugin@6.21.0': resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} engines: {node: ^16.0.0 || >=18.0.0} @@ -1731,74 +959,60 @@ packages: resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} engines: {node: ^16.0.0 || >=18.0.0} - '@typescript/typescript6@6.0.2': - resolution: {integrity: sha512-mbCddXd+jm7hfx7w2YU64/Av4/NqqeG3GoRZgxPcgoTxYjhrcfJRw9ULch71SS4G+Q3bOXFhRvPqjguN0Hyp5w==} - hasBin: true - '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@vitest/expect@3.2.4': - resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} - - '@vitest/pretty-format@3.2.4': - resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - - '@vitest/spy@3.2.4': - resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/coverage-v8@4.1.11': + resolution: {integrity: sha512-8MVGEFnJIcdGjcbfKmeq8z0pZHH0JlVtoVZH9Q/qwUp6wyFnEJUBMrw9DCaj+ra3vShGmhavjalMIhPNxZAUcw==} + peerDependencies: + '@vitest/browser': 4.1.11 + vitest: 4.1.11 + peerDependenciesMeta: + '@vitest/browser': + optional: true - '@vitest/utils@3.2.4': - resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@vitest/expect@4.1.11': + resolution: {integrity: sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==} - '@volar/language-core@2.4.28': - resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} + '@vitest/mocker@4.1.11': + resolution: {integrity: sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true - '@volar/source-map@2.4.28': - resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} + '@vitest/pretty-format@4.1.11': + resolution: {integrity: sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw==} - '@volar/typescript@2.4.28': - resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} + '@vitest/runner@4.1.11': + resolution: {integrity: sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw==} - '@webcontainer/env@1.1.1': - resolution: {integrity: sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng==} + '@vitest/snapshot@4.1.11': + resolution: {integrity: sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog==} - abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - deprecated: Use your platform's native atob() and btoa() methods instead + '@vitest/spy@4.1.11': + resolution: {integrity: sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA==} - acorn-globals@7.0.1: - resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} + '@vitest/utils@4.1.11': + resolution: {integrity: sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} - acorn@8.14.1: resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} engines: {node: '>=0.4.0'} hasBin: true - acorn@8.18.0: - resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} - engines: {node: '>=0.4.0'} - hasBin: true - - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1822,13 +1036,6 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -1843,52 +1050,8 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-types@0.16.1: - resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} - engines: {node: '>=4'} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - babel-jest@29.7.0: - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - - babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - - babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - babel-plugin-polyfill-corejs2@0.4.13: - resolution: {integrity: sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-corejs3@0.11.1: - resolution: {integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-regenerator@0.6.4: - resolution: {integrity: sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-preset-current-node-syntax@1.1.0: - resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} - peerDependencies: - '@babel/core': ^7.0.0 - - babel-preset-jest@29.6.3: - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 + ast-v8-to-istanbul@1.0.5: + resolution: {integrity: sha512-UPAgKJFSEGMWSDr3LX4tqnAb4f7KGT8O40Tyx8wbYmmZ/yn58lNCm8h3svs3eXgiGd5AXxz8NDOvXWvicq+rJA==} babel-preset-solid@2.0.0-rc.2: resolution: {integrity: sha512-Venq++Aa6+RzGIAyS5vSo3kX1fE8zRreEPCh1eTh5DTjlTft9qZGIG14RSZDv/sjVxT8x5Gs9+21PzxuLe8U+g==} @@ -1902,6 +1065,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -1917,16 +1083,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - bundle-name@4.1.0: - resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} - engines: {node: '>=18'} - bundle-require@5.1.0: resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1937,63 +1093,25 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - caniuse-lite@1.0.30001715: resolution: {integrity: sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==} - chai@5.3.3: - resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - - check-error@2.1.3: - resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} - engines: {node: '>= 16'} - chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - - cjs-module-lexer@1.4.3: - resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - - co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - - collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -2001,10 +1119,6 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -2019,37 +1133,23 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - core-js-compat@3.41.0: - resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==} - - create-jest@29.7.0: - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - cssom@0.3.8: - resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} - - cssom@0.5.0: - resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} - - cssstyle@2.3.0: - resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} - engines: {node: '>=8'} - csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - data-urls@3.0.2: - resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} - engines: {node: '>=12'} + data-urls@7.0.0: + resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} @@ -2060,44 +1160,12 @@ packages: supports-color: optional: true - decimal.js@10.5.0: - resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} - - dedent@1.5.3: - resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - - default-browser-id@5.0.1: - resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} - engines: {node: '>=18'} - - default-browser@5.5.1: - resolution: {integrity: sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==} - engines: {node: '>=18'} - - define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -2106,14 +1174,6 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -2128,25 +1188,12 @@ packages: dom-accessibility-api@0.6.3: resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} - domexception@4.0.0: - resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} - engines: {node: '>=12'} - deprecated: Use your platform's native DOMException instead - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} electron-to-chromium@1.5.143: resolution: {integrity: sha512-QqklJMOFBMqe46k8iIOwA9l2hz57V2OKMmP5eSWcUvwx+mASAsbU+wkF1pHjn9ZVSBPrsYWr4/W/95y5SwYg2g==} - emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} - emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2157,24 +1204,12 @@ packages: resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} engines: {node: '>=0.12'} - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} + entities@8.0.0: + resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} + engines: {node: '>=20.19.0'} - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} + es-module-lexer@2.3.2: + resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} esbuild-plugin-solid@0.5.0: resolution: {integrity: sha512-ITK6n+0ayGFeDVUZWNMxX+vLsasEN1ILrg4pISsNOQ+mq4ljlJJiuXotInd+HE0MzwTcA9wExT1yzDE2hsqPsg==} @@ -2195,19 +1230,10 @@ packages: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - eslint-plugin-eslint-comments@3.2.0: resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} engines: {node: '>=6.5.0'} @@ -2236,11 +1262,6 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} @@ -2253,21 +1274,16 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - - exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} - - expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} + engines: {node: '>=12.0.0'} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2285,9 +1301,6 @@ packages: fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - fdir@6.4.4: resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} peerDependencies: @@ -2313,10 +1326,6 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -2332,10 +1341,6 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - form-data@4.0.2: - resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} - engines: {node: '>= 6'} - framer-motion@13.1.1: resolution: {integrity: sha512-B/xn2TPS4f61cEBLFjiYlQFnBZUW1YVj/LM+C+N4OP8Rs95VLEI2ot/RlfBg111la/EiyECFaJJi/A3FWA8MUA==} peerDependencies: @@ -2350,38 +1355,20 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2410,13 +1397,6 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} @@ -2424,21 +1404,9 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - html-encoding-sniffer@3.0.0: - resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} - engines: {node: '>=12'} + html-encoding-sniffer@6.0.0: + resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} html-entities@2.3.3: resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} @@ -2446,22 +1414,6 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -2470,11 +1422,6 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} - import-local@3.2.0: - resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} - engines: {node: '>=8'} - hasBin: true - imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -2490,18 +1437,6 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} - - is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2510,19 +1445,10 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -2534,18 +1460,10 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - is-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} - is-wsl@3.1.1: - resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} - engines: {node: '>=16'} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -2553,196 +1471,40 @@ packages: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} - istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} - - istanbul-lib-instrument@6.0.3: - resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} - engines: {node: '>=10'} - istanbul-lib-report@3.0.1: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jest-changed-files@29.7.0: - resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-cli@29.7.0: - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - jest-config@29.7.0: - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - - jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-docblock@29.7.0: - resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-each@29.7.0: - resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-environment-jsdom@29.7.0: - resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - - jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-leak-detector@29.7.0: - resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-pnp-resolver@1.2.3: - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - - jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-resolve-dependencies@29.7.0: - resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-resolve@29.7.0: - resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-runner@29.7.0: - resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-runtime@29.7.0: - resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-snapshot@29.7.0: - resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-watcher@29.7.0: - resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest@29.7.0: - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsdom@20.0.3: - resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} - engines: {node: '>=14'} + jsdom@30.0.1: + resolution: {integrity: sha512-52v7mUVUfNQVYYqE1lcdaymWL0njO7lTLUog6ZvW2U5KsbiLk/GnZlVJ+qx0xfNJZ6Gn+KSpPNE52vurbxZwrA==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} peerDependencies: - canvas: ^2.5.0 + canvas: ^3.2.3 peerDependenciesMeta: canvas: optional: true - jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true - jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -2751,9 +1513,6 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -2765,20 +1524,9 @@ packages: engines: {node: '>=6'} hasBin: true - jsonc-parser@3.3.1: - resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} - keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - - leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -2864,29 +1612,23 @@ packages: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - loupe@3.2.1: - resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.5.2: + resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -2894,24 +1636,23 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magicast@0.5.4: + resolution: {integrity: sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==} + make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} - makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} merge-anything@5.1.7: resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} engines: {node: '>=12.13'} - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -2920,18 +1661,6 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -2971,69 +1700,32 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - - nwsapi@2.2.20: - resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + obug@2.1.4: + resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} + engines: {node: '>=12.20.0'} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - - open@10.2.0: - resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} - engines: {node: '>=18'} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - oxc-parser@0.127.0: - resolution: {integrity: sha512-bkgD4qHlN7WxLdX8bLXdaU54TtQtAIg/ZBAfm0aje/mo3MRDo3P0hZSgr4U7O3xfX+fQmR5AP04JS/TGcZLcFA==} - engines: {node: ^20.19.0 || >=22.12.0} - - oxc-resolver@11.21.2: - resolution: {integrity: sha512-w5tLwYN3Zo24w5EeWJjJWZOwhYqTtC8PS2B1tIt7BZUuqTIcU07sQValbDw+rq7+AuAGzOHklgK+ifsy4lpXfw==} - - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -3041,15 +1733,11 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + parse5@8.0.1: + resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} @@ -3063,9 +1751,6 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.11.1: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} @@ -3074,9 +1759,8 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -3097,9 +1781,15 @@ packages: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} - pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + playwright-core@1.62.1: + resolution: {integrity: sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==} + engines: {node: '>=20'} + hasBin: true + + playwright@1.62.1: + resolution: {integrity: sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==} + engines: {node: '>=20'} + hasBin: true postcss-load-config@6.0.1: resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} @@ -3136,36 +1826,16 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - - psl@1.15.0: - resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - pure-rand@6.1.0: - resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} - - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react@19.2.8: resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==} engines: {node: '>=0.10.0'} @@ -3174,49 +1844,17 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} - recast@0.23.21: - resolution: {integrity: sha512-mFAyJq9vUbSTARLZUvAEf1z3YxlvAwswbmxMx2mPA/MSm4KmpwvwvhsH/NIrZhyOuwD60Lzyw2qh83uCbgTPYw==} - engines: {node: '>= 4'} - redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} - regenerate-unicode-properties@10.2.0: - resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} - engines: {node: '>=4'} - - regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - - regexpu-core@6.2.0: - resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} - engines: {node: '>=4'} - - regjsgen@0.8.0: - resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - - regjsparser@0.12.0: - resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} - hasBin: true - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - - resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -3225,15 +1863,6 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve.exports@2.0.3: - resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} - engines: {node: '>=10'} - - resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} - engines: {node: '>= 0.4'} - hasBin: true - reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -3253,16 +1882,9 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - run-applescript@7.1.0: - resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} - engines: {node: '>=18'} - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} @@ -3276,11 +1898,6 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.8.5: - resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} - engines: {node: '>=10'} - hasBin: true - seroval-plugins@1.5.6: resolution: {integrity: sha512-HXuLAX2pu/UByPpaeo/TaMfvMIi+1QqIoPJYCcAtU8QkVNwgR6MPlGuCQTErV1JwraaMbYaWVIBX7mppzGLATQ==} engines: {node: '>=10'} @@ -3299,16 +1916,13 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -3320,57 +1934,15 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - - storybook-solidjs-vite@10.7.1: - resolution: {integrity: sha512-bxNEcK745kVlL4D8vh4ERMd/G2IGLPzdkr5/I6QdonUj7exp3WReca9eGxQlqYVSWeSB+pkIJgu/KdihgAj2rA==} - peerDependencies: - '@solidjs/web': ^2.0.0-0 - solid-js: ^1.8.0-0 || ^2.0.0-0 - storybook: ^0.0.0-0 || ^10.0.0 - typescript: '*' - vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - vite-plugin-solid: ^2.0.0-0 || ^3.0.0-0 - peerDependenciesMeta: - '@solidjs/web': - optional: true - typescript: - optional: true - - storybook@10.5.10: - resolution: {integrity: sha512-Rz8k9ejFHsi7lbtJTaxZlhCUz4GkbJIKEoKDjXeLfr/ZhXip73E6keKxW0KH8iGeKiCqHAbJCV4YIQrxTOLiig==} - hasBin: true - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - prettier: ^2 || ^3 - vite-plus: ^0.1.15 || ^0.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - prettier: - optional: true - vite-plus: - optional: true + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} + std-env@4.2.0: + resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -3388,14 +1960,6 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} - strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -3413,21 +1977,9 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -3438,12 +1990,16 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.3.0: + resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} + engines: {node: '>=18'} + tinyglobby@0.2.13: resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} engines: {node: '>=12.0.0'} @@ -3452,31 +2008,31 @@ packages: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + tinyrainbow@3.1.1: + resolution: {integrity: sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==} engines: {node: '>=14.0.0'} - tinyspy@4.0.4: - resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} - engines: {node: '>=14.0.0'} + tldts-core@7.4.11: + resolution: {integrity: sha512-CW3WN2rIIE/Of21mulhgnGOwoDyEFNygyIBOONSdyAuSATgMMUCpLeUlB+E8sAwA5xRV9hYPl+kyZ9citHCaKg==} - tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + tldts@7.4.11: + resolution: {integrity: sha512-aBiNayCfTQxuIJBm06M+xR14cYaYlDlSXZbgsnKzKNxDKUVq7KFwTjwBSsb7m9Y5xO8WfPnBc63WaYFMTGlvqw==} + hasBin: true to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} + tough-cookie@6.0.2: + resolution: {integrity: sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==} + engines: {node: '>=16'} tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - tr46@3.0.0: - resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} - engines: {node: '>=12'} + tr46@6.0.0: + resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} + engines: {node: '>=20'} tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} @@ -3488,10 +2044,6 @@ packages: peerDependencies: typescript: '>=4.2.0' - ts-dedent@2.3.0: - resolution: {integrity: sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==} - engines: {node: '>=6.10'} - ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -3526,54 +2078,21 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - typescript@5.8.3: resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} hasBin: true - typescript@6.0.3: - resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} - engines: {node: '>=14.17'} - hasBin: true - - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - - unicode-canonical-property-names-ecmascript@2.0.1: - resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} - engines: {node: '>=4'} - - unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} - - unicode-match-property-value-ecmascript@2.2.0: - resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} - engines: {node: '>=4'} - - unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} - - universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - unplugin@2.3.11: - resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} - engines: {node: '>=18.12.0'} + undici@8.10.1: + resolution: {integrity: sha512-YQ3WlbqjYMmNpdvDH64jAgLjxuAR9+649calDWhbshYaeQGO2bR4nI94ORJmwI3J9YhoKQnpyGOK+0zlWS5N5Q==} + engines: {node: '>=22.19.0'} update-browserslist-db@1.1.3: resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} @@ -3584,24 +2103,9 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - - use-sync-external-store@1.6.0: - resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - v8-to-istanbul@9.3.0: - resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} - engines: {node: '>=10.12.0'} - validate-html-nesting@1.2.2: resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} - vite-plugin-solid@3.0.0-next.27: - resolution: {integrity: sha512-bDzjIIplkSDH73BiGP9pbPR3ZnjeUA18SAYugLhqDCy4u0bl3qdrETstxrXuo2vHXLB0VD9rvOr0iesZBBul4Q==} - vite@8.2.2: resolution: {integrity: sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3653,37 +2157,69 @@ packages: vite: optional: true - vscode-uri@3.2.0: - resolution: {integrity: sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==} - - w3c-xmlserializer@4.0.0: - resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} - engines: {node: '>=14'} + vitest@4.1.11: + resolution: {integrity: sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.1.11 + '@vitest/browser-preview': 4.1.11 + '@vitest/browser-webdriverio': 4.1.11 + '@vitest/coverage-istanbul': 4.1.11 + '@vitest/coverage-v8': 4.1.11 + '@vitest/ui': 4.1.11 + happy-dom: '*' + jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true - walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - - webpack-virtual-modules@0.6.2: - resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + webidl-conversions@8.0.1: + resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} + engines: {node: '>=20'} - whatwg-encoding@2.0.0: - resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} - engines: {node: '>=12'} + whatwg-mimetype@5.0.0: + resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} + engines: {node: '>=20'} - whatwg-mimetype@3.0.0: - resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} - engines: {node: '>=12'} + whatwg-url@16.0.1: + resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - whatwg-url@11.0.0: - resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} - engines: {node: '>=12'} + whatwg-url@17.1.0: + resolution: {integrity: sha512-3GeworPmc2ZfEEHP7lEbUfBX/L75wdEsi0rLNhXcXxnoN5jyq0SL5gCy06SGW2cyTIZdTvWIDQNQoza++vKeaw==} + engines: {node: ^22.14.0 || >=24.0.0} whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} @@ -3693,6 +2229,11 @@ packages: engines: {node: '>= 8'} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -3708,60 +2249,16 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - ws@8.18.1: - resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.21.3: - resolution: {integrity: sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - wsl-utils@0.1.0: - resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} - xml-name-validator@4.0.0: - resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} - engines: {node: '>=12'} - xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -3773,7 +2270,22 @@ snapshots: '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.31 + + '@asamuzakjp/css-color@6.0.7': + dependencies: + '@csstools/css-calc': 3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-color-parser': 4.2.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + lru-cache: 11.5.2 + + '@asamuzakjp/dom-selector@8.3.2': + dependencies: + bidi-js: 1.0.3 + css-tree: 3.2.1 + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.5.2 '@babel/code-frame@7.26.2': dependencies: @@ -3791,10 +2303,10 @@ snapshots: '@babel/helper-compilation-targets': 7.27.0 '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) '@babel/helpers': 7.27.0 - '@babel/parser': 7.27.0 + '@babel/parser': 7.29.8 '@babel/template': 7.27.0 '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/types': 7.29.8 convert-source-map: 2.0.0 debug: 4.4.0 gensync: 1.0.0-beta.2 @@ -3836,24 +2348,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.27.0(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - regexpu-core: 6.2.0 - semver: 6.3.1 - - '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - debug: 4.4.0 - lodash.debounce: 4.0.8 - resolve: 1.22.10 - transitivePeerDependencies: - - supports-color - '@babel/helper-member-expression-to-functions@7.25.9': dependencies: '@babel/traverse': 7.27.0 @@ -3887,15 +2381,6 @@ snapshots: '@babel/helper-plugin-utils@7.26.5': {} - '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-wrap-function': 7.25.9 - '@babel/traverse': 7.27.0 - transitivePeerDependencies: - - supports-color - '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 @@ -3914,1150 +2399,328 @@ snapshots: '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-string-parser@7.29.7': {} + '@babel/helper-validator-identifier@7.25.9': {} - '@babel/helper-validator-option@7.25.9': {} + '@babel/helper-validator-identifier@7.29.7': {} - '@babel/helper-wrap-function@7.25.9': - dependencies: - '@babel/template': 7.27.0 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 - transitivePeerDependencies: - - supports-color + '@babel/helper-validator-option@7.25.9': {} '@babel/helpers@7.27.0': dependencies: '@babel/template': 7.27.0 - '@babel/types': 7.27.0 + '@babel/types': 7.29.8 '@babel/parser@7.27.0': dependencies: '@babel/types': 7.27.0 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.10)': + '@babel/parser@7.29.8': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.27.0 - transitivePeerDependencies: - - supports-color + '@babel/types': 7.29.8 - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.10) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-typescript@7.27.0(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.27.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10) transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.10)': + '@babel/preset-typescript@7.27.0(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.10) + '@babel/plugin-transform-typescript': 7.27.0(@babel/core@7.26.10) + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.10)': + '@babel/runtime@7.27.0': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 + regenerator-runtime: 0.14.1 - '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.10)': + '@babel/template@7.27.0': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 - '@babel/plugin-transform-async-generator-functions@7.26.8(@babel/core@7.26.10)': + '@babel/traverse@7.27.0': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.10) - '@babel/traverse': 7.27.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.27.0 + '@babel/parser': 7.27.0 + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 + debug: 4.4.0 + globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.10)': + '@babel/types@7.27.0': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.10) - transitivePeerDependencies: - - supports-color + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 - '@babel/plugin-transform-block-scoped-functions@7.26.5(@babel/core@7.26.10)': + '@babel/types@7.29.8': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 - '@babel/plugin-transform-block-scoping@7.27.0(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@bcoe/v8-coverage@1.0.2': {} - '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.10)': + '@bramus/specificity@2.4.2': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color + css-tree: 3.2.1 - '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) - '@babel/traverse': 7.27.0 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/template': 7.27.0 - - '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-for-of@7.26.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.27.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.27.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-nullish-coalescing-operator@7.26.6(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.10) - - '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-regenerator@7.27.0(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - regenerator-transform: 0.15.2 - - '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-template-literals@7.26.8(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-typeof-symbol@7.27.0(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-typescript@7.27.0(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/preset-env@7.26.9(@babel/core@7.26.10)': - dependencies: - '@babel/compat-data': 7.26.8 - '@babel/core': 7.26.10 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10) - '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.10) - '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.26.10) - '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-block-scoped-functions': 7.26.5(@babel/core@7.26.10) - '@babel/plugin-transform-block-scoping': 7.27.0(@babel/core@7.26.10) - '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.26.10) - '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-for-of': 7.26.9(@babel/core@7.26.10) - '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.10) - '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.26.10) - '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-regenerator': 7.27.0(@babel/core@7.26.10) - '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-template-literals': 7.26.8(@babel/core@7.26.10) - '@babel/plugin-transform-typeof-symbol': 7.27.0(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.10) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.10) - babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.26.10) - babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.10) - babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.26.10) - core-js-compat: 3.41.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/types': 7.27.0 - esutils: 2.0.3 - - '@babel/preset-typescript@7.27.0(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.10) - '@babel/plugin-transform-typescript': 7.27.0(@babel/core@7.26.10) - transitivePeerDependencies: - - supports-color - - '@babel/runtime@7.27.0': - dependencies: - regenerator-runtime: 0.14.1 - - '@babel/template@7.27.0': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 - - '@babel/traverse@7.27.0': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 - debug: 4.4.0 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/types@7.27.0': - dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - - '@bcoe/v8-coverage@0.2.3': {} - - '@dom-expressions/babel-plugin-jsx@0.50.0-next.44(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-imports': 7.18.6 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) - '@babel/types': 7.27.0 - html-entities: 2.3.3 - parse5: 7.3.0 - validate-html-nesting: 1.2.2 - - '@emnapi/core@1.11.0': - dependencies: - '@emnapi/wasi-threads': 1.2.2 - tslib: 2.8.1 - optional: true - - '@emnapi/core@1.11.3': - dependencies: - '@emnapi/wasi-threads': 1.2.3 - tslib: 2.8.1 - optional: true - - '@emnapi/core@1.9.2': - dependencies: - '@emnapi/wasi-threads': 1.2.1 - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.11.0': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.11.3': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.9.2': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/wasi-threads@1.2.1': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/wasi-threads@1.2.2': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/wasi-threads@1.2.3': - dependencies: - tslib: 2.8.1 - optional: true - - '@esbuild/aix-ppc64@0.25.3': - optional: true - - '@esbuild/android-arm64@0.25.3': - optional: true - - '@esbuild/android-arm@0.25.3': - optional: true - - '@esbuild/android-x64@0.25.3': - optional: true - - '@esbuild/darwin-arm64@0.25.3': - optional: true - - '@esbuild/darwin-x64@0.25.3': - optional: true - - '@esbuild/freebsd-arm64@0.25.3': - optional: true - - '@esbuild/freebsd-x64@0.25.3': - optional: true - - '@esbuild/linux-arm64@0.25.3': - optional: true - - '@esbuild/linux-arm@0.25.3': - optional: true - - '@esbuild/linux-ia32@0.25.3': - optional: true - - '@esbuild/linux-loong64@0.25.3': - optional: true - - '@esbuild/linux-mips64el@0.25.3': - optional: true - - '@esbuild/linux-ppc64@0.25.3': - optional: true - - '@esbuild/linux-riscv64@0.25.3': - optional: true - - '@esbuild/linux-s390x@0.25.3': - optional: true - - '@esbuild/linux-x64@0.25.3': - optional: true - - '@esbuild/netbsd-arm64@0.25.3': - optional: true - - '@esbuild/netbsd-x64@0.25.3': - optional: true - - '@esbuild/openbsd-arm64@0.25.3': - optional: true - - '@esbuild/openbsd-x64@0.25.3': - optional: true - - '@esbuild/sunos-x64@0.25.3': - optional: true - - '@esbuild/win32-arm64@0.25.3': - optional: true - - '@esbuild/win32-ia32@0.25.3': - optional: true - - '@esbuild/win32-x64@0.25.3': - optional: true - - '@eslint-community/eslint-utils@4.6.1(eslint@8.57.1)': - dependencies: - eslint: 8.57.1 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.12.1': {} - - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.4.0 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@8.57.1': {} - - '@humanwhocodes/config-array@0.13.0': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.0 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/object-schema@2.0.3': {} - - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@istanbuljs/load-nyc-config@1.1.0': - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - - '@istanbuljs/schema@0.1.3': {} - - '@jest/console@29.7.0': - dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.17.31 - chalk: 4.1.2 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - - '@jest/core@29.7.0': - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.17.31 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.9.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.17.31) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.8 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - - '@jest/environment@29.7.0': - dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.17.31 - jest-mock: 29.7.0 - - '@jest/expect-utils@29.7.0': - dependencies: - jest-get-type: 29.6.3 - - '@jest/expect@29.7.0': - dependencies: - expect: 29.7.0 - jest-snapshot: 29.7.0 - transitivePeerDependencies: - - supports-color - - '@jest/fake-timers@29.7.0': - dependencies: - '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.17.31 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 - - '@jest/globals@29.7.0': - dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/types': 29.6.3 - jest-mock: 29.7.0 - transitivePeerDependencies: - - supports-color - - '@jest/reporters@29.7.0': - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 20.17.31 - chalk: 4.1.2 - collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 6.0.3 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.7 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - jest-worker: 29.7.0 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.3.0 - transitivePeerDependencies: - - supports-color - - '@jest/schemas@29.6.3': - dependencies: - '@sinclair/typebox': 0.27.8 - - '@jest/source-map@29.6.3': - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - callsites: 3.1.0 - graceful-fs: 4.2.11 - - '@jest/test-result@29.7.0': - dependencies: - '@jest/console': 29.7.0 - '@jest/types': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.2 - - '@jest/test-sequencer@29.7.0': - dependencies: - '@jest/test-result': 29.7.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - slash: 3.0.0 - - '@jest/transform@29.7.0': - dependencies: - '@babel/core': 7.26.10 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - micromatch: 4.0.8 - pirates: 4.0.7 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - - '@jest/types@29.6.3': - dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 20.17.31 - '@types/yargs': 17.0.33 - chalk: 4.1.2 - - '@jridgewell/gen-mapping@0.3.8': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/remapping@2.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/sourcemap-codec@1.5.0': {} - - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - - '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.0)(@emnapi/runtime@1.11.0)': - dependencies: - '@emnapi/core': 1.11.0 - '@emnapi/runtime': 1.11.0 - '@tybys/wasm-util': 0.10.3 - optional: true - - '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)': - dependencies: - '@emnapi/core': 1.11.3 - '@emnapi/runtime': 1.11.3 - '@tybys/wasm-util': 0.10.3 - optional: true + '@csstools/color-helpers@6.1.1': {} - '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@csstools/css-calc@3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: - '@emnapi/core': 1.9.2 - '@emnapi/runtime': 1.9.2 - '@tybys/wasm-util': 0.10.3 - optional: true + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 - '@nodelib/fs.scandir@2.1.5': + '@csstools/css-color-parser@4.2.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 + '@csstools/color-helpers': 6.1.1 + '@csstools/css-calc': 3.3.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 - '@nodelib/fs.stat@2.0.5': {} + '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/css-tokenizer': 4.0.0 - '@nodelib/fs.walk@1.2.8': + '@csstools/css-syntax-patches-for-csstree@1.1.12(css-tree@3.2.1)': + optionalDependencies: + css-tree: 3.2.1 + + '@csstools/css-tokenizer@4.0.0': {} + + '@dom-expressions/babel-plugin-jsx@0.50.0-next.44(@babel/core@7.26.10)': dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 + '@babel/core': 7.26.10 + '@babel/helper-module-imports': 7.18.6 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) + '@babel/types': 7.27.0 + html-entities: 2.3.3 + parse5: 7.3.0 + validate-html-nesting: 1.2.2 - '@oxc-parser/binding-android-arm-eabi@0.127.0': + '@emnapi/core@1.11.3': + dependencies: + '@emnapi/wasi-threads': 1.2.3 + tslib: 2.8.1 optional: true - '@oxc-parser/binding-android-arm64@0.127.0': + '@emnapi/runtime@1.11.3': + dependencies: + tslib: 2.8.1 optional: true - '@oxc-parser/binding-darwin-arm64@0.127.0': + '@emnapi/wasi-threads@1.2.3': + dependencies: + tslib: 2.8.1 optional: true - '@oxc-parser/binding-darwin-x64@0.127.0': + '@esbuild/aix-ppc64@0.25.3': optional: true - '@oxc-parser/binding-freebsd-x64@0.127.0': + '@esbuild/android-arm64@0.25.3': optional: true - '@oxc-parser/binding-linux-arm-gnueabihf@0.127.0': + '@esbuild/android-arm@0.25.3': optional: true - '@oxc-parser/binding-linux-arm-musleabihf@0.127.0': + '@esbuild/android-x64@0.25.3': optional: true - '@oxc-parser/binding-linux-arm64-gnu@0.127.0': + '@esbuild/darwin-arm64@0.25.3': optional: true - '@oxc-parser/binding-linux-arm64-musl@0.127.0': + '@esbuild/darwin-x64@0.25.3': optional: true - '@oxc-parser/binding-linux-ppc64-gnu@0.127.0': + '@esbuild/freebsd-arm64@0.25.3': optional: true - '@oxc-parser/binding-linux-riscv64-gnu@0.127.0': + '@esbuild/freebsd-x64@0.25.3': optional: true - '@oxc-parser/binding-linux-riscv64-musl@0.127.0': + '@esbuild/linux-arm64@0.25.3': optional: true - '@oxc-parser/binding-linux-s390x-gnu@0.127.0': + '@esbuild/linux-arm@0.25.3': optional: true - '@oxc-parser/binding-linux-x64-gnu@0.127.0': + '@esbuild/linux-ia32@0.25.3': optional: true - '@oxc-parser/binding-linux-x64-musl@0.127.0': + '@esbuild/linux-loong64@0.25.3': optional: true - '@oxc-parser/binding-openharmony-arm64@0.127.0': + '@esbuild/linux-mips64el@0.25.3': optional: true - '@oxc-parser/binding-wasm32-wasi@0.127.0': - dependencies: - '@emnapi/core': 1.9.2 - '@emnapi/runtime': 1.9.2 - '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@esbuild/linux-ppc64@0.25.3': optional: true - '@oxc-parser/binding-win32-arm64-msvc@0.127.0': + '@esbuild/linux-riscv64@0.25.3': optional: true - '@oxc-parser/binding-win32-ia32-msvc@0.127.0': + '@esbuild/linux-s390x@0.25.3': optional: true - '@oxc-parser/binding-win32-x64-msvc@0.127.0': + '@esbuild/linux-x64@0.25.3': optional: true - '@oxc-project/types@0.127.0': {} - - '@oxc-project/types@0.147.0': {} - - '@oxc-resolver/binding-android-arm-eabi@11.21.2': + '@esbuild/netbsd-arm64@0.25.3': optional: true - '@oxc-resolver/binding-android-arm64@11.21.2': + '@esbuild/netbsd-x64@0.25.3': optional: true - '@oxc-resolver/binding-darwin-arm64@11.21.2': + '@esbuild/openbsd-arm64@0.25.3': optional: true - '@oxc-resolver/binding-darwin-x64@11.21.2': + '@esbuild/openbsd-x64@0.25.3': optional: true - '@oxc-resolver/binding-freebsd-x64@11.21.2': + '@esbuild/sunos-x64@0.25.3': optional: true - '@oxc-resolver/binding-linux-arm-gnueabihf@11.21.2': + '@esbuild/win32-arm64@0.25.3': optional: true - '@oxc-resolver/binding-linux-arm-musleabihf@11.21.2': + '@esbuild/win32-ia32@0.25.3': optional: true - '@oxc-resolver/binding-linux-arm64-gnu@11.21.2': + '@esbuild/win32-x64@0.25.3': optional: true - '@oxc-resolver/binding-linux-arm64-musl@11.21.2': - optional: true + '@eslint-community/eslint-utils@4.6.1(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 - '@oxc-resolver/binding-linux-ppc64-gnu@11.21.2': - optional: true + '@eslint-community/regexpp@4.12.1': {} - '@oxc-resolver/binding-linux-riscv64-gnu@11.21.2': - optional: true + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color - '@oxc-resolver/binding-linux-riscv64-musl@11.21.2': - optional: true + '@eslint/js@8.57.1': {} - '@oxc-resolver/binding-linux-s390x-gnu@11.21.2': - optional: true + '@exodus/bytes@1.15.1': {} - '@oxc-resolver/binding-linux-x64-gnu@11.21.2': - optional: true + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color - '@oxc-resolver/binding-linux-x64-musl@11.21.2': - optional: true + '@humanwhocodes/module-importer@1.0.1': {} - '@oxc-resolver/binding-openharmony-arm64@11.21.2': - optional: true + '@humanwhocodes/object-schema@2.0.3': {} - '@oxc-resolver/binding-wasm32-wasi@11.21.2': + '@isaacs/cliui@8.0.2': dependencies: - '@emnapi/core': 1.11.0 - '@emnapi/runtime': 1.11.0 - '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.0)(@emnapi/runtime@1.11.0) - optional: true + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 - '@oxc-resolver/binding-win32-arm64-msvc@11.21.2': - optional: true + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} - '@oxc-resolver/binding-win32-x64-msvc@11.21.2': + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/sourcemap-codec@1.6.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)': + dependencies: + '@emnapi/core': 1.11.3 + '@emnapi/runtime': 1.11.3 + '@tybys/wasm-util': 0.10.3 optional: true + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@oxc-project/types@0.147.0': {} + '@pkgjs/parseargs@0.11.0': optional: true + '@playwright/test@1.62.1': + dependencies: + playwright: 1.62.1 + '@rolldown/binding-android-arm-eabi@1.2.6': optional: true @@ -5165,16 +2828,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.40.0': optional: true - '@sinclair/typebox@0.27.8': {} - - '@sinonjs/commons@3.0.1': - dependencies: - type-detect: 4.0.8 - - '@sinonjs/fake-timers@10.3.0': - dependencies: - '@sinonjs/commons': 3.0.1 - '@solid-primitives/props@4.0.0-next.3(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(solid-js@2.0.0-rc.3)': dependencies: '@solid-primitives/utils': 7.0.0-next.4(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(solid-js@2.0.0-rc.3) @@ -5199,46 +2852,46 @@ snapshots: '@solidjs/web': 2.0.0-rc.3(solid-js@2.0.0-rc.3) solid-js: 2.0.0-rc.3 - '@solidjs/babel-plugin@2.0.0-rc.4(@babel/core@7.26.10)': + '@solidjs/babel-plugin@2.0.0-rc.5(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-module-imports': 7.18.6 '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) - '@babel/types': 7.27.0 + '@babel/types': 7.29.8 html-entities: 2.3.3 parse5: 7.3.0 validate-html-nesting: 1.2.2 - '@solidjs/compiler-darwin-arm64@2.0.0-rc.4': + '@solidjs/compiler-darwin-arm64@2.0.0-rc.5': optional: true - '@solidjs/compiler-darwin-x64@2.0.0-rc.4': + '@solidjs/compiler-darwin-x64@2.0.0-rc.5': optional: true - '@solidjs/compiler-linux-arm64-gnu@2.0.0-rc.4': + '@solidjs/compiler-linux-arm64-gnu@2.0.0-rc.5': optional: true - '@solidjs/compiler-linux-x64-gnu@2.0.0-rc.4': + '@solidjs/compiler-linux-x64-gnu@2.0.0-rc.5': optional: true - '@solidjs/compiler-wasm32-wasi@2.0.0-rc.4': + '@solidjs/compiler-wasm32-wasi@2.0.0-rc.5': dependencies: '@emnapi/core': 1.11.3 '@emnapi/runtime': 1.11.3 '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) optional: true - '@solidjs/compiler-win32-x64-msvc@2.0.0-rc.4': + '@solidjs/compiler-win32-x64-msvc@2.0.0-rc.5': optional: true - '@solidjs/compiler@2.0.0-rc.4': + '@solidjs/compiler@2.0.0-rc.5': optionalDependencies: - '@solidjs/compiler-darwin-arm64': 2.0.0-rc.4 - '@solidjs/compiler-darwin-x64': 2.0.0-rc.4 - '@solidjs/compiler-linux-arm64-gnu': 2.0.0-rc.4 - '@solidjs/compiler-linux-x64-gnu': 2.0.0-rc.4 - '@solidjs/compiler-wasm32-wasi': 2.0.0-rc.4 - '@solidjs/compiler-win32-x64-msvc': 2.0.0-rc.4 + '@solidjs/compiler-darwin-arm64': 2.0.0-rc.5 + '@solidjs/compiler-darwin-x64': 2.0.0-rc.5 + '@solidjs/compiler-linux-arm64-gnu': 2.0.0-rc.5 + '@solidjs/compiler-linux-x64-gnu': 2.0.0-rc.5 + '@solidjs/compiler-wasm32-wasi': 2.0.0-rc.5 + '@solidjs/compiler-win32-x64-msvc': 2.0.0-rc.5 '@solidjs/signals@2.0.0-rc.3': {} @@ -5248,18 +2901,18 @@ snapshots: '@testing-library/dom': 10.4.1 solid-js: 2.0.0-rc.3 - '@solidjs/vite-plugin@3.0.0-next.36(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.3)(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3))': + '@solidjs/vite-plugin@3.0.0-next.37(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.3)(vite@8.2.2(@types/node@22.20.1)(esbuild@0.25.3))': dependencies: '@ampproject/remapping': 2.3.0 '@babel/core': 7.26.10 - '@solidjs/babel-plugin': 2.0.0-rc.4(@babel/core@7.26.10) - '@solidjs/compiler': 2.0.0-rc.4 + '@solidjs/babel-plugin': 2.0.0-rc.5(@babel/core@7.26.10) + '@solidjs/compiler': 2.0.0-rc.5 '@solidjs/web': 2.0.0-rc.3(solid-js@2.0.0-rc.3) '@types/babel__core': 7.20.5 merge-anything: 5.1.7 solid-js: 2.0.0-rc.3 - vite: 8.2.2(@types/node@20.17.31)(esbuild@0.25.3) - vitefu: 1.1.3(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)) + vite: 8.2.2(@types/node@22.20.1)(esbuild@0.25.3) + vitefu: 1.1.3(vite@8.2.2(@types/node@22.20.1)(esbuild@0.25.3)) optionalDependencies: '@testing-library/jest-dom': 6.9.1 transitivePeerDependencies: @@ -5271,31 +2924,7 @@ snapshots: seroval-plugins: 1.5.6(seroval@1.5.6) solid-js: 2.0.0-rc.3 - '@storybook/builder-vite@10.5.10(esbuild@0.25.3)(rollup@4.40.0)(storybook@10.5.10(prettier@3.5.3)(react@19.2.8))(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3))': - dependencies: - '@storybook/csf-plugin': 10.5.10(esbuild@0.25.3)(rollup@4.40.0)(storybook@10.5.10(prettier@3.5.3)(react@19.2.8))(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)) - storybook: 10.5.10(prettier@3.5.3)(react@19.2.8) - ts-dedent: 2.3.0 - vite: 8.2.2(@types/node@20.17.31)(esbuild@0.25.3) - transitivePeerDependencies: - - esbuild - - rollup - - webpack - - '@storybook/csf-plugin@10.5.10(esbuild@0.25.3)(rollup@4.40.0)(storybook@10.5.10(prettier@3.5.3)(react@19.2.8))(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3))': - dependencies: - storybook: 10.5.10(prettier@3.5.3)(react@19.2.8) - unplugin: 2.3.11 - optionalDependencies: - esbuild: 0.25.3 - rollup: 4.40.0 - vite: 8.2.2(@types/node@20.17.31)(esbuild@0.25.3) - - '@storybook/global@5.0.0': {} - - '@storybook/icons@2.1.0(react@19.2.8)': - dependencies: - react: 19.2.8 + '@standard-schema/spec@1.1.0': {} '@testing-library/dom@10.4.1': dependencies: @@ -5317,12 +2946,6 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 - '@testing-library/user-event@14.6.6(@testing-library/dom@10.4.1)': - dependencies: - '@testing-library/dom': 10.4.1 - - '@tootallnate/once@2.0.0': {} - '@tybys/wasm-util@0.10.3': dependencies: tslib: 2.8.1 @@ -5332,24 +2955,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.7 + '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.29.8 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 - '@types/babel__traverse@7.20.7': + '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.29.8 '@types/chai@5.2.3': dependencies: @@ -5360,49 +2983,14 @@ snapshots: '@types/estree@1.0.7': {} - '@types/graceful-fs@4.1.9': - dependencies: - '@types/node': 20.17.31 - - '@types/istanbul-lib-coverage@2.0.6': {} - - '@types/istanbul-lib-report@3.0.3': - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - - '@types/istanbul-reports@3.0.4': - dependencies: - '@types/istanbul-lib-report': 3.0.3 - - '@types/jest@29.5.14': - dependencies: - expect: 29.7.0 - pretty-format: 29.7.0 - - '@types/jsdom@20.0.1': - dependencies: - '@types/node': 20.17.31 - '@types/tough-cookie': 4.0.5 - parse5: 7.3.0 - '@types/json-schema@7.0.15': {} - '@types/node@20.17.31': + '@types/node@22.20.1': dependencies: - undici-types: 6.19.8 + undici-types: 6.21.0 '@types/semver@7.7.0': {} - '@types/stack-utils@2.0.3': {} - - '@types/tough-cookie@4.0.5': {} - - '@types/yargs-parser@21.0.3': {} - - '@types/yargs@17.0.33': - dependencies: - '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -5489,73 +3077,69 @@ snapshots: '@typescript-eslint/types': 6.21.0 eslint-visitor-keys: 3.4.3 - '@typescript/typescript6@6.0.2': - dependencies: - '@typescript/old': typescript@6.0.3 - '@ungap/structured-clone@1.3.0': {} - '@vitest/expect@3.2.4': + '@vitest/coverage-v8@4.1.11(vitest@4.1.11)': dependencies: - '@types/chai': 5.2.3 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.3.3 - tinyrainbow: 2.0.0 + '@bcoe/v8-coverage': 1.0.2 + '@vitest/utils': 4.1.11 + ast-v8-to-istanbul: 1.0.5 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.2.0 + magicast: 0.5.4 + obug: 2.1.4 + std-env: 4.2.0 + tinyrainbow: 3.1.1 + vitest: 4.1.11(@types/node@22.20.1)(@vitest/coverage-v8@4.1.11)(jsdom@30.0.1)(vite@8.2.2(@types/node@22.20.1)(esbuild@0.25.3)) - '@vitest/pretty-format@3.2.4': + '@vitest/expect@4.1.11': dependencies: - tinyrainbow: 2.0.0 + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.1.11 + '@vitest/utils': 4.1.11 + chai: 6.2.2 + tinyrainbow: 3.1.1 - '@vitest/spy@3.2.4': + '@vitest/mocker@4.1.11(vite@8.2.2(@types/node@22.20.1)(esbuild@0.25.3))': dependencies: - tinyspy: 4.0.4 + '@vitest/spy': 4.1.11 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 8.2.2(@types/node@22.20.1)(esbuild@0.25.3) - '@vitest/utils@3.2.4': + '@vitest/pretty-format@4.1.11': dependencies: - '@vitest/pretty-format': 3.2.4 - loupe: 3.2.1 - tinyrainbow: 2.0.0 + tinyrainbow: 3.1.1 - '@volar/language-core@2.4.28': + '@vitest/runner@4.1.11': dependencies: - '@volar/source-map': 2.4.28 - - '@volar/source-map@2.4.28': {} + '@vitest/utils': 4.1.11 + pathe: 2.0.3 - '@volar/typescript@2.4.28': + '@vitest/snapshot@4.1.11': dependencies: - '@volar/language-core': 2.4.28 - path-browserify: 1.0.1 - vscode-uri: 3.2.0 + '@vitest/pretty-format': 4.1.11 + '@vitest/utils': 4.1.11 + magic-string: 0.30.21 + pathe: 2.0.3 - '@webcontainer/env@1.1.1': {} + '@vitest/spy@4.1.11': {} - abab@2.0.6: {} - - acorn-globals@7.0.1: + '@vitest/utils@4.1.11': dependencies: - acorn: 8.14.1 - acorn-walk: 8.3.4 + '@vitest/pretty-format': 4.1.11 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.1 acorn-jsx@5.3.2(acorn@8.14.1): dependencies: acorn: 8.14.1 - acorn-walk@8.3.4: - dependencies: - acorn: 8.14.1 - acorn@8.14.1: {} - acorn@8.18.0: {} - - agent-base@6.0.2: - dependencies: - debug: 4.4.0 - transitivePeerDependencies: - - supports-color - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -5563,10 +3147,6 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - ansi-regex@5.0.1: {} ansi-regex@6.1.0: {} @@ -5581,109 +3161,21 @@ snapshots: any-promise@1.3.0: {} - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - argparse@2.0.1: {} - aria-query@5.3.0: - dependencies: - dequal: 2.0.3 - - array-union@2.1.0: {} - - assertion-error@2.0.1: {} - - ast-types@0.16.1: - dependencies: - tslib: 2.8.1 - - asynckit@0.4.0: {} - - babel-jest@29.7.0(@babel/core@7.26.10): - dependencies: - '@babel/core': 7.26.10 - '@jest/transform': 29.7.0 - '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.26.10) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-istanbul@6.1.1: - dependencies: - '@babel/helper-plugin-utils': 7.26.5 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-jest-hoist@29.6.3: - dependencies: - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 - '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.7 - - babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.26.10): - dependencies: - '@babel/compat-data': 7.26.8 - '@babel/core': 7.26.10 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.26.10): + aria-query@5.3.0: dependencies: - '@babel/core': 7.26.10 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) - core-js-compat: 3.41.0 - transitivePeerDependencies: - - supports-color + dequal: 2.0.3 - babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.26.10): - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) - transitivePeerDependencies: - - supports-color + array-union@2.1.0: {} - babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.10): - dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.10) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.10) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.10) - '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.10) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.10) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.10) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.10) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.10) - - babel-preset-jest@29.6.3(@babel/core@7.26.10): + assertion-error@2.0.1: {} + + ast-v8-to-istanbul@1.0.5: dependencies: - '@babel/core': 7.26.10 - babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.10) + '@jridgewell/trace-mapping': 0.3.31 + estree-walker: 3.0.3 + js-tokens: 10.0.0 babel-preset-solid@2.0.0-rc.2(@babel/core@7.26.10)(solid-js@2.0.0-rc.3): dependencies: @@ -5694,6 +3186,10 @@ snapshots: balanced-match@1.0.2: {} + bidi-js@1.0.3: + dependencies: + require-from-string: 2.0.2 + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -5714,16 +3210,6 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.24.4) - bser@2.1.1: - dependencies: - node-int64: 0.4.0 - - buffer-from@1.1.2: {} - - bundle-name@4.1.0: - dependencies: - run-applescript: 7.1.0 - bundle-require@5.1.0(esbuild@0.25.3): dependencies: esbuild: 0.25.3 @@ -5731,64 +3217,27 @@ snapshots: cac@6.7.14: {} - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - callsites@3.1.0: {} - camelcase@5.3.1: {} - - camelcase@6.3.0: {} - caniuse-lite@1.0.30001715: {} - chai@5.3.3: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.3 - deep-eql: 5.0.2 - loupe: 3.2.1 - pathval: 2.0.1 + chai@6.2.2: {} chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - char-regex@1.0.2: {} - - check-error@2.1.3: {} - chokidar@4.0.3: dependencies: readdirp: 4.1.2 - ci-info@3.9.0: {} - - cjs-module-lexer@1.4.3: {} - - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - co@4.6.0: {} - - collect-v8-coverage@1.0.2: {} - color-convert@2.0.1: dependencies: color-name: 1.1.4 color-name@1.1.4: {} - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - commander@4.1.1: {} concat-map@0.0.1: {} @@ -5797,82 +3246,40 @@ snapshots: convert-source-map@2.0.0: {} - core-js-compat@3.41.0: - dependencies: - browserslist: 4.24.4 - - create-jest@29.7.0(@types/node@20.17.31): - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.17.31) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - css.escape@1.5.1: {} - - cssom@0.3.8: {} - - cssom@0.5.0: {} - - cssstyle@2.3.0: + css-tree@3.2.1: dependencies: - cssom: 0.3.8 + mdn-data: 2.27.1 + source-map-js: 1.2.1 + + css.escape@1.5.1: {} csstype@3.1.3: {} - data-urls@3.0.2: + data-urls@7.0.0: dependencies: - abab: 2.0.6 - whatwg-mimetype: 3.0.0 - whatwg-url: 11.0.0 + whatwg-mimetype: 5.0.0 + whatwg-url: 16.0.1 + transitivePeerDependencies: + - '@noble/hashes' debug@4.4.0: dependencies: ms: 2.1.3 - decimal.js@10.5.0: {} - - dedent@1.5.3: {} - - deep-eql@5.0.2: {} + decimal.js@10.6.0: {} deep-is@0.1.4: {} - deepmerge@4.3.1: {} - - default-browser-id@5.0.1: {} - - default-browser@5.5.1: - dependencies: - bundle-name: 4.1.0 - default-browser-id: 5.0.1 - - define-lazy-prop@3.0.0: {} - - delayed-stream@1.0.0: {} - dequal@2.0.3: {} detect-libc@2.1.2: {} - detect-newline@3.1.0: {} - - diff-sequences@29.6.3: {} - dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -5885,46 +3292,19 @@ snapshots: dom-accessibility-api@0.6.3: {} - domexception@4.0.0: - dependencies: - webidl-conversions: 7.0.0 - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - eastasianwidth@0.2.0: {} electron-to-chromium@1.5.143: {} - emittery@0.13.1: {} - emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} entities@6.0.0: {} - error-ex@1.3.2: - dependencies: - is-arrayish: 0.2.1 - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 + entities@8.0.0: {} - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 + es-module-lexer@2.3.2: {} esbuild-plugin-solid@0.5.0(esbuild@0.25.3)(solid-js@2.0.0-rc.3): dependencies: @@ -5968,18 +3348,8 @@ snapshots: escape-string-regexp@1.0.5: {} - escape-string-regexp@2.0.0: {} - escape-string-regexp@4.0.0: {} - escodegen@2.1.0: - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - eslint-plugin-eslint-comments@3.2.0(eslint@8.57.1): dependencies: escape-string-regexp: 1.0.5 @@ -6044,8 +3414,6 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.14.1) eslint-visitor-keys: 3.4.3 - esprima@4.0.1: {} - esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -6056,29 +3424,13 @@ snapshots: estraverse@5.3.0: {} - esutils@2.0.3: {} - - execa@5.1.1: + estree-walker@3.0.3: dependencies: - cross-spawn: 7.0.6 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 + '@types/estree': 1.0.7 - exit@0.1.2: {} + esutils@2.0.3: {} - expect@29.7.0: - dependencies: - '@jest/expect-utils': 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 + expect-type@1.4.0: {} fast-deep-equal@3.1.3: {} @@ -6098,10 +3450,6 @@ snapshots: dependencies: reusify: 1.1.0 - fb-watchman@2.0.2: - dependencies: - bser: 2.1.1 - fdir@6.4.4(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -6118,11 +3466,6 @@ snapshots: dependencies: to-regex-range: 5.0.1 - find-up@4.1.0: - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -6141,13 +3484,6 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@4.0.2: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - mime-types: 2.1.35 - framer-motion@13.1.1(react@19.2.8): dependencies: motion-dom: 13.1.1 @@ -6158,37 +3494,14 @@ snapshots: fs.realpath@1.0.0: {} - fsevents@2.3.3: + fsevents@2.3.2: optional: true - function-bind@1.1.2: {} + fsevents@2.3.3: + optional: true gensync@1.0.0-beta.2: {} - get-caller-file@2.0.5: {} - - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - get-package-type@0.1.0: {} - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - get-stream@6.0.1: {} - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -6230,554 +3543,125 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 - gopd@1.2.0: {} - - graceful-fs@4.2.11: {} - graphemer@1.4.0: {} has-flag@4.0.0: {} - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - html-encoding-sniffer@3.0.0: - dependencies: - whatwg-encoding: 2.0.0 - - html-entities@2.3.3: {} - - html-escaper@2.0.2: {} - - http-proxy-agent@5.0.0: - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.4.0 - transitivePeerDependencies: - - supports-color - - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.4.0 - transitivePeerDependencies: - - supports-color - - human-signals@2.1.0: {} - - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - - ignore@5.3.2: {} - - import-fresh@3.3.1: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - import-local@3.2.0: - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - - imurmurhash@0.1.4: {} - - indent-string@4.0.0: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-arrayish@0.2.1: {} - - is-core-module@2.16.1: - dependencies: - hasown: 2.0.2 - - is-docker@3.0.0: {} - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-generator-fn@2.1.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-inside-container@1.0.0: - dependencies: - is-docker: 3.0.0 - - is-number@7.0.0: {} - - is-path-inside@3.0.3: {} - - is-potential-custom-element-name@1.0.1: {} - - is-stream@2.0.1: {} - - is-what@4.1.16: {} - - is-wsl@3.1.1: - dependencies: - is-inside-container: 1.0.0 - - isexe@2.0.0: {} - - istanbul-lib-coverage@3.2.2: {} - - istanbul-lib-instrument@5.2.1: - dependencies: - '@babel/core': 7.26.10 - '@babel/parser': 7.27.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - istanbul-lib-instrument@6.0.3: - dependencies: - '@babel/core': 7.26.10 - '@babel/parser': 7.27.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 7.7.1 - transitivePeerDependencies: - - supports-color - - istanbul-lib-report@3.0.1: - dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 - - istanbul-lib-source-maps@4.0.1: - dependencies: - debug: 4.4.0 - istanbul-lib-coverage: 3.2.2 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - - istanbul-reports@3.1.7: - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - jest-changed-files@29.7.0: - dependencies: - execa: 5.1.1 - jest-util: 29.7.0 - p-limit: 3.1.0 - - jest-circus@29.7.0: + html-encoding-sniffer@6.0.0: dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.17.31 - chalk: 4.1.2 - co: 4.6.0 - dedent: 1.5.3 - is-generator-fn: 2.1.0 - jest-each: 29.7.0 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - p-limit: 3.1.0 - pretty-format: 29.7.0 - pure-rand: 6.1.0 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-cli@29.7.0(@types/node@20.17.31): - dependencies: - '@jest/core': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.17.31) - exit: 0.1.2 - import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.17.31) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - jest-config@29.7.0(@types/node@20.17.31): - dependencies: - '@babel/core': 7.26.10 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.10) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 20.17.31 + '@exodus/bytes': 1.15.1 transitivePeerDependencies: - - babel-plugin-macros - - supports-color + - '@noble/hashes' - jest-diff@29.7.0: - dependencies: - chalk: 4.1.2 - diff-sequences: 29.6.3 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - - jest-docblock@29.7.0: - dependencies: - detect-newline: 3.1.0 + html-entities@2.3.3: {} - jest-each@29.7.0: - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - jest-get-type: 29.6.3 - jest-util: 29.7.0 - pretty-format: 29.7.0 - - jest-environment-jsdom@29.7.0: - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/jsdom': 20.0.1 - '@types/node': 20.17.31 - jest-mock: 29.7.0 - jest-util: 29.7.0 - jsdom: 20.0.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - jest-environment-node@29.7.0: - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.17.31 - jest-mock: 29.7.0 - jest-util: 29.7.0 - - jest-get-type@29.6.3: {} - - jest-haste-map@29.7.0: - dependencies: - '@jest/types': 29.6.3 - '@types/graceful-fs': 4.1.9 - '@types/node': 20.17.31 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - jest-worker: 29.7.0 - micromatch: 4.0.8 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 + html-escaper@2.0.2: {} - jest-leak-detector@29.7.0: - dependencies: - jest-get-type: 29.6.3 - pretty-format: 29.7.0 + ignore@5.3.2: {} - jest-matcher-utils@29.7.0: + import-fresh@3.3.1: dependencies: - chalk: 4.1.2 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 + parent-module: 1.0.1 + resolve-from: 4.0.0 - jest-message-util@29.7.0: - dependencies: - '@babel/code-frame': 7.26.2 - '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - pretty-format: 29.7.0 - slash: 3.0.0 - stack-utils: 2.0.6 + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} - jest-mock@29.7.0: + inflight@1.0.6: dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.17.31 - jest-util: 29.7.0 + once: 1.4.0 + wrappy: 1.0.2 - jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - optionalDependencies: - jest-resolve: 29.7.0 + inherits@2.0.4: {} - jest-regex-util@29.6.3: {} + is-extglob@2.1.1: {} - jest-resolve-dependencies@29.7.0: - dependencies: - jest-regex-util: 29.6.3 - jest-snapshot: 29.7.0 - transitivePeerDependencies: - - supports-color + is-fullwidth-code-point@3.0.0: {} - jest-resolve@29.7.0: + is-glob@4.0.3: dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) - jest-util: 29.7.0 - jest-validate: 29.7.0 - resolve: 1.22.10 - resolve.exports: 2.0.3 - slash: 3.0.0 + is-extglob: 2.1.1 - jest-runner@29.7.0: - dependencies: - '@jest/console': 29.7.0 - '@jest/environment': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.17.31 - chalk: 4.1.2 - emittery: 0.13.1 - graceful-fs: 4.2.11 - jest-docblock: 29.7.0 - jest-environment-node: 29.7.0 - jest-haste-map: 29.7.0 - jest-leak-detector: 29.7.0 - jest-message-util: 29.7.0 - jest-resolve: 29.7.0 - jest-runtime: 29.7.0 - jest-util: 29.7.0 - jest-watcher: 29.7.0 - jest-worker: 29.7.0 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color + is-number@7.0.0: {} - jest-runtime@29.7.0: - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/globals': 29.7.0 - '@jest/source-map': 29.6.3 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.17.31 - chalk: 4.1.2 - cjs-module-lexer: 1.4.3 - collect-v8-coverage: 1.0.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color + is-path-inside@3.0.3: {} - jest-snapshot@29.7.0: - dependencies: - '@babel/core': 7.26.10 - '@babel/generator': 7.27.0 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10) - '@babel/types': 7.27.0 - '@jest/expect-utils': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.10) - chalk: 4.1.2 - expect: 29.7.0 - graceful-fs: 4.2.11 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - natural-compare: 1.4.0 - pretty-format: 29.7.0 - semver: 7.7.1 - transitivePeerDependencies: - - supports-color + is-potential-custom-element-name@1.0.1: {} - jest-util@29.7.0: - dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.17.31 - chalk: 4.1.2 - ci-info: 3.9.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 + is-what@4.1.16: {} - jest-validate@29.7.0: - dependencies: - '@jest/types': 29.6.3 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 29.6.3 - leven: 3.1.0 - pretty-format: 29.7.0 + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} - jest-watcher@29.7.0: + istanbul-lib-report@3.0.1: dependencies: - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 20.17.31 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.13.1 - jest-util: 29.7.0 - string-length: 4.0.2 + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 - jest-worker@29.7.0: + istanbul-reports@3.2.0: dependencies: - '@types/node': 20.17.31 - jest-util: 29.7.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 - jest@29.7.0(@types/node@20.17.31): + jackspeak@3.4.3: dependencies: - '@jest/core': 29.7.0 - '@jest/types': 29.6.3 - import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.17.31) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 joycon@3.1.1: {} - js-tokens@4.0.0: {} + js-tokens@10.0.0: {} - js-yaml@3.14.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 + js-tokens@4.0.0: {} js-yaml@4.1.0: dependencies: argparse: 2.0.1 - jsdom@20.0.3: - dependencies: - abab: 2.0.6 - acorn: 8.14.1 - acorn-globals: 7.0.1 - cssom: 0.5.0 - cssstyle: 2.3.0 - data-urls: 3.0.2 - decimal.js: 10.5.0 - domexception: 4.0.0 - escodegen: 2.1.0 - form-data: 4.0.2 - html-encoding-sniffer: 3.0.0 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 + jsdom@30.0.1: + dependencies: + '@asamuzakjp/css-color': 6.0.7 + '@asamuzakjp/dom-selector': 8.3.2 + '@bramus/specificity': 2.4.2 + '@csstools/css-syntax-patches-for-csstree': 1.1.12(css-tree@3.2.1) + '@exodus/bytes': 1.15.1 + css-tree: 3.2.1 + data-urls: 7.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 6.0.0 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.20 - parse5: 7.3.0 + lru-cache: 11.5.2 + parse5: 8.0.1 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 4.1.4 - w3c-xmlserializer: 4.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 2.0.0 - whatwg-mimetype: 3.0.0 - whatwg-url: 11.0.0 - ws: 8.18.1 - xml-name-validator: 4.0.0 + tough-cookie: 6.0.2 + undici: 8.10.1 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 8.0.1 + whatwg-mimetype: 5.0.0 + whatwg-url: 17.1.0 + xml-name-validator: 5.0.0 transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - jsesc@3.0.2: {} + - '@noble/hashes' jsesc@3.1.0: {} json-buffer@3.0.1: {} - json-parse-even-better-errors@2.3.1: {} - json-schema-traverse@0.4.1: {} json-stable-stringify-without-jsonify@1.0.1: {} json5@2.2.3: {} - jsonc-parser@3.3.1: {} - keyv@4.5.4: dependencies: json-buffer: 3.0.1 - kleur@3.0.3: {} - - leven@3.1.0: {} - levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -6838,46 +3722,44 @@ snapshots: load-tsconfig@0.2.5: {} - locate-path@5.0.0: - dependencies: - p-locate: 4.1.0 - locate-path@6.0.0: dependencies: p-locate: 5.0.0 - lodash.debounce@4.0.8: {} - lodash.merge@4.6.2: {} lodash.sortby@4.7.0: {} - loupe@3.2.1: {} - lru-cache@10.4.3: {} + lru-cache@11.5.2: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 lz-string@1.5.0: {} - make-dir@4.0.0: + magic-string@0.30.21: dependencies: - semver: 7.7.1 + '@jridgewell/sourcemap-codec': 1.6.0 + + magicast@0.5.4: + dependencies: + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + source-map-js: 1.2.1 - makeerror@1.0.12: + make-dir@4.0.0: dependencies: - tmpl: 1.0.5 + semver: 7.7.1 - math-intrinsics@1.1.0: {} + mdn-data@2.27.1: {} merge-anything@5.1.7: dependencies: is-what: 4.1.16 - merge-stream@2.0.0: {} - merge2@1.4.1: {} micromatch@4.0.8: @@ -6885,14 +3767,6 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mimic-fn@2.1.0: {} - min-indent@1.0.1: {} minimatch@3.1.2: @@ -6927,35 +3801,16 @@ snapshots: natural-compare@1.4.0: {} - node-int64@0.4.0: {} - node-releases@2.0.19: {} - normalize-path@3.0.0: {} - - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - - nwsapi@2.2.20: {} - object-assign@4.1.1: {} + obug@2.1.4: {} + once@1.4.0: dependencies: wrappy: 1.0.2 - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - - open@10.2.0: - dependencies: - default-browser: 5.5.1 - define-lazy-prop: 3.0.0 - is-inside-container: 1.0.0 - wsl-utils: 0.1.0 - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -6965,89 +3820,27 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - oxc-parser@0.127.0: - dependencies: - '@oxc-project/types': 0.127.0 - optionalDependencies: - '@oxc-parser/binding-android-arm-eabi': 0.127.0 - '@oxc-parser/binding-android-arm64': 0.127.0 - '@oxc-parser/binding-darwin-arm64': 0.127.0 - '@oxc-parser/binding-darwin-x64': 0.127.0 - '@oxc-parser/binding-freebsd-x64': 0.127.0 - '@oxc-parser/binding-linux-arm-gnueabihf': 0.127.0 - '@oxc-parser/binding-linux-arm-musleabihf': 0.127.0 - '@oxc-parser/binding-linux-arm64-gnu': 0.127.0 - '@oxc-parser/binding-linux-arm64-musl': 0.127.0 - '@oxc-parser/binding-linux-ppc64-gnu': 0.127.0 - '@oxc-parser/binding-linux-riscv64-gnu': 0.127.0 - '@oxc-parser/binding-linux-riscv64-musl': 0.127.0 - '@oxc-parser/binding-linux-s390x-gnu': 0.127.0 - '@oxc-parser/binding-linux-x64-gnu': 0.127.0 - '@oxc-parser/binding-linux-x64-musl': 0.127.0 - '@oxc-parser/binding-openharmony-arm64': 0.127.0 - '@oxc-parser/binding-wasm32-wasi': 0.127.0 - '@oxc-parser/binding-win32-arm64-msvc': 0.127.0 - '@oxc-parser/binding-win32-ia32-msvc': 0.127.0 - '@oxc-parser/binding-win32-x64-msvc': 0.127.0 - - oxc-resolver@11.21.2: - optionalDependencies: - '@oxc-resolver/binding-android-arm-eabi': 11.21.2 - '@oxc-resolver/binding-android-arm64': 11.21.2 - '@oxc-resolver/binding-darwin-arm64': 11.21.2 - '@oxc-resolver/binding-darwin-x64': 11.21.2 - '@oxc-resolver/binding-freebsd-x64': 11.21.2 - '@oxc-resolver/binding-linux-arm-gnueabihf': 11.21.2 - '@oxc-resolver/binding-linux-arm-musleabihf': 11.21.2 - '@oxc-resolver/binding-linux-arm64-gnu': 11.21.2 - '@oxc-resolver/binding-linux-arm64-musl': 11.21.2 - '@oxc-resolver/binding-linux-ppc64-gnu': 11.21.2 - '@oxc-resolver/binding-linux-riscv64-gnu': 11.21.2 - '@oxc-resolver/binding-linux-riscv64-musl': 11.21.2 - '@oxc-resolver/binding-linux-s390x-gnu': 11.21.2 - '@oxc-resolver/binding-linux-x64-gnu': 11.21.2 - '@oxc-resolver/binding-linux-x64-musl': 11.21.2 - '@oxc-resolver/binding-openharmony-arm64': 11.21.2 - '@oxc-resolver/binding-wasm32-wasi': 11.21.2 - '@oxc-resolver/binding-win32-arm64-msvc': 11.21.2 - '@oxc-resolver/binding-win32-x64-msvc': 11.21.2 - - p-limit@2.3.0: - dependencies: - p-try: 2.2.0 - p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - p-locate@4.1.0: - dependencies: - p-limit: 2.3.0 - p-locate@5.0.0: dependencies: p-limit: 3.1.0 - p-try@2.2.0: {} - package-json-from-dist@1.0.1: {} parent-module@1.0.1: dependencies: callsites: 3.1.0 - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.26.2 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - parse5@7.3.0: dependencies: entities: 6.0.0 - path-browserify@1.0.1: {} + parse5@8.0.1: + dependencies: + entities: 8.0.0 path-exists@4.0.0: {} @@ -7055,8 +3848,6 @@ snapshots: path-key@3.1.1: {} - path-parse@1.0.7: {} - path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 @@ -7064,7 +3855,7 @@ snapshots: path-type@4.0.0: {} - pathval@2.0.1: {} + pathe@2.0.3: {} picocolors@1.1.1: {} @@ -7076,9 +3867,13 @@ snapshots: pirates@4.0.7: {} - pkg-dir@4.2.0: + playwright-core@1.62.1: {} + + playwright@1.62.1: dependencies: - find-up: 4.1.0 + playwright-core: 1.62.1 + optionalDependencies: + fsevents: 2.3.2 postcss-load-config@6.0.1(postcss@8.5.26): dependencies: @@ -7102,97 +3897,30 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 - pretty-format@29.7.0: - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.3.1 - - prompts@2.4.2: - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - - psl@1.15.0: - dependencies: - punycode: 2.3.1 - punycode@2.3.1: {} - pure-rand@6.1.0: {} - - querystringify@2.2.0: {} - queue-microtask@1.2.3: {} react-is@17.0.2: {} - react-is@18.3.1: {} - - react@19.2.8: {} + react@19.2.8: + optional: true readdirp@4.1.2: {} - recast@0.23.21: - dependencies: - ast-types: 0.16.1 - esprima: 4.0.1 - source-map: 0.6.1 - tiny-invariant: 1.3.3 - tslib: 2.8.1 - redent@3.0.0: dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 - regenerate-unicode-properties@10.2.0: - dependencies: - regenerate: 1.4.2 - - regenerate@1.4.2: {} - regenerator-runtime@0.14.1: {} - regenerator-transform@0.15.2: - dependencies: - '@babel/runtime': 7.27.0 - - regexpu-core@6.2.0: - dependencies: - regenerate: 1.4.2 - regenerate-unicode-properties: 10.2.0 - regjsgen: 0.8.0 - regjsparser: 0.12.0 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.2.0 - - regjsgen@0.8.0: {} - - regjsparser@0.12.0: - dependencies: - jsesc: 3.0.2 - - require-directory@2.1.1: {} - - requires-port@1.0.0: {} - - resolve-cwd@3.0.0: - dependencies: - resolve-from: 5.0.0 + require-from-string@2.0.2: {} resolve-from@4.0.0: {} resolve-from@5.0.0: {} - resolve.exports@2.0.3: {} - - resolve@1.22.10: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - reusify@1.1.0: {} rimraf@3.0.2: @@ -7246,14 +3974,10 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.40.0 fsevents: 2.3.3 - run-applescript@7.1.0: {} - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - safer-buffer@2.1.2: {} - saxes@6.0.0: dependencies: xmlchars: 2.2.0 @@ -7262,8 +3986,6 @@ snapshots: semver@7.7.1: {} - semver@7.8.5: {} - seroval-plugins@1.5.6(seroval@1.5.6): dependencies: seroval: 1.5.6 @@ -7276,12 +3998,10 @@ snapshots: shebang-regex@3.0.0: {} - signal-exit@3.0.7: {} + siginfo@2.0.0: {} signal-exit@4.1.0: {} - sisteransi@1.0.5: {} - slash@3.0.0: {} solid-js@2.0.0-rc.3: @@ -7293,73 +4013,13 @@ snapshots: source-map-js@1.2.1: {} - source-map-support@0.5.13: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 - sprintf-js@1.0.3: {} - - stack-utils@2.0.6: - dependencies: - escape-string-regexp: 2.0.0 - - storybook-solidjs-vite@10.7.1(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(esbuild@0.25.3)(rollup@4.40.0)(solid-js@2.0.0-rc.3)(storybook@10.5.10(prettier@3.5.3)(react@19.2.8))(typescript@5.8.3)(vite-plugin-solid@3.0.0-next.27(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.3)(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)))(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)): - dependencies: - '@storybook/builder-vite': 10.5.10(esbuild@0.25.3)(rollup@4.40.0)(storybook@10.5.10(prettier@3.5.3)(react@19.2.8))(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)) - '@storybook/global': 5.0.0 - '@typescript/typescript6': 6.0.2 - '@volar/language-core': 2.4.28 - '@volar/typescript': 2.4.28 - semver: 7.8.5 - solid-js: 2.0.0-rc.3 - storybook: 10.5.10(prettier@3.5.3)(react@19.2.8) - vite: 8.2.2(@types/node@20.17.31)(esbuild@0.25.3) - vite-plugin-solid: 3.0.0-next.27(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.3)(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)) - optionalDependencies: - '@solidjs/web': 2.0.0-rc.3(solid-js@2.0.0-rc.3) - typescript: 5.8.3 - transitivePeerDependencies: - - esbuild - - rollup - - webpack - - storybook@10.5.10(prettier@3.5.3)(react@19.2.8): - dependencies: - '@storybook/global': 5.0.0 - '@storybook/icons': 2.1.0(react@19.2.8) - '@testing-library/dom': 10.4.1 - '@testing-library/jest-dom': 6.9.1 - '@testing-library/user-event': 14.6.6(@testing-library/dom@10.4.1) - '@vitest/expect': 3.2.4 - '@vitest/spy': 3.2.4 - '@webcontainer/env': 1.1.1 - esbuild: 0.25.3 - jsonc-parser: 3.3.1 - open: 10.2.0 - oxc-parser: 0.127.0 - oxc-resolver: 11.21.2 - recast: 0.23.21 - semver: 7.8.5 - use-sync-external-store: 1.6.0(react@19.2.8) - ws: 8.21.3 - optionalDependencies: - prettier: 3.5.3 - transitivePeerDependencies: - - bufferutil - - react - - utf-8-validate + stackback@0.0.2: {} - string-length@4.0.2: - dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 + std-env@4.2.0: {} string-width@4.2.3: dependencies: @@ -7381,10 +4041,6 @@ snapshots: dependencies: ansi-regex: 6.1.0 - strip-bom@4.0.0: {} - - strip-final-newline@2.0.0: {} - strip-indent@3.0.0: dependencies: min-indent: 1.0.1 @@ -7405,20 +4061,8 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - supports-preserve-symlinks-flag@1.0.0: {} - symbol-tree@3.2.4: {} - test-exclude@6.0.0: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - text-table@0.2.0: {} thenify-all@1.6.0: @@ -7429,10 +4073,12 @@ snapshots: dependencies: any-promise: 1.3.0 - tiny-invariant@1.3.3: {} + tinybench@2.9.0: {} tinyexec@0.3.2: {} + tinyexec@1.3.0: {} + tinyglobby@0.2.13: dependencies: fdir: 6.4.4(picomatch@4.0.2) @@ -7443,28 +4089,27 @@ snapshots: fdir: 6.5.0(picomatch@4.0.7) picomatch: 4.0.7 - tinyrainbow@2.0.0: {} + tinyrainbow@3.1.1: {} - tinyspy@4.0.4: {} + tldts-core@7.4.11: {} - tmpl@1.0.5: {} + tldts@7.4.11: + dependencies: + tldts-core: 7.4.11 to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - tough-cookie@4.1.4: + tough-cookie@6.0.2: dependencies: - psl: 1.15.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 + tldts: 7.4.11 tr46@1.0.1: dependencies: punycode: 2.3.1 - tr46@3.0.0: + tr46@6.0.0: dependencies: punycode: 2.3.1 @@ -7474,8 +4119,6 @@ snapshots: dependencies: typescript: 5.8.3 - ts-dedent@2.3.0: {} - ts-interface-checker@0.1.13: {} tslib@2.8.1: {} @@ -7520,37 +4163,13 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-detect@4.0.8: {} - type-fest@0.20.2: {} - type-fest@0.21.3: {} - typescript@5.8.3: {} - typescript@6.0.3: {} - - undici-types@6.19.8: {} + undici-types@6.21.0: {} - unicode-canonical-property-names-ecmascript@2.0.1: {} - - unicode-match-property-ecmascript@2.0.0: - dependencies: - unicode-canonical-property-names-ecmascript: 2.0.1 - unicode-property-aliases-ecmascript: 2.1.0 - - unicode-match-property-value-ecmascript@2.2.0: {} - - unicode-property-aliases-ecmascript@2.1.0: {} - - universalify@0.2.0: {} - - unplugin@2.3.11: - dependencies: - '@jridgewell/remapping': 2.3.5 - acorn: 8.18.0 - picomatch: 4.0.7 - webpack-virtual-modules: 0.6.2 + undici@8.10.1: {} update-browserslist-db@1.1.3(browserslist@4.24.4): dependencies: @@ -7562,35 +4181,9 @@ snapshots: dependencies: punycode: 2.3.1 - url-parse@1.5.10: - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - - use-sync-external-store@1.6.0(react@19.2.8): - dependencies: - react: 19.2.8 - - v8-to-istanbul@9.3.0: - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 2.0.0 - validate-html-nesting@1.2.2: {} - vite-plugin-solid@3.0.0-next.27(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.3)(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)): - dependencies: - '@solidjs/vite-plugin': 3.0.0-next.36(@solidjs/web@2.0.0-rc.3(solid-js@2.0.0-rc.3))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.3)(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)) - transitivePeerDependencies: - - '@solidjs/start-devtools' - - '@solidjs/web' - - '@testing-library/jest-dom' - - solid-js - - supports-color - - vite - - vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3): + vite@8.2.2(@types/node@22.20.1)(esbuild@0.25.3): dependencies: lightningcss: 1.33.0 picomatch: 4.0.7 @@ -7598,40 +4191,68 @@ snapshots: rolldown: 1.2.6 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 20.17.31 + '@types/node': 22.20.1 esbuild: 0.25.3 fsevents: 2.3.3 - vitefu@1.1.3(vite@8.2.2(@types/node@20.17.31)(esbuild@0.25.3)): + vitefu@1.1.3(vite@8.2.2(@types/node@22.20.1)(esbuild@0.25.3)): optionalDependencies: - vite: 8.2.2(@types/node@20.17.31)(esbuild@0.25.3) - - vscode-uri@3.2.0: {} - - w3c-xmlserializer@4.0.0: - dependencies: - xml-name-validator: 4.0.0 + vite: 8.2.2(@types/node@22.20.1)(esbuild@0.25.3) + + vitest@4.1.11(@types/node@22.20.1)(@vitest/coverage-v8@4.1.11)(jsdom@30.0.1)(vite@8.2.2(@types/node@22.20.1)(esbuild@0.25.3)): + dependencies: + '@vitest/expect': 4.1.11 + '@vitest/mocker': 4.1.11(vite@8.2.2(@types/node@22.20.1)(esbuild@0.25.3)) + '@vitest/pretty-format': 4.1.11 + '@vitest/runner': 4.1.11 + '@vitest/snapshot': 4.1.11 + '@vitest/spy': 4.1.11 + '@vitest/utils': 4.1.11 + es-module-lexer: 2.3.2 + expect-type: 1.4.0 + magic-string: 0.30.21 + obug: 2.1.4 + pathe: 2.0.3 + picomatch: 4.0.7 + std-env: 4.2.0 + tinybench: 2.9.0 + tinyexec: 1.3.0 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.1 + vite: 8.2.2(@types/node@22.20.1)(esbuild@0.25.3) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.20.1 + '@vitest/coverage-v8': 4.1.11(vitest@4.1.11) + jsdom: 30.0.1 + transitivePeerDependencies: + - msw - walker@1.0.8: + w3c-xmlserializer@5.0.0: dependencies: - makeerror: 1.0.12 + xml-name-validator: 5.0.0 webidl-conversions@4.0.2: {} - webidl-conversions@7.0.0: {} + webidl-conversions@8.0.1: {} - webpack-virtual-modules@0.6.2: {} + whatwg-mimetype@5.0.0: {} - whatwg-encoding@2.0.0: + whatwg-url@16.0.1: dependencies: - iconv-lite: 0.6.3 - - whatwg-mimetype@3.0.0: {} + '@exodus/bytes': 1.15.1 + tr46: 6.0.0 + webidl-conversions: 8.0.1 + transitivePeerDependencies: + - '@noble/hashes' - whatwg-url@11.0.0: + whatwg-url@17.1.0: dependencies: - tr46: 3.0.0 - webidl-conversions: 7.0.0 + '@exodus/bytes': 1.15.1 + tr46: 6.0.0 + webidl-conversions: 8.0.1 + transitivePeerDependencies: + - '@noble/hashes' whatwg-url@7.1.0: dependencies: @@ -7643,6 +4264,11 @@ snapshots: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + word-wrap@1.2.5: {} wrap-ansi@7.0.0: @@ -7659,37 +4285,10 @@ snapshots: wrappy@1.0.2: {} - write-file-atomic@4.0.2: - dependencies: - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - - ws@8.18.1: {} - - ws@8.21.3: {} - - wsl-utils@0.1.0: - dependencies: - is-wsl: 3.1.1 - - xml-name-validator@4.0.0: {} + xml-name-validator@5.0.0: {} xmlchars@2.2.0: {} - y18n@5.0.8: {} - yallist@3.1.1: {} - yargs-parser@21.1.1: {} - - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - yocto-queue@0.1.0: {} diff --git a/src/engine.ts b/src/engine.ts index 568e11f..ab3d21e 100644 --- a/src/engine.ts +++ b/src/engine.ts @@ -1,6 +1,15 @@ -import {animate} from "framer-motion/dom" -import {inView as motionInView} from "framer-motion/dom" -import {hover, press, buildHTMLStyles} from "motion-dom" +import {animate, inView} from "framer-motion/dom" +import { + hover, + press, + buildHTMLStyles, + buildSVGAttrs, + isSVGTag, + transformProps, + defaultTransformValue, + camelToDash, +} from "motion-dom" +import {SVGElements} from "@solidjs/web" import type {AnimationOptions} from "motion-dom" import type {Options, Target, VariantDefinition} from "./types.js" @@ -19,6 +28,10 @@ export interface MotionState { getInitialVariantKey(): string | undefined } +/* -------------------------------------------------------------------------- */ +/* Targets and styles */ +/* -------------------------------------------------------------------------- */ + function resolveTarget( def: VariantDefinition | undefined, variants: Record | undefined, @@ -27,6 +40,28 @@ function resolveTarget( return typeof def === "string" ? variants?.[def] : def } +function targetValues(target: Target | undefined): Record { + if (!target) return {} + const {transition: _transition, ...values} = target + return values +} + +/* +Order-independent structural compare of two targets' animatable values. +`initial={{opacity: 0, x: 0}}` and `animate={{x: 0, opacity: 0}}` describe the +same thing, but a plain JSON.stringify of each would not agree — and this +comparison is what decides whether an animation runs at all. +*/ +function sameValues(a: Target | undefined, b: Target | undefined): boolean { + const a_values = targetValues(a) + const b_values = targetValues(b) + const keys = Object.keys(a_values) + if (keys.length !== Object.keys(b_values).length) return false + return keys.every( + key => key in b_values && JSON.stringify(a_values[key]) === JSON.stringify(b_values[key]), + ) +} + /* Two compatibility shims for the documented `transition={{duration, key: {...}}}` per-value override syntax: @@ -41,7 +76,8 @@ per-value override syntax: of its own completes almost instantly instead of over the base duration). Merging here keeps the documented, more ergonomic behavior working. */ -function normalizeTransition(transition: unknown): AnimationOptions | undefined { +/** @internal exported for tests: this compat shim is easier to check directly */ +export function normalizeTransition(transition: unknown): AnimationOptions | undefined { if (!transition || typeof transition !== "object") return transition as AnimationOptions | undefined @@ -62,22 +98,40 @@ function normalizeTransition(transition: unknown): AnimationOptions | undefined return result as AnimationOptions } -function targetValues(target: Target | undefined): Record { - if (!target) return {} - const {transition: _transition, ...values} = target - return values +/** @internal what a target renders as statically, before anything animates */ +export interface StartStyles { + style: Record + /** SVG geometry, which is carried by attributes rather than by style */ + attrs: Record } -/** @internal */ -export function createStyles(target: Target): Record { - const renderState = {transform: {}, transformOrigin: {}, vars: {}, style: {}} +/** + * @internal + * @param tag the element's tag name, which decides whether the target is built + * as HTML styles or as SVG attributes + */ +export function createStyles(target: Target, tag = "div"): StartStyles { + const renderState = {transform: {}, transformOrigin: {}, vars: {}, style: {}, attrs: {}} // a static (non-animated) style can't represent a keyframe list — use its first value const staticValues: Record = {} for (const [key, value] of Object.entries(targetValues(target))) { staticValues[key] = Array.isArray(value) ? value[0] : value } - buildHTMLStyles(renderState as any, staticValues as any) - return {...(renderState.vars as any), ...(renderState.style as any)} + /* + SVG geometry (`height`, `cx`, `r`, ...) is animated by Motion as an + attribute, not as a style. Emitting the starting value as an inline style + instead would outrank the animated attribute in the cascade and pin the + element to its `initial` forever, so SVG elements are built through + `buildSVGAttrs`, which splits geometry into `attrs` and leaves the rest + (opacity, fill, the `` root's own transform) in `style`. + */ + if (SVGElements.has(tag)) buildSVGAttrs(renderState as any, staticValues as any, isSVGTag(tag)) + else buildHTMLStyles(renderState as any, staticValues as any) + + return { + style: {...(renderState.vars as any), ...(renderState.style as any)}, + attrs: renderState.attrs as Record, + } } /** @internal */ @@ -89,14 +143,95 @@ export const style = { } function applyStylesDirect(el: Element, target: Target): void { - const styles = createStyles(target) + const {style: styles, attrs} = createStyles(target, el.tagName.toLowerCase()) for (const key in styles) style.set(el, key, styles[key]) + for (const key in attrs) el.setAttribute(key, String(attrs[key])) } function dispatch(el: Element, type: string, detail: Record): void { el.dispatchEvent(new CustomEvent(type, {detail})) } +/* -------------------------------------------------------------------------- */ +/* Layers and gestures */ +/* -------------------------------------------------------------------------- */ + +/* +The animated target is the merge of every currently-active layer, lowest +priority first — `press` wins over `hover`, which wins over `inView`, which +wins over the always-active `animate`. Resolving through one ordered list +means mount, update and every gesture all compute the target the same way, +instead of each assembling its own idea of what the element should look like. +*/ +const LAYERS = ["animate", "inView", "hover", "press"] as const +type Layer = (typeof LAYERS)[number] +type GestureLayer = Exclude + +/* +`hover`, `press` and `inView` all share the same shape: bind to an element with +an `(element, event) => cleanup | void` handler, get an unbind back. That lets +all three be driven by one table instead of three near-identical blocks. +*/ +type GestureBinder = ( + el: Element, + onStart: (el: Element, event: any) => ((event: any) => void) | void, + options?: any, +) => () => void + +interface Gesture { + layer: GestureLayer + bind: GestureBinder + /** event dispatched when the layer switches on / off */ + enter: string + leave: string + detail: (event: any) => Record + /** per-gesture binding options pulled off the component's props, if any */ + bindOptions?: (options: Options) => unknown +} + +const GESTURES: Gesture[] = [ + { + layer: "inView", + bind: inView as GestureBinder, + enter: "viewenter", + leave: "viewleave", + detail: entry => ({originalEntry: entry}), + bindOptions: options => options.inViewOptions, + }, + { + layer: "hover", + bind: hover as GestureBinder, + enter: "hoverstart", + leave: "hoverend", + detail: event => ({originalEvent: event}), + }, + { + layer: "press", + bind: press as GestureBinder, + enter: "pressstart", + leave: "pressend", + detail: event => ({originalEvent: event}), + }, +] + +/* +Only rebind when a gesture is added or removed, not whenever its target object +changes identity — the bound handlers read the latest `options` at fire time, so +a new `hover={{...}}` object needs no rebind. Solid re-evaluates inline JSX prop +objects on every read, so comparing those by reference would rebind constantly +and cut off in-progress interactions. +*/ +function gesturesChanged(prev: Options, next: Options): boolean { + return ( + GESTURES.some(gesture => !!prev[gesture.layer] !== !!next[gesture.layer]) || + prev.inViewOptions !== next.inViewOptions + ) +} + +/* -------------------------------------------------------------------------- */ +/* State */ +/* -------------------------------------------------------------------------- */ + interface MountContext { element: Element cancelAnimation?: () => void @@ -106,7 +241,28 @@ interface MountContext { /** @internal */ export function createMotionState(initialOptions: Options, parent?: MotionState): MotionState { let options = initialOptions - const active = {hover: false, press: false, exit: false} + + /** which layers currently contribute to the target; `animate` is always on */ + const active: Record = { + animate: true, + inView: false, + hover: false, + press: false, + } + /** `exit` replaces the layer stack outright rather than merging on top of it */ + let exiting = false + + /** the target most recently animated to — the baseline `update()` diffs against */ + let lastTarget: Target | undefined + + /* + What the element looked like before a gesture layer first introduced a key + that no other layer sets. Turning that layer off resolves to a target which + simply omits the key, and an omitted key is not an instruction to animate + back — without a remembered base value, a `hover` used with no `animate` + prop would leave the element stuck on its hover values forever. + */ + const baseValues: Record = {} /* Scoped to whichever mount() call is currently active. A sibling Motion @@ -126,6 +282,7 @@ export function createMotionState(initialOptions: Options, parent?: MotionState) return undefined } + /** The style to render *before* anything animates — also what SSR paints. */ function getStartTarget(): Target { if (options.initial === false) { return resolveTarget(options.animate, options.variants) ?? {} @@ -146,20 +303,44 @@ export function createMotionState(initialOptions: Options, parent?: MotionState) return resolveTarget(options.initial, options.variants) ?? {} } - function computeEffectiveTarget(): Target { - if (active.exit) return resolveTarget(options.exit, options.variants) ?? {} - const target: Target = {...(resolveTarget(options.animate, options.variants) ?? {})} - if (active.hover) Object.assign(target, resolveTarget(options.hover, options.variants)) - if (active.press) Object.assign(target, resolveTarget(options.press, options.variants)) + /** The single source of truth for what this element should look like right now. */ + function resolveActiveTarget(): Target { + if (exiting) return resolveTarget(options.exit, options.variants) ?? {} + const target: Target = {} + for (const layer of LAYERS) { + if (active[layer]) + Object.assign(target, resolveTarget(options[layer], options.variants)) + } + // bring back the pre-gesture value of anything no active layer drives now + const values = target as Record + for (const key in baseValues) { + if (!(key in values)) values[key] = baseValues[key] + } return target } - function animateToTarget(target: Target): Promise { + function applyTarget(target: Target): Promise { + lastTarget = target + const ctx = current ctx?.cancelAnimation?.() if (!ctx) return Promise.resolve() const values = targetValues(target) - if (Object.keys(values).length === 0) return Promise.resolve() + if (Object.keys(values).length === 0) { + /* + Nothing to animate. An exit still has to report itself finished: both + presence.tsx and primitives.ts wait on the motionstart/motioncomplete + pair before removing the element, so an `exit` that resolves to no + values (`exit={{}}`, or a variant key with no matching entry) would + otherwise leave the element in the DOM forever. Deferred by a + microtask so listeners attached right after this call still catch it. + */ + if (!exiting) return Promise.resolve() + dispatch(ctx.element, "motionstart", {target}) + return Promise.resolve().then(() => { + if (current === ctx) dispatch(ctx.element, "motioncomplete", {target}) + }) + } // merge, then normalize once — normalizing an already-normalized base // transition again would re-merge its own per-value overrides against a @@ -178,55 +359,43 @@ export function createMotionState(initialOptions: Options, parent?: MotionState) ) } - function bindGestures(el: Element): () => void { - const unbinds: Array<() => void> = [] - if (options.hover) { - unbinds.push( - hover(el, (_el, startEvent) => { - active.hover = true - dispatch(el, "hoverstart", {originalEvent: startEvent}) - void animateToTarget(computeEffectiveTarget()) - return endEvent => { - active.hover = false - dispatch(el, "hoverend", {originalEvent: endEvent}) - void animateToTarget(computeEffectiveTarget()) - } - }), - ) - } - if (options.press) { - unbinds.push( - press(el, (_el, startEvent) => { - active.press = true - dispatch(el, "pressstart", {originalEvent: startEvent}) - void animateToTarget(computeEffectiveTarget()) - return endEvent => { - active.press = false - dispatch(el, "pressend", {originalEvent: endEvent}) - void animateToTarget(computeEffectiveTarget()) - } - }), - ) - } - if (options.inView) { - unbinds.push( - motionInView( - el, - (entry: any) => { - dispatch(el, "viewenter", {originalEntry: entry}) - void animateToTarget({ - ...(resolveTarget(options.animate, options.variants) ?? {}), - ...resolveTarget(options.inView, options.variants), - }) - return leaveEntry => { - dispatch(el, "viewleave", {originalEntry: leaveEntry}) - void animateToTarget(computeEffectiveTarget()) - } - }, - options.inViewOptions as any, - ), - ) + /** Reads what the element currently shows for a value nothing else drives. */ + function readBaseValue(el: Element, key: string): unknown { + if (transformProps.has(key)) return defaultTransformValue(key) + const computed = window.getComputedStyle(el) + return key.startsWith("--") + ? computed.getPropertyValue(key) + : computed.getPropertyValue(camelToDash(key)) + } + + function captureBaseValues(el: Element, layer: GestureLayer): void { + const introduced = targetValues(resolveTarget(options[layer], options.variants)) + const driven = targetValues(resolveActiveTarget()) + for (const key of Object.keys(introduced)) { + // anything another layer already sets resolves on its own when this one ends + if (key in baseValues || key in driven) continue + baseValues[key] = readBaseValue(el, key) } + } + + function setLayer(el: Element, gesture: Gesture, isActive: boolean, event: unknown): void { + if (isActive) captureBaseValues(el, gesture.layer) + active[gesture.layer] = isActive + dispatch(el, isActive ? gesture.enter : gesture.leave, gesture.detail(event)) + void applyTarget(resolveActiveTarget()) + } + + function bindGestures(el: Element): () => void { + const unbinds = GESTURES.filter(gesture => options[gesture.layer]).map(gesture => + gesture.bind( + el, + (_el, startEvent) => { + setLayer(el, gesture, true, startEvent) + return endEvent => setLayer(el, gesture, false, endEvent) + }, + gesture.bindOptions?.(options), + ), + ) return () => unbinds.forEach(unbind => unbind()) } @@ -235,16 +404,24 @@ export function createMotionState(initialOptions: Options, parent?: MotionState) const ctx: MountContext = {element: el} current = ctx + /* + A state object outlives its element: under a , a Motion can + be exit-animated and torn down, then mounted again by the very next + enter (see primitives.ts's mount-gating effect). Flags left over from + that previous life would otherwise keep resolving to a stale target — + a still-set `exiting` in particular pins the element to its exit + target and blocks every later `animate` update. + */ + exiting = false + active.inView = active.hover = active.press = false + for (const key in baseValues) delete baseValues[key] + const startTarget = getStartTarget() applyStylesDirect(el, startTarget) - const animateTarget = resolveTarget(options.animate, options.variants) ?? {} - if ( - JSON.stringify(targetValues(startTarget)) !== - JSON.stringify(targetValues(animateTarget)) - ) { - void animateToTarget(animateTarget) - } + const target = resolveActiveTarget() + lastTarget = target + if (!sameValues(startTarget, target)) void applyTarget(target) ctx.unbindGestures = bindGestures(el) mountedStates.set(el, state) @@ -258,33 +435,22 @@ export function createMotionState(initialOptions: Options, parent?: MotionState) }, update(newOptions: Options) { const prevOptions = options - const prevAnimate = JSON.stringify( - resolveTarget(prevOptions.animate, prevOptions.variants) ?? {}, - ) options = newOptions - // only tear down and recreate gesture listeners when a gesture-related - // prop actually changed — not on every unrelated reactive update (e.g. - // a reactive `animate` value), which would cut off an in-progress - // hover/press/inView interaction for no reason - const gesturesChanged = - prevOptions.hover !== options.hover || - prevOptions.press !== options.press || - prevOptions.inView !== options.inView || - prevOptions.inViewOptions !== options.inViewOptions - if (gesturesChanged && current) { + if (current && gesturesChanged(prevOptions, options)) { current.unbindGestures?.() current.unbindGestures = bindGestures(current.element) } - const nextAnimate = resolveTarget(options.animate, options.variants) ?? {} - if (!active.exit && prevAnimate !== JSON.stringify(nextAnimate)) { - void animateToTarget(computeEffectiveTarget()) - } + // an exiting element is on its way out — leave it on its exit target + if (exiting) return + + const target = resolveActiveTarget() + if (!sameValues(target, lastTarget)) void applyTarget(target) }, - setActive(type: "exit", isActive: boolean) { - active[type] = isActive - return animateToTarget(computeEffectiveTarget()) + setActive(_type: "exit", isActive: boolean) { + exiting = isActive + return applyTarget(resolveActiveTarget()) }, getTarget: getStartTarget, getOptions: () => options, diff --git a/src/motion.tsx b/src/motion.tsx index ff5787b..81fee94 100644 --- a/src/motion.tsx +++ b/src/motion.tsx @@ -1,6 +1,6 @@ import {Dynamic} from "@solidjs/web" import type {JSX} from "@solidjs/web" -import {omit, createContext} from "solid-js" +import {merge, omit, createContext} from "solid-js" import {combineStyle} from "@solid-primitives/props" import {MotionState} from "./engine.js" @@ -33,8 +33,9 @@ export const MotionComponent = ( }, ): JSX.Element => { const attrs = omit(props, ...OPTION_KEYS, ...ATTR_KEYS) + const tag = props.tag || "div" - const [state, style] = createAndBindMotionState( + const [state, startStyles] = createAndBindMotionState( () => root, () => ({ initial: props.initial, @@ -49,19 +50,31 @@ export const MotionComponent = ( }), tryUseContext(PresenceContext), tryUseContext(ParentContext), + tag, ) + /* + Folded into one object rather than spread separately: an extra prop source + shifts Solid's hydration key numbering and adds a stray separator to the + rendered markup, so an element with no SVG geometry keeps exactly the props + it had before. The start target goes last so its geometry wins over a + same-named prop, matching how the computed style layers over `props.style`. + */ + const renderedAttrs = Object.keys(startStyles.attrs).length + ? merge(attrs, startStyles.attrs) + : attrs + let root!: Element return ( { root = el props.ref?.(el) }} - component={props.tag || "div"} - style={combineStyle(props.style, style)} + component={tag} + style={combineStyle(props.style, startStyles.style)} /> ) @@ -94,7 +107,15 @@ export const MotionComponent = ( * ``` */ export const Motion = new Proxy(MotionComponent, { - get: - (_, tag: string): MotionProxyComponent => - props => , + /* + Only keys the component function doesn't already answer to are treated as tag + names. Without that fallback every access returns a component — including + `Motion.then`, which makes `Motion` look like a thenable and hangs anything + that awaits it or resolves it as a lazily-imported component. `then` is + excluded explicitly because it isn't a property of `Function.prototype`. + */ + get: (target, key, receiver) => + typeof key === "string" && key !== "then" && !Reflect.has(target, key) + ? ((props => ) as MotionProxyComponent) + : Reflect.get(target, key, receiver), }) as MotionProxy diff --git a/src/presence.tsx b/src/presence.tsx index 7ab6f51..0d58856 100644 --- a/src/presence.tsx +++ b/src/presence.tsx @@ -1,7 +1,14 @@ import {mountedStates} from "./engine.js" import {resolveFirst} from "@solid-primitives/refs" import {createSwitchTransition} from "@solid-primitives/transition-group" -import {createContext, createSignal, flush, type FlowComponent, type Accessor} from "solid-js" +import { + createContext, + createSignal, + flush, + onSettled, + type FlowComponent, + type Accessor, +} from "solid-js" import type {JSX} from "@solidjs/web" export type PresenceContextState = { @@ -60,16 +67,20 @@ export const Presence: FlowComponent<{ setMount(false) flush() mountedStates.get(el)?.getOptions().exit - ? el.addEventListener("motioncomplete", () => { - /* - `done` (transition-group's own callback) writes the - signal that actually removes this element from the - rendered list — also outside Solid's scheduler, so it - needs its own flush to take effect before callers see it. - */ - done() - flush() - }) + ? el.addEventListener( + "motioncomplete", + () => { + /* + `done` (transition-group's own callback) writes the + signal that actually removes this element from the + rendered list — also outside Solid's scheduler, so it + needs its own flush to take effect before callers see it. + */ + done() + flush() + }, + {once: true}, + ) : done() }, onEnter(_, done) { @@ -83,6 +94,23 @@ export const Presence: FlowComponent<{ ) - queueMicrotask(() => (state.initial = true)) + /* + `initial={false}` only suppresses the enter animation of the children present + on the *first* render; anything added later animates in normally. That means + flipping the flag once the first render is done, which is exactly what + `onSettled` (Solid 2.0's replacement for 1.x `onMount`) schedules: the next + point at which the current reactive activity has settled. A bare + `queueMicrotask` only approximates that by piggybacking on the JS microtask + queue, which knows nothing about Solid's scheduler and fires whether or not + the render it is waiting on has actually finished. + + `state.initial` is deliberately a plain field rather than a signal — children + read it once, untracked, while constructing their own MotionState, and it + must never re-run anything when it flips. + */ + onSettled(() => { + state.initial = true + }) + return render } diff --git a/src/primitives.ts b/src/primitives.ts index 61b4a4a..31b8e52 100644 --- a/src/primitives.ts +++ b/src/primitives.ts @@ -1,7 +1,7 @@ import {scrollInfo} from "framer-motion/dom" import {isServer} from "@solidjs/web" -import {createMotionState, createStyles, MotionState, style} from "./engine.js" +import {createMotionState, createStyles, MotionState, StartStyles, style} from "./engine.js" import {Accessor, Context, createEffect, createSignal, flush, onCleanup, useContext} from "solid-js" import {PresenceContext, PresenceContextState} from "./presence.jsx" @@ -29,7 +29,9 @@ export function createAndBindMotionState( options: Accessor, presence_state?: PresenceContextState, parent_state?: MotionState, -): [MotionState, ReturnType] { + /* the tag being rendered, so an SVG start target is built as attributes */ + tag = "div", +): [MotionState, StartStyles] { const state = createMotionState( presence_state?.initial === false ? {...options(), initial: false} : options(), parent_state, @@ -67,7 +69,7 @@ export function createAndBindMotionState( return () => { if (presence_state && options().exit) { state.setActive("exit", true) - el_ref.addEventListener("motioncomplete", unmount) + el_ref.addEventListener("motioncomplete", unmount, {once: true}) } else unmount() } }, @@ -80,7 +82,7 @@ export function createAndBindMotionState( }, ) - return [state, createStyles(state.getTarget())] as const + return [state, createStyles(state.getTarget(), tag)] as const } /** @@ -100,10 +102,15 @@ export function createMotion( () => target, typeof options === "function" ? options : () => options, presenceState, + undefined, + target.tagName.toLowerCase(), ) - for (const key in styles) { - style.set(target, key, styles[key]) + for (const key in styles.style) { + style.set(target, key, styles.style[key]) + } + for (const key in styles.attrs) { + target.setAttribute(key, String(styles.attrs[key])) } return state diff --git a/stories/Animate.stories.tsx b/stories/Animate.stories.tsx deleted file mode 100644 index ffa6327..0000000 --- a/stories/Animate.stories.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import type {Meta, StoryObj} from "storybook-solidjs-vite" -import {createSignal} from "solid-js" -import {Motion} from "../src/index.jsx" - -const meta = { - title: "Motion/Animate", -} satisfies Meta - -export default meta -type Story = StoryObj - -const box = { - width: "80px", - height: "80px", - "border-radius": "8px", - background: "royalblue", -} as const - -/** `initial` -> `animate`: the element animates from its initial style to the animate target on mount. */ -export const BasicEnter: Story = { - render: () => ( - - ), -} - -/** `initial={false}`: the enter animation is skipped — `animate` values apply immediately, no transition. */ -export const InitialFalse: Story = { - render: () => , -} - -/** When `initial` and `animate` resolve to the same target, no animation runs and `onMotionComplete` never fires. */ -export const NoOpWhenEqual: Story = { - render: () => { - const target = {opacity: 0.6} - let fired = false - return ( -
- (fired = true)} - /> -

- If this library is working correctly, no animation ever starts here (no - onMotionComplete), since initial already equals animate. -

-
- ) - }, -} - -/** Changing a signal fed into `animate` reactively re-triggers the animation to the new target. */ -export const ReactiveAnimateChange: Story = { - render: () => { - const [color, setColor] = createSignal("crimson") - return ( -
- setColor(c => (c === "crimson" ? "royalblue" : "crimson"))} - > - Toggle color - - -
- ) - }, -} diff --git a/stories/Gestures.stories.tsx b/stories/Gestures.stories.tsx deleted file mode 100644 index 3a2ee72..0000000 --- a/stories/Gestures.stories.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import type {Meta, StoryObj} from "storybook-solidjs-vite" -import {createSignal} from "solid-js" -import {Motion} from "../src/index.jsx" - -const meta = { - title: "Motion/Gestures", -} satisfies Meta - -export default meta -type Story = StoryObj - -const box = { - width: "80px", - height: "80px", - "border-radius": "8px", - background: "royalblue", -} as const - -/** `hover` — hovering the box animates it to the hover target; leaving animates back. */ -export const Hover: Story = { - render: () => { - const [status, setStatus] = createSignal("idle") - return ( -
-

hover: {status()}

- setStatus("active")} - onHoverEnd={() => setStatus("idle")} - /> -
- ) - }, -} - -/** `press` — pressing and releasing animates to/from the press target. */ -export const Press: Story = { - render: () => { - const [status, setStatus] = createSignal("idle") - return ( -
-

press: {status()}

- setStatus("active")} - onPressEnd={() => setStatus("idle")} - /> -
- ) - }, -} - -/** - * `hover` + `press` together: computeEffectiveTarget layers press on top of hover - * (`Object.assign` order), so pressing while already hovering should show the - * press target win over the hover one for any overlapping keys. - */ -export const HoverAndPressComposition: Story = { - render: () => { - const [hoverStatus, setHoverStatus] = createSignal("idle") - const [pressStatus, setPressStatus] = createSignal("idle") - return ( -
-

hover: {hoverStatus()}

-

press: {pressStatus()}

-

- Hover first (scales to 1.15, turns orange), then press while hovering (should - scale to 0.85, turn crimson). -

- setHoverStatus("active")} - onHoverEnd={() => setHoverStatus("idle")} - onPressStart={() => setPressStatus("active")} - onPressEnd={() => setPressStatus("idle")} - /> -
- ) - }, -} diff --git a/stories/InView.stories.tsx b/stories/InView.stories.tsx deleted file mode 100644 index 33c50d8..0000000 --- a/stories/InView.stories.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import type {Meta, StoryObj} from "storybook-solidjs-vite" -import {createSignal} from "solid-js" -import {Motion} from "../src/index.jsx" - -const meta = { - title: "Motion/InView", -} satisfies Meta - -export default meta -type Story = StoryObj - -const box = { - width: "80px", - height: "80px", - "border-radius": "8px", - background: "seagreen", -} as const - -/** - * `inView` — scroll the box into the viewport to trigger its inView target; - * scroll it back out to reverse. This prop has no automated test coverage - * (relies on IntersectionObserver, which jsdom doesn't implement), so this - * story is the first real, browser-driven verification of it. - */ -export const ScrollTrigger: Story = { - render: () => { - const [status, setStatus] = createSignal("not yet") - return ( -
-

- inView: {status()} -

-

Scroll down to bring the box into view.

-
- setStatus("entered")} - onViewLeave={() => setStatus("left")} - /> -
-
- ) - }, -} - -/** `inViewOptions.amount` — requires more of the element to be visible before triggering. */ -export const AmountOption: Story = { - render: () => { - const [status, setStatus] = createSignal("not yet") - return ( -
-

- inView (amount: 0.8): {status()} -

-

Requires 80% of the box visible before triggering — scroll slowly.

-
- setStatus("entered")} - onViewLeave={() => setStatus("left")} - /> -
-
- ) - }, -} diff --git a/stories/Motion.stories.tsx b/stories/Motion.stories.tsx deleted file mode 100644 index 456ba43..0000000 --- a/stories/Motion.stories.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import type {Meta, StoryObj} from "storybook-solidjs-vite" -import {Motion} from "../src/index.jsx" - -const meta = { - title: "Motion/Rendering", -} satisfies Meta - -export default meta -type Story = StoryObj - -/** `` renders a `div` by default. */ -export const DefaultTag: Story = { - render: () => ( - - ), -} - -/** `Motion.span`, `Motion.button`, `Motion.svg` etc. — the Proxy picks the tag from the property accessed. */ -export const ProxyTags: Story = { - render: () => ( -
- - span - - button - - - -
- ), -} - -/** `` — the same tag selection via an explicit prop instead of the proxy. */ -export const ExplicitTagProp: Story = { - render: () => ( -
    - - rendered as <li> - -
- ), -} - -/** SVG attributes (`viewBox`, `width`, `x`, `y`) pass through alongside animated values. */ -export const SvgAttrs: Story = { - render: () => ( - - - - ), -} - -/** A user-supplied `style` (object or CSS string) is merged with Motion's computed style, not replaced by it. */ -export const StyleMerging: Story = { - render: () => ( -
- - -
- ), -} diff --git a/stories/Presence.stories.tsx b/stories/Presence.stories.tsx deleted file mode 100644 index 85b1ff5..0000000 --- a/stories/Presence.stories.tsx +++ /dev/null @@ -1,216 +0,0 @@ -import type {Meta, StoryObj} from "storybook-solidjs-vite" -import {expect, userEvent, waitFor, within} from "storybook/test" -import {createSignal, Show} from "solid-js" -import {Motion, Presence} from "../src/index.jsx" - -const meta = { - title: "Motion/Presence", -} satisfies Meta - -export default meta -type Story = StoryObj - -const box = { - width: "80px", - height: "80px", - "border-radius": "8px", -} as const - -/** - * Basic enter/exit: removing the element from a `` inside `` - * animates it out via `exit` before it actually leaves the DOM (rather than - * disappearing instantly). The play function drives the toggle and proves - * the element is still present mid-exit, then gone once the animation ends — - * then toggles back on so the story doesn't land on an empty canvas. - */ -export const BasicEnterExit: Story = { - render: () => { - const [show, setShow] = createSignal(true) - return ( -
- - - - - - -
- ) - }, - play: async ({canvasElement}) => { - const canvas = within(canvasElement) - await waitFor(() => expect(canvas.getByTestId("box")).toBeInTheDocument()) - - await userEvent.click(canvas.getByTestId("toggle")) - // still present immediately after toggling off — exit animation hasn't finished - expect(canvas.getByTestId("box")).toBeInTheDocument() - // gone once the exit animation completes and Presence removes it - await waitFor(() => expect(canvas.queryByTestId("box")).not.toBeInTheDocument(), { - timeout: 3000, - }) - - await userEvent.click(canvas.getByTestId("toggle")) - await waitFor(() => expect(canvas.getByTestId("box")).toBeInTheDocument()) - }, -} - -/** - * `` suppresses the *first* enter animation for - * every child — the `animate` target applies immediately instead. - */ -export const PresenceInitialFalse: Story = { - render: () => ( - - - - ), - play: async ({canvasElement}) => { - const canvas = within(canvasElement) - const el = canvas.getByTestId("box") as HTMLElement - // applied immediately (no 2s transition ever ran) — opacity is already 1 - await waitFor(() => expect(getComputedStyle(el).opacity).toBe("1")) - }, -} - -/** - * `exitBeforeEnter` (mode "out-in"): the incoming element's enter animation - * waits for the outgoing element's exit to finish, instead of running in - * parallel. This exercises the exact multi-cycle swap that used to hang in - * jsdom (fixed by scoping mount-cycle cleanup in engine.ts) — this story is - * its permanent, real-browser regression check. - */ -export const ExitBeforeEnter: Story = { - render: () => { - const [condition, setCondition] = createSignal(true) - const El = (props: {label: string; color: string}) => ( - - ) - return ( -
- - - } - fallback={} - /> - -
- ) - }, - play: async ({canvasElement}) => { - const canvas = within(canvasElement) - await waitFor(() => expect(canvas.getByTestId("box-a")).toBeInTheDocument()) - - await userEvent.click(canvas.getByTestId("toggle")) - // box-a exits first; box-b must not appear until box-a is fully gone - await waitFor(() => expect(canvas.queryByTestId("box-a")).not.toBeInTheDocument(), { - timeout: 2000, - }) - await waitFor(() => expect(canvas.getByTestId("box-b")).toBeInTheDocument()) - - await userEvent.click(canvas.getByTestId("toggle")) - await waitFor(() => expect(canvas.queryByTestId("box-b")).not.toBeInTheDocument(), { - timeout: 2000, - }) - await waitFor(() => expect(canvas.getByTestId("box-a")).toBeInTheDocument()) - }, -} - -/** - * Multiple nested descendants each have their own `exit` — every one must - * finish its own exit animation before the whole subtree is removed. - */ -export const NestedExit: Story = { - render: () => { - const [show, setShow] = createSignal(true) - const exit = {opacity: 0, transition: {duration: 0.5}} - return ( -
- - - - - - - - -
- ) - }, - // round-trips back to the visible state so the story doesn't land on an - // empty canvas after the automated demonstration finishes — a 0.001s - // duration (fast enough for jsdom-based unit tests) also finishes far too - // quickly to actually see, so this uses a human-visible 0.5s instead. - play: async ({canvasElement}) => { - const canvas = within(canvasElement) - await waitFor(() => expect(canvas.getByTestId("parent")).toBeInTheDocument()) - - await userEvent.click(canvas.getByTestId("toggle")) - await waitFor(() => expect(canvas.queryByTestId("parent")).not.toBeInTheDocument(), { - timeout: 2000, - }) - - await userEvent.click(canvas.getByTestId("toggle")) - await waitFor(() => expect(canvas.getByTestId("parent")).toBeInTheDocument()) - }, -} - -/** `exit` can carry its own `transition`, overriding the component's base transition just for the exit phase. */ -export const ExitTransitionOverride: Story = { - render: () => { - const [show, setShow] = createSignal(true) - return ( -
- - - - - - -
- ) - }, -} diff --git a/stories/Primitives.stories.tsx b/stories/Primitives.stories.tsx deleted file mode 100644 index 81e0f84..0000000 --- a/stories/Primitives.stories.tsx +++ /dev/null @@ -1,91 +0,0 @@ -import type {Meta, StoryObj} from "storybook-solidjs-vite" -import {createSignal} from "solid-js" -import {motion, useScroll} from "../src/index.jsx" - -const meta = { - title: "Motion/Primitives", -} satisfies Meta - -export default meta -type Story = StoryObj - -/** - * The `motion` ref factory is the non-component API: bind animation - * behavior directly to a plain element's `ref`, without going through - * ``. Useful for animating an element you don't otherwise control - * (e.g. one rendered by another library). - */ -export const RefFactory: Story = { - render: () => ( -
({ - initial: {opacity: 0, y: -20}, - animate: {opacity: 1, y: 0}, - transition: {duration: 0.6}, - }))} - style={{ - width: "80px", - height: "80px", - "border-radius": "8px", - background: "royalblue", - }} - /> - ), -} - -/** The ref factory's options accessor is reactive, same as a `` component's props. */ -export const ReactiveRefFactory: Story = { - render: () => { - const [opacity, setOpacity] = createSignal(0.3) - return ( -
- -
({ - initial: {opacity: 0}, - animate: {opacity: opacity()}, - transition: {duration: 0.4}, - }))} - style={{ - width: "80px", - height: "80px", - "border-radius": "8px", - background: "seagreen", - }} - /> -
- ) - }, -} - -/** - * `useScroll` exposes reactive page-scroll progress (0–1) for driving - * scroll-linked animations — scroll the story's canvas to see the bar fill. - */ -export const ScrollProgress: Story = { - render: () => { - const {scrollY} = useScroll() - return ( -
-
-
- Scroll down to progress the bar above. -
-
- ) - }, -} diff --git a/stories/Transition.stories.tsx b/stories/Transition.stories.tsx deleted file mode 100644 index 03bb1b8..0000000 --- a/stories/Transition.stories.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import type {Meta, StoryObj} from "storybook-solidjs-vite" -import {Motion} from "../src/index.jsx" - -const meta = { - title: "Motion/Transition", -} satisfies Meta - -export default meta -type Story = StoryObj - -const box = { - width: "80px", - height: "80px", - "border-radius": "8px", - background: "royalblue", -} as const - -/** Global `transition`: `duration` plus `easing` (Motion One's naming — translated internally to modern Motion's `ease`). */ -export const GlobalTransition: Story = { - render: () => ( - - ), -} - -/** Per-property transition override: `rotate` runs on its own, slower schedule than the other properties. */ -export const PerPropertyOverride: Story = { - render: () => ( - - ), -} - -/** Per-target transition override: the target object's own `transition` wins over the component-level one. */ -export const PerTargetOverride: Story = { - render: () => ( - - ), -} - -/** Keyframe arrays: `x` steps through every value in the array, evenly spaced across `duration`. */ -export const KeyframeArray: Story = { - render: () => ( - - ), -} - -/** Keyframes with a custom `offset`: skews where in the timeline each step lands. */ -export const KeyframeOffset: Story = { - render: () => ( - - ), -} diff --git a/stories/Variants.stories.tsx b/stories/Variants.stories.tsx deleted file mode 100644 index 3a353a3..0000000 --- a/stories/Variants.stories.tsx +++ /dev/null @@ -1,91 +0,0 @@ -import type {Meta, StoryObj} from "storybook-solidjs-vite" -import {Motion} from "../src/index.jsx" - -const meta = { - title: "Motion/Variants", -} satisfies Meta - -export default meta -type Story = StoryObj - -/** String `variants`: `initial`/`animate` reference a key that's looked up in the `variants` map. */ -export const StringVariants: Story = { - render: () => ( - - ), -} - -/** - * Nested variant-key *inheritance*: only the root sets `initial="hidden"`. - * Each descendant has no `initial` of its own, so it inherits the *key* - * "hidden" from its closest ancestor and resolves it against its *own* - * `variants` map — matching ssr.test.tsx's "Children render inherited - * initial" case, extended here with an explicit `animate="visible"` per - * level (inheritance only applies to `initial`, not `animate`) so the - * whole tree visibly animates in. - */ -export const NestedInheritance: Story = { - render: () => ( - - - - Each level inherits the "hidden" key, resolved against its own variants. - - - - ), -} - -/** An empty `variants={{}}` map combined with `hover`/`press` — no crash, base (unstyled) render. */ -export const EmptyVariants: Story = { - render: () => ( - - ), -} diff --git a/test/engine.test.tsx b/test/engine.test.tsx new file mode 100644 index 0000000..065e206 --- /dev/null +++ b/test/engine.test.tsx @@ -0,0 +1,304 @@ +import {createStyles, createMotionState, mountedStates, normalizeTransition} from "../src/engine.js" + +const sleep = (ms: number): Promise => new Promise(resolve => setTimeout(resolve, ms)) + +/* +motion-dom filters out non-primary pointers, and jsdom's PointerEvent +defaults to an empty `pointerType` with `isPrimary: false`, which the filter +rejects. These spell out a plain left-button mouse press. +*/ +const pointer = (type: string): PointerEvent => + new PointerEvent(type, {bubbles: true, pointerType: "mouse", button: 0, isPrimary: true}) + +/** An element attached to the document, since Motion reads computed style off it. */ +function mounted(): HTMLDivElement { + const el = document.createElement("div") + document.body.appendChild(el) + return el +} + +describe("createStyles", () => { + test("Maps transform shorthands onto a transform declaration", () => { + expect(createStyles({x: 100, scale: 1.5}).style).toEqual({ + transform: "translateX(100px) scale(1.5)", + }) + }) + + test("Uses the first value of a keyframe list", () => { + // a static style can't represent a list, so the starting frame is used + expect(createStyles({opacity: [0.2, 0.9]}).style).toEqual({opacity: 0.2}) + }) + + test("Passes CSS custom properties through", () => { + expect(createStyles({"--brand": "red"}).style).toEqual({"--brand": "red"}) + }) + + test("Ignores a target's own transition", () => { + expect(createStyles({opacity: 1, transition: {duration: 5}}).style).toEqual({opacity: 1}) + }) + + test("Returns nothing for an empty target", () => { + expect(createStyles({})).toEqual({style: {}, attrs: {}}) + }) + + /* + SVG geometry has to come out as an attribute. As an inline style it would + outrank the attribute Motion animates, and the element would never move. + */ + test("Emits SVG geometry as attributes, not styles", () => { + const {style, attrs} = createStyles({height: 20, opacity: 0.5}, "rect") + expect(attrs).toEqual({height: "20px"}) + expect(style).toEqual({opacity: 0.5}) + }) + + test("Keeps the svg root's own transform in style", () => { + const {style, attrs} = createStyles({x: 10}, "svg") + expect(attrs).toEqual({}) + expect(style).toEqual({transform: "translateX(10px)"}) + }) +}) + +describe("normalizeTransition", () => { + test("Passes a non-object transition straight through", () => { + expect(normalizeTransition(undefined)).toBeUndefined() + expect(normalizeTransition(null)).toBeNull() + }) + + test("Renames Motion One's `easing` to `ease`", () => { + expect(normalizeTransition({duration: 1, easing: "ease-in-out"})).toEqual({ + duration: 1, + ease: "ease-in-out", + }) + }) + + test("A per-value override inherits what it does not restate", () => { + expect(normalizeTransition({duration: 1, ease: "linear", rotate: {duration: 2}})).toEqual({ + duration: 1, + ease: "linear", + rotate: {duration: 2, ease: "linear"}, + }) + }) + + test("Renames `easing` inside a per-value override too", () => { + expect(normalizeTransition({duration: 1, x: {easing: "linear"}})).toEqual({ + duration: 1, + x: {duration: 1, ease: "linear"}, + }) + }) + + test("Treats an array value as a base option, not an override", () => { + // `ease` as a cubic bezier is an array, and must not be read as a per-value override + expect(normalizeTransition({duration: 1, ease: [0.4, 0, 0.2, 1]})).toEqual({ + duration: 1, + ease: [0.4, 0, 0.2, 1], + }) + }) +}) + +describe("createMotionState", () => { + test("Applies the start target on mount and registers the element", () => { + const el = mounted() + const state = createMotionState({initial: {opacity: 0.25}}) + const unmount = state.mount(el) + + expect(el.style.opacity).toBe("0.25") + expect(mountedStates.get(el)).toBe(state) + + unmount() + expect(mountedStates.has(el)).toBe(false) + }) + + test("Resolves initial through the variants map", () => { + const state = createMotionState({ + initial: "hidden", + variants: {hidden: {opacity: 0.1}}, + }) + expect(state.getTarget()).toEqual({opacity: 0.1}) + }) + + test("initial={false} starts on the animate target", () => { + const state = createMotionState({initial: false, animate: {opacity: 0.7}}) + expect(state.getTarget()).toEqual({opacity: 0.7}) + }) + + test("An unset initial inherits the parent's variant key", () => { + const parent = createMotionState({initial: "hidden", variants: {hidden: {opacity: 0}}}) + const child = createMotionState({variants: {hidden: {opacity: 0.4}}}, parent) + + expect(child.getInitialVariantKey()).toBe("hidden") + // resolved against the child's own variants, not the parent's + expect(child.getTarget()).toEqual({opacity: 0.4}) + }) + + test("An unset initial with no ancestor key starts empty", () => { + expect(createMotionState({animate: {opacity: 1}}).getTarget()).toEqual({}) + }) + + test("getOptions reports the latest options", () => { + const state = createMotionState({animate: {opacity: 0.2}}) + state.update({animate: {opacity: 0.6}}) + expect(state.getOptions()).toEqual({animate: {opacity: 0.6}}) + }) + + test("A press gesture layers over animate, and reverts on release", async () => { + const el = mounted() + const state = createMotionState({ + animate: {opacity: 1}, + press: {opacity: 0.3}, + transition: {duration: 0.001}, + }) + const unmount = state.mount(el) + + el.dispatchEvent(pointer("pointerdown")) + await sleep(50) + expect(el.style.opacity).toBe("0.3") + + window.dispatchEvent(pointer("pointerup")) + await sleep(50) + expect(el.style.opacity).toBe("1") + + unmount() + }) + + test("Gestures are rebound when one is added and unbound on unmount", async () => { + const el = mounted() + const state = createMotionState({animate: {opacity: 1}, transition: {duration: 0.001}}) + const unmount = state.mount(el) + + // no press gesture yet, so the pointer event does nothing + el.dispatchEvent(pointer("pointerdown")) + await sleep(30) + expect(el.style.opacity).toBe("1") + + state.update({animate: {opacity: 1}, press: {opacity: 0.2}, transition: {duration: 0.001}}) + el.dispatchEvent(pointer("pointerdown")) + await sleep(50) + expect(el.style.opacity).toBe("0.2") + + window.dispatchEvent(pointer("pointerup")) + await sleep(50) + + unmount() + // after unmount the gesture is unbound, so this must not animate anything + el.dispatchEvent(pointer("pointerdown")) + await sleep(30) + expect(el.style.opacity).toBe("1") + }) + + test("An exit target with no values still resolves", async () => { + const el = mounted() + const state = createMotionState({animate: {opacity: 1}, exit: "missing"}) + const unmount = state.mount(el) + + let completed = false + el.addEventListener("motioncomplete", () => (completed = true)) + + await state.setActive("exit", true) + expect(completed).toBe(true) + + unmount() + }) + + test("update() is ignored while the element is exiting", async () => { + const el = mounted() + const state = createMotionState({ + animate: {opacity: 1}, + exit: {opacity: 0}, + transition: {duration: 0.001}, + }) + const unmount = state.mount(el) + + await state.setActive("exit", true) + expect(el.style.opacity).toBe("0") + + state.update({ + animate: {opacity: 0.9}, + exit: {opacity: 0}, + transition: {duration: 0.001}, + }) + await sleep(50) + // still on the exit target rather than the new animate one + expect(el.style.opacity).toBe("0") + + unmount() + }) + + test("A remount clears the exit flag", async () => { + const el = mounted() + const state = createMotionState({ + animate: {opacity: 0.5}, + exit: {opacity: 0}, + transition: {duration: 0.001}, + }) + + let unmount = state.mount(el) + await state.setActive("exit", true) + unmount() + + unmount = state.mount(el) + await sleep(50) + expect(el.style.opacity).toBe("0.5") + + unmount() + }) + + /* + With no `animate` prop there is nothing for the released gesture to resolve + back to, so the engine records what the element showed before the gesture + introduced the key and animates to that instead. + */ + test("A gesture with no animate base reverts to the pre-gesture value", async () => { + const el = mounted() + el.style.opacity = "1" + const state = createMotionState({press: {opacity: 0.3}, transition: {duration: 0.001}}) + const unmount = state.mount(el) + + el.dispatchEvent(pointer("pointerdown")) + await sleep(50) + expect(el.style.opacity).toBe("0.3") + + window.dispatchEvent(pointer("pointerup")) + await sleep(50) + expect(Number(el.style.opacity)).toBeCloseTo(1, 2) + + unmount() + }) + + test("A transform shorthand reverts to its identity value", async () => { + const el = mounted() + const state = createMotionState({press: {x: 50}, transition: {duration: 0.001}}) + const unmount = state.mount(el) + + el.dispatchEvent(pointer("pointerdown")) + await sleep(50) + expect(el.style.transform).toContain("50px") + + window.dispatchEvent(pointer("pointerup")) + await sleep(50) + // back to the identity value, which Motion writes out as "none" + expect(el.style.transform).toBe("none") + + unmount() + }) + + test("Applies an SVG start target as attributes", () => { + const rect = document.createElementNS("http://www.w3.org/2000/svg", "rect") + document.body.appendChild(rect) + + const state = createMotionState({initial: {height: 20, opacity: 0.5}}) + const unmount = state.mount(rect) + + // geometry lands on the attribute, everything else stays a style + expect(rect.getAttribute("height")).toBe("20px") + expect(rect.style.opacity).toBe("0.5") + expect(rect.style.height).toBe("") + + unmount() + }) + + test("Animating with no element in play is a no-op", async () => { + const state = createMotionState({animate: {opacity: 1}, exit: {opacity: 0}}) + // never mounted, so there is nothing to animate and nothing to throw + await expect(state.setActive("exit", true)).resolves.toBeUndefined() + }) +}) diff --git a/test/motion.test.tsx b/test/motion.test.tsx index 8bfc553..b59cd27 100644 --- a/test/motion.test.tsx +++ b/test/motion.test.tsx @@ -78,27 +78,34 @@ describe("Motion", () => { }) test("Animation runs when target changes", async () => { - const result = await new Promise(resolve => - createRoot(dispose => { - const Component = (props: any): JSX.Element => { - return ( - { - if (detail.target.opacity === 0.8) resolve(true) - }} - transition={{duration}} - /> - ) - } - const [animate, setAnimate] = createSignal({opacity: 0.5}) - render(() => ) - setAnimate({opacity: 0.8}) - setTimeout(dispose, 20) - }), + const Component = (props: any): JSX.Element => ( + { + if (detail.target.opacity === 0.8) resolve(true) + }} + transition={{duration}} + /> ) - expect(result).toBe(true) + + let resolve!: (value: boolean) => void + const completed = new Promise(r => (resolve = r)) + + /* + The signal lives outside the root, and is written to after it: Solid 2.0 + rejects writes made from inside an owned scope. + */ + const [animate, setAnimate] = createSignal({opacity: 0.5}) + const dispose = createRoot(dispose => { + render(() => ) + return dispose + }) + + setAnimate({opacity: 0.8}) + + expect(await completed).toBe(true) + dispose() }) test("Accepts default transition", async () => { @@ -144,4 +151,14 @@ describe("Motion", () => { fireEvent.pointerEnter(element) expect(captured).toEqual([0]) }) + + test("Proxy does not turn Motion into a thenable", () => { + /* + Every unknown key resolves to a component; `then` must not, or awaiting + Motion (or lazily importing it) hangs on a fake thenable. + */ + expect((Motion as any).then).toBeUndefined() + expect(typeof Motion.name).toBe("string") + expect(typeof (Motion as any).div).toBe("function") + }) }) diff --git a/test/presence.test.tsx b/test/presence.test.tsx index b9d434f..00f3848 100644 --- a/test/presence.test.tsx +++ b/test/presence.test.tsx @@ -176,4 +176,98 @@ describe("Presence", () => { expect(ref_1.style.opacity).toBe("0") expect(ref_2.style.opacity).toBe("1") }) + + test("Removes the element even when exit resolves to no values", async () => { + const [show, setShow] = createSignal(true) + + const {container} = render(() => ( + + + {/* a variant key with no matching entry — resolves to an empty target */} + + + + )) + flush() + + const component = await screen.findByTestId("child") + expect(component.isConnected).toBeTruthy() + + setShow(false) + flush() + + await new Promise(resolve => setTimeout(resolve, 50)) + + expect(component.isConnected).toBeFalsy() + expect(container.innerHTML).toBe("") + expect(mountedStates.has(component)).toBeFalsy() + }) + + test("An element that entered during an exit still animates on later updates", async () => { + const [condition, setCondition] = createSignal(1) + const [opacity, setOpacity] = createSignal(0.5) + + const {container} = render(() => ( + + + {key => ( + + )} + + + )) + flush() + await new Promise(resolve => setTimeout(resolve, 50)) + + /* + In the default "parallel" mode the incoming element is briefly torn down + and remounted as the outgoing one exits. Its exit flag has to be cleared + by that remount, or every later `animate` update resolves to the exit + target instead. + */ + setCondition(2) + flush() + await new Promise(resolve => setTimeout(resolve, 50)) + + const component = container.querySelector('[data-testid="child-2"]')! + expect(component.style.opacity).toBe("0.5") + + setOpacity(0.9) + flush() + await new Promise(resolve => setTimeout(resolve, 50)) + + expect(component.style.opacity).toBe("0.9") + }) + + test("initial: false only suppresses children present on the first render", async () => { + const [show, setShow] = createSignal(false) + + const {container} = render(() => ( + + + + + + )) + flush() + await new Promise(resolve => setTimeout(resolve, 20)) + + setShow(true) + flush() + + // a child added after the first render animates in normally, so it starts + // at its `initial` rather than jumping straight to `animate` + const component = container.querySelector('[data-testid="late"]')! + expect(component.style.opacity).toBe("0") + }) }) diff --git a/test/primitives.test.tsx b/test/primitives.test.tsx index c4065f3..980b66c 100644 --- a/test/primitives.test.tsx +++ b/test/primitives.test.tsx @@ -1,7 +1,7 @@ import {createRoot, createSignal, Show} from "solid-js" import type {JSX} from "@solidjs/web" import {screen, render} from "@solidjs/testing-library" -import {Presence, VariantDefinition, motion} from "../src/index.jsx" +import {Presence, VariantDefinition, createMotion, motion, useScroll} from "../src/index.jsx" const duration = 0.001 @@ -27,7 +27,7 @@ describe("motion ref factory", () => { render(() => (
(ref = el as HTMLDivElement), + el => (ref = el), motion(() => ({ initial: {opacity: 0.4}, animate: {opacity: [0, 0.8]}, @@ -43,15 +43,26 @@ describe("motion ref factory", () => { test("Animation runs when target changes", async () => { const [opacity, setOpacity] = createSignal(0.5) - const element = createRoot(() => ( + /* + Rendered into the document rather than built in a bare createRoot: + Motion reads computed style off the element, and jsdom throws on that + for a node with no owner document. + */ + let ref!: HTMLDivElement + render(() => (
({ - initial: {opacity: 0}, - animate: {opacity: opacity()}, - transition: {duration}, - }))} + data-testid="box" + ref={[ + el => (ref = el), + motion(() => ({ + initial: {opacity: 0}, + animate: {opacity: opacity()}, + transition: {duration}, + })), + ]} /> - )) as HTMLDivElement + )) + const element = ref expect(element.style.opacity).toBe("0") @@ -74,7 +85,7 @@ describe("motion ref factory", () => { render(() => (
(ref = el as HTMLDivElement), + el => (ref = el), motion(() => ({ initial: {opacity: 0.5}, animate: {opacity: 0.9}, @@ -140,3 +151,70 @@ describe("motion ref factory", () => { })) }) }) + +describe("createMotion", () => { + test("Applies the start target to an element it is handed", () => { + const el = document.createElement("div") + document.body.appendChild(el) + + const dispose = createRoot(dispose => { + createMotion(el, {initial: {opacity: 0.35, x: 40}}) + return dispose + }) + + expect(el.style.opacity).toBe("0.35") + expect(el.style.transform).toBe("translateX(40px)") + dispose() + }) + + test("Accepts an options accessor as well as a plain object", async () => { + const el = document.createElement("div") + document.body.appendChild(el) + + const dispose = createRoot(dispose => { + createMotion(el, () => ({ + initial: {opacity: 0.2}, + animate: {opacity: 0.9}, + transition: {duration}, + })) + return dispose + }) + + await sleep(60) + expect(el.style.opacity).toBe("0.9") + dispose() + }) +}) + +describe("useScroll", () => { + test("Starts at zero on both axes", () => { + const dispose = createRoot(dispose => { + const {time, scrollX, scrollY} = useScroll() + + expect(time()).toBe(0) + expect(scrollX().progress).toBe(0) + expect(scrollY()).toMatchObject({ + current: 0, + progress: 0, + scrollLength: 0, + velocity: 0, + }) + return dispose + }) + + // unsubscribes without throwing + expect(() => dispose()).not.toThrow() + }) + + test("Accepts scroll options", () => { + const container = document.createElement("div") + document.body.appendChild(container) + + const dispose = createRoot(dispose => { + const {scrollY} = useScroll({container, axis: "y"}) + expect(scrollY().progress).toBe(0) + return dispose + }) + dispose() + }) +}) diff --git a/test/setup.js b/test/setup.js deleted file mode 100644 index 697f4c5..0000000 --- a/test/setup.js +++ /dev/null @@ -1,16 +0,0 @@ -/* -jsdom doesn't implement IntersectionObserver. This is a minimal stub so -`inView()` (used for the `inView` prop) can construct and register without -crashing; it never actually fires, so entry-triggering behavior isn't -covered by these tests. -*/ -if (typeof globalThis.IntersectionObserver === "undefined") { - globalThis.IntersectionObserver = class IntersectionObserver { - observe() {} - unobserve() {} - disconnect() {} - takeRecords() { - return [] - } - } -} diff --git a/test/setup.ts b/test/setup.ts new file mode 100644 index 0000000..fda2a9f --- /dev/null +++ b/test/setup.ts @@ -0,0 +1,26 @@ +/* +jsdom implements neither IntersectionObserver nor the Web Animations API that +Motion drives its animations with. These are minimal stubs so the unit tests +can exercise the library's own state machine. + +`inView` behavior and real animation interpolation are covered by the +Playwright suite in `e2e/`, which runs against a real browser. +*/ + +/* eslint-disable @typescript-eslint/no-empty-function -- the stub does nothing by design */ +class IntersectionObserverStub implements IntersectionObserver { + readonly root = null + readonly rootMargin = "" + readonly thresholds: readonly number[] = [] + observe(): void {} + unobserve(): void {} + disconnect(): void {} + takeRecords(): IntersectionObserverEntry[] { + return [] + } +} + +if (typeof globalThis.IntersectionObserver === "undefined") { + globalThis.IntersectionObserver = + IntersectionObserverStub as unknown as typeof IntersectionObserver +} diff --git a/test/ssr.test.tsx b/test/ssr.test.tsx index 60aeae2..61873e2 100644 --- a/test/ssr.test.tsx +++ b/test/ssr.test.tsx @@ -1,11 +1,6 @@ import {renderToString} from "@solidjs/web" import {Motion, Presence} from "../src/index.jsx" -jest.mock("@solidjs/web", () => ({ - ...jest.requireActual("@solidjs/web"), - template: jest.fn(), -})) - describe("ssr", () => { test("Renders", () => { const html = renderToString(() => ) @@ -38,12 +33,16 @@ describe("ssr", () => { ) }) + /* + SVG geometry renders as an attribute, not as a style. An inline style would + outrank the attribute Motion animates and pin the element to its `initial`. + */ test("Renders svg with attrs", () => { const html = renderToString(() => ( )) expect(html).toBe( - ``, + ``, ) }) diff --git a/test/tsconfig.json b/test/tsconfig.json index 2ebe989..04000ed 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -4,6 +4,6 @@ "lib": ["ESNext", "DOM"], "jsx": "preserve", "jsxImportSource": "@solidjs/web", - "types": ["jest"] + "types": ["vitest/globals"] } } diff --git a/tsconfig.node.json b/tsconfig.node.json index 0426177..68c5b3c 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -5,5 +5,5 @@ "checkJs": true, "types": ["node"] }, - "include": ["./tsup.config.ts", "jest"] + "include": ["./tsup.config.ts", "./vitest.config.ts", "./playwright.config.ts"] } diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..b297b03 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,67 @@ +import {defineConfig} from "vitest/config" +import solid from "@solidjs/vite-plugin" + +/* +Two projects, because the library has two compilation targets and the Solid +JSX transform has to be configured differently for each: + +- `client` compiles the DOM transform and runs in jsdom. +- `ssr` compiles the string-rendering transform and runs in plain node, so + the server build is never loaded alongside jsdom. + +The old jest setup did this with two babel transformers and an `SSR=true` +environment variable that selected between two config objects. Vitest runs +both in one pass instead, so `pnpm test` covers client and server together. +*/ +export default defineConfig({ + test: { + projects: [ + { + plugins: [solid()], + resolve: { + /* + Picks the "browser" exports condition so @solidjs/web resolves + its DOM build rather than the server one. + */ + conditions: ["browser", "development"], + }, + test: { + name: "client", + environment: "jsdom", + include: ["test/**/*.test.{ts,tsx}"], + exclude: ["test/ssr.test.tsx"], + setupFiles: ["test/setup.ts"], + globals: true, + }, + }, + { + plugins: [solid({solid: {generate: "ssr", hydratable: true}, ssr: true})], + resolve: { + conditions: ["node"], + }, + test: { + name: "ssr", + environment: "node", + include: ["test/ssr.test.tsx"], + globals: true, + }, + }, + ], + coverage: { + provider: "v8", + include: ["src/**/*.{ts,tsx}"], + reporter: ["text", "html", "lcov"], + /* + `src/index.tsx` is a re-export barrel with no logic of its own, and + `src/types.ts` is types plus a module augmentation. + */ + exclude: ["src/index.tsx", "src/types.ts"], + thresholds: { + statements: 95, + branches: 92, + functions: 92, + lines: 95, + }, + }, + }, +})