From 6c6b450dac3e2c2bd4544428ac818c4bd55fe043 Mon Sep 17 00:00:00 2001 From: Hunter Johnston Date: Sun, 14 Jul 2024 20:07:29 -0400 Subject: [PATCH 01/15] stuff --- .nvmrc | 2 +- package.json | 2 +- packages/bits-ui/package.json | 42 +- .../components/aspect-ratio.svelte | 4 +- .../src/lib/bits/aspect-ratio/index.ts | 2 +- .../src/lib/bits/aspect-ratio/types.ts | 1 + .../bits-ui/src/lib/bits/floating/_types.ts | 1 + packages/bits-ui/src/lib/bits/index.ts | 4 - .../components/select-content-floating.svelte | 4 +- packages/bits-ui/src/lib/index.ts | 1 - packages/bits-ui/src/lib/internal/types.ts | 4 +- packages/bits-ui/src/lib/shared/index.ts | 12 +- .../tests/calendar/CalendarMultiTest.svelte | 4 +- .../src/tests/calendar/CalendarTest.svelte | 4 +- .../src/tests/date-field/DateFieldTest.svelte | 4 +- .../DateRangeFieldTest.svelte | 4 +- .../src/tests/pagination/Pagination.spec.ts | 2 +- .../range-calendar/RangeCalendarTest.svelte | 4 +- .../src/tests/switch/SwitchTest.svelte | 4 +- .../bits-ui/src/tests/tabs/TabsTest.svelte | 4 +- .../ToggleGroupMultipleTest.svelte | 4 +- .../tests/toggle-group/ToggleGroupTest.svelte | 4 +- .../src/tests/toggle/ToggleTest.svelte | 4 +- .../src/tests/toolbar/ToolbarTest.svelte | 4 +- .../src/tests/tooltip/TooltipTest.svelte | 8 +- pnpm-lock.yaml | 812 +++++++++--------- sites/docs/package.json | 2 +- 27 files changed, 480 insertions(+), 467 deletions(-) diff --git a/.nvmrc b/.nvmrc index 68c98aa7a..78a949591 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v18.18.2 \ No newline at end of file +v20.15.1 \ No newline at end of file diff --git a/package.json b/package.json index 64c1ff4ab..9f9473eb3 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "prettier": "^3.2.5", "prettier-plugin-svelte": "^3.2.2", "prettier-plugin-tailwindcss": "0.5.13", - "svelte": "5.0.0-next.181", + "svelte": "5.0.0-next.183", "svelte-eslint-parser": "^0.34.1", "wrangler": "^3.44.0" }, diff --git a/packages/bits-ui/package.json b/packages/bits-ui/package.json index d35e42ac8..e79c9c01d 100644 --- a/packages/bits-ui/package.json +++ b/packages/bits-ui/package.json @@ -1,6 +1,6 @@ { "name": "bits-ui", - "version": "0.21.3", + "version": "0.21.4", "license": "MIT", "repository": "github:huntabyte/bits-ui", "funding": "https://github.com/sponsors/huntabyte", @@ -28,41 +28,41 @@ ], "devDependencies": { "@melt-ui/pp": "^0.3.0", - "@sveltejs/kit": "^2.5.0", - "@sveltejs/package": "^2.2.7", - "@sveltejs/vite-plugin-svelte": "^3.1.0", - "@testing-library/dom": "^10.0.0", - "@testing-library/jest-dom": "^6.4.2", + "@sveltejs/kit": "^2.5.18", + "@sveltejs/package": "^2.3.2", + "@sveltejs/vite-plugin-svelte": "^3.1.1", + "@testing-library/dom": "^10.3.1", + "@testing-library/jest-dom": "^6.4.6", "@testing-library/svelte": "^5.2.0", "@testing-library/user-event": "^14.5.2", "@types/jest-axe": "^3.5.9", - "@types/node": "^20.12.2", + "@types/node": "^20.14.10", "@types/resize-observer-browser": "^0.1.11", "@types/testing-library__jest-dom": "^5.14.9", "@vitest/ui": "^1.5.0", "csstype": "^3.1.3", - "jest-axe": "^8.0.0", - "jsdom": "^24.0.0", - "publint": "^0.2.7", + "jest-axe": "^9.0.0", + "jsdom": "^24.1.0", + "publint": "^0.2.8", "resize-observer-polyfill": "^1.5.1", - "svelte": "5.0.0-next.181", - "svelte-check": "^3.6.9", - "tslib": "^2.6.2", + "svelte": "5.0.0-next.183", + "svelte-check": "^3.8.4", + "tslib": "^2.6.3", "typescript": "^5.5.3", - "vite": "^5.2.8", - "vitest": "^1.6.0" + "vite": "^5.3.3", + "vitest": "^2.0.2" }, "svelte": "./dist/index.js", "types": "./dist/index.d.ts", "type": "module", "dependencies": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/dom": "^1.6.3", - "@internationalized/date": "^3.5.1", + "@floating-ui/core": "^1.6.4", + "@floating-ui/dom": "^1.6.7", + "@internationalized/date": "^3.5.4", "@melt-ui/svelte": "0.76.2", - "clsx": "^2.1.0", + "clsx": "^2.1.1", "esm-env": "^1.0.0", - "nanoid": "^5.0.5", + "nanoid": "^5.0.7", "runed": "^0.15.0", "scule": "^1.3.0", "style-object-to-css-string": "^1.1.3", @@ -70,6 +70,6 @@ "svelte-toolbelt": "^0.0.2" }, "peerDependencies": { - "svelte": "^5.0.0" + "svelte": "^5.0.0-next.1" } } diff --git a/packages/bits-ui/src/lib/bits/aspect-ratio/components/aspect-ratio.svelte b/packages/bits-ui/src/lib/bits/aspect-ratio/components/aspect-ratio.svelte index e5883f355..381185b58 100644 --- a/packages/bits-ui/src/lib/bits/aspect-ratio/components/aspect-ratio.svelte +++ b/packages/bits-ui/src/lib/bits/aspect-ratio/components/aspect-ratio.svelte @@ -1,7 +1,7 @@
diff --git a/packages/bits-ui/src/lib/bits/aspect-ratio/index.ts b/packages/bits-ui/src/lib/bits/aspect-ratio/index.ts index 9d76843c5..b4be99bc7 100644 --- a/packages/bits-ui/src/lib/bits/aspect-ratio/index.ts +++ b/packages/bits-ui/src/lib/bits/aspect-ratio/index.ts @@ -1,3 +1,3 @@ export { default as Root } from "./components/aspect-ratio.svelte"; -export type { AspectRatioProps as Props } from "./types.js"; +export type { AspectRatioProps as RootProps } from "./types.js"; diff --git a/packages/bits-ui/src/lib/bits/aspect-ratio/types.ts b/packages/bits-ui/src/lib/bits/aspect-ratio/types.ts index d9f07f539..714224973 100644 --- a/packages/bits-ui/src/lib/bits/aspect-ratio/types.ts +++ b/packages/bits-ui/src/lib/bits/aspect-ratio/types.ts @@ -1,4 +1,5 @@ import type { HTMLDivAttributes } from "$lib/internal/index.js"; +import type { Expand } from "$lib/internal/index.js"; export type AspectRatioPropsWithoutHTML = Expand<{ ratio?: number; diff --git a/packages/bits-ui/src/lib/bits/floating/_types.ts b/packages/bits-ui/src/lib/bits/floating/_types.ts index d8762c697..4ff7a5e14 100644 --- a/packages/bits-ui/src/lib/bits/floating/_types.ts +++ b/packages/bits-ui/src/lib/bits/floating/_types.ts @@ -1,4 +1,5 @@ import type { DOMElement, Transition, TransitionProps } from "$lib/internal/index.js"; +import type { Expand } from "$lib/internal/index.js"; export type ArrowProps = Expand< { diff --git a/packages/bits-ui/src/lib/bits/index.ts b/packages/bits-ui/src/lib/bits/index.ts index 82dc4c5ff..81fc69516 100644 --- a/packages/bits-ui/src/lib/bits/index.ts +++ b/packages/bits-ui/src/lib/bits/index.ts @@ -1,5 +1,3 @@ -import { writable } from "svelte/store"; - export * as Accordion from "./accordion/index.js"; export * as AlertDialog from "./alert-dialog/index.js"; export * as AspectRatio from "./aspect-ratio/index.js"; @@ -37,5 +35,3 @@ export * as Toggle from "./toggle/index.js"; export * as ToggleGroup from "./toggle-group/index.js"; export * as Toolbar from "./toolbar/index.js"; export * as Tooltip from "./tooltip/index.js"; - -export const eventLogs = writable([]); diff --git a/packages/bits-ui/src/lib/bits/select/components/select-content-floating.svelte b/packages/bits-ui/src/lib/bits/select/components/select-content-floating.svelte index 18cd5f46f..0f6e9dc9e 100644 --- a/packages/bits-ui/src/lib/bits/select/components/select-content-floating.svelte +++ b/packages/bits-ui/src/lib/bits/select/components/select-content-floating.svelte @@ -2,7 +2,7 @@ import { CONTENT_MARGIN, useSelectFloatingPosition } from "../select.svelte.js"; import type { ContentProps } from "../index.js"; import { mergeProps } from "$lib/internal/mergeProps.js"; - import type { WithoutChildren } from "$lib/shared/index.js"; + import type { WithoutChildrenOrChild } from "$lib/shared/index.js"; import type { WithChild } from "$lib/internal/types.js"; import type { PopperLayerImplProps } from "$lib/bits/utilities/popper-layer/types.js"; import { FloatingLayer } from "$lib/bits/utilities/floating-layer/index.js"; @@ -14,7 +14,7 @@ collisionPadding = CONTENT_MARGIN, enabled = false, ...restProps - }: WithoutChildren & + }: WithoutChildrenOrChild & WithChild & { enabled: boolean } = $props(); const contentFloatingState = useSelectFloatingPosition(); diff --git a/packages/bits-ui/src/lib/index.ts b/packages/bits-ui/src/lib/index.ts index 40f9e7790..fc1bd4bbc 100644 --- a/packages/bits-ui/src/lib/index.ts +++ b/packages/bits-ui/src/lib/index.ts @@ -1,4 +1,3 @@ -// Reexport your entry components here export * from "./bits/index.js"; export * from "./helpers/index.js"; export * from "./shared/index.js"; diff --git a/packages/bits-ui/src/lib/internal/types.ts b/packages/bits-ui/src/lib/internal/types.ts index b3ff903cf..a85fc4cd2 100644 --- a/packages/bits-ui/src/lib/internal/types.ts +++ b/packages/bits-ui/src/lib/internal/types.ts @@ -168,8 +168,8 @@ export type WithChild< > = Omit & { child?: SnippetProps extends { _default: never } ? Snippet<[{ props: Record }]> - : Snippet<[Expand & { props: Record }]>; - children?: SnippetProps extends { _default: never } ? Snippet : Snippet<[Expand]>; + : Snippet<[SnippetProps & { props: Record }]>; + children?: SnippetProps extends { _default: never } ? Snippet : Snippet<[SnippetProps]>; style?: StyleProperties; ref?: Ref | null; }; diff --git a/packages/bits-ui/src/lib/shared/index.ts b/packages/bits-ui/src/lib/shared/index.ts index 9f25a1d4f..e3339dc45 100644 --- a/packages/bits-ui/src/lib/shared/index.ts +++ b/packages/bits-ui/src/lib/shared/index.ts @@ -1,5 +1,5 @@ import type { DateValue } from "@internationalized/date"; -import type { EditableSegmentPart, Month } from "@melt-ui/svelte"; + import type * as CSS from "csstype"; export type Selected = { @@ -31,6 +31,10 @@ export type StyleProperties = CSS.Properties; export type Orientation = "horizontal" | "vertical"; export type Direction = "ltr" | "rtl"; -export type WithoutChildren = Omit; - -export type { Month, EditableSegmentPart }; +export type WithoutChildrenOrChild = Omit; +export type WithoutChildren = Omit; +export type WithoutChild = Omit; +export type WithElementRef = T & { ref?: U | null }; +export type { EditableSegmentPart } from "./date/field/types.js"; +export type { Month } from "./date/types.js"; +export type { WithChild, Expand, Without } from "$lib/internal/types.js"; diff --git a/packages/bits-ui/src/tests/calendar/CalendarMultiTest.svelte b/packages/bits-ui/src/tests/calendar/CalendarMultiTest.svelte index 3e1fa3d60..4a3f4b37f 100644 --- a/packages/bits-ui/src/tests/calendar/CalendarMultiTest.svelte +++ b/packages/bits-ui/src/tests/calendar/CalendarMultiTest.svelte @@ -1,9 +1,9 @@ diff --git a/packages/bits-ui/src/tests/date-range-field/DateRangeFieldTest.svelte b/packages/bits-ui/src/tests/date-range-field/DateRangeFieldTest.svelte index a1c8a583c..4e01cdab0 100644 --- a/packages/bits-ui/src/tests/date-range-field/DateRangeFieldTest.svelte +++ b/packages/bits-ui/src/tests/date-range-field/DateRangeFieldTest.svelte @@ -1,5 +1,5 @@
diff --git a/packages/bits-ui/src/tests/tabs/TabsTest.svelte b/packages/bits-ui/src/tests/tabs/TabsTest.svelte index a090d0aef..7180e74e1 100644 --- a/packages/bits-ui/src/tests/tabs/TabsTest.svelte +++ b/packages/bits-ui/src/tests/tabs/TabsTest.svelte @@ -1,11 +1,11 @@ diff --git a/packages/bits-ui/src/tests/toggle-group/ToggleGroupMultipleTest.svelte b/packages/bits-ui/src/tests/toggle-group/ToggleGroupMultipleTest.svelte index f7818f233..9bf4d4501 100644 --- a/packages/bits-ui/src/tests/toggle-group/ToggleGroupMultipleTest.svelte +++ b/packages/bits-ui/src/tests/toggle-group/ToggleGroupMultipleTest.svelte @@ -1,12 +1,12 @@ diff --git a/packages/bits-ui/src/tests/toggle-group/ToggleGroupTest.svelte b/packages/bits-ui/src/tests/toggle-group/ToggleGroupTest.svelte index 2ed1f8ee8..47ae2f1e7 100644 --- a/packages/bits-ui/src/tests/toggle-group/ToggleGroupTest.svelte +++ b/packages/bits-ui/src/tests/toggle-group/ToggleGroupTest.svelte @@ -1,12 +1,12 @@ diff --git a/packages/bits-ui/src/tests/toggle/ToggleTest.svelte b/packages/bits-ui/src/tests/toggle/ToggleTest.svelte index 6f942feee..7a215a32c 100644 --- a/packages/bits-ui/src/tests/toggle/ToggleTest.svelte +++ b/packages/bits-ui/src/tests/toggle/ToggleTest.svelte @@ -1,7 +1,7 @@
diff --git a/packages/bits-ui/src/tests/toolbar/ToolbarTest.svelte b/packages/bits-ui/src/tests/toolbar/ToolbarTest.svelte index f8e9aba25..54288e124 100644 --- a/packages/bits-ui/src/tests/toolbar/ToolbarTest.svelte +++ b/packages/bits-ui/src/tests/toolbar/ToolbarTest.svelte @@ -1,6 +1,6 @@ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 706e75118..9983b394e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,34 +13,34 @@ importers: version: 2.27.7 '@huntabyte/eslint-config': specifier: ^0.3.2 - version: 0.3.2(@vue/compiler-sfc@3.4.31)(eslint-plugin-svelte@2.42.0)(eslint@9.6.0)(svelte-eslint-parser@0.34.1)(svelte@5.0.0-next.181)(typescript@5.5.3) + version: 0.3.2(@vue/compiler-sfc@3.4.31)(eslint-plugin-svelte@2.42.0)(eslint@9.7.0)(svelte-eslint-parser@0.34.1)(svelte@5.0.0-next.183)(typescript@5.5.3) '@huntabyte/eslint-plugin': specifier: ^0.1.0 - version: 0.1.0(eslint@9.6.0) + version: 0.1.0(eslint@9.7.0) '@svitejs/changesets-changelog-github-compact': specifier: ^1.1.0 version: 1.1.0 eslint: specifier: ^9.0.0 - version: 9.6.0 + version: 9.7.0 eslint-plugin-svelte: specifier: ^2.37.0 - version: 2.42.0(eslint@9.6.0)(svelte@5.0.0-next.181) + version: 2.42.0(eslint@9.7.0)(svelte@5.0.0-next.183) prettier: specifier: ^3.2.5 - version: 3.3.2 + version: 3.3.3 prettier-plugin-svelte: specifier: ^3.2.2 - version: 3.2.5(prettier@3.3.2)(svelte@5.0.0-next.181) + version: 3.2.5(prettier@3.3.3)(svelte@5.0.0-next.183) prettier-plugin-tailwindcss: specifier: 0.5.13 - version: 0.5.13(prettier-plugin-svelte@3.2.5)(prettier@3.3.2) + version: 0.5.13(prettier-plugin-svelte@3.2.5)(prettier@3.3.3) svelte: - specifier: 5.0.0-next.181 - version: 5.0.0-next.181 + specifier: 5.0.0-next.183 + version: 5.0.0-next.183 svelte-eslint-parser: specifier: ^0.34.1 - version: 0.34.1(svelte@5.0.0-next.181) + version: 0.34.1(svelte@5.0.0-next.183) wrangler: specifier: ^3.44.0 version: 3.64.0 @@ -48,29 +48,29 @@ importers: packages/bits-ui: dependencies: '@floating-ui/core': - specifier: ^1.6.0 + specifier: ^1.6.4 version: 1.6.4 '@floating-ui/dom': - specifier: ^1.6.3 + specifier: ^1.6.7 version: 1.6.7 '@internationalized/date': - specifier: ^3.5.1 + specifier: ^3.5.4 version: 3.5.4 '@melt-ui/svelte': specifier: 0.76.2 - version: 0.76.2(svelte@5.0.0-next.181) + version: 0.76.2(svelte@5.0.0-next.183) clsx: - specifier: ^2.1.0 + specifier: ^2.1.1 version: 2.1.1 esm-env: specifier: ^1.0.0 version: 1.0.0 nanoid: - specifier: ^5.0.5 + specifier: ^5.0.7 version: 5.0.7 runed: specifier: ^0.15.0 - version: 0.15.0(svelte@5.0.0-next.181) + version: 0.15.0(svelte@5.0.0-next.183) scule: specifier: ^1.3.0 version: 1.3.0 @@ -82,29 +82,29 @@ importers: version: 1.0.6 svelte-toolbelt: specifier: ^0.0.2 - version: 0.0.2(svelte@5.0.0-next.181) + version: 0.0.2(svelte@5.0.0-next.183) devDependencies: '@melt-ui/pp': specifier: ^0.3.0 - version: 0.3.2(@melt-ui/svelte@0.76.2)(svelte@5.0.0-next.181) + version: 0.3.2(@melt-ui/svelte@0.76.2)(svelte@5.0.0-next.183) '@sveltejs/kit': - specifier: ^2.5.0 - version: 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.181)(vite@5.3.3) + specifier: ^2.5.18 + version: 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.183)(vite@5.3.3) '@sveltejs/package': - specifier: ^2.2.7 - version: 2.3.2(svelte@5.0.0-next.181)(typescript@5.5.3) + specifier: ^2.3.2 + version: 2.3.2(svelte@5.0.0-next.183)(typescript@5.5.3) '@sveltejs/vite-plugin-svelte': - specifier: ^3.1.0 - version: 3.1.1(svelte@5.0.0-next.181)(vite@5.3.3) + specifier: ^3.1.1 + version: 3.1.1(svelte@5.0.0-next.183)(vite@5.3.3) '@testing-library/dom': - specifier: ^10.0.0 + specifier: ^10.3.1 version: 10.3.1 '@testing-library/jest-dom': - specifier: ^6.4.2 - version: 6.4.6(vitest@1.6.0) + specifier: ^6.4.6 + version: 6.4.6(vitest@2.0.2) '@testing-library/svelte': specifier: ^5.2.0 - version: 5.2.0(svelte@5.0.0-next.181)(vite@5.3.3)(vitest@1.6.0) + version: 5.2.0(svelte@5.0.0-next.183)(vite@5.3.3)(vitest@2.0.2) '@testing-library/user-event': specifier: ^14.5.2 version: 14.5.2(@testing-library/dom@10.3.1) @@ -112,7 +112,7 @@ importers: specifier: ^3.5.9 version: 3.5.9 '@types/node': - specifier: ^20.12.2 + specifier: ^20.14.10 version: 20.14.10 '@types/resize-observer-browser': specifier: ^0.1.11 @@ -122,40 +122,40 @@ importers: version: 5.14.9 '@vitest/ui': specifier: ^1.5.0 - version: 1.6.0(vitest@1.6.0) + version: 1.6.0(vitest@2.0.2) csstype: specifier: ^3.1.3 version: 3.1.3 jest-axe: - specifier: ^8.0.0 - version: 8.0.0 + specifier: ^9.0.0 + version: 9.0.0 jsdom: - specifier: ^24.0.0 + specifier: ^24.1.0 version: 24.1.0 publint: - specifier: ^0.2.7 + specifier: ^0.2.8 version: 0.2.8 resize-observer-polyfill: specifier: ^1.5.1 version: 1.5.1 svelte: - specifier: 5.0.0-next.181 - version: 5.0.0-next.181 + specifier: 5.0.0-next.183 + version: 5.0.0-next.183 svelte-check: - specifier: ^3.6.9 - version: 3.8.4(postcss-load-config@5.1.0)(postcss@8.4.39)(svelte@5.0.0-next.181) + specifier: ^3.8.4 + version: 3.8.4(postcss-load-config@5.1.0)(postcss@8.4.39)(svelte@5.0.0-next.183) tslib: - specifier: ^2.6.2 + specifier: ^2.6.3 version: 2.6.3 typescript: specifier: ^5.5.3 version: 5.5.3 vite: - specifier: ^5.2.8 + specifier: ^5.3.3 version: 5.3.3(@types/node@20.14.10) vitest: - specifier: ^1.6.0 - version: 1.6.0(@types/node@20.14.10)(@vitest/ui@1.6.0)(jsdom@24.1.0) + specifier: ^2.0.2 + version: 2.0.2(@types/node@20.14.10)(@vitest/ui@1.6.0)(jsdom@24.1.0) sites/docs: dependencies: @@ -164,26 +164,26 @@ importers: version: 3.5.4 '@melt-ui/svelte': specifier: 0.76.2 - version: 0.76.2(svelte@5.0.0-next.181) + version: 0.76.2(svelte@5.0.0-next.183) bits-ui: specifier: workspace:* version: link:../../packages/bits-ui devDependencies: '@melt-ui/pp': specifier: ^0.3.0 - version: 0.3.2(@melt-ui/svelte@0.76.2)(svelte@5.0.0-next.181) + version: 0.3.2(@melt-ui/svelte@0.76.2)(svelte@5.0.0-next.183) '@prettier/sync': specifier: 0.3.0 - version: 0.3.0(prettier@3.3.2) + version: 0.3.0(prettier@3.3.3) '@sveltejs/adapter-cloudflare': specifier: ^4.2.0 version: 4.6.1(@sveltejs/kit@2.5.18)(wrangler@3.64.0) '@sveltejs/kit': specifier: ^2.5.0 - version: 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.181)(vite@5.3.3) + version: 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.183)(vite@5.3.3) '@sveltejs/vite-plugin-svelte': specifier: ^3.1.0 - version: 3.1.1(svelte@5.0.0-next.181)(vite@5.3.3) + version: 3.1.1(svelte@5.0.0-next.183)(vite@5.3.3) '@tailwindcss/typography': specifier: ^0.5.10 version: 0.5.13(tailwindcss@3.4.4) @@ -216,13 +216,13 @@ importers: version: 3.1.0 mdsx: specifier: ^0.0.6 - version: 0.0.6(svelte@5.0.0-next.181) + version: 0.0.6(svelte@5.0.0-next.183) mode-watcher: specifier: ^0.2.0 - version: 0.2.2(svelte@5.0.0-next.181) + version: 0.2.2(svelte@5.0.0-next.183) phosphor-svelte: specifier: ^1.4.2 - version: 1.4.2(svelte@5.0.0-next.181) + version: 1.4.2(svelte@5.0.0-next.183) postcss: specifier: ^8.4.33 version: 8.4.39 @@ -242,14 +242,14 @@ importers: specifier: ^1.1.1 version: 1.10.3 svelte: - specifier: 5.0.0-next.181 - version: 5.0.0-next.181 + specifier: 5.0.0-next.183 + version: 5.0.0-next.183 svelte-check: specifier: ^3.6.9 - version: 3.8.4(postcss-load-config@5.1.0)(postcss@8.4.39)(svelte@5.0.0-next.181) + version: 3.8.4(postcss-load-config@5.1.0)(postcss@8.4.39)(svelte@5.0.0-next.183) svelte-sonner: specifier: ^0.3.24 - version: 0.3.25(svelte@5.0.0-next.181) + version: 0.3.26(svelte@5.0.0-next.183) tailwind-merge: specifier: ^2.2.1 version: 2.4.0 @@ -294,8 +294,8 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@antfu/eslint-config@2.22.0': - resolution: {integrity: sha512-5bkd3R9UZMd/XI88fQk1ZsDDm/vDzYeBl+I4zfGw7bjDBNxQq2OhLDgdUB9d1r3J5R+grnozF1blXtfT5qYXfw==} + '@antfu/eslint-config@2.22.2': + resolution: {integrity: sha512-LKC61Rm1VC0CduV4XAZzzEQ1nmTd+H4Y1rVvNg47MgcaCVGftUpY50MD2us3QCC+ktt3AAQYT9Kmbr/nsFW73g==} hasBin: true peerDependencies: '@eslint-react/eslint-plugin': ^1.5.8 @@ -475,8 +475,8 @@ packages: cpu: [x64] os: [win32] - '@cloudflare/workers-types@4.20240701.0': - resolution: {integrity: sha512-6Cu6NIAicmb8H6CkzFdQG5Ib+TDs9HU8AKQEGlxnbvEBDmhUNpmL30ETXpLS0asdeyc+rTb2xag0hSv0Z1BflQ==} + '@cloudflare/workers-types@4.20240712.0': + resolution: {integrity: sha512-C+C0ZnkRrxR2tPkZKAXwBsWEse7bWaA7iMbaG6IKaxaPTo/5ilx7Ei3BkI2izxmOJMsC05VS1eFUf95urXzhmw==} '@contentlayer/cli@0.3.4': resolution: {integrity: sha512-vNDwgLuhYNu+m70NZ3XK9kexKNguuxPXg7Yvzj3B34cEilQjjzSrcTY/i+AIQm9V7uT5GGshx9ukzPf+SmoszQ==} @@ -1004,8 +1004,8 @@ packages: resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.6.0': - resolution: {integrity: sha512-D9B0/3vNg44ZeWbYMpBoXqNP4j6eQD5vNwIlGAuFRRzK/WtT/jvDQW3Bi9kkf3PMDMlM7Yi+73VLUsn5bJcl8A==} + '@eslint/js@9.7.0': + resolution: {integrity: sha512-ChuWDQenef8OSFnvuxv0TCVxEwmu3+hPNKvM9B34qpM0rDRbjL8t5QkQeHHeAfsKQjuH9wS82WeCi1J/owatng==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.4': @@ -1385,6 +1385,9 @@ packages: cpu: [x64] os: [win32] + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + '@shikijs/core@1.10.3': resolution: {integrity: sha512-D45PMaBaeDHxww+EkcDQtDAtzv00Gcsp72ukBtaLSmqRvh0WgGMq3Al0rl1QQBZfuneO75NXMIzEZGFitThWbg==} @@ -1461,8 +1464,8 @@ packages: resolution: {integrity: sha512-qhUGGDHcpbY2zpjW3SwqchuW8J/5EzlPFud7xNntHKA7f3a/mx5+g+ruJKFHSAiVZYo30PALt+AyhmPUNKH/Og==} engines: {node: ^14.13.1 || ^16.0.0 || >=18} - '@swc/helpers@0.5.11': - resolution: {integrity: sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==} + '@swc/helpers@0.5.12': + resolution: {integrity: sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==} '@tailwindcss/typography@0.5.13': resolution: {integrity: sha512-ADGcJ8dX21dVVHIwTRgzrcunY6YY9uSlAHHGVKvkA+vLc5qLwEszvKts40lx7z0qc4clpjclwLeK5rVCV2P/uw==} @@ -1760,17 +1763,20 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@vitest/expect@1.6.0': - resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + '@vitest/expect@2.0.2': + resolution: {integrity: sha512-nKAvxBYqcDugYZ4nJvnm5OR8eDJdgWjk4XM9owQKUjzW70q0icGV2HVnQOyYsp906xJaBDUXw0+9EHw2T8e0mQ==} + + '@vitest/pretty-format@2.0.2': + resolution: {integrity: sha512-SBCyOXfGVvddRd9r2PwoVR0fonQjh9BMIcBMlSzbcNwFfGr6ZhOhvBzurjvi2F4ryut2HcqiFhNeDVGwru8tLg==} - '@vitest/runner@1.6.0': - resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + '@vitest/runner@2.0.2': + resolution: {integrity: sha512-OCh437Vi8Wdbif1e0OvQcbfM3sW4s2lpmOjAE7qfLrpzJX2M7J1IQlNvEcb/fu6kaIB9n9n35wS0G2Q3en5kHg==} - '@vitest/snapshot@1.6.0': - resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + '@vitest/snapshot@2.0.2': + resolution: {integrity: sha512-Yc2ewhhZhx+0f9cSUdfzPRcsM6PhIb+S43wxE7OG0kTxqgqzo8tHkXFuFlndXeDMp09G3sY/X5OAo/RfYydf1g==} - '@vitest/spy@1.6.0': - resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + '@vitest/spy@2.0.2': + resolution: {integrity: sha512-MgwJ4AZtCgqyp2d7WcQVE8aNG5vQ9zu9qMPYQHjsld/QVsrvg78beNrXdO4HYkP0lDahCO3P4F27aagIag+SGQ==} '@vitest/ui@1.6.0': resolution: {integrity: sha512-k3Lyo+ONLOgylctiGovRKy7V4+dIN2yxstX3eY5cWFXH6WP+ooVX79YSyi0GagdTQzLmT43BF27T0s6dOIPBXA==} @@ -1780,6 +1786,9 @@ packages: '@vitest/utils@1.6.0': resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + '@vitest/utils@2.0.2': + resolution: {integrity: sha512-pxCY1v7kmOCWYWjzc0zfjGTA3Wmn8PKnlPvSrsA643P1NHl1fOyXj2Q9SaNlrlFE+ivCsxM80Ov3AR82RmHCWQ==} + '@vue/compiler-core@3.4.31': resolution: {integrity: sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==} @@ -1882,8 +1891,9 @@ packages: as-table@1.0.55: resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} astring@1.8.6: resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} @@ -1903,8 +1913,8 @@ packages: resolution: {integrity: sha512-LEUDjgmdJoA3LqklSTwKYqkjcZ4HKc4ddIYGSAiSkr46NTjzg2L9RNB+lekO9P7Dlpa87+hBtzc2Fzn/+GUWMQ==} engines: {node: '>=4'} - axe-core@4.7.2: - resolution: {integrity: sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==} + axe-core@4.9.1: + resolution: {integrity: sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==} engines: {node: '>=4'} axobject-query@4.0.0: @@ -1983,9 +1993,9 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} + chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -2027,8 +2037,9 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} @@ -2194,8 +2205,8 @@ packages: dedent-js@1.0.1: resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} deep-is@0.1.4: @@ -2371,8 +2382,8 @@ packages: peerDependencies: eslint: '>=4.19.1' - eslint-plugin-import-x@0.5.3: - resolution: {integrity: sha512-hJ/wkMcsLQXAZL3+txXIDpbW5cqwdm1rLTqV4VRY03aIbzE3zWE7rPZKW6Gzf7xyl1u3V1iYC6tOG77d9NF4GQ==} + eslint-plugin-import-x@3.0.1: + resolution: {integrity: sha512-jzQgJuE4ssxwNi0aMBkOL8whd4eHb0Z/uFWsk8uEoYB7xwTkAptSKojLzRswxgf/1bhH6QgcLjgabUBQqluBIg==} engines: {node: '>=16'} peerDependencies: eslint: ^8.56.0 || ^9.0.0-0 @@ -2500,8 +2511,8 @@ packages: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-scope@8.0.1: - resolution: {integrity: sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==} + eslint-scope@8.0.2: + resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: @@ -2512,8 +2523,8 @@ packages: resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.6.0: - resolution: {integrity: sha512-ElQkdLMEEqQNM9Njff+2Y4q2afHk7JpkPvrd7Xh7xefwgQynqPxwf55J7di9+MEibWUGdNjFF9ITG9Pck5M84w==} + eslint@9.7.0: + resolution: {integrity: sha512-FzJ9D/0nGiCGBf8UXO/IGLTgLVzIxze1zpfA8Ton2mjLovXdAPlYDv+MQDcqj3TmrhAGYfOpz9RfR+ent0AgAw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true @@ -3037,9 +3048,9 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jest-axe@8.0.0: - resolution: {integrity: sha512-4kNcNn7J0jPO4jANEYZOHeQ/tSBvkXS+MxTbX1CKbXGd0+ZbRGDn/v/8IYWI/MmYX15iLVyYRnRev9X3ksePWA==} - engines: {node: '>= 14.0.0'} + jest-axe@9.0.0: + resolution: {integrity: sha512-Xt7O0+wIpW31lv0SO1wQZUTyJE7DEmnDEZeTt9/S9L5WUywxrv8BrgvTuQEqujtfaQOcJ70p4wg7UUgK1E2F5g==} + engines: {node: '>= 16.0.0'} jest-diff@29.7.0: resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} @@ -3072,9 +3083,6 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-tokens@9.0.0: - resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} - js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -3206,6 +3214,9 @@ packages: loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@3.1.1: + resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} + lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -3710,10 +3721,6 @@ packages: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} - p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -3808,8 +3815,9 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} @@ -4008,8 +4016,8 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.3.2: - resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==} + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} engines: {node: '>=14'} hasBin: true @@ -4424,9 +4432,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@2.1.0: - resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} - style-object-to-css-string@1.1.3: resolution: {integrity: sha512-bISQoUsir/qGfo7vY8rw00ia9nnyE1jvYt3zZ2jhdkcXZ6dAEi74inMzQ6On57vFI+I4Fck6wOv5UI9BEwJDgw==} @@ -4524,8 +4529,8 @@ packages: typescript: optional: true - svelte-sonner@0.3.25: - resolution: {integrity: sha512-jYAHqDc1fBAotI+9g9SW2Pc6sKJ8oVl7aXB/EhQsxiVADAZ9AX4w7dxDI1oyskD6pG8mhYIKXi+5WqFmCRqFyw==} + svelte-sonner@0.3.26: + resolution: {integrity: sha512-nIrXy0p4L/gdOgOXWEOprO5RJ6cjldhxIN0lIsl9f3uMsG0BrCSUhJDLIhhvgaN2ZqXPAyciVQdPQggW96fayQ==} peerDependencies: svelte: ^3.0.0 || ^4.0.0 || ^5.0.0-next.1 @@ -4540,8 +4545,8 @@ packages: svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 typescript: ^4.9.4 || ^5.0.0 - svelte@5.0.0-next.181: - resolution: {integrity: sha512-F4vPUp0NKxku5ZXEiCZ1C8lhKlL0hXedbTRu2i5Cf49SCSS9lceSPhLP/Zn2Ds5MSlfEnjBF3a0jWDc51pbF2Q==} + svelte@5.0.0-next.183: + resolution: {integrity: sha512-1onDKWp5+a5ehYVWJ0scHVO0IbOTH9zIqYb/odXp/aG0qF9XdR76DL2tLrgRM5xzUdcvXSmakxa+tQDJojTBVw==} engines: {node: '>=18'} symbol-tree@3.2.4: @@ -4604,12 +4609,16 @@ packages: tinybench@2.8.0: resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} - tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + tinypool@1.0.0: + resolution: {integrity: sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} engines: {node: '>=14.0.0'} - tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + tinyspy@3.0.0: + resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==} engines: {node: '>=14.0.0'} tmp@0.0.33: @@ -4824,8 +4833,8 @@ packages: vfile@6.0.1: resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} - vite-node@1.6.0: - resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + vite-node@2.0.2: + resolution: {integrity: sha512-w4vkSz1Wo+NIQg8pjlEn0jQbcM/0D+xVaYjhw3cvarTanLLBh54oNiRbsT8PNK5GfuST0IlVXjsNRoNlqvY/fw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -4865,15 +4874,15 @@ packages: vite: optional: true - vitest@1.6.0: - resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} + vitest@2.0.2: + resolution: {integrity: sha512-WlpZ9neRIjNBIOQwBYfBSr0+of5ZCbxT2TVGKW4Lv0c8+srCFIiRdsP7U009t8mMn821HQ4XKgkx5dVWpyoyLw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.6.0 - '@vitest/ui': 1.6.0 + '@vitest/browser': 2.0.2 + '@vitest/ui': 2.0.2 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -5066,44 +5075,44 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@antfu/eslint-config@2.22.0(@vue/compiler-sfc@3.4.31)(eslint-plugin-svelte@2.42.0)(eslint@9.6.0)(svelte-eslint-parser@0.34.1)(svelte@5.0.0-next.181)(typescript@5.5.3)': + '@antfu/eslint-config@2.22.2(@vue/compiler-sfc@3.4.31)(eslint-plugin-svelte@2.42.0)(eslint@9.7.0)(svelte-eslint-parser@0.34.1)(svelte@5.0.0-next.183)(typescript@5.5.3)': dependencies: '@antfu/install-pkg': 0.3.3 '@clack/prompts': 0.7.0 - '@stylistic/eslint-plugin': 2.6.0-beta.0(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/eslint-plugin': 8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40)(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/parser': 8.0.0-alpha.40(eslint@9.6.0)(typescript@5.5.3) - eslint: 9.6.0 + '@stylistic/eslint-plugin': 2.6.0-beta.0(eslint@9.7.0)(typescript@5.5.3) + '@typescript-eslint/eslint-plugin': 8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40)(eslint@9.7.0)(typescript@5.5.3) + '@typescript-eslint/parser': 8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3) + eslint: 9.7.0 eslint-config-flat-gitignore: 0.1.7 eslint-flat-config-utils: 0.2.5 - eslint-merge-processors: 0.1.0(eslint@9.6.0) - eslint-plugin-antfu: 2.3.4(eslint@9.6.0) - eslint-plugin-command: 0.2.3(eslint@9.6.0) - eslint-plugin-eslint-comments: 3.2.0(eslint@9.6.0) - eslint-plugin-import-x: 0.5.3(eslint@9.6.0)(typescript@5.5.3) - eslint-plugin-jsdoc: 48.7.0(eslint@9.6.0) - eslint-plugin-jsonc: 2.16.0(eslint@9.6.0) - eslint-plugin-markdown: 5.1.0(eslint@9.6.0) - eslint-plugin-n: 17.9.0(eslint@9.6.0) + eslint-merge-processors: 0.1.0(eslint@9.7.0) + eslint-plugin-antfu: 2.3.4(eslint@9.7.0) + eslint-plugin-command: 0.2.3(eslint@9.7.0) + eslint-plugin-eslint-comments: 3.2.0(eslint@9.7.0) + eslint-plugin-import-x: 3.0.1(eslint@9.7.0)(typescript@5.5.3) + eslint-plugin-jsdoc: 48.7.0(eslint@9.7.0) + eslint-plugin-jsonc: 2.16.0(eslint@9.7.0) + eslint-plugin-markdown: 5.1.0(eslint@9.7.0) + eslint-plugin-n: 17.9.0(eslint@9.7.0) eslint-plugin-no-only-tests: 3.1.0 - eslint-plugin-perfectionist: 2.11.0(eslint@9.6.0)(svelte-eslint-parser@0.34.1)(svelte@5.0.0-next.181)(typescript@5.5.3)(vue-eslint-parser@9.4.3) - eslint-plugin-regexp: 2.6.0(eslint@9.6.0) - eslint-plugin-svelte: 2.42.0(eslint@9.6.0)(svelte@5.0.0-next.181) - eslint-plugin-toml: 0.11.1(eslint@9.6.0) - eslint-plugin-unicorn: 54.0.0(eslint@9.6.0) - eslint-plugin-unused-imports: 4.0.0(@typescript-eslint/eslint-plugin@8.0.0-alpha.40)(eslint@9.6.0) - eslint-plugin-vitest: 0.5.4(@typescript-eslint/eslint-plugin@8.0.0-alpha.40)(eslint@9.6.0)(typescript@5.5.3) - eslint-plugin-vue: 9.27.0(eslint@9.6.0) - eslint-plugin-yml: 1.14.0(eslint@9.6.0) - eslint-processor-vue-blocks: 0.1.2(@vue/compiler-sfc@3.4.31)(eslint@9.6.0) + eslint-plugin-perfectionist: 2.11.0(eslint@9.7.0)(svelte-eslint-parser@0.34.1)(svelte@5.0.0-next.183)(typescript@5.5.3)(vue-eslint-parser@9.4.3) + eslint-plugin-regexp: 2.6.0(eslint@9.7.0) + eslint-plugin-svelte: 2.42.0(eslint@9.7.0)(svelte@5.0.0-next.183) + eslint-plugin-toml: 0.11.1(eslint@9.7.0) + eslint-plugin-unicorn: 54.0.0(eslint@9.7.0) + eslint-plugin-unused-imports: 4.0.0(@typescript-eslint/eslint-plugin@8.0.0-alpha.40)(eslint@9.7.0) + eslint-plugin-vitest: 0.5.4(@typescript-eslint/eslint-plugin@8.0.0-alpha.40)(eslint@9.7.0)(typescript@5.5.3) + eslint-plugin-vue: 9.27.0(eslint@9.7.0) + eslint-plugin-yml: 1.14.0(eslint@9.7.0) + eslint-processor-vue-blocks: 0.1.2(@vue/compiler-sfc@3.4.31)(eslint@9.7.0) globals: 15.8.0 jsonc-eslint-parser: 2.4.0 local-pkg: 0.5.0 parse-gitignore: 2.0.0 picocolors: 1.0.1 - svelte-eslint-parser: 0.34.1(svelte@5.0.0-next.181) + svelte-eslint-parser: 0.34.1(svelte@5.0.0-next.183) toml-eslint-parser: 0.10.0 - vue-eslint-parser: 9.4.3(eslint@9.6.0) + vue-eslint-parser: 9.4.3(eslint@9.7.0) yaml-eslint-parser: 1.2.3 yargs: 17.7.2 transitivePeerDependencies: @@ -5342,7 +5351,7 @@ snapshots: '@cloudflare/workerd-windows-64@1.20240701.0': optional: true - '@cloudflare/workers-types@4.20240701.0': {} + '@cloudflare/workers-types@4.20240712.0': {} '@contentlayer/cli@0.3.4(esbuild@0.23.0)': dependencies: @@ -5713,9 +5722,9 @@ snapshots: '@esbuild/win32-x64@0.23.0': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.6.0)': + '@eslint-community/eslint-utils@4.4.0(eslint@9.7.0)': dependencies: - eslint: 9.6.0 + eslint: 9.7.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.11.0': {} @@ -5742,7 +5751,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.6.0': {} + '@eslint/js@9.7.0': {} '@eslint/object-schema@2.1.4': {} @@ -5777,21 +5786,21 @@ snapshots: '@humanwhocodes/retry@0.3.0': {} - '@huntabyte/eslint-config@0.3.2(@vue/compiler-sfc@3.4.31)(eslint-plugin-svelte@2.42.0)(eslint@9.6.0)(svelte-eslint-parser@0.34.1)(svelte@5.0.0-next.181)(typescript@5.5.3)': + '@huntabyte/eslint-config@0.3.2(@vue/compiler-sfc@3.4.31)(eslint-plugin-svelte@2.42.0)(eslint@9.7.0)(svelte-eslint-parser@0.34.1)(svelte@5.0.0-next.183)(typescript@5.5.3)': dependencies: - '@antfu/eslint-config': 2.22.0(@vue/compiler-sfc@3.4.31)(eslint-plugin-svelte@2.42.0)(eslint@9.6.0)(svelte-eslint-parser@0.34.1)(svelte@5.0.0-next.181)(typescript@5.5.3) + '@antfu/eslint-config': 2.22.2(@vue/compiler-sfc@3.4.31)(eslint-plugin-svelte@2.42.0)(eslint@9.7.0)(svelte-eslint-parser@0.34.1)(svelte@5.0.0-next.183)(typescript@5.5.3) '@antfu/install-pkg': 0.3.3 '@clack/prompts': 0.7.0 - '@huntabyte/eslint-plugin': 0.1.0(eslint@9.6.0) - '@typescript-eslint/eslint-plugin': 7.16.0(@typescript-eslint/parser@7.16.0)(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/parser': 7.16.0(eslint@9.6.0)(typescript@5.5.3) + '@huntabyte/eslint-plugin': 0.1.0(eslint@9.7.0) + '@typescript-eslint/eslint-plugin': 7.16.0(@typescript-eslint/parser@7.16.0)(eslint@9.7.0)(typescript@5.5.3) + '@typescript-eslint/parser': 7.16.0(eslint@9.7.0)(typescript@5.5.3) chalk: 5.3.0 - eslint: 9.6.0 + eslint: 9.7.0 eslint-flat-config-utils: 0.2.5 - eslint-plugin-svelte: 2.42.0(eslint@9.6.0)(svelte@5.0.0-next.181) + eslint-plugin-svelte: 2.42.0(eslint@9.7.0)(svelte@5.0.0-next.183) local-pkg: 0.5.0 parse-gitignore: 2.0.0 - svelte-eslint-parser: 0.34.1(svelte@5.0.0-next.181) + svelte-eslint-parser: 0.34.1(svelte@5.0.0-next.183) yargs: 17.7.2 transitivePeerDependencies: - '@eslint-react/eslint-plugin' @@ -5811,13 +5820,13 @@ snapshots: - typescript - vitest - '@huntabyte/eslint-plugin@0.1.0(eslint@9.6.0)': + '@huntabyte/eslint-plugin@0.1.0(eslint@9.7.0)': dependencies: - eslint: 9.6.0 + eslint: 9.7.0 '@internationalized/date@3.5.4': dependencies: - '@swc/helpers': 0.5.11 + '@swc/helpers': 0.5.12 '@isaacs/cliui@8.0.2': dependencies: @@ -5928,14 +5937,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@melt-ui/pp@0.3.2(@melt-ui/svelte@0.76.2)(svelte@5.0.0-next.181)': + '@melt-ui/pp@0.3.2(@melt-ui/svelte@0.76.2)(svelte@5.0.0-next.183)': dependencies: - '@melt-ui/svelte': 0.76.2(svelte@5.0.0-next.181) + '@melt-ui/svelte': 0.76.2(svelte@5.0.0-next.183) estree-walker: 3.0.3 magic-string: 0.30.10 - svelte: 5.0.0-next.181 + svelte: 5.0.0-next.183 - '@melt-ui/svelte@0.76.2(svelte@5.0.0-next.181)': + '@melt-ui/svelte@0.76.2(svelte@5.0.0-next.183)': dependencies: '@floating-ui/core': 1.6.4 '@floating-ui/dom': 1.6.7 @@ -5943,7 +5952,7 @@ snapshots: dequal: 2.0.3 focus-trap: 7.5.4 nanoid: 5.0.7 - svelte: 5.0.0-next.181 + svelte: 5.0.0-next.183 '@nodelib/fs.scandir@2.1.5': dependencies: @@ -6081,9 +6090,9 @@ snapshots: '@polka/url@1.0.0-next.25': {} - '@prettier/sync@0.3.0(prettier@3.3.2)': + '@prettier/sync@0.3.0(prettier@3.3.3)': dependencies: - prettier: 3.3.2 + prettier: 3.3.3 '@protobufjs/aspromise@1.1.2': {} @@ -6156,70 +6165,72 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.18.1': optional: true + '@rtsao/scc@1.1.0': {} + '@shikijs/core@1.10.3': dependencies: '@types/hast': 3.0.4 '@sinclair/typebox@0.27.8': {} - '@stylistic/eslint-plugin-js@2.6.0-beta.0(eslint@9.6.0)': + '@stylistic/eslint-plugin-js@2.6.0-beta.0(eslint@9.7.0)': dependencies: '@types/eslint': 8.56.10 acorn: 8.12.1 - eslint: 9.6.0 + eslint: 9.7.0 eslint-visitor-keys: 4.0.0 espree: 10.1.0 - '@stylistic/eslint-plugin-jsx@2.6.0-beta.0(eslint@9.6.0)': + '@stylistic/eslint-plugin-jsx@2.6.0-beta.0(eslint@9.7.0)': dependencies: - '@stylistic/eslint-plugin-js': 2.6.0-beta.0(eslint@9.6.0) + '@stylistic/eslint-plugin-js': 2.6.0-beta.0(eslint@9.7.0) '@types/eslint': 8.56.10 - eslint: 9.6.0 + eslint: 9.7.0 estraverse: 5.3.0 picomatch: 4.0.2 - '@stylistic/eslint-plugin-plus@2.6.0-beta.0(eslint@9.6.0)(typescript@5.5.3)': + '@stylistic/eslint-plugin-plus@2.6.0-beta.0(eslint@9.7.0)(typescript@5.5.3)': dependencies: '@types/eslint': 8.56.10 - '@typescript-eslint/utils': 8.0.0-alpha.41(eslint@9.6.0)(typescript@5.5.3) - eslint: 9.6.0 + '@typescript-eslint/utils': 8.0.0-alpha.41(eslint@9.7.0)(typescript@5.5.3) + eslint: 9.7.0 transitivePeerDependencies: - supports-color - typescript - '@stylistic/eslint-plugin-ts@2.6.0-beta.0(eslint@9.6.0)(typescript@5.5.3)': + '@stylistic/eslint-plugin-ts@2.6.0-beta.0(eslint@9.7.0)(typescript@5.5.3)': dependencies: - '@stylistic/eslint-plugin-js': 2.6.0-beta.0(eslint@9.6.0) + '@stylistic/eslint-plugin-js': 2.6.0-beta.0(eslint@9.7.0) '@types/eslint': 8.56.10 - '@typescript-eslint/utils': 8.0.0-alpha.41(eslint@9.6.0)(typescript@5.5.3) - eslint: 9.6.0 + '@typescript-eslint/utils': 8.0.0-alpha.41(eslint@9.7.0)(typescript@5.5.3) + eslint: 9.7.0 transitivePeerDependencies: - supports-color - typescript - '@stylistic/eslint-plugin@2.6.0-beta.0(eslint@9.6.0)(typescript@5.5.3)': + '@stylistic/eslint-plugin@2.6.0-beta.0(eslint@9.7.0)(typescript@5.5.3)': dependencies: - '@stylistic/eslint-plugin-js': 2.6.0-beta.0(eslint@9.6.0) - '@stylistic/eslint-plugin-jsx': 2.6.0-beta.0(eslint@9.6.0) - '@stylistic/eslint-plugin-plus': 2.6.0-beta.0(eslint@9.6.0)(typescript@5.5.3) - '@stylistic/eslint-plugin-ts': 2.6.0-beta.0(eslint@9.6.0)(typescript@5.5.3) + '@stylistic/eslint-plugin-js': 2.6.0-beta.0(eslint@9.7.0) + '@stylistic/eslint-plugin-jsx': 2.6.0-beta.0(eslint@9.7.0) + '@stylistic/eslint-plugin-plus': 2.6.0-beta.0(eslint@9.7.0)(typescript@5.5.3) + '@stylistic/eslint-plugin-ts': 2.6.0-beta.0(eslint@9.7.0)(typescript@5.5.3) '@types/eslint': 8.56.10 - eslint: 9.6.0 + eslint: 9.7.0 transitivePeerDependencies: - supports-color - typescript '@sveltejs/adapter-cloudflare@4.6.1(@sveltejs/kit@2.5.18)(wrangler@3.64.0)': dependencies: - '@cloudflare/workers-types': 4.20240701.0 - '@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.181)(vite@5.3.3) + '@cloudflare/workers-types': 4.20240712.0 + '@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.183)(vite@5.3.3) esbuild: 0.21.5 worktop: 0.8.0-next.18 wrangler: 3.64.0 - '@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.181)(vite@5.3.3)': + '@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.183)(vite@5.3.3)': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.181)(vite@5.3.3) + '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.183)(vite@5.3.3) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 5.0.0 @@ -6231,39 +6242,39 @@ snapshots: sade: 1.8.1 set-cookie-parser: 2.6.0 sirv: 2.0.4 - svelte: 5.0.0-next.181 + svelte: 5.0.0-next.183 tiny-glob: 0.2.9 vite: 5.3.3(@types/node@20.14.10) - '@sveltejs/package@2.3.2(svelte@5.0.0-next.181)(typescript@5.5.3)': + '@sveltejs/package@2.3.2(svelte@5.0.0-next.183)(typescript@5.5.3)': dependencies: chokidar: 3.6.0 kleur: 4.1.5 sade: 1.8.1 semver: 7.6.2 - svelte: 5.0.0-next.181 - svelte2tsx: 0.7.13(svelte@5.0.0-next.181)(typescript@5.5.3) + svelte: 5.0.0-next.183 + svelte2tsx: 0.7.13(svelte@5.0.0-next.183)(typescript@5.5.3) transitivePeerDependencies: - typescript - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.181)(vite@5.3.3)': + '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.183)(vite@5.3.3)': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.181)(vite@5.3.3) + '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.183)(vite@5.3.3) debug: 4.3.5 - svelte: 5.0.0-next.181 + svelte: 5.0.0-next.183 vite: 5.3.3(@types/node@20.14.10) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.181)(vite@5.3.3)': + '@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.183)(vite@5.3.3)': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.181)(vite@5.3.3) + '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1)(svelte@5.0.0-next.183)(vite@5.3.3) debug: 4.3.5 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.10 - svelte: 5.0.0-next.181 - svelte-hmr: 0.16.0(svelte@5.0.0-next.181) + svelte: 5.0.0-next.183 + svelte-hmr: 0.16.0(svelte@5.0.0-next.183) vite: 5.3.3(@types/node@20.14.10) vitefu: 0.2.5(vite@5.3.3) transitivePeerDependencies: @@ -6276,7 +6287,7 @@ snapshots: transitivePeerDependencies: - encoding - '@swc/helpers@0.5.11': + '@swc/helpers@0.5.12': dependencies: tslib: 2.6.3 @@ -6299,7 +6310,7 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.4.6(vitest@1.6.0)': + '@testing-library/jest-dom@6.4.6(vitest@2.0.2)': dependencies: '@adobe/css-tools': 4.4.0 '@babel/runtime': 7.24.8 @@ -6309,14 +6320,14 @@ snapshots: dom-accessibility-api: 0.6.3 lodash: 4.17.21 redent: 3.0.0 - vitest: 1.6.0(@types/node@20.14.10)(@vitest/ui@1.6.0)(jsdom@24.1.0) + vitest: 2.0.2(@types/node@20.14.10)(@vitest/ui@1.6.0)(jsdom@24.1.0) - '@testing-library/svelte@5.2.0(svelte@5.0.0-next.181)(vite@5.3.3)(vitest@1.6.0)': + '@testing-library/svelte@5.2.0(svelte@5.0.0-next.183)(vite@5.3.3)(vitest@2.0.2)': dependencies: '@testing-library/dom': 10.3.1 - svelte: 5.0.0-next.181 + svelte: 5.0.0-next.183 vite: 5.3.3(@types/node@20.14.10) - vitest: 1.6.0(@types/node@20.14.10)(@vitest/ui@1.6.0)(jsdom@24.1.0) + vitest: 2.0.2(@types/node@20.14.10)(@vitest/ui@1.6.0)(jsdom@24.1.0) '@testing-library/user-event@14.5.2(@testing-library/dom@10.3.1)': dependencies: @@ -6425,15 +6436,15 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@7.16.0(@typescript-eslint/parser@7.16.0)(eslint@9.6.0)(typescript@5.5.3)': + '@typescript-eslint/eslint-plugin@7.16.0(@typescript-eslint/parser@7.16.0)(eslint@9.7.0)(typescript@5.5.3)': dependencies: '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 7.16.0(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/parser': 7.16.0(eslint@9.7.0)(typescript@5.5.3) '@typescript-eslint/scope-manager': 7.16.0 - '@typescript-eslint/type-utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/type-utils': 7.16.0(eslint@9.7.0)(typescript@5.5.3) + '@typescript-eslint/utils': 7.16.0(eslint@9.7.0)(typescript@5.5.3) '@typescript-eslint/visitor-keys': 7.16.0 - eslint: 9.6.0 + eslint: 9.7.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 @@ -6442,15 +6453,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40)(eslint@9.6.0)(typescript@5.5.3)': + '@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40)(eslint@9.7.0)(typescript@5.5.3)': dependencies: '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 8.0.0-alpha.40(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/parser': 8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3) '@typescript-eslint/scope-manager': 8.0.0-alpha.40 - '@typescript-eslint/type-utils': 8.0.0-alpha.40(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/utils': 8.0.0-alpha.40(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/type-utils': 8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3) + '@typescript-eslint/utils': 8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3) '@typescript-eslint/visitor-keys': 8.0.0-alpha.40 - eslint: 9.6.0 + eslint: 9.7.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 @@ -6459,26 +6470,26 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.16.0(eslint@9.6.0)(typescript@5.5.3)': + '@typescript-eslint/parser@7.16.0(eslint@9.7.0)(typescript@5.5.3)': dependencies: '@typescript-eslint/scope-manager': 7.16.0 '@typescript-eslint/types': 7.16.0 '@typescript-eslint/typescript-estree': 7.16.0(typescript@5.5.3) '@typescript-eslint/visitor-keys': 7.16.0 debug: 4.3.5 - eslint: 9.6.0 + eslint: 9.7.0 typescript: 5.5.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.6.0)(typescript@5.5.3)': + '@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3)': dependencies: '@typescript-eslint/scope-manager': 8.0.0-alpha.40 '@typescript-eslint/types': 8.0.0-alpha.40 '@typescript-eslint/typescript-estree': 8.0.0-alpha.40(typescript@5.5.3) '@typescript-eslint/visitor-keys': 8.0.0-alpha.40 debug: 4.3.5 - eslint: 9.6.0 + eslint: 9.7.0 typescript: 5.5.3 transitivePeerDependencies: - supports-color @@ -6498,21 +6509,21 @@ snapshots: '@typescript-eslint/types': 8.0.0-alpha.41 '@typescript-eslint/visitor-keys': 8.0.0-alpha.41 - '@typescript-eslint/type-utils@7.16.0(eslint@9.6.0)(typescript@5.5.3)': + '@typescript-eslint/type-utils@7.16.0(eslint@9.7.0)(typescript@5.5.3)': dependencies: '@typescript-eslint/typescript-estree': 7.16.0(typescript@5.5.3) - '@typescript-eslint/utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/utils': 7.16.0(eslint@9.7.0)(typescript@5.5.3) debug: 4.3.5 - eslint: 9.6.0 + eslint: 9.7.0 ts-api-utils: 1.3.0(typescript@5.5.3) typescript: 5.5.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.0.0-alpha.40(eslint@9.6.0)(typescript@5.5.3)': + '@typescript-eslint/type-utils@8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3)': dependencies: '@typescript-eslint/typescript-estree': 8.0.0-alpha.40(typescript@5.5.3) - '@typescript-eslint/utils': 8.0.0-alpha.40(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/utils': 8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3) debug: 4.3.5 ts-api-utils: 1.3.0(typescript@5.5.3) typescript: 5.5.3 @@ -6568,35 +6579,35 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.16.0(eslint@9.6.0)(typescript@5.5.3)': + '@typescript-eslint/utils@7.16.0(eslint@9.7.0)(typescript@5.5.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) '@typescript-eslint/scope-manager': 7.16.0 '@typescript-eslint/types': 7.16.0 '@typescript-eslint/typescript-estree': 7.16.0(typescript@5.5.3) - eslint: 9.6.0 + eslint: 9.7.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@8.0.0-alpha.40(eslint@9.6.0)(typescript@5.5.3)': + '@typescript-eslint/utils@8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) '@typescript-eslint/scope-manager': 8.0.0-alpha.40 '@typescript-eslint/types': 8.0.0-alpha.40 '@typescript-eslint/typescript-estree': 8.0.0-alpha.40(typescript@5.5.3) - eslint: 9.6.0 + eslint: 9.7.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@8.0.0-alpha.41(eslint@9.6.0)(typescript@5.5.3)': + '@typescript-eslint/utils@8.0.0-alpha.41(eslint@9.7.0)(typescript@5.5.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) '@typescript-eslint/scope-manager': 8.0.0-alpha.41 '@typescript-eslint/types': 8.0.0-alpha.41 '@typescript-eslint/typescript-estree': 8.0.0-alpha.41(typescript@5.5.3) - eslint: 9.6.0 + eslint: 9.7.0 transitivePeerDependencies: - supports-color - typescript @@ -6618,29 +6629,33 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitest/expect@1.6.0': + '@vitest/expect@2.0.2': dependencies: - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - chai: 4.4.1 + '@vitest/spy': 2.0.2 + '@vitest/utils': 2.0.2 + chai: 5.1.1 + tinyrainbow: 1.2.0 - '@vitest/runner@1.6.0': + '@vitest/pretty-format@2.0.2': dependencies: - '@vitest/utils': 1.6.0 - p-limit: 5.0.0 + tinyrainbow: 1.2.0 + + '@vitest/runner@2.0.2': + dependencies: + '@vitest/utils': 2.0.2 pathe: 1.1.2 - '@vitest/snapshot@1.6.0': + '@vitest/snapshot@2.0.2': dependencies: + '@vitest/pretty-format': 2.0.2 magic-string: 0.30.10 pathe: 1.1.2 - pretty-format: 29.7.0 - '@vitest/spy@1.6.0': + '@vitest/spy@2.0.2': dependencies: - tinyspy: 2.2.1 + tinyspy: 3.0.0 - '@vitest/ui@1.6.0(vitest@1.6.0)': + '@vitest/ui@1.6.0(vitest@2.0.2)': dependencies: '@vitest/utils': 1.6.0 fast-glob: 3.3.2 @@ -6649,7 +6664,7 @@ snapshots: pathe: 1.1.2 picocolors: 1.0.1 sirv: 2.0.4 - vitest: 1.6.0(@types/node@20.14.10)(@vitest/ui@1.6.0)(jsdom@24.1.0) + vitest: 2.0.2(@types/node@20.14.10)(@vitest/ui@1.6.0)(jsdom@24.1.0) '@vitest/utils@1.6.0': dependencies: @@ -6658,6 +6673,13 @@ snapshots: loupe: 2.3.7 pretty-format: 29.7.0 + '@vitest/utils@2.0.2': + dependencies: + '@vitest/pretty-format': 2.0.2 + estree-walker: 3.0.3 + loupe: 3.1.1 + tinyrainbow: 1.2.0 + '@vue/compiler-core@3.4.31': dependencies: '@babel/parser': 7.24.8 @@ -6764,7 +6786,7 @@ snapshots: dependencies: printable-characters: 1.0.42 - assertion-error@1.1.0: {} + assertion-error@2.0.1: {} astring@1.8.6: {} @@ -6782,7 +6804,7 @@ snapshots: axe-core@3.5.6: {} - axe-core@4.7.2: {} + axe-core@4.9.1: {} axobject-query@4.0.0: dependencies: @@ -6852,15 +6874,13 @@ snapshots: ccount@2.0.1: {} - chai@4.4.1: + chai@5.1.1: dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.1 + pathval: 2.0.0 chalk@2.4.2: dependencies: @@ -6896,9 +6916,7 @@ snapshots: chardet@0.7.0: {} - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 + check-error@2.1.1: {} chokidar@3.6.0: dependencies: @@ -7059,9 +7077,7 @@ snapshots: dedent-js@1.0.1: {} - deep-eql@4.1.4: - dependencies: - type-detect: 4.0.8 + deep-eql@5.0.2: {} deep-is@0.1.4: {} @@ -7221,9 +7237,9 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.6.0): + eslint-compat-utils@0.5.1(eslint@9.7.0): dependencies: - eslint: 9.6.0 + eslint: 9.7.0 semver: 7.6.2 eslint-config-flat-gitignore@0.1.7: @@ -7244,39 +7260,40 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-merge-processors@0.1.0(eslint@9.6.0): + eslint-merge-processors@0.1.0(eslint@9.7.0): dependencies: - eslint: 9.6.0 + eslint: 9.7.0 - eslint-plugin-antfu@2.3.4(eslint@9.6.0): + eslint-plugin-antfu@2.3.4(eslint@9.7.0): dependencies: '@antfu/utils': 0.7.10 - eslint: 9.6.0 + eslint: 9.7.0 - eslint-plugin-command@0.2.3(eslint@9.6.0): + eslint-plugin-command@0.2.3(eslint@9.7.0): dependencies: '@es-joy/jsdoccomment': 0.43.1 - eslint: 9.6.0 + eslint: 9.7.0 - eslint-plugin-es-x@7.8.0(eslint@9.6.0): + eslint-plugin-es-x@7.8.0(eslint@9.7.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) '@eslint-community/regexpp': 4.11.0 - eslint: 9.6.0 - eslint-compat-utils: 0.5.1(eslint@9.6.0) + eslint: 9.7.0 + eslint-compat-utils: 0.5.1(eslint@9.7.0) - eslint-plugin-eslint-comments@3.2.0(eslint@9.6.0): + eslint-plugin-eslint-comments@3.2.0(eslint@9.7.0): dependencies: escape-string-regexp: 1.0.5 - eslint: 9.6.0 + eslint: 9.7.0 ignore: 5.3.1 - eslint-plugin-import-x@0.5.3(eslint@9.6.0)(typescript@5.5.3): + eslint-plugin-import-x@3.0.1(eslint@9.7.0)(typescript@5.5.3): dependencies: - '@typescript-eslint/utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) + '@rtsao/scc': 1.1.0 + '@typescript-eslint/utils': 7.16.0(eslint@9.7.0)(typescript@5.5.3) debug: 4.3.5 doctrine: 3.0.0 - eslint: 9.6.0 + eslint: 9.7.0 eslint-import-resolver-node: 0.3.9 get-tsconfig: 4.7.5 is-glob: 4.0.3 @@ -7288,14 +7305,14 @@ snapshots: - supports-color - typescript - eslint-plugin-jsdoc@48.7.0(eslint@9.6.0): + eslint-plugin-jsdoc@48.7.0(eslint@9.7.0): dependencies: '@es-joy/jsdoccomment': 0.46.0 are-docs-informative: 0.0.2 comment-parser: 1.4.1 debug: 4.3.5 escape-string-regexp: 4.0.0 - eslint: 9.6.0 + eslint: 9.7.0 esquery: 1.6.0 parse-imports: 2.1.1 semver: 7.6.2 @@ -7304,30 +7321,30 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-jsonc@2.16.0(eslint@9.6.0): + eslint-plugin-jsonc@2.16.0(eslint@9.7.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) - eslint: 9.6.0 - eslint-compat-utils: 0.5.1(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) + eslint: 9.7.0 + eslint-compat-utils: 0.5.1(eslint@9.7.0) espree: 9.6.1 graphemer: 1.4.0 jsonc-eslint-parser: 2.4.0 natural-compare: 1.4.0 synckit: 0.6.2 - eslint-plugin-markdown@5.1.0(eslint@9.6.0): + eslint-plugin-markdown@5.1.0(eslint@9.7.0): dependencies: - eslint: 9.6.0 + eslint: 9.7.0 mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color - eslint-plugin-n@17.9.0(eslint@9.6.0): + eslint-plugin-n@17.9.0(eslint@9.7.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) enhanced-resolve: 5.17.0 - eslint: 9.6.0 - eslint-plugin-es-x: 7.8.0(eslint@9.6.0) + eslint: 9.7.0 + eslint-plugin-es-x: 7.8.0(eslint@9.7.0) get-tsconfig: 4.7.5 globals: 15.8.0 ignore: 5.3.1 @@ -7336,36 +7353,36 @@ snapshots: eslint-plugin-no-only-tests@3.1.0: {} - eslint-plugin-perfectionist@2.11.0(eslint@9.6.0)(svelte-eslint-parser@0.34.1)(svelte@5.0.0-next.181)(typescript@5.5.3)(vue-eslint-parser@9.4.3): + eslint-plugin-perfectionist@2.11.0(eslint@9.7.0)(svelte-eslint-parser@0.34.1)(svelte@5.0.0-next.183)(typescript@5.5.3)(vue-eslint-parser@9.4.3): dependencies: - '@typescript-eslint/utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) - eslint: 9.6.0 + '@typescript-eslint/utils': 7.16.0(eslint@9.7.0)(typescript@5.5.3) + eslint: 9.7.0 minimatch: 9.0.5 natural-compare-lite: 1.4.0 - svelte: 5.0.0-next.181 - svelte-eslint-parser: 0.34.1(svelte@5.0.0-next.181) - vue-eslint-parser: 9.4.3(eslint@9.6.0) + svelte: 5.0.0-next.183 + svelte-eslint-parser: 0.34.1(svelte@5.0.0-next.183) + vue-eslint-parser: 9.4.3(eslint@9.7.0) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-regexp@2.6.0(eslint@9.6.0): + eslint-plugin-regexp@2.6.0(eslint@9.7.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) '@eslint-community/regexpp': 4.11.0 comment-parser: 1.4.1 - eslint: 9.6.0 + eslint: 9.7.0 jsdoc-type-pratt-parser: 4.0.0 refa: 0.12.1 regexp-ast-analysis: 0.7.1 scslre: 0.3.0 - eslint-plugin-svelte@2.42.0(eslint@9.6.0)(svelte@5.0.0-next.181): + eslint-plugin-svelte@2.42.0(eslint@9.7.0)(svelte@5.0.0-next.183): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) '@jridgewell/sourcemap-codec': 1.5.0 - eslint: 9.6.0 - eslint-compat-utils: 0.5.1(eslint@9.6.0) + eslint: 9.7.0 + eslint-compat-utils: 0.5.1(eslint@9.7.0) esutils: 2.0.3 known-css-properties: 0.34.0 postcss: 8.4.39 @@ -7373,30 +7390,30 @@ snapshots: postcss-safe-parser: 6.0.0(postcss@8.4.39) postcss-selector-parser: 6.1.1 semver: 7.6.2 - svelte: 5.0.0-next.181 - svelte-eslint-parser: 0.40.0(svelte@5.0.0-next.181) + svelte: 5.0.0-next.183 + svelte-eslint-parser: 0.40.0(svelte@5.0.0-next.183) transitivePeerDependencies: - ts-node - eslint-plugin-toml@0.11.1(eslint@9.6.0): + eslint-plugin-toml@0.11.1(eslint@9.7.0): dependencies: debug: 4.3.5 - eslint: 9.6.0 - eslint-compat-utils: 0.5.1(eslint@9.6.0) + eslint: 9.7.0 + eslint-compat-utils: 0.5.1(eslint@9.7.0) lodash: 4.17.21 toml-eslint-parser: 0.10.0 transitivePeerDependencies: - supports-color - eslint-plugin-unicorn@54.0.0(eslint@9.6.0): + eslint-plugin-unicorn@54.0.0(eslint@9.7.0): dependencies: '@babel/helper-validator-identifier': 7.24.7 - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) '@eslint/eslintrc': 3.1.0 ci-info: 4.0.0 clean-regexp: 1.0.0 core-js-compat: 3.37.1 - eslint: 9.6.0 + eslint: 9.7.0 esquery: 1.6.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 @@ -7410,50 +7427,50 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-unused-imports@4.0.0(@typescript-eslint/eslint-plugin@8.0.0-alpha.40)(eslint@9.6.0): + eslint-plugin-unused-imports@4.0.0(@typescript-eslint/eslint-plugin@8.0.0-alpha.40)(eslint@9.7.0): dependencies: - '@typescript-eslint/eslint-plugin': 8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40)(eslint@9.6.0)(typescript@5.5.3) - eslint: 9.6.0 + '@typescript-eslint/eslint-plugin': 8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40)(eslint@9.7.0)(typescript@5.5.3) + eslint: 9.7.0 eslint-rule-composer: 0.3.0 - eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@8.0.0-alpha.40)(eslint@9.6.0)(typescript@5.5.3): + eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@8.0.0-alpha.40)(eslint@9.7.0)(typescript@5.5.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40)(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) - eslint: 9.6.0 + '@typescript-eslint/eslint-plugin': 8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40)(eslint@9.7.0)(typescript@5.5.3) + '@typescript-eslint/utils': 7.16.0(eslint@9.7.0)(typescript@5.5.3) + eslint: 9.7.0 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-vue@9.27.0(eslint@9.6.0): + eslint-plugin-vue@9.27.0(eslint@9.7.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) - eslint: 9.6.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) + eslint: 9.7.0 globals: 13.24.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.1.1 semver: 7.6.2 - vue-eslint-parser: 9.4.3(eslint@9.6.0) + vue-eslint-parser: 9.4.3(eslint@9.7.0) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color - eslint-plugin-yml@1.14.0(eslint@9.6.0): + eslint-plugin-yml@1.14.0(eslint@9.7.0): dependencies: debug: 4.3.5 - eslint: 9.6.0 - eslint-compat-utils: 0.5.1(eslint@9.6.0) + eslint: 9.7.0 + eslint-compat-utils: 0.5.1(eslint@9.7.0) lodash: 4.17.21 natural-compare: 1.4.0 yaml-eslint-parser: 1.2.3 transitivePeerDependencies: - supports-color - eslint-processor-vue-blocks@0.1.2(@vue/compiler-sfc@3.4.31)(eslint@9.6.0): + eslint-processor-vue-blocks@0.1.2(@vue/compiler-sfc@3.4.31)(eslint@9.7.0): dependencies: '@vue/compiler-sfc': 3.4.31 - eslint: 9.6.0 + eslint: 9.7.0 eslint-rule-composer@0.3.0: {} @@ -7462,7 +7479,7 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-scope@8.0.1: + eslint-scope@8.0.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 @@ -7471,13 +7488,13 @@ snapshots: eslint-visitor-keys@4.0.0: {} - eslint@9.6.0: + eslint@9.7.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) '@eslint-community/regexpp': 4.11.0 '@eslint/config-array': 0.17.0 '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.6.0 + '@eslint/js': 9.7.0 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.3.0 '@nodelib/fs.walk': 1.2.8 @@ -7486,7 +7503,7 @@ snapshots: cross-spawn: 7.0.3 debug: 4.3.5 escape-string-regexp: 4.0.0 - eslint-scope: 8.0.1 + eslint-scope: 8.0.2 eslint-visitor-keys: 4.0.0 espree: 10.1.0 esquery: 1.6.0 @@ -8134,9 +8151,9 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jest-axe@8.0.0: + jest-axe@9.0.0: dependencies: - axe-core: 4.7.2 + axe-core: 4.9.1 chalk: 4.1.2 jest-matcher-utils: 29.2.2 lodash.merge: 4.6.2 @@ -8189,8 +8206,6 @@ snapshots: js-tokens@4.0.0: {} - js-tokens@9.0.0: {} - js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -8322,6 +8337,10 @@ snapshots: dependencies: get-func-name: 2.0.2 + loupe@3.1.1: + dependencies: + get-func-name: 2.0.2 + lower-case@2.0.2: dependencies: tslib: 2.6.3 @@ -8579,7 +8598,7 @@ snapshots: dependencies: '@types/mdast': 4.0.4 - mdsx@0.0.6(svelte@5.0.0-next.181): + mdsx@0.0.6(svelte@5.0.0-next.183): dependencies: esrap: 1.2.2 hast-util-to-html: 9.0.1 @@ -8588,7 +8607,7 @@ snapshots: rehype-stringify: 10.0.0 remark-parse: 11.0.0 remark-rehype: 11.1.0 - svelte: 5.0.0-next.181 + svelte: 5.0.0-next.183 unified: 11.0.5 unist-util-visit: 5.0.0 vfile: 6.0.1 @@ -9094,9 +9113,9 @@ snapshots: pkg-types: 1.1.3 ufo: 1.5.3 - mode-watcher@0.2.2(svelte@5.0.0-next.181): + mode-watcher@0.2.2(svelte@5.0.0-next.183): dependencies: - svelte: 5.0.0-next.181 + svelte: 5.0.0-next.183 mri@1.2.0: {} @@ -9222,10 +9241,6 @@ snapshots: dependencies: yocto-queue: 1.1.1 - p-limit@5.0.0: - dependencies: - yocto-queue: 1.1.1 - p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -9318,7 +9333,7 @@ snapshots: pathe@1.1.2: {} - pathval@1.1.1: {} + pathval@2.0.0: {} periscopic@3.1.0: dependencies: @@ -9326,9 +9341,9 @@ snapshots: estree-walker: 3.0.3 is-reference: 3.0.2 - phosphor-svelte@1.4.2(svelte@5.0.0-next.181): + phosphor-svelte@1.4.2(svelte@5.0.0-next.183): dependencies: - svelte: 5.0.0-next.181 + svelte: 5.0.0-next.183 picocolors@1.0.1: {} @@ -9424,19 +9439,19 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-svelte@3.2.5(prettier@3.3.2)(svelte@5.0.0-next.181): + prettier-plugin-svelte@3.2.5(prettier@3.3.3)(svelte@5.0.0-next.183): dependencies: - prettier: 3.3.2 - svelte: 5.0.0-next.181 + prettier: 3.3.3 + svelte: 5.0.0-next.183 - prettier-plugin-tailwindcss@0.5.13(prettier-plugin-svelte@3.2.5)(prettier@3.3.2): + prettier-plugin-tailwindcss@0.5.13(prettier-plugin-svelte@3.2.5)(prettier@3.3.3): dependencies: - prettier: 3.3.2 - prettier-plugin-svelte: 3.2.5(prettier@3.3.2)(svelte@5.0.0-next.181) + prettier: 3.3.3 + prettier-plugin-svelte: 3.2.5(prettier@3.3.3)(svelte@5.0.0-next.183) prettier@2.8.8: {} - prettier@3.3.2: {} + prettier@3.3.3: {} pretty-format@27.5.1: dependencies: @@ -9719,10 +9734,10 @@ snapshots: dependencies: queue-microtask: 1.2.3 - runed@0.15.0(svelte@5.0.0-next.181): + runed@0.15.0(svelte@5.0.0-next.183): dependencies: esm-env: 1.0.0 - svelte: 5.0.0-next.181 + svelte: 5.0.0-next.183 rxjs@7.8.1: dependencies: @@ -9912,10 +9927,6 @@ snapshots: strip-json-comments@3.1.1: {} - strip-literal@2.1.0: - dependencies: - js-tokens: 9.0.0 - style-object-to-css-string@1.1.3: {} style-to-object@0.4.4: @@ -9950,14 +9961,14 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@3.8.4(postcss-load-config@5.1.0)(postcss@8.4.39)(svelte@5.0.0-next.181): + svelte-check@3.8.4(postcss-load-config@5.1.0)(postcss@8.4.39)(svelte@5.0.0-next.183): dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 3.6.0 picocolors: 1.0.1 sade: 1.8.1 - svelte: 5.0.0-next.181 - svelte-preprocess: 5.1.4(postcss-load-config@5.1.0)(postcss@8.4.39)(svelte@5.0.0-next.181)(typescript@5.5.3) + svelte: 5.0.0-next.183 + svelte-preprocess: 5.1.4(postcss-load-config@5.1.0)(postcss@8.4.39)(svelte@5.0.0-next.183)(typescript@5.5.3) typescript: 5.5.3 transitivePeerDependencies: - '@babel/core' @@ -9970,29 +9981,29 @@ snapshots: - stylus - sugarss - svelte-eslint-parser@0.34.1(svelte@5.0.0-next.181): + svelte-eslint-parser@0.34.1(svelte@5.0.0-next.183): dependencies: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 postcss: 8.4.39 postcss-scss: 4.0.9(postcss@8.4.39) - svelte: 5.0.0-next.181 + svelte: 5.0.0-next.183 - svelte-eslint-parser@0.40.0(svelte@5.0.0-next.181): + svelte-eslint-parser@0.40.0(svelte@5.0.0-next.183): dependencies: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 postcss: 8.4.39 postcss-scss: 4.0.9(postcss@8.4.39) - svelte: 5.0.0-next.181 + svelte: 5.0.0-next.183 - svelte-hmr@0.16.0(svelte@5.0.0-next.181): + svelte-hmr@0.16.0(svelte@5.0.0-next.183): dependencies: - svelte: 5.0.0-next.181 + svelte: 5.0.0-next.183 - svelte-preprocess@5.1.4(postcss-load-config@5.1.0)(postcss@8.4.39)(svelte@5.0.0-next.181)(typescript@5.5.3): + svelte-preprocess@5.1.4(postcss-load-config@5.1.0)(postcss@8.4.39)(svelte@5.0.0-next.183)(typescript@5.5.3): dependencies: '@types/pug': 2.0.10 detect-indent: 6.1.0 @@ -10001,25 +10012,25 @@ snapshots: postcss-load-config: 5.1.0(postcss@8.4.39) sorcery: 0.11.1 strip-indent: 3.0.0 - svelte: 5.0.0-next.181 + svelte: 5.0.0-next.183 typescript: 5.5.3 - svelte-sonner@0.3.25(svelte@5.0.0-next.181): + svelte-sonner@0.3.26(svelte@5.0.0-next.183): dependencies: - svelte: 5.0.0-next.181 + svelte: 5.0.0-next.183 - svelte-toolbelt@0.0.2(svelte@5.0.0-next.181): + svelte-toolbelt@0.0.2(svelte@5.0.0-next.183): dependencies: - svelte: 5.0.0-next.181 + svelte: 5.0.0-next.183 - svelte2tsx@0.7.13(svelte@5.0.0-next.181)(typescript@5.5.3): + svelte2tsx@0.7.13(svelte@5.0.0-next.183)(typescript@5.5.3): dependencies: dedent-js: 1.0.1 pascal-case: 3.1.2 - svelte: 5.0.0-next.181 + svelte: 5.0.0-next.183 typescript: 5.5.3 - svelte@5.0.0-next.181: + svelte@5.0.0-next.183: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 @@ -10109,9 +10120,11 @@ snapshots: tinybench@2.8.0: {} - tinypool@0.8.4: {} + tinypool@1.0.0: {} + + tinyrainbow@1.2.0: {} - tinyspy@2.2.1: {} + tinyspy@3.0.0: {} tmp@0.0.33: dependencies: @@ -10350,12 +10363,12 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - vite-node@1.6.0(@types/node@20.14.10): + vite-node@2.0.2(@types/node@20.14.10): dependencies: cac: 6.7.14 debug: 4.3.5 pathe: 1.1.2 - picocolors: 1.0.1 + tinyrainbow: 1.2.0 vite: 5.3.3(@types/node@20.14.10) transitivePeerDependencies: - '@types/node' @@ -10380,30 +10393,29 @@ snapshots: dependencies: vite: 5.3.3(@types/node@20.14.10) - vitest@1.6.0(@types/node@20.14.10)(@vitest/ui@1.6.0)(jsdom@24.1.0): + vitest@2.0.2(@types/node@20.14.10)(@vitest/ui@1.6.0)(jsdom@24.1.0): dependencies: + '@ampproject/remapping': 2.3.0 '@types/node': 20.14.10 - '@vitest/expect': 1.6.0 - '@vitest/runner': 1.6.0 - '@vitest/snapshot': 1.6.0 - '@vitest/spy': 1.6.0 - '@vitest/ui': 1.6.0(vitest@1.6.0) - '@vitest/utils': 1.6.0 - acorn-walk: 8.3.3 - chai: 4.4.1 + '@vitest/expect': 2.0.2 + '@vitest/pretty-format': 2.0.2 + '@vitest/runner': 2.0.2 + '@vitest/snapshot': 2.0.2 + '@vitest/spy': 2.0.2 + '@vitest/ui': 1.6.0(vitest@2.0.2) + '@vitest/utils': 2.0.2 + chai: 5.1.1 debug: 4.3.5 execa: 8.0.1 jsdom: 24.1.0 - local-pkg: 0.5.0 magic-string: 0.30.10 pathe: 1.1.2 - picocolors: 1.0.1 std-env: 3.7.0 - strip-literal: 2.1.0 tinybench: 2.8.0 - tinypool: 0.8.4 + tinypool: 1.0.0 + tinyrainbow: 1.2.0 vite: 5.3.3(@types/node@20.14.10) - vite-node: 1.6.0(@types/node@20.14.10) + vite-node: 2.0.2(@types/node@20.14.10) why-is-node-running: 2.3.0 transitivePeerDependencies: - less @@ -10414,10 +10426,10 @@ snapshots: - supports-color - terser - vue-eslint-parser@9.4.3(eslint@9.6.0): + vue-eslint-parser@9.4.3(eslint@9.7.0): dependencies: debug: 4.3.5 - eslint: 9.6.0 + eslint: 9.7.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 diff --git a/sites/docs/package.json b/sites/docs/package.json index 828476733..d4e74ad62 100644 --- a/sites/docs/package.json +++ b/sites/docs/package.json @@ -39,7 +39,7 @@ "rehype-slug": "^6.0.0", "remark-gfm": "^4.0.0", "shiki": "^1.1.1", - "svelte": "5.0.0-next.181", + "svelte": "5.0.0-next.183", "svelte-check": "^3.6.9", "svelte-sonner": "^0.3.24", "tailwind-merge": "^2.2.1", From 6e49685eb8e2c0e89a2e959cc14d34ed81c9b3a0 Mon Sep 17 00:00:00 2001 From: Hunter Johnston Date: Sun, 14 Jul 2024 20:48:32 -0400 Subject: [PATCH 02/15] more --- packages/bits-ui/src/lib/bits/label/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bits-ui/src/lib/bits/label/types.ts b/packages/bits-ui/src/lib/bits/label/types.ts index 0a617c890..1e5fbbe02 100644 --- a/packages/bits-ui/src/lib/bits/label/types.ts +++ b/packages/bits-ui/src/lib/bits/label/types.ts @@ -1,7 +1,7 @@ import type { PrimitiveLabelAttributes, WithChild, Without } from "$lib/internal/types.js"; export type LabelRootPropsWithoutHTML = WithChild<{ - for: string; + for?: string; }>; export type LabelRootProps = LabelRootPropsWithoutHTML & From b319c137c31e9b04ee357e61d31f807fafec6052 Mon Sep 17 00:00:00 2001 From: Hunter Johnston Date: Mon, 15 Jul 2024 10:38:58 -0400 Subject: [PATCH 03/15] types --- packages/bits-ui/src/lib/shared/index.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/bits-ui/src/lib/shared/index.ts b/packages/bits-ui/src/lib/shared/index.ts index e3339dc45..5465b75da 100644 --- a/packages/bits-ui/src/lib/shared/index.ts +++ b/packages/bits-ui/src/lib/shared/index.ts @@ -26,7 +26,11 @@ export type SegmentPart = export type FocusTarget = string | HTMLElement | SVGElement | null; export type FocusProp = FocusTarget | ((defaultEl?: HTMLElement | null) => FocusTarget); -export type StyleProperties = CSS.Properties; +export type StyleProperties = CSS.Properties & { + // Allow any CSS Custom Properties + // eslint-disable-next-line ts/no-explicit-any + [str: `--${string}`]: any; +}; export type Orientation = "horizontal" | "vertical"; export type Direction = "ltr" | "rtl"; From 7b9347a384ea023269ba2de0cef44247d3425f3a Mon Sep 17 00:00:00 2001 From: Hunter Johnston Date: Tue, 16 Jul 2024 21:28:35 -0400 Subject: [PATCH 04/15] fixup --- .../src/lib/bits/avatar/avatar.svelte.ts | 2 +- .../bits-ui/src/lib/bits/calendar/types.ts | 313 +++++++++--------- .../components/date-range-field.svelte | 19 ++ .../date-range-field.svelte.ts | 36 +- .../src/lib/bits/date-range-field/types.ts | 14 + .../date-range-picker-calendar.svelte | 2 + .../components/date-range-picker.svelte | 21 ++ .../date-range-picker.svelte.ts | 2 + .../src/lib/bits/date-range-picker/types.ts | 14 + .../bits-ui/src/lib/bits/popover/index.ts | 2 - .../bits-ui/src/lib/bits/radio-group/index.ts | 1 - .../components/range-calendar.svelte | 20 ++ .../range-calendar/range-calendar.svelte.ts | 104 +++--- .../src/lib/bits/range-calendar/types.ts | 14 + .../components/scroll-area-content.svelte | 2 +- .../components/scroll-area-corner.svelte | 2 +- .../components/scroll-area-scrollbar-x.svelte | 2 +- .../components/scroll-area-scrollbar-y.svelte | 2 +- .../components/scroll-area-thumb-x.svelte | 2 +- .../components/scroll-area-thumb-y.svelte | 2 +- .../components/scroll-area-viewport.svelte | 2 +- .../scroll-area/components/scroll-area.svelte | 2 +- .../components/select-content-floating.svelte | 16 +- .../floating-layer/useFloatingLayer.svelte.ts | 1 + packages/bits-ui/src/lib/shared/index.ts | 7 +- sites/docs/package.json | 2 +- 26 files changed, 370 insertions(+), 236 deletions(-) diff --git a/packages/bits-ui/src/lib/bits/avatar/avatar.svelte.ts b/packages/bits-ui/src/lib/bits/avatar/avatar.svelte.ts index 77e6b2193..68fd2ac2f 100644 --- a/packages/bits-ui/src/lib/bits/avatar/avatar.svelte.ts +++ b/packages/bits-ui/src/lib/bits/avatar/avatar.svelte.ts @@ -146,7 +146,7 @@ class AvatarFallbackState { () => ({ style: { - display: this.root.loadingStatus.value === "loaded" ? "none" : "block", + display: this.root.loadingStatus.value === "loaded" ? "none" : undefined, }, [AVATAR_FALLBACK_ATTR]: "", }) as const diff --git a/packages/bits-ui/src/lib/bits/calendar/types.ts b/packages/bits-ui/src/lib/bits/calendar/types.ts index c65c40c97..154deefcc 100644 --- a/packages/bits-ui/src/lib/bits/calendar/types.ts +++ b/packages/bits-ui/src/lib/bits/calendar/types.ts @@ -20,176 +20,173 @@ export type CalendarRootSnippetProps = { weekdays: string[]; }; -type CalendarBaseRootPropsWithoutHTML = WithChild< - { - /** - * The placeholder date, used to control the view of the - * calendar when no value is present. - * - * @defaultValue the current date - */ - placeholder?: DateValue; +type CalendarBaseRootPropsWithoutHTML = { + /** + * The placeholder date, used to control the view of the + * calendar when no value is present. + * + * @defaultValue the current date + */ + placeholder?: DateValue; - /** - * A callback function called when the placeholder value - * changes. - */ - onPlaceholderChange?: OnChangeFn; + /** + * A callback function called when the placeholder value + * changes. + */ + onPlaceholderChange?: OnChangeFn; - /** - * Whether or not users can deselect a date once selected - * without selecting another date. - * - * @defaultValue false - */ - preventDeselect?: boolean; + /** + * Whether or not users can deselect a date once selected + * without selecting another date. + * + * @defaultValue false + */ + preventDeselect?: boolean; - /** - * The minimum date that can be selected in the calendar. - */ - minValue?: DateValue; + /** + * The minimum date that can be selected in the calendar. + */ + minValue?: DateValue; - /** - * The maximum date that can be selected in the calendar. - */ - maxValue?: DateValue; + /** + * The maximum date that can be selected in the calendar. + */ + maxValue?: DateValue; - /** - * Whether or not the calendar is disabled. - * - * @defaultValue false - */ - disabled?: boolean; + /** + * Whether or not the calendar is disabled. + * + * @defaultValue false + */ + disabled?: boolean; - /** - * Applicable only when `numberOfMonths` is greater than 1. - * - * Controls whether to use paged navigation for the next and previous buttons in the - * date picker. With paged navigation set to `true`, clicking the next/prev buttons - * changes all months in view. When set to `false`, it shifts the view by a single month. - * - * For example, with `pagedNavigation` set to `true` and 2 months displayed (January and - * February), clicking the next button changes the view to March and April. If `pagedNavigation` - * is `false`, the view shifts to February and March. - * - * @defaultValue false - */ - pagedNavigation?: boolean; + /** + * Applicable only when `numberOfMonths` is greater than 1. + * + * Controls whether to use paged navigation for the next and previous buttons in the + * date picker. With paged navigation set to `true`, clicking the next/prev buttons + * changes all months in view. When set to `false`, it shifts the view by a single month. + * + * For example, with `pagedNavigation` set to `true` and 2 months displayed (January and + * February), clicking the next button changes the view to March and April. If `pagedNavigation` + * is `false`, the view shifts to February and March. + * + * @defaultValue false + */ + pagedNavigation?: boolean; - /** - * The day of the week to start the calendar on, which must - * be a number between 0 and 6, where 0 is Sunday and 6 is - * Saturday. - * - * @defaultValue 0 (Sunday) - */ - weekStartsOn?: WeekStartsOn; + /** + * The day of the week to start the calendar on, which must + * be a number between 0 and 6, where 0 is Sunday and 6 is + * Saturday. + * + * @defaultValue 0 (Sunday) + */ + weekStartsOn?: WeekStartsOn; - /** - * How the string representation of the weekdays provided via the `weekdays` state store - * should be formatted. - * - * ```md - * - "long": "Sunday", "Monday", "Tuesday", etc. - * - "short": "Sun", "Mon", "Tue", etc. - * - "narrow": "S", "M", "T", etc. - *``` - * - * @defaultValue "narrow" - * - * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat#weekday - */ - weekdayFormat?: Intl.DateTimeFormatOptions["weekday"]; + /** + * How the string representation of the weekdays provided via the `weekdays` state store + * should be formatted. + * + * ```md + * - "long": "Sunday", "Monday", "Tuesday", etc. + * - "short": "Sun", "Mon", "Tue", etc. + * - "narrow": "S", "M", "T", etc. + *``` + * + * @defaultValue "narrow" + * + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat#weekday + */ + weekdayFormat?: Intl.DateTimeFormatOptions["weekday"]; - /** - * A function that receives a date and returns `true` or `false` to indicate whether - * the date is disabled. - * - * @remarks - * Disabled dates cannot be focused or selected. Additionally, they are tagged - * with a data attribute to enable custom styling. - * - * `[data-disabled]` - applied to disabled dates - * - */ - isDateDisabled?: DateMatcher; + /** + * A function that receives a date and returns `true` or `false` to indicate whether + * the date is disabled. + * + * @remarks + * Disabled dates cannot be focused or selected. Additionally, they are tagged + * with a data attribute to enable custom styling. + * + * `[data-disabled]` - applied to disabled dates + * + */ + isDateDisabled?: DateMatcher; - /** - * Dates matching the provided matchers are marked as "unavailable." Unlike disabled dates, - * users can still focus and select unavailable dates. However, selecting an unavailable date - * renders the date picker as invalid. - * - * For example, in a calendar for booking appointments, you might mark already booked dates as - * unavailable. These dates could become available again before the appointment date, allowing - * users to select them to learn more about the appointment. - * - * `[data-unavailable]` - applied to unavailable dates - * - */ - isDateUnavailable?: DateMatcher; + /** + * Dates matching the provided matchers are marked as "unavailable." Unlike disabled dates, + * users can still focus and select unavailable dates. However, selecting an unavailable date + * renders the date picker as invalid. + * + * For example, in a calendar for booking appointments, you might mark already booked dates as + * unavailable. These dates could become available again before the appointment date, allowing + * users to select them to learn more about the appointment. + * + * `[data-unavailable]` - applied to unavailable dates + * + */ + isDateUnavailable?: DateMatcher; - /** - * Display 6 weeks per month, regardless the month's number of weeks. - * This is useful for displaying a consistent calendar, where the size - * of the calendar doesn't change month to month. - * - * To display 6 weeks per month, you will need to render out the previous - * and next month's dates in the calendar as well. - * - * @defaultValue false - */ - fixedWeeks?: boolean; + /** + * Display 6 weeks per month, regardless the month's number of weeks. + * This is useful for displaying a consistent calendar, where the size + * of the calendar doesn't change month to month. + * + * To display 6 weeks per month, you will need to render out the previous + * and next month's dates in the calendar as well. + * + * @defaultValue false + */ + fixedWeeks?: boolean; - /** - * Determines the number of months to display on the calendar simultaneously. - * For navigation between months, refer to the `pagedNavigation` prop. - * - * @defaultValue 1 - */ - numberOfMonths?: number; + /** + * Determines the number of months to display on the calendar simultaneously. + * For navigation between months, refer to the `pagedNavigation` prop. + * + * @defaultValue 1 + */ + numberOfMonths?: number; - /** - * This label is exclusively used for accessibility, remaining hidden from the page. - * It's read by screen readers when the calendar is opened. The current month and year - * are automatically appended to the label, so you only need to provide the base label. - * - * For instance: - * - 'Date of birth' will be read as 'Date of birth, January 2021' if the current month is January 2021. - * - 'Appointment date' will be read as 'Appointment date, January 2021' if the current month is January 2021. - * - 'Booking date' will be read as 'Booking date, January 2021' if the current month is January 2021. - */ - calendarLabel?: string; + /** + * This label is exclusively used for accessibility, remaining hidden from the page. + * It's read by screen readers when the calendar is opened. The current month and year + * are automatically appended to the label, so you only need to provide the base label. + * + * For instance: + * - 'Date of birth' will be read as 'Date of birth, January 2021' if the current month is January 2021. + * - 'Appointment date' will be read as 'Appointment date, January 2021' if the current month is January 2021. + * - 'Booking date' will be read as 'Booking date, January 2021' if the current month is January 2021. + */ + calendarLabel?: string; - /** - * The default locale setting. - * - * @defaultValue 'en' - */ - locale?: string; + /** + * The default locale setting. + * + * @defaultValue 'en' + */ + locale?: string; - /** - * Whether the calendar is readonly. When true, the user will be able - * to focus and navigate the calendar, but will not be able to select - * dates. @see disabled for a similar prop that prevents focusing - * and selecting dates. - * - * @defaultValue false - */ - readonly?: boolean; + /** + * Whether the calendar is readonly. When true, the user will be able + * to focus and navigate the calendar, but will not be able to select + * dates. @see disabled for a similar prop that prevents focusing + * and selecting dates. + * + * @defaultValue false + */ + readonly?: boolean; - /** - * Whether to disable the selection of days outside the current month. By default, - * days outside the current month are rendered to fill the calendar grid, but they - * are not selectable. Setting this prop to `true` will disable this behavior. - * - * @defaultValue false - */ - disableDaysOutsideMonth?: boolean; - }, - CalendarRootSnippetProps ->; + /** + * Whether to disable the selection of days outside the current month. By default, + * days outside the current month are rendered to fill the calendar grid, but they + * are not selectable. Setting this prop to `true` will disable this behavior. + * + * @defaultValue false + */ + disableDaysOutsideMonth?: boolean; +}; -type CalendarSingleRootPropsWithoutHTML = CalendarBaseRootPropsWithoutHTML & { +type CalendarSingleRootPropsWithoutHTML = { /** * The type of calendar. If set to `'single'`, the calendar will * only allow a single date to be selected. If set to `'multiple'`, @@ -208,7 +205,7 @@ type CalendarSingleRootPropsWithoutHTML = CalendarBaseRootPropsWithoutHTML & { onValueChange?: OnChangeFn; }; -type CalendarMultipleRootPropsWithoutHTML = CalendarBaseRootPropsWithoutHTML & { +type CalendarMultipleRootPropsWithoutHTML = { /** * The type of calendar. If set to `'single'`, the calendar will * only allow a single date to be selected. If set to `'multiple'`, @@ -227,9 +224,11 @@ type CalendarMultipleRootPropsWithoutHTML = CalendarBaseRootPropsWithoutHTML & { onValueChange?: OnChangeFn; }; -export type CalendarRootPropsWithoutHTML = - | CalendarSingleRootPropsWithoutHTML - | CalendarMultipleRootPropsWithoutHTML; +export type CalendarRootPropsWithoutHTML = CalendarBaseRootPropsWithoutHTML & + ( + | WithChild + | WithChild + ); export type CalendarRootProps = CalendarRootPropsWithoutHTML & Without; diff --git a/packages/bits-ui/src/lib/bits/date-range-field/components/date-range-field.svelte b/packages/bits-ui/src/lib/bits/date-range-field/components/date-range-field.svelte index e230c482e..95742779b 100644 --- a/packages/bits-ui/src/lib/bits/date-range-field/components/date-range-field.svelte +++ b/packages/bits-ui/src/lib/bits/date-range-field/components/date-range-field.svelte @@ -29,9 +29,14 @@ readonlySegments = [], children, child, + onStartValueChange = noop, + onEndValueChange = noop, ...restProps }: RootProps = $props(); + let startValue = $state(value?.start); + let endValue = $state(value?.end); + if (placeholder === undefined) { placeholder = getDefaultDate({ granularity, @@ -79,6 +84,20 @@ } } ), + startValue: box.with( + () => startValue, + (v) => { + startValue = v; + onStartValueChange(v); + } + ), + endValue: box.with( + () => endValue, + (v) => { + endValue = v; + onEndValueChange(v); + } + ), }); const mergedProps = $derived(mergeProps(restProps, rootState.props)); diff --git a/packages/bits-ui/src/lib/bits/date-range-field/date-range-field.svelte.ts b/packages/bits-ui/src/lib/bits/date-range-field/date-range-field.svelte.ts index 9502f4497..191f3ce32 100644 --- a/packages/bits-ui/src/lib/bits/date-range-field/date-range-field.svelte.ts +++ b/packages/bits-ui/src/lib/bits/date-range-field/date-range-field.svelte.ts @@ -7,7 +7,7 @@ import type { DateRange, SegmentPart } from "$lib/shared/index.js"; import type { DateValue } from "@internationalized/date"; import { onDestroy, untrack } from "svelte"; import { useDateFieldRoot } from "../date-field/date-field.svelte.js"; -import type { WithRefProps } from "$lib/internal/types.js"; +import type { OnChangeFn, WithRefProps } from "$lib/internal/types.js"; import { useRefById } from "$lib/internal/useRefById.svelte.js"; import { createContext } from "$lib/internal/createContext.js"; import { getFirstSegment } from "$lib/shared/date/field.js"; @@ -20,6 +20,8 @@ type DateRangeFieldRootStateProps = WithRefProps< WritableBoxedValues<{ value: DateRange; placeholder: DateValue; + startValue: DateValue | undefined; + endValue: DateValue | undefined; }> & ReadableBoxedValues<{ readonlySegments: SegmentPart[]; @@ -52,35 +54,35 @@ export class DateRangeFieldRootState { locale: DateRangeFieldRootStateProps["locale"]; hideTimeZone: DateRangeFieldRootStateProps["hideTimeZone"]; required: DateRangeFieldRootStateProps["required"]; + startValue: DateRangeFieldRootStateProps["startValue"]; + endValue: DateRangeFieldRootStateProps["endValue"]; descriptionId = useId(); formatter: Formatter; fieldNode = $state(null); labelNode = $state(null); descriptionNode = $state(null); validationNode = $state(null); - startValue = $state(undefined); - endValue = $state(undefined); startValueComplete = $derived.by(() => this.startValue !== undefined); endValueComplete = $derived.by(() => this.endValue !== undefined); rangeComplete = $derived(this.startValueComplete && this.endValueComplete); mergedValues = $derived.by(() => { - if (this.startValue === undefined || this.endValue === undefined) { + if (this.startValue.value === undefined || this.endValue.value === undefined) { return { start: undefined, end: undefined, }; } else { return { - start: this.startValue, - end: this.endValue, + start: this.startValue.value, + end: this.endValue.value, }; } }); constructor(props: DateRangeFieldRootStateProps) { this.value = props.value; - this.startValue = this.value.value.start; - this.endValue = this.value.value.end; + this.startValue = props.startValue; + this.endValue = props.endValue; this.placeholder = props.placeholder; this.isDateUnavailable = props.isDateUnavailable; this.minValue = props.minValue; @@ -135,11 +137,11 @@ export class DateRangeFieldRootState { const value = this.value.value; untrack(() => { - if (value && value.start !== this.startValue) { - this.startValue = value.start; + if (value && value.start !== this.startValue.value) { + this.setStartValue(value.start); } - if (value && value.end !== this.endValue) { - this.endValue = value.end; + if (value && value.end !== this.endValue.value) { + this.setEndValue(value.end); } }); }); @@ -148,7 +150,7 @@ export class DateRangeFieldRootState { $effect(() => { const placeholder = untrack(() => this.placeholder.value); - const startValue = untrack(() => this.startValue); + const startValue = untrack(() => this.startValue.value); if (this.startValueComplete && placeholder !== startValue) { untrack(() => { @@ -164,6 +166,14 @@ export class DateRangeFieldRootState { }); } + setStartValue(value: DateValue | undefined) { + this.startValue.value = value; + } + + setEndValue(value: DateValue | undefined) { + this.endValue.value = value; + } + /** * These props are used to override those of the child fields. * TODO: diff --git a/packages/bits-ui/src/lib/bits/date-range-field/types.ts b/packages/bits-ui/src/lib/bits/date-range-field/types.ts index f5119e8cf..c86728673 100644 --- a/packages/bits-ui/src/lib/bits/date-range-field/types.ts +++ b/packages/bits-ui/src/lib/bits/date-range-field/types.ts @@ -126,6 +126,20 @@ export type DateRangeFieldRootPropsWithoutHTML = WithChild<{ * @defaultValue false; */ hideTimeZone?: boolean; + + /** + * A callback function called when the start value changes. This doesn't necessarily mean + * the `value` has updated and should be used to apply cosmetic changes to the calendar when + * only part of the value is changed/completed. + */ + onStartValueChange?: OnChangeFn; + + /** + * A callback function called when the end value changes. This doesn't necessarily mean + * the `value` has updated and should be used to apply cosmetic changes to the calendar when + * only part of the value is changed/completed. + */ + onEndValueChange?: OnChangeFn; }>; export type DateRangeFieldRootProps = DateRangeFieldRootPropsWithoutHTML & diff --git a/packages/bits-ui/src/lib/bits/date-range-picker/components/date-range-picker-calendar.svelte b/packages/bits-ui/src/lib/bits/date-range-picker/components/date-range-picker-calendar.svelte index 71b9e699d..3d69b30ef 100644 --- a/packages/bits-ui/src/lib/bits/date-range-picker/components/date-range-picker-calendar.svelte +++ b/packages/bits-ui/src/lib/bits/date-range-picker/components/date-range-picker-calendar.svelte @@ -40,6 +40,8 @@ placeholder: dateRangePickerRootState.props.placeholder, value: dateRangePickerRootState.props.value, onRangeSelect: dateRangePickerRootState.props.onRangeSelect, + startValue: dateRangePickerRootState.props.startValue, + endValue: dateRangePickerRootState.props.endValue, }); const mergedProps = $derived(mergeProps(restProps, rangeCalendarState.props)); diff --git a/packages/bits-ui/src/lib/bits/date-range-picker/components/date-range-picker.svelte b/packages/bits-ui/src/lib/bits/date-range-picker/components/date-range-picker.svelte index 444f01023..535cd1ef9 100644 --- a/packages/bits-ui/src/lib/bits/date-range-picker/components/date-range-picker.svelte +++ b/packages/bits-ui/src/lib/bits/date-range-picker/components/date-range-picker.svelte @@ -42,11 +42,16 @@ fixedWeeks = false, numberOfMonths = 1, closeOnRangeSelect = true, + onStartValueChange = noop, + onEndValueChange = noop, child, children, ...restProps }: RootProps = $props(); + let startValue = $state(value?.start); + let endValue = $state(value?.end); + if (value === undefined) { value = { start: undefined, end: undefined }; } @@ -114,6 +119,20 @@ fixedWeeks: box.with(() => fixedWeeks), numberOfMonths: box.with(() => numberOfMonths), onRangeSelect: box.with(() => onRangeSelect), + startValue: box.with( + () => startValue, + (v) => { + startValue = v; + onStartValueChange(v); + } + ), + endValue: box.with( + () => endValue, + (v) => { + endValue = v; + onEndValueChange(v); + } + ), }); usePopoverRoot({ @@ -139,6 +158,8 @@ () => ref, (v) => (ref = v) ), + startValue: pickerRootState.props.startValue, + endValue: pickerRootState.props.endValue, }); const mergedProps = $derived(mergeProps(restProps, fieldRootState.props)); diff --git a/packages/bits-ui/src/lib/bits/date-range-picker/date-range-picker.svelte.ts b/packages/bits-ui/src/lib/bits/date-range-picker/date-range-picker.svelte.ts index d5f61adc3..49437cdc2 100644 --- a/packages/bits-ui/src/lib/bits/date-range-picker/date-range-picker.svelte.ts +++ b/packages/bits-ui/src/lib/bits/date-range-picker/date-range-picker.svelte.ts @@ -6,6 +6,8 @@ import type { DateValue } from "@internationalized/date"; type DateRangePickerRootStateProps = WritableBoxedValues<{ value: DateRange; + startValue: DateValue | undefined; + endValue: DateValue | undefined; open: boolean; placeholder: DateValue; }> & diff --git a/packages/bits-ui/src/lib/bits/date-range-picker/types.ts b/packages/bits-ui/src/lib/bits/date-range-picker/types.ts index e60d97625..dcef60a4f 100644 --- a/packages/bits-ui/src/lib/bits/date-range-picker/types.ts +++ b/packages/bits-ui/src/lib/bits/date-range-picker/types.ts @@ -238,6 +238,20 @@ export type DateRangePickerRootPropsWithoutHTML = WithChild<{ * @defaultValue true */ closeOnRangeSelect?: boolean; + + /** + * A callback function called when the start value changes. This doesn't necessarily mean + * the `value` has updated and should be used to apply cosmetic changes to the calendar when + * only part of the value is changed/completed. + */ + onStartValueChange?: OnChangeFn; + + /** + * A callback function called when the end value changes. This doesn't necessarily mean + * the `value` has updated and should be used to apply cosmetic changes to the calendar when + * only part of the value is changed/completed. + */ + onEndValueChange?: OnChangeFn; }>; export type DateRangePickerRootProps = DateRangePickerRootPropsWithoutHTML & diff --git a/packages/bits-ui/src/lib/bits/popover/index.ts b/packages/bits-ui/src/lib/bits/popover/index.ts index bc11ccdb3..4f5a2f7d6 100644 --- a/packages/bits-ui/src/lib/bits/popover/index.ts +++ b/packages/bits-ui/src/lib/bits/popover/index.ts @@ -11,8 +11,6 @@ export type { PopoverContentProps as ContentProps, PopoverTriggerProps as TriggerProps, PopoverCloseProps as CloseProps, - PopoverTriggerEvents as TriggerEvents, - PopoverCloseEvents as CloseEvents, } from "./types.js"; export type { PortalProps } from "$lib/bits/utilities/portal/types.js"; diff --git a/packages/bits-ui/src/lib/bits/radio-group/index.ts b/packages/bits-ui/src/lib/bits/radio-group/index.ts index 5311f6065..2a5d62ab9 100644 --- a/packages/bits-ui/src/lib/bits/radio-group/index.ts +++ b/packages/bits-ui/src/lib/bits/radio-group/index.ts @@ -1,5 +1,4 @@ export { default as Root } from "./components/radio-group.svelte"; -export { default as Input } from "./components/radio-group-input.svelte"; export { default as Item } from "./components/radio-group-item.svelte"; export type { diff --git a/packages/bits-ui/src/lib/bits/range-calendar/components/range-calendar.svelte b/packages/bits-ui/src/lib/bits/range-calendar/components/range-calendar.svelte index c2482e83c..a823560b8 100644 --- a/packages/bits-ui/src/lib/bits/range-calendar/components/range-calendar.svelte +++ b/packages/bits-ui/src/lib/bits/range-calendar/components/range-calendar.svelte @@ -1,5 +1,6 @@ - + {#snippet content({ props })} - {@const finalProps = mergeProps(props, mergedProps)} + {@const finalProps = mergeProps(props, mergedProps, { + style: contentFloatingState.props.style, + })} {#if child} {@render child?.({ props: finalProps })} {:else} diff --git a/packages/bits-ui/src/lib/bits/utilities/floating-layer/useFloatingLayer.svelte.ts b/packages/bits-ui/src/lib/bits/utilities/floating-layer/useFloatingLayer.svelte.ts index d8d39710f..2b71aafbc 100644 --- a/packages/bits-ui/src/lib/bits/utilities/floating-layer/useFloatingLayer.svelte.ts +++ b/packages/bits-ui/src/lib/bits/utilities/floating-layer/useFloatingLayer.svelte.ts @@ -204,6 +204,7 @@ class FloatingContentState { visibility: "hidden", "pointer-events": "none", }), + ...this.style.value, }, // Floating UI calculates logical alignment based the `dir` attribute dir: this.dir.value, diff --git a/packages/bits-ui/src/lib/shared/index.ts b/packages/bits-ui/src/lib/shared/index.ts index 5465b75da..0c99f5813 100644 --- a/packages/bits-ui/src/lib/shared/index.ts +++ b/packages/bits-ui/src/lib/shared/index.ts @@ -35,10 +35,11 @@ export type StyleProperties = CSS.Properties & { export type Orientation = "horizontal" | "vertical"; export type Direction = "ltr" | "rtl"; -export type WithoutChildrenOrChild = Omit; -export type WithoutChildren = Omit; -export type WithoutChild = Omit; +export type WithoutChildrenOrChild = WithoutChildren>; +export type WithoutChildren = T extends { children?: any } ? Omit : T; +export type WithoutChild = T extends { child?: any } ? Omit : T; export type WithElementRef = T & { ref?: U | null }; export type { EditableSegmentPart } from "./date/field/types.js"; export type { Month } from "./date/types.js"; export type { WithChild, Expand, Without } from "$lib/internal/types.js"; +export { useId } from "$lib/internal/useId.svelte.js"; diff --git a/sites/docs/package.json b/sites/docs/package.json index d4e74ad62..f5ba3a7e5 100644 --- a/sites/docs/package.json +++ b/sites/docs/package.json @@ -7,7 +7,7 @@ "scripts": { "dev": "concurrently \"pnpm:dev:content\" \"pnpm:dev:svelte\"", "dev:content": "contentlayer dev", - "dev:svelte": "vite dev --host", + "dev:svelte": "vite dev", "build": "contentlayer build && vite build", "build:content": "contentlayer build", "build:content-cachebust": "contentlayer build --clearCache", From 4c9015e73369cf0dca0398dd8af4166c3078397f Mon Sep 17 00:00:00 2001 From: Hunter Johnston Date: Tue, 16 Jul 2024 21:41:45 -0400 Subject: [PATCH 05/15] improve select --- .../select/components/select-item-text.svelte | 2 +- .../src/lib/bits/select/select.svelte.ts | 12 ++- .../lib/components/demos/select-demo.svelte | 84 +++++++++---------- 3 files changed, 53 insertions(+), 45 deletions(-) diff --git a/packages/bits-ui/src/lib/bits/select/components/select-item-text.svelte b/packages/bits-ui/src/lib/bits/select/components/select-item-text.svelte index a27d4f7f1..25517d4be 100644 --- a/packages/bits-ui/src/lib/bits/select/components/select-item-text.svelte +++ b/packages/bits-ui/src/lib/bits/select/components/select-item-text.svelte @@ -25,7 +25,7 @@ const mergedProps = $derived(mergeProps(restProps, itemTextState.props)); -{#if itemTextState.item.isSelected && itemTextState.item.root.valueId.value && !itemTextState.item.root.valueNodeHasChildren.value} +{#if itemTextState.item.isSelected && itemTextState.item.root.valueId.value && !itemTextState.item.root.valueNodeHasChildren.value && itemTextState.item.root.valueNode} {@render children?.()} diff --git a/packages/bits-ui/src/lib/bits/select/select.svelte.ts b/packages/bits-ui/src/lib/bits/select/select.svelte.ts index 3ca2220ba..bf3ff7154 100644 --- a/packages/bits-ui/src/lib/bits/select/select.svelte.ts +++ b/packages/bits-ui/src/lib/bits/select/select.svelte.ts @@ -1,4 +1,4 @@ -import { type ReadableBox, box } from "svelte-toolbelt"; +import { type ReadableBox, type WritableBox, box } from "svelte-toolbelt"; import { SvelteMap } from "svelte/reactivity"; import { untrack } from "svelte"; import type { ReadableBoxedValues, WritableBoxedValues } from "$lib/internal/box.svelte.js"; @@ -89,6 +89,7 @@ export class SelectRootState { triggerNode = $state(null); valueId = box(useId()); valueNodeHasChildren = box(false); + valueNode = $state(null); contentNode = $state(null); triggerPointerDownPos = box<{ x: number; y: number } | null>({ x: 0, y: 0 }); contentFragment = $state(null); @@ -306,9 +307,18 @@ class SelectTriggerState { class SelectValueState { root: SelectRootState; showPlaceholder = $derived.by(() => shouldShowPlaceholder(this.root.value.value)); + ref: WritableBox = box(null); constructor(root: SelectRootState) { this.root = root; + + useRefById({ + id: this.root.valueId, + ref: this.ref, + onRefChange: (node) => { + this.root.valueNode = node; + }, + }); } props = $derived.by( diff --git a/sites/docs/src/lib/components/demos/select-demo.svelte b/sites/docs/src/lib/components/demos/select-demo.svelte index 85b375468..589e824e9 100644 --- a/sites/docs/src/lib/components/demos/select-demo.svelte +++ b/sites/docs/src/lib/components/demos/select-demo.svelte @@ -26,48 +26,46 @@ ]; -
- - + + + + + + + - - - - - - up - up - - {#each themes as theme} - - {#snippet children({ selected })} - - {theme.label} - - {#if selected} - - - - {/if} - {/snippet} - - {/each} - - down - - - -
+ + {#each themes as theme} + + {#snippet children({ selected })} + + {theme.label} + + {#if selected} + + + + {/if} + {/snippet} + + {/each} + + down + + + From 96f98715a1a4957e7976c21288f8c8a7251a81eb Mon Sep 17 00:00:00 2001 From: Hunter Johnston Date: Thu, 18 Jul 2024 11:55:58 -0400 Subject: [PATCH 06/15] link prev --- .../components/link-preview-arrow.svelte | 26 -- .../components/link-preview-content.svelte | 203 +++++--------- .../components/link-preview-trigger.svelte | 70 ++--- .../components/link-preview.svelte | 70 ++--- .../bits-ui/src/lib/bits/link-preview/ctx.ts | 64 ----- .../src/lib/bits/link-preview/index.ts | 7 +- .../bits/link-preview/link-preview.svelte.ts | 260 ++++++++++++++++++ .../src/lib/bits/link-preview/types.ts | 128 +++++---- packages/bits-ui/src/lib/internal/is.ts | 8 + packages/bits-ui/src/lib/shared/index.ts | 1 + .../components/demos/link-preview-demo.svelte | 3 - 11 files changed, 476 insertions(+), 364 deletions(-) delete mode 100644 packages/bits-ui/src/lib/bits/link-preview/components/link-preview-arrow.svelte delete mode 100644 packages/bits-ui/src/lib/bits/link-preview/ctx.ts create mode 100644 packages/bits-ui/src/lib/bits/link-preview/link-preview.svelte.ts diff --git a/packages/bits-ui/src/lib/bits/link-preview/components/link-preview-arrow.svelte b/packages/bits-ui/src/lib/bits/link-preview/components/link-preview-arrow.svelte deleted file mode 100644 index 70ee1a478..000000000 --- a/packages/bits-ui/src/lib/bits/link-preview/components/link-preview-arrow.svelte +++ /dev/null @@ -1,26 +0,0 @@ - - -{#if asChild} - -{:else} -
-{/if} diff --git a/packages/bits-ui/src/lib/bits/link-preview/components/link-preview-content.svelte b/packages/bits-ui/src/lib/bits/link-preview/components/link-preview-content.svelte index 373ac62e3..7a8eb1f2e 100644 --- a/packages/bits-ui/src/lib/bits/link-preview/components/link-preview-content.svelte +++ b/packages/bits-ui/src/lib/bits/link-preview/components/link-preview-content.svelte @@ -1,136 +1,79 @@ -{#if asChild && $open} - -{:else if transition && $open} -
- -
-{:else if inTransition && outTransition && $open} -
- -
-{:else if inTransition && $open} -
- -
-{:else if outTransition && $open} -
- -
-{:else if $open} -
- -
-{/if} + { + onInteractOutside?.(e); + if (e.defaultPrevented) return; + contentState.root.handleClose(); + }} + onEscapeKeydown={(e) => { + // TODO: users should be able to cancel this + onEscapeKeydown?.(e); + contentState.root.handleClose(); + }} + onMountAutoFocus={(e) => e.preventDefault()} + onDestroyAutoFocus={(e) => e.preventDefault()} + trapped={false} + loop={false} + preventScroll={false} +> + {#snippet popper({ props })} + {@const mergedProps = mergeProps(restProps, contentState.props, props)} + {#if child} + {@render child?.({ props: mergedProps })} + {:else} +
+ {@render children?.()} +
+ {/if} + {/snippet} +
diff --git a/packages/bits-ui/src/lib/bits/link-preview/components/link-preview-trigger.svelte b/packages/bits-ui/src/lib/bits/link-preview/components/link-preview-trigger.svelte index 24e493ac3..2219d6a15 100644 --- a/packages/bits-ui/src/lib/bits/link-preview/components/link-preview-trigger.svelte +++ b/packages/bits-ui/src/lib/bits/link-preview/components/link-preview-trigger.svelte @@ -1,46 +1,36 @@ -{#if asChild} - -{:else} - - - -{/if} + + {#if child} + {@render child?.({ props: mergedProps })} + {:else} + + {@render children?.()} + + {/if} + diff --git a/packages/bits-ui/src/lib/bits/link-preview/components/link-preview.svelte b/packages/bits-ui/src/lib/bits/link-preview/components/link-preview.svelte index 3340e5447..8a1c86681 100644 --- a/packages/bits-ui/src/lib/bits/link-preview/components/link-preview.svelte +++ b/packages/bits-ui/src/lib/bits/link-preview/components/link-preview.svelte @@ -1,51 +1,33 @@ - + + {@render children?.()} + diff --git a/packages/bits-ui/src/lib/bits/link-preview/ctx.ts b/packages/bits-ui/src/lib/bits/link-preview/ctx.ts deleted file mode 100644 index c2a0ead1f..000000000 --- a/packages/bits-ui/src/lib/bits/link-preview/ctx.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { type CreateLinkPreviewProps, createLinkPreview } from "@melt-ui/svelte"; -import { getContext, setContext } from "svelte"; -import type { Writable } from "svelte/store"; -import { getPositioningUpdater } from "../floating/helpers.js"; -import type { FloatingProps } from "../floating/_types.js"; -import type { FloatingConfig } from "../floating/floating-config.js"; -import { createBitAttrs, getOptionUpdater, removeUndefined } from "$lib/internal/index.js"; - -export function getLinkPreviewData() { - const NAME = "link-preview" as const; - const PARTS = ["arrow", "content", "trigger"]; - - return { - NAME, - PARTS, - }; -} - -type GetReturn = Omit, "updateOption">; - -export function setCtx(props: CreateLinkPreviewProps) { - const { NAME, PARTS } = getLinkPreviewData(); - const getAttrs = createBitAttrs(NAME, PARTS); - - const linkPreview = { - ...createLinkPreview({ - ...removeUndefined(props), - forceVisible: true, - }), - getAttrs, - }; - - setContext(NAME, linkPreview); - return { - ...linkPreview, - updateOption: getOptionUpdater(linkPreview.options), - }; -} - -export function getCtx() { - const { NAME } = getLinkPreviewData(); - return getContext(NAME); -} - -export function setArrow(size = 8) { - const linkPreview = getCtx(); - linkPreview.options.arrowSize.set(size); - return linkPreview; -} - -export function updatePositioning(props: FloatingProps) { - const defaultPlacement = { - side: "bottom", - align: "center", - } satisfies FloatingProps; - - const withDefaults = { ...defaultPlacement, ...props } satisfies FloatingProps; - const { - options: { positioning }, - } = getCtx(); - - const updater = getPositioningUpdater(positioning as Writable); - updater(withDefaults); -} diff --git a/packages/bits-ui/src/lib/bits/link-preview/index.ts b/packages/bits-ui/src/lib/bits/link-preview/index.ts index b354a12a1..ee8a61303 100644 --- a/packages/bits-ui/src/lib/bits/link-preview/index.ts +++ b/packages/bits-ui/src/lib/bits/link-preview/index.ts @@ -1,13 +1,12 @@ +export { default as Arrow } from "$lib/bits/utilities/floating-layer/components/floating-layer-arrow.svelte"; export { default as Root } from "./components/link-preview.svelte"; -export { default as Arrow } from "./components/link-preview-arrow.svelte"; export { default as Content } from "./components/link-preview-content.svelte"; export { default as Trigger } from "./components/link-preview-trigger.svelte"; export type { - LinkPreviewProps as Props, + LinkPreviewRootProps as RootProps, LinkPreviewArrowProps as ArrowProps, LinkPreviewContentProps as ContentProps, - LinkPreviewContentEvents as ContentEvents, LinkPreviewTriggerProps as TriggerProps, - LinkPreviewTriggerEvents as TriggerEvents, + LinkPreviewPortalProps as PortalProps, } from "./types.js"; diff --git a/packages/bits-ui/src/lib/bits/link-preview/link-preview.svelte.ts b/packages/bits-ui/src/lib/bits/link-preview/link-preview.svelte.ts new file mode 100644 index 000000000..ef8ecc9cf --- /dev/null +++ b/packages/bits-ui/src/lib/bits/link-preview/link-preview.svelte.ts @@ -0,0 +1,260 @@ +import { getAriaExpanded, getDataOpenClosed } from "$lib/internal/attrs.js"; +import type { ReadableBoxedValues, WritableBoxedValues } from "$lib/internal/box.svelte.js"; +import { addEventListener } from "$lib/internal/events.js"; +import { isElement, isFocusVisible, isTouch } from "$lib/internal/is.js"; +import { sleep } from "$lib/internal/sleep.js"; +import type { WithRefProps } from "$lib/internal/types.js"; +import { useRefById } from "$lib/internal/useRefById.svelte.js"; +import { onDestroy, untrack } from "svelte"; +import { getTabbableCandidates } from "../utilities/focus-scope/utils.js"; +import { createContext } from "$lib/internal/createContext.js"; +import { useGraceArea } from "$lib/internal/useGraceArea.svelte.js"; +import { box } from "svelte-toolbelt"; + +const CONTENT_ATTR = "data-link-preview-content"; +const TRIGGER_ATTR = "data-link-preview-trigger"; + +type LinkPreviewRootStateProps = WritableBoxedValues<{ + open: boolean; +}> & + ReadableBoxedValues<{ + openDelay: number; + closeDelay: number; + }>; + +class LinkPreviewRootState { + open: LinkPreviewRootStateProps["open"]; + openDelay: LinkPreviewRootStateProps["openDelay"]; + closeDelay: LinkPreviewRootStateProps["closeDelay"]; + hasSelection = $state(false); + isPointerDownOnContent = $state(false); + containsSelection = $state(false); + timeout: number | null = null; + contentNode = $state(null); + triggerNode = $state(null); + isPointerInTransit = box(false); + + constructor(props: LinkPreviewRootStateProps) { + this.open = props.open; + this.openDelay = props.openDelay; + this.closeDelay = props.closeDelay; + + $effect(() => { + if (!this.open.value) { + untrack(() => (this.hasSelection = false)); + return; + } + + const handlePointerUp = () => { + this.containsSelection = false; + this.isPointerDownOnContent = false; + + sleep(1).then(() => { + const isSelection = document.getSelection()?.toString() !== ""; + if (isSelection) { + this.hasSelection = true; + } + }); + }; + + const unsubListener = addEventListener(document, "pointerup", handlePointerUp); + + const contentNode = untrack(() => this.contentNode); + if (!contentNode) return; + const tabCandidates = getTabbableCandidates(contentNode); + + for (const candidate of tabCandidates) { + candidate.setAttribute("tabindex", "-1"); + } + + return () => { + unsubListener(); + this.hasSelection = false; + this.isPointerDownOnContent = false; + }; + }); + } + + clearTimeout = () => { + if (this.timeout) { + window.clearTimeout(this.timeout); + this.timeout = null; + } + }; + + handleOpen = () => { + this.clearTimeout(); + this.timeout = window.setTimeout(() => { + this.open.value = true; + }, this.openDelay.value); + }; + + handleClose = () => { + this.clearTimeout(); + if (!this.isPointerDownOnContent && !this.hasSelection) { + this.timeout = window.setTimeout(() => { + this.open.value = false; + }, this.closeDelay.value); + } + }; + + createTrigger(props: LinkPreviewTriggerStateProps) { + return new LinkPreviewTriggerState(props, this); + } + + createContent(props: LinkPreviewContentStateProps) { + return new LinkPreviewContentState(props, this); + } +} + +type LinkPreviewTriggerStateProps = WithRefProps; + +class LinkPreviewTriggerState { + #id: LinkPreviewTriggerStateProps["id"]; + #ref: LinkPreviewTriggerStateProps["ref"]; + #root: LinkPreviewRootState; + + constructor(props: LinkPreviewTriggerStateProps, root: LinkPreviewRootState) { + this.#id = props.id; + this.#ref = props.ref; + this.#root = root; + + useRefById({ + id: this.#id, + ref: this.#ref, + onRefChange: (node) => { + this.#root.triggerNode = node; + }, + }); + } + + #onpointerenter = (e: PointerEvent) => { + if (isTouch(e)) return; + this.#root.handleOpen(); + }; + + #onpointerleave = (e: PointerEvent) => { + if (isTouch(e)) return; + this.#root.handleClose(); + }; + + #onfocus = (e: FocusEvent & { currentTarget: HTMLElement }) => { + if (!isFocusVisible(e.currentTarget)) return; + this.#root.handleOpen(); + }; + + #onblur = (e: FocusEvent & { currentTarget: HTMLElement }) => { + this.#root.handleClose(); + }; + + props = $derived.by( + () => + ({ + id: this.#id.value, + "aria-haspopup": "dialog", + "aria-expanded": getAriaExpanded(this.#root.open.value), + "data-state": getDataOpenClosed(this.#root.open.value), + "aria-controls": this.#root.contentNode?.id ?? undefined, + role: "button", + [TRIGGER_ATTR]: "", + onpointerleave: this.#onpointerleave, + onpointerenter: this.#onpointerenter, + onfocus: this.#onfocus, + onblur: this.#onblur, + }) as const + ); +} + +type LinkPreviewContentStateProps = WithRefProps; + +class LinkPreviewContentState { + #id: LinkPreviewContentStateProps["id"]; + #ref: LinkPreviewContentStateProps["ref"]; + root: LinkPreviewRootState; + + constructor(props: LinkPreviewContentStateProps, root: LinkPreviewRootState) { + this.#id = props.id; + this.#ref = props.ref; + this.root = root; + + useRefById({ + id: this.#id, + ref: this.#ref, + onRefChange: (node) => { + this.root.contentNode = node; + }, + }); + + $effect(() => { + if (!this.root.open.value) return; + const { isPointerInTransit, onPointerExit } = useGraceArea( + box.with(() => this.root.triggerNode), + box.with(() => this.root.contentNode) + ); + + this.root.isPointerInTransit = isPointerInTransit; + + onPointerExit(() => { + this.root.handleClose(); + }); + }); + + onDestroy(() => { + this.root.clearTimeout(); + }); + } + + #onpointerdown = (e: PointerEvent & { currentTarget: HTMLElement }) => { + const target = e.target; + if (!isElement(target)) return; + + if (e.currentTarget.contains(target)) { + this.root.containsSelection = true; + } + this.root.hasSelection = true; + this.root.isPointerDownOnContent = true; + }; + + #onpointerenter = (e: PointerEvent) => { + if (isTouch(e) || this.root.isPointerInTransit.value) return; + this.root.handleOpen(); + }; + + #onpointerleave = (e: PointerEvent) => { + if (isTouch(e)) return; + this.root.handleClose(); + }; + + #onfocusout = (e: FocusEvent) => { + e.preventDefault(); + }; + + props = $derived.by( + () => + ({ + id: this.#id.value, + tabindex: -1, + "data-state": getDataOpenClosed(this.root.open.value), + [CONTENT_ATTR]: "", + onpointerdown: this.#onpointerdown, + onpointerenter: this.#onpointerenter, + onpointerleave: this.#onpointerleave, + onfocusout: this.#onfocusout, + }) as const + ); +} + +const [setLinkPreviewRootContext, getLinkPreviewRootContext] = + createContext("LinkPreview.Root"); + +export function useLinkPreviewRoot(props: LinkPreviewRootStateProps) { + return setLinkPreviewRootContext(new LinkPreviewRootState(props)); +} + +export function useLinkPreviewTrigger(props: LinkPreviewTriggerStateProps) { + return getLinkPreviewRootContext().createTrigger(props); +} + +export function useLinkPreviewContent(props: LinkPreviewContentStateProps) { + return getLinkPreviewRootContext().createContent(props); +} diff --git a/packages/bits-ui/src/lib/bits/link-preview/types.ts b/packages/bits-ui/src/lib/bits/link-preview/types.ts index 4a1c88603..bf6ff87bc 100644 --- a/packages/bits-ui/src/lib/bits/link-preview/types.ts +++ b/packages/bits-ui/src/lib/bits/link-preview/types.ts @@ -1,62 +1,84 @@ -import type { HTMLAnchorAttributes } from "svelte/elements"; -import type { CreateLinkPreviewProps } from "@melt-ui/svelte"; -import type { CustomEventHandler } from "$lib/index.js"; import type { - DOMElement, - Expand, - HTMLDivAttributes, - OmitFloating, OnChangeFn, - Transition, -} from "$lib/internal/index.js"; -import type { - ArrowProps as LinkPreviewArrowPropsWithoutHTML, - ContentProps as LinkPreviewContentPropsWithoutHTML, -} from "$lib/bits/floating/_types.js"; - -export type LinkPreviewPropsWithoutHTML = Expand< - OmitFloating & { - /** - * The open state of the link preview. - * You can bind this to a boolean value to programmatically control the open state. - * - * @defaultValue false - */ - open?: boolean; - - /** - * A callback function called when the open state changes. - */ - onOpenChange?: OnChangeFn; - } ->; + PrimitiveAnchorAttributes, + PrimitiveDivAttributes, + PrimitiveElementAttributes, + WithChild, + WithChildren, + Without, +} from "$lib/internal/types.js"; +import type { ArrowProps, ArrowPropsWithoutHTML } from "../utilities/arrow/types.js"; +import type { DismissableLayerProps } from "../utilities/dismissable-layer/types.js"; +import type { EscapeLayerProps } from "../utilities/escape-layer/types.js"; +import type { FloatingLayerContentProps } from "../utilities/floating-layer/types.js"; +import type { PortalProps } from "../utilities/portal/types.js"; + +export type LinkPreviewRootPropsWithoutHTML = WithChildren<{ + /** + * The open state of the link preview. + * + * @bindable + */ + open?: boolean; + + /** + * A callback function called when the open state changes. + */ + onOpenChange?: OnChangeFn; -export type LinkPreviewTriggerPropsWithoutHTML = DOMElement; + /** + * The delay in milliseconds to hover before the link preview opens. + * + * @defaultValue 700 + */ + openDelay?: number; -export type { LinkPreviewArrowPropsWithoutHTML, LinkPreviewContentPropsWithoutHTML }; + /** + * The delay in milliseconds to hover before the link preview closes. + * + * @defaultValue 300 + */ + closeDelay?: number; +}>; + +export type LinkPreviewRootProps = LinkPreviewRootPropsWithoutHTML; + +export type LinkPreviewContentPropsWithoutHTML = WithChild< + Pick< + FloatingLayerContentProps, + | "side" + | "sideOffset" + | "align" + | "alignOffset" + | "avoidCollisions" + | "collisionBoundary" + | "collisionPadding" + | "arrowPadding" + | "sticky" + | "hideWhenDetached" + | "dir" + > & + DismissableLayerProps & + EscapeLayerProps & { + /** + * When `true`, the link preview content will be forced to mount in the DOM. + * + * Useful for more control over the transition behavior. + */ + forceMount?: boolean; + } +>; -export type LinkPreviewProps = LinkPreviewPropsWithoutHTML; +export type LinkPreviewContentProps = LinkPreviewContentPropsWithoutHTML & + Without; -export type LinkPreviewTriggerProps = LinkPreviewTriggerPropsWithoutHTML & HTMLAnchorAttributes; +export type LinkPreviewArrowPropsWithoutHTML = ArrowPropsWithoutHTML; +export type LinkPreviewArrowProps = ArrowProps; -export type LinkPreviewContentProps< - T extends Transition = Transition, - In extends Transition = Transition, - Out extends Transition = Transition, -> = LinkPreviewContentPropsWithoutHTML & HTMLDivAttributes; +export type LinkPreviewPortalPropsWithoutHTML = PortalProps; +export type LinkPreviewPortalProps = LinkPreviewPortalPropsWithoutHTML; -export type LinkPreviewArrowProps = LinkPreviewArrowPropsWithoutHTML & HTMLDivAttributes; +export type LinkPreviewTriggerPropsWithoutHTML = WithChild; -export type LinkPreviewTriggerEvents = { - click: CustomEventHandler; - blur: CustomEventHandler; - focus: CustomEventHandler; - pointerenter: CustomEventHandler; - pointerleave: CustomEventHandler; -}; -export type LinkPreviewContentEvents = { - focusout: CustomEventHandler; - pointerenter: CustomEventHandler; - pointerleave: CustomEventHandler; - pointerdown: CustomEventHandler; -}; +export type LinkPreviewTriggerProps = LinkPreviewTriggerPropsWithoutHTML & + Without; diff --git a/packages/bits-ui/src/lib/internal/is.ts b/packages/bits-ui/src/lib/internal/is.ts index 3f9c77f6a..49a137e3e 100644 --- a/packages/bits-ui/src/lib/internal/is.ts +++ b/packages/bits-ui/src/lib/internal/is.ts @@ -37,3 +37,11 @@ export function isNumberString(value: string) { export function isNull(value: unknown): value is null { return value === null; } + +export function isTouch(e: PointerEvent) { + return e.pointerType === "touch"; +} + +export function isFocusVisible(element: Element) { + return element.matches(":focus-visible"); +} diff --git a/packages/bits-ui/src/lib/shared/index.ts b/packages/bits-ui/src/lib/shared/index.ts index 0c99f5813..172124acc 100644 --- a/packages/bits-ui/src/lib/shared/index.ts +++ b/packages/bits-ui/src/lib/shared/index.ts @@ -42,4 +42,5 @@ export type WithElementRef = T & { ref?: export type { EditableSegmentPart } from "./date/field/types.js"; export type { Month } from "./date/types.js"; export type { WithChild, Expand, Without } from "$lib/internal/types.js"; +export { mergeProps } from "$lib/internal/mergeProps.js"; export { useId } from "$lib/internal/useId.svelte.js"; diff --git a/sites/docs/src/lib/components/demos/link-preview-demo.svelte b/sites/docs/src/lib/components/demos/link-preview-demo.svelte index 7afb93895..025ba02f2 100644 --- a/sites/docs/src/lib/components/demos/link-preview-demo.svelte +++ b/sites/docs/src/lib/components/demos/link-preview-demo.svelte @@ -1,7 +1,6 @@ @@ -30,8 +29,6 @@
Date: Thu, 18 Jul 2024 14:09:44 -0400 Subject: [PATCH 07/15] link preview --- .../components/link-preview-content.svelte | 4 +-- .../bits/link-preview/link-preview.svelte.ts | 31 +++++++++--------- .../src/lib/bits/link-preview/types.ts | 23 ++++++++++--- .../src/lib/bits/tooltip/tooltip.svelte.ts | 9 ++---- .../src/lib/internal/useGraceArea.svelte.ts | 32 ++++++++++++------- 5 files changed, 60 insertions(+), 39 deletions(-) diff --git a/packages/bits-ui/src/lib/bits/link-preview/components/link-preview-content.svelte b/packages/bits-ui/src/lib/bits/link-preview/components/link-preview-content.svelte index 7a8eb1f2e..318de3ae7 100644 --- a/packages/bits-ui/src/lib/bits/link-preview/components/link-preview-content.svelte +++ b/packages/bits-ui/src/lib/bits/link-preview/components/link-preview-content.svelte @@ -53,12 +53,12 @@ onInteractOutside={(e) => { onInteractOutside?.(e); if (e.defaultPrevented) return; - contentState.root.handleClose(); + contentState.root.immediateClose(); }} onEscapeKeydown={(e) => { // TODO: users should be able to cancel this onEscapeKeydown?.(e); - contentState.root.handleClose(); + contentState.root.immediateClose(); }} onMountAutoFocus={(e) => e.preventDefault()} onDestroyAutoFocus={(e) => e.preventDefault()} diff --git a/packages/bits-ui/src/lib/bits/link-preview/link-preview.svelte.ts b/packages/bits-ui/src/lib/bits/link-preview/link-preview.svelte.ts index ef8ecc9cf..828c738cb 100644 --- a/packages/bits-ui/src/lib/bits/link-preview/link-preview.svelte.ts +++ b/packages/bits-ui/src/lib/bits/link-preview/link-preview.svelte.ts @@ -51,8 +51,11 @@ class LinkPreviewRootState { sleep(1).then(() => { const isSelection = document.getSelection()?.toString() !== ""; + if (isSelection) { this.hasSelection = true; + } else { + this.hasSelection = false; } }); }; @@ -84,13 +87,20 @@ class LinkPreviewRootState { handleOpen = () => { this.clearTimeout(); + if (this.open.value) return; this.timeout = window.setTimeout(() => { this.open.value = true; }, this.openDelay.value); }; + immediateClose = () => { + this.clearTimeout(); + this.open.value = false; + }; + handleClose = () => { this.clearTimeout(); + if (!this.isPointerDownOnContent && !this.hasSelection) { this.timeout = window.setTimeout(() => { this.open.value = false; @@ -133,17 +143,12 @@ class LinkPreviewTriggerState { this.#root.handleOpen(); }; - #onpointerleave = (e: PointerEvent) => { - if (isTouch(e)) return; - this.#root.handleClose(); - }; - #onfocus = (e: FocusEvent & { currentTarget: HTMLElement }) => { if (!isFocusVisible(e.currentTarget)) return; this.#root.handleOpen(); }; - #onblur = (e: FocusEvent & { currentTarget: HTMLElement }) => { + #onblur = () => { this.#root.handleClose(); }; @@ -157,7 +162,6 @@ class LinkPreviewTriggerState { "aria-controls": this.#root.contentNode?.id ?? undefined, role: "button", [TRIGGER_ATTR]: "", - onpointerleave: this.#onpointerleave, onpointerenter: this.#onpointerenter, onfocus: this.#onfocus, onblur: this.#onblur, @@ -188,13 +192,14 @@ class LinkPreviewContentState { $effect(() => { if (!this.root.open.value) return; const { isPointerInTransit, onPointerExit } = useGraceArea( - box.with(() => this.root.triggerNode), - box.with(() => this.root.contentNode) + () => this.root.triggerNode, + () => this.#ref.value ); this.root.isPointerInTransit = isPointerInTransit; onPointerExit(() => { + console.log("pointer exit"); this.root.handleClose(); }); }); @@ -216,13 +221,8 @@ class LinkPreviewContentState { }; #onpointerenter = (e: PointerEvent) => { - if (isTouch(e) || this.root.isPointerInTransit.value) return; - this.root.handleOpen(); - }; - - #onpointerleave = (e: PointerEvent) => { if (isTouch(e)) return; - this.root.handleClose(); + this.root.handleOpen(); }; #onfocusout = (e: FocusEvent) => { @@ -238,7 +238,6 @@ class LinkPreviewContentState { [CONTENT_ATTR]: "", onpointerdown: this.#onpointerdown, onpointerenter: this.#onpointerenter, - onpointerleave: this.#onpointerleave, onfocusout: this.#onfocusout, }) as const ); diff --git a/packages/bits-ui/src/lib/bits/link-preview/types.ts b/packages/bits-ui/src/lib/bits/link-preview/types.ts index bf6ff87bc..7de66cb97 100644 --- a/packages/bits-ui/src/lib/bits/link-preview/types.ts +++ b/packages/bits-ui/src/lib/bits/link-preview/types.ts @@ -17,28 +17,43 @@ export type LinkPreviewRootPropsWithoutHTML = WithChildren<{ /** * The open state of the link preview. * - * @bindable + * @defaultValue false */ open?: boolean; /** - * A callback function called when the open state changes. + * A callback that will be called when the link preview is opened or closed. */ onOpenChange?: OnChangeFn; /** - * The delay in milliseconds to hover before the link preview opens. + * The delay in milliseconds before the preview opens. * * @defaultValue 700 */ openDelay?: number; /** - * The delay in milliseconds to hover before the link preview closes. + * The delay in milliseconds before the preview closes. * * @defaultValue 300 */ closeDelay?: number; + + /** + * When `true`, the preview will be disabled and will not open. + * + * @defaultValue false + */ + disabled?: boolean; + + /** + * Prevent the preview from opening if the focus did not come using + * the keyboard. + * + * @defaultValue false + */ + ignoreNonKeyboardFocus?: boolean; }>; export type LinkPreviewRootProps = LinkPreviewRootPropsWithoutHTML; diff --git a/packages/bits-ui/src/lib/bits/tooltip/tooltip.svelte.ts b/packages/bits-ui/src/lib/bits/tooltip/tooltip.svelte.ts index bf0470241..4d0a75c3c 100644 --- a/packages/bits-ui/src/lib/bits/tooltip/tooltip.svelte.ts +++ b/packages/bits-ui/src/lib/bits/tooltip/tooltip.svelte.ts @@ -5,7 +5,7 @@ import { watch } from "$lib/internal/box.svelte.js"; import type { ReadableBoxedValues, WritableBoxedValues } from "$lib/internal/box.svelte.js"; import { useTimeoutFn } from "$lib/internal/useTimeoutFn.svelte.js"; import { useRefById } from "$lib/internal/useRefById.svelte.js"; -import { isElement } from "$lib/internal/is.js"; +import { isElement, isFocusVisible } from "$lib/internal/is.js"; import { useGraceArea } from "$lib/internal/useGraceArea.svelte.js"; import { createContext } from "$lib/internal/createContext.js"; import { getDataDisabled } from "$lib/internal/attrs.js"; @@ -244,15 +244,12 @@ class TooltipTriggerState { this.#hasPointerMoveOpened = false; }; - #onfocus = (e: FocusEvent) => { + #onfocus = (e: FocusEvent & { currentTarget: HTMLElement }) => { if (this.#isPointerDown.value || this.#isDisabled) { return; } - if ( - this.#root.ignoreNonKeyboardFocus && - !(e.target as HTMLElement).matches(":focus-visible") - ) { + if (this.#root.ignoreNonKeyboardFocus && !isFocusVisible(e.currentTarget)) { return; } diff --git a/packages/bits-ui/src/lib/internal/useGraceArea.svelte.ts b/packages/bits-ui/src/lib/internal/useGraceArea.svelte.ts index 26ded0bca..7edb25707 100644 --- a/packages/bits-ui/src/lib/internal/useGraceArea.svelte.ts +++ b/packages/bits-ui/src/lib/internal/useGraceArea.svelte.ts @@ -1,4 +1,4 @@ -import type { ReadableBox } from "svelte-toolbelt"; +import type { Getter, ReadableBox } from "svelte-toolbelt"; import { boxAutoReset } from "./boxAutoReset.svelte.js"; import { createEventHook } from "./createEventHook.svelte.js"; import { isElement, isHTMLElement } from "./is.js"; @@ -7,8 +7,8 @@ import { addEventListener } from "./events.js"; import type { Side } from "$lib/bits/utilities/floating-layer/useFloatingLayer.svelte.js"; export function useGraceArea( - triggerNode: ReadableBox, - contentNode: ReadableBox + triggerNode: Getter, + contentNode: Getter ) { const isPointerInTransit = boxAutoReset(false, 300); @@ -21,6 +21,7 @@ export function useGraceArea( } function handleCreateGraceArea(e: PointerEvent, hoverTarget: HTMLElement) { + console.log("creating grace area"); const currentTarget = e.currentTarget; if (!isHTMLElement(currentTarget)) return; const exitPoint = { x: e.clientX, y: e.clientY }; @@ -33,19 +34,27 @@ export function useGraceArea( } $effect(() => { - if (!triggerNode.value || !contentNode.value) return; + const trigger = triggerNode(); + const content = contentNode(); + console.log("trigger", trigger); + console.log("content", content); + if (!trigger || !content) return; + console.log("triggernode", trigger); + console.log("contentnode", content); const handleTriggerLeave = (e: PointerEvent) => { - handleCreateGraceArea(e, contentNode.value!); + handleCreateGraceArea(e, content!); }; const handleContentLeave = (e: PointerEvent) => { - handleCreateGraceArea(e, triggerNode.value!); + handleCreateGraceArea(e, trigger!); }; - return executeCallbacks( - addEventListener(triggerNode.value, "pointerleave", handleTriggerLeave), - addEventListener(contentNode.value, "pointerleave", handleContentLeave) + + const unsub = executeCallbacks( + addEventListener(trigger, "pointerleave", handleTriggerLeave), + addEventListener(content, "pointerleave", handleContentLeave) ); + return unsub; }); $effect(() => { @@ -55,9 +64,10 @@ export function useGraceArea( if (!pointerGraceArea) return; const target = e.target; if (!isElement(target)) return; + const trigger = triggerNode(); + const content = contentNode(); const pointerPosition = { x: e.clientX, y: e.clientY }; - const hasEnteredTarget = - triggerNode.value?.contains(target) || contentNode.value?.contains(target); + const hasEnteredTarget = trigger?.contains(target) || content?.contains(target); const isPointerOutsideGraceArea = !isPointInPolygon(pointerPosition, pointerGraceArea); if (hasEnteredTarget) { From 4068a39bf5de5cea0ee79c570a8bb28e748dacdc Mon Sep 17 00:00:00 2001 From: Hunter Johnston Date: Thu, 18 Jul 2024 14:37:27 -0400 Subject: [PATCH 08/15] link preview test --- .../src/lib/bits/link-preview/index.ts | 1 + .../tests/link-preview/LinkPreview.spec.ts | 62 ++++++++++++------- .../tests/link-preview/LinkPreviewTest.svelte | 27 +++++--- 3 files changed, 58 insertions(+), 32 deletions(-) diff --git a/packages/bits-ui/src/lib/bits/link-preview/index.ts b/packages/bits-ui/src/lib/bits/link-preview/index.ts index ee8a61303..0b1bc4c69 100644 --- a/packages/bits-ui/src/lib/bits/link-preview/index.ts +++ b/packages/bits-ui/src/lib/bits/link-preview/index.ts @@ -2,6 +2,7 @@ export { default as Arrow } from "$lib/bits/utilities/floating-layer/components/ export { default as Root } from "./components/link-preview.svelte"; export { default as Content } from "./components/link-preview-content.svelte"; export { default as Trigger } from "./components/link-preview-trigger.svelte"; +export { default as Portal } from "$lib/bits/utilities/portal/portal.svelte"; export type { LinkPreviewRootProps as RootProps, diff --git a/packages/bits-ui/src/tests/link-preview/LinkPreview.spec.ts b/packages/bits-ui/src/tests/link-preview/LinkPreview.spec.ts index 9795e5e8f..cd941e449 100644 --- a/packages/bits-ui/src/tests/link-preview/LinkPreview.spec.ts +++ b/packages/bits-ui/src/tests/link-preview/LinkPreview.spec.ts @@ -1,21 +1,19 @@ -import { render, waitFor } from "@testing-library/svelte"; -import { userEvent } from "@testing-library/user-event"; +import { fireEvent, render, waitFor } from "@testing-library/svelte"; import { axe } from "jest-axe"; -import { describe, it } from "vitest"; -import { getTestKbd } from "../utils.js"; -import LinkPreviewTest from "./LinkPreviewTest.svelte"; -import type { LinkPreview } from "$lib/index.js"; +import { describe, it, vi } from "vitest"; +import { getTestKbd, setupUserEvents } from "../utils.js"; +import LinkPreviewTest, { type LinkPreviewTestProps } from "./LinkPreviewTest.svelte"; const kbd = getTestKbd(); -function setup(props: LinkPreview.Props = {}) { - const user = userEvent.setup(); +function setup(props: LinkPreviewTestProps = {}) { + const user = setupUserEvents(); const { getByTestId, queryByTestId } = render(LinkPreviewTest, { ...props }); const trigger = getByTestId("trigger"); return { trigger, getByTestId, queryByTestId, user }; } -async function open(props: LinkPreview.Props = {}) { +async function open(props: LinkPreviewTestProps = {}) { const { trigger, getByTestId, queryByTestId, user } = setup(props); expect(queryByTestId("content")).toBeNull(); user.hover(trigger); @@ -46,14 +44,20 @@ describe("link preview", () => { expect(content).toBeVisible(); }); - it("closes on escape keydown", async () => { - const { user, content, queryByTestId } = await open(); + it.skip("closes on escape keydown", async () => { + const mockEsc = vi.fn(); + const { user, content, queryByTestId } = await open({ + contentProps: { + onEscapeKeydown: mockEsc, + }, + }); await user.click(content); await user.keyboard(kbd.ESCAPE); - expect(queryByTestId("content")).toBeNull(); + expect(mockEsc).toHaveBeenCalledTimes(1); + await waitFor(() => expect(queryByTestId("content")).toBeNull()); }); - it("closes when pointer moves outside the trigger and content", async () => { + it.skip("closes when pointer moves outside the trigger and content", async () => { const { user, getByTestId, queryByTestId } = await open(); const outside = getByTestId("outside"); await user.hover(outside); @@ -62,23 +66,31 @@ describe("link preview", () => { it("portals to the body by default", async () => { const { content } = await open(); - expect(content.parentElement).toBe(document.body); + expect(content.parentElement?.parentElement).toBe(document.body); }); it("portals to a custom element if specified", async () => { - const { content, getByTestId } = await open({ portal: "#portal-target" }); + const { content, getByTestId } = await open({ + portalProps: { + to: "#portal-target", + }, + }); const portalTarget = getByTestId("portal-target"); - expect(content.parentElement).toBe(portalTarget); + expect(content.parentElement?.parentElement).toBe(portalTarget); }); - it("does not portal if `null` is passed as portal prop", async () => { - const { content, getByTestId } = await open({ portal: null }); + it("does not portal if `disabled` is passed as portal prop", async () => { + const { content, getByTestId } = await open({ portalProps: { disabled: true } }); const main = getByTestId("main"); - expect(content.parentElement).toBe(main); + expect(content.parentElement?.parentElement).toBe(main); }); it("respects the close on escape prop", async () => { - const { content, user, queryByTestId } = await open({ closeOnEscape: false }); + const { content, user, queryByTestId } = await open({ + contentProps: { + escapeKeydownBehavior: "ignore", + }, + }); await user.click(content); await user.keyboard(kbd.ESCAPE); expect(queryByTestId("content")).not.toBeNull(); @@ -86,7 +98,9 @@ describe("link preview", () => { it("respects the close on outside click prop", async () => { const { content, user, queryByTestId, getByTestId } = await open({ - closeOnOutsideClick: false, + contentProps: { + interactOutsideBehavior: "ignore", + }, }); await user.click(content); const outside = getByTestId("outside"); @@ -95,7 +109,11 @@ describe("link preview", () => { }); it("respects binding the open prop", async () => { - const { queryByTestId, getByTestId, user } = await open({ closeOnOutsideClick: false }); + const { queryByTestId, getByTestId, user } = await open({ + contentProps: { + interactOutsideBehavior: "ignore", + }, + }); const binding = getByTestId("binding"); expect(binding).toHaveTextContent("true"); await user.click(binding); diff --git a/packages/bits-ui/src/tests/link-preview/LinkPreviewTest.svelte b/packages/bits-ui/src/tests/link-preview/LinkPreviewTest.svelte index 6c34ee5d7..d3cdbf7c6 100644 --- a/packages/bits-ui/src/tests/link-preview/LinkPreviewTest.svelte +++ b/packages/bits-ui/src/tests/link-preview/LinkPreviewTest.svelte @@ -1,25 +1,32 @@ - - export let open: $$Props["open"] = false; +
- + @sveltejs - Content + + + Content + + - +
outside
-
+
From 30a78fcb8c5b0da1970a37fa92c61925f9255992 Mon Sep 17 00:00:00 2001 From: Hunter Johnston Date: Thu, 18 Jul 2024 14:37:35 -0400 Subject: [PATCH 09/15] link preview test --- sites/docs/src/lib/components/demo-code-container.svelte | 4 ++-- sites/docs/src/lib/components/demo-code-tabs.svelte | 4 ++-- sites/docs/src/lib/components/demo-container.svelte | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/sites/docs/src/lib/components/demo-code-container.svelte b/sites/docs/src/lib/components/demo-code-container.svelte index 628d13d3a..53213e995 100644 --- a/sites/docs/src/lib/components/demo-code-container.svelte +++ b/sites/docs/src/lib/components/demo-code-container.svelte @@ -1,10 +1,10 @@ Date: Thu, 18 Jul 2024 15:21:52 -0400 Subject: [PATCH 13/15] cleanup pagination test --- .../src/tests/pagination/Pagination.spec.ts | 42 +++++++-------- .../tests/pagination/PaginationTest.svelte | 52 ++++++++++--------- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/packages/bits-ui/src/tests/pagination/Pagination.spec.ts b/packages/bits-ui/src/tests/pagination/Pagination.spec.ts index 551da7901..b1242dbe1 100644 --- a/packages/bits-ui/src/tests/pagination/Pagination.spec.ts +++ b/packages/bits-ui/src/tests/pagination/Pagination.spec.ts @@ -1,13 +1,11 @@ -// NOTE: these tests were shamelessly copied from melt-ui 🥲 import { render } from "@testing-library/svelte"; -import { userEvent } from "@testing-library/user-event"; import { axe } from "jest-axe"; -import PaginationTest from "./PaginationTest.svelte"; -import type { Pagination } from "$lib/index.js"; +import PaginationTest, { type PaginationTestProps } from "./PaginationTest.svelte"; import { isHTMLElement } from "$lib/internal/is.js"; +import { setupUserEvents } from "../utils.js"; -function setup(props: Pagination.Props = { count: 100 }) { - const user = userEvent.setup(); +function setup(props: PaginationTestProps = { count: 100 }) { + const user = setupUserEvents(); const returned = render(PaginationTest, { ...props }); const root = returned.getByTestId("root"); @@ -44,31 +42,31 @@ describe("pagination", () => { }); it("previous and Next button should work accordingly", async () => { - const { root, prev, next } = setup(); + const { root, prev, next, user } = setup(); - await expect(getValue(root)).toBe("1"); - await prev.click(); - await expect(getValue(root)).toBe("1"); - await next.click(); - await expect(getValue(root)).toBe("2"); - await next.click(); - await expect(getValue(root)).toBe("3"); - await prev.click(); - await expect(getValue(root)).toBe("2"); + expect(getValue(root)).toBe("1"); + await user.click(prev); + expect(getValue(root)).toBe("1"); + await user.click(next); + expect(getValue(root)).toBe("2"); + await user.click(next); + expect(getValue(root)).toBe("3"); + await user.click(prev); + expect(getValue(root)).toBe("2"); }); it("should change on clicked button", async () => { - const { getByTestId } = await render(PaginationTest); + const { getByTestId, user } = setup(); const root = getByTestId("root"); const page2 = getPageButton(root, 2); - await expect(getValue(root)).toBe("1"); - await page2.click(); - await expect(getValue(root)).toBe("2"); + expect(getValue(root)).toBe("1"); + await user.click(page2); + expect(getValue(root)).toBe("2"); const page10 = getPageButton(root, 10); - await page10.click(); - await expect(getValue(root)).toBe("10"); + await user.click(page10); + expect(getValue(root)).toBe("10"); }); }); diff --git a/packages/bits-ui/src/tests/pagination/PaginationTest.svelte b/packages/bits-ui/src/tests/pagination/PaginationTest.svelte index 58206f978..552ba0b01 100644 --- a/packages/bits-ui/src/tests/pagination/PaginationTest.svelte +++ b/packages/bits-ui/src/tests/pagination/PaginationTest.svelte @@ -1,31 +1,33 @@ - - export let count: $$Props["count"] = 100; - export let perPage: $$Props["perPage"] = 10; +
- -

Showing items {range.start} - {range.end}

-
- - - - {#each pages as page (page.key)} - {#if page.type === "ellipsis"} - ... - {:else if page.type === "page"} - - {page.value} - - {/if} - {/each} - - →; - -
+ + {#snippet children({ pages, range })} +

Showing items {range.start} - {range.end}

+
+ + + + {#each pages as page (page.key)} + {#if page.type === "ellipsis"} + ... + {:else if page.type === "page"} + + {page.value} + + {/if} + {/each} + + →; + +
+ {/snippet}
From 1aea64d5aff06626620a617a96102ac9a64c730e Mon Sep 17 00:00:00 2001 From: Hunter Johnston Date: Thu, 18 Jul 2024 15:28:46 -0400 Subject: [PATCH 14/15] fix pagination test --- packages/bits-ui/src/lib/bits/pagination/pagination.svelte.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bits-ui/src/lib/bits/pagination/pagination.svelte.ts b/packages/bits-ui/src/lib/bits/pagination/pagination.svelte.ts index bedb48197..b598a8973 100644 --- a/packages/bits-ui/src/lib/bits/pagination/pagination.svelte.ts +++ b/packages/bits-ui/src/lib/bits/pagination/pagination.svelte.ts @@ -153,7 +153,7 @@ class PaginationPage { ({ id: this.#id.value, "aria-label": `Page ${this.page.value}`, - "data-value": `${this.page.value}`, + "data-value": `${this.page.value.value}`, "data-selected": this.page.value.value === this.#root.page.value ? "" : undefined, [PAGE_ATTR]: "", // From 00fc3f24262149ded9840a3b097890a430b6c356 Mon Sep 17 00:00:00 2001 From: Hunter Johnston Date: Thu, 18 Jul 2024 15:39:33 -0400 Subject: [PATCH 15/15] use state is --- .../lib/bits/range-calendar/components/range-calendar.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bits-ui/src/lib/bits/range-calendar/components/range-calendar.svelte b/packages/bits-ui/src/lib/bits/range-calendar/components/range-calendar.svelte index a823560b8..e5d761e58 100644 --- a/packages/bits-ui/src/lib/bits/range-calendar/components/range-calendar.svelte +++ b/packages/bits-ui/src/lib/bits/range-calendar/components/range-calendar.svelte @@ -58,7 +58,7 @@ value: box.with( () => (value === undefined ? { start: undefined, end: undefined } : value), (v) => { - if (v !== value) { + if (!$state.is(v, value)) { value = v; onValueChange(v as any); }