From 24315fb979aea3a9da4a506ec908a2343b494160 Mon Sep 17 00:00:00 2001 From: jer3m01 Date: Sat, 18 Jul 2026 15:04:53 +1000 Subject: [PATCH 01/12] docs: move to solidbase (#678) Co-authored-by: ladybluenotes --- .github/workflows/build.yml | 6 +- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 6 +- .github/workflows/version.yml | 6 +- _tmp_69844_b3ae96dbc903f44e0de0c0f46c789244 | 0 apps/docs/app.config.ts | 191 - apps/docs/package.json | 52 +- apps/docs/postcss.config.cjs | 6 - apps/docs/public/kobalte.svg | 36 + apps/docs/src/app.tsx | 79 +- apps/docs/src/components/callout.tsx | 23 - apps/docs/src/components/footer.tsx | 93 - apps/docs/src/components/header.tsx | 92 - apps/docs/src/components/icons.tsx | 110 - apps/docs/src/components/index.ts | 11 - apps/docs/src/components/kbd.tsx | 16 - apps/docs/src/components/layout.tsx | 81 - .../docs/src/components/mobile-navigation.tsx | 99 - apps/docs/src/components/navigation.tsx | 67 - apps/docs/src/components/preview.tsx | 29 - apps/docs/src/components/prose.tsx | 26 - .../docs/src/components/table-of-contents.tsx | 190 - apps/docs/src/components/tabs-snippets.tsx | 61 - apps/docs/src/components/theme-selector.tsx | 88 - apps/docs/src/entry-server.tsx | 8 +- apps/docs/src/examples/accordion.module.css | 74 +- apps/docs/src/examples/accordion.tsx | 7 +- .../docs/src/examples/alert-dialog.module.css | 14 +- apps/docs/src/examples/alert-dialog.tsx | 4 +- apps/docs/src/examples/alert.module.css | 2 +- apps/docs/src/examples/alert.tsx | 4 +- apps/docs/src/examples/badge.tsx | 4 +- apps/docs/src/examples/breadcrumbs.module.css | 6 +- apps/docs/src/examples/breadcrumbs.tsx | 4 +- apps/docs/src/examples/button.module.css | 6 +- apps/docs/src/examples/button.tsx | 4 +- apps/docs/src/examples/checkbox.module.css | 10 +- apps/docs/src/examples/checkbox.tsx | 40 +- apps/docs/src/examples/collapsible.module.css | 4 +- apps/docs/src/examples/collapsible.tsx | 4 +- apps/docs/src/examples/color-area.tsx | 20 +- .../examples/color-channel-field.module.css | 24 +- .../docs/src/examples/color-channel-field.tsx | 20 +- apps/docs/src/examples/color-field.module.css | 12 +- apps/docs/src/examples/color-field.tsx | 22 +- apps/docs/src/examples/color-slider.tsx | 3 +- apps/docs/src/examples/color-swatch.tsx | 3 +- apps/docs/src/examples/color-wheel.tsx | 20 +- apps/docs/src/examples/combobox.module.css | 18 +- apps/docs/src/examples/combobox.tsx | 73 +- .../docs/src/examples/context-menu.module.css | 20 +- apps/docs/src/examples/context-menu.tsx | 3 +- apps/docs/src/examples/dialog.module.css | 14 +- apps/docs/src/examples/dialog.tsx | 4 +- .../src/examples/dropdown-menu.module.css | 18 +- apps/docs/src/examples/dropdown-menu.tsx | 3 +- apps/docs/src/examples/file-field.tsx | 4 +- apps/docs/src/examples/hover-card.module.css | 8 +- apps/docs/src/examples/hover-card.tsx | 4 +- apps/docs/src/examples/image.module.css | 2 +- apps/docs/src/examples/image.tsx | 6 +- apps/docs/src/examples/link.module.css | 2 +- apps/docs/src/examples/link.tsx | 4 +- apps/docs/src/examples/menubar.module.css | 22 +- apps/docs/src/examples/menubar.tsx | 3 +- apps/docs/src/examples/meter.module.css | 6 +- apps/docs/src/examples/meter.tsx | 4 +- .../src/examples/navigation-menu.module.css | 18 +- apps/docs/src/examples/navigation-menu.tsx | 13 +- .../docs/src/examples/number-field.module.css | 24 +- apps/docs/src/examples/number-field.tsx | 20 +- apps/docs/src/examples/pagination.module.css | 10 +- apps/docs/src/examples/pagination.tsx | 4 +- apps/docs/src/examples/popover.module.css | 17 +- apps/docs/src/examples/popover.tsx | 3 +- apps/docs/src/examples/progress.module.css | 6 +- apps/docs/src/examples/progress.tsx | 4 +- apps/docs/src/examples/radio-group.module.css | 14 +- apps/docs/src/examples/radio-group.tsx | 22 +- apps/docs/src/examples/rating.module.css | 8 +- apps/docs/src/examples/rating.tsx | 22 +- apps/docs/src/examples/search.module.css | 20 +- apps/docs/src/examples/search.tsx | 3 +- .../src/examples/segmented-control.module.css | 2 +- apps/docs/src/examples/segmented-control.tsx | 22 +- apps/docs/src/examples/select.module.css | 16 +- apps/docs/src/examples/select.tsx | 73 +- apps/docs/src/examples/separator.module.css | 2 +- apps/docs/src/examples/separator.tsx | 6 +- apps/docs/src/examples/skeleton.tsx | 5 +- apps/docs/src/examples/slider.module.css | 2 +- apps/docs/src/examples/slider.tsx | 5 +- apps/docs/src/examples/switch.module.css | 12 +- apps/docs/src/examples/switch.tsx | 34 +- apps/docs/src/examples/tabs.module.css | 8 +- apps/docs/src/examples/tabs.tsx | 52 +- apps/docs/src/examples/text-field.module.css | 12 +- apps/docs/src/examples/text-field.tsx | 22 +- apps/docs/src/examples/time-field.module.css | 8 +- apps/docs/src/examples/time-field.tsx | 20 +- apps/docs/src/examples/toast.module.css | 10 +- apps/docs/src/examples/toast.tsx | 8 +- .../src/examples/toggle-button.module.css | 2 +- apps/docs/src/examples/toggle-button.tsx | 21 +- .../docs/src/examples/toggle-group.module.css | 2 +- apps/docs/src/examples/toggle-group.tsx | 9 +- apps/docs/src/examples/tooltip.module.css | 8 +- apps/docs/src/examples/tooltip.tsx | 5 +- apps/docs/src/mdx-components.tsx | 98 - apps/docs/src/model/navigation.ts | 10 - apps/docs/src/root.css | 751 -- .../{[...notFound].mdx => [...404].mdx} | 0 apps/docs/src/routes/docs/changelog.tsx | 19 - apps/docs/src/routes/docs/changelog/0-1-x.mdx | 7 +- .../docs/src/routes/docs/changelog/0-10-x.mdx | 7 +- .../docs/src/routes/docs/changelog/0-11-x.mdx | 7 +- .../docs/src/routes/docs/changelog/0-12-x.mdx | 7 +- .../docs/src/routes/docs/changelog/0-13-x.mdx | 7 +- apps/docs/src/routes/docs/changelog/0-2-x.mdx | 7 +- apps/docs/src/routes/docs/changelog/0-3-x.mdx | 7 +- apps/docs/src/routes/docs/changelog/0-4-x.mdx | 7 +- apps/docs/src/routes/docs/changelog/0-5-x.mdx | 7 +- apps/docs/src/routes/docs/changelog/0-6-x.mdx | 7 +- apps/docs/src/routes/docs/changelog/0-7-x.mdx | 7 +- apps/docs/src/routes/docs/changelog/0-8-x.mdx | 7 +- apps/docs/src/routes/docs/changelog/0-9-x.mdx | 7 +- apps/docs/src/routes/docs/changelog/index.tsx | 3 +- apps/docs/src/routes/docs/core.tsx | 231 - .../(0)introduction.mdx} | 6 +- .../core/(0)overview/(1)getting-started.mdx | 129 + .../(2)styling.mdx} | 163 +- .../(3)animation.mdx} | 6 +- .../(4)polymorphism.mdx} | 28 +- .../routes/docs/core/(0)overview/(5)ssr.mdx | 15 + .../accordion.mdx | 260 +- .../alert-dialog.mdx | 224 +- .../routes/docs/core/(1)components/alert.mdx | 75 + .../{components => (1)components}/badge.mdx | 68 +- .../breadcrumbs.mdx | 133 +- .../routes/docs/core/(1)components/button.mdx | 92 + .../checkbox.mdx | 161 +- .../collapsible.mdx | 145 +- .../color-area.mdx | 167 +- .../color-channel-field.mdx | 224 +- .../color-field.mdx | 177 +- .../docs/core/(1)components/color-slider.mdx | 451 + .../docs/core/(1)components/color-swatch.mdx | 144 + .../color-wheel.mdx | 175 +- .../combobox.mdx | 376 +- .../context-menu.mdx | 303 +- .../{components => (1)components}/dialog.mdx | 228 +- .../dropdown-menu.mdx | 350 +- .../file-field.mdx | 186 +- .../hover-card.mdx | 151 +- .../i18n-provider.mdx | 13 +- .../{components => (1)components}/image.mdx | 105 +- .../{components => (1)components}/link.mdx | 93 +- .../{components => (1)components}/menubar.mdx | 440 +- .../{components => (1)components}/meter.mdx | 124 +- .../navigation-menu.mdx | 1009 +- .../number-field.mdx | 227 +- .../pagination.mdx | 204 +- .../{components => (1)components}/popover.mdx | 205 +- .../progress.mdx | 124 +- .../radio-group.mdx | 224 +- .../{components => (1)components}/rating.mdx | 189 +- .../{components => (1)components}/search.mdx | 476 +- .../segmented-control.mdx | 328 +- .../{components => (1)components}/select.mdx | 374 +- .../separator.mdx | 75 +- .../docs/core/(1)components/skeleton.mdx | 292 + .../routes/docs/core/(1)components/slider.mdx | 712 ++ .../{components => (1)components}/switch.mdx | 173 +- .../{components => (1)components}/tabs.mdx | 253 +- .../text-field.mdx | 200 +- .../time-field.mdx | 258 +- .../{components => (1)components}/toast.mdx | 270 +- .../toggle-button.mdx | 121 +- .../toggle-group.mdx | 157 +- .../{components => (1)components}/tooltip.mdx | 159 +- .../src/routes/docs/core/components/alert.mdx | 81 - .../routes/docs/core/components/button.mdx | 122 - .../docs/core/components/color-slider.mdx | 525 -- .../docs/core/components/color-swatch.mdx | 171 - .../routes/docs/core/components/skeleton.mdx | 363 - .../routes/docs/core/components/slider.mdx | 825 -- .../docs/core/overview/getting-started.mdx | 157 - .../src/routes/docs/core/overview/ssr.mdx | 12 - apps/docs/src/routes/index.tsx | 16 +- .../src/solidbase-theme/Layout.module.css | 24 + apps/docs/src/solidbase-theme/Layout.tsx | 40 + apps/docs/tailwind.config.cjs | 37 - apps/docs/vite.config.ts | 109 + package.json | 26 +- packages/core/package.json | 3 +- packages/core/src/checkbox/checkbox-input.tsx | 12 +- .../color-area-hidden-input-base.tsx | 4 +- .../src/color-field/color-field-context.tsx | 2 +- .../src/color-field/color-field-input.tsx | 2 +- .../core/src/color-field/color-field-root.tsx | 4 +- .../src/color-wheel/color-wheel-input.tsx | 9 +- .../core/src/color-wheel/color-wheel-root.tsx | 2 +- .../list/create-single-select-list-state.ts | 3 + .../number-field-hidden-input.tsx | 6 +- .../core/src/pagination/pagination-item.tsx | 2 +- .../src/pagination/pagination-previous.tsx | 2 +- packages/core/src/slider/slider-input.tsx | 9 +- packages/core/src/tabs/tabs-trigger.tsx | 2 +- .../src/time-field/time-field-segment.tsx | 21 +- packages/core/vite.config.ts | 4 + packages/tests/package.json | 2 +- packages/utils/package.json | 2 +- pnpm-lock.yaml | 8272 +++++++---------- pnpm-workspace.yaml | 11 + tsconfig.json | 4 +- 215 files changed, 9053 insertions(+), 16759 deletions(-) create mode 100644 _tmp_69844_b3ae96dbc903f44e0de0c0f46c789244 delete mode 100644 apps/docs/app.config.ts delete mode 100644 apps/docs/postcss.config.cjs create mode 100644 apps/docs/public/kobalte.svg delete mode 100644 apps/docs/src/components/callout.tsx delete mode 100644 apps/docs/src/components/footer.tsx delete mode 100644 apps/docs/src/components/header.tsx delete mode 100644 apps/docs/src/components/kbd.tsx delete mode 100644 apps/docs/src/components/layout.tsx delete mode 100644 apps/docs/src/components/mobile-navigation.tsx delete mode 100644 apps/docs/src/components/navigation.tsx delete mode 100644 apps/docs/src/components/preview.tsx delete mode 100644 apps/docs/src/components/prose.tsx delete mode 100644 apps/docs/src/components/table-of-contents.tsx delete mode 100644 apps/docs/src/components/tabs-snippets.tsx delete mode 100644 apps/docs/src/components/theme-selector.tsx delete mode 100644 apps/docs/src/mdx-components.tsx delete mode 100644 apps/docs/src/model/navigation.ts delete mode 100644 apps/docs/src/root.css rename apps/docs/src/routes/{[...notFound].mdx => [...404].mdx} (100%) delete mode 100644 apps/docs/src/routes/docs/changelog.tsx delete mode 100644 apps/docs/src/routes/docs/core.tsx rename apps/docs/src/routes/docs/core/{overview/introduction.mdx => (0)overview/(0)introduction.mdx} (95%) create mode 100644 apps/docs/src/routes/docs/core/(0)overview/(1)getting-started.mdx rename apps/docs/src/routes/docs/core/{overview/styling.mdx => (0)overview/(2)styling.mdx} (52%) rename apps/docs/src/routes/docs/core/{overview/animation.mdx => (0)overview/(3)animation.mdx} (95%) rename apps/docs/src/routes/docs/core/{overview/polymorphism.mdx => (0)overview/(4)polymorphism.mdx} (93%) create mode 100644 apps/docs/src/routes/docs/core/(0)overview/(5)ssr.mdx rename apps/docs/src/routes/docs/core/{components => (1)components}/accordion.mdx (59%) rename apps/docs/src/routes/docs/core/{components => (1)components}/alert-dialog.mdx (65%) create mode 100644 apps/docs/src/routes/docs/core/(1)components/alert.mdx rename apps/docs/src/routes/docs/core/{components => (1)components}/badge.mdx (53%) rename apps/docs/src/routes/docs/core/{components => (1)components}/breadcrumbs.mdx (62%) create mode 100644 apps/docs/src/routes/docs/core/(1)components/button.mdx rename apps/docs/src/routes/docs/core/{components => (1)components}/checkbox.mdx (82%) rename apps/docs/src/routes/docs/core/{components => (1)components}/collapsible.mdx (56%) rename apps/docs/src/routes/docs/core/{components => (1)components}/color-area.mdx (80%) rename apps/docs/src/routes/docs/core/{components => (1)components}/color-channel-field.mdx (77%) rename apps/docs/src/routes/docs/core/{components => (1)components}/color-field.mdx (76%) create mode 100644 apps/docs/src/routes/docs/core/(1)components/color-slider.mdx create mode 100644 apps/docs/src/routes/docs/core/(1)components/color-swatch.mdx rename apps/docs/src/routes/docs/core/{components => (1)components}/color-wheel.mdx (76%) rename apps/docs/src/routes/docs/core/{components => (1)components}/combobox.mdx (87%) rename apps/docs/src/routes/docs/core/{components => (1)components}/context-menu.mdx (79%) rename apps/docs/src/routes/docs/core/{components => (1)components}/dialog.mdx (65%) rename apps/docs/src/routes/docs/core/{components => (1)components}/dropdown-menu.mdx (79%) rename apps/docs/src/routes/docs/core/{components => (1)components}/file-field.mdx (69%) rename apps/docs/src/routes/docs/core/{components => (1)components}/hover-card.mdx (78%) rename apps/docs/src/routes/docs/core/{components => (1)components}/i18n-provider.mdx (89%) rename apps/docs/src/routes/docs/core/{components => (1)components}/image.mdx (60%) rename apps/docs/src/routes/docs/core/{components => (1)components}/link.mdx (61%) rename apps/docs/src/routes/docs/core/{components => (1)components}/menubar.mdx (73%) rename apps/docs/src/routes/docs/core/{components => (1)components}/meter.mdx (72%) rename apps/docs/src/routes/docs/core/{components => (1)components}/navigation-menu.mdx (63%) rename apps/docs/src/routes/docs/core/{components => (1)components}/number-field.mdx (80%) rename apps/docs/src/routes/docs/core/{components => (1)components}/pagination.mdx (73%) rename apps/docs/src/routes/docs/core/{components => (1)components}/popover.mdx (80%) rename apps/docs/src/routes/docs/core/{components => (1)components}/progress.mdx (75%) rename apps/docs/src/routes/docs/core/{components => (1)components}/radio-group.mdx (76%) rename apps/docs/src/routes/docs/core/{components => (1)components}/rating.mdx (81%) rename apps/docs/src/routes/docs/core/{components => (1)components}/search.mdx (76%) rename apps/docs/src/routes/docs/core/{components => (1)components}/segmented-control.mdx (65%) rename apps/docs/src/routes/docs/core/{components => (1)components}/select.mdx (87%) rename apps/docs/src/routes/docs/core/{components => (1)components}/separator.mdx (59%) create mode 100644 apps/docs/src/routes/docs/core/(1)components/skeleton.mdx create mode 100644 apps/docs/src/routes/docs/core/(1)components/slider.mdx rename apps/docs/src/routes/docs/core/{components => (1)components}/switch.mdx (78%) rename apps/docs/src/routes/docs/core/{components => (1)components}/tabs.mdx (76%) rename apps/docs/src/routes/docs/core/{components => (1)components}/text-field.mdx (78%) rename apps/docs/src/routes/docs/core/{components => (1)components}/time-field.mdx (81%) rename apps/docs/src/routes/docs/core/{components => (1)components}/toast.mdx (77%) rename apps/docs/src/routes/docs/core/{components => (1)components}/toggle-button.mdx (67%) rename apps/docs/src/routes/docs/core/{components => (1)components}/toggle-group.mdx (70%) rename apps/docs/src/routes/docs/core/{components => (1)components}/tooltip.mdx (81%) delete mode 100644 apps/docs/src/routes/docs/core/components/alert.mdx delete mode 100644 apps/docs/src/routes/docs/core/components/button.mdx delete mode 100644 apps/docs/src/routes/docs/core/components/color-slider.mdx delete mode 100644 apps/docs/src/routes/docs/core/components/color-swatch.mdx delete mode 100644 apps/docs/src/routes/docs/core/components/skeleton.mdx delete mode 100644 apps/docs/src/routes/docs/core/components/slider.mdx delete mode 100644 apps/docs/src/routes/docs/core/overview/getting-started.mdx delete mode 100644 apps/docs/src/routes/docs/core/overview/ssr.mdx create mode 100644 apps/docs/src/solidbase-theme/Layout.module.css create mode 100644 apps/docs/src/solidbase-theme/Layout.tsx delete mode 100644 apps/docs/tailwind.config.cjs create mode 100644 apps/docs/vite.config.ts diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e5ad9cb0..91d5aeb2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -20,10 +20,10 @@ jobs: - uses: pnpm/action-setup@v4 - - name: Setup Node.js 21.6.1 - uses: actions/setup-node@v4 + - name: Setup Node.js + uses: actions/setup-node@v6 with: - node-version: 21.6.1 + node-version: "24" cache: pnpm - name: Install dependencies diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 004b912e..7d864531 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,7 +4,7 @@ on: [workflow_dispatch] permissions: id-token: write - contents: read + contents: write concurrency: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 21dd48e0..6df1b7f5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,10 +20,10 @@ jobs: - uses: pnpm/action-setup@v4 - - name: Setup Node.js 21.6.1 - uses: actions/setup-node@v4 + - name: Setup Node.js + uses: actions/setup-node@v6 with: - node-version: 21.6.1 + node-version: "24" cache: pnpm - name: Install dependencies diff --git a/.github/workflows/version.yml b/.github/workflows/version.yml index b4878ca3..db71b8ed 100644 --- a/.github/workflows/version.yml +++ b/.github/workflows/version.yml @@ -16,10 +16,10 @@ jobs: - uses: pnpm/action-setup@v4 - - name: Setup Node.js 21.6.1 - uses: actions/setup-node@v4 + - name: Setup Node.js + uses: actions/setup-node@v6 with: - node-version: 21.6.1 + node-version: "24" cache: pnpm - name: Install Dependencies diff --git a/_tmp_69844_b3ae96dbc903f44e0de0c0f46c789244 b/_tmp_69844_b3ae96dbc903f44e0de0c0f46c789244 new file mode 100644 index 00000000..e69de29b diff --git a/apps/docs/app.config.ts b/apps/docs/app.config.ts deleted file mode 100644 index c586bf91..00000000 --- a/apps/docs/app.config.ts +++ /dev/null @@ -1,191 +0,0 @@ -import { nodeTypes } from "@mdx-js/mdx"; -import { defineConfig } from "@solidjs/start/config"; -// @ts-ignore missing types -import pkg from "@vinxi/plugin-mdx"; -import { type Options as AcornOptions, parse } from "acorn"; -// @ts-ignore -import Slugger from "github-slugger"; -import rehypePrettyCode from "rehype-pretty-code"; -import rehypeRaw from "rehype-raw"; -import rehypeSlug from "rehype-slug"; -import remarkGfm from "remark-gfm"; -import remarkShikiTwoslash from "remark-shiki-twoslash"; -import { visit } from "unist-util-visit"; - -const { default: vinxiMdx } = pkg; - -function jsToTreeNode(jsString: string, acornOpts?: AcornOptions) { - return { - type: "mdxjsEsm", - value: "", - data: { - estree: { - body: [], - ...parse( - jsString, - acornOpts ?? { - sourceType: "module", - ecmaVersion: 2020, - }, - ), - type: "Program", - sourceType: "module", - }, - }, - }; -} - -const headingsCache = new Map(); - -function rehypeCollectHeadings() { - const slugger = new Slugger(); - return (tree: any, file: any) => { - const headings: any[] = []; - visit(tree, (node) => { - if (node.type !== "element") { - return; - } - - const { tagName } = node; - - if (tagName[0] !== "h") { - return; - } - - const [_, level] = tagName.match(/h([0-6])/) ?? []; - - if (!level) { - return; - } - - const depth = Number.parseInt(level); - - let text = ""; - - visit(node, (child, __, parent) => { - if (child.type === "element" || parent == null) { - return; - } - - if (child.type === "raw" && child.value.match(/^\n?<.*>\n?$/)) { - return; - } - - if (new Set(["text", "raw", "mdxTextExpression"]).has(child.type)) { - text += child.value; - } - }); - - node.properties = node.properties || {}; - - if (typeof node.properties.id !== "string") { - let slug = slugger.slug(text); - - if (slug.endsWith("-")) { - slug = slug.slice(0, -1); - } - - node.properties.id = slug; - } - - headings.push({ depth, slug: node.properties.id, text }); - }); - - headingsCache.set(file.path, headings); - - tree.children.unshift( - // @ts-ignore - jsToTreeNode( - `export function getHeadings() { return ${JSON.stringify(headings)} }`, - ), - ); - }; -} - -export default defineConfig({ - server: { - preset: - process.env.GITHUB_ACTIONS || process.env.DEVELOPMENT - ? "node-server" - : "netlify", - experimental: { - asyncContext: true, - }, - prerender: { - routes: ["/docs/core/overview/introduction"], - crawlLinks: true, - }, - }, - - extensions: ["mdx", "md"], - // @ts-ignore: type should be optional, bugged in @solidjs/start@0.6.1 - solid: { - extensions: ["mdx", "md"], - }, - vite() { - return { - plugins: [ - vinxiMdx.withImports({})({ - jsx: true, - jsxImportSource: "solid-js", - providerImportSource: "solid-mdx", - rehypePlugins: [ - rehypePrettyCode, - rehypeSlug, - [rehypeRaw, { passThrough: nodeTypes }], - // rehypeCollectHeadings, - ], - remarkPlugins: [ - remarkGfm, - [ - // @ts-ignore - remarkShikiTwoslash.default, - { - disableImplicitReactImport: true, - includeJSDocInHover: true, - themes: ["github-light", "github-dark"], - defaultOptions: { - lib: ["dom", "es2015"], - }, - defaultCompilerOptions: { - allowSyntheticDefaultImports: true, - esModuleInterop: true, - target: "ESNext", - module: "ESNext", - lib: ["dom", "es2015"], - jsxImportSource: "solid-js", - jsx: "preserve", - types: ["vite/client"], - paths: { - "~/*": ["./src/*"], - }, - }, - }, - ], - ], - }), - // { - // name: "mdx-meta", - // async transform(code: any, id: any) { - // if (id.endsWith(".mdx?meta") || id.endsWith(".md?meta")) { - // const replacedId = id.replace(/\?meta$/, ""); - // - // if (headingsCache.has(replacedId)) { - // return { - // code: ` - // export function getHeadings() { - // return ${JSON.stringify(headingsCache.get(id), null, 2)} - // } - // `, - // }; - // } - // } - // }, - // }, - ], - ssr: { - noExternal: ["@tanstack/solid-virtual"], - }, - }; - }, -}); diff --git a/apps/docs/package.json b/apps/docs/package.json index bad749e2..6965cfc0 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -22,53 +22,33 @@ "url": "git+https://github.com/kobaltedev/kobalte.git" }, "license": "MIT", - "author": "Fabien Marie-Louise ", + "author": "jer3m01 ", + "contributors": [ + "Fabien Marie-Louise " + ], "type": "module", "scripts": { - "build": "NODE_OPTIONS=\"--max-old-space-size=8192\" vinxi build", - "build:dev": "NODE_OPTIONS=\"--max-old-space-size=8192\" DEVELOPMENT=1 vinxi build", + "build": "vite build", + "build:dev": "DEVELOPMENT=1 vite build", "clean": "rm -rf .solid && rm -rf netlify && rm -rf .turbo && rm -rf node_modules && rm -rf dist", - "dev": "vinxi dev --host", - "start": "vinxi start" + "dev": "vite dev" }, "dependencies": { - "@docsearch/css": "3.5.2", - "@docsearch/js": "3.5.2", - "@internationalized/date": "3.4.0", "@kobalte/core": "workspace:*", - "@solidjs/meta": "0.29.3", - "@solidjs/router": "0.12.4", - "@solidjs/start": "0.6.1", + "@kobalte/solidbase": "0.6.10", + "@solidjs/meta": "0.29.4", + "@solidjs/router": "0.16.2", + "@solidjs/start": "2.0.0-beta.0", "@tanstack/solid-virtual": "3.0.0-beta.6", - "clsx": "2.0.0", "minisearch": "7.1.0", - "solid-js": "1.8.15", - "undici": "5.23.0", - "vinxi": "0.3.9" + "nitro": "3.0.260610-beta", + "solid-js": "1.9.8", + "vite": "8.1.3" }, "devDependencies": { - "@kobalte/tailwindcss": "0.9.0", - "@mdx-js/mdx": "3.0.0", - "@mdx-js/rollup": "3.0.0", - "@tailwindcss/typography": "0.5.9", - "@vinxi/plugin-mdx": "3.7.1", - "acorn": "8.10.0", - "autoprefixer": "10.4.15", - "github-slugger": "2.0.0", - "postcss": "8.4.28", - "rehype-pretty-code": "0.12.3", - "rehype-raw": "7.0.0", - "rehype-slug": "6.0.0", - "remark-gfm": "4.0.0", - "remark-shiki-twoslash": "3.1.3", - "shiki": "0.14.7", - "solid-mdx": "0.0.7", - "tailwindcss": "3.3.3", - "typescript": "4.9.5", - "unist-util-visit": "5.0.0", - "vite": "5.1.4" + "@iconify-json/ri": "^1.2.10" }, "engines": { - "node": ">=18" + "node": ">=22" } } diff --git a/apps/docs/postcss.config.cjs b/apps/docs/postcss.config.cjs deleted file mode 100644 index e873f1a4..00000000 --- a/apps/docs/postcss.config.cjs +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -}; diff --git a/apps/docs/public/kobalte.svg b/apps/docs/public/kobalte.svg new file mode 100644 index 00000000..8582cc45 --- /dev/null +++ b/apps/docs/public/kobalte.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/docs/src/app.tsx b/apps/docs/src/app.tsx index eea0db26..07638d07 100644 --- a/apps/docs/src/app.tsx +++ b/apps/docs/src/app.tsx @@ -1,77 +1,28 @@ -// @refresh reload -import "@docsearch/css"; -import "./root.css"; - -import { MetaProvider, Title } from "@solidjs/meta"; import { Router } from "@solidjs/router"; -import { FileRoutes } from "@solidjs/start"; +import { FileRoutes } from "@solidjs/start/router"; import { Suspense } from "solid-js"; -import { Portal, isServer } from "solid-js/web"; -import { MDXProvider } from "solid-mdx"; +import { Portal } from "solid-js/web"; -import { - ColorModeProvider, - ColorModeScript, - cookieStorageManagerSSR, -} from "@kobalte/core/color-mode"; import { Toast } from "@kobalte/core/toast"; -import { getCookie } from "vinxi/server"; +import { SolidBaseRoot } from "@kobalte/solidbase/client"; import toastStyles from "./examples/toast.module.css"; -import { mdxComponents } from "./mdx-components"; - -//export const mods = /*#__PURE__*/ import.meta.glob< -// true, -// string, -// { -// getHeadings: () => { -// depth: number; -// text: string; -// slug: string; -// }[]; -// } -//>("./routes/docs/**/*.{md,mdx}", { -// eager: true, -// query: { -// meta: "", -// }, -//}); - -function getServerCookies() { - "use server"; - - const colorMode = getCookie("kb-color-mode"); - - return colorMode ? `kb-color-mode=${colorMode}` : ""; -} export default function App() { - const storageManager = cookieStorageManagerSSR( - isServer ? getServerCookies() : document.cookie, - ); - return ( ( - - Kobalte - - - - {props.children} - - - - - - - - - - - - + + {props.children} + + + + + + + + + + )} > diff --git a/apps/docs/src/components/callout.tsx b/apps/docs/src/components/callout.tsx deleted file mode 100644 index 9a732fad..00000000 --- a/apps/docs/src/components/callout.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { clsx } from "clsx"; -import { type ComponentProps, splitProps } from "solid-js"; - -interface CalloutProps extends ComponentProps<"div"> { - type: "note" | "warning"; -} - -export function Callout(props: CalloutProps) { - const [local, others] = splitProps(props, ["type", "class"]); - - return ( -
- ); -} diff --git a/apps/docs/src/components/footer.tsx b/apps/docs/src/components/footer.tsx deleted file mode 100644 index 68a71965..00000000 --- a/apps/docs/src/components/footer.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import { - DiscordIcon, - GitHubIcon, - OpenCollectiveIcon, - TwitterIcon, -} from "./icons"; - -export function Footer() { - return ( - - ); -} diff --git a/apps/docs/src/components/header.tsx b/apps/docs/src/components/header.tsx deleted file mode 100644 index 9b9e7a2e..00000000 --- a/apps/docs/src/components/header.tsx +++ /dev/null @@ -1,92 +0,0 @@ -import docsearch from "@docsearch/js"; -import { useMatch } from "@solidjs/router"; -import { clsx } from "clsx"; -import { onMount } from "solid-js"; - -import { - LATEST_CORE_CHANGELOG_URL, - LATEST_CORE_VERSION_NAME, -} from "../VERSIONS"; -import type { NavSection } from "../model/navigation"; -import { GitHubIcon } from "./icons"; -import { MobileNavigation } from "./mobile-navigation"; -import { ThemeSelector } from "./theme-selector"; - -interface HeaderProps { - navSections: NavSection[]; -} - -export function Header(props: HeaderProps) { - const isChangelogPath = useMatch(() => "/docs/changelog/*"); - - onMount(() => { - docsearch({ - appId: "H7ZQSI0SAN", - apiKey: "c9354456dd4bb74c37e4d2b762b89b88", - indexName: "kobalte", - container: "#docsearch", - }); - }); - - return ( -
-
- -
-
- - Kobalte - . - - - {LATEST_CORE_VERSION_NAME} - -
- -
- ); -} diff --git a/apps/docs/src/components/icons.tsx b/apps/docs/src/components/icons.tsx index 73ad954a..b7d71b9b 100644 --- a/apps/docs/src/components/icons.tsx +++ b/apps/docs/src/components/icons.tsx @@ -1,115 +1,5 @@ import type { ComponentProps } from "solid-js"; -export function GitHubIcon(props: ComponentProps<"svg">) { - return ( - - GitHub - - - ); -} - -export function DiscordIcon(props: ComponentProps<"svg">) { - return ( - - Discord - - - ); -} - -export function OpenCollectiveIcon(props: ComponentProps<"svg">) { - return ( - - OpenCollective - - - ); -} - -export function TwitterIcon(props: ComponentProps<"svg">) { - return ( - - Twitter - - - ); -} - -export function SunIcon(props: ComponentProps<"svg">) { - return ( - - Sun - - - ); -} - -export function MoonIcon(props: ComponentProps<"svg">) { - return ( - - Moon - - - ); -} - -export function DesktopIcon(props: ComponentProps<"svg">) { - return ( - - Desktop - - - ); -} - -export function CopyIcon(props: ComponentProps<"svg">) { - return ( - - Copy - - - ); -} - export function CheckIcon(props: ComponentProps<"svg">) { return ( diff --git a/apps/docs/src/components/index.ts b/apps/docs/src/components/index.ts index c2b7d5b3..6ef8d54d 100644 --- a/apps/docs/src/components/index.ts +++ b/apps/docs/src/components/index.ts @@ -1,12 +1 @@ -export * from "./callout"; -export * from "./footer"; -export * from "./header"; export * from "./icons"; -export * from "./kbd"; -export * from "./layout"; -export * from "./navigation"; -export * from "./preview"; -export * from "./prose"; -export * from "./table-of-contents"; -export * from "./tabs-snippets"; -export * from "./theme-selector"; diff --git a/apps/docs/src/components/kbd.tsx b/apps/docs/src/components/kbd.tsx deleted file mode 100644 index bf1cfcc7..00000000 --- a/apps/docs/src/components/kbd.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { clsx } from "clsx"; -import { type ComponentProps, splitProps } from "solid-js"; - -export function Kbd(props: ComponentProps<"kbd">) { - const [local, others] = splitProps(props, ["class"]); - - return ( - - ); -} diff --git a/apps/docs/src/components/layout.tsx b/apps/docs/src/components/layout.tsx deleted file mode 100644 index cc52a66a..00000000 --- a/apps/docs/src/components/layout.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import { useLocation } from "@solidjs/router"; -import { type ParentProps, Show } from "solid-js"; - -import type { NavSection } from "../model/navigation"; -import { Footer } from "./footer"; -import { Header } from "./header"; -import { Navigation } from "./navigation"; -import { Prose } from "./prose"; -import { TableOfContents } from "./table-of-contents"; - -interface LayoutProps extends ParentProps { - navSections: NavSection[]; -} - -export function Layout(props: LayoutProps) { - const location = useLocation(); - - const allLinks = () => props.navSections.flatMap((section) => section.links); - const linkIndex = () => - allLinks().findIndex((link) => link.href === location.pathname); - const previousPage = () => allLinks()[linkIndex() - 1]; - const nextPage = () => allLinks()[linkIndex() + 1]; - - return ( - <> -
-
- -
-
- {props.children} -
-
- -
-
- Previous -
-
- - - {previousPage().title} - -
-
-
- -
-
- Next -
-
- - {nextPage().title} - - -
-
-
-
-
-
- -
- - ); -} diff --git a/apps/docs/src/components/mobile-navigation.tsx b/apps/docs/src/components/mobile-navigation.tsx deleted file mode 100644 index 2a67d43c..00000000 --- a/apps/docs/src/components/mobile-navigation.tsx +++ /dev/null @@ -1,99 +0,0 @@ -import { Dialog } from "@kobalte/core/dialog"; -import { createDisclosureState } from "@kobalte/core/primitives/create-disclosure-state"; -import { Separator } from "@kobalte/core/separator"; -import { useIsRouting, useMatch } from "@solidjs/router"; -import { clsx } from "clsx"; -import { type ComponentProps, createComputed, splitProps } from "solid-js"; - -import { - LATEST_CORE_CHANGELOG_URL, - LATEST_CORE_VERSION_NAME, -} from "../VERSIONS"; -import type { NavSection } from "../model/navigation"; -import { CrossIcon, HamburgerMenuIcon } from "./icons"; -import { Navigation } from "./navigation"; - -interface MobileNavigationProps extends ComponentProps<"button"> { - sections: NavSection[]; -} - -export function MobileNavigation(props: MobileNavigationProps) { - const [local] = splitProps(props, ["sections", "class"]); - - const { isOpen, setIsOpen, open, close } = createDisclosureState(); - - const isRouting = useIsRouting(); - - createComputed(() => isRouting() && close()); - - const isChangelogPath = useMatch(() => "/docs/changelog/*"); - - return ( - <> - - - - - - -
-
- - Kobalte - . - - - {LATEST_CORE_VERSION_NAME} - -
- -
- - - -
-
-
- - ); -} diff --git a/apps/docs/src/components/navigation.tsx b/apps/docs/src/components/navigation.tsx deleted file mode 100644 index 48d254b3..00000000 --- a/apps/docs/src/components/navigation.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { useLocation } from "@solidjs/router"; -import { clsx } from "clsx"; -import { type ComponentProps, For, Match, Switch, splitProps } from "solid-js"; - -import type { NavSection } from "../model/navigation"; - -interface NavigationProps extends ComponentProps<"nav"> { - sections: NavSection[]; -} - -export function Navigation(props: NavigationProps) { - const [local, others] = splitProps(props, ["sections", "class"]); - - const location = useLocation(); - - return ( - - ); -} diff --git a/apps/docs/src/components/preview.tsx b/apps/docs/src/components/preview.tsx deleted file mode 100644 index f552501d..00000000 --- a/apps/docs/src/components/preview.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { clsx } from "clsx"; -import { type ComponentProps, mergeProps, splitProps } from "solid-js"; - -interface PreviewProps extends ComponentProps<"div"> { - isCentered?: boolean; - isRounded?: boolean; -} - -export function Preview(props: PreviewProps) { - const mergedProps = mergeProps({ isCentered: true }, props); - - const [local, others] = splitProps(mergedProps, [ - "class", - "isCentered", - "isRounded", - ]); - - return ( -
- ); -} diff --git a/apps/docs/src/components/prose.tsx b/apps/docs/src/components/prose.tsx deleted file mode 100644 index 8bbdd2c0..00000000 --- a/apps/docs/src/components/prose.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { clsx } from "clsx"; -import { type ComponentProps, splitProps } from "solid-js"; - -export function Prose(props: ComponentProps<"div">) { - const [local, others] = splitProps(props, ["class"]); - - return ( -
- ); -} diff --git a/apps/docs/src/components/table-of-contents.tsx b/apps/docs/src/components/table-of-contents.tsx deleted file mode 100644 index 517fde0b..00000000 --- a/apps/docs/src/components/table-of-contents.tsx +++ /dev/null @@ -1,190 +0,0 @@ -import { useLocation } from "@solidjs/router"; -import { clsx } from "clsx"; -import { - type Accessor, - For, - type Setter, - Suspense, - createEffect, - createSignal, - on, - onCleanup, -} from "solid-js"; -import { isServer } from "solid-js/web"; -//import { mods } from "../app"; - -interface TocItem { - depth: number; - text: string; - slug: string; -} - -function getHeadingsFromToc(tableOfContents: TocItem[]) { - return tableOfContents.map(({ slug }) => { - const el = document.getElementById(slug); - - if (!el) { - return; - } - - const style = window.getComputedStyle(el); - const scrollMt = Number.parseFloat(style.scrollMarginTop) + 1; - - const top = window.scrollY + el.getBoundingClientRect().top - scrollMt; - - return { slug, top }; - }); -} - -function useCurrentSection(tableOfContents: Accessor) { - const [currentSection, setCurrentSection] = createSignal( - tableOfContents()?.[0]?.slug, - ); - - createEffect(() => { - const toc = tableOfContents(); - - if (toc == null || toc.length === 0) { - return; - } - - const headings = getHeadingsFromToc(toc); - - function onScroll() { - const top = window.scrollY; - let current = headings[0]?.slug; - - for (const heading of headings) { - if (heading == null) { - continue; - } - - if (top >= heading.top) { - current = heading.slug; - } else { - break; - } - } - - setCurrentSection(current); - } - - window.addEventListener("scroll", onScroll, { passive: true }); - - onScroll(); - - onCleanup(() => { - // @ts-ignore - window.removeEventListener("scroll", onScroll, { passive: true }); - }); - }); - - return currentSection; -} - -//const getTOC = cache(async (pathname: string) => { -// "use server"; -// -// const mod = mods[`./routes${pathname}.mdx`] ?? mods[`./routes${pathname}.md`]; -// return !mod -// ? [] -// : mod.getHeadings().filter((h) => h.depth > 1 && h.depth <= 3); -//}, "toc"); - -function updateHeadings(setter: Setter) { - if (document.getElementsByTagName("article").length === 0) { - setTimeout(() => updateHeadings(setter), 1); - return; - } - - setter( - [ - ...document - .getElementsByTagName("article")[0] - .querySelectorAll( - "h1[data-toc], h2[data-toc], h3[data-toc], h4[data-toc], h5[data-toc], h6[data-toc]", - ), - ].map((element) => ({ - depth: Number(element.tagName.substr(1)), - text: element.textContent!, - slug: element.id, - })), - ); -} - -export function TableOfContents() { - const path = useLocation(); - - // const toc = createAsync(() => getTOC(path.pathname)); - - const [toc, setToc] = createSignal([]); - - createEffect( - on( - () => path.pathname, - (pathname) => { - if (isServer) return; - - updateHeadings(setToc); - }, - ), - ); - - const currentSection = useCurrentSection(toc); - - createEffect( - on( - () => currentSection(), - (currentSection) => { - if (isServer) return; - - const element = document.querySelector( - `a[data-toc-slug="${currentSection}"]`, - ); - - element?.scrollIntoView({ - behavior: "smooth", - block: "nearest", - }); - }, - ), - ); - - return ( - - ); -} diff --git a/apps/docs/src/components/tabs-snippets.tsx b/apps/docs/src/components/tabs-snippets.tsx deleted file mode 100644 index e988c213..00000000 --- a/apps/docs/src/components/tabs-snippets.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { Tabs, type TabsRootProps } from "@kobalte/core/tabs"; -import { clsx } from "clsx"; -import { - type ComponentProps, - type ParentComponent, - splitProps, -} from "solid-js"; - -type TabsSnippetsComposite = { - List: typeof Tabs.List; - Trigger: typeof Tabs.Trigger; - Content: typeof Tabs.Content; -}; - -export const TabsSnippets: ParentComponent & - TabsSnippetsComposite = (props) => { - const [local, others] = splitProps(props, ["class"]); - - return ( - - ); -}; - -TabsSnippets.List = (props: ComponentProps) => { - const [local, others] = splitProps(props, ["children", "class"]); - - return ( - - {local.children} - - - ); -}; - -TabsSnippets.Trigger = (props: ComponentProps) => { - const [local, others] = splitProps(props, ["class"]); - - return ( - - ); -}; - -TabsSnippets.Content = Tabs.Content; diff --git a/apps/docs/src/components/theme-selector.tsx b/apps/docs/src/components/theme-selector.tsx deleted file mode 100644 index e8169cdf..00000000 --- a/apps/docs/src/components/theme-selector.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import { - type ConfigColorMode, - type MaybeConfigColorMode, - useColorMode, -} from "@kobalte/core/color-mode"; -import { Select } from "@kobalte/core/select"; -import { type JSX, createSignal, onMount } from "solid-js"; - -import { DesktopIcon, MoonIcon, SunIcon } from "./icons"; - -interface ThemeOption { - value: ConfigColorMode; - label: string; - icon: (clazz: string) => JSX.Element; -} - -const THEME_OPTIONS: ThemeOption[] = [ - { - value: "light", - label: "Light", - icon: (clazz: string) => , - }, - { - value: "dark", - label: "Dark", - icon: (clazz: string) => , - }, - { - value: "system", - label: "System", - icon: (clazz: string) => , - }, -]; - -function parseCookie(): MaybeConfigColorMode { - const match = document.cookie.match(/(^| )kb-color-mode=([^;]+)/); - return match?.[2] as MaybeConfigColorMode; -} - -export function ThemeSelector() { - const { colorMode, setColorMode } = useColorMode(); - const [selectedTheme, setSelectedTheme] = createSignal(); - - onMount(() => { - setSelectedTheme( - THEME_OPTIONS.find((option) => option.value === parseCookie()), - ); - }); - - return ( - - options={THEME_OPTIONS} - optionValue="value" - optionTextValue="label" - value={selectedTheme() ?? THEME_OPTIONS[0]} - onChange={(option) => { - setSelectedTheme(option); - setColorMode(option.value); - }} - gutter={8} - sameWidth={false} - placement="bottom" - itemComponent={(props) => ( - - {props.item.rawValue.icon("h-4 w-4")} - {props.item.rawValue.label} - - )} - > - - > - {(state) => state.selectedOption().icon("h-5 w-5")} - - - - - - - - - ); -} diff --git a/apps/docs/src/entry-server.tsx b/apps/docs/src/entry-server.tsx index bf657513..bdf1c503 100644 --- a/apps/docs/src/entry-server.tsx +++ b/apps/docs/src/entry-server.tsx @@ -1,10 +1,16 @@ +import { getHtmlProps } from "@kobalte/solidbase/server"; import { StartServer, createHandler } from "@solidjs/start/server"; export default createHandler(() => ( ( - + + Kobalte + diff --git a/apps/docs/src/examples/accordion.module.css b/apps/docs/src/examples/accordion.module.css index 0e0c5aef..8a799211 100644 --- a/apps/docs/src/examples/accordion.module.css +++ b/apps/docs/src/examples/accordion.module.css @@ -1,19 +1,25 @@ .accordion { - border-radius: 6px; + display: flex; + flex-direction: column; width: 300px; - border: 1px solid hsl(240 5% 84%); + border-radius: 6px; + border: 1px solid hsl(240 6% 90%); + background-color: white; color: hsl(240 4% 16%); } +.accordion__item { + overflow: hidden; +} + .accordion__item:first-child { - margin-top: 0; - border-top-left-radius: 4px; - border-top-right-radius: 4px; + border-top-left-radius: 6px; + border-top-right-radius: 6px; } .accordion__item:last-child { - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; } .accordion__item-header { @@ -25,26 +31,38 @@ align-items: center; justify-content: space-between; width: 100%; - padding: 14px; - border-bottom: 1px solid hsl(240 5% 84%); - font-weight: 600; + padding: 14px 16px; + border: none; + border-top: 1px solid hsl(240 6% 90%); + font-size: 16px; + font-weight: 500; text-align: left; outline: none; + cursor: pointer; + background: none; + transition: + border-color 250ms, + color 250ms; +} + +.accordion__item:first-child .accordion__item-trigger { + border-top: none; } -.accordion__item:last-child .accordion__item-trigger { - border-bottom: none; +.accordion__item-trigger:hover { + background-color: hsl(240 6% 97%); } .accordion__item-trigger:focus-visible { z-index: 1; outline: 2px solid hsl(200 98% 39%); - outline-offset: 2px; + outline-offset: -2px; } .accordion__item-trigger-icon { - width: 24px; - height: 24px; + width: 20px; + height: 20px; + color: hsl(240 5% 46%); transition: transform 300ms cubic-bezier(0.87, 0, 0.13, 1); } @@ -54,7 +72,7 @@ .accordion__item-content { overflow: hidden; - font-size: 16px; + font-size: 14px; animation: slideUp 300ms cubic-bezier(0.87, 0, 0.13, 1); } @@ -64,6 +82,7 @@ .accordion__item-content-text { padding: 16px; + color: hsl(240 5% 26%); } @keyframes slideDown { @@ -84,11 +103,24 @@ } } -[data-kb-theme="dark"] .accordion { - border-color: hsl(240 5% 65%); - color: hsl(0 0% 100% / 0.9); +[data-theme*="dark"] .accordion { + border-color: hsl(240 5% 34%); + background-color: hsl(240 4% 16%); + color: hsl(0 100% 100% / 0.9); +} + +[data-theme*="dark"] .accordion__item-trigger { + border-top-color: hsl(240 5% 34%); +} + +[data-theme*="dark"] .accordion__item-trigger:hover { + background-color: hsl(240 4% 22%); +} + +[data-theme*="dark"] .accordion__item-trigger-icon { + color: hsl(240 5% 65%); } -[data-kb-theme="dark"] .accordion__item-trigger { - border-bottom-color: hsl(240 5% 65%); +[data-theme*="dark"] .accordion__item-content-text { + color: hsl(0 100% 100% / 0.9); } diff --git a/apps/docs/src/examples/accordion.tsx b/apps/docs/src/examples/accordion.tsx index a90c283f..2f5b71ce 100644 --- a/apps/docs/src/examples/accordion.tsx +++ b/apps/docs/src/examples/accordion.tsx @@ -1,9 +1,10 @@ -import { Accordion } from "@kobalte/core/accordion"; import { createSignal } from "solid-js"; import { ChevronDownIcon } from "../components"; import style from "./accordion.module.css"; +import { Accordion } from "@kobalte/core/accordion"; + export function BasicExample() { return ( @@ -182,7 +183,9 @@ export function ControlledExample() { -

+

Expanded item: {expandedItem().join(",")}

diff --git a/apps/docs/src/examples/alert-dialog.module.css b/apps/docs/src/examples/alert-dialog.module.css index d619abd3..12399335 100644 --- a/apps/docs/src/examples/alert-dialog.module.css +++ b/apps/docs/src/examples/alert-dialog.module.css @@ -130,33 +130,33 @@ } } -[data-kb-theme="dark"] .alert-dialog__trigger { +[data-theme*="dark"] .alert-dialog__trigger { background-color: hsl(201 96% 32%); color: hsla(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .alert-dialog__trigger:hover { +[data-theme*="dark"] .alert-dialog__trigger:hover { background-color: hsl(200 98% 39%); } -[data-kb-theme="dark"] .alert-dialog__trigger:active { +[data-theme*="dark"] .alert-dialog__trigger:active { background-color: hsl(199 89% 48%); } -[data-kb-theme="dark"] .alert-dialog__content { +[data-theme*="dark"] .alert-dialog__content { border: 1px solid hsl(240 5% 26%); background-color: hsl(240 4% 16%); box-shadow: none; } -[data-kb-theme="dark"] .alert-dialog__close-button { +[data-theme*="dark"] .alert-dialog__close-button { color: hsl(0 100% 100% / 0.8); } -[data-kb-theme="dark"] .alert-dialog__title { +[data-theme*="dark"] .alert-dialog__title { color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .alert-dialog__description { +[data-theme*="dark"] .alert-dialog__description { color: hsl(0 100% 100% / 0.7); } diff --git a/apps/docs/src/examples/alert-dialog.tsx b/apps/docs/src/examples/alert-dialog.tsx index d7eef264..a15dfcc6 100644 --- a/apps/docs/src/examples/alert-dialog.tsx +++ b/apps/docs/src/examples/alert-dialog.tsx @@ -1,8 +1,8 @@ -import { AlertDialog } from "@kobalte/core/alert-dialog"; - import { CrossIcon } from "../components"; import style from "./alert-dialog.module.css"; +import { AlertDialog } from "@kobalte/core/alert-dialog"; + export function BasicExample() { return ( diff --git a/apps/docs/src/examples/alert.module.css b/apps/docs/src/examples/alert.module.css index d4e2af77..b0752b58 100644 --- a/apps/docs/src/examples/alert.module.css +++ b/apps/docs/src/examples/alert.module.css @@ -6,7 +6,7 @@ font-size: 16px; } -[data-kb-theme="dark"] .alert { +[data-theme*="dark"] .alert { background-color: hsla(202 80% 24% / 0.2); color: hsl(198 93% 60%); } diff --git a/apps/docs/src/examples/alert.tsx b/apps/docs/src/examples/alert.tsx index 7e717f84..c0f9ba6d 100644 --- a/apps/docs/src/examples/alert.tsx +++ b/apps/docs/src/examples/alert.tsx @@ -1,7 +1,7 @@ -import { Alert } from "@kobalte/core/alert"; - import style from "./alert.module.css"; +import { Alert } from "@kobalte/core/alert"; + export function BasicExample() { return ( Kobalte is going live soon, get ready! diff --git a/apps/docs/src/examples/badge.tsx b/apps/docs/src/examples/badge.tsx index edcd4f94..faa178d1 100644 --- a/apps/docs/src/examples/badge.tsx +++ b/apps/docs/src/examples/badge.tsx @@ -1,7 +1,7 @@ -import { Badge } from "@kobalte/core/badge"; - import style from "./badge.module.css"; +import { Badge } from "@kobalte/core/badge"; + export function BasicExample() { return ( diff --git a/apps/docs/src/examples/breadcrumbs.module.css b/apps/docs/src/examples/breadcrumbs.module.css index 844879e6..0932790a 100644 --- a/apps/docs/src/examples/breadcrumbs.module.css +++ b/apps/docs/src/examples/breadcrumbs.module.css @@ -31,14 +31,14 @@ color: hsl(240 5% 65%); } -[data-kb-theme="dark"] .breadcrumbs__link { +[data-theme*="dark"] .breadcrumbs__link { color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .breadcrumbs__link[data-disabled] { +[data-theme*="dark"] .breadcrumbs__link[data-disabled] { color: hsl(240 4% 46%); } -[data-kb-theme="dark"] .breadcrumbs__link:hover { +[data-theme*="dark"] .breadcrumbs__link:hover { color: hsl(201 96% 32%); } diff --git a/apps/docs/src/examples/breadcrumbs.tsx b/apps/docs/src/examples/breadcrumbs.tsx index 0800ca78..933181ba 100644 --- a/apps/docs/src/examples/breadcrumbs.tsx +++ b/apps/docs/src/examples/breadcrumbs.tsx @@ -1,8 +1,8 @@ -import { Breadcrumbs } from "@kobalte/core/breadcrumbs"; - import { ChevronRightIcon } from "../components"; import style from "./breadcrumbs.module.css"; +import { Breadcrumbs } from "@kobalte/core/breadcrumbs"; + export function BasicExample() { return ( diff --git a/apps/docs/src/examples/button.module.css b/apps/docs/src/examples/button.module.css index 694fd918..2593a99d 100644 --- a/apps/docs/src/examples/button.module.css +++ b/apps/docs/src/examples/button.module.css @@ -28,15 +28,15 @@ background-color: hsl(201 90% 27%); } -[data-kb-theme="dark"] .button { +[data-theme*="dark"] .button { background-color: hsl(201 96% 32%); color: hsla(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .button:hover { +[data-theme*="dark"] .button:hover { background-color: hsl(200 98% 39%); } -[data-kb-theme="dark"] .button:active { +[data-theme*="dark"] .button:active { background-color: hsl(199 89% 48%); } diff --git a/apps/docs/src/examples/button.tsx b/apps/docs/src/examples/button.tsx index 3e76fee5..93bb10db 100644 --- a/apps/docs/src/examples/button.tsx +++ b/apps/docs/src/examples/button.tsx @@ -1,7 +1,7 @@ -import { Button } from "@kobalte/core/button"; - import style from "./button.module.css"; +import { Button } from "@kobalte/core/button"; + export function BasicExample() { return ; } diff --git a/apps/docs/src/examples/checkbox.module.css b/apps/docs/src/examples/checkbox.module.css index de6f651e..2fdaa2c3 100644 --- a/apps/docs/src/examples/checkbox.module.css +++ b/apps/docs/src/examples/checkbox.module.css @@ -47,25 +47,25 @@ user-select: none; } -[data-kb-theme="dark"] .checkbox__control { +[data-theme*="dark"] .checkbox__control { border-color: hsl(240 5% 34%); background-color: hsl(240 5% 26%); } -[data-kb-theme="dark"] .checkbox__control[data-checked] { +[data-theme*="dark"] .checkbox__control[data-checked] { border-color: hsl(200 98% 39%); background-color: hsl(200 98% 39%); color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .checkbox__control[data-invalid] { +[data-theme*="dark"] .checkbox__control[data-invalid] { border-color: hsl(0 72% 51%); } -[data-kb-theme="dark"] .checkbox__label { +[data-theme*="dark"] .checkbox__label { color: hsl(240 5% 84%); } -[data-kb-theme="dark"] .checkbox__description { +[data-theme*="dark"] .checkbox__description { color: hsl(240 5% 65%); } diff --git a/apps/docs/src/examples/checkbox.tsx b/apps/docs/src/examples/checkbox.tsx index 32bf0b43..b86ae650 100644 --- a/apps/docs/src/examples/checkbox.tsx +++ b/apps/docs/src/examples/checkbox.tsx @@ -1,10 +1,10 @@ -import { Checkbox } from "@kobalte/core/checkbox"; -import { clsx } from "clsx"; import { createSignal } from "solid-js"; import { CheckIcon } from "../components"; import style from "./checkbox.module.css"; +import { Checkbox } from "@kobalte/core/checkbox"; + export function BasicExample() { return ( @@ -51,7 +51,9 @@ export function ControlledExample() { Subscribe -

+

You are {checked() ? "subscribed" : "unsubscribed"}.

@@ -60,14 +62,21 @@ export function ControlledExample() { export function DescriptionExample() { return ( - + -
+
Subscribe You will receive our weekly newsletter. @@ -82,7 +91,8 @@ export function ErrorMessageExample() { return ( -
+
Subscribe You must agree to our Terms and Conditions. @@ -119,7 +136,12 @@ export function HTMLFormExample() {
@@ -130,7 +152,7 @@ export function HTMLFormExample() { Subscribe -
+
diff --git a/apps/docs/src/examples/collapsible.module.css b/apps/docs/src/examples/collapsible.module.css index 6b2aadc7..9ccca47f 100644 --- a/apps/docs/src/examples/collapsible.module.css +++ b/apps/docs/src/examples/collapsible.module.css @@ -65,8 +65,8 @@ } } -[data-kb-theme="dark"] .collapsible__trigger, -[data-kb-theme="dark"] .collapsible__content { +[data-theme*="dark"] .collapsible__trigger, +[data-theme*="dark"] .collapsible__content { border-color: hsl(240 5% 65%); color: hsl(0 0% 100% / 0.9); } diff --git a/apps/docs/src/examples/collapsible.tsx b/apps/docs/src/examples/collapsible.tsx index 772c3fe7..bc9301cd 100644 --- a/apps/docs/src/examples/collapsible.tsx +++ b/apps/docs/src/examples/collapsible.tsx @@ -1,8 +1,8 @@ -import { Collapsible } from "@kobalte/core/collapsible"; - import { ChevronDownIcon } from "../components"; import style from "./collapsible.module.css"; +import { Collapsible } from "@kobalte/core/collapsible"; + export function BasicExample() { return ( diff --git a/apps/docs/src/examples/color-area.tsx b/apps/docs/src/examples/color-area.tsx index cd86918c..67cb040c 100644 --- a/apps/docs/src/examples/color-area.tsx +++ b/apps/docs/src/examples/color-area.tsx @@ -1,8 +1,9 @@ -import { ColorArea } from "@kobalte/core/color-area"; import { parseColor } from "@kobalte/core/colors"; import { createSignal } from "solid-js"; import style from "./color-area.module.css"; +import { ColorArea } from "@kobalte/core/color-area"; + export function BasicExample() { return ( @@ -51,7 +52,13 @@ export function ControlledValueExample() { -

+

Current color value: {value().toString("hsl")}

@@ -96,7 +103,12 @@ export function HTMLFormExample() { -
+
diff --git a/apps/docs/src/examples/color-channel-field.module.css b/apps/docs/src/examples/color-channel-field.module.css index 6d7552df..b2acae06 100644 --- a/apps/docs/src/examples/color-channel-field.module.css +++ b/apps/docs/src/examples/color-channel-field.module.css @@ -58,13 +58,13 @@ background: rgba(0, 0, 0, 0.2); } -[data-kb-theme="dark"] .color-channel-field__increment, -[data-kb-theme="dark"] .color-channel-field__decrement { +[data-theme*="dark"] .color-channel-field__increment, +[data-theme*="dark"] .color-channel-field__decrement { background: rgba(0, 0, 0, 0.5); } -[data-kb-theme="dark"] .color-channel-field__increment:hover, -[data-kb-theme="dark"] .color-channel-field__decrement:hover { +[data-theme*="dark"] .color-channel-field__increment:hover, +[data-theme*="dark"] .color-channel-field__decrement:hover { background: rgba(0, 0, 0, 0.25); } @@ -117,8 +117,8 @@ border-radius: 0; } -[data-kb-theme="dark"] .color-channel-field__custom-trigger-decrement, -[data-kb-theme="dark"] .color-channel-field__custom-trigger-increment { +[data-theme*="dark"] .color-channel-field__custom-trigger-decrement, +[data-theme*="dark"] .color-channel-field__custom-trigger-increment { border-color: hsl(240 5% 34%); } @@ -156,29 +156,29 @@ user-select: none; } -[data-kb-theme="dark"] .color-channel-field__input { +[data-theme*="dark"] .color-channel-field__input { background-color: hsl(240 4% 16%); border: 1px solid hsl(240 5% 34%); color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .color-channel-field__input:hover { +[data-theme*="dark"] .color-channel-field__input:hover { border-color: hsl(240 4% 46%); } -[data-kb-theme="dark"] .color-channel-field__input[data-invalid] { +[data-theme*="dark"] .color-channel-field__input[data-invalid] { border-color: hsl(0 72% 51%); color: hsl(0 72% 51%); } -[data-kb-theme="dark"] .color-channel-field__input::placeholder { +[data-theme*="dark"] .color-channel-field__input::placeholder { color: hsl(0 100% 100% / 0.5); } -[data-kb-theme="dark"] .color-channel-field__label { +[data-theme*="dark"] .color-channel-field__label { color: hsl(240 5% 84%); } -[data-kb-theme="dark"] .color-channel-field__description { +[data-theme*="dark"] .color-channel-field__description { color: hsl(240 5% 65%); } diff --git a/apps/docs/src/examples/color-channel-field.tsx b/apps/docs/src/examples/color-channel-field.tsx index af2930db..aa9f9235 100644 --- a/apps/docs/src/examples/color-channel-field.tsx +++ b/apps/docs/src/examples/color-channel-field.tsx @@ -1,9 +1,10 @@ -import { ColorChannelField } from "@kobalte/core/color-channel-field"; import { parseColor } from "@kobalte/core/colors"; import { createSignal } from "solid-js"; import { ArrowIcon } from "../components"; import style from "./color-channel-field.module.css"; +import { ColorChannelField } from "@kobalte/core/color-channel-field"; + export function BasicExample() { return ( @@ -91,7 +92,13 @@ export function ControlledExample() {
-

+

Lightness: {value().getChannelValue("lightness")}%

@@ -188,7 +195,12 @@ export function HTMLFormExample() {
-
+
diff --git a/apps/docs/src/examples/color-field.module.css b/apps/docs/src/examples/color-field.module.css index a8ecbea5..76dd9a41 100644 --- a/apps/docs/src/examples/color-field.module.css +++ b/apps/docs/src/examples/color-field.module.css @@ -56,29 +56,29 @@ user-select: none; } -[data-kb-theme="dark"] .color-field__input { +[data-theme*="dark"] .color-field__input { background-color: hsl(240 4% 16%); border: 1px solid hsl(240 5% 34%); color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .color-field__input:hover { +[data-theme*="dark"] .color-field__input:hover { border-color: hsl(240 4% 46%); } -[data-kb-theme="dark"] .color-field__input[data-invalid] { +[data-theme*="dark"] .color-field__input[data-invalid] { border-color: hsl(0 72% 51%); color: hsl(0 72% 51%); } -[data-kb-theme="dark"] .color-field__input::placeholder { +[data-theme*="dark"] .color-field__input::placeholder { color: hsl(0 100% 100% / 0.5); } -[data-kb-theme="dark"] .color-field__label { +[data-theme*="dark"] .color-field__label { color: hsl(240 5% 84%); } -[data-kb-theme="dark"] .color-field__description { +[data-theme*="dark"] .color-field__description { color: hsl(240 5% 65%); } diff --git a/apps/docs/src/examples/color-field.tsx b/apps/docs/src/examples/color-field.tsx index 2faf5622..cef0d9bf 100644 --- a/apps/docs/src/examples/color-field.tsx +++ b/apps/docs/src/examples/color-field.tsx @@ -1,8 +1,9 @@ -import { ColorField } from "@kobalte/core/color-field"; import { createSignal } from "solid-js"; import style from "./color-field.module.css"; +import { ColorField } from "@kobalte/core/color-field"; + export function BasicExample() { return ( @@ -40,7 +41,15 @@ export function ControlledExample() { -

Your favorite color is: {value()}

+

+ Your favorite color is: {value()} +

); } @@ -96,7 +105,12 @@ export function HTMLFormExample() { @@ -104,7 +118,7 @@ export function HTMLFormExample() { -
+
diff --git a/apps/docs/src/examples/color-slider.tsx b/apps/docs/src/examples/color-slider.tsx index 37393b07..89550e2f 100644 --- a/apps/docs/src/examples/color-slider.tsx +++ b/apps/docs/src/examples/color-slider.tsx @@ -1,8 +1,9 @@ -import { ColorSlider } from "@kobalte/core/color-slider"; import { parseColor } from "@kobalte/core/colors"; import { createSignal } from "solid-js"; import style from "./color-slider.module.css"; +import { ColorSlider } from "@kobalte/core/color-slider"; + export function BasicExample() { return ( @@ -62,7 +63,13 @@ export function ControlledValueExample() { -

+

Current color value: {value().toString("hsl")}

@@ -109,7 +116,12 @@ export function HTMLFormExample() { Label @@ -119,7 +131,7 @@ export function HTMLFormExample() { -
+
diff --git a/apps/docs/src/examples/combobox.module.css b/apps/docs/src/examples/combobox.module.css index 3f55cc1a..8b141178 100644 --- a/apps/docs/src/examples/combobox.module.css +++ b/apps/docs/src/examples/combobox.module.css @@ -169,45 +169,45 @@ } } -[data-kb-theme="dark"] .combobox__control { +[data-theme*="dark"] .combobox__control { background-color: hsl(240 4% 16%); border: 1px solid hsl(240 5% 34%); color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .combobox__control:hover { +[data-theme*="dark"] .combobox__control:hover { border-color: hsl(240 4% 46%); } -[data-kb-theme="dark"] .combobox__control[data-invalid] { +[data-theme*="dark"] .combobox__control[data-invalid] { border-color: hsl(0 72% 51%); color: hsl(0 72% 51%); } -[data-kb-theme="dark"] .combobox__input::placeholder { +[data-theme*="dark"] .combobox__input::placeholder { color: hsl(0 100% 100% / 0.5); } -[data-kb-theme="dark"] .combobox__trigger { +[data-theme*="dark"] .combobox__trigger { background: hsl(240 5% 26%); border-left: 1px solid hsl(240 5% 34%); color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .combobox__content { +[data-theme*="dark"] .combobox__content { border: 1px solid hsl(240 5% 26%); background-color: hsl(240 4% 16%); box-shadow: none; } -[data-kb-theme="dark"] .combobox__section { +[data-theme*="dark"] .combobox__section { color: hsl(0 100% 100% / 0.7); } -[data-kb-theme="dark"] .combobox__item { +[data-theme*="dark"] .combobox__item { color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .combobox__description { +[data-theme*="dark"] .combobox__description { color: hsl(0 100% 100% / 0.7); } diff --git a/apps/docs/src/examples/combobox.tsx b/apps/docs/src/examples/combobox.tsx index cab1579a..7560f2f0 100644 --- a/apps/docs/src/examples/combobox.tsx +++ b/apps/docs/src/examples/combobox.tsx @@ -1,4 +1,3 @@ -import { Combobox } from "@kobalte/core/combobox"; import { For, createSignal } from "solid-js"; import { CaretSortIcon, CheckIcon, CrossIcon } from "../components"; @@ -12,6 +11,8 @@ const ALL_STRING_OPTIONS = [ "Pineapple", ]; +import { Combobox } from "@kobalte/core/combobox"; + export function BasicExample() { return ( -

Your favorite fruit is: {value()}.

+

+ Your favorite fruit is: {value()}. +

); } @@ -218,7 +227,12 @@ export function HTMLFormExample() { -
+
@@ -407,23 +421,41 @@ export function MultipleSelectionExample() { {(state) => ( <>
0 && "p-2" - }`} + style={{ + display: "flex", + "align-items": "center", + gap: "8px", + "flex-wrap": "wrap", + ...(state.selectedOptions().length > 0 && { padding: "8px" }), + }} > {(option) => ( e.stopPropagation()} > {option} )} @@ -438,9 +470,18 @@ export function MultipleSelectionExample() { type="button" onPointerDown={(e) => e.stopPropagation()} onClick={state.clear} - class="ml-auto self-center mr-2 rounded-full hover:bg-zinc-100 dark:hover:bg-zinc-600 p-2" + style={{ + "margin-left": "auto", + "align-self": "center", + "margin-right": "8px", + "border-radius": "9999px", + padding: "8px", + cursor: "pointer", + background: "none", + border: "none", + }} > - + @@ -456,7 +497,13 @@ export function MultipleSelectionExample() { -

+

Your favorite fruits are: {values().join(", ")}.

diff --git a/apps/docs/src/examples/context-menu.module.css b/apps/docs/src/examples/context-menu.module.css index 427d9683..addd393d 100644 --- a/apps/docs/src/examples/context-menu.module.css +++ b/apps/docs/src/examples/context-menu.module.css @@ -131,34 +131,34 @@ } } -[data-kb-theme="dark"] .context-menu__trigger { +[data-theme*="dark"] .context-menu__trigger { border-color: rgb(255 255 255 / 0.5); color: rgb(255 255 255 / 0.7); } -[data-kb-theme="dark"] .context-menu__content, -[data-kb-theme="dark"] .context-menu__sub-content { +[data-theme*="dark"] .context-menu__content, +[data-theme*="dark"] .context-menu__sub-content { border: 1px solid hsl(240 5% 26%); background-color: hsl(240 4% 16%); box-shadow: none; } -[data-kb-theme="dark"] .context-menu__group-label { +[data-theme*="dark"] .context-menu__group-label { color: hsl(0 100% 100% / 0.7); } -[data-kb-theme="dark"] .context-menu__item, -[data-kb-theme="dark"] .context-menu__checkbox-item, -[data-kb-theme="dark"] .context-menu__radio-item, -[data-kb-theme="dark"] .context-menu__sub-trigger { +[data-theme*="dark"] .context-menu__item, +[data-theme*="dark"] .context-menu__checkbox-item, +[data-theme*="dark"] .context-menu__radio-item, +[data-theme*="dark"] .context-menu__sub-trigger { color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .context-menu__sub-trigger[data-expanded]:not([data-highlighted]) { +[data-theme*="dark"] .context-menu__sub-trigger[data-expanded]:not([data-highlighted]) { background-color: hsl(202 80% 24% / 0.7); color: hsl(198 93% 60%); } -[data-kb-theme="dark"] .context-menu__separator { +[data-theme*="dark"] .context-menu__separator { border-color: hsl(240 5% 34%); } diff --git a/apps/docs/src/examples/context-menu.tsx b/apps/docs/src/examples/context-menu.tsx index 31be52f2..30c32e63 100644 --- a/apps/docs/src/examples/context-menu.tsx +++ b/apps/docs/src/examples/context-menu.tsx @@ -1,9 +1,10 @@ -import { ContextMenu } from "@kobalte/core/context-menu"; import { createSignal } from "solid-js"; import { CheckIcon, ChevronRightIcon, DotFilledIcon } from "../components"; import style from "./context-menu.module.css"; +import { ContextMenu } from "@kobalte/core/context-menu"; + export function BasicExample() { const [showGitLog, setShowGitLog] = createSignal(true); const [showHistory, setShowHistory] = createSignal(false); diff --git a/apps/docs/src/examples/dialog.module.css b/apps/docs/src/examples/dialog.module.css index 59459491..cbd13930 100644 --- a/apps/docs/src/examples/dialog.module.css +++ b/apps/docs/src/examples/dialog.module.css @@ -130,33 +130,33 @@ } } -[data-kb-theme="dark"] .dialog__trigger { +[data-theme*="dark"] .dialog__trigger { background-color: hsl(201 96% 32%); color: hsla(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .dialog__trigger:hover { +[data-theme*="dark"] .dialog__trigger:hover { background-color: hsl(200 98% 39%); } -[data-kb-theme="dark"] .dialog__trigger:active { +[data-theme*="dark"] .dialog__trigger:active { background-color: hsl(199 89% 48%); } -[data-kb-theme="dark"] .dialog__content { +[data-theme*="dark"] .dialog__content { border: 1px solid hsl(240 5% 26%); background-color: hsl(240 4% 16%); box-shadow: none; } -[data-kb-theme="dark"] .dialog__close-button { +[data-theme*="dark"] .dialog__close-button { color: hsl(0 100% 100% / 0.8); } -[data-kb-theme="dark"] .dialog__title { +[data-theme*="dark"] .dialog__title { color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .dialog__description { +[data-theme*="dark"] .dialog__description { color: hsl(0 100% 100% / 0.7); } diff --git a/apps/docs/src/examples/dialog.tsx b/apps/docs/src/examples/dialog.tsx index ffdbd69b..ca423d01 100644 --- a/apps/docs/src/examples/dialog.tsx +++ b/apps/docs/src/examples/dialog.tsx @@ -1,8 +1,8 @@ -import { Dialog } from "@kobalte/core/dialog"; - import { CrossIcon } from "../components"; import style from "./dialog.module.css"; +import { Dialog } from "@kobalte/core/dialog"; + export function BasicExample() { return ( diff --git a/apps/docs/src/examples/dropdown-menu.module.css b/apps/docs/src/examples/dropdown-menu.module.css index 1080c68c..d7e9f24f 100644 --- a/apps/docs/src/examples/dropdown-menu.module.css +++ b/apps/docs/src/examples/dropdown-menu.module.css @@ -161,29 +161,29 @@ } } -[data-kb-theme="dark"] .dropdown-menu__content, -[data-kb-theme="dark"] .dropdown-menu__sub-content { +[data-theme*="dark"] .dropdown-menu__content, +[data-theme*="dark"] .dropdown-menu__sub-content { border: 1px solid hsl(240 5% 26%); background-color: hsl(240 4% 16%); box-shadow: none; } -[data-kb-theme="dark"] .dropdown-menu__group-label { +[data-theme*="dark"] .dropdown-menu__group-label { color: hsl(0 100% 100% / 0.7); } -[data-kb-theme="dark"] .dropdown-menu__item, -[data-kb-theme="dark"] .dropdown-menu__checkbox-item, -[data-kb-theme="dark"] .dropdown-menu__radio-item, -[data-kb-theme="dark"] .dropdown-menu__sub-trigger { +[data-theme*="dark"] .dropdown-menu__item, +[data-theme*="dark"] .dropdown-menu__checkbox-item, +[data-theme*="dark"] .dropdown-menu__radio-item, +[data-theme*="dark"] .dropdown-menu__sub-trigger { color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .dropdown-menu__sub-trigger[data-expanded]:not([data-highlighted]) { +[data-theme*="dark"] .dropdown-menu__sub-trigger[data-expanded]:not([data-highlighted]) { background-color: hsl(202 80% 24% / 0.7); color: hsl(198 93% 60%); } -[data-kb-theme="dark"] .dropdown-menu__separator { +[data-theme*="dark"] .dropdown-menu__separator { border-color: hsl(240 5% 34%); } diff --git a/apps/docs/src/examples/dropdown-menu.tsx b/apps/docs/src/examples/dropdown-menu.tsx index b24f327f..ce76ad9d 100644 --- a/apps/docs/src/examples/dropdown-menu.tsx +++ b/apps/docs/src/examples/dropdown-menu.tsx @@ -1,4 +1,3 @@ -import { DropdownMenu } from "@kobalte/core/dropdown-menu"; import { createSignal } from "solid-js"; import { @@ -9,6 +8,8 @@ import { } from "../components"; import style from "./dropdown-menu.module.css"; +import { DropdownMenu } from "@kobalte/core/dropdown-menu"; + export function BasicExample() { const [showGitLog, setShowGitLog] = createSignal(true); const [showHistory, setShowHistory] = createSignal(false); diff --git a/apps/docs/src/examples/file-field.tsx b/apps/docs/src/examples/file-field.tsx index 27e102d3..69ac1f7f 100644 --- a/apps/docs/src/examples/file-field.tsx +++ b/apps/docs/src/examples/file-field.tsx @@ -1,7 +1,7 @@ -import { FileField } from "@kobalte/core/file-field"; - import style from "./file-field.module.css"; +import { FileField } from "@kobalte/core/file-field"; + export function BasicExample() { return ( diff --git a/apps/docs/src/examples/image.module.css b/apps/docs/src/examples/image.module.css index df3d3427..c45ed8c7 100644 --- a/apps/docs/src/examples/image.module.css +++ b/apps/docs/src/examples/image.module.css @@ -31,7 +31,7 @@ font-weight: 500; } -[data-kb-theme="dark"] .image__fallback { +[data-theme*="dark"] .image__fallback { background-color: hsl(202 80% 24%); color: hsl(198 93% 60%); } diff --git a/apps/docs/src/examples/image.tsx b/apps/docs/src/examples/image.tsx index 7879c786..b7466e0d 100644 --- a/apps/docs/src/examples/image.tsx +++ b/apps/docs/src/examples/image.tsx @@ -1,10 +1,10 @@ -import { Image } from "@kobalte/core/image"; - import style from "./image.module.css"; +import { Image } from "@kobalte/core/image"; + export function BasicExample() { return ( -
+
diff --git a/apps/docs/src/examples/menubar.module.css b/apps/docs/src/examples/menubar.module.css index 185bd7e7..5a01730c 100644 --- a/apps/docs/src/examples/menubar.module.css +++ b/apps/docs/src/examples/menubar.module.css @@ -155,39 +155,39 @@ } } -[data-kb-theme="dark"] .menubar__trigger { +[data-theme*="dark"] .menubar__trigger { background-color: hsl(240 4% 16%); color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .menubar__content, -[data-kb-theme="dark"] .menubar__sub-content { +[data-theme*="dark"] .menubar__content, +[data-theme*="dark"] .menubar__sub-content { border: 1px solid hsl(240 5% 26%); background-color: hsl(240 4% 16%); box-shadow: none; } -[data-kb-theme="dark"] .menubar__group-label { +[data-theme*="dark"] .menubar__group-label { color: hsl(0 100% 100% / 0.7); } -[data-kb-theme="dark"] .menubar__item, -[data-kb-theme="dark"] .menubar__checkbox-item, -[data-kb-theme="dark"] .menubar__radio-item, -[data-kb-theme="dark"] .menubar__sub-trigger { +[data-theme*="dark"] .menubar__item, +[data-theme*="dark"] .menubar__checkbox-item, +[data-theme*="dark"] .menubar__radio-item, +[data-theme*="dark"] .menubar__sub-trigger { color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .menubar__sub-trigger[data-expanded]:not([data-highlighted]) { +[data-theme*="dark"] .menubar__sub-trigger[data-expanded]:not([data-highlighted]) { background-color: hsl(202 80% 24% / 0.7); color: hsl(198 93% 60%); } -[data-kb-theme="dark"] .menubar__separator { +[data-theme*="dark"] .menubar__separator { border-color: hsl(240 5% 34%); } -[data-kb-theme="dark"] .menubar__trigger[data-highlighted="true"] { +[data-theme*="dark"] .menubar__trigger[data-highlighted="true"] { background-color: hsl(201 96% 32%); color: hsla(0 100% 100% / 0.9); } diff --git a/apps/docs/src/examples/menubar.tsx b/apps/docs/src/examples/menubar.tsx index 66cb0991..0fab23c6 100644 --- a/apps/docs/src/examples/menubar.tsx +++ b/apps/docs/src/examples/menubar.tsx @@ -1,9 +1,10 @@ -import { Menubar } from "@kobalte/core/menubar"; import { createSignal } from "solid-js"; import { CheckIcon, ChevronRightIcon, DotFilledIcon } from "../components"; import style from "./menubar.module.css"; +import { Menubar } from "@kobalte/core/menubar"; + export function BasicExample() { const [showGitLog, setShowGitLog] = createSignal(true); const [showHistory, setShowHistory] = createSignal(false); diff --git a/apps/docs/src/examples/meter.module.css b/apps/docs/src/examples/meter.module.css index 6910f097..ee8c1d6d 100644 --- a/apps/docs/src/examples/meter.module.css +++ b/apps/docs/src/examples/meter.module.css @@ -28,11 +28,11 @@ transition: width 250ms linear; } -[data-kb-theme="dark"] .meter__label, -[data-kb-theme="dark"] .meter__value-label { +[data-theme*="dark"] .meter__label, +[data-theme*="dark"] .meter__value-label { color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .meter__track { +[data-theme*="dark"] .meter__track { background-color: hsl(240 5% 26%); } diff --git a/apps/docs/src/examples/meter.tsx b/apps/docs/src/examples/meter.tsx index b7dec941..d593de34 100644 --- a/apps/docs/src/examples/meter.tsx +++ b/apps/docs/src/examples/meter.tsx @@ -1,7 +1,7 @@ -import { Meter } from "@kobalte/core/meter"; - import style from "./meter.module.css"; +import { Meter } from "@kobalte/core/meter"; + export function BasicExample() { return ( diff --git a/apps/docs/src/examples/navigation-menu.module.css b/apps/docs/src/examples/navigation-menu.module.css index 0ff97763..79816387 100644 --- a/apps/docs/src/examples/navigation-menu.module.css +++ b/apps/docs/src/examples/navigation-menu.module.css @@ -33,7 +33,7 @@ } .navigation-menu__trigger[data-highlighted="true"], -[data-kb-theme="dark"] .navigation-menu__trigger[data-highlighted="true"] { +[data-theme*="dark"] .navigation-menu__trigger[data-highlighted="true"] { background-color: #0284c710; } @@ -349,31 +349,31 @@ } } -[data-kb-theme="dark"] .navigation-menu__trigger { +[data-theme*="dark"] .navigation-menu__trigger { background-color: #27272a; color: #0284c7; } -[data-kb-theme="dark"] .navigation-menu__item-label, -[data-kb-theme="dark"] .navigation-menu__item-description { +[data-theme*="dark"] .navigation-menu__item-label, +[data-theme*="dark"] .navigation-menu__item-description { color: #e9e9ea; } -[data-kb-theme="dark"] .navigation-menu__item:hover, -[data-kb-theme="dark"] .navigation-menu__item:focus { +[data-theme*="dark"] .navigation-menu__item:hover, +[data-theme*="dark"] .navigation-menu__item:focus { background-color: #0284c710; } -[data-kb-theme="dark"] .navigation-menu__root { +[data-theme*="dark"] .navigation-menu__root { background-color: #27272a; } -[data-kb-theme="dark"] .navigation-menu__viewport { +[data-theme*="dark"] .navigation-menu__viewport { background-color: #27272a; border: 1px solid hsl(240 5% 26%); } -[data-kb-theme="dark"] .navigation-menu__item-callout { +[data-theme*="dark"] .navigation-menu__item-callout { background: linear-gradient(135deg, #0284c7 0%, #00345e 100%); } diff --git a/apps/docs/src/examples/navigation-menu.tsx b/apps/docs/src/examples/navigation-menu.tsx index 76a85be4..21cfcba7 100644 --- a/apps/docs/src/examples/navigation-menu.tsx +++ b/apps/docs/src/examples/navigation-menu.tsx @@ -1,7 +1,3 @@ -import { - NavigationMenu, - type Orientation, -} from "@kobalte/core/navigation-menu"; import { RadioGroup } from "@kobalte/core/radio-group"; import { For, createSignal } from "solid-js"; @@ -9,6 +5,11 @@ import { ChevronDownIcon } from "../components"; import style from "./navigation-menu.module.css"; import radioStyle from "./radio-group.module.css"; +import { + NavigationMenu, + type Orientation, +} from "@kobalte/core/navigation-menu"; + export function BasicExample() { const [orientation, setOrientation] = createSignal("horizontal"); @@ -224,10 +225,10 @@ export function BasicExample() {
- + setOrientation(value)} + onChange={(value) => setOrientation(value as Orientation)} > Orientation diff --git a/apps/docs/src/examples/number-field.module.css b/apps/docs/src/examples/number-field.module.css index 5fbd651e..22aca1a8 100644 --- a/apps/docs/src/examples/number-field.module.css +++ b/apps/docs/src/examples/number-field.module.css @@ -58,13 +58,13 @@ background: rgba(0, 0, 0, 0.2); } -[data-kb-theme="dark"] .number-field__increment, -[data-kb-theme="dark"] .number-field__decrement { +[data-theme*="dark"] .number-field__increment, +[data-theme*="dark"] .number-field__decrement { background: rgba(0, 0, 0, 0.5); } -[data-kb-theme="dark"] .number-field__increment:hover, -[data-kb-theme="dark"] .number-field__decrement:hover { +[data-theme*="dark"] .number-field__increment:hover, +[data-theme*="dark"] .number-field__decrement:hover { background: rgba(0, 0, 0, 0.25); } @@ -117,8 +117,8 @@ border-radius: 0; } -[data-kb-theme="dark"] .number-field__custom-trigger-decrement, -[data-kb-theme="dark"] .number-field__custom-trigger-increment { +[data-theme*="dark"] .number-field__custom-trigger-decrement, +[data-theme*="dark"] .number-field__custom-trigger-increment { border-color: hsl(240 5% 34%); } @@ -156,29 +156,29 @@ user-select: none; } -[data-kb-theme="dark"] .number-field__input { +[data-theme*="dark"] .number-field__input { background-color: hsl(240 4% 16%); border: 1px solid hsl(240 5% 34%); color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .number-field__input:hover { +[data-theme*="dark"] .number-field__input:hover { border-color: hsl(240 4% 46%); } -[data-kb-theme="dark"] .number-field__input[data-invalid] { +[data-theme*="dark"] .number-field__input[data-invalid] { border-color: hsl(0 72% 51%); color: hsl(0 72% 51%); } -[data-kb-theme="dark"] .number-field__input::placeholder { +[data-theme*="dark"] .number-field__input::placeholder { color: hsl(0 100% 100% / 0.5); } -[data-kb-theme="dark"] .number-field__label { +[data-theme*="dark"] .number-field__label { color: hsl(240 5% 84%); } -[data-kb-theme="dark"] .number-field__description { +[data-theme*="dark"] .number-field__description { color: hsl(240 5% 65%); } diff --git a/apps/docs/src/examples/number-field.tsx b/apps/docs/src/examples/number-field.tsx index 64fdaad5..cbfae9ae 100644 --- a/apps/docs/src/examples/number-field.tsx +++ b/apps/docs/src/examples/number-field.tsx @@ -1,9 +1,10 @@ -import { NumberField } from "@kobalte/core/number-field"; import { createSignal } from "solid-js"; import { ArrowIcon } from "../components"; import style from "./number-field.module.css"; +import { NumberField } from "@kobalte/core/number-field"; + export function BasicExample() { return ( @@ -87,7 +88,13 @@ export function ControlledExample() {
-

+

Quantity: {value()}. Raw: {rawValue()}.

@@ -172,7 +179,12 @@ export function HTMLFormExample() { @@ -195,7 +207,7 @@ export function HTMLFormExample() {
-
+
diff --git a/apps/docs/src/examples/pagination.module.css b/apps/docs/src/examples/pagination.module.css index aed95705..54a8f0da 100644 --- a/apps/docs/src/examples/pagination.module.css +++ b/apps/docs/src/examples/pagination.module.css @@ -66,27 +66,27 @@ color: white; } -[data-kb-theme="dark"] .pagination__item { +[data-theme*="dark"] .pagination__item { background-color: hsl(240 4% 16%); border: 1px solid hsl(240 5% 34%); color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .pagination__ellipsis { +[data-theme*="dark"] .pagination__ellipsis { background-color: hsl(240 4% 16%); border: 1px solid hsl(240 5% 34%); color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .pagination__item[aria-current="page"] { +[data-theme*="dark"] .pagination__item[aria-current="page"] { background-color: hsl(201 96% 32%); color: hsla(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .pagination__item:hover { +[data-theme*="dark"] .pagination__item:hover { border-color: hsl(240 4% 46%); } -[data-kb-theme="dark"] .pagination__item:active { +[data-theme*="dark"] .pagination__item:active { background-color: hsl(199 89% 48%); } diff --git a/apps/docs/src/examples/pagination.tsx b/apps/docs/src/examples/pagination.tsx index ad68d45d..ae64bb44 100644 --- a/apps/docs/src/examples/pagination.tsx +++ b/apps/docs/src/examples/pagination.tsx @@ -1,8 +1,8 @@ -import { Pagination } from "@kobalte/core/pagination"; - import { createSignal } from "solid-js"; import style from "./pagination.module.css"; +import { Pagination } from "@kobalte/core/pagination"; + export function BasicExample() { return ( diff --git a/apps/docs/src/examples/progress.module.css b/apps/docs/src/examples/progress.module.css index 2d3cfc54..ead5b431 100644 --- a/apps/docs/src/examples/progress.module.css +++ b/apps/docs/src/examples/progress.module.css @@ -32,11 +32,11 @@ background-color: #16a34a; } -[data-kb-theme="dark"] .progress__label, -[data-kb-theme="dark"] .progress__value-label { +[data-theme*="dark"] .progress__label, +[data-theme*="dark"] .progress__value-label { color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .progress__track { +[data-theme*="dark"] .progress__track { background-color: hsl(240 5% 26%); } diff --git a/apps/docs/src/examples/progress.tsx b/apps/docs/src/examples/progress.tsx index f356d994..50a68e3b 100644 --- a/apps/docs/src/examples/progress.tsx +++ b/apps/docs/src/examples/progress.tsx @@ -1,7 +1,7 @@ -import { Progress } from "@kobalte/core/progress"; - import style from "./progress.module.css"; +import { Progress } from "@kobalte/core/progress"; + export function BasicExample() { return ( diff --git a/apps/docs/src/examples/radio-group.module.css b/apps/docs/src/examples/radio-group.module.css index 5d2145e5..dd96ea9b 100644 --- a/apps/docs/src/examples/radio-group.module.css +++ b/apps/docs/src/examples/radio-group.module.css @@ -73,35 +73,35 @@ user-select: none; } -[data-kb-theme="dark"] .radio-group__label { +[data-theme*="dark"] .radio-group__label { color: hsl(240 5% 84%); } -[data-kb-theme="dark"] .radio-group__description { +[data-theme*="dark"] .radio-group__description { color: hsl(240 5% 65%); } -[data-kb-theme="dark"] .radio__control { +[data-theme*="dark"] .radio__control { border-color: hsl(240 5% 34%); background-color: hsl(240 5% 26%); } -[data-kb-theme="dark"] .radio__control[data-checked] { +[data-theme*="dark"] .radio__control[data-checked] { border-color: hsl(200 98% 39%); background-color: hsl(200 98% 39%); color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .radio__control[data-checked][data-invalid] { +[data-theme*="dark"] .radio__control[data-checked][data-invalid] { border-color: hsl(0 72% 51%); background-color: hsl(0 72% 51%); color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .radio__indicator { +[data-theme*="dark"] .radio__indicator { background-color: hsl(240 4% 16%); } -[data-kb-theme="dark"] .radio__label { +[data-theme*="dark"] .radio__label { color: hsl(240 5% 84%); } diff --git a/apps/docs/src/examples/radio-group.tsx b/apps/docs/src/examples/radio-group.tsx index 316956c9..a1856893 100644 --- a/apps/docs/src/examples/radio-group.tsx +++ b/apps/docs/src/examples/radio-group.tsx @@ -1,8 +1,9 @@ -import { RadioGroup } from "@kobalte/core/radio-group"; import { For, createSignal } from "solid-js"; import style from "./radio-group.module.css"; +import { RadioGroup } from "@kobalte/core/radio-group"; + export function BasicExample() { return ( @@ -82,7 +83,15 @@ export function ControlledExample() {
-

Your favorite fruit is: {value()}.

+

+ Your favorite fruit is: {value()}. +

); } @@ -166,7 +175,12 @@ export function HTMLFormExample() { @@ -188,7 +202,7 @@ export function HTMLFormExample() {
-
+
diff --git a/apps/docs/src/examples/rating.module.css b/apps/docs/src/examples/rating.module.css index ef021968..47fb517d 100644 --- a/apps/docs/src/examples/rating.module.css +++ b/apps/docs/src/examples/rating.module.css @@ -37,7 +37,7 @@ outline: none; } -[data-kb-theme="dark"] .rating-item { +[data-theme*="dark"] .rating-item { fill: hsl(240 5% 26%); } @@ -49,14 +49,14 @@ fill: hsl(240 6% 90%); } -[data-kb-theme="dark"] .half-star-icon > path + path { +[data-theme*="dark"] .half-star-icon > path + path { fill: hsl(240 5% 26%); } -[data-kb-theme="dark"] .rating__label { +[data-theme*="dark"] .rating__label { color: hsl(240 5% 84%); } -[data-kb-theme="dark"] .rating__description { +[data-theme*="dark"] .rating__description { color: hsl(240 5% 65%); } diff --git a/apps/docs/src/examples/rating.tsx b/apps/docs/src/examples/rating.tsx index d0261653..93698623 100644 --- a/apps/docs/src/examples/rating.tsx +++ b/apps/docs/src/examples/rating.tsx @@ -1,8 +1,9 @@ import { Index, createSignal } from "solid-js"; -import { Rating } from "../../../../packages/core/src/rating"; import style from "./rating.module.css"; +import { Rating } from "@kobalte/core/rating"; + export function BasicExample() { return ( @@ -58,7 +59,15 @@ export function ControlledExample() { -

Your rating is: {value()}/5

+

+ Your rating is: {value()}/5 +

); } @@ -148,7 +157,12 @@ export function HTMLFormExample() { @@ -164,7 +178,7 @@ export function HTMLFormExample() { -
+
diff --git a/apps/docs/src/examples/search.module.css b/apps/docs/src/examples/search.module.css index 2513e9b1..052f814d 100644 --- a/apps/docs/src/examples/search.module.css +++ b/apps/docs/src/examples/search.module.css @@ -196,41 +196,41 @@ } } -[data-kb-theme="dark"] .search__control { +[data-theme*="dark"] .search__control { background-color: hsl(240 4% 16%); border: 1px solid hsl(240 5% 34%); color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .search__control:hover { +[data-theme*="dark"] .search__control:hover { border-color: hsl(240 4% 46%); } -[data-kb-theme="dark"] .search__input::placeholder { +[data-theme*="dark"] .search__input::placeholder { color: hsl(0 100% 100% / 0.5); } -[data-kb-theme="dark"] .search__indicator { +[data-theme*="dark"] .search__indicator { background: hsl(240 5% 26%); border-right: 1px solid hsl(240 5% 34%); color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .search__content { +[data-theme*="dark"] .search__content { border: 1px solid hsl(240 5% 26%); background-color: hsl(240 4% 16%); box-shadow: none; } -[data-kb-theme="dark"] .search__section { +[data-theme*="dark"] .search__section { color: hsl(0 100% 100% / 0.7); } -[data-kb-theme="dark"] .search__item { +[data-theme*="dark"] .search__item { color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .search__description { +[data-theme*="dark"] .search__description { color: hsl(0 100% 100% / 0.7); } @@ -283,13 +283,13 @@ color: hsl(240 4% 46%); } -[data-kb-theme="dark"] .search__control_inline { +[data-theme*="dark"] .search__control_inline { background-color: hsl(240 4% 16%); border: 1px solid hsl(240 5% 34%); color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .search__content_inline { +[data-theme*="dark"] .search__content_inline { background-color: hsl(240 4% 16%); border: 1px solid hsl(240 5% 34%); } diff --git a/apps/docs/src/examples/search.tsx b/apps/docs/src/examples/search.tsx index 6c58ebc1..be7fc843 100644 --- a/apps/docs/src/examples/search.tsx +++ b/apps/docs/src/examples/search.tsx @@ -1,6 +1,5 @@ import MiniSearch from "minisearch"; import { createSignal } from "solid-js"; -import { Search } from "../../../../packages/core/src/search"; import { MagnifyingGlassIcon, ReloadIcon } from "../components"; import style from "./search.module.css"; @@ -550,6 +549,8 @@ const queryEmojiData = (query: string, numSuggestions = 20) => { .slice(0, numSuggestions) as never as EmojiDatum[]; }; +import { Search } from "@kobalte/core/search"; + export function BasicExample() { const [options, setOptions] = createSignal([]); const [emoji, setEmoji] = createSignal(); diff --git a/apps/docs/src/examples/segmented-control.module.css b/apps/docs/src/examples/segmented-control.module.css index 34ecaf9f..caf9347b 100644 --- a/apps/docs/src/examples/segmented-control.module.css +++ b/apps/docs/src/examples/segmented-control.module.css @@ -16,7 +16,7 @@ --indicator-focus-shadow-color: hsl(200 98% 39%); } -[data-kb-theme="dark"] .segmented-control { +[data-theme*="dark"] .segmented-control { --border-color: hsl(240 6% 26%); --border-active-color: hsl(240 6% 41%); --label-color: hsl(240 5% 84%); diff --git a/apps/docs/src/examples/segmented-control.tsx b/apps/docs/src/examples/segmented-control.tsx index ca0a2471..fb05e1e4 100644 --- a/apps/docs/src/examples/segmented-control.tsx +++ b/apps/docs/src/examples/segmented-control.tsx @@ -1,8 +1,9 @@ -import { SegmentedControl } from "@kobalte/core/segmented-control"; import { For, createSignal } from "solid-js"; import style from "./segmented-control.module.css"; +import { SegmentedControl } from "@kobalte/core/segmented-control"; + export function BasicExample() { return ( @@ -115,7 +116,15 @@ export function ControlledExample() {
-

Your favorite fruit is: {value()}.

+

+ Your favorite fruit is: {value()}. +

); } @@ -223,7 +232,12 @@ export function HTMLFormExample() {
-
+
diff --git a/apps/docs/src/examples/select.module.css b/apps/docs/src/examples/select.module.css index efdb84ca..5206ed3d 100644 --- a/apps/docs/src/examples/select.module.css +++ b/apps/docs/src/examples/select.module.css @@ -162,39 +162,39 @@ } } -[data-kb-theme="dark"] .select__trigger { +[data-theme*="dark"] .select__trigger { background-color: hsl(240 4% 16%); border: 1px solid hsl(240 5% 34%); color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .select__trigger:hover { +[data-theme*="dark"] .select__trigger:hover { border-color: hsl(240 4% 46%); } -[data-kb-theme="dark"] .select__trigger[data-invalid] { +[data-theme*="dark"] .select__trigger[data-invalid] { border-color: hsl(0 72% 51%); color: hsl(0 72% 51%); } -[data-kb-theme="dark"] .select__value[data-placeholder-shown] { +[data-theme*="dark"] .select__value[data-placeholder-shown] { color: hsl(0 100% 100% / 0.5); } -[data-kb-theme="dark"] .select__content { +[data-theme*="dark"] .select__content { border: 1px solid hsl(240 5% 26%); background-color: hsl(240 4% 16%); box-shadow: none; } -[data-kb-theme="dark"] .select__section { +[data-theme*="dark"] .select__section { color: hsl(0 100% 100% / 0.7); } -[data-kb-theme="dark"] .select__item { +[data-theme*="dark"] .select__item { color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .select__description { +[data-theme*="dark"] .select__description { color: hsl(0 100% 100% / 0.7); } diff --git a/apps/docs/src/examples/select.tsx b/apps/docs/src/examples/select.tsx index d881ff92..9907ec75 100644 --- a/apps/docs/src/examples/select.tsx +++ b/apps/docs/src/examples/select.tsx @@ -1,4 +1,3 @@ -import { Select } from "@kobalte/core/select"; import { createVirtualizer } from "@tanstack/solid-virtual"; import { For, createSignal } from "solid-js"; @@ -7,6 +6,8 @@ import style from "./select.module.css"; const STRING_OPTIONS = ["Apple", "Banana", "Blueberry", "Grapes", "Pineapple"]; +import { Select } from "@kobalte/core/select"; + export function BasicExample() { return ( -

Your favorite fruit is: {value()}.

+

+ Your favorite fruit is: {value()}. +

); } @@ -197,7 +206,12 @@ export function HTMLFormExample() { -
+
@@ -382,20 +396,43 @@ export function MultipleSelectionExample() { class={style.select__value}> {(state) => ( <> -
+
{(option) => ( e.stopPropagation()} > {option} )} @@ -405,9 +442,17 @@ export function MultipleSelectionExample() { type="button" onPointerDown={(e) => e.stopPropagation()} onClick={state.clear} - class="ml-auto mr-2 rounded-full hover:bg-zinc-100 dark:hover:bg-zinc-600 p-1" + style={{ + "margin-left": "auto", + "margin-right": "8px", + "border-radius": "9999px", + padding: "4px", + cursor: "pointer", + background: "none", + border: "none", + }} > - + )} @@ -422,7 +467,13 @@ export function MultipleSelectionExample() { -

+

Your favorite fruits are: {values().join(", ")}.

diff --git a/apps/docs/src/examples/separator.module.css b/apps/docs/src/examples/separator.module.css index 7abcedb2..702f6958 100644 --- a/apps/docs/src/examples/separator.module.css +++ b/apps/docs/src/examples/separator.module.css @@ -8,6 +8,6 @@ width: 100%; } -[data-kb-theme="dark"] .separator { +[data-theme*="dark"] .separator { background-color: hsl(240 5% 26%); } diff --git a/apps/docs/src/examples/separator.tsx b/apps/docs/src/examples/separator.tsx index df7439f2..077bb02e 100644 --- a/apps/docs/src/examples/separator.tsx +++ b/apps/docs/src/examples/separator.tsx @@ -1,10 +1,10 @@ -import { Separator } from "@kobalte/core/separator"; - import style from "./separator.module.css"; +import { Separator } from "@kobalte/core/separator"; + export function BasicExample() { return ( -
+
Content above Content below diff --git a/apps/docs/src/examples/skeleton.tsx b/apps/docs/src/examples/skeleton.tsx index 2cd54cd6..389437a9 100644 --- a/apps/docs/src/examples/skeleton.tsx +++ b/apps/docs/src/examples/skeleton.tsx @@ -1,10 +1,11 @@ import { Image } from "@kobalte/core/image"; -import { Skeleton } from "@kobalte/core/skeleton"; import { ToggleButton } from "@kobalte/core/toggle-button"; import { createSignal } from "solid-js"; import style from "./skeleton.module.css"; +import { Skeleton } from "@kobalte/core/skeleton"; + export function BasicExample() { return ( @@ -23,7 +24,7 @@ export function MultipleSkeletonsExample() { diff --git a/apps/docs/src/examples/slider.module.css b/apps/docs/src/examples/slider.module.css index 7e817648..4079b4b1 100644 --- a/apps/docs/src/examples/slider.module.css +++ b/apps/docs/src/examples/slider.module.css @@ -66,6 +66,6 @@ justify-content: space-between; } -[data-kb-theme="dark"] .SliderTrack { +[data-theme*="dark"] .SliderTrack { background-color: hsl(240 5% 26%); } diff --git a/apps/docs/src/examples/slider.tsx b/apps/docs/src/examples/slider.tsx index e5ba9c7c..943333b4 100644 --- a/apps/docs/src/examples/slider.tsx +++ b/apps/docs/src/examples/slider.tsx @@ -1,7 +1,8 @@ -import { Slider } from "@kobalte/core/slider"; import { createSignal } from "solid-js"; import style from "./slider.module.css"; +import { Slider } from "@kobalte/core/slider"; + export function BasicExample() { return ( @@ -41,7 +42,7 @@ export function MultipleThumbsExample() { export function StepExample() { return ( -
+
Step size 8 diff --git a/apps/docs/src/examples/switch.module.css b/apps/docs/src/examples/switch.module.css index 795a21c4..005e6bdf 100644 --- a/apps/docs/src/examples/switch.module.css +++ b/apps/docs/src/examples/switch.module.css @@ -62,28 +62,28 @@ user-select: none; } -[data-kb-theme="dark"] .switch__control { +[data-theme*="dark"] .switch__control { border-color: hsl(240 5% 34%); background-color: hsl(240 5% 26%); } -[data-kb-theme="dark"] .switch__control[data-checked] { +[data-theme*="dark"] .switch__control[data-checked] { border-color: hsl(200 98% 39%); background-color: hsl(200 98% 39%); } -[data-kb-theme="dark"] .switch__control[data-invalid] { +[data-theme*="dark"] .switch__control[data-invalid] { border-color: hsl(0 72% 51%); } -[data-kb-theme="dark"] .switch__thumb { +[data-theme*="dark"] .switch__thumb { background-color: hsl(240 5% 84%); } -[data-kb-theme="dark"] .switch__label { +[data-theme*="dark"] .switch__label { color: hsl(240 5% 84%); } -[data-kb-theme="dark"] .switch__description { +[data-theme*="dark"] .switch__description { color: hsl(240 5% 65%); } diff --git a/apps/docs/src/examples/switch.tsx b/apps/docs/src/examples/switch.tsx index e756cde2..f2427567 100644 --- a/apps/docs/src/examples/switch.tsx +++ b/apps/docs/src/examples/switch.tsx @@ -1,8 +1,9 @@ -import { Switch } from "@kobalte/core/switch"; import { createSignal } from "solid-js"; import style from "./switch.module.css"; +import { Switch } from "@kobalte/core/switch"; + export function BasicExample() { return ( @@ -39,7 +40,9 @@ export function ControlledExample() { -

+

Airplane mode is {checked() ? "active" : "inactive"}.

@@ -49,7 +52,14 @@ export function ControlledExample() { export function DescriptionExample() { return ( -
+
Airplane mode Disable all network connections. @@ -73,7 +83,14 @@ export function ErrorMessageExample() { onChange={setChecked} validationState={!checked() ? "invalid" : "valid"} > -
+
Airplane mode You must enable airplane mode. @@ -103,7 +120,12 @@ export function HTMLFormExample() { Airplane mode @@ -112,7 +134,7 @@ export function HTMLFormExample() { -
+
diff --git a/apps/docs/src/examples/tabs.module.css b/apps/docs/src/examples/tabs.module.css index b351303a..43ae4dad 100644 --- a/apps/docs/src/examples/tabs.module.css +++ b/apps/docs/src/examples/tabs.module.css @@ -63,18 +63,18 @@ padding: 16px; } -[data-kb-theme="dark"] .tabs__list { +[data-theme*="dark"] .tabs__list { border-color: hsl(240 5% 26%); } -[data-kb-theme="dark"] .tabs__trigger { +[data-theme*="dark"] .tabs__trigger { color: rgb(255 255 255 / 0.9); } -[data-kb-theme="dark"] .tabs__trigger:hover { +[data-theme*="dark"] .tabs__trigger:hover { background-color: hsl(240 4% 16%); } -[data-kb-theme="dark"] .tabs__trigger:focus-visible { +[data-theme*="dark"] .tabs__trigger:focus-visible { background-color: hsl(240 4% 16%); } diff --git a/apps/docs/src/examples/tabs.tsx b/apps/docs/src/examples/tabs.tsx index 96e1b712..a0cf9416 100644 --- a/apps/docs/src/examples/tabs.tsx +++ b/apps/docs/src/examples/tabs.tsx @@ -1,8 +1,9 @@ -import { Tabs } from "@kobalte/core/tabs"; import { For, createSignal } from "solid-js"; import style from "./tabs.module.css"; +import { Tabs } from "@kobalte/core/tabs"; + export function BasicExample() { return ( @@ -114,7 +115,11 @@ export function ControlledExample() { Contact details -

Selected tab: {selectedTab()}

+

+ Selected tab: {selectedTab()} +

); } @@ -139,7 +144,15 @@ export function FocusableContentExample() { @@ -182,17 +195,44 @@ export function DynamicContentExample() { return ( <> -
+
diff --git a/apps/docs/src/examples/time-field.module.css b/apps/docs/src/examples/time-field.module.css index 3fccb4d3..a328a823 100644 --- a/apps/docs/src/examples/time-field.module.css +++ b/apps/docs/src/examples/time-field.module.css @@ -67,11 +67,11 @@ user-select: none; } -[data-kb-theme="dark"] .time-field__label { +[data-theme*="dark"] .time-field__label { color: hsl(240 5% 84%); } -[data-kb-theme="dark"] .time-field__field { +[data-theme*="dark"] .time-field__field { background-color: hsl(240 4% 16%); border: 1px solid hsl(240 5% 34%); color: hsl(0 100% 100% / 0.9); @@ -82,10 +82,10 @@ outline-color: hsl(0 72% 51%); } -[data-kb-theme="dark"] .time-field__segment[data-placeholder] { +[data-theme*="dark"] .time-field__segment[data-placeholder] { color: hsl(0 100% 100% / 0.5); } -[data-kb-theme="dark"] .time-field__description { +[data-theme*="dark"] .time-field__description { color: hsl(240 5% 65%); } diff --git a/apps/docs/src/examples/time-field.tsx b/apps/docs/src/examples/time-field.tsx index 94f4bc0e..d7f7146d 100644 --- a/apps/docs/src/examples/time-field.tsx +++ b/apps/docs/src/examples/time-field.tsx @@ -1,7 +1,8 @@ import { Show, createSignal } from "solid-js"; -import { TimeField } from "../../../../packages/core/src/time-field"; import style from "./time-field.module.css"; +import { TimeField } from "@kobalte/core/time-field"; + export function BasicExample() { return ( @@ -57,7 +58,13 @@ export function ControlledValueExample() { )} -

+

Selected time:{" "} {JSON.stringify(value())} @@ -197,7 +204,12 @@ export function HTMLFormExample() { @@ -210,7 +222,7 @@ export function HTMLFormExample() { -

+
diff --git a/apps/docs/src/examples/toast.module.css b/apps/docs/src/examples/toast.module.css index 42dfc51f..c34f44e4 100644 --- a/apps/docs/src/examples/toast.module.css +++ b/apps/docs/src/examples/toast.module.css @@ -135,24 +135,24 @@ } } -[data-kb-theme="dark"] .toast { +[data-theme*="dark"] .toast { border: 1px solid hsl(240 5% 26%); background-color: hsl(240 4% 16%); box-shadow: none; } -[data-kb-theme="dark"] .toast__close-button { +[data-theme*="dark"] .toast__close-button { color: hsl(0 100% 100% / 0.8); } -[data-kb-theme="dark"] .toast__title { +[data-theme*="dark"] .toast__title { color: hsl(0 100% 100% / 0.9); } -[data-kb-theme="dark"] .toast__description { +[data-theme*="dark"] .toast__description { color: hsl(0 100% 100% / 0.7); } -[data-kb-theme="dark"] .toast__progress-track { +[data-theme*="dark"] .toast__progress-track { background-color: hsl(240 5% 26%); } diff --git a/apps/docs/src/examples/toast.tsx b/apps/docs/src/examples/toast.tsx index 3f37761d..6068c06c 100644 --- a/apps/docs/src/examples/toast.tsx +++ b/apps/docs/src/examples/toast.tsx @@ -1,8 +1,8 @@ -import { Toast, toaster } from "@kobalte/core/toast"; - import { CrossIcon } from "../components"; import style from "./toast.module.css"; +import { Toast, toaster } from "@kobalte/core/toast"; + export function BasicExample() { let id: number; @@ -53,7 +53,7 @@ export function BasicExample() { }; return ( -
+
@@ -96,7 +96,7 @@ export function MultipleRegionsExample() { }; return ( -
+
- {local.children} - - ); - }, - table: (props: ComponentProps<"table">) => { - const [local, others] = splitProps(props, ["class"]); - - return ( -
- - - ); - }, - a: (props: ComponentProps<"a">) => { - return ; - }, -}; diff --git a/apps/docs/src/model/navigation.ts b/apps/docs/src/model/navigation.ts deleted file mode 100644 index d981d5a4..00000000 --- a/apps/docs/src/model/navigation.ts +++ /dev/null @@ -1,10 +0,0 @@ -interface NavLink { - title: string; - href: string; - status?: "new" | "updated" | "unreleased"; -} - -export interface NavSection { - title: string; - links: NavLink[]; -} diff --git a/apps/docs/src/root.css b/apps/docs/src/root.css deleted file mode 100644 index 36dc7b3c..00000000 --- a/apps/docs/src/root.css +++ /dev/null @@ -1,751 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -@font-face { - font-family: "Lexend"; - font-style: normal; - font-weight: 100 900; - font-display: swap; - src: url("/fonts/lexend.woff2") format("woff2"); -} -@font-face { - font-family: "Inter"; - font-weight: 100 900; - font-display: block; - font-style: normal; - font-named-instance: "Regular"; - src: url("/fonts/Inter-roman.var.woff2") format("woff2"); -} -@font-face { - font-family: "Inter"; - font-weight: 100 900; - font-display: block; - font-style: italic; - font-named-instance: "Italic"; - src: url("/fonts/Inter-italic.var.woff2") format("woff2"); -} - -@layer base { - /* Hide scrollbar for Chrome, Safari and Opera */ - .hide-scrollbar::-webkit-scrollbar { - display: none; - } - - /* Hide scrollbar for IE, Edge and Firefox */ - .hide-scrollbar { - -ms-overflow-style: none; /* IE and Edge */ - scrollbar-width: none; /* Firefox */ - } - - .kb-button { - appearance: none; - display: inline-flex; - justify-content: center; - align-items: center; - height: 40px; - width: auto; - outline: none; - border: 1px solid hsl(240 5% 84%); - border-radius: 6px; - padding: 0 16px; - background-color: transparent; - color: hsl(240 6% 10%); - font-size: 16px; - line-height: 0; - transition: background-color; - } - - .kb-button:disabled { - opacity: 0.5; - cursor: not-allowed; - } - - .kb-button:hover { - background-color: hsl(0 0% 98%); - } - - .kb-button:focus-visible { - outline: 2px solid hsl(200 98% 39%); - outline-offset: 2px; - } - - .kb-button:active { - background-color: hsl(240 6% 90%); - } - - [data-kb-theme="dark"] .kb-button { - border-color: transparent; - background-color: hsl(240 4% 16%); - color: hsla(0 100% 100% / 0.9); - } - - [data-kb-theme="dark"] .kb-button:hover { - background-color: hsl(240 5% 34%); - } - - [data-kb-theme="dark"] .kb-button:active { - background-color: hsl(240 4% 46%); - } - - .kb-button-primary { - appearance: none; - display: inline-flex; - justify-content: center; - align-items: center; - height: 40px; - width: auto; - outline: none; - border-radius: 6px; - padding: 0 16px; - background-color: hsl(200 98% 39%); - color: white; - font-size: 16px; - line-height: 0; - transition: 250ms background-color; - } - - .kb-button-primary:hover { - background-color: hsl(201 96% 32%); - } - - .kb-button-primary:focus-visible { - outline: 2px solid hsl(200 98% 39%); - outline-offset: 2px; - } - - .kb-button-primary:active { - background-color: hsl(201 90% 27%); - } - - [data-kb-theme="dark"] .kb-button-primary { - background-color: hsl(201 96% 32%); - color: hsla(0 100% 100% / 0.9); - } - - [data-kb-theme="dark"] .kb-button-primary:hover { - background-color: hsl(200 98% 39%); - } - - [data-kb-theme="dark"] .kb-button-primary:active { - background-color: hsl(199 89% 48%); - } - - .kb-table .kb-code { - @apply bg-transparent dark:bg-transparent p-0 text-sky-700; - } - - .kb-tabs-snippets pre.shiki { - margin: 0; - border: none; - border-top-right-radius: 0; - border-top-left-radius: 0; - } - - .kb-preview + .kb-tabs-snippets { - margin: 0; - border-top: none; - border-top-right-radius: 0; - border-top-left-radius: 0; - } -} - -/* ------------------------------------------------------------------------------------------------- - * DocSearch - * Credit: https://github.com/vuejs/vitepress/blob/83ce1b8c5e95d2e29e733d9312f514d725fe7f0b/src/client/theme-default/components/VPNavBarSearch.vue - * -----------------------------------------------------------------------------------------------*/ - -:root { - --kb-docsearch-text-light-1: rgba(60, 60, 67); - --kb-docsearch-text-light-2: rgba(60, 60, 67, 0.75); - --kb-docsearch-text-dark-1: rgba(255, 255, 245, 0.86); - --kb-docsearch-text-dark-2: rgba(235, 235, 245, 0.6); - --kb-docsearch-bg: #ffffff; - --kb-docsearch-bg-soft: #f6f6f7; - --kb-docsearch-bg-soft-mute: #e3e3e5; - --kb-docsearch-bg-alt: #f6f6f7; - --kb-docsearch-divider: rgba(60, 60, 67, 0.12); - --kb-docsearch-text-1: var(--kb-docsearch-text-light-1); - --kb-docsearch-text-2: var(--kb-docsearch-text-light-2); - --kb-docsearch-brand: #0284c7; -} - -[data-kb-theme="dark"] { - --kb-docsearch-bg: #1e1e20; - --kb-docsearch-bg-soft: #252529; - --kb-docsearch-bg-soft-mute: #313136; - --kb-docsearch-bg-alt: #27272a; - --kb-docsearch-divider: rgba(82, 82, 89, 0.32); - --kb-docsearch-text-1: var(--kb-docsearch-text-dark-1); - --kb-docsearch-text-2: var(--kb-docsearch-text-dark-2); -} - -.DocSearch { - --docsearch-primary-color: var(--kb-docsearch-brand); - --docsearch-highlight-color: var(--docsearch-primary-color); - --docsearch-text-color: var(--kb-docsearch-text-1); - --docsearch-muted-color: var(--kb-docsearch-text-2); - --docsearch-searchbox-shadow: none; - --docsearch-searchbox-focus-background: transparent; - --docsearch-key-gradient: transparent; - --docsearch-key-shadow: none; - --docsearch-modal-background: var(--kb-docsearch-bg-soft); - --docsearch-footer-background: var(--kb-docsearch-bg); -} - -[data-kb-theme="dark"] .DocSearch { - --docsearch-modal-shadow: none; - --docsearch-footer-shadow: none; - --docsearch-logo-color: var(--kb-docsearch-text-2); - --docsearch-hit-background: var(--kb-docsearch-bg-soft-mute); - --docsearch-hit-color: var(--kb-docsearch-text-2); - --docsearch-hit-shadow: none; -} - -.DocSearch-Button { - display: flex; - justify-content: center; - align-items: center; - margin: 0; - padding: 0; - width: 32px; - height: 40px; - background: transparent; - transition: border-color 0.25s; -} - -.DocSearch-Button:hover { - background: transparent; -} - -.DocSearch-Button:focus { - outline: 1px dotted; - outline: 5px auto -webkit-focus-ring-color; -} - -.DocSearch-Button:focus:not(:focus-visible) { - outline: none !important; -} - -@media (min-width: 768px) { - .DocSearch-Button.DocSearch-Button { - justify-content: flex-start; - border: 1px solid transparent; - border-radius: 8px; - padding: 0 10px 0 12px; - width: 100%; - height: 40px; - background-color: var(--kb-docsearch-bg-alt); - } - - .DocSearch-Button:hover { - border-color: var(--kb-docsearch-brand); - background: var(--kb-docsearch-bg-alt); - } -} - -.DocSearch-Button .DocSearch-Button-Container { - display: flex; - align-items: center; -} - -.DocSearch-Button .DocSearch-Search-Icon { - position: relative; - width: 16px; - height: 16px; - color: var(--kb-docsearch-text-1); - fill: currentColor; - transition: color 0.5s; -} - -.DocSearch-Button:hover .DocSearch-Search-Icon { - color: var(--kb-docsearch-text-1); -} - -@media (min-width: 768px) { - .DocSearch-Button .DocSearch-Search-Icon { - top: 1px; - margin-right: 8px; - width: 14px; - height: 14px; - color: var(--kb-docsearch-text-2); - } -} - -.DocSearch-Button .DocSearch-Button-Placeholder { - display: none; - margin-top: 2px; - padding: 0 16px 0 0; - font-size: 13px; - font-weight: 500; - color: var(--kb-docsearch-text-2); - transition: color 0.5s; -} - -.DocSearch-Button:hover .DocSearch-Button-Placeholder { - color: var(--kb-docsearch-text-1); -} - -@media (min-width: 768px) { - .DocSearch-Button .DocSearch-Button-Placeholder { - display: inline-block; - } -} - -.DocSearch-Button .DocSearch-Button-Keys { - /*rtl:ignore*/ - direction: ltr; - display: none; - min-width: auto; -} - -@media (min-width: 768px) { - .DocSearch-Button .DocSearch-Button-Keys { - display: flex; - align-items: center; - } -} - -.DocSearch-Button .DocSearch-Button-Key { - @apply font-sans; - display: block; - margin: 2px 0 0 0; - border: 1px solid var(--kb-docsearch-divider); - /*rtl:begin:ignore*/ - border-right: none; - border-radius: 4px 0 0 4px; - padding-left: 6px; - /*rtl:end:ignore*/ - min-width: 0; - width: auto; - height: 22px; - line-height: 22px; - font-size: 12px; - font-weight: 500; - transition: - color 0.5s, - border-color 0.5s; -} - -.DocSearch-Button .DocSearch-Button-Key + .DocSearch-Button-Key { - /*rtl:begin:ignore*/ - border-right: 1px solid var(--kb-docsearch-divider); - border-left: none; - border-radius: 0 4px 4px 0; - padding-left: 2px; - padding-right: 6px; - /*rtl:end:ignore*/ -} -.DocSearch-Button .DocSearch-Button-Key:first-child { - font-size: 1px; - letter-spacing: -12px; - color: transparent; -} - -.DocSearch-Button .DocSearch-Button-Key:first-child:after { - content: "⌘"; - font-size: 12px; - letter-spacing: normal; - color: var(--docsearch-muted-color); -} - -.DocSearch-Button .DocSearch-Button-Key:first-child > * { - display: none; -} - -[data-kb-theme="dark"] .DocSearch-Footer { - border-top: 1px solid var(--kb-docsearch-divider); -} - -.DocSearch-Form { - border: 1px solid var(--kb-docsearch-brand); - background-color: #fff; -} - -[data-kb-theme="dark"] .DocSearch-Form { - background-color: var(--kb-docsearch-bg-soft-mute); -} - -.DocSearch-Screen-Icon > svg { - margin: auto; -} - -/* ------------------------------------------------------------------------------------------------- - * Shiki Twoslash CSS - * -----------------------------------------------------------------------------------------------*/ - -.kb-preview + pre.shiki, -.kb-preview + pre.shiki + pre.shiki { - margin: 0 0 16px 0; - padding: 16px; - border-top: none; - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -pre.shiki .kb-copy-btn { - opacity: 0; -} - -pre.shiki:hover .kb-copy-btn { - opacity: 1; -} - -pre { - /* In theory shiki will overwrite these, but this is to make sure there are defaults regardless */ - background-color: white; - color: black; - - /* Give it some space to breathe */ - padding: 12px; - - /* All code samples get a grey border, twoslash ones get a different color */ - border-left: 1px solid #999; - border-bottom: 1px solid #999; - - margin-top: 1rem; - margin-bottom: 1rem; - - /* Important to allow the code to move horizontally; */ - overflow-x: auto; - position: relative; -} - -[data-kb-theme="light"] .shiki.github-dark { - display: none !important; -} - -[data-kb-theme="dark"] .shiki.github-light { - display: none !important; -} - -pre.shiki { - overflow-x: auto; - - display: flex; - align-items: center; - - border-radius: 8px; - border: 1px solid #e4e4e7; - - background-color: #fafafa !important; - - padding: 12px; - - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", - "Courier New", monospace; -} - -[data-kb-theme="dark"] pre.shiki { - border-color: #3f3f46; - background-color: #27272a !important; -} - -/* Reset mdx-components `code`. */ -pre.shiki code { - font-size: 14px; - border-radius: initial; - background: initial; - padding-inline-start: initial; - padding-inline-end: initial; - padding-top: initial; - padding-bottom: initial; - overflow-wrap: initial; -} - -pre.shiki:hover .dim { - opacity: 1; -} -pre.shiki div.dim { - opacity: 0.7; -} -pre.shiki div.dim, -pre.shiki div.highlight { - margin: 0; - padding: 0; -} -pre.shiki div.highlight { - opacity: 1; - background-color: rgb(224 242 254 / 0.8); -} -[data-kb-theme="dark"] pre.shiki div.highlight { - background-color: rgb(12 74 110 / 0.4); -} -pre.shiki div.line { - min-height: 1rem; -} - -/** Don't show the language identifiers */ -pre.shiki .language-id { - display: none; -} - -/* Visually differentiates twoslash code samples */ -pre.twoslash { - border-color: #719af4; -} - -/** When you mouse over the pre, show the underlines */ -pre.twoslash:hover data-lsp { - border-color: #747474; -} - -/** The tooltip-like which provides the LSP response */ -pre.twoslash data-lsp:hover::before { - content: attr(lsp); - position: absolute; - transform: translate(0, 1rem); - - background-color: #3f3f3f; - color: #fff; - text-align: left; - padding: 5px 8px; - border-radius: 2px; - font-family: - "JetBrains Mono", - Menlo, - Monaco, - Consolas, - Courier New, - monospace; - font-size: 14px; - white-space: pre-wrap; - z-index: 100; -} - -pre .code-container { - overflow: auto; - width: 100%; -} -/* The try button */ -pre .code-container > a { - position: absolute; - right: 8px; - bottom: 8px; - border-radius: 4px; - border: 1px solid #719af4; - padding: 0 8px; - color: #719af4; - text-decoration: none; - opacity: 0; - transition-timing-function: ease; - transition: opacity 0.3s; -} -/* Respect no animations */ -@media (prefers-reduced-motion: reduce) { - pre .code-container > a { - transition: none; - } -} -pre .code-container > a:hover { - color: white; - background-color: #719af4; -} -pre .code-container:hover a { - opacity: 1; -} - -pre code { - font-size: 14px; - font-family: - "JetBrains Mono", - Menlo, - Monaco, - Consolas, - Courier New, - monospace; - white-space: pre; - -webkit-overflow-scrolling: touch; -} -pre code a { - text-decoration: none; -} -pre data-err { - /* Extracted from VS Code */ - background: url("data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%206%203'%20enable-background%3D'new%200%200%206%203'%20height%3D'3'%20width%3D'6'%3E%3Cg%20fill%3D'%23c94824'%3E%3Cpolygon%20points%3D'5.5%2C0%202.5%2C3%201.1%2C3%204.1%2C0'%2F%3E%3Cpolygon%20points%3D'4%2C0%206%2C2%206%2C0.6%205.4%2C0'%2F%3E%3Cpolygon%20points%3D'0%2C2%201%2C3%202.4%2C3%200%2C0.6'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E") - repeat-x bottom left; - padding-bottom: 3px; -} -pre .query { - margin-bottom: 10px; - color: #137998; - display: inline-block; -} - -/* In order to have the 'popped out' style design and to not break the layout - /* we need to place a fake and un-selectable copy of the error which _isn't_ broken out - /* behind the actual error message. - /* This sections keeps both of those two in in sync */ - -pre .error, -pre .error-behind { - margin-left: -14px; - margin-top: 8px; - margin-bottom: 4px; - padding: 6px 6px 6px 14px; - width: calc(100% - 20px); - white-space: pre-wrap; - display: block; -} -pre .error { - position: absolute; - background-color: #fee; - border-left: 2px solid #bf1818; - /* Give the space to the error code */ - display: flex; - align-items: center; - color: black; -} -pre .error .code { - display: none; -} -pre .error-behind { - user-select: none; - visibility: transparent; - color: #fee; -} -/* Queries */ -pre .arrow { - /* Transparent background */ - background-color: #eee; - position: relative; - top: -7px; - margin-left: 0.1rem; - /* Edges */ - border-left: 1px solid #eee; - border-top: 1px solid #eee; - transform: translateY(25%) rotate(45deg); - /* Size */ - height: 8px; - width: 8px; -} -pre .popover { - margin-bottom: 10px; - background-color: #eee; - display: inline-block; - padding: 0 0.5rem 0.3rem; - margin-top: 10px; - border-radius: 3px; -} -/* Completion */ -pre .inline-completions ul.dropdown { - display: inline-block; - position: absolute; - width: 240px; - background-color: gainsboro; - color: grey; - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", - "Courier New", monospace; - font-size: 0.8rem; - margin: 0; - padding: 0; - border-left: 4px solid #4b9edd; -} -pre .inline-completions ul.dropdown::before { - background-color: #4b9edd; - width: 2px; - position: absolute; - top: -1.2rem; - left: -3px; - content: " "; -} -pre .inline-completions ul.dropdown li { - overflow-x: hidden; - padding-left: 4px; - margin-bottom: 4px; -} -pre .inline-completions ul.dropdown li.deprecated { - text-decoration: line-through; -} -pre .inline-completions ul.dropdown li span.result-found { - color: #4b9edd; -} -pre .inline-completions ul.dropdown li span.result { - width: 100px; - color: black; - display: inline-block; -} -.dark-theme .markdown pre { - background-color: #d8d8d8; - border-color: #ddd; - filter: invert(98%) hue-rotate(180deg); -} -data-lsp { - /* Ensures there's no 1px jump when the hover happens */ - border-bottom: 1px dotted transparent; - /* Fades in unobtrusively */ - transition-timing-function: ease; - transition: border-color 0.3s; -} -/* Respect people's wishes to not have animations */ -@media (prefers-reduced-motion: reduce) { - data-lsp { - transition: none; - } -} - -/** Annotations support, providing a tool for meta commentary */ -.tag-container { - position: relative; -} -.tag-container .twoslash-annotation { - position: absolute; - font-family: - "JetBrains Mono", - Menlo, - Monaco, - Consolas, - Courier New, - monospace; - right: -10px; - /** Default annotation text to 200px */ - width: 200px; - color: #187abf; - background-color: #fcf3d9; -} -.tag-container .twoslash-annotation p { - text-align: left; - font-size: 0.8rem; - line-height: 0.9rem; -} -.tag-container .twoslash-annotation svg { - float: left; - margin-left: -44px; -} -.tag-container .twoslash-annotation.left { - right: auto; - left: -200px; -} -.tag-container .twoslash-annotation.left svg { - float: right; - margin-right: -5px; -} - -/** Support for showing console log/warn/errors inline */ -pre .logger { - display: flex; - align-items: center; - color: black; - padding: 6px 6px 6px 8px; - width: calc(100% - 19px); - white-space: pre-wrap; -} -pre .logger svg { - margin-right: 9px; -} -pre .logger.error-log { - background-color: #fee; - border-left: 2px solid #bf1818; -} -pre .logger.warn-log { - background-color: #ffe; - border-left: 2px solid #eae662; -} -pre .logger.log-log { - background-color: #e9e9e9; - border-left: 2px solid #ababab; -} -pre .logger.log-log svg { - margin-left: 6px; - margin-right: 9px; -} diff --git a/apps/docs/src/routes/[...notFound].mdx b/apps/docs/src/routes/[...404].mdx similarity index 100% rename from apps/docs/src/routes/[...notFound].mdx rename to apps/docs/src/routes/[...404].mdx diff --git a/apps/docs/src/routes/docs/changelog.tsx b/apps/docs/src/routes/docs/changelog.tsx deleted file mode 100644 index 667462df..00000000 --- a/apps/docs/src/routes/docs/changelog.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import type { RouteProps } from "@solidjs/router"; - -import { CORE_VERSIONS } from "../../VERSIONS"; -import { Layout } from "../../components"; -import type { NavSection } from "../../model/navigation"; - -const CHANGELOG_NAV_SECTIONS: NavSection[] = [ - { - title: "Changelog", - links: CORE_VERSIONS.map((version) => ({ - title: `v${version}`, - href: `/docs/changelog/${version.replaceAll(".", "-")}`, - })), - }, -]; - -export default function ChangelogLayout(props: RouteProps) { - return {props.children}; -} diff --git a/apps/docs/src/routes/docs/changelog/0-1-x.mdx b/apps/docs/src/routes/docs/changelog/0-1-x.mdx index c6f2fea4..fd99741b 100644 --- a/apps/docs/src/routes/docs/changelog/0-1-x.mdx +++ b/apps/docs/src/routes/docs/changelog/0-1-x.mdx @@ -1,4 +1,9 @@ -# v0.1.x +--- +title: Changelog v0.1.x +sidebarTitle: v0.1.x +--- + +# {frontmatter.sidebarTitle} ## v0.1.0 (January 04, 2023 - Initial release) diff --git a/apps/docs/src/routes/docs/changelog/0-10-x.mdx b/apps/docs/src/routes/docs/changelog/0-10-x.mdx index 7a84c9f9..d988e3ba 100644 --- a/apps/docs/src/routes/docs/changelog/0-10-x.mdx +++ b/apps/docs/src/routes/docs/changelog/0-10-x.mdx @@ -1,4 +1,9 @@ -# v0.10.x +--- +title: Changelog v0.10.x +sidebarTitle: v0.10.x +--- + +# {frontmatter.sidebarTitle} ## v0.10.0 (August 12, 2023) diff --git a/apps/docs/src/routes/docs/changelog/0-11-x.mdx b/apps/docs/src/routes/docs/changelog/0-11-x.mdx index 3e7ca2c1..8974be49 100644 --- a/apps/docs/src/routes/docs/changelog/0-11-x.mdx +++ b/apps/docs/src/routes/docs/changelog/0-11-x.mdx @@ -1,4 +1,9 @@ -# v0.11.x +--- +title: Changelog v0.11.x +sidebarTitle: v0.11.x +--- + +# {frontmatter.sidebarTitle} ## v0.11.2 (October 21, 2023) diff --git a/apps/docs/src/routes/docs/changelog/0-12-x.mdx b/apps/docs/src/routes/docs/changelog/0-12-x.mdx index 10aad2a2..5dc79039 100644 --- a/apps/docs/src/routes/docs/changelog/0-12-x.mdx +++ b/apps/docs/src/routes/docs/changelog/0-12-x.mdx @@ -1,4 +1,9 @@ -# v0.12.x +--- +title: Changelog v0.12.x +sidebarTitle: v0.12.x +--- + +# {frontmatter.sidebarTitle} ## v0.12.6 (March 16, 2024) diff --git a/apps/docs/src/routes/docs/changelog/0-13-x.mdx b/apps/docs/src/routes/docs/changelog/0-13-x.mdx index 4f79adfd..f75bb1cb 100644 --- a/apps/docs/src/routes/docs/changelog/0-13-x.mdx +++ b/apps/docs/src/routes/docs/changelog/0-13-x.mdx @@ -1,4 +1,9 @@ -# v0.13.x +--- +title: Changelog v0.13.x +sidebarTitle: v0.13.x +--- + +# {frontmatter.sidebarTitle} ## v0.13.12 (July 1, 2026) diff --git a/apps/docs/src/routes/docs/changelog/0-2-x.mdx b/apps/docs/src/routes/docs/changelog/0-2-x.mdx index b8c6b499..144f8502 100644 --- a/apps/docs/src/routes/docs/changelog/0-2-x.mdx +++ b/apps/docs/src/routes/docs/changelog/0-2-x.mdx @@ -1,4 +1,9 @@ -# v0.2.x +--- +title: Changelog v0.2.x +sidebarTitle: v0.2.x +--- + +# {frontmatter.sidebarTitle} ## v0.2.0 (January 13, 2023) diff --git a/apps/docs/src/routes/docs/changelog/0-3-x.mdx b/apps/docs/src/routes/docs/changelog/0-3-x.mdx index 27adfd4e..0c637007 100644 --- a/apps/docs/src/routes/docs/changelog/0-3-x.mdx +++ b/apps/docs/src/routes/docs/changelog/0-3-x.mdx @@ -1,4 +1,9 @@ -# v0.3.x +--- +title: Changelog v0.3.x +sidebarTitle: v0.3.x +--- + +# {frontmatter.sidebarTitle} ## v0.3.1 (January 15, 2023) diff --git a/apps/docs/src/routes/docs/changelog/0-4-x.mdx b/apps/docs/src/routes/docs/changelog/0-4-x.mdx index 708a276c..66461dac 100644 --- a/apps/docs/src/routes/docs/changelog/0-4-x.mdx +++ b/apps/docs/src/routes/docs/changelog/0-4-x.mdx @@ -1,4 +1,9 @@ -# v0.4.x +--- +title: Changelog v0.4.x +sidebarTitle: v0.4.x +--- + +# {frontmatter.sidebarTitle} ## v0.4.0 (January 19, 2023) diff --git a/apps/docs/src/routes/docs/changelog/0-5-x.mdx b/apps/docs/src/routes/docs/changelog/0-5-x.mdx index 2726a8d7..d1963365 100644 --- a/apps/docs/src/routes/docs/changelog/0-5-x.mdx +++ b/apps/docs/src/routes/docs/changelog/0-5-x.mdx @@ -1,4 +1,9 @@ -# v0.5.x +--- +title: Changelog v0.5.x +sidebarTitle: v0.5.x +--- + +# {frontmatter.sidebarTitle} ## v0.5.0 (January 27, 2023) diff --git a/apps/docs/src/routes/docs/changelog/0-6-x.mdx b/apps/docs/src/routes/docs/changelog/0-6-x.mdx index 56c763ac..430296e7 100644 --- a/apps/docs/src/routes/docs/changelog/0-6-x.mdx +++ b/apps/docs/src/routes/docs/changelog/0-6-x.mdx @@ -1,4 +1,9 @@ -# v0.6.x +--- +title: Changelog v0.6.x +sidebarTitle: v0.6.x +--- + +# {frontmatter.sidebarTitle} ## v0.6.2 (February 25, 2023) diff --git a/apps/docs/src/routes/docs/changelog/0-7-x.mdx b/apps/docs/src/routes/docs/changelog/0-7-x.mdx index 70780ef9..4ee5e0e4 100644 --- a/apps/docs/src/routes/docs/changelog/0-7-x.mdx +++ b/apps/docs/src/routes/docs/changelog/0-7-x.mdx @@ -1,4 +1,9 @@ -# v0.7.x +--- +title: Changelog v0.7.x +sidebarTitle: v0.7.x +--- + +# {frontmatter.sidebarTitle} ## v0.7.4 (March 18, 2023) diff --git a/apps/docs/src/routes/docs/changelog/0-8-x.mdx b/apps/docs/src/routes/docs/changelog/0-8-x.mdx index 070669ed..fa8fe294 100644 --- a/apps/docs/src/routes/docs/changelog/0-8-x.mdx +++ b/apps/docs/src/routes/docs/changelog/0-8-x.mdx @@ -1,4 +1,9 @@ -# v0.8.x +--- +title: Changelog v0.8.x +sidebarTitle: v0.8.x +--- + +# {frontmatter.sidebarTitle} ## v0.8.2 (March 30, 2023) diff --git a/apps/docs/src/routes/docs/changelog/0-9-x.mdx b/apps/docs/src/routes/docs/changelog/0-9-x.mdx index 4b12d5a2..7bcdf36d 100644 --- a/apps/docs/src/routes/docs/changelog/0-9-x.mdx +++ b/apps/docs/src/routes/docs/changelog/0-9-x.mdx @@ -1,4 +1,9 @@ -# v0.9.x +--- +title: Changelog v0.9.x +sidebarTitle: v0.9.x +--- + +# {frontmatter.sidebarTitle} ## v0.9.8 (June 29, 2023) diff --git a/apps/docs/src/routes/docs/changelog/index.tsx b/apps/docs/src/routes/docs/changelog/index.tsx index a9711c69..850bcee1 100644 --- a/apps/docs/src/routes/docs/changelog/index.tsx +++ b/apps/docs/src/routes/docs/changelog/index.tsx @@ -1,6 +1,5 @@ import { Navigate } from "@solidjs/router"; -import { LATEST_CORE_CHANGELOG_URL } from "../../../VERSIONS"; export default function () { - return ; + return ; } diff --git a/apps/docs/src/routes/docs/core.tsx b/apps/docs/src/routes/docs/core.tsx deleted file mode 100644 index 6b877769..00000000 --- a/apps/docs/src/routes/docs/core.tsx +++ /dev/null @@ -1,231 +0,0 @@ -import type { RouteProps } from "@solidjs/router"; - -import { Layout } from "../../components"; -import type { NavSection } from "../../model/navigation"; - -const CORE_NAV_SECTIONS: NavSection[] = [ - { - title: "Overview", - links: [ - { - title: "Introduction", - href: "/docs/core/overview/introduction", - }, - { - title: "Getting started", - href: "/docs/core/overview/getting-started", - }, - { - title: "Styling", - href: "/docs/core/overview/styling", - }, - { - title: "Animation", - href: "/docs/core/overview/animation", - }, - { - title: "Polymorphism", - href: "/docs/core/overview/polymorphism", - }, - { - title: "Server side rendering", - href: "/docs/core/overview/ssr", - }, - ], - }, - { - title: "Components", - links: [ - { - title: "Accordion", - href: "/docs/core/components/accordion", - }, - { - title: "Alert", - href: "/docs/core/components/alert", - }, - { - title: "Alert Dialog", - href: "/docs/core/components/alert-dialog", - }, - { - title: "Badge", - href: "/docs/core/components/badge", - }, - { - title: "Breadcrumbs", - href: "/docs/core/components/breadcrumbs", - }, - { - title: "Button", - href: "/docs/core/components/button", - }, - { - title: "Checkbox", - href: "/docs/core/components/checkbox", - }, - { - title: "Collapsible", - href: "/docs/core/components/collapsible", - }, - { - title: "Color Area", - href: "/docs/core/components/color-area", - }, - { - title: "Color Channel Field", - href: "/docs/core/components/color-channel-field", - }, - { - title: "Color Field", - href: "/docs/core/components/color-field", - }, - { - title: "Color Slider", - href: "/docs/core/components/color-slider", - }, - { - title: "Color Swatch", - href: "/docs/core/components/color-swatch", - }, - { - title: "Color Wheel", - href: "/docs/core/components/color-wheel", - }, - { - title: "Combobox", - href: "/docs/core/components/combobox", - }, - { - title: "Context Menu", - href: "/docs/core/components/context-menu", - }, - { - title: "Dialog", - href: "/docs/core/components/dialog", - }, - { - title: "Dropdown Menu", - href: "/docs/core/components/dropdown-menu", - }, - { - title: "File Field", - href: "/docs/core/components/file-field", - }, - { - title: "Hover Card", - href: "/docs/core/components/hover-card", - }, - { - title: "Image", - href: "/docs/core/components/image", - }, - { - title: "Link", - href: "/docs/core/components/link", - }, - { - title: "Menubar", - href: "/docs/core/components/menubar", - }, - { - title: "Meter", - href: "/docs/core/components/meter", - }, - { - title: "Navigation Menu", - href: "/docs/core/components/navigation-menu", - }, - { - title: "Number Field", - href: "/docs/core/components/number-field", - }, - { - title: "Pagination", - href: "/docs/core/components/pagination", - }, - { - title: "Popover", - href: "/docs/core/components/popover", - }, - { - title: "Progress", - href: "/docs/core/components/progress", - }, - { - title: "Radio Group", - href: "/docs/core/components/radio-group", - }, - { - title: "Rating", - href: "/docs/core/components/rating", - status: "new", - }, - { - title: "Search", - href: "/docs/core/components/search", - }, - { - title: "Segmented Control", - href: "/docs/core/components/segmented-control", - }, - { - title: "Select", - href: "/docs/core/components/select", - }, - { - title: "Separator", - href: "/docs/core/components/separator", - }, - { - title: "Skeleton", - href: "/docs/core/components/skeleton", - }, - { - title: "Slider", - href: "/docs/core/components/slider", - }, - { - title: "Switch", - href: "/docs/core/components/switch", - }, - { - title: "Tabs", - href: "/docs/core/components/tabs", - }, - { - title: "Text Field", - href: "/docs/core/components/text-field", - }, - { - title: "Time Field", - href: "/docs/core/components/time-field", - status: "new", - }, - { - title: "Toast", - href: "/docs/core/components/toast", - }, - { - title: "Toggle Button", - href: "/docs/core/components/toggle-button", - }, - { - title: "Toggle Group", - href: "/docs/core/components/toggle-group", - }, - { - title: "Tooltip", - href: "/docs/core/components/tooltip", - }, - { - title: "I18nProvider", - href: "/docs/core/components/i18n-provider", - }, - ], - }, -]; - -export default function CoreLayout(props: RouteProps) { - return {props.children}; -} diff --git a/apps/docs/src/routes/docs/core/overview/introduction.mdx b/apps/docs/src/routes/docs/core/(0)overview/(0)introduction.mdx similarity index 95% rename from apps/docs/src/routes/docs/core/overview/introduction.mdx rename to apps/docs/src/routes/docs/core/(0)overview/(0)introduction.mdx index a38c87e9..511c4d84 100644 --- a/apps/docs/src/routes/docs/core/overview/introduction.mdx +++ b/apps/docs/src/routes/docs/core/(0)overview/(0)introduction.mdx @@ -1,4 +1,8 @@ -# Introduction +--- +title: Introduction +--- + +# {frontmatter.title} Kobalte is a UI toolkit for building accessible web apps and design systems with SolidJS. It provides a set of low-level UI components and primitives which can be the foundation for your design system implementation. diff --git a/apps/docs/src/routes/docs/core/(0)overview/(1)getting-started.mdx b/apps/docs/src/routes/docs/core/(0)overview/(1)getting-started.mdx new file mode 100644 index 00000000..882e5150 --- /dev/null +++ b/apps/docs/src/routes/docs/core/(0)overview/(1)getting-started.mdx @@ -0,0 +1,129 @@ +--- +title: Getting Started +--- + +import { PopoverDemo } from "../../../../examples/getting-started"; + +# {frontmatter.title} + +## Installation + +Install Kobalte by running: + +```package-install +@kobalte/core +``` + +## Using the components + +The example below demonstrate how to create a Popover component with Kobalte. + +:::preview + + + +--- + +```tsx title="index.tsx" tab +import { Popover } from "@kobalte/core/popover"; +import { CrossIcon } from "some-icon-library"; +import "./style.css"; + +function App() { + + Learn more + + + +
+ About Kobalte + + + +
+ + A UI toolkit for building accessible web apps and design systems with SolidJS. + +
+
+
; +} +``` + +```css title="style.css" tab +.popover__trigger { + appearance: none; + display: inline-flex; + justify-content: center; + align-items: center; + height: 40px; + width: auto; + outline: none; + border: none; + border-radius: 6px; + padding: 0 16px; + background-color: hsl(200 98% 39%); + color: white; + font-size: 16px; + line-height: 0; + transition: 250ms background-color; +} + +.popover__trigger:hover { + background-color: hsl(201 96% 32%); +} + +.popover__trigger:focus-visible { + outline: 2px solid hsl(200 98% 39%); + outline-offset: 2px; +} + +.popover__trigger:active { + background-color: hsl(201 90% 27%); +} + +.popover__content { + z-index: 50; + max-width: min(calc(100vw - 16px), 380px); + border: 1px solid hsl(240 5% 84%); + border-radius: 6px; + padding: 12px; + background-color: white; + box-shadow: + 0 10px 15px -3px rgb(0 0 0 / 0.1), + 0 4px 6px -4px rgb(0 0 0 / 0.1); +} + +.popover__header { + display: flex; + align-items: baseline; + justify-content: space-between; + margin-bottom: 6px; +} + +.popover__close-button { + height: 16px; + width: 16px; + color: hsl(240 5% 34%); +} + +.popover__title { + font-size: 16px; + font-weight: 500; + color: hsl(240 6% 10%); +} + +.popover__description { + font-size: 14px; + color: hsl(240 5% 26%); +} +``` + +::: + +In a few lines of code, we've implemented a fully accessible Popover component that: + +- Adheres to [WAI-ARIA Dialog](https://www.w3.org/WAI/ARIA/apg/patterns/dialogmodal/) design pattern. +- Can be controlled or uncontrolled. +- Optionally render a pointing arrow. +- Has focus fully managed and customizable. diff --git a/apps/docs/src/routes/docs/core/overview/styling.mdx b/apps/docs/src/routes/docs/core/(0)overview/(2)styling.mdx similarity index 52% rename from apps/docs/src/routes/docs/core/overview/styling.mdx rename to apps/docs/src/routes/docs/core/(0)overview/(2)styling.mdx index 220df0e2..10ccbc3c 100644 --- a/apps/docs/src/routes/docs/core/overview/styling.mdx +++ b/apps/docs/src/routes/docs/core/(0)overview/(2)styling.mdx @@ -1,6 +1,8 @@ -import { Callout, TabsSnippets } from "../../../../components"; +--- +title: Styling +--- -# Styling +# {frontmatter.title} Kobalte components are unstyled, allowing you to completely customize the look and feel. Bring your preferred styling solution (vanilla CSS, Tailwind, CSS-in-JS libraries, etc...). @@ -8,48 +10,29 @@ Kobalte components are unstyled, allowing you to completely customize the look a All components and their parts accept a `class` prop. This class will be passed through to the DOM element. You can style a component part by targeting the `class` that you provide. - - - index.tsx - style.css - - - {/* */} - ```tsx - import { Popover as KPopover } from "@kobalte/core"; - import "./style.css"; - - export const Popover = () => { - return ( - - - Open - - - ... - - - ); - }; - ``` - {/* */} - - - - {/* */} - ```css - .popover__trigger { - /* The popover trigger style. */ - } - - .popover__content { - /* The popover content style. */ - } - ``` - {/* */} - - - +```tsx title="index.tsx" tab +import { Popover as KPopover } from "@kobalte/core/popover"; +import "./style.css"; + +export const Popover = () => { + return ( + + Open + ... + + ); +}; +``` + +```css title="style.css" tab +.popover__trigger { + /* The popover trigger style. */ +} + +.popover__content { + /* The popover content style. */ +} +``` ## Styling a state @@ -60,55 +43,21 @@ When a component or its parts can have multiple states, we automatically attach You can style a component state by targeting the `data-*` attributes added by Kobalte. - - - style.css - - - {/* */} - ```css - .popover__trigger[data-disabled] { - /* The popover trigger style when disabled. */ - } - ``` - {/* */} - - +```css title="style.css" +.popover__trigger[data-disabled] { + /* The popover trigger style when disabled. */ +} +``` ## Using the TailwindCSS plugin -If you are using [TailwindCSS](https://tailwindcss.com/), you can use the `@kobalte/tailwindcss` plugin to target Kobalte's `data-*` attributes with modifiers like `ui-expanded:*`. +If you are using [TailwindCSS v3](https://v3.tailwindcss.com/), you can use the `@kobalte/tailwindcss` plugin to target Kobalte's `data-*` attributes with modifiers like `ui-expanded:*`. From Tailwind v4 the plugin is no longer required as data attributes are natively supported, use them directly instead. ### Installation - - - npm - yarn - pnpm - - - {/* */} - ```bash - npm install @kobalte/tailwindcss - ``` - {/* */} - - - {/* */} - ```bash - yarn add @kobalte/tailwindcss - ``` - {/* */} - - - {/* */} - ```bash - pnpm add @kobalte/tailwindcss - ``` - {/* */} - - +```package-install +@kobalte/tailwindcss +``` ### Usage @@ -171,41 +120,15 @@ If you are using [Vanilla Extract](https://vanilla-extract.style/), you can use ### Installation - - - npm - yarn - pnpm - - - {/* */} - ```bash - npm install @kobalte/vanilla-extract - ``` - {/* */} - - - {/* */} - ```bash - yarn add @kobalte/vanilla-extract - ``` - {/* */} - - - {/* */} - ```bash - pnpm add @kobalte/vanilla-extract - ``` - {/* */} - - +```package-install +@kobalte/vanilla-extract +``` ### Usage Use the `componentStateStyles` utility function to create vanilla-extract styles that target `data-*` attributes of Kobalte components. -```ts -// styles.css +```ts title="style.css.ts" import { componentStateStyles } from "@kobalte/vanilla-extract"; import { style } from "@vanilla-extract/css"; @@ -238,9 +161,9 @@ const button = style([ Then apply your styles to the component: -```tsx +```tsx title="MyButton.tsx" import { Button } from "@kobalte/core/button"; -import { button } from "./styles.css"; +import { button } from "./styles.css.ts"; export const MyButton = () => ; ``` @@ -261,3 +184,5 @@ export const PopoverTrigger = (props: ComponentProps) = return ; }; ``` + +Follow the [Polymorphism Guide](./polymorphism) for more advanced type control and additional props. diff --git a/apps/docs/src/routes/docs/core/overview/animation.mdx b/apps/docs/src/routes/docs/core/(0)overview/(3)animation.mdx similarity index 95% rename from apps/docs/src/routes/docs/core/overview/animation.mdx rename to apps/docs/src/routes/docs/core/(0)overview/(3)animation.mdx index 7f3cf0e6..aa0a9d34 100644 --- a/apps/docs/src/routes/docs/core/overview/animation.mdx +++ b/apps/docs/src/routes/docs/core/(0)overview/(3)animation.mdx @@ -1,6 +1,8 @@ -import { Preview } from "../../../../components"; +--- +title: Animation +--- -# Animation +# {frontmatter.title} Kobalte components can be animated with CSS keyframes or your JavaScript animation library of choice. However, there are some caveats noted here in regard to exiting animations with JavaScript animation libraries. diff --git a/apps/docs/src/routes/docs/core/overview/polymorphism.mdx b/apps/docs/src/routes/docs/core/(0)overview/(4)polymorphism.mdx similarity index 93% rename from apps/docs/src/routes/docs/core/overview/polymorphism.mdx rename to apps/docs/src/routes/docs/core/(0)overview/(4)polymorphism.mdx index fb59bb85..ea6a270e 100644 --- a/apps/docs/src/routes/docs/core/overview/polymorphism.mdx +++ b/apps/docs/src/routes/docs/core/(0)overview/(4)polymorphism.mdx @@ -1,6 +1,8 @@ -import { Callout } from "../../../../components/callout.tsx"; +--- +title: Polymorphism +--- -# Polymorphism +# {frontmatter.title} Kobalte components that render a DOM element support polymorphism via the `as` prop. This allows you to change the rendered element or component while preserving behavior, accessibility, and state management. @@ -14,7 +16,7 @@ Polymorphism is useful when you want to: Use `as` with a native element or a custom Solid component. -```tsx {8, 13} +```tsx {9, 14} import { Tabs } from "@kobalte/core/tabs"; import { MyCustomButton } from "./components"; @@ -48,12 +50,12 @@ When using an `as` callback: - Always spread the provided props - Custom props are forwarded **unchanged** -- Kobalte options are _not_ passed +- Kobalte options are **not** passed - Event handlers must be defined on the **parent** Violating these rules can break behavior or accessibility. -```tsx {17} +```tsx {12} import { Tabs } from "@kobalte/core/tabs"; import { MyCustomButton } from "./components"; @@ -84,7 +86,7 @@ In this example: You can use `PolymorphicCallbackProps` to get exact typing for callback props: -```tsx {6-9} +```tsx {7-11} import { Tabs, TabsTriggerOptions, TabsTriggerRenderProps } from "@kobalte/core/tabs"; import { PolymorphicCallbackProps } from "@kobalte/core/polymorphic"; @@ -111,9 +113,9 @@ Custom event handlers defined on a Kobalte component are called _before_ Kobalte ## Component Prop Types - - This section is intended for **library authors** building on top of Kobalte. - +:::warning +This section is intended for **library authors** building on top of Kobalte. +::: Every Kobalte component that renders an element exposes four core types: @@ -192,10 +194,10 @@ function CustomTabsTrigger( } ``` - - When using generics, TypeScript can lose some precision; splitting local props and spreading the - remaining props helps preserve usability. - +:::info +When using generics, TypeScript can lose some precision; splitting local props and spreading the +remaining props helps preserve usability. +::: Note: diff --git a/apps/docs/src/routes/docs/core/(0)overview/(5)ssr.mdx b/apps/docs/src/routes/docs/core/(0)overview/(5)ssr.mdx new file mode 100644 index 00000000..d788827a --- /dev/null +++ b/apps/docs/src/routes/docs/core/(0)overview/(5)ssr.mdx @@ -0,0 +1,15 @@ +--- +title: SSR +--- + +# Server Side Rendering + +Kobalte should work with any SSR for SolidJS, please make sure the environment is correctly setup. + +## Usage with SolidStart + +Kobalte works out of the box with [SolidStart](https://start.solidjs.com/). + +:::info +Kobalte has been tested with `solid-js@1.9.9`, `@solidjs/start@0.6.1`, and `@solidjs/start@2.0.0-alpha.3`. +::: diff --git a/apps/docs/src/routes/docs/core/components/accordion.mdx b/apps/docs/src/routes/docs/core/(1)components/accordion.mdx similarity index 59% rename from apps/docs/src/routes/docs/core/components/accordion.mdx rename to apps/docs/src/routes/docs/core/(1)components/accordion.mdx index 43c0fcb1..7c4ae438 100644 --- a/apps/docs/src/routes/docs/core/components/accordion.mdx +++ b/apps/docs/src/routes/docs/core/(1)components/accordion.mdx @@ -1,4 +1,17 @@ -import { Preview, TabsSnippets, Kbd, Callout } from "../../../../components"; +--- +title: Accordion +badges: + - icon: npm + label: "Since v0.5.0" + - label: "@kobalte/core/accordion" + - icon: source + label: "Source" + url: "https://github.com/kobaltedev/kobalte/tree/main/packages/core/src/accordion" + - icon: aria + label: "Accordion" + url: "https://www.w3.org/WAI/ARIA/apg/patterns/accordion/" +--- + import { BasicExample, DefaultValueExample, @@ -7,7 +20,7 @@ import { AllowMultipleExample, } from "../../../../examples/accordion"; -# Accordion +# {frontmatter.title} A vertically stacked set of interactive headings that each reveal an associated section of content. @@ -51,165 +64,21 @@ The accordion consists of: ## Example - - - - - - - index.tsx - style.css - - {/* */} - - ```tsx - import { Accordion } from "@kobalte/core/accordion"; - import { ChevronDownIcon } from "some-icon-library"; - import "./style.css"; - - function App() { - return ( - - - - - Is it accessible? - - - - -

- Yes. It adheres to the WAI-ARIA design pattern. -

-
-
- - - - - Is it unstyled? - - - - -

- Yes. It's unstyled by default, giving you freedom over the look and feel. -

-
-
- - - - - Can it be animated? - - - - -

- Yes! You can animate the Accordion with CSS or JavaScript. -

-
-
-
- ); - } - ``` - -
- - ```css - .accordion { - border-radius: 6px; - width: 300px; - border: 1px solid hsl(240 5% 84%); - color: hsl(240 4% 16%); - } - - .accordion__item:first-child { - margin-top: 0; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - } - - .accordion__item:last-child { - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - } - - .accordion__item-header { - display: flex; - } - - .accordion__item-trigger { - display: inline-flex; - align-items: center; - justify-content: space-between; - width: 100%; - padding: 14px; - border-bottom: 1px solid hsl(240 5% 84%); - font-weight: 600; - text-align: left; - outline: none; - } - - .accordion__item:last-child .accordion__item-trigger { - border-bottom: none; - } - - .accordion__item-trigger:focus-visible { - z-index: 1; - outline: 2px solid hsl(200 98% 39%); - outline-offset: 2px; +:::preview -} + + +--- + +```tsx title="index.tsx" tab file="../../../../examples/accordion.tsx#L6-L64" + +``` - .accordion__item-trigger-icon { - width: 24px; - height: 24px; - transition: transform 300ms cubic-bezier(0.87, 0, 0.13, 1); - } - - .accordion__item-trigger[data-expanded] > .accordion__item-trigger-icon { - transform: rotate(180deg); - } - - .accordion__item-content { - overflow: hidden; - font-size: 16px; - animation: slideUp 300ms cubic-bezier(0.87, 0, 0.13, 1); - } - - .accordion__item-content[data-expanded] { - animation: slideDown 300ms cubic-bezier(0.87, 0, 0.13, 1); - } - - .accordion__item-content-text { - padding: 16px; - } - - @keyframes slideDown { - from { - height: 0; - } - to { - height: var(--kb-accordion-content-height); - } - } - - @keyframes slideUp { - from { - height: var(--kb-accordion-content-height); - } - to { - height: 0; - } - } - ``` - - - {/* */} -
+```css title="style.css" tab file="../../../../examples/accordion.module.css" + +``` + +::: ## Usage @@ -217,11 +86,13 @@ The accordion consists of: A default expanded item can be provided using the `defaultValue` prop, which should correspond to the `value` prop provided to each accordion item. - - - +:::preview + + + +--- -```tsx {0,2} +```tsx {1,3} {/* ... */} {/* ... */} @@ -229,19 +100,23 @@ A default expanded item can be provided using the `defaultValue` prop, which sho ``` - - The `value` and `defaultValue` props always take a `string[]`. - +::: + +:::info[] +The `value` and `defaultValue` props always take a `string[]`. +::: ### Controlled value Expanded item can be controlled using the `value` prop, paired with the `onChange` event. The `value` prop from the accordion item will be passed into the callback when the item is expanded, allowing you to update state accordingly. - - - +:::preview + + + +--- -```tsx {3,7} +```tsx {4,8} import { createSignal } from "solid-js"; function ControlledExample() { @@ -260,15 +135,19 @@ function ControlledExample() { } ``` +::: + ### Collapsible item By default, accordion items are not collapsible, meaning you can't toggle them from open to close and vice-versa. Use the `collapsible` prop to enable this behavior. - - - +:::preview + + -```tsx {0} +--- + +```tsx {1} {/* ... */} {/* ... */} @@ -276,15 +155,19 @@ By default, accordion items are not collapsible, meaning you can't toggle them f ``` +::: + ### Allow expanding multiple items Use the `multiple` to allow expanding multiple accordion items at the same time. This also make all accordion items collapsible. - - - +:::preview + + -```tsx {0} +--- + +```tsx {1} {/* ... */} {/* ... */} @@ -292,12 +175,13 @@ Use the `multiple` to allow expanding multiple accordion items at the same time. ``` +::: + ### Animating content size We expose the CSS custom properties `--kb-accordion-content-width` and `--kb-accordion-content-height` which you can use to animate the size of the content when it opens/closes. -```css {16,22} -/* style.css */ +```css {16,22} title="style.css" .accordion__item-content { overflow: hidden; font-size: 16px; @@ -384,11 +268,11 @@ We expose the CSS custom properties `--kb-accordion-content-width` and `--kb-acc | Key | Description | | :-------------------------------- | :------------------------------------------------------------------------------------- | -| Space | When focus is on an `Accordion.Trigger` of a collapsed section, expands the section. | -| Enter | When focus is on an `Accordion.Trigger` of a collapsed section, expands the section. | -| Tab | Moves focus to the next focusable element. | -| Shift + Tab | Moves focus to the previous focusable element. | -| ArrowDown | Moves focus to the next `Accordion.Trigger`. | -| ArrowUp | Moves focus to the previous `Accordion.Trigger`. | -| Home | When focus is on an `Accordion.Trigger`, moves focus to the first `Accordion.Trigger`. | -| End | When focus is on an `Accordion.Trigger`, moves focus to the last `Accordion.Trigger`. | +| Space | When focus is on an `Accordion.Trigger` of a collapsed section, expands the section. | +| Enter | When focus is on an `Accordion.Trigger` of a collapsed section, expands the section. | +| Tab | Moves focus to the next focusable element. | +| Shift + Tab | Moves focus to the previous focusable element. | +| ArrowDown | Moves focus to the next `Accordion.Trigger`. | +| ArrowUp | Moves focus to the previous `Accordion.Trigger`. | +| Home | When focus is on an `Accordion.Trigger`, moves focus to the first `Accordion.Trigger`. | +| End | When focus is on an `Accordion.Trigger`, moves focus to the last `Accordion.Trigger`. | diff --git a/apps/docs/src/routes/docs/core/components/alert-dialog.mdx b/apps/docs/src/routes/docs/core/(1)components/alert-dialog.mdx similarity index 65% rename from apps/docs/src/routes/docs/core/components/alert-dialog.mdx rename to apps/docs/src/routes/docs/core/(1)components/alert-dialog.mdx index a9b3b196..e6c11985 100644 --- a/apps/docs/src/routes/docs/core/components/alert-dialog.mdx +++ b/apps/docs/src/routes/docs/core/(1)components/alert-dialog.mdx @@ -1,7 +1,20 @@ -import { Preview, Kbd, TabsSnippets } from "../../../../components"; +--- +title: Alert Dialog +badges: + - icon: npm + label: "Since v0.8.0" + - label: "@kobalte/core/alert-dialog" + - icon: source + label: "Source" + url: "https://github.com/kobaltedev/kobalte/tree/main/packages/core/src/alert-dialog" + - icon: aria + label: "Alert dialog" + url: "https://www.w3.org/WAI/ARIA/apg/patterns/alertdialog/" +--- + import { BasicExample } from "../../../../examples/alert-dialog"; -# Alert Dialog +# {frontmatter.title} A modal dialog that interrupts the user's workflow to communicate an important message and acquire a response. Examples include action confirmation prompts and error message confirmations. The alertdialog role enables assistive technologies and browsers to distinguish alert dialogs from other dialogs so they have the option of giving alert dialogs special treatment, such as playing a system alert sound. @@ -21,7 +34,7 @@ import { AlertDialog } from "@kobalte/core"; - Supports modal and non-modal modes. - Provides screen reader announcements via rendered title and description. - Focus is trapped and scrolling is blocked while it is open. -- Pressing Esc closes the alert dialog. +- Pressing Esc closes the alert dialog. - Can be controlled or uncontrolled. ## Anatomy @@ -53,184 +66,21 @@ The alert dialog consists of: ## Example - - - - - - - index.tsx - style.css - - {/* */} - - ```tsx - import { AlertDialog } from "@kobalte/core/alert-dialog"; - import { CrossIcon } from "some-icon-library"; - import "./style.css"; - - function App() { - return ( - - Open - - -
- -
- Alert Dialog - - - -
- - An Alert Dialog enables assistive technologies and browsers to distinguish alert dialogs from other dialogs so they have the option of giving alert dialogs special treatment, such as playing a system alert sound. - -
-
-
-
- ); - } - ``` - -
- - ```css - .alert-dialog__trigger { - appearance: none; - display: inline-flex; - justify-content: center; - align-items: center; - height: 40px; - width: auto; - outline: none; - border-radius: 6px; - padding: 0 16px; - background-color: hsl(200 98% 39%); - color: white; - font-size: 16px; - line-height: 0; - transition: 250ms background-color; - } - - .alert-dialog__trigger:hover { - background-color: hsl(201 96% 32%); - } - - .alert-dialog__trigger:focus-visible { - outline: 2px solid hsl(200 98% 39%); - outline-offset: 2px; - } - - .alert-dialog__trigger:active { - background-color: hsl(201 90% 27%); - } - - .alert-dialog__overlay { - position: fixed; - inset: 0; - z-index: 50; - background-color: rgb(0 0 0 / 0.2); - animation: overlayHide 250ms ease 100ms forwards; - } - - .alert-dialog__overlay[data-expanded] { - animation: overlayShow 250ms ease; - } - - .alert-dialog__positioner { - position: fixed; - inset: 0; - z-index: 50; - display: flex; - align-items: center; - justify-content: center; - } - - .alert-dialog__content { - z-index: 50; - max-width: min(calc(100vw - 16px), 500px); - border: 1px solid hsl(240 5% 84%); - border-radius: 6px; - padding: 16px; - background-color: white; - box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); - animation: contentHide 300ms ease-in forwards; - } - - .alert-dialog__content[data-expanded] { - animation: contentShow 300ms ease-out; - } - - .alert-dialog__header { - display: flex; - align-items: baseline; - justify-content: space-between; - margin-bottom: 12px; - } - - .alert-dialog__close-button { - height: 16px; - width: 16px; - color: hsl(240 5% 34%); - } - - .alert-dialog__title { - font-size: 20px; - font-weight: 500; - color: hsl(240 6% 10%); - } - - .alert-dialog__description { - font-size: 16px; - color: hsl(240 5% 26%); - } - - @keyframes overlayShow { - from { - opacity: 0; - } - to { - opacity: 1; - } - } - - @keyframes overlayHide { - from { - opacity: 1; - } - to { - opacity: 0; - } - } - - @keyframes contentShow { - from { - opacity: 0; - transform: scale(0.96); - } - to { - opacity: 1; - transform: scale(1); - } - } - - @keyframes contentHide { - from { - opacity: 1; - transform: scale(1); - } - to { - opacity: 0; - transform: scale(0.96); - } - } - ``` - - - {/* */} -
+:::preview + + + +--- + +```tsx title="index.tsx" tab file="../../../../examples/alert-dialog.tsx#L4-L37" + +``` + +```css title="style.css" tab file="../../../../examples/alert-dialog.module.css" + +``` + +::: ## Usage @@ -246,7 +96,7 @@ An initial, uncontrolled open value can be provided using the `defaultOpen` prop The `open` prop can be used to make the open state controlled. The `onOpenChange` event is fired when the user presses the trigger, close button or overlay, and receives the new value. -```tsx {3,6} +```tsx {4,7} import { createSignal } from "solid-js"; function ControlledExample() { @@ -317,8 +167,8 @@ function ControlledExample() { | Key | Description | | :-------------------------------- | :----------------------------------------------------- | -| Space | When focus is on the trigger, opens/closes the dialog. | -| Enter | When focus is on the trigger, opens/closes the dialog. | -| Tab | Moves focus to the next focusable element. | -| Shift + Tab | Moves focus to the previous focusable element. | -| Esc | Closes the dialog and moves focus to the trigger. | +| Space | When focus is on the trigger, opens/closes the dialog. | +| Enter | When focus is on the trigger, opens/closes the dialog. | +| Tab | Moves focus to the next focusable element. | +| Shift + Tab | Moves focus to the previous focusable element. | +| Esc | Closes the dialog and moves focus to the trigger. | diff --git a/apps/docs/src/routes/docs/core/(1)components/alert.mdx b/apps/docs/src/routes/docs/core/(1)components/alert.mdx new file mode 100644 index 00000000..f23b3a61 --- /dev/null +++ b/apps/docs/src/routes/docs/core/(1)components/alert.mdx @@ -0,0 +1,75 @@ +--- +title: Alert +badges: + - icon: npm + label: "Since v0.1.0" + - label: "@kobalte/core/alert" + - icon: source + label: "Source" + url: "https://github.com/kobaltedev/kobalte/tree/main/packages/core/src/alert" + - icon: aria + label: "Alert" + url: "https://www.w3.org/WAI/ARIA/apg/patterns/alert/" +--- + +import { BasicExample } from "../../../../examples/alert"; + +# {frontmatter.title} + +Display a brief, important message in a way that attracts the user's attention without interrupting the user's task. + +## Import + +```ts +import { Alert } from "@kobalte/core/alert"; +// or +import { Root } from "@kobalte/core/alert"; +// or (deprecated) +import { Alert } from "@kobalte/core"; +``` + +## Features + +- Adhere to the [WAI ARIA Alert](https://www.w3.org/WAI/ARIA/apg/patterns/alert/) design pattern. + +## Anatomy + +The alert consists of : + +- **Alert:** The root container for an alert. + +```tsx + +``` + +## Example + +:::preview + + + +--- + +```tsx title="index.tsx" tab file="../../../../examples/alert.tsx#L3-L9" + +``` + +```css title="style.css" tab file="../../../../examples/alert.module.css" + +``` + +::: + +## API reference + +### Alert + +`Alert` is equivalent to the `Root` import from `@kobalte/core/alert` (and deprecated `Alert.Root`). + +Renders a `div` by default and support all its props. + +## Rendered elements + +| Component | Default rendered element | +| :-------- | :----------------------- | +| `Alert` | `div` | diff --git a/apps/docs/src/routes/docs/core/components/badge.mdx b/apps/docs/src/routes/docs/core/(1)components/badge.mdx similarity index 53% rename from apps/docs/src/routes/docs/core/components/badge.mdx rename to apps/docs/src/routes/docs/core/(1)components/badge.mdx index 652aed4a..47432aa4 100644 --- a/apps/docs/src/routes/docs/core/components/badge.mdx +++ b/apps/docs/src/routes/docs/core/(1)components/badge.mdx @@ -1,7 +1,17 @@ -import { Preview, TabsSnippets, Callout } from "../../../../components"; +--- +title: Badge +badges: + - icon: npm + label: "Since v0.13.8" + - label: "@kobalte/core/badge" + - icon: source + label: "Source" + url: "https://github.com/kobaltedev/kobalte/tree/main/packages/core/src/badge" +--- + import { BasicExample } from "../../../../examples/badge"; -# Badge +# {frontmatter.title} A `Badge` component is used to display small pieces of information or status indicators. @@ -30,45 +40,21 @@ The badge consists of: ## Example - - - - - - - index.tsx - style.css - - {/* */} - - ```tsx - import { Badge } from "@kobalte/core/badge"; - import "./style.css"; - - function App() { - return ( - - 5 messages - - ); - } - ``` - - - - ```css - .badge { - display: inline-block; - padding: 0.2em 0.4em; - background-color: hsl(201 96% 32%); - color: white; border-radius: 12px; - font-size: 0.875rem; - } - ``` - - - {/* */} - +:::preview + + + +--- + +```tsx title="index.tsx" tab file="../../../../examples/badge.tsx#L3-L11" + +``` + +```css title="style.css" tab file="../../../../examples/badge.module.css" + +``` + +::: ## API Reference diff --git a/apps/docs/src/routes/docs/core/components/breadcrumbs.mdx b/apps/docs/src/routes/docs/core/(1)components/breadcrumbs.mdx similarity index 62% rename from apps/docs/src/routes/docs/core/components/breadcrumbs.mdx rename to apps/docs/src/routes/docs/core/(1)components/breadcrumbs.mdx index a84a3a48..c34016f4 100644 --- a/apps/docs/src/routes/docs/core/components/breadcrumbs.mdx +++ b/apps/docs/src/routes/docs/core/(1)components/breadcrumbs.mdx @@ -1,7 +1,20 @@ -import { Preview, TabsSnippets, Callout } from "../../../../components"; +--- +title: Breadcrumbs +badges: + - icon: npm + label: "Since v0.5.0" + - label: "@kobalte/core/breadcrumbs" + - icon: source + label: "Source" + url: "https://github.com/kobaltedev/kobalte/tree/main/packages/core/src/breadcrumbs" + - icon: aria + label: "Breadcrumb" + url: "https://www.w3.org/WAI/ARIA/apg/patterns/breadcrumb/" +--- + import { BasicExample, CustomSeparatorExample } from "../../../../examples/breadcrumbs"; -# Breadcrumbs +# {frontmatter.title} Show hierarchy and navigational context for a user’s location within an application. @@ -44,88 +57,21 @@ The breadcrumbs consist of: ## Example - - - - - - - index.tsx - style.css - - {/* */} - - ```tsx - import { Breadcrumbs } from "@kobalte/core/breadcrumbs"; - import "./style.css"; - - function App() { - return ( - - - - ); - } - ``` - - - - ```css - .breadcrumbs__list { - display: inline-flex; - align-items: center; - } - - .breadcrumbs__item { - display: inline-flex; - align-items: center; - } - - .breadcrumbs__link { - font-weight: 500; - color: hsl(240 4% 16%); - } - - .breadcrumbs__link[data-disabled] { - color: hsl(240 4% 46%); - } - - .breadcrumbs__link:hover { - color: hsl(201 96% 32%); - } - - .breadcrumbs__link[data-current] { - font-weight: 400; - } - - .breadcrumbs__separator { - display: inline-block; - margin: 0 4px; - color: hsl(240 5% 65%); - } - ``` - - - {/* */} - +:::preview + + + +--- + +```tsx title="index.tsx" tab file="../../../../examples/breadcrumbs.tsx#L4-L30" + +``` + +```css title="style.css" tab file="../../../../examples/breadcrumbs.module.css" + +``` + +::: ## Usage @@ -133,11 +79,13 @@ The breadcrumbs consist of: Use the `separator` prop to provide a default content for all `Breadcrumbs.Separator`. You can pass it a `string` or a SolidJS component. - - - +:::preview + + + +--- -```tsx {0,4} +```tsx {1,5} import { ChevronRightIcon } from "some-icon-library"; function App() { @@ -167,11 +115,10 @@ function App() { } ``` - - - You can also override each `Breadcrumbs.Separator` content by providing your own `children`. - - +::: +:::tip +You can also override each `Breadcrumbs.Separator` content by providing your own `children`. +::: ## API Reference diff --git a/apps/docs/src/routes/docs/core/(1)components/button.mdx b/apps/docs/src/routes/docs/core/(1)components/button.mdx new file mode 100644 index 00000000..9f6deda6 --- /dev/null +++ b/apps/docs/src/routes/docs/core/(1)components/button.mdx @@ -0,0 +1,92 @@ +--- +title: Button +badges: + - icon: npm + label: "Since v0.1.0" + - label: "@kobalte/core/button" + - icon: source + label: "Source" + url: "https://github.com/kobaltedev/kobalte/tree/main/packages/core/src/button" + - icon: aria + label: "Button" + url: "https://www.w3.org/WAI/ARIA/apg/patterns/button/" +--- + +import { BasicExample } from "../../../../examples/button"; + +# {frontmatter.title} + +Enables users to trigger an action or event, such as submitting a form, opening a dialog, canceling an action, or performing a delete operation. + +## Import + +```ts +import { Button } from "@kobalte/core/button"; +// or +import { Root } from "@kobalte/core/button"; +// or (deprecated) +import { Button } from "@kobalte/core"; +``` + +## Features + +- Native HTML `
- - - - - - - - ); - } - ``` - - - - ```css - .toast__list { - --viewport-padding: 16px; - position: fixed; - bottom: 0; - right: 0; - display: flex; - flex-direction: column; - padding: var(--viewport-padding); - gap: 8px; - width: 400px; - max-width: 100vw; - margin: 0; - list-style: none; - z-index: 9999; - outline: none; - } - - .toast { - display: flex; - flex-direction: column; - align-items: center; - justify-content: space-between; - gap: 8px; - border: 1px solid hsl(240 5% 84%); - border-radius: 6px; - padding: 12px; - background-color: white; - box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); - } - - .toast[data-opened] { - animation: slideIn 150ms cubic-bezier(0.16, 1, 0.3, 1); - } - - .toast[data-closed] { - animation: hide 100ms ease-in; - } - - .toast[data-swipe="move"] { - transform: translateX(var(--kb-toast-swipe-move-x)); - } - - .toast[data-swipe="cancel"] { - transform: translateX(0); - transition: transform 200ms ease-out; - } - - .toast[data-swipe="end"] { - animation: swipeOut 100ms ease-out; - } - - .toast__content { - display: flex; - align-items: flex-start; - width: 100%; - } - - .toast__close-button { - flex-shrink: 0; - height: 16px; - width: 16px; - margin-left: auto; - color: hsl(240 5% 34%); - } - - .toast__title { - font-size: 16px; - font-weight: 500; - color: hsl(240 6% 10%); - } - - .toast__description { - font-size: 14px; - color: hsl(240 5% 26%); - } - - .toast__progress-track { - height: 8px; - width: 100%; - background-color: hsl(240 6% 90%); - border-radius: 3px; - } - - .toast__progress-fill { - background-color: hsl(200 98% 39%); - border-radius: 3px; - height: 100%; - width: var(--kb-toast-progress-fill-width); - transition: width 250ms linear; - } - - @keyframes hide { - from { - opacity: 1; - } - to { - opacity: 0; - } - } - - @keyframes slideIn { - from { - transform: translateX(calc(100% + var(--viewport-padding))); - } - to { - transform: translateX(0); - } - } - - @keyframes swipeOut { - from { - transform: translateX(var(--kb-toast-swipe-end-x)); - } - to { - transform: translateX(calc(100% + var(--viewport-padding))); - } - } - ``` - - - {/* */} - +:::preview + + + +--- + +```tsx title="index.tsx" tab file="../../../../examples/toast.tsx#L4-L65" + +``` + +```css title="style.css" tab file="../../../../examples/toast.module.css" + +``` + +::: ## Usage @@ -285,10 +106,10 @@ The `toaster.update()` method can be used to update a toast by providing a toast toaster.update(id, props => ...); ``` - - Notice that you always need to pass the `toastId` to `Toast`, because it doesn't know anything - about the `toaster` nor the toast it is supposed to represent. - +:::note +Notice that you always need to pass the `toastId` to `Toast`, because it doesn't know anything +about the `toaster` nor the toast it is supposed to represent. +::: ### Dismissing a toast @@ -316,7 +137,7 @@ In addition to the `toastId`, props will contain the following properties: - **data**: The data returned by the promise when fulfilled, if any. - **error**: The error returned by the promise when rejected, if any. -```tsx {3-5} +```tsx {4-6} toaster.promise(promise, props => ( @@ -371,7 +192,7 @@ We expose a CSS custom property `--kb-toast-progress-fill-width` which correspon We expose the CSS custom properties `--kb-toast-swipe-move-[x|y]` and `--kb-toast-swipe-end-[x|y]` which can be used with `data-swipe="[start|move|cancel|end]"` attributes to animate a swipe to close gesture. -```tsx {18} +```tsx {19} // index.tsx import { Toast, toaster } from "@kobalte/core/toast"; @@ -507,7 +328,7 @@ export const toast = { Then inside your application, use your own toast API: -```tsx {2,6} +```tsx {3,7} // App.tsx import { toast } from "./toast"; @@ -534,7 +355,7 @@ function App() { The `region` option in `toaster.show()` allows you to display toast in multiple regions at the same time. Not providing a region uses the default one. -```tsx {1} +```tsx {2} toaster.show(props => ..., { region: "custom-region-id", }); @@ -542,7 +363,7 @@ toaster.show(props => ..., { Inside your application, use add your custom region: -```tsx {2, 5} +```tsx {3,6} {/* Default region */} @@ -554,9 +375,10 @@ Inside your application, use add your custom region: ``` - - - +:::preview + + +::: ## API reference @@ -638,9 +460,9 @@ Inside your application, use add your custom region: | Key | Description | | :-------------------------------- | :-------------------------------------------------------- | -| Alt + T | Focuses toasts region. | -| Tab | Moves focus to the next focusable element. | -| Shift + Tab | Moves focus to the previous focusable element. | -| Space | When focus is on a `Toast.CloseButton`, closes the toast. | -| Enter | When focus is on a `Toast.CloseButton`, closes the toast. | -| Esc | When focus is on a toast, closes the toast. | +| Alt + T | Focuses toasts region. | +| Tab | Moves focus to the next focusable element. | +| Shift + Tab | Moves focus to the previous focusable element. | +| Space | When focus is on a `Toast.CloseButton`, closes the toast. | +| Enter | When focus is on a `Toast.CloseButton`, closes the toast. | +| Esc | When focus is on a toast, closes the toast. | diff --git a/apps/docs/src/routes/docs/core/components/toggle-button.mdx b/apps/docs/src/routes/docs/core/(1)components/toggle-button.mdx similarity index 67% rename from apps/docs/src/routes/docs/core/components/toggle-button.mdx rename to apps/docs/src/routes/docs/core/(1)components/toggle-button.mdx index ee80b53a..51ecbda0 100644 --- a/apps/docs/src/routes/docs/core/components/toggle-button.mdx +++ b/apps/docs/src/routes/docs/core/(1)components/toggle-button.mdx @@ -1,13 +1,26 @@ +--- +title: Toggle Button +badges: + - icon: npm + label: "Since v0.1.0" + - label: "@kobalte/core/toggle-button" + - icon: source + label: "Source" + url: "https://github.com/kobaltedev/kobalte/tree/main/packages/core/src/toggle-button" + - icon: aria + label: "Button" + url: "https://www.w3.org/WAI/ARIA/apg/patterns/button/" +--- + import { Show } from "solid-js"; -import { Preview, TabsSnippets, Kbd } from "../../../../components"; import { BasicExample, ControlledExample, DefaultPressedExample, } from "../../../../examples/toggle-button"; -# Toggle Button +# {frontmatter.title} A two-state button that can be either on (pressed) or off (not pressed). @@ -26,7 +39,7 @@ import { ToggleButton } from "@kobalte/core"; - Native HTML `; - } - ``` - - - - ```css - .button { - appearance: none; - display: inline-flex; - justify-content: center; - align-items: center; - height: 40px; - width: auto; - outline: none; - border-radius: 6px; - padding: 0 16px; - background-color: hsl(200 98% 39%); - color: white; - font-size: 16px; - line-height: 0; - transition: 250ms background-color; - } - - .button:hover { - background-color: hsl(201 96% 32%); - } - - .button:focus-visible { - outline: 2px solid hsl(200 98% 39%); - outline-offset: 2px; - } - - .button:active { - background-color: hsl(201 90% 27%); - } - ``` - - - {/* */} - - -## API Reference - -### Button - -`Button` is equivalent to the `Root` import from `@kobalte/core/button` (and deprecated `Button.Root`). - -| Prop | Description | -| :------- | :---------------------------------------------- | -| disabled | `boolean`
Whether the button is disabled. | - -| Data attribute | Description | -| :------------- | :----------------------------------- | -| data-disabled | Present when the button is disabled. | - -## Rendered elements - -| Component | Default rendered element | -| :-------- | :----------------------- | -| `Button` | `button` | - -## Accessibility - -### Keyboard Interactions - -| Key | Description | -| :--------------- | :-------------------- | -| Space | Activates the button. | -| Enter | Activates the button. | diff --git a/apps/docs/src/routes/docs/core/components/color-slider.mdx b/apps/docs/src/routes/docs/core/components/color-slider.mdx deleted file mode 100644 index b5997327..00000000 --- a/apps/docs/src/routes/docs/core/components/color-slider.mdx +++ /dev/null @@ -1,525 +0,0 @@ -import { Preview, TabsSnippets, Kbd } from "../../../../components"; -import { - BasicExample, - DefaultValueExample, - ControlledValueExample, - VerticalSliderExample, - CustomValueExample, -} from "../../../../examples/color-slider"; - -# Color Slider - -Adjusts an individual channel of a color value. - -## Import - -```ts -import { ColorSlider } from "@kobalte/core/color-slider"; -// or -import { Root, Track, ... } from "@kobalte/core/color-slider"; -``` - -## Features - -- Can be controlled or uncontrolled. -- Localized color descriptions for screen reader users. -- Support for adjusting a single channel of RGBA, HSLA and HSBA colors, in both horizontal and vertical orientations. -- Support click or touch on track to change value. -- Support right or left direction. -- Support for custom value label. - -## Anatomy - -The color slider consists of: - -- **ColorSlider:** The root container for the color slider. -- **ColorSlider.Track:** The component that visually represents the color slider track. -- **ColorSlider.Thumb:** The thumb that is used to visually indicate a value in the color slider. -- **ColorSlider.Input:** The native html input that is visually hidden in the color slider thumb. -- **ColorSlider.Label:** The label that gives the user information on the color slider. -- **ColorSlider.ValueLabel:** The accessible label text representing the current value in a human-readable format. - -```tsx - - - - - - - - - -``` - -## Example - - - - - - - - index.tsx - style.css - -{/* */} - - ```tsx - import { ColorSlider } from "@kobalte/core/color-slider"; - import { parseColor } from "@kobalte/core/colors"; - import "./style.css"; - - function App() { - return ( - -
- Blue - -
- - - - - -
- ); - } - ``` - -
- - ```css - .ColorSliderRoot { - position: relative; - display: flex; - flex-direction: column; - align-items: center; - user-select: none; - touch-action: none; - width: 200px; - } - - .ColorSliderTrack { - position: relative; - border-radius: 6px; - height: 24px; - width: 100%; - } - - .ColorSliderThumb { - display: block; - top: 4px; - width: 16px; - height: 16px; - border-radius: 9999px; - border: 2px solid #fff; - background: var(--kb-color-current); - } - - .ColorSliderThumb:focus { - outline: none; - } - - .ColorSliderLabel { - display: flex; - justify-content: space-between; - width: 100%; - } - ``` - - -{/* */} -
- -## Usage - -The value provided to `defaultValue` or `value` should be `Color` object. You can obtain a Color object by using the `parseColor` function to parse a color from a string. The `channel` prop must also be provided to specify which color channel the slider should display. -This must be one of the channels included in the color value, for example, for RGB colors, the "red", "green", and "blue" channels are available. - -### Default value - - - - - - - - index.tsx - style.css - -{/* */} - - ```tsx - import { ColorSlider } from "@kobalte/core/color-slider"; - import { parseColor } from "@kobalte/core/colors"; - import "./style.css"; - - function App() { - return ( - -
- Hue - -
- - - - - -
- ); - } - ``` - -
- - ```css - .ColorSliderRoot { - position: relative; - display: flex; - flex-direction: column; - align-items: center; - user-select: none; - touch-action: none; - width: 200px; - } - - .ColorSliderTrack { - position: relative; - border-radius: 6px; - height: 24px; - width: 100%; - } - - .ColorSliderThumb { - display: block; - top: 4px; - width: 16px; - height: 16px; - border-radius: 9999px; - border: 2px solid #fff; - box-shadow: 0 0 0 1px #0000006b; - } - - .ColorSliderThumb:focus { - outline: none; - } - - .ColorSliderLabel { - display: flex; - justify-content: space-between; - width: 100%; - } - ``` - - -{/* */} -
- -### Controlled value - - - - - - - - index.tsx - style.css - -{/* */} - - ```tsx - import { createSignal } from "solid-js"; - import { ColorSlider } from "@kobalte/core/color-slider"; - import { parseColor } from "@kobalte/core/colors"; - import "./style.css"; - - function App() { - const [value, setValue] = createSignal(parseColor('hsl(0, 100%, 50%)')); - return ( - -
- Hue - -
- - - - - -
- ); - } - ``` - -
- - ```css - .ColorSliderRoot { - position: relative; - display: flex; - flex-direction: column; - align-items: center; - user-select: none; - touch-action: none; - width: 200px; - } - - .ColorSliderTrack { - position: relative; - border-radius: 6px; - height: 24px; - width: 100%; - } - - .ColorSliderThumb { - display: block; - top: 4px; - width: 16px; - height: 16px; - border-radius: 9999px; - border: 2px solid #fff; - box-shadow: 0 0 0 1px #0000006b; - } - - .ColorSliderThumb:focus { - outline: none; - } - - .ColorSliderLabel { - display: flex; - justify-content: space-between; - width: 100%; - } - ``` - - -{/* */} -
- -### Vertical Slider - - - - - - - - index.tsx - style.css - -{/* */} - - ```tsx - import { ColorSlider } from "@kobalte/core/color-slider"; - import { parseColor } from "@kobalte/core/colors"; - import "./style.css"; - - function App() { - return ( - -
- Hue - -
- - - - - -
- ); - } - ``` - -
- - ```css - .ColorSliderRoot { - position: relative; - display: flex; - flex-direction: column; - align-items: center; - user-select: none; - touch-action: none; - height: 200px; - } - - .ColorSliderTrack { - position: relative; - border-radius: 6px; - height: 100%; - width: 24px; - } - - .ColorSliderThumb { - display: block; - left: 4px; - width: 16px; - height: 16px; - border-radius: 9999px; - border: 2px solid #fff; - box-shadow: 0 0 0 1px #0000006b; - } - - .ColorSliderThumb:focus { - outline: none; - } - - .ColorSliderLabel { - display: flex; - justify-content: space-between; - width: 100%; - } - ``` - - -{/* */} -
- -### Custom Value Label - - - - - - - - index.tsx - style.css - -{/* */} - - ```tsx - import { ColorSlider } from "@kobalte/core/color-slider"; - import { parseColor } from "@kobalte/core/colors"; - import "./style.css"; - - function App() { - return ( - `${param.toFormat("rgb")}`}> -
- -
- - - - - -
- ); - } - ``` - -
- - ```css - .ColorSliderRoot { - position: relative; - display: flex; - flex-direction: column; - align-items: center; - user-select: none; - touch-action: none; - width: 200px; - } - - .ColorSliderTrack { - position: relative; - border-radius: 6px; - height: 24px; - width: 100%; - } - - .ColorSliderThumb { - display: block; - top: 4px; - width: 16px; - height: 16px; - border-radius: 9999px; - border: 2px solid #fff; - box-shadow: 0 0 0 1px #0000006b; - } - - .ColorSliderThumb:focus { - outline: none; - } - - .ColorSliderLabel { - display: flex; - justify-content: space-between; - width: 100%; - } - ``` - - -{/* */} -
- -## API Reference - -### ColorSlider - -`ColorSlider` is equivalent to the `Root` import from `@kobalte/core/color-slider`. - -| Prop | Description | -| :-------------- | :-------------------------------------------------------------------------------------------------------------------------------------- | -| value | `Color`
The controlled value of the slider. Must be used in conjunction with `onChange`. | -| defaultValue | `Color`
The value of the slider when initially rendered. Use when you do not need to control the state of the slider. | -| channel | `ColorChannel`
The color channel that the slider manipulates. | -| colorSpace | `ColorSpace`
The color space that the slider operates in. The `channel` must be in this color space. | -| onChange | `(value: Color) => void`
Event handler called when the value changes. | -| onChangeEnd | `(value: Color) => void`
Event handler called when the value changes at the end of an interaction. | -| getValueLabel | `(param: Color) => string`
A function to get the accessible label text representing the current value in a human-readable format. | -| orientation | `'horizontal' \| 'vertical'`
The orientation of the slider. | -| name | `string`
The name of the slider, used when submitting an HTML form. | -| validationState | `'valid' \| 'invalid'`
Whether the slider should display its "valid" or "invalid" visual styling. | -| required | `boolean`
Whether the user must check a radio group item before the owning form can be submitted. | -| disabled | `boolean`
Whether the radio group is disabled. | -| readOnly | `boolean`
Whether the radio group items can be selected but not changed by the user. | -| translations | `ColorIntlTranslations`
Localization strings. | - -| Data attribute | Description | -| :---------------------------- | :--------------------------------------------------------------------------------- | -| data-orientation='horizontal' | Present when the slider has horizontal orientation. | -| data-orientation='vertical' | Present when the slider has vertical orientation. | -| data-valid | Present when the slider is valid according to the validation rules. | -| data-invalid | Present when the slider is invalid according to the validation rules. | -| data-required | Present when the user must slider an item before the owning form can be submitted. | -| data-disabled | Present when the slider is disabled. | -| data-readonly | Present when the slider is read only. | - -`ColorSlider.ValueLabel`, `ColorSlider.Input`, `ColorSlider.Thumb` and `ColorSlider.Track` share the same data-attributes. - -### ColorSlider.Thumb - -The current color is available on the thumb using the custom css property `--kb-color-current`. - -## Rendered elements - -| Component | Default rendered element | -| :------------------------- | :----------------------- | -| `ColorSlider` | `div` | -| `ColorSlider.Track` | `div` | -| `ColorSlider.Thumb` | `span` | -| `ColorSlider.Input` | `input` | -| `ColorSlider.ValueLabel` | `div` | -| `ColorSlider.Label` | `label` | -| `ColorSlider.Description` | `div` | -| `ColorSlider.ErrorMessage` | `div` | - -## Accessibility - -### Keyboard Interactions - -| Key | Description | -| :-------------------- | :------------------------------------------------------------------ | -| PageUp | Increases the value of the thumb by a larger step. | -| PageDown | Decreases the value of the thumb by a larger step. | -| ArrowDown | Decreases the value of the thumb by the step amount. | -| ArrowUp | Increases the value of the thumb by the step amount. | -| ArrowRight | Increments/decrements by the step value depending on `orientation`. | -| ArrowLeft | Increments/decrements by the step value depending on `orientation`. | -| Home | Sets the value of the thumb to the minimum value. | -| End | Sets the value of the thumb to the maximum value. | diff --git a/apps/docs/src/routes/docs/core/components/color-swatch.mdx b/apps/docs/src/routes/docs/core/components/color-swatch.mdx deleted file mode 100644 index b2e5f8ad..00000000 --- a/apps/docs/src/routes/docs/core/components/color-swatch.mdx +++ /dev/null @@ -1,171 +0,0 @@ -import { Preview, TabsSnippets, Kbd } from "../../../../components"; -import { - BasicExample, - ValueExample, - CustomColorNameExample, -} from "../../../../examples/color-swatch"; - -# Color Swatch - -Displays a preview of a selected color. - -## Import - -```ts -import { ColorSwatch } from "@kobalte/core/color-swatch"; -// or -import { Root } from "@kobalte/core/color-swatch"; -``` - -## Features - -- Localized color descriptions for screen reader users. - -## Anatomy - -The color swatch consists of: - -- **ColorSwatch:** The root container for the color swatch. - -```tsx - -``` - -## Example - - - - - - - - index.tsx - style.css - -{/* */} - - ```tsx - import { ColorSwatch } from "@kobalte/core/color-swatch"; - import { parseColor } from "@kobalte/core/colors"; - import "./style.css"; - - function App() { - return ( - - ); - } - ``` - - - - ```css - .ColorSwatchRoot { - height: 56px; - width: 56px; - border-radius: 6px; - } - ``` - - -{/* */} - - -## Usage - -ColorSwatch accepts a value via the `value` prop. The value should be `Color` object. You can obtain a Color object by using the `parseColor` function to parse a color from a string. - -### Value - - - - - - - - index.tsx - style.css - -{/* */} - - ```tsx - import { ColorSwatch } from "@kobalte/core/color-swatch"; - import { parseColor } from "@kobalte/core/colors"; - import "./style.css"; - - function App() { - return ( - - ); - } - ``` - - - - ```css - .ColorSwatchRoot { - height: 56px; - width: 56px; - border-radius: 6px; - } - ``` - - -{/* */} - - -### Custom Color Name - - - - - - - - index.tsx - style.css - -{/* */} - - ```tsx - import { ColorSwatch } from "@kobalte/core/color-swatch"; - import { parseColor } from "@kobalte/core/colors"; - import "./style.css"; - - function App() { - return ( - - ); - } - ``` - - - - ```css - .ColorSwatchRoot { - height: 56px; - width: 56px; - border-radius: 6px; - } - ``` - - -{/* */} - - -## API Reference - -### ColorSwatch - -`ColorSwatch` is equivalent to the `Root` import from `@kobalte/core/color-swatch`. - -| Prop | Description | -| :----------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| value | `Color`
The color value to display in the swatch. | -| colorName | `string`
A localized accessible name for the color. By default, a description is generated from the color value, but this can be overridden if you have a more specific color name (e.g. Pantone colors). | -| translations | `ColorSwatchIntlTranslations`
Localization strings. | - -## Rendered elements - -| Component | Default rendered element | -| :------------ | :----------------------- | -| `ColorSwatch` | `div` | diff --git a/apps/docs/src/routes/docs/core/components/skeleton.mdx b/apps/docs/src/routes/docs/core/components/skeleton.mdx deleted file mode 100644 index 02e9bcb4..00000000 --- a/apps/docs/src/routes/docs/core/components/skeleton.mdx +++ /dev/null @@ -1,363 +0,0 @@ -import { Preview, TabsSnippets, Kbd } from "../../../../components"; -import { - BasicExample, - MultipleSkeletonsExample, - ToggleExample, -} from "../../../../examples/skeleton"; - -# Skeleton - -Visually indicates content loading - -## Import - -```ts -import { Skeleton } from "@kobalte/core/skeleton"; -// or -import { Root } from "@kobalte/core/skeleton"; -// or (deprecated) -import { Skeleton } from "@kobalte/core"; -``` - -## Features - -- Support for custom width and height. -- Support for circle skeleton. -- Can toggle visibility and animation properties. - -## Anatomy - -The skeleton consists of: - -- **Skeleton:** The root container for a skeleton. - -```tsx - -``` - -## Example - - - - - - - - index.tsx - style.css - -{/* */} - - ```tsx - import { Skeleton } from "@kobalte/core/skeleton"; - import "./style.css"; - - function App() { - return ( - -

- A UI toolkit for building accessible web apps and design systems with SolidJS. -

-
- ); - } - ``` - -
- - ```css - @keyframes skeleton-fade { - 0%, - 100% { - opacity: 0.4; - } - - 50% { - opacity: 1; - } - } - - .skeleton { - height: auto; - width: 100%; - position: relative; - transform: translateZ(0); - -webkit-transform: translateZ(0); - } - .skeleton[data-animate="true"]::after { - animation: skeleton-fade 1500ms linear infinite; - } - - .skeleton[data-visible="true"] { - overflow: hidden; - } - .skeleton[data-visible="true"]::before { - position: absolute; - content: ""; - inset: 0; - z-index: 10; - background-color: white; - } - - .skeleton[data-visible="true"]::after { - position: absolute; - content: ""; - inset: 0; - z-index: 11; - background-color: gray; - } - ``` - - -{/* */} -
- -## Usage - -### Multiple skeletons - - - - - - - - index.tsx - style.css - -{/* */} - - ```tsx - import { Skeleton } from "@kobalte/core/skeleton"; - import { Image } from "@kobalte/core/image"; - import "./style.css"; - - function App() { - return ( -
-
- - - - - - - Kobalte - -
- -

- A UI toolkit for building accessible web apps and design systems with SolidJS. -

-
-
- ); - } - ``` - -
- - ```css - @keyframes skeleton-fade { - 0%, - 100% { - opacity: 0.4; - } - - 50% { - opacity: 1; - } - } - - .skeleton { - height: auto; - width: 100%; - position: relative; - transform: translateZ(0); - -webkit-transform: translateZ(0); - } - .skeleton[data-animate="true"]::after { - animation: skeleton-fade 1500ms linear infinite; - } - - .skeleton[data-visible="true"] { - overflow: hidden; - } - .skeleton[data-visible="true"]::before { - position: absolute; - content: ""; - inset: 0; - z-index: 10; - background-color: white; - } - - .skeleton[data-visible="true"]::after { - position: absolute; - content: ""; - inset: 0; - z-index: 11; - background-color: gray; - } - - .multiple-root { - display: flex; - flex-direction: column; - gap: 10px; - } - - .multiple-profile { - display: flex; - gap: 10px; - align-items: center; - } - ``` - - -{/* */} -
- -### Toggle example - - - - - - - - index.tsx - style.css - -{/* */} - - ```tsx - import { Skeleton } from "@kobalte/core/skeleton"; - import { ToggleButton } from "@kobalte/core/toggle-button"; - import "./style.css"; - - function App() { - const [visible, setVisible] = createSignal(true); - return ( -
- - Skeleton {visible() ? "Visible" : "Not Visible"} - - -

- A UI toolkit for building accessible web apps and design systems with SolidJS. -

-
-
- ); - } - ``` - -
- - ```css - @keyframes skeleton-fade { - 0%, - 100% { - opacity: 0.4; - } - - 50% { - opacity: 1; - } - } - - .skeleton { - height: auto; - width: 100%; - position: relative; - transform: translateZ(0); - -webkit-transform: translateZ(0); - } - .skeleton[data-animate="true"]::after { - animation: skeleton-fade 1500ms linear infinite; - } - - .skeleton[data-visible="true"] { - overflow: hidden; - } - .skeleton[data-visible="true"]::before { - position: absolute; - content: ""; - inset: 0; - z-index: 10; - background-color: white; - } - - .skeleton[data-visible="true"]::after { - position: absolute; - content: ""; - inset: 0; - z-index: 11; - background-color: gray; - } - - .toggle-root { - display: flex; - flex-direction: column; - align-items: center; - gap: 10px; - } - - .toggle-button { - appearance: none; - display: inline-flex; - justify-content: center; - align-items: center; - height: 40px; - width: 50%; - outline: none; - border-radius: 6px; - background-color: hsl(200 98% 39%); - color: white; - font-size: 16px; - line-height: 0; - } - - .toggle-button:focus-visible { - outline: 2px solid hsl(200 98% 39%); - outline-offset: 2px; - } - - .toggle-button[data-pressed] { - background-color: hsl(0 72% 51%); - } - ``` - - -{/* */} -
- -## API Reference - -### Skeleton - -`Skeleton` is equivalent to the `Root` import from `@kobalte/core/skeleton` (and deprecated `Skeleton.Root`). - -| Prop | Description | -| :------- | :--------------------------------------------------------------------------------------------------- | -| visible | `boolean`
The visible state of the Skeleton. Sets the `data-visible` data attribute. | -| animate | `boolean`
Whether the skeleton should animate. Sets the `data-animate` data attribute. | -| width | `number`
The width of the skeleton in px. Defaults to 100%. | -| height | `number`
The height of the skeleton in px. Defaults to auto. | -| radius | `number`
Roundness of the skeleton in px. Sets border-radius. | -| circle | `boolean`
Whether the skeleton should be a circle. Sets border-radius and width to the height. | -| children | `JSX.Element`
The children of the Skeleton. | - -| Data attribute | Description | -| :------------- | :------------------------------------- | -| data-visible | Present when the Skeleton is visible. | -| data-animate | Present when the Skeleton can animate. | - -## Rendered elements - -| Component | Default rendered element | -| :--------- | :----------------------- | -| `Skeleton` | `div` | diff --git a/apps/docs/src/routes/docs/core/components/slider.mdx b/apps/docs/src/routes/docs/core/components/slider.mdx deleted file mode 100644 index a20fd883..00000000 --- a/apps/docs/src/routes/docs/core/components/slider.mdx +++ /dev/null @@ -1,825 +0,0 @@ -import { Preview, TabsSnippets, Kbd } from "../../../../components"; -import { - BasicExample, - MultipleThumbsExample, - StepExample, - MinStepsBetweenExample, - VerticalSliderExample, - CustomValueLabelExample, - ControlledExample, -} from "../../../../examples/slider"; - -# Slider - -An input where the user selects a value from within a given range. - -## Import - -```ts -import { Slider } from "@kobalte/core/slider"; -// or -import { Root, Track, ... } from "@kobalte/core/slider"; -// or (deprecated) -import { Slider } from "@kobalte/core"; -``` - -## Features - -- Follow the [WAI ARIA Slider](https://www.w3.org/WAI/ARIA/apg/patterns/slider-multithumb/) design pattern. -- Can be controlled or uncontrolled. -- Support for multiple thumbs. -- Support a minimum step between thumbs. -- Support click or touch on track to change value. -- Support right or left direction. -- Support for custom value label. - -## Anatomy - -The slider consists of: - -- **Slider:** The root container for the slider. -- **Slider.Track:** The component that visually represents the slider track. -- **Slider.Fill:** The component that visually represents the slider value. -- **Slider.Thumb:** The thumb that is used to visually indicate a value in the slider. -- **Slider.Input:** The native html input that is visually hidden in the slider thumb. -- **Slider.Label:** The label that gives the user information on the slider. -- **Slider.ValueLabel:** The accessible label text representing the current value in a human-readable format. -- **Slider.Description**: The description that gives the user more information on the slider. -- **Slider.ErrorMessage**: The error message that gives the user information about how to fix a validation error on the slider. - -```tsx - - - - - - - - - - - - -``` - -## Example - - - - - - - - index.tsx - style.css - -{/* */} - - ```tsx - import { Slider } from "@kobalte/core/slider"; - import "./style.css"; - - function App() { - return ( - -
- Label - -
- - - - - - -
- ); - } - ``` - -
- - ```css - .SliderRoot { - position: relative; - display: flex; - flex-direction: column; - align-items: center; - user-select: none; - touch-action: none; - width: 200px; - } - - .SliderTrack { - background-color: hsl(240 6% 90%); - position: relative; - border-radius: 9999px; - height: 8px; - width: 100%; - } - - .SliderRange { - position: absolute; - background-color: hsl(200 98% 39%); - border-radius: 9999px; - height: 100%; - } - - .SliderThumb { - display: block; - width: 16px; - height: 16px; - background-color: hsl(200 98% 39%); - border-radius: 9999px; - top: -4px; - } - - .SliderThumb:hover { - box-shadow: 0 0 0 5px #2a91fe98; - } - - .SliderThumb:focus { - outline: none; - box-shadow: 0 0 0 5px #2a91fe98; - } - - .SliderLabel { - width: 100%; - display: flex; - justify-content: space-between; - } - ``` - - -{/* */} -
- -## Usage - -### Multiple Thumbs - - - - - - - - index.tsx - style.css - -{/* */} - - ```tsx - import { Slider } from "@kobalte/core/slider"; - import "./style.css"; - - function App() { - return ( - -
- Label - -
- - - - - - - - - -
- ); - } - ``` - -
- - ```css - .SliderRoot { - position: relative; - display: flex; - flex-direction: column; - align-items: center; - user-select: none; - touch-action: none; - width: 200px; - } - - .SliderTrack { - background-color: hsl(240 6% 90%); - position: relative; - border-radius: 9999px; - height: 8px; - width: 100%; - } - - .SliderRange { - position: absolute; - background-color: hsl(200 98% 39%); - border-radius: 9999px; - height: 100%; - } - - .SliderThumb { - display: block; - width: 16px; - height: 16px; - background-color: hsl(200 98% 39%); - border-radius: 9999px; - top: -4px; - } - - .SliderThumb:hover { - box-shadow: 0 0 0 5px #2a91fe98; - } - - .SliderThumb:focus { - outline: none; - box-shadow: 0 0 0 5px #2a91fe98; - } - - .SliderLabel { - width: 100%; - display: flex; - justify-content: space-between; - } - ``` - - -{/* */} -
- -### Modify step size - - - - - - - - index.tsx - style.css - -{/* */} - - ```tsx - import { Slider } from "@kobalte/core/slider"; - import "./style.css"; - - function App() { - return ( - <> - -
- Step size 8 - -
- - - - - - - - - -
- -
- Step size 10 - -
- - - - - - - - - -
- -
- Step size 20 - -
- - - - - - - - - -
- - ); - } - ``` - -
- - ```css - .SliderRoot { - position: relative; - display: flex; - flex-direction: column; - align-items: center; - user-select: none; - touch-action: none; - width: 200px; - } - - .SliderTrack { - background-color: hsl(240 6% 90%); - position: relative; - border-radius: 9999px; - height: 8px; - width: 100%; - } - - .SliderRange { - position: absolute; - background-color: hsl(200 98% 39%); - border-radius: 9999px; - height: 100%; - } - - .SliderThumb { - display: block; - width: 16px; - height: 16px; - background-color: hsl(200 98% 39%); - border-radius: 9999px; - top: -4px; - } - - .SliderThumb:hover { - box-shadow: 0 0 0 5px #2a91fe98; - } - - .SliderThumb:focus { - outline: none; - box-shadow: 0 0 0 5px #2a91fe98; - } - - .SliderLabel { - width: 100%; - display: flex; - justify-content: space-between; - } - ``` - - -{/* */} -
- -### Steps between thumbs - - - - - - - - index.tsx - style.css - -{/* */} - - ```tsx - import { Slider } from "@kobalte/core/slider"; - import "./style.css"; - - function App() { - return ( - -
- Label - -
- - - - - - - - - -
- ); - } - ``` - -
- - ```css - .SliderRoot { - position: relative; - display: flex; - flex-direction: column; - align-items: center; - user-select: none; - touch-action: none; - width: 200px; - } - - .SliderTrack { - background-color: hsl(240 6% 90%); - position: relative; - border-radius: 9999px; - height: 8px; - width: 100%; - } - - .SliderRange { - position: absolute; - background-color: hsl(200 98% 39%); - border-radius: 9999px; - height: 100%; - } - - .SliderThumb { - display: block; - width: 16px; - height: 16px; - background-color: hsl(200 98% 39%); - border-radius: 9999px; - top: -4px; - } - - .SliderThumb:hover { - box-shadow: 0 0 0 5px #2a91fe98; - } - - .SliderThumb:focus { - outline: none; - box-shadow: 0 0 0 5px #2a91fe98; - } - - .SliderLabel { - width: 100%; - display: flex; - justify-content: space-between; - } - ``` - - -{/* */} -
- -### Vertical Slider - - - - - - - - index.tsx - style.css - -{/* */} - - ```tsx - import { Slider } from "@kobalte/core/slider"; - import "./style.css"; - - function App() { - return ( - -
- Label - -
- - - - - - -
- ); - } - ``` - -
- - ```css - .SliderRoot { - position: relative; - display: flex; - flex-direction: column; - align-items: center; - user-select: none; - touch-action: none; - height: 200px; - } - - .SliderTrack { - background-color: hsl(240 6% 90%); - position: relative; - border-radius: 9999px; - width: 8px; - height: 100%; - } - - .SliderRange { - position: absolute; - background-color: hsl(200 98% 39%); - border-radius: 9999px; - width: 100%; - } - - .SliderThumb { - display: block; - width: 16px; - height: 16px; - background-color: hsl(200 98% 39%); - border-radius: 9999px; - left: -4px; - } - - .SliderThumb:hover { - box-shadow: 0 0 0 5px #2a91fe98; - } - - .SliderThumb:focus { - outline: none; - box-shadow: 0 0 0 5px #2a91fe98; - } - - .SliderLabel { - width: 100%; - display: flex; - justify-content: space-between; - } - ``` - - -{/* */} -
- -### Custom Value Label - - - - - - - - index.tsx - style.css - -{/* */} - - ```tsx - import { Slider } from "@kobalte/core/slider"; - import "./style.css"; - - function App() { - return ( - `$${params.values[0]} - $${params.values[1]}`} - > -
- Money - -
- - - - - - - - - -
- ); - } - ``` - -
- - ```css - .SliderRoot { - position: relative; - display: flex; - flex-direction: column; - align-items: center; - user-select: none; - touch-action: none; - width: 200px; - } - - .SliderTrack { - background-color: hsl(240 6% 90%); - position: relative; - border-radius: 9999px; - height: 8px; - width: 100%; - } - - .SliderRange { - position: absolute; - background-color: hsl(200 98% 39%); - border-radius: 9999px; - height: 100%; - } - - .SliderThumb { - display: block; - width: 16px; - height: 16px; - background-color: hsl(200 98% 39%); - border-radius: 9999px; - top: -4px; - } - - .SliderThumb:hover { - box-shadow: 0 0 0 5px #2a91fe98; - } - - .SliderThumb:focus { - outline: none; - box-shadow: 0 0 0 5px #2a91fe98; - } - - .SliderLabel { - width: 100%; - display: flex; - justify-content: space-between; - } - ``` - - -{/* */} -
- -### Controlled Value - - - - - - - - index.tsx - style.css - -{/* */} - - ```tsx - import { createSignal } from 'solid-js' - import { Slider } from "@kobalte/core/slider"; - import "./style.css"; - - function App() { - const [values, setValues] = createSignal([40]) - - return ( - -
- Label - -
- - - - - - -
- ); - } - ``` - -
- - ```css - .SliderRoot { - position: relative; - display: flex; - flex-direction: column; - align-items: center; - user-select: none; - touch-action: none; - width: 200px; - } - - .SliderTrack { - background-color: hsl(240 6% 90%); - position: relative; - border-radius: 9999px; - height: 8px; - width: 100%; - } - - .SliderRange { - position: absolute; - background-color: hsl(200 98% 39%); - border-radius: 9999px; - height: 100%; - } - - .SliderThumb { - display: block; - width: 16px; - height: 16px; - background-color: hsl(200 98% 39%); - border-radius: 9999px; - top: -4px; - } - - .SliderThumb:hover { - box-shadow: 0 0 0 5px #2a91fe98; - } - - .SliderThumb:focus { - outline: none; - box-shadow: 0 0 0 5px #2a91fe98; - } - - .SliderLabel { - width: 100%; - display: flex; - justify-content: space-between; - } - ``` - - -{/* */} -
-## API Reference - -### Slider - -`Slider` is equivalent to the `Root` import from `@kobalte/core/slider` (and deprecated `Slider.Root`). - -| Prop | Description | -| :-------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| value | `number[]`
The controlled values of the slider. Must be used in conjunction with `onChange`. | -| defaultValue | `number[]`
The value of the slider when initially rendered. Use when you do not need to control the state of the slider. | -| onChange | `(value: number[]) => void`
Event handler called when the value changes. | -| onChangeEnd | `(value: number[]) => void`
Event handler called when the value changes at the end of an interaction. | -| inverted | `boolean`
Whether the slider is visually inverted. Defaults to false. | -| minValue | `number`
The minimum slider value. Defaults to 0 | -| maxValue | `number`
The maximum slider value. Defaults to 100 | -| step | `number`
The stepping interval. Defaults to 1 | -| minStepsBetweenThumbs | `number`
The minimum permitted steps between thumbs. Defaults to 0 | -| getValueLabel | `(params: GetValueLabelParams) => string`
A function to get the accessible label text representing the current value in a human-readable format. If not provided, the value label will be read as a percentage of the max value. | -| orientation | `'horizontal' \| 'vertical'`
The orientation of the slider. | -| name | `string`
The name of the slider, used when submitting an HTML form. | -| validationState | `'valid' \| 'invalid'`
Whether the slider should display its "valid" or "invalid" visual styling. | -| required | `boolean`
Whether the user must check a radio group item before the owning form can be submitted. | -| disabled | `boolean`
Whether the radio group is disabled. | -| readOnly | `boolean`
Whether the radio group items can be selected but not changed by the user. | - -| Data attribute | Description | -| :---------------------------- | :--------------------------------------------------------------------------------- | -| data-orientation='horizontal' | Present when the slider has horizontal orientation. | -| data-orientation='vertical' | Present when the slider has vertical orientation. | -| data-valid | Present when the slider is valid according to the validation rules. | -| data-invalid | Present when the slider is invalid according to the validation rules. | -| data-required | Present when the user must slider an item before the owning form can be submitted. | -| data-disabled | Present when the slider is disabled. | -| data-readonly | Present when the slider is read only. | - -`Slider.ValueLabel`, `Slider.Fill`, `Slider.Input`, `Slider.Thumb` and `Slider.Track` share the same data-attributes. - -## Rendered elements - -| Component | Default rendered element | -| :-------------------- | :----------------------- | -| `Slider` | `div` | -| `Slider.Track` | `div` | -| `Slider.Fill` | `div` | -| `Slider.Thumb` | `span` | -| `Slider.Input` | `input` | -| `Slider.ValueLabel` | `div` | -| `Slider.Description` | `div` | -| `Slider.ErrorMessage` | `div` | - -## Accessibility - -### Keyboard Interactions - -| Key | Description | -| :-------------------- | :-------------------------------------------------------------------- | -| PageUp | Increases the value of the focused thumb by a larger `step`. | -| PageDown | Decreases the value of the focused thumb by a larger `step`. | -| ArrowDown | Decreases the value of the focused thumb by the `step` amount. | -| ArrowUp | Increases the value of the focused thumb by the `step` amount. | -| ArrowRight | Increments/decrements by the `step` value depending on `orientation`. | -| ArrowLeft | Increments/decrements by the `step` value depending on `orientation`. | -| Home | Sets the value of the first thumb to the minimum value. | -| End | Sets the value of the last thumb to the maximum value. | diff --git a/apps/docs/src/routes/docs/core/overview/getting-started.mdx b/apps/docs/src/routes/docs/core/overview/getting-started.mdx deleted file mode 100644 index de16baf9..00000000 --- a/apps/docs/src/routes/docs/core/overview/getting-started.mdx +++ /dev/null @@ -1,157 +0,0 @@ -import { Preview, TabsSnippets } from "../../../../components"; -import { PopoverDemo } from "../../../../examples/getting-started"; - -# Getting started - -## Installation - -Install Kobalte by running either of the following: - - - - npm - yarn - pnpm - - - {/* */} - ```bash - npm install @kobalte/core - ``` - {/* */} - - - {/* */} - ```bash - yarn add @kobalte/core - ``` - {/* */} - - - {/* */} - ```bash - pnpm add @kobalte/core - ``` - {/* */} - - - -## Using the components - -The example below demonstrate how to create a Popover component with Kobalte. - - - - - - - - index.tsx - style.css - - {/* */} - - ```tsx - import { Popover } from "@kobalte/core/popover"; - import { CrossIcon } from "some-icon-library"; - import "./style.css"; - - function App() { - - Learn more - - - -
- About Kobalte - - - -
- - A UI toolkit for building accessible web apps and design systems with SolidJS. - -
-
-
- } - ``` - -
- - ```css - .popover__trigger { - appearance: none; - display: inline-flex; - justify-content: center; - align-items: center; - height: 40px; - width: auto; - outline: none; - border-radius: 6px; - padding: 0 16px; - background-color: hsl(200 98% 39%); - color: white; - font-size: 16px; - line-height: 0; - transition: 250ms background-color; - } - - .popover__trigger:hover { - background-color: hsl(201 96% 32%); - } - - .popover__trigger:focus-visible { - outline: 2px solid hsl(200 98% 39%); - outline-offset: 2px; - } - - .popover__trigger:active { - background-color: hsl(201 90% 27%); - } - - .popover__content { - z-index: 50; - max-width: min(calc(100vw - 16px), 380px); - border: 1px solid hsl(240 5% 84%); - border-radius: 6px; - padding: 12px; - background-color: white; - box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); - } - - .popover__header { - display: flex; - align-items: baseline; - justify-content: space-between; - margin-bottom: 6px; - } - - .popover__close-button { - height: 16px; - width: 16px; - color: hsl(240 5% 34%); - } - - .popover__title { - font-size: 16px; - font-weight: 500; - color: hsl(240 6% 10%); - } - - .popover__description { - font-size: 14px; - color: hsl(240 5% 26%); - } - ``` - - - {/* */} -
- -In a few lines of code, we've implemented a fully accessible Popover component that : - -- Adheres to [WAI-ARIA Dialog](https://www.w3.org/WAI/ARIA/apg/patterns/dialogmodal/) design pattern. -- Can be controlled or uncontrolled. -- Optionally render a pointing arrow. -- Has focus fully managed and customizable. diff --git a/apps/docs/src/routes/docs/core/overview/ssr.mdx b/apps/docs/src/routes/docs/core/overview/ssr.mdx deleted file mode 100644 index de553be5..00000000 --- a/apps/docs/src/routes/docs/core/overview/ssr.mdx +++ /dev/null @@ -1,12 +0,0 @@ -import { Callout } from "../../../../components/callout"; - -# Server side rendering - -## Usage with SolidStart - -Kobalte works out of the box with [SolidStart](https://start.solidjs.com/). - - - Kobalte has been tested with `solid-js@1.8.15` and `@solidjs/start@0.6.1`, compatibility with - other versions is not guaranteed. - diff --git a/apps/docs/src/routes/index.tsx b/apps/docs/src/routes/index.tsx index a4182511..cda9750f 100644 --- a/apps/docs/src/routes/index.tsx +++ b/apps/docs/src/routes/index.tsx @@ -1,5 +1,17 @@ -import { Navigate } from "@solidjs/router"; +import { Navigate, redirect } from "@solidjs/router"; + +const target = "/docs/core/overview/introduction"; + +export const route = { + preload() { + return redirect(target); + }, +}; + +export function GET() { + throw redirect(target); +} export default function () { - return ; + return ; } diff --git a/apps/docs/src/solidbase-theme/Layout.module.css b/apps/docs/src/solidbase-theme/Layout.module.css new file mode 100644 index 00000000..36a64640 --- /dev/null +++ b/apps/docs/src/solidbase-theme/Layout.module.css @@ -0,0 +1,24 @@ +footer:has(.footer) { + position: relative; +} + +.footer.footer { + position: absolute; + top: 100%; + flex-direction: row; + justify-content: space-evenly; + align-items: center; + width: 100%; + + > a { + color: color-mix(in hsl, var(--sb-text-color) 72.5%, transparent); + box-shadow: color-mix(in hsl, var(--sb-text-color) 25%, transparent) 0 -2px 0 0 inset; + text-decoration: none; + line-height: 1; + + &:hover, + &:focus { + box-shadow: color-mix(in hsl, var(--sb-text-color) 25%, transparent) 0 -6px 0 0 inset; + } + } +} diff --git a/apps/docs/src/solidbase-theme/Layout.tsx b/apps/docs/src/solidbase-theme/Layout.tsx new file mode 100644 index 00000000..35851781 --- /dev/null +++ b/apps/docs/src/solidbase-theme/Layout.tsx @@ -0,0 +1,40 @@ +import Layout from "@kobalte/solidbase/default-theme/Layout.jsx"; +import Footer from "@kobalte/solidbase/default-theme/components/Footer.jsx"; +import { DefaultThemeComponentsProvider } from "@kobalte/solidbase/default-theme/context.jsx"; +import type { ComponentProps } from "solid-js"; + +import styles from "./Layout.module.css"; + +export default function (props: ComponentProps) { + return ( + <> + ( +
+ ), + }} + force + > + + + + ); +} diff --git a/apps/docs/tailwind.config.cjs b/apps/docs/tailwind.config.cjs deleted file mode 100644 index ceeb9cc3..00000000 --- a/apps/docs/tailwind.config.cjs +++ /dev/null @@ -1,37 +0,0 @@ -const defaultTheme = require("tailwindcss/defaultTheme"); - -/** @type {import('tailwindcss').Config} */ -module.exports = { - content: ["./src/**/*.{html,js,jsx,ts,tsx,mdx}"], - darkMode: ["class", '[data-kb-theme="dark"]'], - theme: { - fontSize: { - xs: ["0.75rem", { lineHeight: "1rem" }], - sm: ["0.875rem", { lineHeight: "1.5rem" }], - base: ["1rem", { lineHeight: "2rem" }], - lg: ["1.125rem", { lineHeight: "1.75rem" }], - xl: ["1.25rem", { lineHeight: "2rem" }], - "2xl": ["1.5rem", { lineHeight: "2.5rem" }], - "3xl": ["2rem", { lineHeight: "2.5rem" }], - "4xl": ["2.5rem", { lineHeight: "3rem" }], - "5xl": ["3rem", { lineHeight: "3.5rem" }], - "6xl": ["3.75rem", { lineHeight: "1" }], - "7xl": ["4.5rem", { lineHeight: "1" }], - "8xl": ["6rem", { lineHeight: "1" }], - "9xl": ["8rem", { lineHeight: "1" }], - }, - extend: { - fontFamily: { - sans: ["Inter", ...defaultTheme.fontFamily.sans], - display: ["Lexend", ...defaultTheme.fontFamily.sans], - }, - maxWidth: { - "8xl": "88rem", - }, - }, - }, - plugins: [ - require("@tailwindcss/typography"), - require("@kobalte/tailwindcss"), - ], -}; diff --git a/apps/docs/vite.config.ts b/apps/docs/vite.config.ts new file mode 100644 index 00000000..79209be7 --- /dev/null +++ b/apps/docs/vite.config.ts @@ -0,0 +1,109 @@ +import { createSolidBase, defineTheme } from "@kobalte/solidbase/config"; +import { + createDefaultThemeFilesystemSidebar, + default as defaultTheme, +} from "@kobalte/solidbase/default-theme"; +import { solidStart } from "@solidjs/start/config"; +import { nitro } from "nitro/vite"; +import { defineConfig } from "vite"; +import { version as KBVersion } from "../../packages/core/package.json"; + +const theme = defineTheme({ + componentsPath: import.meta.resolve("./src/solidbase-theme"), + extends: defaultTheme, +}); + +const solidBase = createSolidBase(theme); + +export default defineConfig({ + resolve: { + dedupe: ["solid-js", "@solidjs/router"], + }, + plugins: [ + solidBase.plugin({ + title: "Kobalte", + titleTemplate: ":title – Kobalte", + description: + "Unstyled components and primitives for building accessible web apps and design systems with SolidJS.", + siteUrl: "https://kobalte.dev", + logo: "/kobalte.svg", + llms: true, + sitemap: true, + robots: true, + issueAutolink: "https://github.com/kobaltedev/kobalte/issues/:issue", + lang: "en", + markdown: { + expressiveCode: { + languageSwitcher: false, + }, + }, + routes: { + path: "/{version}/", + version: { + default: "v1", + values: { + v1: { path: "", label: `v${KBVersion}` }, + }, + }, + }, + editPath: + "https://github.com/kobaltedev/kobalte/edit/main/apps/docs/:path", + themeConfig: { + badges: { + icons: { + npm: ``, + source: ``, + aria: ``, + }, + }, + socialLinks: { + github: "https://github.com/kobaltedev/kobalte", + discord: "https://discord.com/invite/solidjs", + }, + nav: [ + { + text: "Components", + link: "/docs/core", + }, + { + text: "Changelog", + link: "/docs/changelog", + }, + ], + sidebar: { + "/docs/core": createDefaultThemeFilesystemSidebar( + "./src/routes/docs/core", + { + sort: (a, b) => { + if (a.filePath.includes("i18n-provider")) return 1; + if (b.filePath.includes("i18n-provider")) return -1; + if (a.filePath.includes("index")) return -1; + if (a.filePath > b.filePath) return 1; + if (b.filePath > a.filePath) return -1; + return 0; + }, + }, + ), + "/docs/changelog": createDefaultThemeFilesystemSidebar( + "./src/routes/docs/changelog", + ), + }, + search: { + docsearch: { + appId: "8550U3NJ6N", + indexName: "Kobalte Docs", + apiKey: "c36d7de88f1413b5dbe7b36b42f9c734", + }, + }, + }, + }), + solidStart(solidBase.startConfig()), + nitro({ + preset: "netlify", + prerender: { crawlLinks: true }, + }), + ], + ssr: { + noExternal: ["@docsearch/css"], + }, +}); diff --git a/package.json b/package.json index e5c2f58e..a7293e90 100644 --- a/package.json +++ b/package.json @@ -39,15 +39,15 @@ "@commitlint/cli": "17.7.1", "@commitlint/config-conventional": "17.7.0", "@commitlint/cz-commitlint": "17.7.1", - "@solidjs/testing-library": "0.8.6", - "@testing-library/dom": "9.3.4", - "@testing-library/jest-dom": "6.4.2", - "@testing-library/user-event": "14.5.2", + "@solidjs/testing-library": "0.8.10", + "@testing-library/dom": "10.4.1", + "@testing-library/jest-dom": "6.9.1", + "@testing-library/user-event": "14.6.1", "@types/node": "20.5.4", "babel-preset-solid": "1.7.7", "commitizen": "4.3.0", "inquirer": "8.2.5", - "jsdom": "19.0.0", + "jsdom": "29.1.1", "prettier": "4.0.0-alpha.10", "prettier-plugin-tailwindcss": "0.5.3", "rollup": "3.28.1", @@ -55,14 +55,14 @@ "rollup-plugin-copy": "3.5.0", "rollup-plugin-license": "3.2.0", "rollup-preset-solid": "2.0.1", - "solid-js": "1.8.15", - "tsup": "7.2.0", + "solid-js": "1.9.8", + "tsup": "8.5.1", "turbo": "1.10.13", - "typescript": "4.9.5", - "vite": "5.0.11", - "vite-plugin-solid": "2.9.1", - "vitest": "1.3.1", - "@vitest/ui": "^1.5.2" + "typescript": "6.0.3", + "vite-plugin-solid": "2.11.12", + "vitest": "4.1.10", + "@vitest/ui": "4.1.10", + "vite": "8.1.3" }, - "packageManager": "pnpm@9.12.3" + "packageManager": "pnpm@11.9.0" } diff --git a/packages/core/package.json b/packages/core/package.json index e87d3864..07f8727c 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -65,7 +65,6 @@ "build:tsup": "NODE_OPTIONS=\"--max-old-space-size=8192\" tsup", "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist && rm NOTICE.txt", "dev": "vite serve dev --host", - "test-old": "jest --passWithNoTests", "test": "vitest run", "typecheck": "tsc --noEmit" }, @@ -84,7 +83,7 @@ "tsup": "7.2.0" }, "peerDependencies": { - "solid-js": "^1.8.15" + "solid-js": "^1.9.8" }, "publishConfig": { "access": "public" diff --git a/packages/core/src/checkbox/checkbox-input.tsx b/packages/core/src/checkbox/checkbox-input.tsx index 6b530b3d..c2290905 100644 --- a/packages/core/src/checkbox/checkbox-input.tsx +++ b/packages/core/src/checkbox/checkbox-input.tsx @@ -45,8 +45,8 @@ export interface CheckboxInputCommonProps< ref: T | ((el: T) => void); style: JSX.CSSProperties | string; onChange: JSX.EventHandlerUnion; - onFocus: JSX.FocusEventHandlerUnion; - onBlur: JSX.FocusEventHandlerUnion; + onFocus: JSX.EventHandlerUnion; + onBlur: JSX.EventHandlerUnion; "aria-label": string | undefined; "aria-labelledby": string | undefined; "aria-describedby": string | undefined; @@ -123,16 +123,12 @@ export function CheckboxInput( setIsInternalChangeEvent(false); }; - const onFocus: JSX.FocusEventHandlerUnion = ( - e, - ) => { + const onFocus: JSX.EventHandlerUnion = (e) => { callHandler(e, local.onFocus); context.setIsFocused(true); }; - const onBlur: JSX.FocusEventHandlerUnion = ( - e, - ) => { + const onBlur: JSX.EventHandlerUnion = (e) => { callHandler(e, local.onBlur); context.setIsFocused(false); }; diff --git a/packages/core/src/color-area/color-area-hidden-input-base.tsx b/packages/core/src/color-area/color-area-hidden-input-base.tsx index 15780698..6fec4036 100644 --- a/packages/core/src/color-area/color-area-hidden-input-base.tsx +++ b/packages/core/src/color-area/color-area-hidden-input-base.tsx @@ -56,9 +56,7 @@ export function ColorAreaHiddenInputBase(props: ColorAreaHiddenInputBaseProps) { .join(", "); }; - const onChange: JSX.ChangeEventHandlerUnion = ( - e, - ) => { + const onChange: JSX.EventHandlerUnion = (e) => { callHandler(e, local.onChange); const target = e.target as HTMLInputElement; diff --git a/packages/core/src/color-field/color-field-context.tsx b/packages/core/src/color-field/color-field-context.tsx index f7e7f885..50bef0f5 100644 --- a/packages/core/src/color-field/color-field-context.tsx +++ b/packages/core/src/color-field/color-field-context.tsx @@ -1,7 +1,7 @@ import { type JSX, createContext, useContext } from "solid-js"; export interface ColorFieldContextValue { - onBlur: JSX.FocusEventHandlerUnion; + onBlur: JSX.EventHandlerUnion; } export const ColorFieldContext = createContext(); diff --git a/packages/core/src/color-field/color-field-input.tsx b/packages/core/src/color-field/color-field-input.tsx index f671ff0d..1ed27f58 100644 --- a/packages/core/src/color-field/color-field-input.tsx +++ b/packages/core/src/color-field/color-field-input.tsx @@ -15,7 +15,7 @@ export interface ColorFieldInputOptions export interface ColorFieldInputCommonProps< T extends HTMLElement = HTMLInputElement, > { - onBlur: JSX.FocusEventHandlerUnion; + onBlur: JSX.EventHandlerUnion; } export interface ColorFieldInputRenderProps diff --git a/packages/core/src/color-field/color-field-root.tsx b/packages/core/src/color-field/color-field-root.tsx index cc39eab3..706a8b77 100644 --- a/packages/core/src/color-field/color-field-root.tsx +++ b/packages/core/src/color-field/color-field-root.tsx @@ -76,9 +76,7 @@ export function ColorFieldRoot( } }; - const onBlur: JSX.FocusEventHandlerUnion = ( - e, - ) => { + const onBlur: JSX.EventHandlerUnion = (e) => { if (!value()!.length) { setPrevValue(""); return; diff --git a/packages/core/src/color-wheel/color-wheel-input.tsx b/packages/core/src/color-wheel/color-wheel-input.tsx index 3d184112..4a2c0232 100644 --- a/packages/core/src/color-wheel/color-wheel-input.tsx +++ b/packages/core/src/color-wheel/color-wheel-input.tsx @@ -36,10 +36,11 @@ export function ColorWheelInput(props: ColorWheelInputProps) { const { fieldProps } = createFormControlField(formControlFieldProps); - const onChange: JSX.ChangeEventHandlerUnion = ( - e, - ) => { - callHandler(e, local.onChange); + const onChange: JSX.EventHandlerUnion = (e) => { + callHandler( + e, + local.onChange as JSX.EventHandlerUnion, + ); const target = e.target as HTMLInputElement; diff --git a/packages/core/src/color-wheel/color-wheel-root.tsx b/packages/core/src/color-wheel/color-wheel-root.tsx index 08c21b20..1dc60b07 100644 --- a/packages/core/src/color-wheel/color-wheel-root.tsx +++ b/packages/core/src/color-wheel/color-wheel-root.tsx @@ -47,7 +47,7 @@ export interface ColorWheelRootOptions { defaultValue?: Color; /** The thickness of the track. */ - thickness: number; + thickness?: number; /** Event handler called when the value changes. */ onChange?: (value: Color) => void; diff --git a/packages/core/src/list/create-single-select-list-state.ts b/packages/core/src/list/create-single-select-list-state.ts index 1a221792..cdd52a39 100644 --- a/packages/core/src/list/create-single-select-list-state.ts +++ b/packages/core/src/list/create-single-select-list-state.ts @@ -68,6 +68,9 @@ export function createSingleSelectListState( selectedKeys, onSelectionChange: (keys: Set) => { const key = (keys as Set).values().next().value; + if (key === undefined) { + return; + } // Always fire onSelectionChange, even if the key is the same // as the current key (createControllableSignal does not). diff --git a/packages/core/src/number-field/number-field-hidden-input.tsx b/packages/core/src/number-field/number-field-hidden-input.tsx index 2ea0ff15..16b7c2d8 100644 --- a/packages/core/src/number-field/number-field-hidden-input.tsx +++ b/packages/core/src/number-field/number-field-hidden-input.tsx @@ -1,6 +1,7 @@ import { callHandler, mergeRefs, visuallyHiddenStyles } from "@kobalte/utils"; import { type ComponentProps, batch, splitProps } from "solid-js"; +import type { JSX } from "solid-js"; import { useFormControlContext } from "../form-control"; import { useNumberFieldContext } from "./number-field-context"; @@ -26,7 +27,10 @@ export function NumberFieldHiddenInput(props: NumberFieldHiddenInputProps) { disabled={formControlContext.isDisabled()} readOnly={formControlContext.isReadOnly()} onChange={(e) => { - callHandler(e, local.onChange); + callHandler( + e, + local.onChange as JSX.EventHandlerUnion, + ); // enable form autofill batch(() => { context.setValue((e.target as HTMLInputElement).value); diff --git a/packages/core/src/pagination/pagination-item.tsx b/packages/core/src/pagination/pagination-item.tsx index 14a2b145..e4296c2a 100644 --- a/packages/core/src/pagination/pagination-item.tsx +++ b/packages/core/src/pagination/pagination-item.tsx @@ -46,7 +46,7 @@ export function PaginationItem( return context.page() === local.page; }; - const onClick: JSX.EventHandlerUnion = () => { + const onClick: JSX.EventHandlerUnion = () => { context.setPage(local.page); }; diff --git a/packages/core/src/pagination/pagination-previous.tsx b/packages/core/src/pagination/pagination-previous.tsx index c9c34f9c..1ec80a96 100644 --- a/packages/core/src/pagination/pagination-previous.tsx +++ b/packages/core/src/pagination/pagination-previous.tsx @@ -36,7 +36,7 @@ export function PaginationPrevious( "onClick", ]); - const onClick: JSX.EventHandlerUnion = () => { + const onClick: JSX.EventHandlerUnion = () => { context.setPage(context.page() - 1); }; diff --git a/packages/core/src/slider/slider-input.tsx b/packages/core/src/slider/slider-input.tsx index c45cb9ba..140bdebd 100644 --- a/packages/core/src/slider/slider-input.tsx +++ b/packages/core/src/slider/slider-input.tsx @@ -49,10 +49,11 @@ export function SliderInput(props: SliderInputProps) { const [valueText, setValueText] = createSignal(""); - const onChange: JSX.ChangeEventHandlerUnion = ( - e, - ) => { - callHandler(e, local.onChange); + const onChange: JSX.EventHandlerUnion = (e) => { + callHandler( + e, + local.onChange as JSX.EventHandlerUnion, + ); const target = e.target as HTMLInputElement; diff --git a/packages/core/src/tabs/tabs-trigger.tsx b/packages/core/src/tabs/tabs-trigger.tsx index 51161870..381dfa8b 100644 --- a/packages/core/src/tabs/tabs-trigger.tsx +++ b/packages/core/src/tabs/tabs-trigger.tsx @@ -128,7 +128,7 @@ export function TabsTrigger( () => ref, ); - const onClick: JSX.EventHandlerUnion = (e) => { + const onClick: JSX.EventHandlerUnion = (e) => { // Force focusing the trigger on click on safari. if (isWebKit()) { focusWithoutScrolling(e.currentTarget); diff --git a/packages/core/src/time-field/time-field-segment.tsx b/packages/core/src/time-field/time-field-segment.tsx index 51aa8d10..5925c97b 100644 --- a/packages/core/src/time-field/time-field-segment.tsx +++ b/packages/core/src/time-field/time-field-segment.tsx @@ -86,15 +86,18 @@ export function TimeFieldSegment( props as TimeFieldSegmentProps, ); - const [local, others] = splitProps(mergedProps as TimeFieldSegmentProps, [ - "ref", - "segment", - "onKeyDown", - "onBeforeInput", - "onInput", - "onFocus", - "children", - ]); + const [local, others] = splitProps( + mergedProps as TimeFieldSegmentProps & { id: string }, + [ + "ref", + "segment", + "onKeyDown", + "onBeforeInput", + "onInput", + "onFocus", + "children", + ], + ); const { locale } = useLocale(); diff --git a/packages/core/vite.config.ts b/packages/core/vite.config.ts index 94cb7b3b..40a7a0bd 100644 --- a/packages/core/vite.config.ts +++ b/packages/core/vite.config.ts @@ -11,5 +11,9 @@ export default defineConfig({ }, resolve: { conditions: ["development", "browser"], + dedupe: ["solid-js"], + }, + ssr: { + noExternal: true, }, }); diff --git a/packages/tests/package.json b/packages/tests/package.json index 0e2c3683..35806080 100644 --- a/packages/tests/package.json +++ b/packages/tests/package.json @@ -49,7 +49,7 @@ }, "peerDependencies": { "@solidjs/testing-library": "^0.8.6", - "solid-js": "^1.8.15", + "solid-js": "^1.9.8", "vitest": "^1.3.1" } } diff --git a/packages/utils/package.json b/packages/utils/package.json index 88df0c45..f5a1df1b 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -61,7 +61,7 @@ "@solid-primitives/utils": "^6.2.1" }, "peerDependencies": { - "solid-js": "^1.8.8" + "solid-js": "^1.9.8" }, "publishConfig": { "access": "public" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 971db5f1..e054a2e9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,9 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + solid-js: '>=1.9.14' + importers: .: @@ -28,37 +31,37 @@ importers: version: 17.7.0 '@commitlint/cz-commitlint': specifier: 17.7.1 - version: 17.7.1(commitizen@4.3.0(@types/node@20.5.4)(typescript@4.9.5))(inquirer@8.2.5) + version: 17.7.1(commitizen@4.3.0(@types/node@20.5.4)(typescript@6.0.3))(inquirer@8.2.5) '@solidjs/testing-library': - specifier: 0.8.6 - version: 0.8.6(@solidjs/router@0.12.4(solid-js@1.8.15))(solid-js@1.8.15) + specifier: 0.8.10 + version: 0.8.10(@solidjs/router@0.16.2(solid-js@1.9.14))(solid-js@1.9.14) '@testing-library/dom': - specifier: 9.3.4 - version: 9.3.4 + specifier: 10.4.1 + version: 10.4.1 '@testing-library/jest-dom': - specifier: 6.4.2 - version: 6.4.2(vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0)) + specifier: 6.9.1 + version: 6.9.1 '@testing-library/user-event': - specifier: 14.5.2 - version: 14.5.2(@testing-library/dom@9.3.4) + specifier: 14.6.1 + version: 14.6.1(@testing-library/dom@10.4.1) '@types/node': specifier: 20.5.4 version: 20.5.4 '@vitest/ui': - specifier: ^1.5.2 - version: 1.6.0(vitest@1.3.1) + specifier: 4.1.10 + version: 4.1.10(vitest@4.1.10) babel-preset-solid: specifier: 1.7.7 version: 1.7.7(@babel/core@7.22.10) commitizen: specifier: 4.3.0 - version: 4.3.0(@types/node@20.5.4)(typescript@4.9.5) + version: 4.3.0(@types/node@20.5.4)(typescript@6.0.3) inquirer: specifier: 8.2.5 version: 8.2.5 jsdom: - specifier: 19.0.0 - version: 19.0.0 + specifier: 29.1.1 + version: 29.1.1 prettier: specifier: 4.0.0-alpha.10 version: 4.0.0-alpha.10 @@ -81,211 +84,145 @@ importers: specifier: 2.0.1 version: 2.0.1(@types/babel__core@7.20.5) solid-js: - specifier: 1.8.15 - version: 1.8.15 + specifier: '>=1.9.14' + version: 1.9.14 tsup: - specifier: 7.2.0 - version: 7.2.0(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5))(typescript@4.9.5) + specifier: 8.5.1 + version: 8.5.1(jiti@2.7.0)(postcss@8.5.16)(typescript@6.0.3)(yaml@2.9.0) turbo: specifier: 1.10.13 version: 1.10.13 typescript: - specifier: 4.9.5 - version: 4.9.5 + specifier: 6.0.3 + version: 6.0.3 vite: - specifier: 5.0.11 - version: 5.0.11(@types/node@20.5.4)(terser@5.31.0) + specifier: 8.1.3 + version: 8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0) vite-plugin-solid: - specifier: 2.9.1 - version: 2.9.1(@testing-library/jest-dom@6.4.2(vitest@1.3.1))(solid-js@1.8.15)(vite@5.0.11(@types/node@20.5.4)(terser@5.31.0)) + specifier: 2.11.12 + version: 2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.14)(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0)) vitest: - specifier: 1.3.1 - version: 1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0) + specifier: 4.1.10 + version: 4.1.10(@types/node@20.5.4)(@vitest/ui@4.1.10)(jsdom@29.1.1)(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0)) apps/docs: dependencies: - '@docsearch/css': - specifier: 3.5.2 - version: 3.5.2 - '@docsearch/js': - specifier: 3.5.2 - version: 3.5.2(@algolia/client-search@4.23.3)(search-insights@2.14.0) - '@internationalized/date': - specifier: 3.4.0 - version: 3.4.0 '@kobalte/core': specifier: workspace:* version: link:../../packages/core + '@kobalte/solidbase': + specifier: 0.6.10 + version: 0.6.10(@solidjs/start@2.0.0-beta.0(@testing-library/jest-dom@6.9.1)(crossws@0.4.7(srvx@0.11.18))(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0)))(solid-js@1.9.14)(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0)) '@solidjs/meta': - specifier: 0.29.3 - version: 0.29.3(solid-js@1.8.15) + specifier: 0.29.4 + version: 0.29.4(solid-js@1.9.14) '@solidjs/router': - specifier: 0.12.4 - version: 0.12.4(solid-js@1.8.15) + specifier: 0.16.2 + version: 0.16.2(solid-js@1.9.14) '@solidjs/start': - specifier: 0.6.1 - version: 0.6.1(@testing-library/jest-dom@6.4.2(vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0)))(rollup@4.18.0)(solid-js@1.8.15)(vinxi@0.3.9(@opentelemetry/api@1.8.0)(@testing-library/jest-dom@6.4.2(vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0)))(@types/node@20.5.4)(ioredis@5.4.1)(preact@10.22.0)(rollup@4.18.0)(terser@5.31.0))(vite@5.1.4(@types/node@20.5.4)(terser@5.31.0)) + specifier: 2.0.0-beta.0 + version: 2.0.0-beta.0(@testing-library/jest-dom@6.9.1)(crossws@0.4.7(srvx@0.11.18))(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0)) '@tanstack/solid-virtual': specifier: 3.0.0-beta.6 version: 3.0.0-beta.6 - clsx: - specifier: 2.0.0 - version: 2.0.0 minisearch: specifier: 7.1.0 version: 7.1.0 + nitro: + specifier: 3.0.260610-beta + version: 3.0.260610-beta(chokidar@5.0.0)(dotenv@17.4.2)(giget@3.3.0)(ioredis@5.11.1)(jiti@2.7.0)(lru-cache@11.5.1)(rollup@4.62.2)(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0)) solid-js: - specifier: 1.8.15 - version: 1.8.15 - undici: - specifier: 5.23.0 - version: 5.23.0 - vinxi: - specifier: 0.3.9 - version: 0.3.9(@opentelemetry/api@1.8.0)(@testing-library/jest-dom@6.4.2(vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0)))(@types/node@20.5.4)(ioredis@5.4.1)(preact@10.22.0)(rollup@4.18.0)(terser@5.31.0) - devDependencies: - '@kobalte/tailwindcss': - specifier: 0.9.0 - version: link:../../packages/tailwindcss - '@mdx-js/mdx': - specifier: 3.0.0 - version: 3.0.0 - '@mdx-js/rollup': - specifier: 3.0.0 - version: 3.0.0(rollup@4.18.0) - '@tailwindcss/typography': - specifier: 0.5.9 - version: 0.5.9(tailwindcss@3.3.3(ts-node@10.9.2(@types/node@20.5.4)(typescript@4.9.5))) - '@vinxi/plugin-mdx': - specifier: 3.7.1 - version: 3.7.1(@mdx-js/mdx@3.0.0) - acorn: - specifier: 8.10.0 - version: 8.10.0 - autoprefixer: - specifier: 10.4.15 - version: 10.4.15(postcss@8.4.28) - github-slugger: - specifier: 2.0.0 - version: 2.0.0 - postcss: - specifier: 8.4.28 - version: 8.4.28 - rehype-pretty-code: - specifier: 0.12.3 - version: 0.12.3(shikiji@0.9.19) - rehype-raw: - specifier: 7.0.0 - version: 7.0.0 - rehype-slug: - specifier: 6.0.0 - version: 6.0.0 - remark-gfm: - specifier: 4.0.0 - version: 4.0.0 - remark-shiki-twoslash: - specifier: 3.1.3 - version: 3.1.3(typescript@4.9.5) - shiki: - specifier: 0.14.7 - version: 0.14.7 - solid-mdx: - specifier: 0.0.7 - version: 0.0.7(solid-js@1.8.15)(vite@5.1.4(@types/node@20.5.4)(terser@5.31.0)) - tailwindcss: - specifier: 3.3.3 - version: 3.3.3(ts-node@10.9.2(@types/node@20.5.4)(typescript@4.9.5)) - typescript: - specifier: 4.9.5 - version: 4.9.5 - unist-util-visit: - specifier: 5.0.0 - version: 5.0.0 + specifier: '>=1.9.14' + version: 1.9.14 vite: - specifier: 5.1.4 - version: 5.1.4(@types/node@20.5.4)(terser@5.31.0) + specifier: 8.1.3 + version: 8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0) + devDependencies: + '@iconify-json/ri': + specifier: ^1.2.10 + version: 1.2.10 packages/core: dependencies: '@floating-ui/dom': specifier: ^1.5.1 - version: 1.6.5 + version: 1.6.10 '@internationalized/number': specifier: ^3.2.1 version: 3.5.3 '@kobalte/utils': specifier: ^0.9.2 - version: link:../utils + version: 0.9.2(solid-js@1.9.14) '@solid-primitives/props': specifier: ^3.1.8 - version: 3.1.11(solid-js@1.8.15) + version: 3.1.11(solid-js@1.9.14) '@solid-primitives/resize-observer': specifier: ^2.0.26 - version: 2.0.26(solid-js@1.8.15) + version: 2.0.26(solid-js@1.9.14) solid-js: - specifier: ^1.8.15 - version: 1.8.15 + specifier: '>=1.9.14' + version: 1.9.14 solid-presence: specifier: ^0.1.8 - version: 0.1.8(solid-js@1.8.15) + version: 0.1.8(solid-js@1.9.14) solid-prevent-scroll: specifier: ^0.1.4 - version: 0.1.7(solid-js@1.8.15) + version: 0.1.7(solid-js@1.9.14) devDependencies: '@kobalte/tests': specifier: workspace:* version: link:../tests esbuild-plugin-solid: specifier: ^0.5.0 - version: 0.5.0(esbuild@0.18.20)(solid-js@1.8.15) + version: 0.5.0(esbuild@0.27.7)(solid-js@1.9.14) tsup: specifier: 7.2.0 - version: 7.2.0(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.5.4)(typescript@4.9.5))(typescript@4.9.5) + version: 7.2.0(postcss@8.5.16)(ts-node@10.9.2(@types/node@20.5.4)(typescript@6.0.3))(typescript@6.0.3) packages/tailwindcss: devDependencies: tailwindcss: specifier: 3.3.3 - version: 3.3.3(ts-node@10.9.2(@types/node@20.5.4)(typescript@4.9.5)) + version: 3.3.3(ts-node@10.9.2(@types/node@20.5.4)(typescript@6.0.3)) packages/tests: dependencies: '@solidjs/testing-library': specifier: ^0.8.6 - version: 0.8.6(@solidjs/router@0.12.4(solid-js@1.8.15))(solid-js@1.8.15) + version: 0.8.10(@solidjs/router@0.16.2(solid-js@1.9.14))(solid-js@1.9.14) solid-js: - specifier: ^1.8.15 - version: 1.8.15 + specifier: '>=1.9.14' + version: 1.9.14 vitest: specifier: ^1.3.1 - version: 1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0) + version: 1.3.1(@types/node@20.5.4)(@vitest/ui@4.1.10(vitest@4.1.10))(jsdom@29.1.1)(lightningcss@1.32.0)(terser@5.31.0) packages/utils: dependencies: '@solid-primitives/event-listener': specifier: ^2.2.14 - version: 2.3.3(solid-js@1.8.15) + version: 2.4.5(solid-js@1.9.14) '@solid-primitives/keyed': specifier: ^1.2.0 - version: 1.2.2(solid-js@1.8.15) + version: 1.2.2(solid-js@1.9.14) '@solid-primitives/map': specifier: ^0.4.7 - version: 0.4.11(solid-js@1.8.15) + version: 0.4.11(solid-js@1.9.14) '@solid-primitives/media': specifier: ^2.2.4 - version: 2.2.9(solid-js@1.8.15) + version: 2.3.5(solid-js@1.9.14) '@solid-primitives/props': specifier: ^3.1.8 - version: 3.1.11(solid-js@1.8.15) + version: 3.1.11(solid-js@1.9.14) '@solid-primitives/refs': specifier: ^1.0.5 - version: 1.0.8(solid-js@1.8.15) + version: 1.0.8(solid-js@1.9.14) '@solid-primitives/utils': specifier: ^6.2.1 - version: 6.2.3(solid-js@1.8.15) + version: 6.4.1(solid-js@1.9.14) solid-js: - specifier: ^1.8.8 - version: 1.8.15 + specifier: '>=1.9.14' + version: 1.9.14 packages/vanilla-extract: devDependencies: @@ -295,73 +232,8 @@ importers: packages: - '@adobe/css-tools@4.3.3': - resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} - - '@algolia/autocomplete-core@1.9.3': - resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} - - '@algolia/autocomplete-plugin-algolia-insights@1.9.3': - resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} - peerDependencies: - search-insights: '>= 1 < 3' - - '@algolia/autocomplete-preset-algolia@1.9.3': - resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - - '@algolia/autocomplete-shared@1.9.3': - resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - - '@algolia/cache-browser-local-storage@4.23.3': - resolution: {integrity: sha512-vRHXYCpPlTDE7i6UOy2xE03zHF2C8MEFjPN2v7fRbqVpcOvAUQK81x3Kc21xyb5aSIpYCjWCZbYZuz8Glyzyyg==} - - '@algolia/cache-common@4.23.3': - resolution: {integrity: sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A==} - - '@algolia/cache-in-memory@4.23.3': - resolution: {integrity: sha512-yvpbuUXg/+0rbcagxNT7un0eo3czx2Uf0y4eiR4z4SD7SiptwYTpbuS0IHxcLHG3lq22ukx1T6Kjtk/rT+mqNg==} - - '@algolia/client-account@4.23.3': - resolution: {integrity: sha512-hpa6S5d7iQmretHHF40QGq6hz0anWEHGlULcTIT9tbUssWUriN9AUXIFQ8Ei4w9azD0hc1rUok9/DeQQobhQMA==} - - '@algolia/client-analytics@4.23.3': - resolution: {integrity: sha512-LBsEARGS9cj8VkTAVEZphjxTjMVCci+zIIiRhpFun9jGDUlS1XmhCW7CTrnaWeIuCQS/2iPyRqSy1nXPjcBLRA==} - - '@algolia/client-common@4.23.3': - resolution: {integrity: sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw==} - - '@algolia/client-personalization@4.23.3': - resolution: {integrity: sha512-3E3yF3Ocr1tB/xOZiuC3doHQBQ2zu2MPTYZ0d4lpfWads2WTKG7ZzmGnsHmm63RflvDeLK/UVx7j2b3QuwKQ2g==} - - '@algolia/client-search@4.23.3': - resolution: {integrity: sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==} - - '@algolia/logger-common@4.23.3': - resolution: {integrity: sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g==} - - '@algolia/logger-console@4.23.3': - resolution: {integrity: sha512-8xoiseoWDKuCVnWP8jHthgaeobDLolh00KJAdMe9XPrWPuf1by732jSpgy2BlsLTaT9m32pHI8CRfrOqQzHv3A==} - - '@algolia/recommend@4.23.3': - resolution: {integrity: sha512-9fK4nXZF0bFkdcLBRDexsnGzVmu4TSYZqxdpgBW2tEyfuSSY54D4qSRkLmNkrrz4YFvdh2GM1gA8vSsnZPR73w==} - - '@algolia/requester-browser-xhr@4.23.3': - resolution: {integrity: sha512-jDWGIQ96BhXbmONAQsasIpTYWslyjkiGu0Quydjlowe+ciqySpiDUrJHERIRfELE5+wFc7hc1Q5hqjGoV7yghw==} - - '@algolia/requester-common@4.23.3': - resolution: {integrity: sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw==} - - '@algolia/requester-node-http@4.23.3': - resolution: {integrity: sha512-zgu++8Uj03IWDEJM3fuNl34s746JnZOWn1Uz5taV1dFyJhVM/kTNw9Ik7YJWiUNHJQXcaD8IXD1eCb0nq/aByA==} - - '@algolia/transporter@4.23.3': - resolution: {integrity: sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ==} + '@adobe/css-tools@4.5.0': + resolution: {integrity: sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==} '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} @@ -371,27 +243,42 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@antfu/utils@0.7.8': - resolution: {integrity: sha512-rWQkqXRESdjXtc+7NRfK9lASQjpXJu1ayp7qi1d23zZorY+wBHVLHHoVcMsEnkqEBWTFqbztO7/QdJFzyEcLTg==} + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + + '@asamuzakjp/css-color@5.1.11': + resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + '@asamuzakjp/dom-selector@7.1.1': + resolution: {integrity: sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - '@babel/code-frame@7.24.6': - resolution: {integrity: sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==} + '@asamuzakjp/generational-cache@1.0.1': + resolution: {integrity: sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + '@asamuzakjp/nwsapi@2.3.9': + resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} + + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.24.6': - resolution: {integrity: sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==} + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} engines: {node: '>=6.9.0'} '@babel/core@7.22.10': resolution: {integrity: sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==} engines: {node: '>=6.9.0'} - '@babel/core@7.24.6': - resolution: {integrity: sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==} + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.24.6': - resolution: {integrity: sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==} + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.24.6': @@ -402,8 +289,8 @@ packages: resolution: {integrity: sha512-+wnfqc5uHiMYtvRX7qu80Toef8BXeh4HHR1SPeonGb1SKPniNEd4a/nlaJJMv/OIEYvIVavvo0yR7u10Gqz0Iw==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.24.6': - resolution: {integrity: sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==} + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} engines: {node: '>=6.9.0'} '@babel/helper-create-class-features-plugin@7.24.6': @@ -441,6 +328,10 @@ packages: resolution: {integrity: sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==} engines: {node: '>=6.9.0'} + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + '@babel/helper-hoist-variables@7.24.6': resolution: {integrity: sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==} engines: {node: '>=6.9.0'} @@ -453,12 +344,12 @@ packages: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.24.6': - resolution: {integrity: sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==} + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.24.6': - resolution: {integrity: sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==} + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -495,32 +386,28 @@ packages: resolution: {integrity: sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.6': - resolution: {integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.6': - resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.24.6': - resolution: {integrity: sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==} + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} engines: {node: '>=6.9.0'} '@babel/helper-wrap-function@7.24.6': resolution: {integrity: sha512-f1JLrlw/jbiNfxvdrfBgio/gRBk3yTAEJWirpAkiJG2Hb22E7cEYKHWo0dFPTv/niPovzIdPdEDetrv6tC6gPQ==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.24.6': - resolution: {integrity: sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==} + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.6': - resolution: {integrity: sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.24.6': - resolution: {integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==} + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} engines: {node: '>=6.0.0'} hasBin: true @@ -872,18 +759,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-development@7.24.6': - resolution: {integrity: sha512-F7EsNp5StNDouSSdYyDSxh4J+xvj/JqG+Cb6s2fA+jCyHOzigG5vTwgH8tU2U8Voyiu5zCG9bAK49wTr/wPH0w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx@7.24.6': - resolution: {integrity: sha512-pCtPHhpRZHfwdA5G1Gpk5mIzMA99hv0R8S/Ket50Rw+S+8hkt3wBWqdqHaPw0CuUYxdshUgsPiLQ5fAs4ASMhw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.24.6': resolution: {integrity: sha512-SMDxO95I8WXRtXhTAc8t/NFQUT7VYbIWwJCJgEli9ml4MhqUMh4S6hxgH6SmAC3eAQNWCDJFxcFeEt9w2sDdXg==} engines: {node: '>=6.9.0'} @@ -980,16 +855,16 @@ packages: resolution: {integrity: sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==} engines: {node: '>=6.9.0'} - '@babel/template@7.24.6': - resolution: {integrity: sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==} + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.24.6': - resolution: {integrity: sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==} + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} engines: {node: '>=6.9.0'} - '@babel/types@7.24.6': - resolution: {integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==} + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} '@biomejs/biome@1.8.1': @@ -1014,24 +889,28 @@ packages: engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] + libc: [musl] '@biomejs/cli-linux-arm64@1.8.1': resolution: {integrity: sha512-3SzZRuC/9Oi2P2IBNPsEj0KXxSXUEYRR2kfRF/Ve8QAfGgrt4qnwuWd6QQKKN5R+oYH691qjm+cXBKEcrP1v/Q==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] + libc: [glibc] '@biomejs/cli-linux-x64-musl@1.8.1': resolution: {integrity: sha512-fYbP/kNu/rtZ4kKzWVocIdqZOtBSUEg9qUhZaao3dy3CRzafR6u6KDtBeSCnt47O+iLnks1eOR1TUxzr5+QuqA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] + libc: [musl] '@biomejs/cli-linux-x64@1.8.1': resolution: {integrity: sha512-AeBycVdNrTzsyYKEOtR2R0Ph0hCD0sCshcp2aOnfGP0hCZbtFg09D0SdKLbyzKntisY41HxKVrydYiaApp+2uw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] + libc: [glibc] '@biomejs/cli-win32-arm64@1.8.1': resolution: {integrity: sha512-6tEd1H/iFKpgpE3OIB7oNgW5XkjiVMzMRPL8zYoZ036YfuJ5nMYm9eB9H/y81+8Z76vL48fiYzMPotJwukGPqQ==} @@ -1045,6 +924,13 @@ packages: cpu: [x64] os: [win32] + '@bprogress/core@1.3.4': + resolution: {integrity: sha512-q/AqpurI/1uJzOrQROuZWixn/+ARekh+uvJGwLCP6HQ/EqAX4SkvNf618tSBxL4NysC0MwqAppb/mRw6Tzi61w==} + + '@bramus/specificity@2.4.2': + resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} + hasBin: true + '@changesets/apply-release-plan@6.1.4': resolution: {integrity: sha512-FMpKF1fRlJyCZVYHr3CbinpZZ+6MwvOtWUuO8uo+svcATEoc1zRDcj23pAurJ2TZ/uVz1wFHH6K3NlACy0PLew==} @@ -1097,10 +983,6 @@ packages: '@changesets/write@0.2.3': resolution: {integrity: sha512-Dbamr7AIMvslKnNYsLFafaVORx4H0pvCA2MHqgtNCySMe1blImEyAEOzDmcgKAkgz4+uwoLz7demIrX+JBr/Xw==} - '@cloudflare/kv-asset-handler@0.3.2': - resolution: {integrity: sha512-EeEjMobfuJrwoctj7FA1y1KEbM0+Q1xSjobIEyie9k4haVEBB7vkDvsasw1pM3rO39mL2akxIAzLMUAtrMHZhA==} - engines: {node: '>=16.13'} - '@commitlint/cli@17.7.1': resolution: {integrity: sha512-BCm/AT06SNCQtvFv921iNhudOHuY16LswT0R3OeolVGLk8oP+Rk9TfQfgjH7QPMjhvp76bNqGFEcpKojxUNW1g==} engines: {node: '>=v14'} @@ -1200,46 +1082,72 @@ packages: '@corvu/utils@0.2.0': resolution: {integrity: sha512-cY0w+SotjOtBX+9oE90vis1Mu2spwGhtcAn4jmrl7JPqQrm68DH/0Rh3R52dN2MbgPVZL06N3mvys18myF5/0Q==} peerDependencies: - solid-js: ^1.8 + solid-js: '>=1.9.14' '@corvu/utils@0.4.1': resolution: {integrity: sha512-swd/2DUJiXTo9PM5GVbBv3jNlEOwmKWvVOJG2l8Cwu1cokoXknKrDkBSZRz+yf0rFXdbhWhRQMWDPMPwuBnWNg==} peerDependencies: - solid-js: ^1.8 + solid-js: '>=1.9.14' '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@deno/shim-deno-test@0.5.0': - resolution: {integrity: sha512-4nMhecpGlPi0cSzT67L+Tm+GOJqvuk8gqHBziqcUQOarnuIax1z96/gJHCSIz2Z0zhxE6Rzwb3IZXPtFh51j+w==} + '@csstools/color-helpers@6.1.0': + resolution: {integrity: sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==} + engines: {node: '>=20.19.0'} - '@deno/shim-deno@0.19.1': - resolution: {integrity: sha512-8hYIpmDqpG76sn+UY1853RCi+CI7ZWz9tt37nfyDL8rwr6xbW0+GHUwCLcsGbh1uMIKURuJy6xtrIcnW+a0duA==} + '@csstools/css-calc@3.2.1': + resolution: {integrity: sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 - '@docsearch/css@3.5.2': - resolution: {integrity: sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==} + '@csstools/css-color-parser@4.1.9': + resolution: {integrity: sha512-paQcIaOO53Rk5+YrBaBjm/SgrV4INImjo2BT1DtQRYr+XeTRbeAYlS+jxXp9drqvKmtFnWRJKIalDLhZZDu42A==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 - '@docsearch/js@3.5.2': - resolution: {integrity: sha512-p1YFTCDflk8ieHgFJYfmyHBki1D61+U9idwrLh+GQQMrBSP3DLGKpy0XUJtPjAOPltcVbqsTjiPFfH7JImjUNg==} + '@csstools/css-parser-algorithms@4.0.0': + resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-tokenizer': ^4.0.0 - '@docsearch/react@3.5.2': - resolution: {integrity: sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==} + '@csstools/css-syntax-patches-for-csstree@1.1.6': + resolution: {integrity: sha512-TcJCWFbXLPpJYq6z7bfOyjWYJDiDg2/I4gyUC9pqPNqHFRIey0EB0q0L5cSnQDfWJg8Jd6VadakxdIez/3zkqQ==} peerDependencies: - '@types/react': '>= 16.8.0 < 19.0.0' - react: '>= 16.8.0 < 19.0.0' - react-dom: '>= 16.8.0 < 19.0.0' - search-insights: '>= 1 < 3' + css-tree: ^3.2.1 peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true - react-dom: - optional: true - search-insights: + css-tree: optional: true + '@csstools/css-tokenizer@4.0.0': + resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} + engines: {node: '>=20.19.0'} + + '@ctrl/tinycolor@4.2.0': + resolution: {integrity: sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==} + engines: {node: '>=14'} + + '@docsearch/css@3.9.0': + resolution: {integrity: sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA==} + + '@docsearch/js@4.6.3': + resolution: {integrity: sha512-qUIX2b4Apew3tv4F0qhmgShsl/Lfw4m6mqv/5/5dWNxwTcDdLMp2s3YwZ+NMGh3IKCg0pBaXm7Q5VdyU5Rj+cQ==} + + '@emnapi/core@1.11.1': + resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} + + '@emnapi/runtime@1.11.1': + resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + '@emotion/hash@0.9.1': resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} @@ -1249,9 +1157,9 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.20.2': - resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} - engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -1261,21 +1169,15 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.18.7': - resolution: {integrity: sha512-o0VVztxJPkfDYbaU1tA1G1iwKiBh6Zt3bX5OdHDoITMFdRg+Mgdt3nHXMEtNlIjYA/Xn6hmlOYDHjJfQUduPuw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.19.12': resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} engines: {node: '>=12'} cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.20.2': - resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -1291,21 +1193,15 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.18.7': - resolution: {integrity: sha512-nDQ7AC5WVKOqxaip/E5YbaRgnilBMsoGKjoGLCeCOYNePaBCBDwJsLfa2fn3FEtktiLaAF990W592avsHjJ/Vg==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.19.12': resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} engines: {node: '>=12'} cpu: [arm] os: [android] - '@esbuild/android-arm@0.20.2': - resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + engines: {node: '>=18'} cpu: [arm] os: [android] @@ -1315,21 +1211,15 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.18.7': - resolution: {integrity: sha512-ga8Dtpb01GorCi1dk3jEwDk3AK/3F+cR5P+//Tl0ERL2K2pK/J1f3t8hcJ+RRt3UYBV/uTL9GEnx7touX0KRPQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.19.12': resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} engines: {node: '>=12'} cpu: [x64] os: [android] - '@esbuild/android-x64@0.20.2': - resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + engines: {node: '>=18'} cpu: [x64] os: [android] @@ -1339,21 +1229,15 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.18.7': - resolution: {integrity: sha512-FVDOdfgyGOOISpd0b+UtA6YNbu5+RzZu7kDztjVsA/iZhGnyxbCR/vZ+B2j5yxbMZ9j3iz5uFiHIq1sl6nrZ0Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.19.12': resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.20.2': - resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -1363,21 +1247,15 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.18.7': - resolution: {integrity: sha512-w7aeD1UjDFXqyrZQLBIPYGmLR+gJsl+7QSwmSz+nVrCZOB7cyWEkIjCF8s4inUD3ja3WtKUIqzX5S4qDnU5q7Q==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.19.12': resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.20.2': - resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -1387,21 +1265,15 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.18.7': - resolution: {integrity: sha512-wKyySDdoKVOPn9eDci/b3eP3EJVAVXC3b2CiaHphhCKfh4n5pWLwj7Ue96anK1HnpcZ0Uti8Sw9xq3Im0earHA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.19.12': resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.20.2': - resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -1411,21 +1283,15 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.18.7': - resolution: {integrity: sha512-rbfjbgSvzWRjQMKIntogK1d2oIAiA/ZVayXfK1WjcIIMQYLg74sAoT8CZBj30+bwn13YR0t6lgIxA1mJaS2Lhw==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.19.12': resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.20.2': - resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -1435,21 +1301,15 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.18.7': - resolution: {integrity: sha512-cwfxKYroaD5BZ42NsfxdVU1issD2NxcuJHlCNsN5LtWq+kZMpwmIVDCJxKlgLIG7zH/4yq8lTuZJurxq058GsA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.19.12': resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.20.2': - resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -1459,21 +1319,15 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.18.7': - resolution: {integrity: sha512-GpUBqqJnQ+7qdb7NqKNVj7TgD2JnLrEdzPtatPow77Me/EQ01GE1tHKZLePqhf5thdLDb5Se2Kcf4D9WTbSjmw==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.19.12': resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} engines: {node: '>=12'} cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.20.2': - resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -1483,21 +1337,15 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.18.7': - resolution: {integrity: sha512-SsvsGStwbArBcB/XNh+2MvUtgOLp0CR6Hn1PBWcdApCuAaMibHCDyzHS06+u/YOD1UpeXFHJZphix61HeVMH/w==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.19.12': resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.20.2': - resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -1513,21 +1361,15 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.18.7': - resolution: {integrity: sha512-WOqQ0eaWGE/e9vmbxFT2exbWuXxHuG8ld0fN7oX5f0v7W6oveUIF4DLJYVae93t1+Icv5R0NBo8wv/o4hEvxBQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.19.12': resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.20.2': - resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -1537,21 +1379,15 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.18.7': - resolution: {integrity: sha512-/dKQ3OLr2Tmj0kuf4ZJioD+qnADUEJSBaiuDbk8v5602HnNNBSGHPrEB6S8PSb8y8jWsX9MMnxqk5KpLTf86OQ==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.19.12': resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.20.2': - resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -1561,21 +1397,15 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.18.7': - resolution: {integrity: sha512-x/k1+daIqiGJt0Yhr5llFJ/zkRg1XAqcS2ntAYzS3pHogO8oIyc+LjsINgVyFCeFMFUZ9Ae9W5z2Ib05bMum3g==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.19.12': resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.20.2': - resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -1585,21 +1415,15 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.18.7': - resolution: {integrity: sha512-LegTDzK9gL/sTkiZUGYLigTISwppZJvQL3MRmFgXgHrj3IzdWkPgMwEtOItK3YiFzhBSSNyKA0mSKEg4UuK8JQ==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.19.12': resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.20.2': - resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -1609,21 +1433,15 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.18.7': - resolution: {integrity: sha512-fjBl45O8ivc3Nl14hdGpbHoVtdHnYGsLpwnlv2rNyb5NOsgY3Y8EhVe/fqR9ndHgO4eL68knKxkrRveEJq+v1g==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.19.12': resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.20.2': - resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -1633,32 +1451,26 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.18.7': - resolution: {integrity: sha512-apYLJsg3wd3hW8nEt7H++8c8rTDvwXxX7h7YeI89g1RDPCT2QSXTO/xT1BCvFa/BFFoau+yvepQg2o5556FIWQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.19.12': resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} engines: {node: '>=12'} cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.20.2': - resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.18.20': - resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} - engines: {node: '>=12'} - cpu: [x64] + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.18.7': - resolution: {integrity: sha512-f82sUnrzdoW4MiiCDn1G3RSsPH8+no+okDhkHgGTGa+5F5wZCyxdXxzR6ctsiimvyPn9FIu9Zs+MesVsBRwyTw==} + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -1669,20 +1481,20 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.20.2': - resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} - engines: {node: '>=12'} + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.18.20': - resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} - engines: {node: '>=12'} - cpu: [x64] + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} + cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.18.7': - resolution: {integrity: sha512-1TNDfpFYhIloHeqSRbJFjHFMYtTJWgqI2+S9uCLVCWrADLl5tCe8vQKDfkM7Afz/lZyqi6qEX/Eg2KA5S7FcNQ==} + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -1693,33 +1505,33 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.20.2': - resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} - engines: {node: '>=12'} + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.18.20': resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.18.7': - resolution: {integrity: sha512-lBhsHaM6EYCmzQCj+xeFev+dgqTgpSRqF7qXrxp5V4waFuidTBbWgqSXY5rsLRNLOyMMCh1cA+RqF8UL30oOJQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.19.12': resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.20.2': - resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} - engines: {node: '>=12'} + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -1729,21 +1541,15 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.18.7': - resolution: {integrity: sha512-p9ipv7rPKitXAAeufg5BzmyYZHZtFfrLGUX15+AxpTQqSZDAZd2wIusaOW5oONTf8RB53ujIqQw7W0QnZMuiUw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.19.12': resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.20.2': - resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -1753,21 +1559,15 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.18.7': - resolution: {integrity: sha512-WmNxuE+j1wUT2rK+e1Oakx3zobS1rPpQudPytGM4nxXEGv0gpXEvnZnrykRwriNFbGVCwFJoE4txayjW76LsCw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.19.12': resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.20.2': - resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -1777,27 +1577,44 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.18.7': - resolution: {integrity: sha512-6RENfAwwL6dxQk/V1PxO/ejYRiOUVUaHi99hP3Dso/38jfNKFzU6YSSR/haJGNV/2wAHIgBMROQodna0IejAuA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.19.12': resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} engines: {node: '>=12'} cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.20.2': - resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - '@fastify/busboy@2.1.1': - resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} - engines: {node: '>=14'} + '@exodus/bytes@1.15.1': + resolution: {integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@noble/hashes': ^1.8.0 || ^2.0.0 + peerDependenciesMeta: + '@noble/hashes': + optional: true + + '@expressive-code/core@0.41.7': + resolution: {integrity: sha512-ck92uZYZ9Wba2zxkiZLsZGi9N54pMSAVdrI9uW3Oo9AtLglD5RmrdTwbYPCT2S/jC36JGB2i+pnQtBm/Ib2+dg==} + + '@expressive-code/plugin-collapsible-sections@0.41.7': + resolution: {integrity: sha512-uh74qWhAW6FEoNdlQAcHCcGBfuhslLvbWL5Fqmi+db/9mZI/I2G1Sr8NfApTEzD+jiIB/GmdPHV9kbjebkn0+g==} + + '@expressive-code/plugin-frames@0.41.7': + resolution: {integrity: sha512-diKtxjQw/979cTglRFaMCY/sR6hWF0kSMg8jsKLXaZBSfGS0I/Hoe7Qds3vVEgeoW+GHHQzMcwvgx/MOIXhrTA==} + + '@expressive-code/plugin-line-numbers@0.41.7': + resolution: {integrity: sha512-wI9D5NBcgE9ksiJJV8YfOC0RPI3283+9AYWIb8pBUM5TSM8msIs1YRPDt8c8Ub0XGQvbjJKtB+f9fAl2RiHJ2A==} + + '@expressive-code/plugin-shiki@0.41.7': + resolution: {integrity: sha512-DL605bLrUOgqTdZ0Ot5MlTaWzppRkzzqzeGEu7ODnHF39IkEBbFdsC7pbl3LbUQ1DFtnfx6rD54k/cdofbW6KQ==} + + '@expressive-code/plugin-text-markers@0.41.7': + resolution: {integrity: sha512-Ewpwuc5t6eFdZmWlFyeuy3e1PTQC0jFvw2Q+2bpcWXbOZhPLsT7+h8lsSIJxb5mS7wZko7cKyQ2RLYDyK6Fpmw==} '@floating-ui/core@1.6.2': resolution: {integrity: sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==} @@ -1805,26 +1622,35 @@ packages: '@floating-ui/dom@1.6.10': resolution: {integrity: sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==} - '@floating-ui/dom@1.6.5': - resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} - - '@floating-ui/utils@0.2.2': - resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} - '@floating-ui/utils@0.2.7': resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==} + '@fontsource-variable/inter@5.2.8': + resolution: {integrity: sha512-kOfP2D+ykbcX/P3IFnokOhVRNoTozo5/JxhAIVYLpea/UBmCQ/YWPBfWIDuBImXX/15KH+eKh4xpEUyS2sQQGQ==} + + '@fontsource-variable/jetbrains-mono@5.2.8': + resolution: {integrity: sha512-WBA9elru6Jdp5df2mES55wuOO0WIrn3kpXnI4+W2ek5u3ZgLS9XS4gmIlcQhiZOWEKl95meYdvK7xI+ETLCq/Q==} + + '@fontsource-variable/lexend@5.2.11': + resolution: {integrity: sha512-0hgEQ4O7Nh8fxL/WWmspJf0BErbocRkZwtLRGey/V4mUUqxfF7QUwqhcdzwpjom3NYCniY4uzQ5wYD7r9/92tQ==} + '@iarna/toml@2.2.5': resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} - '@internationalized/date@3.4.0': - resolution: {integrity: sha512-QUDSGCsvrEVITVf+kv9VSAraAmCgjQmU5CiXtesUBBhBe374NmnEIIaOFBZ72t29dfGMBP0zF+v6toVnbcc6jg==} + '@iconify-json/ri@1.2.10': + resolution: {integrity: sha512-WWMhoncVVM+Xmu9T5fgu2lhYRrKTEWhKk3Com0KiM111EeEsRLiASjpsFKnC/SrB6covhUp95r2mH8tGxhgd5Q==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@3.1.4': + resolution: {integrity: sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==} '@internationalized/number@3.5.3': resolution: {integrity: sha512-rd1wA3ebzlp0Mehj5YTuTI50AQEx80gWFyHcQu+u91/5NgdwBecO8BH6ipPfE+lmQ9d63vpB3H9SHoIUiupllw==} - '@ioredis/commands@1.2.0': - resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + '@ioredis/commands@1.10.0': + resolution: {integrity: sha512-UmeW7z4LfctwoQ5wkhVzgq8tXkreED2xZGpX+Bg+zA+WJFZCT6c062AfCK/Dfk81xZnnwdhJCUMkitihRaoC2Q==} '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -1834,59 +1660,60 @@ packages: resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.6': resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@kobalte/core@0.13.12': + resolution: {integrity: sha512-aumsbsPe99/z2igcX2+p+Mdhzw89uuZx8ZdgfEqSlVuuWeTvkoBtCId5sl/Y7sWvllIOFwPoMzE3u0rAzDNkvg==} + peerDependencies: + solid-js: '>=1.9.14' + + '@kobalte/solidbase@0.6.10': + resolution: {integrity: sha512-pu26EwzfNbk/SHYIweNk06tyFxYbX29k3KSx/ei+KdZJYu1zUUKBAJ9EEaHgz9wEYfzlCVjvTV0ttm/6oQkgWA==} + engines: {node: '>=22'} + peerDependencies: + '@solidjs/start': ^2.0.0 + solid-js: '>=1.9.14' + vite: ^8.0.0 + + '@kobalte/utils@0.9.2': + resolution: {integrity: sha512-jRVXr+zsVHxzDXRoh+CDeXzvCsFJ6uiHhqqNQ26Cw9ZsZ3D6nqPUBt1gGVtj2ZPmRL3a9Uk1v8D1aJ8/I12Dow==} + peerDependencies: + solid-js: '>=1.9.14' + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - '@mapbox/node-pre-gyp@1.0.11': - resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} - hasBin: true - - '@mdx-js/mdx@3.0.0': - resolution: {integrity: sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw==} + '@mdx-js/mdx@3.1.1': + resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} - '@mdx-js/rollup@3.0.0': - resolution: {integrity: sha512-ITvGiwPGEBW+D7CCnpSA9brzAosIWHAi4y+Air8wgfLnez8aWue50avHtWMfnFLCp7vt+JQ9UM8nwfuQuuydxw==} + '@napi-rs/wasm-runtime@1.1.6': + resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} peerDependencies: - rollup: '>=2' - - '@netlify/functions@2.7.0': - resolution: {integrity: sha512-4pXC/fuj3eGQ86wbgPiM4zY8+AsNrdz6vcv6FEdUJnZW+LqF8IWjQcY3S0d1hLeLKODYOqq4CkrzGyCpce63Nw==} - engines: {node: '>=14.0.0'} - - '@netlify/node-cookies@0.1.0': - resolution: {integrity: sha512-OAs1xG+FfLX0LoRASpqzVntVV/RpYkgpI0VrUnw2u0Q1qiZUzcPffxRK8HF3gc4GjuhG5ahOEMJ9bswBiZPq0g==} - engines: {node: ^14.16.0 || >=16.0.0} - - '@netlify/serverless-functions-api@1.18.1': - resolution: {integrity: sha512-DrSvivchuwsuQW03zbVPT3nxCQa5tn7m4aoPOsQKibuJXIuSbfxzCBxPLz0+LchU5ds7YyOaCc9872Y32ngYzg==} - engines: {node: '>=18.0.0'} + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -1900,212 +1727,122 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@opentelemetry/api-logs@0.50.0': - resolution: {integrity: sha512-JdZuKrhOYggqOpUljAq4WWNi5nB10PmgoF0y2CvedLGXd0kSawb/UBnWT8gg1ND3bHCNHStAIVT0ELlxJJRqrA==} - engines: {node: '>=14'} - - '@opentelemetry/api@1.8.0': - resolution: {integrity: sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==} - engines: {node: '>=8.0.0'} + '@oxc-project/types@0.137.0': + resolution: {integrity: sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA==} - '@opentelemetry/core@1.23.0': - resolution: {integrity: sha512-hdQ/a9TMzMQF/BO8Cz1juA43/L5YGtCSiKoOHmrTEf7VMDAZgy8ucpWx3eQTnQ3gBloRcWtzvcrMZABC3PTSKQ==} + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' - '@opentelemetry/core@1.24.1': - resolution: {integrity: sha512-wMSGfsdmibI88K9wB498zXY04yThPexo8jvwNNlm542HZB7XrrMRBbAyKJqG8qDRJwIBdBrPMi4V9ZPW/sqrcg==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' + '@polka/url@1.0.0-next.25': + resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} - '@opentelemetry/otlp-transformer@0.50.0': - resolution: {integrity: sha512-s0sl1Yfqd5q1Kjrf6DqXPWzErL+XHhrXOfejh4Vc/SMTNqC902xDsC8JQxbjuramWt/+hibfguIvi7Ns8VLolA==} - engines: {node: '>=14'} + '@prettier/cli@0.6.0': + resolution: {integrity: sha512-kPQDTB+FPjvj23SmBH4T9uGCxMVS1cyJSY9dbOHGOC29nL9gR5gwZ4b4uMj4QRB0uE5K9c7avbAo+gvUbcZb4Q==} + hasBin: true peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.9.0' - - '@opentelemetry/resources@1.23.0': - resolution: {integrity: sha512-iPRLfVfcEQynYGo7e4Di+ti+YQTAY0h5mQEUJcHlU9JOqpb4x965O6PZ+wMcwYVY63G96KtdS86YCM1BF1vQZg==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' - - '@opentelemetry/resources@1.24.1': - resolution: {integrity: sha512-cyv0MwAaPF7O86x5hk3NNgenMObeejZFLJJDVuSeSMIsknlsj3oOZzRv3qSzlwYomXsICfBeFFlxwHQte5mGXQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' - - '@opentelemetry/sdk-logs@0.50.0': - resolution: {integrity: sha512-PeUEupBB29p9nlPNqXoa1PUWNLsZnxG0DCDj3sHqzae+8y76B/A5hvZjg03ulWdnvBLYpnJslqzylG9E0IL87g==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.4.0 <1.9.0' - '@opentelemetry/api-logs': '>=0.39.1' - - '@opentelemetry/sdk-metrics@1.23.0': - resolution: {integrity: sha512-4OkvW6+wST4h6LFG23rXSTf6nmTf201h9dzq7bE0z5R9ESEVLERZz6WXwE7PSgg1gdjlaznm1jLJf8GttypFDg==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.9.0' - - '@opentelemetry/sdk-trace-base@1.23.0': - resolution: {integrity: sha512-PzBmZM8hBomUqvCddF/5Olyyviayka44O5nDWq673np3ctnvwMOvNrsUORZjKja1zJbwEuD9niAGbnVrz3jwRQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' - - '@opentelemetry/sdk-trace-base@1.24.1': - resolution: {integrity: sha512-zz+N423IcySgjihl2NfjBf0qw1RWe11XIAWVrTNOSSI6dtSPJiVom2zipFB2AEEtJWpv0Iz6DY6+TjnyTV5pWg==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' - - '@opentelemetry/semantic-conventions@1.23.0': - resolution: {integrity: sha512-MiqFvfOzfR31t8cc74CTP1OZfz7MbqpAnLCra8NqQoaHJX6ncIRTdYOQYBDQ2uFISDq0WY8Y9dDTWvsgzzBYRg==} - engines: {node: '>=14'} + prettier: ^3.1.0 || ^4.0.0 - '@opentelemetry/semantic-conventions@1.24.1': - resolution: {integrity: sha512-VkliWlS4/+GHLLW7J/rVBA00uXus1SWvwFvcUDxDwmFxYfg/2VI6ekwdXS28cjI8Qz2ky2BzG8OUHo+WeYIWqw==} - engines: {node: '>=14'} + '@reach/observe-rect@1.2.0': + resolution: {integrity: sha512-Ba7HmkFgfQxZqqaeIWWkNK0rEhpxVQHIoVyW1YDSkGsGIXzcaW4deC8B0pZrNSSyLTdIk7y+5olKt5+g0GmFIQ==} - '@parcel/watcher-android-arm64@2.4.1': - resolution: {integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==} - engines: {node: '>= 10.0.0'} + '@rolldown/binding-android-arm64@1.1.3': + resolution: {integrity: sha512-DT6Z3PhvioeHMvxo+xHc3KtqggrI7CCTXCmC2h/5zUlp5jVitv7XEy+9q5/7v8IolhlioawpMo8Kg0EEBy7J0g==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@parcel/watcher-darwin-arm64@2.4.1': - resolution: {integrity: sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==} - engines: {node: '>= 10.0.0'} + '@rolldown/binding-darwin-arm64@1.1.3': + resolution: {integrity: sha512-0NwgwsjM7LrsuVnXMK3koTpagBNOhloc/BNjKqZjv4V5zI5r13qx69uVhRx+o5Z0yy4Hzq+lpy7TAgUG/ocvrw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@parcel/watcher-darwin-x64@2.4.1': - resolution: {integrity: sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==} - engines: {node: '>= 10.0.0'} + '@rolldown/binding-darwin-x64@1.1.3': + resolution: {integrity: sha512-YtiBp4disu6V560loT6PjMdiRaWmVvDNrUunAalbiFx2ggeJwxdAsgZMcoGP17uyAsTwAj5V1niksxlHnVQ1Sw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@parcel/watcher-freebsd-x64@2.4.1': - resolution: {integrity: sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==} - engines: {node: '>= 10.0.0'} + '@rolldown/binding-freebsd-x64@1.1.3': + resolution: {integrity: sha512-yD3EkEdXk2LypPxnf/kSZHirarsI8gcPzc62SukhR9VJTyvV+F9Q/GxWNuCojc7sXyuVC4DxRGhdDK4X8VSsbw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@parcel/watcher-linux-arm-glibc@2.4.1': - resolution: {integrity: sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==} - engines: {node: '>= 10.0.0'} + '@rolldown/binding-linux-arm-gnueabihf@1.1.3': + resolution: {integrity: sha512-c+8vieQbsD7HNAHKIA34w0GJ9FedFFuJGD+7E6vz7Q3uqAIugL5p45fhlsj4UaAsHpcmlqugBWMhA0/j7o0sIg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@parcel/watcher-linux-arm64-glibc@2.4.1': - resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} - engines: {node: '>= 10.0.0'} + '@rolldown/binding-linux-arm64-gnu@1.1.3': + resolution: {integrity: sha512-50jD0uUwLvur7Zz9LHz17kaAdTPjn5wN93hEgjvmYFRZwiR7ZJYovTd5ipyWJDAnXKvZ+wgc+/Ika6dwSF5OcA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] - '@parcel/watcher-linux-arm64-musl@2.4.1': - resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} - engines: {node: '>= 10.0.0'} + '@rolldown/binding-linux-arm64-musl@1.1.3': + resolution: {integrity: sha512-BO9+oPL8K9poZJBfYPsXNtYjPE5uM3qeehT3aFcW4LITOl+iSqhp0abzjR2nWBUNjIZeKXjAEWBZ64WjNoHd6w==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] - '@parcel/watcher-linux-x64-glibc@2.4.1': - resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} - engines: {node: '>= 10.0.0'} + '@rolldown/binding-linux-ppc64-gnu@1.1.3': + resolution: {integrity: sha512-f3VpLB1vQ0Eo6ecr/6cekLnvYMFF4YBFoVGkfkvPLq1bAkbAwHYQPZKoAmG6OJyTcxxoC+AvezGx/S1obNC0Mw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.1.3': + resolution: {integrity: sha512-AmurZ26Pqx/RI9N1gzEOCklkKXl927yjfXWUUS0O7Puh8ARM/Ob8qfrD3qnWksScdw6cSrW5PSHE9DyLu7+PtA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.1.3': + resolution: {integrity: sha512-JJpqs8bRGITDOdbkNKnlojzBabbOHrqjSvDr0IVsZObE1lBcPjxItUEY9eWIDbxaJ3cGrXPWGfGkIxFijg/URg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] - '@parcel/watcher-linux-x64-musl@2.4.1': - resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} - engines: {node: '>= 10.0.0'} + '@rolldown/binding-linux-x64-musl@1.1.3': + resolution: {integrity: sha512-rSJcdjPxzA/by/6/rYs+v+bXU7UjvnbUWz8MJb6kh6+knqB1dCrtHg0uu7C/4haqJvqdkYHQ5IGn+tCH9GLW/g==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] - '@parcel/watcher-wasm@2.3.0': - resolution: {integrity: sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==} - engines: {node: '>= 10.0.0'} - bundledDependencies: - - napi-wasm + '@rolldown/binding-openharmony-arm64@1.1.3': + resolution: {integrity: sha512-hQ3/PYkDJICgevvyNcVrihVeqq7k1Pp3VZ9lY+dauAYUJKO+auqApvANhvR1An9BhmqYKvW2Mu1F9u4DXSMLxQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] - '@parcel/watcher-wasm@2.4.1': - resolution: {integrity: sha512-/ZR0RxqxU/xxDGzbzosMjh4W6NdYFMqq2nvo2b8SLi7rsl/4jkL8S5stIikorNkdR50oVDvqb/3JT05WM+CRRA==} - engines: {node: '>= 10.0.0'} - bundledDependencies: - - napi-wasm + '@rolldown/binding-wasm32-wasi@1.1.3': + resolution: {integrity: sha512-Elcv/BtML9lXrV6JuKITc/grN2kYV9gjsQpW8Jfw4ioK0TOkjBjye0nnyqQNy9STNaI20lXNaQBRrD5gSgR0Yg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] - '@parcel/watcher-win32-arm64@2.4.1': - resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} - engines: {node: '>= 10.0.0'} + '@rolldown/binding-win32-arm64-msvc@1.1.3': + resolution: {integrity: sha512-2DrEfhluH9yhiaFApmsjsjwrSYbNcY1oFTzYSP1a535jDbV98zCFanA/96TBUd0iDFcxGmw9QRExwGCXz3U+/g==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@parcel/watcher-win32-ia32@2.4.1': - resolution: {integrity: sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==} - engines: {node: '>= 10.0.0'} - cpu: [ia32] - os: [win32] - - '@parcel/watcher-win32-x64@2.4.1': - resolution: {integrity: sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==} - engines: {node: '>= 10.0.0'} + '@rolldown/binding-win32-x64-msvc@1.1.3': + resolution: {integrity: sha512-OL4OMk7UPXOeVGGd3qo5zJyPIljf4AFgk5QAkPPS+OoLuOOozhuaQGC18MxVTnw/06q93gShAJzlwnSCY9YtqA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@parcel/watcher@2.4.1': - resolution: {integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==} - engines: {node: '>= 10.0.0'} - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@polka/url@1.0.0-next.25': - resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} - - '@preact/preset-vite@2.8.2': - resolution: {integrity: sha512-m3tl+M8IO8jgiHnk+7LSTFl8axdPXloewi7iGVLdmCwf34XOzEUur0bZVewW4DUbUipFjTS2CXu27+5f/oexBA==} - peerDependencies: - '@babel/core': 7.x - vite: 2.x || 3.x || 4.x || 5.x - - '@prefresh/babel-plugin@0.5.1': - resolution: {integrity: sha512-uG3jGEAysxWoyG3XkYfjYHgaySFrSsaEb4GagLzYaxlydbuREtaX+FTxuIidp241RaLl85XoHg9Ej6E4+V1pcg==} - - '@prefresh/core@1.5.2': - resolution: {integrity: sha512-A/08vkaM1FogrCII5PZKCrygxSsc11obExBScm3JF1CryK2uDS3ZXeni7FeKCx1nYdUkj4UcJxzPzc1WliMzZA==} - peerDependencies: - preact: ^10.0.0 - - '@prefresh/utils@1.2.0': - resolution: {integrity: sha512-KtC/fZw+oqtwOLUFM9UtiitB0JsVX0zLKNyRTA332sqREqSALIIQQxdUCS1P3xR/jT1e2e8/5rwH6gdcMLEmsQ==} - - '@prefresh/vite@2.4.5': - resolution: {integrity: sha512-iForDVJ2M8gQYnm5pHumvTEJjGGc7YNYC0GVKnHFL+GvFfKHfH9Rpq67nUAzNbjuLEpqEOUuQVQajMazWu2ZNQ==} - peerDependencies: - preact: ^10.4.0 - vite: '>=2.0.0' - - '@prettier/cli@0.6.0': - resolution: {integrity: sha512-kPQDTB+FPjvj23SmBH4T9uGCxMVS1cyJSY9dbOHGOC29nL9gR5gwZ4b4uMj4QRB0uE5K9c7avbAo+gvUbcZb4Q==} - hasBin: true - peerDependencies: - prettier: ^3.1.0 || ^4.0.0 - - '@reach/observe-rect@1.2.0': - resolution: {integrity: sha512-Ba7HmkFgfQxZqqaeIWWkNK0rEhpxVQHIoVyW1YDSkGsGIXzcaW4deC8B0pZrNSSyLTdIk7y+5olKt5+g0GmFIQ==} - - '@rollup/plugin-alias@5.1.0': - resolution: {integrity: sha512-lpA3RZ9PdIG7qqhEfv79tBffNaoDuukFDrmhLqg9ifv99u/ehn+lOg30x2zmhf8AQqQUZaMk/B9fZraQ6/acDQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} '@rollup/plugin-babel@6.0.4': resolution: {integrity: sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==} @@ -2120,33 +1857,6 @@ packages: rollup: optional: true - '@rollup/plugin-commonjs@25.0.8': - resolution: {integrity: sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.68.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/plugin-inject@5.0.5': - resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/plugin-json@6.1.0': - resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - '@rollup/plugin-node-resolve@15.2.3': resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} engines: {node: '>=14.0.0'} @@ -2156,15 +1866,6 @@ packages: rollup: optional: true - '@rollup/plugin-replace@5.0.5': - resolution: {integrity: sha512-rYO4fOi8lMaTg/z5Jb+hKnrHHVn8j2lwkqwyS4kTRhKyWOLf2wST2sWXr4WzWiTcoHTp2sTjqUbqIj2E39slKQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - '@rollup/plugin-terser@0.1.0': resolution: {integrity: sha512-N2KK+qUfHX2hBzVzM41UWGLrEmcjVC37spC8R3c9mt3oEDFKh3N2e12/lLp9aVSt86veR0TQiCNQXrm8C6aiUQ==} engines: {node: '>=14.0.0'} @@ -2174,19 +1875,6 @@ packages: rollup: optional: true - '@rollup/plugin-terser@0.4.4': - resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/pluginutils@4.2.1': - resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} - engines: {node: '>= 8.0.0'} - '@rollup/pluginutils@5.1.0': resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} @@ -2196,220 +1884,338 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.18.0': - resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} + '@rollup/rollup-android-arm-eabi@4.62.2': + resolution: {integrity: sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.18.0': - resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} + '@rollup/rollup-android-arm64@4.62.2': + resolution: {integrity: sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.18.0': - resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} + '@rollup/rollup-darwin-arm64@4.62.2': + resolution: {integrity: sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.18.0': - resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} + '@rollup/rollup-darwin-x64@4.62.2': + resolution: {integrity: sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.18.0': - resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} + '@rollup/rollup-freebsd-arm64@4.62.2': + resolution: {integrity: sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.62.2': + resolution: {integrity: sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.62.2': + resolution: {integrity: sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==} cpu: [arm] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.18.0': - resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} + '@rollup/rollup-linux-arm-musleabihf@4.62.2': + resolution: {integrity: sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==} cpu: [arm] os: [linux] + libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.18.0': - resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} + '@rollup/rollup-linux-arm64-gnu@4.62.2': + resolution: {integrity: sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==} cpu: [arm64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.18.0': - resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} + '@rollup/rollup-linux-arm64-musl@4.62.2': + resolution: {integrity: sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==} cpu: [arm64] os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.62.2': + resolution: {integrity: sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.62.2': + resolution: {integrity: sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.62.2': + resolution: {integrity: sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==} + cpu: [ppc64] + os: [linux] + libc: [glibc] - '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': - resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} + '@rollup/rollup-linux-ppc64-musl@4.62.2': + resolution: {integrity: sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==} cpu: [ppc64] os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.62.2': + resolution: {integrity: sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==} + cpu: [riscv64] + os: [linux] + libc: [glibc] - '@rollup/rollup-linux-riscv64-gnu@4.18.0': - resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} + '@rollup/rollup-linux-riscv64-musl@4.62.2': + resolution: {integrity: sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==} cpu: [riscv64] os: [linux] + libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.18.0': - resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} + '@rollup/rollup-linux-s390x-gnu@4.62.2': + resolution: {integrity: sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==} cpu: [s390x] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.18.0': - resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} + '@rollup/rollup-linux-x64-gnu@4.62.2': + resolution: {integrity: sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==} cpu: [x64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.18.0': - resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} + '@rollup/rollup-linux-x64-musl@4.62.2': + resolution: {integrity: sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==} cpu: [x64] os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.62.2': + resolution: {integrity: sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==} + cpu: [x64] + os: [openbsd] - '@rollup/rollup-win32-arm64-msvc@4.18.0': - resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} + '@rollup/rollup-openharmony-arm64@4.62.2': + resolution: {integrity: sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.62.2': + resolution: {integrity: sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.18.0': - resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} + '@rollup/rollup-win32-ia32-msvc@4.62.2': + resolution: {integrity: sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.18.0': - resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} + '@rollup/rollup-win32-x64-gnu@4.62.2': + resolution: {integrity: sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.62.2': + resolution: {integrity: sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==} cpu: [x64] os: [win32] + '@shikijs/core@1.29.2': + resolution: {integrity: sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==} + + '@shikijs/core@3.23.0': + resolution: {integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==} + + '@shikijs/engine-javascript@1.29.2': + resolution: {integrity: sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==} + + '@shikijs/engine-javascript@3.23.0': + resolution: {integrity: sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==} + + '@shikijs/engine-oniguruma@1.29.2': + resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} + + '@shikijs/engine-oniguruma@3.23.0': + resolution: {integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==} + + '@shikijs/langs@1.29.2': + resolution: {integrity: sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==} + + '@shikijs/langs@3.23.0': + resolution: {integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==} + + '@shikijs/themes@1.29.2': + resolution: {integrity: sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==} + + '@shikijs/themes@3.23.0': + resolution: {integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==} + + '@shikijs/types@1.29.2': + resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} + + '@shikijs/types@3.23.0': + resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@sindresorhus/merge-streams@2.3.0': - resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} - engines: {node: '>=18'} + '@solid-primitives/clipboard@1.6.4': + resolution: {integrity: sha512-96SbTfLRKLtKZNTcurIqbjoJIxo/DieP9qaqJDBQEFG/U8WbTHGUAQksBKB8VYmHz4X3GWU4mf4UbQ9VH8Biow==} + peerDependencies: + solid-js: '>=1.9.14' + + '@solid-primitives/context@0.2.3': + resolution: {integrity: sha512-6/e8qu9qJf48FJ+sxc/B782NdgFw5TvI8+r6U0gHizumfZcWZg8FAJqvRZAiwlygkUNiTQOGTeO10LVbMm0kvg==} + peerDependencies: + solid-js: '>=1.9.14' + + '@solid-primitives/event-listener@2.4.5': + resolution: {integrity: sha512-nwRV558mIabl4yVAhZKY8cb6G+O1F0M6Z75ttTu5hk+SxdOnKSGj+eetDIu7Oax1P138ZdUU01qnBPR8rnxaEA==} + peerDependencies: + solid-js: '>=1.9.14' - '@solid-primitives/event-listener@2.3.3': - resolution: {integrity: sha512-DAJbl+F0wrFW2xmcV8dKMBhk9QLVLuBSW+TR4JmIfTaObxd13PuL7nqaXnaYKDWOYa6otB00qcCUIGbuIhSUgQ==} + '@solid-primitives/keyboard@1.3.5': + resolution: {integrity: sha512-sav+l+PL+74z3yaftVs7qd8c2SXkqzuxPOVibUe5wYMt+U5Hxp3V3XCPgBPN2I6cANjvoFtz0NiU8uHVLdi9FQ==} peerDependencies: - solid-js: ^1.6.12 + solid-js: '>=1.9.14' '@solid-primitives/keyed@1.2.2': resolution: {integrity: sha512-oBziY40JK4XmJ57XGkFl8j0GtEarSu0hhjdkUQgqL/U0QQE3TZrRo9uhgH7I6VGJKBKG7SAraTPE6S5lVLM1ow==} peerDependencies: - solid-js: ^1.6.12 + solid-js: '>=1.9.14' '@solid-primitives/map@0.4.11': resolution: {integrity: sha512-OAD65RPxMDYv41oAvadPCqedZfDX92BbWLUC+Qwh9okVMDAF/5UM+t1916OAfGV01Cr30d/fxIT1x86P+gFgSQ==} peerDependencies: - solid-js: ^1.6.12 + solid-js: '>=1.9.14' - '@solid-primitives/media@2.2.9': - resolution: {integrity: sha512-QUmU62D4/d9YWx/4Dvr/UZasIkIpqNXz7wosA5GLmesRW9XlPa3G5M6uOmTw73SByHNTCw0D6x8bSdtvvLgzvQ==} + '@solid-primitives/media@2.3.5': + resolution: {integrity: sha512-LX9fB5WDaK87FMDtUB1qokBOfT2et9Uobv/zZaKLH9caFSz4+P70MBKEIBHcZQy+9MV5M2XvGYLTbLskjkzMjA==} peerDependencies: - solid-js: ^1.6.12 + solid-js: '>=1.9.14' + + '@solid-primitives/platform@0.1.2': + resolution: {integrity: sha512-sSxcZfuUrtxcwV0vdjmGnZQcflACzMfLriVeIIWXKp8hzaS3Or3tO6EFQkTd3L8T5dTq+kTtLvPscXIpL0Wzdg==} + peerDependencies: + solid-js: '>=1.9.14' '@solid-primitives/props@3.1.11': resolution: {integrity: sha512-jZAKWwvDRHjiydIumDgMj68qviIbowQ1ci7nkEAgzgvanNkhKSQV8iPgR2jMk1uv7S2ZqXYHslVQTgJel/TEyg==} peerDependencies: - solid-js: ^1.6.12 + solid-js: '>=1.9.14' '@solid-primitives/refs@1.0.8': resolution: {integrity: sha512-+jIsWG8/nYvhaCoG2Vg6CJOLgTmPKFbaCrNQKWfChalgUf9WrVxWw0CdJb3yX15n5lUcQ0jBo6qYtuVVmBLpBw==} peerDependencies: - solid-js: ^1.6.12 + solid-js: '>=1.9.14' '@solid-primitives/resize-observer@2.0.26': resolution: {integrity: sha512-KbPhwal6ML9OHeUTZszBbt6PYSMj89d4wVCLxlvDYL4U0+p+xlCEaqz6v9dkCwm/0Lb+Wed7W5T1dQZCP3JUUw==} peerDependencies: - solid-js: ^1.6.12 + solid-js: '>=1.9.14' + + '@solid-primitives/rootless@1.5.3': + resolution: {integrity: sha512-N8cIDAHbWcLahNRLr0knAAQvXyEdEMoAZvIMZKmhNb1mlx9e2UOv9BRD5YNwQUJwbNoYVhhLwFOEOcVXFx0HqA==} + peerDependencies: + solid-js: '>=1.9.14' - '@solid-primitives/rootless@1.4.5': - resolution: {integrity: sha512-GFJE9GC3ojx0aUKqAUZmQPyU8fOVMtnVNrkdk2yS4kd17WqVSpXpoTmo9CnOwA+PG7FTzdIkogvfLQSLs4lrww==} + '@solid-primitives/scroll@2.1.5': + resolution: {integrity: sha512-G7t4Kt1E+f4d7iZ2dGDWsra2k1WQ5VOtXrTcg7MC+DrR5QMq8YCj9wB/C9yxHJ1lGi7Sv+mzjNLtVCFO5ECzUg==} peerDependencies: - solid-js: ^1.6.12 + solid-js: '>=1.9.14' '@solid-primitives/static-store@0.0.8': resolution: {integrity: sha512-ZecE4BqY0oBk0YG00nzaAWO5Mjcny8Fc06CdbXadH9T9lzq/9GefqcSe/5AtdXqjvY/DtJ5C6CkcjPZO0o/eqg==} peerDependencies: - solid-js: ^1.6.12 + solid-js: '>=1.9.14' + + '@solid-primitives/static-store@0.1.3': + resolution: {integrity: sha512-uxez7SXnr5GiRnzqO2IEDjOJRIXaG+0LZLBizmUA1FwSi+hrpuMzVBwyk70m4prcl8X6FDDXUl9O8hSq8wHbBQ==} + peerDependencies: + solid-js: '>=1.9.14' + + '@solid-primitives/storage@4.3.5': + resolution: {integrity: sha512-uvgj2HoqPw6RlDRiwVm4LQM6WHUJ+SsCvXtvGLbWVnIjGqrrNyFxdbKQFYUkSw6QsVO/esm7Ok0VeDpO0ioRlA==} + peerDependencies: + '@tauri-apps/plugin-store': '*' + solid-js: '>=1.9.14' + solid-start: '*' + peerDependenciesMeta: + '@tauri-apps/plugin-store': + optional: true + solid-start: + optional: true '@solid-primitives/trigger@1.0.11': resolution: {integrity: sha512-4oc8grBzBit7ByXgE1aZ0QXfhdlhXaiFjDKYsOhRyUJa8fN4hdr2IgsYqjmHwxyjK+Dm2OUwkCI1bGkaLgtgXg==} peerDependencies: - solid-js: ^1.6.12 + solid-js: '>=1.9.14' - '@solid-primitives/utils@6.2.3': - resolution: {integrity: sha512-CqAwKb2T5Vi72+rhebSsqNZ9o67buYRdEJrIFzRXz3U59QqezuuxPsyzTSVCacwS5Pf109VRsgCJQoxKRoECZQ==} + '@solid-primitives/utils@6.4.1': + resolution: {integrity: sha512-ISSB5QX1qP2ynrheIpYwc4oKR5Ny4siNuUyf1qZniy+Il+p/PtDB0QK1Dnle8noiHpwRD3gpPdubOC3qI/Zamg==} peerDependencies: - solid-js: ^1.6.12 + solid-js: '>=1.9.14' - '@solidjs/meta@0.29.3': - resolution: {integrity: sha512-R2uirgjgyh3FPFh+rb840plF701N6GvM5w81/QeI61QwjXb4QzLkyI/uzXfC5UW8favpUn9KK9ILQeoTl6pX0A==} + '@solidjs/meta@0.29.4': + resolution: {integrity: sha512-zdIWBGpR9zGx1p1bzIPqF5Gs+Ks/BH8R6fWhmUa/dcK1L2rUC8BAcZJzNRYBQv74kScf1TSOs0EY//Vd/I0V8g==} peerDependencies: - solid-js: '>=1.8.4' + solid-js: '>=1.9.14' - '@solidjs/router@0.12.4': - resolution: {integrity: sha512-2S5QWYmpWSIWn5ei85eoStEMmECERX2BiBkEvmqYDrgX79I8D95YaWVdHbcFGOxISPTY4TP7RxjRiofs/AIFJQ==} + '@solidjs/router@0.15.3': + resolution: {integrity: sha512-iEbW8UKok2Oio7o6Y4VTzLj+KFCmQPGEpm1fS3xixwFBdclFVBvaQVeibl1jys4cujfAK5Kn6+uG2uBm3lxOMw==} peerDependencies: - solid-js: ^1.8.6 + solid-js: '>=1.9.14' - '@solidjs/router@0.8.4': - resolution: {integrity: sha512-Gi/WVoVseGMKS1DBdT3pNAMgOzEOp6Q3dpgNd2mW9GUEnVocPmtyBjDvXwN6m7tjSGsqqfqJFXk7bm1hxabSRw==} + '@solidjs/router@0.16.2': + resolution: {integrity: sha512-pncbV4SGUwGGlELlDWc3B4KDVB0Kt+7+7ct+GTN7D8CgetGSJMzl8RzyAFz+/TtSuFFzp9IzrjrACHUpGzxsKQ==} peerDependencies: - solid-js: ^1.5.3 + solid-js: '>=1.9.14' - '@solidjs/start@0.6.1': - resolution: {integrity: sha512-e5kj37jTVCfKhTg14ozvJr7ksZUd8FedRlbJlkPsO+Mbi04fyZ5i+41I5RjLYPF1WukLLuJKUGz9He7NJv6e7A==} + '@solidjs/start@2.0.0-beta.0': + resolution: {integrity: sha512-C1nsBjh7kwGqkRtlOJ1o9Po8yye9DQPbZR9cTVIVKEXvSxGyMuOiNbKh/S9NdLAaEwDue9ZZXSjxxZAyxA6RdQ==} + engines: {node: '>=22'} + peerDependencies: + vite: ^7 || ^8 - '@solidjs/testing-library@0.8.6': - resolution: {integrity: sha512-MnDGfUw38SjE+lmCDZ44HeZq5WbDU7s/BTa7uvqv55GKatddoWiJmHanUAbuEtmwMdEv+fFQQzftkqrFXEn1BQ==} + '@solidjs/testing-library@0.8.10': + resolution: {integrity: sha512-qdeuIerwyq7oQTIrrKvV0aL9aFeuwTd86VYD3afdq5HYEwoox1OBTJy4y8A3TFZr8oAR0nujYgCzY/8wgHGfeQ==} engines: {node: '>= 14'} peerDependencies: '@solidjs/router': '>=0.9.0' - solid-js: '>=1.0.0' + solid-js: '>=1.9.14' + peerDependenciesMeta: + '@solidjs/router': + optional: true + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} '@swc/helpers@0.5.11': resolution: {integrity: sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==} - '@tailwindcss/typography@0.5.9': - resolution: {integrity: sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==} - peerDependencies: - tailwindcss: '>=3.0.0 || insiders' - '@tanstack/solid-virtual@3.0.0-beta.6': resolution: {integrity: sha512-/HjeHZb4UZxxFSAkICUEWOozGwHQpKlvtnUoS5uSMSuLOz0XM5vFq6zR6ENwAczKWDtkh8ntddk+zXAhyXOlEw==} engines: {node: '>=12'} - '@testing-library/dom@9.3.4': - resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} - engines: {node: '>=14'} + '@testing-library/dom@10.4.1': + resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + engines: {node: '>=18'} - '@testing-library/jest-dom@6.4.2': - resolution: {integrity: sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw==} + '@testing-library/jest-dom@6.9.1': + resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - peerDependencies: - '@jest/globals': '>= 28' - '@types/bun': latest - '@types/jest': '>= 28' - jest: '>= 28' - vitest: '>= 0.32' - peerDependenciesMeta: - '@jest/globals': - optional: true - '@types/bun': - optional: true - '@types/jest': - optional: true - jest: - optional: true - vitest: - optional: true - '@testing-library/user-event@14.5.2': - resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} + '@testing-library/user-event@14.6.1': + resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' - '@tootallnate/once@2.0.0': - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -2422,6 +2228,9 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + '@types/acorn@4.0.6': resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} @@ -2437,23 +2246,29 @@ packages: '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.6': - resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} '@types/braces@3.0.4': resolution: {integrity: sha512-0WR3b8eaISjEW7RpZnclONaLFDf7buaowRHdqLp4vLj54AsSAYWfh3DRbfiYJY9XDxMgx1B4sE1Afw2PGpuHOA==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/conventional-commits-parser@5.0.0': resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} '@types/fs-extra@8.1.5': resolution: {integrity: sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==} @@ -2464,12 +2279,6 @@ packages: '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} - - '@types/http-proxy@1.17.14': - resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==} - '@types/is-ci@3.0.4': resolution: {integrity: sha512-AkCYCmwlXeuH89DagDCzvCAyltI2v9lh3U3DqSg/GrBYoReAaWwxfXCqMx9UV5MajLZ4ZFwZzV4cABGIxk2XRw==} @@ -2479,11 +2288,8 @@ packages: '@types/mdx@2.0.13': resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} - '@types/micromatch@4.0.7': - resolution: {integrity: sha512-C/FMQ8HJAZhTsDpl4wDKZdMeeW5USjgzOczUwTGbRc1ZopPgOhIEnxY2ZgUrsuyy4DwK1JVOJZKFakv3TbCKiA==} - - '@types/mime@1.3.5': - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + '@types/micromatch@4.0.10': + resolution: {integrity: sha512-5jOhFDElqr4DKTrTEbnW8DZ4Hz5LRUEmyrGpCMrD/NphYv3nUnaF08xmSLx1rGGnyEs/kFnhiw6dCgcDqMr5PQ==} '@types/minimatch@5.1.2': resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} @@ -2512,11 +2318,8 @@ packages: '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} - - '@types/serve-static@1.15.7': - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + '@types/ungap__structured-clone@1.2.0': + resolution: {integrity: sha512-ZoaihZNLeZSxESbk9PUAPZOlSpcKx81I1+4emtULDVmBLkYutTcMlCj2K9VNlf9EWODxdO6gkAqEaLorXwZQVA==} '@types/unist@2.0.10': resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} @@ -2524,20 +2327,14 @@ packages: '@types/unist@3.0.2': resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} - '@types/ws@8.5.10': - resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} - - '@typescript/twoslash@3.1.0': - resolution: {integrity: sha512-kTwMUQ8xtAZaC4wb2XuLkPqFVBj2dNBueMQ89NWEuw87k2nLBbuafeG5cob/QEr6YduxIdTVUjix0MtC7mPlmg==} - - '@typescript/vfs@1.3.4': - resolution: {integrity: sha512-RbyJiaAGQPIcAGWFa3jAXSuAexU4BFiDRF1g3hy7LmRqfNpYlTQWGXjcrOaVZjJ8YkkpuwG0FcsYvtWQpd9igQ==} - - '@typescript/vfs@1.3.5': - resolution: {integrity: sha512-pI8Saqjupf9MfLw7w2+og+fmb0fZS0J6vsKXXrp4/PDXEFvntgzXmChCXC/KefZZS0YGS6AT8e0hGAJcTsdJlg==} + '@typescript/vfs@1.6.4': + resolution: {integrity: sha512-PJFXFS4ZJKiJ9Qiuix6Dz/OwEIqHD7Dme1UwZhTK11vR+5dqW2ACbdndWQexBzCx+CPuMe5WBYQWCsFyGlQLlQ==} + peerDependencies: + typescript: '*' '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher '@vanilla-extract/css@1.13.0': resolution: {integrity: sha512-JFFBXhnJrPlGqHBabagXqo5ghXw9mtV270ycIGyLDZG8NAK5eRwAYkMowAxuzK7wZSm67GnETWYB7b0AUmyttg==} @@ -2545,137 +2342,79 @@ packages: '@vanilla-extract/private@1.0.5': resolution: {integrity: sha512-6YXeOEKYTA3UV+RC8DeAjFk+/okoNz/h88R+McnzA2zpaVqTR/Ep+vszkWYlGBcMNO7vEkqbq5nT/JMMvhi+tw==} - '@vercel/nft@0.26.5': - resolution: {integrity: sha512-NHxohEqad6Ra/r4lGknO52uc/GrWILXAMs1BB4401GTqww0fw1bAqzpG1XHuDO+dprg4GvsD9ZLLSsdo78p9hQ==} - engines: {node: '>=16'} - hasBin: true - - '@vinxi/devtools@0.2.0': - resolution: {integrity: sha512-LpQp5zbiBhV4eo2w6AiJFtpZZj4LaRBOnzggIPTeSJYvgrxRMAqe/34Har3vVo+b7sPOjxFbE1zHZhLzaAcidw==} - - '@vinxi/listhen@1.5.6': - resolution: {integrity: sha512-WSN1z931BtasZJlgPp704zJFnQFRg7yzSjkm3MzAWQYe4uXFXlFr1hc5Ac2zae5/HDOz5x1/zDM5Cb54vTCnWw==} - hasBin: true - - '@vinxi/plugin-directives@0.3.1': - resolution: {integrity: sha512-4qz5WifjmJ864VS8Ik9nUG0wAkt/xIcxFpP29RXogGLgccRnceBpWQi+ghw5rm0F6LP/YMAhhO5iFORXclWd0Q==} - peerDependencies: - vinxi: ^0.3.10 - - '@vinxi/plugin-mdx@3.7.1': - resolution: {integrity: sha512-kbMD64f1pTdk5ix6kU6VkSGVc5rrtePYHXsS/yWZymjst2hDDOypCF7B6J8WjqbpDToacz8u7rkFxV0YTuKatA==} - peerDependencies: - '@mdx-js/mdx': <3 + '@vitest/expect@1.3.1': + resolution: {integrity: sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==} - '@vinxi/server-components@0.3.3': - resolution: {integrity: sha512-xaW92nj9HUMLyswPcCmsIXOsS3TJll0m9u3WEjWjLrtZWheHggina6+kTCSeltp/Qe8WlUfNU5G02Xy8L4xQxA==} - peerDependencies: - vinxi: ^0.3.10 + '@vitest/expect@4.1.10': + resolution: {integrity: sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==} - '@vinxi/server-functions@0.3.2': - resolution: {integrity: sha512-PoARb1X480UE9jysPqltpzginBftna34GmZ3HyvRT+pnPfsGcuHOzZe/a18V/K04qk2yMRd7eeW42JF5O+wunw==} + '@vitest/mocker@4.1.10': + resolution: {integrity: sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==} peerDependencies: - vinxi: ^0.3.10 + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true - '@vitest/expect@1.3.1': - resolution: {integrity: sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==} + '@vitest/pretty-format@4.1.10': + resolution: {integrity: sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==} '@vitest/runner@1.3.1': resolution: {integrity: sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg==} + '@vitest/runner@4.1.10': + resolution: {integrity: sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==} + '@vitest/snapshot@1.3.1': resolution: {integrity: sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==} + '@vitest/snapshot@4.1.10': + resolution: {integrity: sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==} + '@vitest/spy@1.3.1': resolution: {integrity: sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==} - '@vitest/ui@1.6.0': - resolution: {integrity: sha512-k3Lyo+ONLOgylctiGovRKy7V4+dIN2yxstX3eY5cWFXH6WP+ooVX79YSyi0GagdTQzLmT43BF27T0s6dOIPBXA==} + '@vitest/spy@4.1.10': + resolution: {integrity: sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==} + + '@vitest/ui@4.1.10': + resolution: {integrity: sha512-EOUqfXHTXtpSHsyLHH40ts3Ue+hRhSGwzwzMlK0dTEOLSDYyOXLyr5JDGmHQWhN2DYI30gw6dVx3cdgM9FZl+Q==} peerDependencies: - vitest: 1.6.0 + vitest: 4.1.10 '@vitest/utils@1.3.1': resolution: {integrity: sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==} - '@vitest/utils@1.6.0': - resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + '@vitest/utils@4.1.10': + resolution: {integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==} JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true - abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - deprecated: Use your platform's native atob() and btoa() methods instead - - abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - - acorn-globals@6.0.0: - resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} - - acorn-import-attributes@1.9.5: - resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} - peerDependencies: - acorn: ^8 - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-loose@8.4.0: - resolution: {integrity: sha512-M0EUka6rb+QC4l9Z3T0nJEzNOO7JcoJlYMrBlyBCiFSXRyxjLKayd4TbQs2FDRWQU1h9FR7QVNHt+PEaoNL5rQ==} - engines: {node: '>=0.4.0'} - - acorn-typescript@1.4.13: - resolution: {integrity: sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==} - peerDependencies: - acorn: '>=8.9.0' - - acorn-walk@7.2.0: - resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} - engines: {node: '>=0.4.0'} - acorn-walk@8.3.2: resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} engines: {node: '>=0.4.0'} - acorn@7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} - hasBin: true - - acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true - - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} engines: {node: '>=0.4.0'} hasBin: true - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - ahocorasick@1.0.2: resolution: {integrity: sha512-hCOfMzbFx5IDutmWLAt6MZwOUjIfSM9G9FyVxytmE4Rs/5YDPWQrD/+IR1w+FweD9H2oOZEnv36TmkjhNURBVA==} ajv@8.14.0: resolution: {integrity: sha512-oYs1UUtO97ZO2lJ4bwnWeQW8/zvOIQLGKcvPTsWmvc2SYgBb+upuNS5NxoLaMU4h8Ju3Nbj6Cq8mD2LQoqVKFA==} - algoliasearch@4.23.3: - resolution: {integrity: sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==} - - ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -2695,9 +2434,6 @@ packages: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} - ansi-sequence-parser@1.1.1: - resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} - ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -2724,22 +2460,6 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - - archiver-utils@5.0.2: - resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} - engines: {node: '>= 14'} - - archiver@7.0.1: - resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} - engines: {node: '>= 14'} - - are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. - arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -2752,9 +2472,6 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} @@ -2788,23 +2505,14 @@ packages: assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - ast-types@0.16.1: - resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} - engines: {node: '>=4'} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} astring@1.8.6: resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} hasBin: true - async-sema@3.1.1: - resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} - - async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} @@ -2812,20 +2520,10 @@ packages: atomically@2.0.3: resolution: {integrity: sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==} - autoprefixer@10.4.15: - resolution: {integrity: sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - b4a@1.6.6: - resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} - babel-plugin-jsx-dom-expressions@0.36.18: resolution: {integrity: sha512-8K0CHgzNMB0+1OC+GQf1O49Nc6DfHAoWDjY4YTW3W/3il5KrDKAj65723oPmya68kKKOkqDKuz+Zh1u7VFHthw==} peerDependencies: @@ -2851,11 +2549,6 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-transform-hook-names@1.0.2: - resolution: {integrity: sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==} - peerDependencies: - '@babel/core': ^7.12.10 - babel-preset-solid@1.7.7: resolution: {integrity: sha512-tdxVzx3kgcIjNXAOmGRbzIhFBPeJjSakiN9yM+IYdL/+LtXNnbGqb0Va5tJb8Sjbk+QVEriovCyuzB5T7jeTvg==} peerDependencies: @@ -2866,53 +2559,40 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - bail@1.0.5: - resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} - bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - bare-events@2.3.1: - resolution: {integrity: sha512-sJnSOTVESURZ61XgEleqmP255T6zTYwHPwE4r6SssIh0U9/uDvfpdoJYpVUerJJZH2fueO+CdT8ZT+OC/7aZDA==} - base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.10.40: + resolution: {integrity: sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==} + engines: {node: '>=6.0.0'} + hasBin: true + + bcp-47-match@2.0.3: + resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} - big-integer@1.6.52: - resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} - engines: {node: '>=0.6'} + bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - - birpc@0.2.17: - resolution: {integrity: sha512-+hkTxhot+dWsLpp3gia5AkVHIsKlZybNT5gIYiDlNzJrmYPcTM9k5/w2uaj3IPpd7LlEYpmCj4Jj1nC41VhDFg==} - bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - boxen@7.1.1: - resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} - engines: {node: '>=14.16'} - - bplist-parser@0.2.0: - resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} - engines: {node: '>= 5.10.0'} - brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -2926,47 +2606,32 @@ packages: breakword@1.0.6: resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} - browser-process-hrtime@1.0.0: - resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} - - browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + browserslist@4.28.4: + resolution: {integrity: sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - buffer-crc32@1.0.0: - resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} - engines: {node: '>=8.0.0'} - buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - bundle-name@3.0.0: - resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} - engines: {node: '>=12'} - bundle-require@4.2.1: resolution: {integrity: sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: esbuild: '>=0.17' - busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - - c12@1.10.0: - resolution: {integrity: sha512-0SsG7UDhoRWcuSvKWHaXmu5uNjDCDN3nkQLRL4Q42IlFy+ze58FcCoI3uPwINXinkz7ZinbhEgyzYFw9u9ZV8g==} + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} @@ -2996,12 +2661,8 @@ packages: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} - camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - - caniuse-lite@1.0.30001625: - resolution: {integrity: sha512-4KE9N2gcRH+HQhpeiRZXd+1niLB/XNLAhSy4z7fI8EzcbcPoAqjNInxVHTiTwWfTIV4w096XG8OtCOCQQKPv3w==} + caniuse-lite@1.0.30001800: + resolution: {integrity: sha512-MMHtuAz9Ys840zAY5F4k6fV5GaivZ9sPk+nz0mY+GYVzRBnYkN0mpqkSR92oWRQ19yQWo4HvBV/FnC16AJX8MA==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -3010,14 +2671,14 @@ packages: resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} - chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} - chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -3048,21 +2709,18 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - citty@0.1.6: - resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} - - cli-boxes@3.0.0: - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} - engines: {node: '>=10'} - cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -3075,10 +2733,6 @@ packages: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} - clipboardy@4.0.0: - resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} - engines: {node: '>=18'} - cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} @@ -3090,12 +2744,8 @@ packages: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} - clsx@2.0.0: - resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} - engines: {node: '>=6'} - - cluster-key-slot@1.1.2: - resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + cluster-key-slot@1.1.1: + resolution: {integrity: sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==} engines: {node: '>=0.10.0'} collapse-white-space@2.1.0: @@ -3114,20 +2764,12 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - colorette@1.4.0: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -3146,28 +2788,21 @@ packages: engines: {node: '>= 12'} hasBin: true - commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} - compress-commons@6.0.2: - resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} - engines: {node: '>= 14'} - concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - confbox@0.1.7: - resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - consola@3.2.3: - resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} - engines: {node: ^14.18.0 || >=16.10.0} + confbox@0.2.4: + resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} - console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} conventional-changelog-angular@6.0.0: resolution: {integrity: sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==} @@ -3191,15 +2826,12 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie-es@1.1.0: - resolution: {integrity: sha512-L2rLOcK0wzWSfSDA33YR+PUHDG10a8px7rUHKWbGLP4YfbsMed2KFUw5fczvDPbT98DDe3LEzviswl810apTEw==} + cookie-es@2.0.1: + resolution: {integrity: sha512-aVf4A4hI2w70LnF7GG+7xDQUkliwiXWXFvTjkip4+b64ygDQ2sJPRSKFDHbxn8o0xu9QzPkMuuiWIXyFSE2slA==} core-js-compat@3.37.1: resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - cosmiconfig-typescript-loader@4.4.0: resolution: {integrity: sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==} engines: {node: '>=v14.21.3'} @@ -3235,39 +2867,30 @@ packages: typescript: optional: true - crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} - hasBin: true - - crc32-stream@6.0.0: - resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} - engines: {node: '>= 14'} - create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - croner@8.0.2: - resolution: {integrity: sha512-HgSdlSUX8mIgDTTiQpWUP4qY4IFRMsduPCYdca34Pelt8MVdxdaDOzreFtCscA6R+cRZd7UbD1CD3uyx6J3X1A==} - engines: {node: '>=18.0'} - cross-spawn@5.1.0: resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - crossws@0.2.4: - resolution: {integrity: sha512-DAxroI2uSOgUKLz00NX6A8U/8EE3SZHmIND+10jkVSaypvyt57J5JEOxAQOL6lQxyzi/wZbTIwssU1uy69h5Vg==} + crossws@0.4.7: + resolution: {integrity: sha512-N+BXE5AetLJ3/glz4DYLirKApAWg+V2guueoMenvAGVvqF/IA1PAzMYqYS+UfBkdz3tDXoQIevDaaxLy1Ch/4w==} peerDependencies: - uWebSockets.js: '*' + srvx: '>=0.11.5' peerDependenciesMeta: - uWebSockets.js: + srvx: optional: true - css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + css-selector-parser@3.3.0: + resolution: {integrity: sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==} + + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} css-what@6.1.0: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} @@ -3281,16 +2904,6 @@ packages: engines: {node: '>=4'} hasBin: true - cssom@0.3.8: - resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} - - cssom@0.5.0: - resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} - - cssstyle@2.3.0: - resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} - engines: {node: '>=8'} - csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -3315,9 +2928,9 @@ packages: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} - data-urls@3.0.2: - resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} - engines: {node: '>=12'} + data-urls@7.0.0: + resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} data-view-buffer@1.0.1: resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} @@ -3331,33 +2944,31 @@ packages: resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} engines: {node: '>= 0.4'} - dax-sh@0.39.2: - resolution: {integrity: sha512-gpuGEkBQM+5y6p4cWaw9+ePy5TNon+fdwFVtTI8leU3UhwhsBfPewRxMXGuQNC+M2b/MDGMlfgpqynkcd0C3FQ==} - - db0@0.1.4: - resolution: {integrity: sha512-Ft6eCwONYxlwLjBXSJxw0t0RYtA5gW9mq8JfBXn9TtC0nDPlqePAhpv9v4g9aONBi6JI1OXHTKKkUYGd+BOrCA==} + db0@0.3.4: + resolution: {integrity: sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw==} peerDependencies: - '@libsql/client': ^0.5.2 - better-sqlite3: ^9.4.3 - drizzle-orm: ^0.29.4 + '@electric-sql/pglite': '*' + '@libsql/client': '*' + better-sqlite3: '*' + drizzle-orm: '*' + mysql2: '*' + sqlite3: '*' peerDependenciesMeta: + '@electric-sql/pglite': + optional: true '@libsql/client': optional: true better-sqlite3: optional: true drizzle-orm: optional: true - - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: + mysql2: + optional: true + sqlite3: optional: true - debug@4.3.5: - resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -3373,8 +2984,8 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} @@ -3386,10 +2997,6 @@ packages: resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} engines: {node: '>=6'} - deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} - deep-object-diff@1.1.9: resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==} @@ -3397,14 +3004,6 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} - default-browser-id@3.0.0: - resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} - engines: {node: '>=12'} - - default-browser@4.0.0: - resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} - engines: {node: '>=14.16'} - defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} @@ -3412,14 +3011,6 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} - define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - - define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} - define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -3427,32 +3018,14 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - denque@2.1.0: resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} engines: {node: '>=0.10'} - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - destr@2.0.3: - resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} - - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - detect-file@1.0.0: resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} engines: {node: '>=0.10.0'} @@ -3461,11 +3034,6 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} - detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true - detect-libc@2.0.3: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} @@ -3487,10 +3055,18 @@ packages: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + engines: {node: '>=0.3.1'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + direction@2.0.1: + resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} + hasBin: true + dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} @@ -3500,47 +3076,22 @@ packages: dom-accessibility-api@0.6.3: resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} - dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - - domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - - domexception@4.0.0: - resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} - engines: {node: '>=12'} - deprecated: Use your platform's native DOMException instead - - domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - - domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} - dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} - dot-prop@8.0.2: - resolution: {integrity: sha512-xaBe6ZT4DHPkg0k4Ytbvn5xoxgpG0jOS1dYxSOwAHPuNLjP3/OzN0gH55SrLqpx8cBfSaVt91lXYkApjb+nYdQ==} - engines: {node: '>=16'} - - dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + dotenv@17.4.2: + resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} engines: {node: '>=12'} - duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + electron-to-chromium@1.5.383: + resolution: {integrity: sha512-I2484/KkAvl8lm9VyjH2JnbOIV0d/UCqT7gbzs6l+o6Vmn9wgB66uVcKX+Vk6HrXtY6fbWTOEXuv8waDTuFNCw==} - electron-to-chromium@1.4.788: - resolution: {integrity: sha512-ubp5+Ev/VV8KuRoWnfP2QF2Bg+O2ZFdb49DiiNbz2VmgkIqrnyYaqIOqj8A6K/3p1xV0QcU5hBQ1+BmB6ot1OA==} + emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -3548,10 +3099,6 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -3560,16 +3107,35 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@8.0.0: + resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} + engines: {node: '>=20.19.0'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} + env-runner@0.1.15: + resolution: {integrity: sha512-Xiu7VUW1jlwEiZSGWJ5Wuv9D4iSC2JwIB3Bb/RI+1DBSCeCrCpdAwRvsi3e52wETPUBkV61b0Ixfi593hQmQ6w==} + hasBin: true + peerDependencies: + '@netlify/runtime': ^4.1.23 + '@vercel/queue': '>=0.2.0' + miniflare: ^4.20260515.0 + wrangler: ^4.0.0 + peerDependenciesMeta: + '@netlify/runtime': + optional: true + '@vercel/queue': + optional: true + miniflare: + optional: true + wrangler: + optional: true + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - error-stack-parser-es@0.1.4: - resolution: {integrity: sha512-l0uy0kAoo6toCgVOYaAayqtPa2a1L15efxUMEnQebKwLQX2X0OpS6wMMQdc4juJXmxd9i40DuaUHq+mjIya9TQ==} - error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} @@ -3585,11 +3151,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - - es-module-lexer@1.5.3: - resolution: {integrity: sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==} + es-module-lexer@2.2.0: + resolution: {integrity: sha512-3lGxdTXCLfe1MYfTz1y2ksAAUM4NAOP6rPEjxGJVKO7TZ5+tvHCaQWGpC4Y3IXvW3ece0Cz1cIP4FWBxOnGCTQ==} es-object-atoms@1.0.0: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} @@ -3606,6 +3169,12 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} + esast-util-from-estree@2.0.0: + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + + esast-util-from-js@2.0.1: + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + esbuild-android-64@0.15.18: resolution: {integrity: sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==} engines: {node: '>=12'} @@ -3706,7 +3275,7 @@ packages: resolution: {integrity: sha512-ITK6n+0ayGFeDVUZWNMxX+vLsasEN1ILrg4pISsNOQ+mq4ljlJJiuXotInd+HE0MzwTcA9wExT1yzDE2hsqPsg==} peerDependencies: esbuild: '>=0.12' - solid-js: '>= 1.0' + solid-js: '>=1.9.14' esbuild-sunos-64@0.15.18: resolution: {integrity: sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==} @@ -3742,28 +3311,20 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.18.7: - resolution: {integrity: sha512-46V0EFvQ/urmruUCChD1e0SZJWM0Ulny5F+uf5QkBry97HfvgvZTnjpTrwmw0+CGRhqTh9zpFeB+W8WGIEXOAQ==} - engines: {node: '>=12'} - hasBin: true - esbuild@0.19.12: resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} engines: {node: '>=12'} hasBin: true - esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} - engines: {node: '>=12'} + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} hasBin: true - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -3772,20 +3333,11 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - estree-util-attach-comments@3.0.0: resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} @@ -3795,9 +3347,15 @@ packages: estree-util-is-identifier-name@3.0.0: resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + estree-util-to-js@2.0.0: resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + estree-util-value-to-estree@3.5.0: + resolution: {integrity: sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==} + estree-util-visit@2.0.0: resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} @@ -3814,29 +3372,10 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - - event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - - eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} - execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} - execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} @@ -3845,6 +3384,27 @@ packages: resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} engines: {node: '>=0.10.0'} + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} + engines: {node: '>=12.0.0'} + + expressive-code-twoslash@0.4.0: + resolution: {integrity: sha512-7HffO04pYLNHX0P8/8xX+pdgWYpFWdP9/gYi7dAH1nSAxO1W7pQHW4Ly6OXD3fs4SChkGP/PWkE4oLo6CeXTfg==} + peerDependencies: + '@expressive-code/core': ^0.40.0 + expressive-code: ^0.40.0 + typescript: ^5.7 + + expressive-code@0.41.7: + resolution: {integrity: sha512-2wZjC8OQ3TaVEMcBtYY4Va3lo6J+Ai9jf3d4dbhURMJcU4Pbqe6EcHe424MIZI0VHUA1bR6xdpoHYi3yxokWqA==} + + exsolve@1.1.0: + resolution: {integrity: sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw==} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -3858,19 +3418,13 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} fast-ignore@1.1.3: resolution: {integrity: sha512-xTo4UbrOKfEQgOFlPaqFScodTV/Wf3KATEqCZZSMh6OP4bcez0lTsqww3n3/Fve1q9u0jmfDP0q0nOhH4POZEg==} - fast-string-truncated-width@1.1.0: - resolution: {integrity: sha512-FfsFREOllHpnSl6cxpLi6wvqd9UebrZPxWlOJCCcWoOJzy02xyjPbafF9tyg2Usnf3GLmRr5Q6s7n+GO+6VB5A==} - fast-string-truncated-width@1.2.1: resolution: {integrity: sha512-Q9acT/+Uu3GwGj+5w/zsGuQjh9O1TyywhIwAxHudtWrgF09nHOPrvTLhQevPbttcxjr/SNN7mJmfOw/B1bXgow==} @@ -3880,9 +3434,17 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - fenceparser@1.1.1: - resolution: {integrity: sha512-VdkTsK7GWLT0VWMK5S5WTAPn61wJ98WPFwJiRHumhg4ESNUO/tnkU8bzzzc62o6Uk1SVhuZFLnakmDA4SGV7wA==} - engines: {node: '>=12'} + fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} @@ -3891,9 +3453,6 @@ packages: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -3904,15 +3463,9 @@ packages: find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - find-up-json@2.0.4: - resolution: {integrity: sha512-ABaCm3V1H5UYRHtClHvFFyxPIAC/bxd43tKwmcSco8/EuM5O7zDL2R7ORaA+rEltwgxoNOIK8LQFwQUfA/2GIw==} - find-up-json@2.0.5: resolution: {integrity: sha512-1zZZUfD1GOOEEd1AqwbRmCkCCv1O9t0vOpCYgmzfJqKty8WKaKlDyxWej8Aew+vI5lvDiTviaQuaVuu6GzlHzQ==} - find-up-path@1.0.0: - resolution: {integrity: sha512-cjXDXnYfEezIqqbzctBNNqUax/rRCyNo/VTCFId3Hp9FyVL4uk0PvWrs7Xibtl2E4P5HnWnlxxJsbHqK6DsDPw==} - find-up-path@1.0.1: resolution: {integrity: sha512-cl4Sfxufq9WK848L887b4r+NVZoBjMeB4QydPZ+pXbp6Jt2nUVspTo2svNOm48stIIeSxtuCsULa9+e+LMTzwA==} @@ -3931,17 +3484,11 @@ packages: resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} engines: {node: '>= 8'} - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} - follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -3950,16 +3497,9 @@ packages: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - - fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} fs-extra@11.2.0: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} @@ -3977,10 +3517,6 @@ packages: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -4002,11 +3538,6 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. - gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -4025,9 +3556,6 @@ packages: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} - get-port-please@3.1.2: - resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} - get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -4040,13 +3568,14 @@ packages: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} - giget@1.2.3: - resolution: {integrity: sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==} + giget@3.3.0: + resolution: {integrity: sha512-gzi2D96p+AMfDcmJHGDj3KJ9NRiwvlFAU5yfa3ROwWZmFUjX4P43x3BcyRaOMMLto1vUo7C+86+MFhYTl6Ryiw==} hasBin: true git-raw-commits@2.0.11: resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} engines: {node: '>=10'} + deprecated: Deprecated and no longer maintained. Use @conventional-changelog/git-client instead. hasBin: true github-slugger@2.0.0: @@ -4063,16 +3592,12 @@ packages: glob@10.4.1: resolution: {integrity: sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==} engines: {node: '>=16 || 14 >=14.18'} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me global-directory@4.0.1: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} @@ -4106,10 +3631,6 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - globby@14.0.1: - resolution: {integrity: sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==} - engines: {node: '>=18'} - gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} @@ -4122,12 +3643,29 @@ packages: grapheme-splitter@1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - gzip-size@7.0.0: - resolution: {integrity: sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + + h3@2.0.1-rc.16: + resolution: {integrity: sha512-h+pjvyujdo9way8qj6FUbhaQcHlR8FEq65EhTX9ViT5pK8aLj68uFl4hBkF+hsTJAH+H1END2Yv6hTIsabGfag==} + engines: {node: '>=20.11.1'} + hasBin: true + peerDependencies: + crossws: ^0.4.1 + peerDependenciesMeta: + crossws: + optional: true - h3@1.11.1: - resolution: {integrity: sha512-AbaH6IDnZN6nmbnJOH72y3c5Wwh9P97soSVdGSBbcDACRdkC0FEWf25pzx4f/NuOCK6quHmW18yF2Wx+G4Zi1A==} + h3@2.0.1-rc.22: + resolution: {integrity: sha512-Esv0DMIuPkCTSWCA0vO73vcTqwzH1wjSrAO1TXNu/K3up1sZHa9EKMapbmxCDYBeymC3fVTk4qxp7ogQWQ+KgA==} + engines: {node: '>=20.11.1'} + hasBin: true + peerDependencies: + crossws: ^0.4.1 + peerDependenciesMeta: + crossws: + optional: true hard-rejection@2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} @@ -4159,31 +3697,37 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hast-util-from-html@2.0.1: - resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} - hast-util-from-parse5@8.0.1: resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + hast-util-heading-rank@3.0.0: resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + hast-util-parse-selector@4.0.0: resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} hast-util-raw@9.0.3: resolution: {integrity: sha512-ICWvVOF2fq4+7CMmtCPD5CM4QKjPbHpPotE6+8tDooV0ZuyJVUzHsrNX+O5NaRbieTf0F7FfeBOMAwi6Td0+yQ==} + hast-util-select@6.0.4: + resolution: {integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==} + hast-util-to-estree@3.1.0: resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + hast-util-to-jsx-runtime@2.3.0: resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} @@ -4193,22 +3737,24 @@ packages: hast-util-to-string@3.0.0: resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==} + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} hastscript@8.0.0: resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} homedir-polyfill@1.0.3: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} - hookable@5.5.3: - resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + hookable@6.1.1: + resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==} hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -4217,41 +3763,21 @@ packages: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} - html-encoding-sniffer@3.0.0: - resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} - engines: {node: '>=12'} + html-encoding-sniffer@6.0.0: + resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} html-entities@2.3.3: resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} - html-to-image@1.11.11: - resolution: {integrity: sha512-9gux8QhvjRO/erSnDPv28noDZcPZmYE7e1vFsBLKLlRlKDSqNJYebj6Qz1TGd5lsRV+X+xYyjCKjuZdABinWjA==} + html-to-image@1.11.13: + resolution: {integrity: sha512-cuOPoI7WApyhBElTTb9oqsawRvZ0rHhaHwghRLlTuffoD1B2aDemlCruLeZrUIIdvG7gs9xeELEPm6PhuASqrg==} html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - - http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - - http-proxy@1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} - - http-shutdown@1.2.2: - resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - - httpxy@0.1.5: - resolution: {integrity: sha512-hqLDO+rfststuyEUTWObQK6zHEEmZ/kaIP2/zclGGZn6X8h/ESTWg+WKecQ/e5k4nPswjzZD+q2VqZIbr15CoQ==} + httpxy@0.5.4: + resolution: {integrity: sha512-URfeibL0kTH6VuIxxaJDXWQWEk8fKr+9L8MGv6CuAiNy0fGnoVhWbXBvJR1mkdsvCDUxvhX9cW60k2AhtH5s6w==} human-id@1.0.2: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} @@ -4260,10 +3786,6 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} - human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} - human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} @@ -4272,10 +3794,6 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -4287,8 +3805,8 @@ packages: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} - import-meta-resolve@4.1.0: - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} @@ -4328,23 +3846,16 @@ packages: ionstore@1.0.1: resolution: {integrity: sha512-g+99vyka3EiNFJCnbq3NxegjV211RzGtkDUMbZGB01Con8ZqUmMx/FpWMeqgDXOqgM7QoVeDhe+CfYCWznaDVA==} - ioredis@5.4.1: - resolution: {integrity: sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==} + ioredis@5.11.1: + resolution: {integrity: sha512-ehuGcf94bQXhfagULNXrJdfnWO38v070jxSx/qE87Kjzmu2fU7ro5EFAb+OPituLqgfyuQaym5DlrNydW2sJ9A==} engines: {node: '>=12.22.0'} - iron-webcrypto@1.2.1: - resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} - is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - is-array-buffer@3.0.4: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} @@ -4363,10 +3874,6 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} - is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - is-builtin-module@3.2.1: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} @@ -4393,15 +3900,9 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - - is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} @@ -4418,19 +3919,10 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} @@ -4454,10 +3946,6 @@ packages: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -4469,24 +3957,10 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - is-primitive@3.0.1: - resolution: {integrity: sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==} - engines: {node: '>=0.10.0'} - - is-reference@1.2.1: - resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} - - is-reference@3.0.2: - resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} - is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - is-shared-array-buffer@1.0.3: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} engines: {node: '>= 0.4'} @@ -4526,17 +4000,9 @@ packages: is-utf8@0.2.1: resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} - is-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} @@ -4545,31 +4011,12 @@ packages: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - - is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} - engines: {node: '>=16'} - - is64bit@2.0.0: - resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==} - engines: {node: '>=18'} - - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isexe@3.1.1: - resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} - engines: {node: '>=16'} - jackspeak@3.1.2: resolution: {integrity: sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==} engines: {node: '>=14'} @@ -4578,6 +4025,10 @@ packages: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} @@ -4589,8 +4040,8 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-tokens@9.0.0: - resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} @@ -4600,11 +4051,11 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsdom@19.0.0: - resolution: {integrity: sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==} - engines: {node: '>=12'} + jsdom@29.1.1: + resolution: {integrity: sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} peerDependencies: - canvas: ^2.5.0 + canvas: ^3.0.0 peerDependenciesMeta: canvas: optional: true @@ -4613,9 +4064,9 @@ packages: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} hasBin: true json-parse-even-better-errors@2.3.1: @@ -4632,9 +4083,6 @@ packages: engines: {node: '>=6'} hasBin: true - jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} - jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -4656,35 +4104,91 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - klona@2.0.6: - resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} - engines: {node: '>= 8'} + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] - knitwork@1.1.0: - resolution: {integrity: sha512-oHnmiBUVHz1V+URE77PNot2lv3QiYU2zQf1JjOVkMt3YDKGbu8NAFr+c4mcNOhdsGrB/VpVbRwPwhiXrPhxQbw==} + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] - kolorist@1.8.0: - resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] - lazystream@1.0.1: - resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} - engines: {node: '>= 0.6.3'} + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] - lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] - lilconfig@3.1.1: + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lilconfig@3.1.1: resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} engines: {node: '>=14'} lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - listhen@1.7.2: - resolution: {integrity: sha512-7/HamOm5YD9Wb7CFgAZkKgVPA96WwhcTQoqtm2VTZGVbVVn3IWKRBTgrU7cchA3Q8k9iCsG8Osoi9GX4JsGM9g==} - hasBin: true - load-tsconfig@0.2.5: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -4697,6 +4201,10 @@ packages: resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} engines: {node: '>=14'} + local-pkg@1.2.1: + resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==} + engines: {node: '>=14'} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -4708,18 +4216,9 @@ packages: lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - lodash.castarray@4.4.0: - resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} - lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - - lodash.isarguments@3.1.0: - resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} - lodash.isfunction@3.0.9: resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} @@ -4777,6 +4276,10 @@ packages: resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} engines: {node: 14 || >=16.14} + lru-cache@11.5.1: + resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} + engines: {node: 20 || >=22} + lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} @@ -4794,19 +4297,8 @@ packages: magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - magic-string@0.30.10: - resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} - - magic-string@0.30.5: - resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} - engines: {node: '>=12'} - - magicast@0.2.11: - resolution: {integrity: sha512-6saXbRDA1HMkqbsvHOU6HBjCVgZT460qheRkLhJQHWAbhXoWESI3Kn/dGGXyKs15FFKR85jsUqFx2sMK0wy/5g==} - - make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} @@ -4826,11 +4318,17 @@ packages: markdown-table@3.0.3: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} - mdast-util-find-and-replace@3.0.1: - resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + mdast-util-directive@3.1.0: + resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} - mdast-util-from-markdown@2.0.1: - resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==} + mdast-util-from-markdown@2.0.3: + resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} + + mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} mdast-util-gfm-autolink-literal@2.0.0: resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} @@ -4847,14 +4345,14 @@ packages: mdast-util-gfm-task-list-item@2.0.0: resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} - mdast-util-gfm@3.0.0: - resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} mdast-util-mdx-expression@2.0.0: resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} - mdast-util-mdx-jsx@3.1.2: - resolution: {integrity: sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==} + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} mdast-util-mdx@3.0.0: resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} @@ -4865,8 +4363,8 @@ packages: mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - mdast-util-to-hast@13.1.0: - resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} mdast-util-to-markdown@2.1.0: resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} @@ -4874,6 +4372,12 @@ packages: mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdast-util-toc@7.1.0: + resolution: {integrity: sha512-2TVKotOQzqdY7THOdn2gGzS9d1Sdd66bvxUyw3aNpWfcPXCLYSJCCgfPy30sEtuzkDraJgqF35dzgmz6xlvH/w==} + + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + media-query-parser@2.0.2: resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==} @@ -4902,6 +4406,12 @@ packages: micromark-core-commonmark@2.0.1: resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} + micromark-extension-directive@3.0.2: + resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==} + + micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + micromark-extension-gfm-autolink-literal@2.0.0: resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==} @@ -5004,33 +4514,10 @@ packages: micromark@4.0.0: resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} - micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - - mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true - - mime@4.0.3: - resolution: {integrity: sha512-KgUb15Oorc0NEKPbvfa0wRU+PItIEZmiv+pyAO2i0oTIVTJhlzMclU7w4RXWQrSOVH5ax/p/CkIO7KI4OyFJTQ==} - engines: {node: '>=16'} - hasBin: true - mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -5046,10 +4533,6 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - minimatch@9.0.4: resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} engines: {node: '>=16 || 14 >=14.17'} @@ -5064,14 +4547,6 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} @@ -5079,44 +4554,25 @@ packages: minisearch@7.1.0: resolution: {integrity: sha512-tv7c/uefWdEhcu6hvrfTihflgeEi2tN6VV7HJnCjK6VxM75QQJh4t9FwJCsA2EsRS8LCnu3W87CuGPWMocOLCA==} - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - mixme@0.5.10: resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} engines: {node: '>= 8.0.0'} - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - mkdirp@3.0.1: resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} engines: {node: '>=10'} hasBin: true - mlly@1.7.0: - resolution: {integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==} + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} moment@2.29.4: resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} - mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - mrmime@2.0.0: resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} engines: {node: '>=10'} - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -5126,55 +4582,48 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.15: + resolution: {integrity: sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nitropack@2.9.6: - resolution: {integrity: sha512-HP2PE0dREcDIBVkL8Zm6eVyrDd10/GI9hTL00PHvjUM8I9Y/2cv73wRDmxNyInfrx/CJKHATb2U/pQrqpzJyXA==} - engines: {node: ^16.11.0 || >=17.0.0} + nf3@0.3.18: + resolution: {integrity: sha512-lFvZrVZXN4FQYoV1iGiZ5RAzfzjbjQvm0MBdLvQKqvnOfkh09btu1tzI/RdIKrdIoRKL12XYlwdbcB0QwM3m6Q==} + + nitro@3.0.260610-beta: + resolution: {integrity: sha512-KPb4L5yaF/Rx/xoGMpgHRJvZhbhGiqbRKOwwPLCH9jKTKTsEUHLjnJas85AeCzaswqa8Wi52eQBtRsODC4PS0Q==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: + '@vercel/queue': ^0.3.0 + dotenv: '*' + giget: '*' + jiti: ^2.7.0 + rollup: ^4.61.1 + vite: ^7 || ^8 xml2js: ^0.6.2 + zephyr-agent: ^0.2.0 peerDependenciesMeta: + '@vercel/queue': + optional: true + dotenv: + optional: true + giget: + optional: true + jiti: + optional: true + rollup: + optional: true + vite: + optional: true xml2js: optional: true - - node-addon-api@7.1.0: - resolution: {integrity: sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==} - engines: {node: ^16 || ^18 || >= 20} - - node-fetch-native@1.6.4: - resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: + zephyr-agent: optional: true - node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} - - node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} - hasBin: true - - node-html-parser@6.1.13: - resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==} - - node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - - nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true + node-releases@2.0.50: + resolution: {integrity: sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==} + engines: {node: '>=18'} normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -5187,10 +4636,6 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -5199,21 +4644,9 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} - deprecated: This package is no longer supported. - nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - nwsapi@2.2.10: - resolution: {integrity: sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==} - - nypm@0.3.8: - resolution: {integrity: sha512-IGWlC6So2xv6V4cIDmoV0SwwWx7zLG086gyqkyumteH2fIgCAM4nDVFB2iDRszDvmdSVW9xb1N+2KjQ6C7d4og==} - engines: {node: ^14.16.0 || >=16.10.0} - hasBin: true - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -5225,10 +4658,6 @@ packages: object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -5237,15 +4666,18 @@ packages: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} - ofetch@1.3.4: - resolution: {integrity: sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==} + obug@2.1.3: + resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==} + engines: {node: '>=12.20.0'} - ohash@1.1.3: - resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} + ocache@0.1.5: + resolution: {integrity: sha512-kNNnkkVQup/QDvmTz8Q84wc2ntiyoVHDxa6eHWKt5qdGAmFRBIxy83rxgCYEjW0x06UJ9E3P6VgM2yY4rOBH4w==} - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + ofetch@2.0.0-alpha.3: + resolution: {integrity: sha512-zpYTCs2byOuft65vI3z43Dd6iSdFbOZZLb9/d21aCpx2rGastVU9dOCv0lu4ykc1Ur1anAYjDi3SUvR0vq50JA==} + + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -5258,17 +4690,14 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} - open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} - open@9.1.0: - resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} - engines: {node: '>=14.16'} + oniguruma-to-es@2.3.0: + resolution: {integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==} - openapi-typescript@6.7.6: - resolution: {integrity: sha512-c/hfooPx+RBIOPM09GSxABOZhYPblDoyaGhqBkD/59vtpN21jEuWKDlM0KYTvqJVlSYjKs0tBcIdeXKChlSPtw==} - hasBin: true + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} @@ -5316,6 +4745,9 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + package-manager-detector@1.7.0: + resolution: {integrity: sha512-xg1eHpwYL/D/HEdWw2goFZP6vV0FH7W+PZ5rFkGjdIDLtxq7EkzBUeT3m+lndYCt8wKbmofUu1MUdMCXkCk9ZQ==} + package-name-regex@2.0.6: resolution: {integrity: sha512-gFL35q7kbE/zBaPA3UKhp2vSzcPYx2ecbYuwv1ucE9Il6IIgBDweBlH8D68UFGZic2MkllKa2KHCfC1IQBQUYA==} engines: {node: '>=12'} @@ -5338,15 +4770,11 @@ packages: resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} engines: {node: '>=0.10.0'} - parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} + parse5@8.0.1: + resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} @@ -5371,20 +4799,19 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-to-regexp@6.2.2: - resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - path-type@5.0.0: - resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} - engines: {node: '>=12'} - pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} @@ -5392,19 +4819,17 @@ packages: resolution: {integrity: sha512-L7MXxUDtqr4PUaLFCDCXBfGV/6KLIuSEccizDI7JxT+c9x1G1v04BQ4+4oag84SHaCdrBgQAIs/Cqn+flwFPng==} engines: {node: '>=6.14'} - perfect-debounce@1.0.0: - resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} - - periscopic@3.1.0: - resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} - - picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -5424,8 +4849,11 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} - pkg-types@1.1.1: - resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.1: + resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} @@ -5455,16 +4883,30 @@ packages: ts-node: optional: true + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + postcss-nested@6.0.1: resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 - postcss-selector-parser@6.0.10: - resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} - engines: {node: '>=4'} - postcss-selector-parser@6.1.0: resolution: {integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==} engines: {node: '>=4'} @@ -5472,17 +4914,10 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.4.28: - resolution: {integrity: sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==} - engines: {node: ^10 || ^12 || >=14} - - postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + postcss@8.5.16: + resolution: {integrity: sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==} engines: {node: ^10 || ^12 || >=14} - preact@10.22.0: - resolution: {integrity: sha512-RRurnSjJPj4rp5K6XoP45Ui33ncb7e4H7WiOHVpjbkvqvA3U+N8Z6Qbo0AE6leGYBV66n8EhEaFixvIu3SkxFw==} - preferred-pm@3.1.3: resolution: {integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==} engines: {node: '>=10'} @@ -5549,9 +4984,10 @@ packages: engines: {node: '>=14'} hasBin: true - pretty-bytes@6.1.1: - resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} - engines: {node: ^14.13.1 || >=16.0.0} + prettier@4.0.0-alpha.13: + resolution: {integrity: sha512-177K/2S5iYDKtvZkDC2ZMqpyXtoiiVQBVQZpcQsRs+ZIIUQxsXomWIjquAlwt2pXpio9riz5IgtaUEnoZH44tg==} + engines: {node: '>=18'} + hasBin: true pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} @@ -5561,13 +4997,6 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - - process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - promise-make-naked@2.1.2: resolution: {integrity: sha512-y7s8ZuHIG56JYspB24be9GFkXA1zXL85Ur9u1DKrW/tvyUoPxWgBjnalK6Nc6l7wHBcAW0c3PO07+XOsWTRuhg==} @@ -5577,25 +5006,22 @@ packages: property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + property-information@7.2.0: + resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} + pseudomap@1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - queue-tick@1.0.1: - resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} - quick-lru@4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} @@ -5603,16 +5029,6 @@ packages: radix3@1.1.2: resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - rc9@2.1.2: - resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} - react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} @@ -5634,27 +5050,35 @@ packages: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} - readable-stream@4.5.2: - resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - readdir-glob@1.1.3: - resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} - readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - recast@0.23.9: - resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==} - engines: {node: '>= 4'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + + recma-jsx@1.0.1: + resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} @@ -5675,15 +5099,27 @@ packages: regenerate@1.4.2: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + regex-recursion@5.1.1: + resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@5.1.1: + resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + regexp.prototype.flags@1.5.2: resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} @@ -5696,26 +5132,32 @@ packages: resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} hasBin: true - rehype-parse@9.0.0: - resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==} + rehype-autolink-headings@7.1.0: + resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} - rehype-pretty-code@0.12.3: - resolution: {integrity: sha512-6NbIit8A3hLrkKBEbNs862jVnTLeIOM2AmM0VZ/MtyHb+OuNMeCa6UZSx6UG4zrobm5tY9efTwhih1exsGYsiw==} - engines: {node: '>=18'} - peerDependencies: - shikiji: ^0.7.0 || ^0.8.0 || ^0.9.0 + rehype-expressive-code@0.41.7: + resolution: {integrity: sha512-25f8ZMSF1d9CMscX7Cft0TSQIqdwjce2gDOvQ+d/w0FovsMwrSt3ODP4P3Z7wO1jsIJ4eYyaDRnIR/27bd/EMQ==} rehype-raw@7.0.0: resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + rehype-slug@6.0.0: resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} - remark-gfm@4.0.0: - resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + remark-directive@3.0.1: + resolution: {integrity: sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==} + + remark-frontmatter@5.0.0: + resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} - remark-mdx@3.0.1: - resolution: {integrity: sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==} + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-mdx@3.1.1: + resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==} remark-parse@11.0.0: resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} @@ -5723,14 +5165,12 @@ packages: remark-rehype@11.1.0: resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} - remark-shiki-twoslash@3.1.3: - resolution: {integrity: sha512-4e8OH3ySOCw5wUbDcPszokOKjKuebOqlP2WlySvC7ITBOq27BiGsFlq+FNWhxppZ+JzhTWah4gQrnMjX3KDbAQ==} - peerDependencies: - typescript: '>3' - remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + remark@15.0.1: + resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -5742,9 +5182,6 @@ packages: require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - resolve-dir@1.0.1: resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} engines: {node: '>=0.10.0'} @@ -5773,9 +5210,9 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported + rolldown@1.1.3: + resolution: {integrity: sha512-1F1eEtUBtFvcGm1HQ9TiUIUHPQG7mSAODrhIzjxoUEFuo8OcbrGLiVLkevNgj84TE4lnHvnumwFjhJO5Eu135g==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true rollup-plugin-cleanup@3.2.1: @@ -5794,16 +5231,6 @@ packages: peerDependencies: rollup: ^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 - rollup-plugin-visualizer@5.12.0: - resolution: {integrity: sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==} - engines: {node: '>=14'} - hasBin: true - peerDependencies: - rollup: 2.x || 3.x || 4.x - peerDependenciesMeta: - rollup: - optional: true - rollup-pluginutils@2.8.2: resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} @@ -5815,14 +5242,13 @@ packages: engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true - rollup@4.18.0: - resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} + rollup@4.62.2: + resolution: {integrity: sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - run-applescript@5.0.0: - resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} - engines: {node: '>=12'} + rou3@0.8.1: + resolution: {integrity: sha512-ePa+XGk00/3HuCqrEnK3LxJW7I0SdNg6EFzKUJG73hMAdDcOUC/i/aSz7LSDwLrGr33kal/rqOGydzwl6U7zBA==} run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} @@ -5838,9 +5264,6 @@ packages: resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -5851,15 +5274,16 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - saxes@5.0.1: - resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} - engines: {node: '>=10'} + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} scule@1.3.0: resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} - search-insights@2.14.0: - resolution: {integrity: sha512-OLN6MsPMCghDOqlCtsIsYgtsC0pnwVTyT9Mu6A3ewOj1DxvzZF6COrn2g86E/c05xbktB0XN04m/t1Z+n+fTGw==} + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} @@ -5879,30 +5303,16 @@ packages: engines: {node: '>=10'} hasBin: true - send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} - - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - - seroval-plugins@1.0.7: - resolution: {integrity: sha512-GO7TkWvodGp6buMEX9p7tNyIkbwlyuAWbI6G9Ec5bhcm7mQdu3JOK1IXbEUwb3FVzSc363GraG/wLW23NSavIw==} + seroval-plugins@1.5.4: + resolution: {integrity: sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw==} engines: {node: '>=10'} peerDependencies: seroval: ^1.0 - seroval@1.0.7: - resolution: {integrity: sha512-n6ZMQX5q0Vn19Zq7CIKNIo7E75gPkGCFUEqDpa8jgwpYr/vScjqnQ6H09t1uIiZ0ZSK0ypEGvrYK2bhBGWsGdw==} + seroval@1.5.4: + resolution: {integrity: sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw==} engines: {node: '>=10'} - serve-placeholder@2.0.1: - resolution: {integrity: sha512-rUzLlXk4uPFnbEaIz3SW8VISTxMuONas88nYWjAWaM2W9VDbt9tyFOr3lq8RhVOFrT3XISoBw8vni5una8qMnQ==} - - serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} - set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -5914,9 +5324,6 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -5933,24 +5340,11 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki-twoslash@3.1.2: - resolution: {integrity: sha512-JBcRIIizi+exIA/OUhYkV6jtyeZco0ykCkIRd5sgwIt1Pm4pz+maoaRZpm6SkhPwvif4fCA7xOtJOykhpIV64Q==} - peerDependencies: - typescript: '>3' - - shiki@0.10.1: - resolution: {integrity: sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng==} - - shiki@0.14.7: - resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==} + shiki@1.29.2: + resolution: {integrity: sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==} - shikiji-core@0.9.19: - resolution: {integrity: sha512-AFJu/vcNT21t0e6YrfadZ+9q86gvPum6iywRyt1OtIPjPFe25RQnYJyxHQPMLKCCWA992TPxmEmbNcOZCAJclw==} - deprecated: Shikiji is merged back to Shiki v1.0, please migrate over to get the latest updates - - shikiji@0.9.19: - resolution: {integrity: sha512-Kw2NHWktdcdypCj1GkKpXH4o6Vxz8B8TykPlPuLHOGSV8VkhoCLcFOH4k19K4LXAQYRQmxg+0X/eM+m2sLhAkg==} - deprecated: Shikiji is merged back to Shiki v1.0, please migrate over to get the latest updates + shiki@3.23.0: + resolution: {integrity: sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==} side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} @@ -5966,9 +5360,9 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - sirv@2.0.4: - resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} - engines: {node: '>= 10'} + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} skip-regex@1.0.2: resolution: {integrity: sha512-pEjMUbwJ5Pl/6Vn6FsamXHXItJXSRftcibixDmNCWbWhic0hzHrwkMZo0IZ7fMRH9KxcWDFSkzhccB4285PutA==} @@ -5978,54 +5372,37 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - - slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} - smartwrap@2.0.2: resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} engines: {node: '>=6'} hasBin: true - smob@1.5.0: - resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} - - solid-js@1.8.15: - resolution: {integrity: sha512-d0QP/efr3UVcwGgWVPveQQ0IHOH6iU7yUhc2piy8arNG8wxKmvUy1kFxyF8owpmfCWGB87usDKMaVnsNYZm+Vw==} - - solid-mdx@0.0.7: - resolution: {integrity: sha512-dYKGOu5ZiaX3sfEMZYtfyXm30u33kF+T/pr67CMeyHzENDkWD3st4XEJ12Akp0J0PG9jzyHe5sAAKEXSnEcDEw==} - peerDependencies: - solid-js: ^1.2.6 - vite: '*' + solid-js@1.9.14: + resolution: {integrity: sha512-sAEXC0Kk0S1EDg+8ysEWJDbYhA3RRoEjwuySUGlKIemeo0I5YZfOyumNjNs9Sv3y2nmhD+0rW66ag2HsMuQiGQ==} solid-presence@0.1.8: resolution: {integrity: sha512-pWGtXUFWYYUZNbg5YpG5vkQJyOtzn2KXhxYaMx/4I+lylTLYkITOLevaCwMRN+liCVk0pqB6EayLWojNqBFECA==} peerDependencies: - solid-js: ^1.8 + solid-js: '>=1.9.14' solid-prevent-scroll@0.1.7: resolution: {integrity: sha512-DLafct98/nCX9l54MQ+mPbUgmmskSvVr/qxtFEt89SpSvYQkjyX4uviy91TFmzslhSyiVNNBlChpVzRO8eAwzA==} peerDependencies: - solid-js: ^1.8 + solid-js: '>=1.9.14' solid-refresh@0.6.3: resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} peerDependencies: - solid-js: ^1.3 + solid-js: '>=1.9.14' - solid-use@0.8.0: - resolution: {integrity: sha512-YX+XmcKLvSx3bwMimMhFy40ZkDnShnUcEw6cW6fSscwKEgl1TG3GlgAvkBmQ3AeWjvQSd8+HGTr82ImsrjkkqA==} + solid-use@0.9.1: + resolution: {integrity: sha512-UwvXDVPlrrbj/9ewG9ys5uL2IO4jSiwys2KPzK4zsnAcmEl7iDafZWW1Mo4BSEWOmQCGK6IvpmGHo1aou8iOFw==} engines: {node: '>=10'} peerDependencies: - solid-js: ^1.7 + solid-js: '>=1.9.14' - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} source-map-support@0.5.21: @@ -6035,13 +5412,14 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} + deprecated: The work that was done in this beta branch won't be included in future versions sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} @@ -6086,9 +5464,10 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - stack-trace@1.0.0-pre2: - resolution: {integrity: sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==} - engines: {node: '>=16'} + srvx@0.11.18: + resolution: {integrity: sha512-7/EW5sPdC1bU7iq1tgTvCZqUQDkJdsqIVzYqBv7SuBfQQ10oWkKj4KYNOw0H4Ig26bXuUYDA7XTKxB+/HC5SRw==} + engines: {node: '>=20.16.0'} + hasBin: true stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -6099,30 +5478,18 @@ packages: standard-as-callback@2.1.0: resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + std-env@4.2.0: + resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} + stdin-blocker@2.0.0: resolution: {integrity: sha512-fZ3txWyDSxOll6+ajX9akA5YzchyoEpVNsH8eWNY/ZnzlRoM0eW/zF8bm852KVpYutjNFQFvEF/RdZtlqxIZkQ==} - stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - stream-transform@2.1.3: resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} - streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - - streamx@2.18.0: - resolution: {integrity: sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==} - string-escape-regex@1.0.0: resolution: {integrity: sha512-41Uu0J545cU6Fe1str6GZKI8hf38nsJPfjkePF4npjhACIHSrrVFKMPYSe8hT0FAxIuss36wGuEM5syChVs/pQ==} @@ -6145,9 +5512,6 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -6162,6 +5526,10 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -6189,6 +5557,9 @@ packages: strip-literal@2.1.0: resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + stubborn-fs@1.2.5: resolution: {integrity: sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==} @@ -6211,10 +5582,6 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - supports-color@9.4.0: - resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} - engines: {node: '>=12'} - supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -6222,40 +5589,26 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - system-architecture@0.1.0: - resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} - engines: {node: '>=18'} - tailwindcss@3.3.3: resolution: {integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==} engines: {node: '>=14.0.0'} hasBin: true - tar-stream@3.1.7: - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} - term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - terracotta@1.0.5: - resolution: {integrity: sha512-4jkpXGKemeWjsBGDoBK1tnovGfIEMM8+Fa99T0TD4VYUaZq6hXHEWMfHshxy1h+DzsanDAwSBIBM0NnOohzijw==} + terracotta@1.1.0: + resolution: {integrity: sha512-kfQciWUBUBgYkXu7gh3CK3FAJng/iqZslAaY08C+k1Hdx17aVEpcFFb/WPaysxAfcupNH3y53s/pc53xxZauww==} engines: {node: '>=10'} peerDependencies: - solid-js: ^1.8 + solid-js: '>=1.9.14' terser@5.31.0: resolution: {integrity: sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==} engines: {node: '>=10'} hasBin: true - text-decoder@1.1.0: - resolution: {integrity: sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==} - text-extensions@1.9.0: resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} engines: {node: '>=0.10'} @@ -6276,9 +5629,6 @@ packages: tiny-bin@1.10.3: resolution: {integrity: sha512-YpllyC9ZGiDCj+7CC0jO6WDY2ptVd0VpMiwgkPDx1N2a8szBcUf2wKcMFiAaY9pcZeIPhHhTop9cTnSYQePfoA==} - tiny-colors@2.2.0: - resolution: {integrity: sha512-PfB40iPtxzTdvIA4QsnyCFQ+BKMvrIl2cvonZPa+sJRL/5MWdf8JNlgi/48uCrsjGPhsq+B3ole+uGn6Sot3Fg==} - tiny-colors@2.2.2: resolution: {integrity: sha512-Elmv7JL+dX0c78caKEelH1nHHBskHzJkaqBRgVvQuxsvVA/Z9Fa2R3ZZtfmkkajcd18e96RLMwJvtFqC8jsZWA==} @@ -6288,9 +5638,6 @@ packages: tiny-editorconfig@1.0.0: resolution: {integrity: sha512-rxpWaSurnvPUkL2/qydRH10llK7MD1XfE38zoWTsp/ZWWYnnwPBzGUePBOcXFaNA3cJQm8ItqrofGeRJ6AVaew==} - tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - tiny-jsonc@1.0.1: resolution: {integrity: sha512-ik6BCxzva9DoiEfDX/li0L2cWKPPENYvixUprFdl3YPi4bZZUhDnNI9YUkacrv+uIG90dnxR5mNqaoD6UhD6Bw==} @@ -6315,54 +5662,64 @@ packages: tiny-updater@3.5.3: resolution: {integrity: sha512-wEUssfOOkVLg2raSaRbyZDHpVCDj6fnp7UjynpNE4XGuF+Gkj8GRRMoHdfk73VzLQs/AHKsbY8fCxXNz8Hx4Qg==} - tinybench@2.8.0: - resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyexec@1.2.4: + resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} + engines: {node: '>=18'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} tinypool@0.8.4: resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} engines: {node: '>=14.0.0'} + tinyrainbow@3.1.0: + resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} + engines: {node: '>=14.0.0'} + tinyspy@2.2.1: resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} engines: {node: '>=14.0.0'} - titleize@3.0.0: - resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} - engines: {node: '>=12'} + tldts-core@7.4.8: + resolution: {integrity: sha512-c1P7u0EhACHj7lPy4MJm8iTFEU8+nB0LCtddH0fhP7noaVoXAqafMtOOeX+ulpuPBqnrRgRhw494RICT3mbhnw==} + + tldts@7.4.8: + resolution: {integrity: sha512-htwgN/8KRB3z3vnC0BOETVh2m499g5GmyTK9Wq5JBLX3FNz6tSBveAd+fQhzy9hkjif8vy2jwDMR1sGhLtZl2A==} + hasBin: true tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} + toml@3.0.0: + resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} - tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tough-cookie@6.0.2: + resolution: {integrity: sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==} + engines: {node: '>=16'} tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - tr46@3.0.0: - resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} - engines: {node: '>=12'} + tr46@6.0.0: + resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} + engines: {node: '>=20'} tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} @@ -6375,9 +5732,6 @@ packages: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} - trough@1.0.5: - resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} - trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} @@ -6398,9 +5752,6 @@ packages: '@swc/wasm': optional: true - tslib@2.1.0: - resolution: {integrity: sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==} - tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} @@ -6420,6 +5771,25 @@ packages: typescript: optional: true + tsup@8.5.1: + resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + tty-table@4.2.3: resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} engines: {node: '>=8.0.0'} @@ -6459,6 +5829,14 @@ packages: resolution: {integrity: sha512-vOF5IPytgQPIsgGtT0n2uGZizR2N3kKuPIn4b5p5DdeLoI0BV7uNiydT7eSzdkPRpdXNnO8UwS658VaI4+YSzQ==} hasBin: true + twoslash-protocol@0.2.12: + resolution: {integrity: sha512-5qZLXVYfZ9ABdjqbvPc4RWMr7PrpPaaDSeaYY55vl/w1j6H6kzsWK/urAEIXlzYlyrFmyz1UbwIt+AA0ck+wbg==} + + twoslash@0.2.12: + resolution: {integrity: sha512-tEHPASMqi7kqwfJbkk7hc/4EhlrKCSLcur+TcvYki3vhIfaRMXnXjaYFgXpoZRbT6GdprD4tGuVBEmTpUgLBsw==} + peerDependencies: + typescript: '*' + type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} @@ -6483,14 +5861,6 @@ packages: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} - type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - - type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} - typed-array-buffer@1.0.2: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} @@ -6512,31 +5882,28 @@ packages: engines: {node: '>=4.2.0'} hasBin: true - ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - uncrypto@0.1.3: - resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} - - unctx@2.3.1: - resolution: {integrity: sha512-PhKke8ZYauiqh3FEMVNm7ljvzQiph0Mt3GBRve03IJm7ukfaON2OBK795tLwhbyfzknuRRkW0+Ze+CQUmzOZ+A==} + undici@7.28.0: + resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} + engines: {node: '>=20.18.1'} - undici-types@5.28.4: - resolution: {integrity: sha512-3OeMF5Lyowe8VW0skf5qaIE7Or3yS9LS7fvMUI0gg4YxpIBVg0L8BxCmROw2CcYhSkpR68Epz7CGc8MPj94Uww==} - - undici@5.23.0: - resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==} - engines: {node: '>=14.0'} - - undici@5.28.4: - resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} - engines: {node: '>=14.0'} - - unenv@1.9.0: - resolution: {integrity: sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g==} + unenv@2.0.0-rc.24: + resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} @@ -6554,87 +5921,117 @@ packages: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} - unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} - - unified@11.0.4: - resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} - unified@9.2.2: - resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==} + unimport@4.2.0: + resolution: {integrity: sha512-mYVtA0nmzrysnYnyb3ALMbByJ+Maosee2+WyE0puXl+Xm2bUwPorPaaeZt0ETfuroPOtG8jj1g/qeFZ6buFnag==} + engines: {node: '>=18.12.0'} - unimport@3.7.2: - resolution: {integrity: sha512-91mxcZTadgXyj3lFWmrGT8GyoRHWuE5fqPOjg5RVtF6vj+OfM5G6WCzXjuYtSgELE5ggB34RY4oiCSEP8I3AHw==} + unist-builder@4.0.0: + resolution: {integrity: sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg==} - unist-util-is@4.1.0: - resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + unist-util-mdx-define@1.1.2: + resolution: {integrity: sha512-9ncH7i7TN5Xn7/tzX5bE3rXgz1X/u877gYVAUB3mLeTKYJmQHmqKTDBi6BTGXV7AeolBCI9ErcVsOt2qryoD0g==} + unist-util-position-from-estree@2.0.0: resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} unist-util-position@5.0.0: resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - unist-util-remove-position@5.0.0: - resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} - - unist-util-stringify-position@2.0.3: - resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} - - unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} - unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - unist-util-visit-parents@3.1.1: - resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} - unist-util-visit-parents@6.0.1: resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} - unist-util-visit@2.0.3: - resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} - - unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} - unplugin@1.10.1: - resolution: {integrity: sha512-d6Mhq8RJeGA8UfKCu54Um4lFA0eSaRa3XxdAJg8tIdxbu1ubW0hBCZUL7yI2uGyYCRndvbK8FLHzqy2XKfeMsg==} - engines: {node: '>=14.0.0'} + unplugin-auto-import@19.3.0: + resolution: {integrity: sha512-iIi0u4Gq2uGkAOGqlPJOAMI8vocvjh1clGTfSK4SOrJKrt+tirrixo/FjgBwXQNNdS7ofcr7OxzmOb/RjWxeEQ==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': ^3.2.2 + '@vueuse/core': '*' + peerDependenciesMeta: + '@nuxt/kit': + optional: true + '@vueuse/core': + optional: true + + unplugin-icons@22.5.0: + resolution: {integrity: sha512-MBlMtT5RuMYZy4TZgqUL2OTtOdTUVsS1Mhj6G1pEzMlFJlEnq6mhUfoIt45gBWxHcsOdXJDWLg3pRZ+YmvAVWQ==} + peerDependencies: + '@svgr/core': '>=7.0.0' + '@svgx/core': ^1.0.1 + '@vue/compiler-sfc': ^3.0.2 || ^2.7.0 + svelte: ^3.0.0 || ^4.0.0 || ^5.0.0 + vue-template-compiler: ^2.6.12 + vue-template-es2015-compiler: ^1.9.0 + peerDependenciesMeta: + '@svgr/core': + optional: true + '@svgx/core': + optional: true + '@vue/compiler-sfc': + optional: true + svelte: + optional: true + vue-template-compiler: + optional: true + vue-template-es2015-compiler: + optional: true - unstorage@1.10.2: - resolution: {integrity: sha512-cULBcwDqrS8UhlIysUJs2Dk0Mmt8h7B0E6mtR+relW9nZvsf/u4SkAYyNliPiPW7XtFNb5u3IUMkxGxFTTRTgQ==} - peerDependencies: - '@azure/app-configuration': ^1.5.0 - '@azure/cosmos': ^4.0.0 - '@azure/data-tables': ^13.2.2 - '@azure/identity': ^4.0.1 - '@azure/keyvault-secrets': ^4.8.0 - '@azure/storage-blob': ^12.17.0 - '@capacitor/preferences': ^5.0.7 - '@netlify/blobs': ^6.5.0 || ^7.0.0 - '@planetscale/database': ^1.16.0 - '@upstash/redis': ^1.28.4 + unplugin-utils@0.2.5: + resolution: {integrity: sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg==} + engines: {node: '>=18.12.0'} + + unplugin@2.3.11: + resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} + engines: {node: '>=18.12.0'} + + unstorage@2.0.0-alpha.7: + resolution: {integrity: sha512-ELPztchk2zgFJnakyodVY3vJWGW9jy//keJ32IOJVGUMyaPydwcA1FtVvWqT0TNRch9H+cMNEGllfVFfScImog==} + peerDependencies: + '@azure/app-configuration': ^1.11.0 + '@azure/cosmos': ^4.9.1 + '@azure/data-tables': ^13.3.2 + '@azure/identity': ^4.13.0 + '@azure/keyvault-secrets': ^4.10.0 + '@azure/storage-blob': ^12.31.0 + '@capacitor/preferences': ^6 || ^7 || ^8 + '@deno/kv': '>=0.13.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.36.2 + '@vercel/blob': '>=0.27.3' + '@vercel/functions': ^2.2.12 || ^3.0.0 '@vercel/kv': ^1.0.1 - idb-keyval: ^6.2.1 - ioredis: ^5.3.2 + aws4fetch: ^1.0.20 + chokidar: ^4 || ^5 + db0: '>=0.3.4' + idb-keyval: ^6.2.2 + ioredis: ^5.9.3 + lru-cache: ^11.2.6 + mongodb: ^6 || ^7 + ofetch: '*' + uploadthing: ^7.7.4 peerDependenciesMeta: '@azure/app-configuration': optional: true @@ -6650,48 +6047,48 @@ packages: optional: true '@capacitor/preferences': optional: true + '@deno/kv': + optional: true '@netlify/blobs': optional: true '@planetscale/database': optional: true '@upstash/redis': optional: true + '@vercel/blob': + optional: true + '@vercel/functions': + optional: true '@vercel/kv': optional: true + aws4fetch: + optional: true + chokidar: + optional: true + db0: + optional: true idb-keyval: optional: true ioredis: optional: true + lru-cache: + optional: true + mongodb: + optional: true + ofetch: + optional: true + uploadthing: + optional: true - untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - - untun@0.1.3: - resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==} - hasBin: true - - unwasm@0.3.9: - resolution: {integrity: sha512-LDxTx/2DkFURUd+BU1vUsF/moj0JsoTvl+2tcg2AUOiEzVturhGGx17/IMgGvKUYdZwr33EJHtChCJuhu9Ouvg==} - - update-browserslist-db@1.0.16: - resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' - uqr@0.1.2: - resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} - uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - - urlpattern-polyfill@8.0.2: - resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} - util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -6707,49 +6104,23 @@ packages: vfile-location@5.0.2: resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} - vfile-message@2.0.4: - resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} - - vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} - vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} - vfile@4.2.1: - resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} - - vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} - vfile@6.0.1: resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} - vinxi@0.3.9: - resolution: {integrity: sha512-+TKbWrmbNpDGn4QvJcbO3LonFpH4L0SVWOyI63WZ2zT94pJrSvyt+BefEcTlvYAJiKZUFPxkjUlNzsUdCRjZpg==} - hasBin: true - vite-node@1.3.1: resolution: {integrity: sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite-plugin-inspect@0.7.42: - resolution: {integrity: sha512-JCyX86wr3siQc+p9Kd0t8VkFHAJag0RaQVIpdFGSv5FEaePEVB6+V/RGtz2dQkkGSXQzRWrPs4cU3dRKg32bXw==} - engines: {node: '>=14'} - peerDependencies: - '@nuxt/kit': '*' - vite: ^3.1.0 || ^4.0.0 || ^5.0.0-0 - peerDependenciesMeta: - '@nuxt/kit': - optional: true - - vite-plugin-solid@2.9.1: - resolution: {integrity: sha512-RC4hj+lbvljw57BbMGDApvEOPEh14lwrr/GeXRLNQLcR1qnOdzOwwTSFy13Gj/6FNIZpBEl0bWPU+VYFawrqUw==} + vite-plugin-solid@2.11.12: + resolution: {integrity: sha512-FgjPcx2OwX9h6f28jli7A4bG7PP3te8uyakE5iqsmpq3Jqi1TWLgSroC9N6cMfGRU2zXsl4Q6ISvTr2VL0QHpA==} peerDependencies: '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* - solid-js: ^1.7.2 - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + solid-js: '>=1.9.14' + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@testing-library/jest-dom': optional: true @@ -6782,38 +6153,53 @@ packages: terser: optional: true - vite@5.1.4: - resolution: {integrity: sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==} - engines: {node: ^18.0.0 || >=20.0.0} + vite@8.1.3: + resolution: {integrity: sha512-Ds+gBRbj0lwRO2Y5hwnUBdxSwlAve9LeRyU4sNnAr0ewW0gWF0n5bgXgUzbgZ49MV9BVUAQUFYVcDUcilUExMA==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.3.0 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: '@types/node': optional: true - less: + '@vitejs/devtools': optional: true - lightningcss: + esbuild: + optional: true + jiti: + optional: true + less: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: optional: true terser: optional: true + tsx: + optional: true + yaml: + optional: true - vitefu@0.2.5: - resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} + vitefu@1.1.3: + resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: vite: optional: true @@ -6843,22 +6229,50 @@ packages: jsdom: optional: true - vscode-oniguruma@1.7.0: - resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} - - vscode-textmate@5.2.0: - resolution: {integrity: sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==} - - vscode-textmate@8.0.0: - resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} - - w3c-hr-time@1.0.2: - resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} - deprecated: Use your platform's native performance.now() and performance.timeOrigin. + vitest@4.1.10: + resolution: {integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.1.10 + '@vitest/browser-preview': 4.1.10 + '@vitest/browser-webdriverio': 4.1.10 + '@vitest/coverage-istanbul': 4.1.10 + '@vitest/coverage-v8': 4.1.10 + '@vitest/ui': 4.1.10 + happy-dom: '*' + jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true - w3c-xmlserializer@3.0.0: - resolution: {integrity: sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==} - engines: {node: '>=12'} + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} @@ -6866,61 +6280,36 @@ packages: web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - - webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} + webidl-conversions@8.0.1: + resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} + engines: {node: '>=20'} - webpack-virtual-modules@0.6.1: - resolution: {integrity: sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==} + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} webworker-shim@1.1.0: resolution: {integrity: sha512-LhPJDED3cM0+K9w4JjIio+RYPqvr712b3lyM+JjMR/rSD9elrSYHrrwE9qu3inPSSf60xqePgFgEwuAg17AuhA==} - whatwg-encoding@2.0.0: - resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} - engines: {node: '>=12'} - - whatwg-mimetype@3.0.0: - resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} - engines: {node: '>=12'} - - whatwg-url@10.0.0: - resolution: {integrity: sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==} - engines: {node: '>=12'} - - whatwg-url@11.0.0: - resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} - engines: {node: '>=12'} + whatwg-mimetype@5.0.0: + resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} + engines: {node: '>=20'} - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@16.0.1: + resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - when-exit@2.1.2: - resolution: {integrity: sha512-u9J+toaf3CCxCAzM/484qNAxQE75rFdVgiFEEV8Xps2gzYhf0tx73s1WXDQhkwV17E3MxRMz40m7Ekd2/121Lg==} - when-exit@2.1.4: resolution: {integrity: sha512-4rnvd3A1t16PWzrBUcSDZqcAmsUIy4minDXT/CZ8F2mVDgd65i4Aalimgz1aQkRGU0iH5eT5+6Rx2TK8o443Pg==} which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} @@ -6941,23 +6330,11 @@ packages: engines: {node: '>= 8'} hasBin: true - which@4.0.0: - resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} - engines: {node: ^16.13.0 || >=18.0.0} - hasBin: true - - why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} hasBin: true - wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - - widest-line@4.0.1: - resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} - engines: {node: '>=12'} - word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -6980,21 +6357,9 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - xml-name-validator@4.0.0: - resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} - engines: {node: '>=12'} + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} @@ -7015,9 +6380,9 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml@2.4.2: - resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} - engines: {node: '>= 14'} + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} hasBin: true yargs-parser@18.1.3: @@ -7070,200 +6435,114 @@ packages: zeptomatch@2.0.0: resolution: {integrity: sha512-xjsIq0tpg7dNtJcbl0tNf4d4It4UK1ujSYJZXvGygse3GNgX44v/b2FRbM8sCGZS2qh4o983u8+1CBNNF+106g==} - zip-stream@6.0.1: - resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} - engines: {node: '>= 14'} - - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} - zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} snapshots: - '@adobe/css-tools@4.3.3': {} - - '@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.14.0)': - dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.14.0) - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3) - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - search-insights - - '@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.14.0)': - dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3) - search-insights: 2.14.0 - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - '@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)': - dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3) - '@algolia/client-search': 4.23.3 - algoliasearch: 4.23.3 - - '@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)': - dependencies: - '@algolia/client-search': 4.23.3 - algoliasearch: 4.23.3 - - '@algolia/cache-browser-local-storage@4.23.3': - dependencies: - '@algolia/cache-common': 4.23.3 - - '@algolia/cache-common@4.23.3': {} - - '@algolia/cache-in-memory@4.23.3': - dependencies: - '@algolia/cache-common': 4.23.3 - - '@algolia/client-account@4.23.3': - dependencies: - '@algolia/client-common': 4.23.3 - '@algolia/client-search': 4.23.3 - '@algolia/transporter': 4.23.3 - - '@algolia/client-analytics@4.23.3': - dependencies: - '@algolia/client-common': 4.23.3 - '@algolia/client-search': 4.23.3 - '@algolia/requester-common': 4.23.3 - '@algolia/transporter': 4.23.3 - - '@algolia/client-common@4.23.3': - dependencies: - '@algolia/requester-common': 4.23.3 - '@algolia/transporter': 4.23.3 - - '@algolia/client-personalization@4.23.3': - dependencies: - '@algolia/client-common': 4.23.3 - '@algolia/requester-common': 4.23.3 - '@algolia/transporter': 4.23.3 - - '@algolia/client-search@4.23.3': - dependencies: - '@algolia/client-common': 4.23.3 - '@algolia/requester-common': 4.23.3 - '@algolia/transporter': 4.23.3 - - '@algolia/logger-common@4.23.3': {} + '@adobe/css-tools@4.5.0': {} - '@algolia/logger-console@4.23.3': - dependencies: - '@algolia/logger-common': 4.23.3 + '@alloc/quick-lru@5.2.0': {} - '@algolia/recommend@4.23.3': + '@ampproject/remapping@2.3.0': dependencies: - '@algolia/cache-browser-local-storage': 4.23.3 - '@algolia/cache-common': 4.23.3 - '@algolia/cache-in-memory': 4.23.3 - '@algolia/client-common': 4.23.3 - '@algolia/client-search': 4.23.3 - '@algolia/logger-common': 4.23.3 - '@algolia/logger-console': 4.23.3 - '@algolia/requester-browser-xhr': 4.23.3 - '@algolia/requester-common': 4.23.3 - '@algolia/requester-node-http': 4.23.3 - '@algolia/transporter': 4.23.3 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - '@algolia/requester-browser-xhr@4.23.3': + '@antfu/install-pkg@1.1.0': dependencies: - '@algolia/requester-common': 4.23.3 - - '@algolia/requester-common@4.23.3': {} + package-manager-detector: 1.7.0 + tinyexec: 1.2.4 - '@algolia/requester-node-http@4.23.3': + '@asamuzakjp/css-color@5.1.11': dependencies: - '@algolia/requester-common': 4.23.3 + '@asamuzakjp/generational-cache': 1.0.1 + '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-color-parser': 4.1.9(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 - '@algolia/transporter@4.23.3': + '@asamuzakjp/dom-selector@7.1.1': dependencies: - '@algolia/cache-common': 4.23.3 - '@algolia/logger-common': 4.23.3 - '@algolia/requester-common': 4.23.3 - - '@alloc/quick-lru@5.2.0': {} + '@asamuzakjp/generational-cache': 1.0.1 + '@asamuzakjp/nwsapi': 2.3.9 + bidi-js: 1.0.3 + css-tree: 3.2.1 + is-potential-custom-element-name: 1.0.1 - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 + '@asamuzakjp/generational-cache@1.0.1': {} - '@antfu/utils@0.7.8': {} + '@asamuzakjp/nwsapi@2.3.9': {} - '@babel/code-frame@7.24.6': + '@babel/code-frame@7.29.7': dependencies: - '@babel/highlight': 7.24.6 - picocolors: 1.0.1 + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 - '@babel/compat-data@7.24.6': {} + '@babel/compat-data@7.29.7': {} '@babel/core@7.22.10': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.6 - '@babel/generator': 7.24.6 - '@babel/helper-compilation-targets': 7.24.6 - '@babel/helper-module-transforms': 7.24.6(@babel/core@7.22.10) - '@babel/helpers': 7.24.6 - '@babel/parser': 7.24.6 - '@babel/template': 7.24.6 - '@babel/traverse': 7.24.6 - '@babel/types': 7.24.6 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.22.10) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 convert-source-map: 1.9.0 - debug: 4.3.5 + debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/core@7.24.6': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.6 - '@babel/generator': 7.24.6 - '@babel/helper-compilation-targets': 7.24.6 - '@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.6) - '@babel/helpers': 7.24.6 - '@babel/parser': 7.24.6 - '@babel/template': 7.24.6 - '@babel/traverse': 7.24.6 - '@babel/types': 7.24.6 + '@babel/core@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.3.5 + debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.24.6': + '@babel/generator@7.29.7': dependencies: - '@babel/types': 7.24.6 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.24.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.29.7 '@babel/helper-builder-binary-assignment-operator-visitor@7.24.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.29.7 - '@babel/helper-compilation-targets@7.24.6': + '@babel/helper-compilation-targets@7.29.7': dependencies: - '@babel/compat-data': 7.24.6 - '@babel/helper-validator-option': 7.24.6 - browserslist: 4.23.0 + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.4 lru-cache: 5.1.1 semver: 6.3.1 @@ -7290,9 +6569,9 @@ snapshots: '@babel/helper-define-polyfill-provider@0.4.4(@babel/core@7.22.10)': dependencies: '@babel/core': 7.22.10 - '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-plugin-utils': 7.24.6 - debug: 4.3.5 + debug: 4.4.3 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -7301,9 +6580,9 @@ snapshots: '@babel/helper-define-polyfill-provider@0.5.0(@babel/core@7.22.10)': dependencies: '@babel/core': 7.22.10 - '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-plugin-utils': 7.24.6 - debug: 4.3.5 + debug: 4.4.3 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -7312,9 +6591,9 @@ snapshots: '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.22.10)': dependencies: '@babel/core': 7.22.10 - '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-plugin-utils': 7.24.6 - debug: 4.3.5 + debug: 4.4.3 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -7324,46 +6603,51 @@ snapshots: '@babel/helper-function-name@7.24.6': dependencies: - '@babel/template': 7.24.6 - '@babel/types': 7.24.6 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/helper-globals@7.29.7': {} '@babel/helper-hoist-variables@7.24.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.29.7 '@babel/helper-member-expression-to-functions@7.24.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.29.7 '@babel/helper-module-imports@7.18.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.29.7 - '@babel/helper-module-imports@7.24.6': + '@babel/helper-module-imports@7.29.7': dependencies: - '@babel/types': 7.24.6 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color - '@babel/helper-module-transforms@7.24.6(@babel/core@7.22.10)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.22.10)': dependencies: '@babel/core': 7.22.10 - '@babel/helper-environment-visitor': 7.24.6 - '@babel/helper-module-imports': 7.24.6 - '@babel/helper-simple-access': 7.24.6 - '@babel/helper-split-export-declaration': 7.24.6 - '@babel/helper-validator-identifier': 7.24.6 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color - '@babel/helper-module-transforms@7.24.6(@babel/core@7.24.6)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.24.6 - '@babel/helper-environment-visitor': 7.24.6 - '@babel/helper-module-imports': 7.24.6 - '@babel/helper-simple-access': 7.24.6 - '@babel/helper-split-export-declaration': 7.24.6 - '@babel/helper-validator-identifier': 7.24.6 + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color '@babel/helper-optimise-call-expression@7.24.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.29.7 '@babel/helper-plugin-utils@7.24.6': {} @@ -7383,43 +6667,36 @@ snapshots: '@babel/helper-simple-access@7.24.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.29.7 '@babel/helper-skip-transparent-expression-wrappers@7.24.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.29.7 '@babel/helper-split-export-declaration@7.24.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.29.7 - '@babel/helper-string-parser@7.24.6': {} + '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-validator-identifier@7.24.6': {} + '@babel/helper-validator-identifier@7.29.7': {} - '@babel/helper-validator-option@7.24.6': {} + '@babel/helper-validator-option@7.29.7': {} '@babel/helper-wrap-function@7.24.6': dependencies: '@babel/helper-function-name': 7.24.6 - '@babel/template': 7.24.6 - '@babel/types': 7.24.6 - - '@babel/helpers@7.24.6': - dependencies: - '@babel/template': 7.24.6 - '@babel/types': 7.24.6 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 - '@babel/highlight@7.24.6': + '@babel/helpers@7.29.7': dependencies: - '@babel/helper-validator-identifier': 7.24.6 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.1 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 - '@babel/parser@7.24.6': + '@babel/parser@7.29.7': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.29.7 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.6(@babel/core@7.22.10)': dependencies: @@ -7487,9 +6764,9 @@ snapshots: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-jsx@7.24.6(@babel/core@7.24.6)': + '@babel/plugin-syntax-jsx@7.24.6(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.24.6 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.24.6 '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.10)': @@ -7537,11 +6814,6 @@ snapshots: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-typescript@7.24.6(@babel/core@7.24.6)': - dependencies: - '@babel/core': 7.24.6 - '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.10)': dependencies: '@babel/core': 7.22.10 @@ -7564,9 +6836,11 @@ snapshots: '@babel/plugin-transform-async-to-generator@7.24.6(@babel/core@7.22.10)': dependencies: '@babel/core': 7.22.10 - '@babel/helper-module-imports': 7.24.6 + '@babel/helper-module-imports': 7.29.7 '@babel/helper-plugin-utils': 7.24.6 '@babel/helper-remap-async-to-generator': 7.24.6(@babel/core@7.22.10) + transitivePeerDependencies: + - supports-color '@babel/plugin-transform-block-scoped-functions@7.24.6(@babel/core@7.22.10)': dependencies: @@ -7595,7 +6869,7 @@ snapshots: dependencies: '@babel/core': 7.22.10 '@babel/helper-annotate-as-pure': 7.24.6 - '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-environment-visitor': 7.24.6 '@babel/helper-function-name': 7.24.6 '@babel/helper-plugin-utils': 7.24.6 @@ -7607,7 +6881,7 @@ snapshots: dependencies: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.24.6 - '@babel/template': 7.24.6 + '@babel/template': 7.29.7 '@babel/plugin-transform-destructuring@7.24.6(@babel/core@7.22.10)': dependencies: @@ -7652,7 +6926,7 @@ snapshots: '@babel/plugin-transform-function-name@7.24.6(@babel/core@7.22.10)': dependencies: '@babel/core': 7.22.10 - '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-function-name': 7.24.6 '@babel/helper-plugin-utils': 7.24.6 @@ -7681,29 +6955,37 @@ snapshots: '@babel/plugin-transform-modules-amd@7.24.6(@babel/core@7.22.10)': dependencies: '@babel/core': 7.22.10 - '@babel/helper-module-transforms': 7.24.6(@babel/core@7.22.10) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.22.10) '@babel/helper-plugin-utils': 7.24.6 + transitivePeerDependencies: + - supports-color '@babel/plugin-transform-modules-commonjs@7.24.6(@babel/core@7.22.10)': dependencies: '@babel/core': 7.22.10 - '@babel/helper-module-transforms': 7.24.6(@babel/core@7.22.10) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.22.10) '@babel/helper-plugin-utils': 7.24.6 '@babel/helper-simple-access': 7.24.6 + transitivePeerDependencies: + - supports-color '@babel/plugin-transform-modules-systemjs@7.24.6(@babel/core@7.22.10)': dependencies: '@babel/core': 7.22.10 '@babel/helper-hoist-variables': 7.24.6 - '@babel/helper-module-transforms': 7.24.6(@babel/core@7.22.10) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.22.10) '@babel/helper-plugin-utils': 7.24.6 - '@babel/helper-validator-identifier': 7.24.6 + '@babel/helper-validator-identifier': 7.29.7 + transitivePeerDependencies: + - supports-color '@babel/plugin-transform-modules-umd@7.24.6(@babel/core@7.22.10)': dependencies: '@babel/core': 7.22.10 - '@babel/helper-module-transforms': 7.24.6(@babel/core@7.22.10) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.22.10) '@babel/helper-plugin-utils': 7.24.6 + transitivePeerDependencies: + - supports-color '@babel/plugin-transform-named-capturing-groups-regex@7.24.6(@babel/core@7.22.10)': dependencies: @@ -7731,7 +7013,7 @@ snapshots: '@babel/plugin-transform-object-rest-spread@7.24.6(@babel/core@7.22.10)': dependencies: '@babel/core': 7.22.10 - '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-plugin-utils': 7.24.6 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.10) '@babel/plugin-transform-parameters': 7.24.6(@babel/core@7.22.10) @@ -7779,20 +7061,6 @@ snapshots: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-transform-react-jsx-development@7.24.6(@babel/core@7.24.6)': - dependencies: - '@babel/core': 7.24.6 - '@babel/plugin-transform-react-jsx': 7.24.6(@babel/core@7.24.6) - - '@babel/plugin-transform-react-jsx@7.24.6(@babel/core@7.24.6)': - dependencies: - '@babel/core': 7.24.6 - '@babel/helper-annotate-as-pure': 7.24.6 - '@babel/helper-module-imports': 7.24.6 - '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-jsx': 7.24.6(@babel/core@7.24.6) - '@babel/types': 7.24.6 - '@babel/plugin-transform-regenerator@7.24.6(@babel/core@7.22.10)': dependencies: '@babel/core': 7.22.10 @@ -7863,11 +7131,11 @@ snapshots: '@babel/preset-env@7.22.10(@babel/core@7.22.10)': dependencies: - '@babel/compat-data': 7.24.6 + '@babel/compat-data': 7.29.7 '@babel/core': 7.22.10 - '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-plugin-utils': 7.24.6 - '@babel/helper-validator-option': 7.24.6 + '@babel/helper-validator-option': 7.29.7 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.6(@babel/core@7.22.10) '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.6(@babel/core@7.22.10) '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.10) @@ -7938,7 +7206,7 @@ snapshots: '@babel/plugin-transform-unicode-regex': 7.24.6(@babel/core@7.22.10) '@babel/plugin-transform-unicode-sets-regex': 7.24.6(@babel/core@7.22.10) '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.22.10) - '@babel/types': 7.24.6 + '@babel/types': 7.29.7 babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.22.10) babel-plugin-polyfill-corejs3: 0.8.7(@babel/core@7.22.10) babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.22.10) @@ -7951,17 +7219,19 @@ snapshots: dependencies: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.24.6 - '@babel/types': 7.24.6 + '@babel/types': 7.29.7 esutils: 2.0.3 '@babel/preset-typescript@7.24.6(@babel/core@7.22.10)': dependencies: '@babel/core': 7.22.10 '@babel/helper-plugin-utils': 7.24.6 - '@babel/helper-validator-option': 7.24.6 + '@babel/helper-validator-option': 7.29.7 '@babel/plugin-syntax-jsx': 7.24.6(@babel/core@7.22.10) '@babel/plugin-transform-modules-commonjs': 7.24.6(@babel/core@7.22.10) '@babel/plugin-transform-typescript': 7.24.6(@babel/core@7.22.10) + transitivePeerDependencies: + - supports-color '@babel/regjsgen@0.8.0': {} @@ -7969,32 +7239,28 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.24.6': + '@babel/template@7.29.7': dependencies: - '@babel/code-frame': 7.24.6 - '@babel/parser': 7.24.6 - '@babel/types': 7.24.6 + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 - '@babel/traverse@7.24.6': + '@babel/traverse@7.29.7': dependencies: - '@babel/code-frame': 7.24.6 - '@babel/generator': 7.24.6 - '@babel/helper-environment-visitor': 7.24.6 - '@babel/helper-function-name': 7.24.6 - '@babel/helper-hoist-variables': 7.24.6 - '@babel/helper-split-export-declaration': 7.24.6 - '@babel/parser': 7.24.6 - '@babel/types': 7.24.6 - debug: 4.3.5 - globals: 11.12.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + debug: 4.4.3 transitivePeerDependencies: - supports-color - '@babel/types@7.24.6': + '@babel/types@7.29.7': dependencies: - '@babel/helper-string-parser': 7.24.6 - '@babel/helper-validator-identifier': 7.24.6 - to-fast-properties: 2.0.0 + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 '@biomejs/biome@1.8.1': optionalDependencies: @@ -8031,6 +7297,12 @@ snapshots: '@biomejs/cli-win32-x64@1.8.1': optional: true + '@bprogress/core@1.3.4': {} + + '@bramus/specificity@2.4.2': + dependencies: + css-tree: 3.2.1 + '@changesets/apply-release-plan@6.1.4': dependencies: '@babel/runtime': 7.24.6 @@ -8104,7 +7376,7 @@ snapshots: '@changesets/types': 5.2.1 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - micromatch: 4.0.7 + micromatch: 4.0.8 '@changesets/errors@0.1.4': dependencies: @@ -8137,7 +7409,7 @@ snapshots: '@changesets/types': 5.2.1 '@manypkg/get-packages': 1.1.3 is-subdir: 1.2.0 - micromatch: 4.0.7 + micromatch: 4.0.8 spawndamnit: 2.0.0 '@changesets/logger@0.0.5': @@ -8180,10 +7452,6 @@ snapshots: human-id: 1.0.2 prettier: 2.8.8 - '@cloudflare/kv-asset-handler@0.3.2': - dependencies: - mime: 3.0.0 - '@commitlint/cli@17.7.1': dependencies: '@commitlint/format': 17.8.1 @@ -8215,13 +7483,13 @@ snapshots: ajv: 8.14.0 optional: true - '@commitlint/cz-commitlint@17.7.1(commitizen@4.3.0(@types/node@20.5.4)(typescript@4.9.5))(inquirer@8.2.5)': + '@commitlint/cz-commitlint@17.7.1(commitizen@4.3.0(@types/node@20.5.4)(typescript@6.0.3))(inquirer@8.2.5)': dependencies: '@commitlint/ensure': 17.8.1 '@commitlint/load': 17.8.1 '@commitlint/types': 17.8.1 chalk: 4.1.2 - commitizen: 4.3.0(@types/node@20.5.4)(typescript@4.9.5) + commitizen: 4.3.0(@types/node@20.5.4)(typescript@6.0.3) inquirer: 8.2.5 lodash.isplainobject: 4.0.6 word-wrap: 1.2.5 @@ -8268,27 +7536,27 @@ snapshots: '@commitlint/types': 17.8.1 '@types/node': 20.5.1 chalk: 4.1.2 - cosmiconfig: 8.3.6(typescript@4.9.5) - cosmiconfig-typescript-loader: 4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@4.9.5))(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5))(typescript@4.9.5) + cosmiconfig: 8.3.6(typescript@5.9.3) + cosmiconfig-typescript-loader: 4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.9.3))(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.9.3))(typescript@5.9.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.2(@types/node@20.5.1)(typescript@4.9.5) - typescript: 4.9.5 + ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - '@commitlint/load@19.2.0(@types/node@20.5.4)(typescript@4.9.5)': + '@commitlint/load@19.2.0(@types/node@20.5.4)(typescript@6.0.3)': dependencies: '@commitlint/config-validator': 19.0.3 '@commitlint/execute-rule': 19.0.0 '@commitlint/resolve-extends': 19.1.0 '@commitlint/types': 19.0.3 chalk: 5.3.0 - cosmiconfig: 9.0.0(typescript@4.9.5) - cosmiconfig-typescript-loader: 5.0.0(@types/node@20.5.4)(cosmiconfig@9.0.0(typescript@4.9.5))(typescript@4.9.5) + cosmiconfig: 9.0.0(typescript@6.0.3) + cosmiconfig-typescript-loader: 5.0.0(@types/node@20.5.4)(cosmiconfig@9.0.0(typescript@6.0.3))(typescript@6.0.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -8327,7 +7595,7 @@ snapshots: '@commitlint/config-validator': 19.0.3 '@commitlint/types': 19.0.3 global-directory: 4.0.1 - import-meta-resolve: 4.1.0 + import-meta-resolve: 4.2.0 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 optional: true @@ -8356,69 +7624,81 @@ snapshots: chalk: 5.3.0 optional: true - '@corvu/utils@0.2.0(solid-js@1.8.15)': + '@corvu/utils@0.2.0(solid-js@1.9.14)': dependencies: '@floating-ui/dom': 1.6.10 - solid-js: 1.8.15 + solid-js: 1.9.14 - '@corvu/utils@0.4.1(solid-js@1.8.15)': + '@corvu/utils@0.4.1(solid-js@1.9.14)': dependencies: '@floating-ui/dom': 1.6.10 - solid-js: 1.8.15 + solid-js: 1.9.14 '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@deno/shim-deno-test@0.5.0': {} + '@csstools/color-helpers@6.1.0': {} - '@deno/shim-deno@0.19.1': + '@csstools/css-calc@3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: - '@deno/shim-deno-test': 0.5.0 - which: 4.0.0 + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 - '@docsearch/css@3.5.2': {} + '@csstools/css-color-parser@4.1.9(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/color-helpers': 6.1.0 + '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 - '@docsearch/js@3.5.2(@algolia/client-search@4.23.3)(search-insights@2.14.0)': + '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': dependencies: - '@docsearch/react': 3.5.2(@algolia/client-search@4.23.3)(search-insights@2.14.0) - preact: 10.22.0 - transitivePeerDependencies: - - '@algolia/client-search' - - '@types/react' - - react - - react-dom - - search-insights - - '@docsearch/react@3.5.2(@algolia/client-search@4.23.3)(search-insights@2.14.0)': - dependencies: - '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.14.0) - '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3) - '@docsearch/css': 3.5.2 - algoliasearch: 4.23.3 + '@csstools/css-tokenizer': 4.0.0 + + '@csstools/css-syntax-patches-for-csstree@1.1.6(css-tree@3.2.1)': optionalDependencies: - search-insights: 2.14.0 - transitivePeerDependencies: - - '@algolia/client-search' + css-tree: 3.2.1 + + '@csstools/css-tokenizer@4.0.0': {} + + '@ctrl/tinycolor@4.2.0': {} + + '@docsearch/css@3.9.0': {} + + '@docsearch/js@4.6.3': {} + + '@emnapi/core@1.11.1': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.6.2 + optional: true + + '@emnapi/runtime@1.11.1': + dependencies: + tslib: 2.6.2 + optional: true + + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.6.2 + optional: true '@emotion/hash@0.9.1': {} '@esbuild/aix-ppc64@0.19.12': optional: true - '@esbuild/aix-ppc64@0.20.2': + '@esbuild/aix-ppc64@0.27.7': optional: true '@esbuild/android-arm64@0.18.20': optional: true - '@esbuild/android-arm64@0.18.7': - optional: true - '@esbuild/android-arm64@0.19.12': optional: true - '@esbuild/android-arm64@0.20.2': + '@esbuild/android-arm64@0.27.7': optional: true '@esbuild/android-arm@0.15.18': @@ -8427,109 +7707,82 @@ snapshots: '@esbuild/android-arm@0.18.20': optional: true - '@esbuild/android-arm@0.18.7': - optional: true - '@esbuild/android-arm@0.19.12': optional: true - '@esbuild/android-arm@0.20.2': + '@esbuild/android-arm@0.27.7': optional: true '@esbuild/android-x64@0.18.20': optional: true - '@esbuild/android-x64@0.18.7': - optional: true - '@esbuild/android-x64@0.19.12': optional: true - '@esbuild/android-x64@0.20.2': + '@esbuild/android-x64@0.27.7': optional: true '@esbuild/darwin-arm64@0.18.20': optional: true - '@esbuild/darwin-arm64@0.18.7': - optional: true - '@esbuild/darwin-arm64@0.19.12': optional: true - '@esbuild/darwin-arm64@0.20.2': + '@esbuild/darwin-arm64@0.27.7': optional: true '@esbuild/darwin-x64@0.18.20': optional: true - '@esbuild/darwin-x64@0.18.7': - optional: true - '@esbuild/darwin-x64@0.19.12': optional: true - '@esbuild/darwin-x64@0.20.2': + '@esbuild/darwin-x64@0.27.7': optional: true '@esbuild/freebsd-arm64@0.18.20': optional: true - '@esbuild/freebsd-arm64@0.18.7': - optional: true - '@esbuild/freebsd-arm64@0.19.12': optional: true - '@esbuild/freebsd-arm64@0.20.2': + '@esbuild/freebsd-arm64@0.27.7': optional: true '@esbuild/freebsd-x64@0.18.20': optional: true - '@esbuild/freebsd-x64@0.18.7': - optional: true - '@esbuild/freebsd-x64@0.19.12': optional: true - '@esbuild/freebsd-x64@0.20.2': + '@esbuild/freebsd-x64@0.27.7': optional: true '@esbuild/linux-arm64@0.18.20': optional: true - '@esbuild/linux-arm64@0.18.7': - optional: true - '@esbuild/linux-arm64@0.19.12': optional: true - '@esbuild/linux-arm64@0.20.2': + '@esbuild/linux-arm64@0.27.7': optional: true '@esbuild/linux-arm@0.18.20': optional: true - '@esbuild/linux-arm@0.18.7': + '@esbuild/linux-arm@0.19.12': optional: true - '@esbuild/linux-arm@0.19.12': - optional: true - - '@esbuild/linux-arm@0.20.2': + '@esbuild/linux-arm@0.27.7': optional: true '@esbuild/linux-ia32@0.18.20': optional: true - '@esbuild/linux-ia32@0.18.7': - optional: true - '@esbuild/linux-ia32@0.19.12': optional: true - '@esbuild/linux-ia32@0.20.2': + '@esbuild/linux-ia32@0.27.7': optional: true '@esbuild/linux-loong64@0.15.18': @@ -8538,178 +7791,192 @@ snapshots: '@esbuild/linux-loong64@0.18.20': optional: true - '@esbuild/linux-loong64@0.18.7': - optional: true - '@esbuild/linux-loong64@0.19.12': optional: true - '@esbuild/linux-loong64@0.20.2': + '@esbuild/linux-loong64@0.27.7': optional: true '@esbuild/linux-mips64el@0.18.20': optional: true - '@esbuild/linux-mips64el@0.18.7': - optional: true - '@esbuild/linux-mips64el@0.19.12': optional: true - '@esbuild/linux-mips64el@0.20.2': + '@esbuild/linux-mips64el@0.27.7': optional: true '@esbuild/linux-ppc64@0.18.20': optional: true - '@esbuild/linux-ppc64@0.18.7': - optional: true - '@esbuild/linux-ppc64@0.19.12': optional: true - '@esbuild/linux-ppc64@0.20.2': + '@esbuild/linux-ppc64@0.27.7': optional: true '@esbuild/linux-riscv64@0.18.20': optional: true - '@esbuild/linux-riscv64@0.18.7': - optional: true - '@esbuild/linux-riscv64@0.19.12': optional: true - '@esbuild/linux-riscv64@0.20.2': + '@esbuild/linux-riscv64@0.27.7': optional: true '@esbuild/linux-s390x@0.18.20': optional: true - '@esbuild/linux-s390x@0.18.7': - optional: true - '@esbuild/linux-s390x@0.19.12': optional: true - '@esbuild/linux-s390x@0.20.2': + '@esbuild/linux-s390x@0.27.7': optional: true '@esbuild/linux-x64@0.18.20': optional: true - '@esbuild/linux-x64@0.18.7': - optional: true - '@esbuild/linux-x64@0.19.12': optional: true - '@esbuild/linux-x64@0.20.2': + '@esbuild/linux-x64@0.27.7': optional: true - '@esbuild/netbsd-x64@0.18.20': + '@esbuild/netbsd-arm64@0.27.7': optional: true - '@esbuild/netbsd-x64@0.18.7': + '@esbuild/netbsd-x64@0.18.20': optional: true '@esbuild/netbsd-x64@0.19.12': optional: true - '@esbuild/netbsd-x64@0.20.2': + '@esbuild/netbsd-x64@0.27.7': optional: true - '@esbuild/openbsd-x64@0.18.20': + '@esbuild/openbsd-arm64@0.27.7': optional: true - '@esbuild/openbsd-x64@0.18.7': + '@esbuild/openbsd-x64@0.18.20': optional: true '@esbuild/openbsd-x64@0.19.12': optional: true - '@esbuild/openbsd-x64@0.20.2': + '@esbuild/openbsd-x64@0.27.7': optional: true - '@esbuild/sunos-x64@0.18.20': + '@esbuild/openharmony-arm64@0.27.7': optional: true - '@esbuild/sunos-x64@0.18.7': + '@esbuild/sunos-x64@0.18.20': optional: true '@esbuild/sunos-x64@0.19.12': optional: true - '@esbuild/sunos-x64@0.20.2': + '@esbuild/sunos-x64@0.27.7': optional: true '@esbuild/win32-arm64@0.18.20': optional: true - '@esbuild/win32-arm64@0.18.7': - optional: true - '@esbuild/win32-arm64@0.19.12': optional: true - '@esbuild/win32-arm64@0.20.2': + '@esbuild/win32-arm64@0.27.7': optional: true '@esbuild/win32-ia32@0.18.20': optional: true - '@esbuild/win32-ia32@0.18.7': - optional: true - '@esbuild/win32-ia32@0.19.12': optional: true - '@esbuild/win32-ia32@0.20.2': + '@esbuild/win32-ia32@0.27.7': optional: true '@esbuild/win32-x64@0.18.20': optional: true - '@esbuild/win32-x64@0.18.7': - optional: true - '@esbuild/win32-x64@0.19.12': optional: true - '@esbuild/win32-x64@0.20.2': + '@esbuild/win32-x64@0.27.7': optional: true - '@fastify/busboy@2.1.1': {} + '@exodus/bytes@1.15.1': {} + + '@expressive-code/core@0.41.7': + dependencies: + '@ctrl/tinycolor': 4.2.0 + hast-util-select: 6.0.4 + hast-util-to-html: 9.0.5 + hast-util-to-text: 4.0.2 + hastscript: 9.0.1 + postcss: 8.5.16 + postcss-nested: 6.0.1(postcss@8.5.16) + unist-util-visit: 5.1.0 + unist-util-visit-parents: 6.0.1 + + '@expressive-code/plugin-collapsible-sections@0.41.7': + dependencies: + '@expressive-code/core': 0.41.7 + + '@expressive-code/plugin-frames@0.41.7': + dependencies: + '@expressive-code/core': 0.41.7 + + '@expressive-code/plugin-line-numbers@0.41.7': + dependencies: + '@expressive-code/core': 0.41.7 + + '@expressive-code/plugin-shiki@0.41.7': + dependencies: + '@expressive-code/core': 0.41.7 + shiki: 3.23.0 + + '@expressive-code/plugin-text-markers@0.41.7': + dependencies: + '@expressive-code/core': 0.41.7 '@floating-ui/core@1.6.2': dependencies: - '@floating-ui/utils': 0.2.2 + '@floating-ui/utils': 0.2.7 '@floating-ui/dom@1.6.10': dependencies: '@floating-ui/core': 1.6.2 '@floating-ui/utils': 0.2.7 - '@floating-ui/dom@1.6.5': - dependencies: - '@floating-ui/core': 1.6.2 - '@floating-ui/utils': 0.2.2 + '@floating-ui/utils@0.2.7': {} - '@floating-ui/utils@0.2.2': {} + '@fontsource-variable/inter@5.2.8': {} - '@floating-ui/utils@0.2.7': {} + '@fontsource-variable/jetbrains-mono@5.2.8': {} + + '@fontsource-variable/lexend@5.2.11': {} '@iarna/toml@2.2.5': {} - '@internationalized/date@3.4.0': + '@iconify-json/ri@1.2.10': dependencies: - '@swc/helpers': 0.5.11 + '@iconify/types': 2.0.0 + + '@iconify/types@2.0.0': {} + + '@iconify/utils@3.1.4': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@iconify/types': 2.0.0 + import-meta-resolve: 4.2.0 '@internationalized/number@3.5.3': dependencies: '@swc/helpers': 0.5.11 - '@ioredis/commands@1.2.0': {} + '@ioredis/commands@1.10.0': + optional: true '@isaacs/cliui@8.0.2': dependencies: @@ -8724,32 +7991,133 @@ snapshots: dependencies: '@sinclair/typebox': 0.27.8 - '@jridgewell/gen-mapping@0.3.5': + '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/set-array@1.2.1': {} + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/source-map@0.3.6': dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.25': + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@kobalte/core@0.13.12(solid-js@1.9.14)': + dependencies: + '@floating-ui/dom': 1.6.10 + '@internationalized/number': 3.5.3 + '@kobalte/utils': 0.9.2(solid-js@1.9.14) + '@solid-primitives/props': 3.1.11(solid-js@1.9.14) + '@solid-primitives/resize-observer': 2.0.26(solid-js@1.9.14) + solid-js: 1.9.14 + solid-presence: 0.1.8(solid-js@1.9.14) + solid-prevent-scroll: 0.1.7(solid-js@1.9.14) + + '@kobalte/solidbase@0.6.10(@solidjs/start@2.0.0-beta.0(@testing-library/jest-dom@6.9.1)(crossws@0.4.7(srvx@0.11.18))(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0)))(solid-js@1.9.14)(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0))': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@bprogress/core': 1.3.4 + '@docsearch/css': 3.9.0 + '@docsearch/js': 4.6.3 + '@expressive-code/core': 0.41.7 + '@expressive-code/plugin-collapsible-sections': 0.41.7 + '@expressive-code/plugin-frames': 0.41.7 + '@expressive-code/plugin-line-numbers': 0.41.7 + '@fontsource-variable/inter': 5.2.8 + '@fontsource-variable/jetbrains-mono': 5.2.8 + '@fontsource-variable/lexend': 5.2.11 + '@kobalte/core': 0.13.12(solid-js@1.9.14) + '@mdx-js/mdx': 3.1.1 + '@solid-primitives/clipboard': 1.6.4(solid-js@1.9.14) + '@solid-primitives/context': 0.2.3(solid-js@1.9.14) + '@solid-primitives/event-listener': 2.4.5(solid-js@1.9.14) + '@solid-primitives/keyboard': 1.3.5(solid-js@1.9.14) + '@solid-primitives/media': 2.3.5(solid-js@1.9.14) + '@solid-primitives/platform': 0.1.2(solid-js@1.9.14) + '@solid-primitives/scroll': 2.1.5(solid-js@1.9.14) + '@solid-primitives/storage': 4.3.5(solid-js@1.9.14) + '@solidjs/meta': 0.29.4(solid-js@1.9.14) + '@solidjs/router': 0.15.3(solid-js@1.9.14) + '@solidjs/start': 2.0.0-beta.0(@testing-library/jest-dom@6.9.1)(crossws@0.4.7(srvx@0.11.18))(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0)) + cross-spawn: 7.0.6 + diff: 8.0.4 + esast-util-from-js: 2.0.1 + estree-util-value-to-estree: 3.5.0 + expressive-code: 0.41.7 + expressive-code-twoslash: 0.4.0(@expressive-code/core@0.41.7)(expressive-code@0.41.7)(typescript@5.9.3) + gray-matter: 4.0.3 + hastscript: 9.0.1 + magic-string: 0.30.21 + mdast-util-find-and-replace: 3.0.2 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-to-string: 4.0.0 + mdast-util-toc: 7.1.0 + parse-numeric-range: 1.3.0 + prettier: 4.0.0-alpha.13 + rehype-autolink-headings: 7.1.0 + rehype-expressive-code: 0.41.7 + rehype-raw: 7.0.0 + rehype-slug: 6.0.0 + remark: 15.0.1 + remark-directive: 3.0.1 + remark-frontmatter: 5.0.0 + remark-gfm: 4.0.1 + remark-mdx: 3.1.1 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + solid-js: 1.9.14 + source-map: 0.7.6 + toml: 3.0.0 + typescript: 5.9.3 + unified: 11.0.5 + unist-builder: 4.0.0 + unist-util-mdx-define: 1.1.2 + unist-util-visit: 5.1.0 + unplugin-auto-import: 19.3.0 + unplugin-icons: 22.5.0 + vite: 8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0) + yaml: 2.9.0 + transitivePeerDependencies: + - '@nuxt/kit' + - '@svgr/core' + - '@svgx/core' + - '@tauri-apps/plugin-store' + - '@vue/compiler-sfc' + - '@vueuse/core' + - solid-start + - supports-color + - svelte + - vue-template-compiler + - vue-template-es2015-compiler + + '@kobalte/utils@0.9.2(solid-js@1.9.14)': + dependencies: + '@solid-primitives/event-listener': 2.4.5(solid-js@1.9.14) + '@solid-primitives/keyed': 1.2.2(solid-js@1.9.14) + '@solid-primitives/map': 0.4.11(solid-js@1.9.14) + '@solid-primitives/media': 2.3.5(solid-js@1.9.14) + '@solid-primitives/props': 3.1.11(solid-js@1.9.14) + '@solid-primitives/refs': 1.0.8(solid-js@1.9.14) + '@solid-primitives/utils': 6.4.1(solid-js@1.9.14) + solid-js: 1.9.14 '@manypkg/find-root@1.1.0': dependencies: @@ -8767,78 +8135,42 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 - '@mapbox/node-pre-gyp@1.0.11': + '@mdx-js/mdx@3.1.1': dependencies: - detect-libc: 2.0.3 - https-proxy-agent: 5.0.1 - make-dir: 3.1.0 - node-fetch: 2.7.0 - nopt: 5.0.0 - npmlog: 5.0.1 - rimraf: 3.0.2 - semver: 7.6.2 - tar: 6.2.1 - transitivePeerDependencies: - - encoding - - supports-color - - '@mdx-js/mdx@3.0.0': - dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.9 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 '@types/mdx': 2.0.13 + acorn: 8.17.0 collapse-white-space: 2.1.0 devlop: 1.1.0 - estree-util-build-jsx: 3.0.1 estree-util-is-identifier-name: 3.0.0 - estree-util-to-js: 2.0.0 + estree-util-scope: 1.0.0 estree-walker: 3.0.3 - hast-util-to-estree: 3.1.0 hast-util-to-jsx-runtime: 2.3.0 markdown-extensions: 2.0.0 - periscopic: 3.1.0 - remark-mdx: 3.0.1 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.1(acorn@8.17.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.1 remark-parse: 11.0.0 remark-rehype: 11.1.0 - source-map: 0.7.4 - unified: 11.0.4 + source-map: 0.7.6 + unified: 11.0.5 unist-util-position-from-estree: 2.0.0 unist-util-stringify-position: 4.0.0 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 vfile: 6.0.1 transitivePeerDependencies: - supports-color - '@mdx-js/rollup@3.0.0(rollup@4.18.0)': - dependencies: - '@mdx-js/mdx': 3.0.0 - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) - rollup: 4.18.0 - source-map: 0.7.4 - vfile: 6.0.1 - transitivePeerDependencies: - - supports-color - - '@netlify/functions@2.7.0(@opentelemetry/api@1.8.0)': - dependencies: - '@netlify/serverless-functions-api': 1.18.1(@opentelemetry/api@1.8.0) - transitivePeerDependencies: - - '@opentelemetry/api' - - '@netlify/node-cookies@0.1.0': {} - - '@netlify/serverless-functions-api@1.18.1(@opentelemetry/api@1.8.0)': + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': dependencies: - '@netlify/node-cookies': 0.1.0 - '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) - '@opentelemetry/otlp-transformer': 0.50.0(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.24.1(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-trace-base': 1.24.1(@opentelemetry/api@1.8.0) - '@opentelemetry/semantic-conventions': 1.24.1 - urlpattern-polyfill: 8.0.2 - transitivePeerDependencies: - - '@opentelemetry/api' + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@tybys/wasm-util': 0.10.3 + optional: true '@nodelib/fs.scandir@2.1.5': dependencies: @@ -8852,255 +8184,103 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@opentelemetry/api-logs@0.50.0': - dependencies: - '@opentelemetry/api': 1.8.0 + '@oxc-project/types@0.137.0': {} - '@opentelemetry/api@1.8.0': {} - - '@opentelemetry/core@1.23.0(@opentelemetry/api@1.8.0)': - dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/semantic-conventions': 1.23.0 - - '@opentelemetry/core@1.24.1(@opentelemetry/api@1.8.0)': - dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/semantic-conventions': 1.24.1 - - '@opentelemetry/otlp-transformer@0.50.0(@opentelemetry/api@1.8.0)': - dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/api-logs': 0.50.0 - '@opentelemetry/core': 1.23.0(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.23.0(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-logs': 0.50.0(@opentelemetry/api-logs@0.50.0)(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-metrics': 1.23.0(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-trace-base': 1.23.0(@opentelemetry/api@1.8.0) - - '@opentelemetry/resources@1.23.0(@opentelemetry/api@1.8.0)': - dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.23.0(@opentelemetry/api@1.8.0) - '@opentelemetry/semantic-conventions': 1.23.0 - - '@opentelemetry/resources@1.24.1(@opentelemetry/api@1.8.0)': - dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) - '@opentelemetry/semantic-conventions': 1.24.1 - - '@opentelemetry/sdk-logs@0.50.0(@opentelemetry/api-logs@0.50.0)(@opentelemetry/api@1.8.0)': - dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/api-logs': 0.50.0 - '@opentelemetry/core': 1.23.0(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.23.0(@opentelemetry/api@1.8.0) - - '@opentelemetry/sdk-metrics@1.23.0(@opentelemetry/api@1.8.0)': - dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.23.0(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.23.0(@opentelemetry/api@1.8.0) - lodash.merge: 4.6.2 + '@pkgjs/parseargs@0.11.0': + optional: true - '@opentelemetry/sdk-trace-base@1.23.0(@opentelemetry/api@1.8.0)': - dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.23.0(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.23.0(@opentelemetry/api@1.8.0) - '@opentelemetry/semantic-conventions': 1.23.0 + '@polka/url@1.0.0-next.25': {} - '@opentelemetry/sdk-trace-base@1.24.1(@opentelemetry/api@1.8.0)': + '@prettier/cli@0.6.0(prettier@4.0.0-alpha.10)': dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.24.1(@opentelemetry/api@1.8.0) - '@opentelemetry/semantic-conventions': 1.24.1 - - '@opentelemetry/semantic-conventions@1.23.0': {} + '@iarna/toml': 2.2.5 + atomically: 2.0.3 + fast-ignore: 1.1.3 + find-up-json: 2.0.5 + function-once: 3.0.1 + import-meta-resolve: 4.2.0 + is-binary-path: 2.1.0 + js-yaml: 4.1.0 + json-sorted-stringify: 1.0.0 + json5: 2.2.3 + kasi: 1.1.0 + lomemo: 1.0.1 + pioppo: 1.1.1 + prettier: 4.0.0-alpha.10 + promise-resolve-timeout: 2.0.1 + specialist: 1.4.5 + tiny-editorconfig: 1.0.0 + tiny-jsonc: 1.0.1 + tiny-readdir-glob: 1.22.24 + tiny-spinner: 2.0.3 + worktank: 2.7.3 + zeptomatch: 2.0.0 + zeptomatch-escape: 1.0.0 + zeptomatch-is-static: 1.0.0 - '@opentelemetry/semantic-conventions@1.24.1': {} + '@reach/observe-rect@1.2.0': {} - '@parcel/watcher-android-arm64@2.4.1': + '@rolldown/binding-android-arm64@1.1.3': optional: true - '@parcel/watcher-darwin-arm64@2.4.1': + '@rolldown/binding-darwin-arm64@1.1.3': optional: true - '@parcel/watcher-darwin-x64@2.4.1': + '@rolldown/binding-darwin-x64@1.1.3': optional: true - '@parcel/watcher-freebsd-x64@2.4.1': + '@rolldown/binding-freebsd-x64@1.1.3': optional: true - '@parcel/watcher-linux-arm-glibc@2.4.1': + '@rolldown/binding-linux-arm-gnueabihf@1.1.3': optional: true - '@parcel/watcher-linux-arm64-glibc@2.4.1': + '@rolldown/binding-linux-arm64-gnu@1.1.3': optional: true - '@parcel/watcher-linux-arm64-musl@2.4.1': + '@rolldown/binding-linux-arm64-musl@1.1.3': optional: true - '@parcel/watcher-linux-x64-glibc@2.4.1': + '@rolldown/binding-linux-ppc64-gnu@1.1.3': optional: true - '@parcel/watcher-linux-x64-musl@2.4.1': + '@rolldown/binding-linux-s390x-gnu@1.1.3': optional: true - '@parcel/watcher-wasm@2.3.0': - dependencies: - is-glob: 4.0.3 - micromatch: 4.0.7 - - '@parcel/watcher-wasm@2.4.1': - dependencies: - is-glob: 4.0.3 - micromatch: 4.0.7 - - '@parcel/watcher-win32-arm64@2.4.1': + '@rolldown/binding-linux-x64-gnu@1.1.3': optional: true - '@parcel/watcher-win32-ia32@2.4.1': + '@rolldown/binding-linux-x64-musl@1.1.3': optional: true - '@parcel/watcher-win32-x64@2.4.1': + '@rolldown/binding-openharmony-arm64@1.1.3': optional: true - '@parcel/watcher@2.4.1': + '@rolldown/binding-wasm32-wasi@1.1.3': dependencies: - detect-libc: 1.0.3 - is-glob: 4.0.3 - micromatch: 4.0.7 - node-addon-api: 7.1.0 - optionalDependencies: - '@parcel/watcher-android-arm64': 2.4.1 - '@parcel/watcher-darwin-arm64': 2.4.1 - '@parcel/watcher-darwin-x64': 2.4.1 - '@parcel/watcher-freebsd-x64': 2.4.1 - '@parcel/watcher-linux-arm-glibc': 2.4.1 - '@parcel/watcher-linux-arm64-glibc': 2.4.1 - '@parcel/watcher-linux-arm64-musl': 2.4.1 - '@parcel/watcher-linux-x64-glibc': 2.4.1 - '@parcel/watcher-linux-x64-musl': 2.4.1 - '@parcel/watcher-win32-arm64': 2.4.1 - '@parcel/watcher-win32-ia32': 2.4.1 - '@parcel/watcher-win32-x64': 2.4.1 - - '@pkgjs/parseargs@0.11.0': + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) optional: true - '@polka/url@1.0.0-next.25': {} - - '@preact/preset-vite@2.8.2(@babel/core@7.24.6)(preact@10.22.0)(vite@5.1.4(@types/node@20.5.4)(terser@5.31.0))': - dependencies: - '@babel/core': 7.24.6 - '@babel/plugin-transform-react-jsx': 7.24.6(@babel/core@7.24.6) - '@babel/plugin-transform-react-jsx-development': 7.24.6(@babel/core@7.24.6) - '@prefresh/vite': 2.4.5(preact@10.22.0)(vite@5.1.4(@types/node@20.5.4)(terser@5.31.0)) - '@rollup/pluginutils': 4.2.1 - babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.24.6) - debug: 4.3.5 - kolorist: 1.8.0 - magic-string: 0.30.5 - node-html-parser: 6.1.13 - resolve: 1.22.8 - source-map: 0.7.4 - stack-trace: 1.0.0-pre2 - vite: 5.1.4(@types/node@20.5.4)(terser@5.31.0) - transitivePeerDependencies: - - preact - - supports-color - - '@prefresh/babel-plugin@0.5.1': {} - - '@prefresh/core@1.5.2(preact@10.22.0)': - dependencies: - preact: 10.22.0 - - '@prefresh/utils@1.2.0': {} - - '@prefresh/vite@2.4.5(preact@10.22.0)(vite@5.1.4(@types/node@20.5.4)(terser@5.31.0))': - dependencies: - '@babel/core': 7.22.10 - '@prefresh/babel-plugin': 0.5.1 - '@prefresh/core': 1.5.2(preact@10.22.0) - '@prefresh/utils': 1.2.0 - '@rollup/pluginutils': 4.2.1 - preact: 10.22.0 - vite: 5.1.4(@types/node@20.5.4)(terser@5.31.0) - transitivePeerDependencies: - - supports-color - - '@prettier/cli@0.6.0(prettier@4.0.0-alpha.10)': - dependencies: - '@iarna/toml': 2.2.5 - atomically: 2.0.3 - fast-ignore: 1.1.3 - find-up-json: 2.0.4 - function-once: 3.0.1 - import-meta-resolve: 4.1.0 - is-binary-path: 2.1.0 - js-yaml: 4.1.0 - json-sorted-stringify: 1.0.0 - json5: 2.2.3 - kasi: 1.1.0 - lomemo: 1.0.1 - pioppo: 1.1.1 - prettier: 4.0.0-alpha.10 - promise-resolve-timeout: 2.0.1 - specialist: 1.4.5 - tiny-editorconfig: 1.0.0 - tiny-jsonc: 1.0.1 - tiny-readdir-glob: 1.22.24 - tiny-spinner: 2.0.3 - worktank: 2.7.3 - zeptomatch: 2.0.0 - zeptomatch-escape: 1.0.0 - zeptomatch-is-static: 1.0.0 + '@rolldown/binding-win32-arm64-msvc@1.1.3': + optional: true - '@reach/observe-rect@1.2.0': {} + '@rolldown/binding-win32-x64-msvc@1.1.3': + optional: true - '@rollup/plugin-alias@5.1.0(rollup@4.18.0)': - dependencies: - slash: 4.0.0 - optionalDependencies: - rollup: 4.18.0 + '@rolldown/pluginutils@1.0.1': {} '@rollup/plugin-babel@6.0.4(@babel/core@7.22.10)(@types/babel__core@7.20.5)(rollup@3.28.1)': dependencies: '@babel/core': 7.22.10 - '@babel/helper-module-imports': 7.24.6 + '@babel/helper-module-imports': 7.29.7 '@rollup/pluginutils': 5.1.0(rollup@3.28.1) optionalDependencies: '@types/babel__core': 7.20.5 rollup: 3.28.1 - - '@rollup/plugin-commonjs@25.0.8(rollup@4.18.0)': - dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) - commondir: 1.0.1 - estree-walker: 2.0.2 - glob: 8.1.0 - is-reference: 1.2.1 - magic-string: 0.30.10 - optionalDependencies: - rollup: 4.18.0 - - '@rollup/plugin-inject@5.0.5(rollup@4.18.0)': - dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) - estree-walker: 2.0.2 - magic-string: 0.30.10 - optionalDependencies: - rollup: 4.18.0 - - '@rollup/plugin-json@6.1.0(rollup@4.18.0)': - dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) - optionalDependencies: - rollup: 4.18.0 + transitivePeerDependencies: + - supports-color '@rollup/plugin-node-resolve@15.2.3(rollup@3.28.1)': dependencies: @@ -9113,258 +8293,345 @@ snapshots: optionalDependencies: rollup: 3.28.1 - '@rollup/plugin-node-resolve@15.2.3(rollup@4.18.0)': - dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) - '@types/resolve': 1.20.2 - deepmerge: 4.3.1 - is-builtin-module: 3.2.1 - is-module: 1.0.0 - resolve: 1.22.8 - optionalDependencies: - rollup: 4.18.0 - - '@rollup/plugin-replace@5.0.5(rollup@4.18.0)': - dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) - magic-string: 0.30.10 - optionalDependencies: - rollup: 4.18.0 - '@rollup/plugin-terser@0.1.0(rollup@3.28.1)': dependencies: terser: 5.31.0 optionalDependencies: rollup: 3.28.1 - '@rollup/plugin-terser@0.4.4(rollup@4.18.0)': - dependencies: - serialize-javascript: 6.0.2 - smob: 1.5.0 - terser: 5.31.0 - optionalDependencies: - rollup: 4.18.0 - - '@rollup/pluginutils@4.2.1': - dependencies: - estree-walker: 2.0.2 - picomatch: 2.3.1 - '@rollup/pluginutils@5.1.0(rollup@3.28.1)': dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.9 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: rollup: 3.28.1 - '@rollup/pluginutils@5.1.0(rollup@4.18.0)': + '@rollup/rollup-android-arm-eabi@4.62.2': + optional: true + + '@rollup/rollup-android-arm64@4.62.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.62.2': + optional: true + + '@rollup/rollup-darwin-x64@4.62.2': + optional: true + + '@rollup/rollup-freebsd-arm64@4.62.2': + optional: true + + '@rollup/rollup-freebsd-x64@4.62.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.62.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.62.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.62.2': + optional: true + + '@rollup/rollup-openbsd-x64@4.62.2': + optional: true + + '@rollup/rollup-openharmony-arm64@4.62.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.62.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.62.2': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.62.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.62.2': + optional: true + + '@shikijs/core@1.29.2': dependencies: - '@types/estree': 1.0.5 - estree-walker: 2.0.2 - picomatch: 2.3.1 - optionalDependencies: - rollup: 4.18.0 + '@shikijs/engine-javascript': 1.29.2 + '@shikijs/engine-oniguruma': 1.29.2 + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/core@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@1.29.2': + dependencies: + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 2.3.0 - '@rollup/rollup-android-arm-eabi@4.18.0': - optional: true + '@shikijs/engine-javascript@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.6 - '@rollup/rollup-android-arm64@4.18.0': - optional: true + '@shikijs/engine-oniguruma@1.29.2': + dependencies: + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.2 - '@rollup/rollup-darwin-arm64@4.18.0': - optional: true + '@shikijs/engine-oniguruma@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 - '@rollup/rollup-darwin-x64@4.18.0': - optional: true + '@shikijs/langs@1.29.2': + dependencies: + '@shikijs/types': 1.29.2 - '@rollup/rollup-linux-arm-gnueabihf@4.18.0': - optional: true + '@shikijs/langs@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 - '@rollup/rollup-linux-arm-musleabihf@4.18.0': - optional: true + '@shikijs/themes@1.29.2': + dependencies: + '@shikijs/types': 1.29.2 - '@rollup/rollup-linux-arm64-gnu@4.18.0': - optional: true + '@shikijs/themes@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 - '@rollup/rollup-linux-arm64-musl@4.18.0': - optional: true + '@shikijs/types@1.29.2': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 - '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': - optional: true + '@shikijs/types@3.23.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 - '@rollup/rollup-linux-riscv64-gnu@4.18.0': - optional: true + '@shikijs/vscode-textmate@10.0.2': {} - '@rollup/rollup-linux-s390x-gnu@4.18.0': - optional: true + '@sinclair/typebox@0.27.8': {} - '@rollup/rollup-linux-x64-gnu@4.18.0': - optional: true + '@solid-primitives/clipboard@1.6.4(solid-js@1.9.14)': + dependencies: + '@solid-primitives/utils': 6.4.1(solid-js@1.9.14) + solid-js: 1.9.14 - '@rollup/rollup-linux-x64-musl@4.18.0': - optional: true + '@solid-primitives/context@0.2.3(solid-js@1.9.14)': + dependencies: + solid-js: 1.9.14 - '@rollup/rollup-win32-arm64-msvc@4.18.0': - optional: true + '@solid-primitives/event-listener@2.4.5(solid-js@1.9.14)': + dependencies: + '@solid-primitives/utils': 6.4.1(solid-js@1.9.14) + solid-js: 1.9.14 - '@rollup/rollup-win32-ia32-msvc@4.18.0': - optional: true + '@solid-primitives/keyboard@1.3.5(solid-js@1.9.14)': + dependencies: + '@solid-primitives/event-listener': 2.4.5(solid-js@1.9.14) + '@solid-primitives/rootless': 1.5.3(solid-js@1.9.14) + '@solid-primitives/utils': 6.4.1(solid-js@1.9.14) + solid-js: 1.9.14 - '@rollup/rollup-win32-x64-msvc@4.18.0': - optional: true + '@solid-primitives/keyed@1.2.2(solid-js@1.9.14)': + dependencies: + solid-js: 1.9.14 - '@sinclair/typebox@0.27.8': {} + '@solid-primitives/map@0.4.11(solid-js@1.9.14)': + dependencies: + '@solid-primitives/trigger': 1.0.11(solid-js@1.9.14) + solid-js: 1.9.14 - '@sindresorhus/merge-streams@2.3.0': {} + '@solid-primitives/media@2.3.5(solid-js@1.9.14)': + dependencies: + '@solid-primitives/event-listener': 2.4.5(solid-js@1.9.14) + '@solid-primitives/rootless': 1.5.3(solid-js@1.9.14) + '@solid-primitives/static-store': 0.1.3(solid-js@1.9.14) + '@solid-primitives/utils': 6.4.1(solid-js@1.9.14) + solid-js: 1.9.14 - '@solid-primitives/event-listener@2.3.3(solid-js@1.8.15)': + '@solid-primitives/platform@0.1.2(solid-js@1.9.14)': dependencies: - '@solid-primitives/utils': 6.2.3(solid-js@1.8.15) - solid-js: 1.8.15 + solid-js: 1.9.14 - '@solid-primitives/keyed@1.2.2(solid-js@1.8.15)': + '@solid-primitives/props@3.1.11(solid-js@1.9.14)': dependencies: - solid-js: 1.8.15 + '@solid-primitives/utils': 6.4.1(solid-js@1.9.14) + solid-js: 1.9.14 - '@solid-primitives/map@0.4.11(solid-js@1.8.15)': + '@solid-primitives/refs@1.0.8(solid-js@1.9.14)': dependencies: - '@solid-primitives/trigger': 1.0.11(solid-js@1.8.15) - solid-js: 1.8.15 + '@solid-primitives/utils': 6.4.1(solid-js@1.9.14) + solid-js: 1.9.14 - '@solid-primitives/media@2.2.9(solid-js@1.8.15)': + '@solid-primitives/resize-observer@2.0.26(solid-js@1.9.14)': dependencies: - '@solid-primitives/event-listener': 2.3.3(solid-js@1.8.15) - '@solid-primitives/rootless': 1.4.5(solid-js@1.8.15) - '@solid-primitives/static-store': 0.0.8(solid-js@1.8.15) - '@solid-primitives/utils': 6.2.3(solid-js@1.8.15) - solid-js: 1.8.15 + '@solid-primitives/event-listener': 2.4.5(solid-js@1.9.14) + '@solid-primitives/rootless': 1.5.3(solid-js@1.9.14) + '@solid-primitives/static-store': 0.0.8(solid-js@1.9.14) + '@solid-primitives/utils': 6.4.1(solid-js@1.9.14) + solid-js: 1.9.14 - '@solid-primitives/props@3.1.11(solid-js@1.8.15)': + '@solid-primitives/rootless@1.5.3(solid-js@1.9.14)': dependencies: - '@solid-primitives/utils': 6.2.3(solid-js@1.8.15) - solid-js: 1.8.15 + '@solid-primitives/utils': 6.4.1(solid-js@1.9.14) + solid-js: 1.9.14 - '@solid-primitives/refs@1.0.8(solid-js@1.8.15)': + '@solid-primitives/scroll@2.1.5(solid-js@1.9.14)': dependencies: - '@solid-primitives/utils': 6.2.3(solid-js@1.8.15) - solid-js: 1.8.15 + '@solid-primitives/event-listener': 2.4.5(solid-js@1.9.14) + '@solid-primitives/rootless': 1.5.3(solid-js@1.9.14) + '@solid-primitives/static-store': 0.1.3(solid-js@1.9.14) + solid-js: 1.9.14 - '@solid-primitives/resize-observer@2.0.26(solid-js@1.8.15)': + '@solid-primitives/static-store@0.0.8(solid-js@1.9.14)': dependencies: - '@solid-primitives/event-listener': 2.3.3(solid-js@1.8.15) - '@solid-primitives/rootless': 1.4.5(solid-js@1.8.15) - '@solid-primitives/static-store': 0.0.8(solid-js@1.8.15) - '@solid-primitives/utils': 6.2.3(solid-js@1.8.15) - solid-js: 1.8.15 + '@solid-primitives/utils': 6.4.1(solid-js@1.9.14) + solid-js: 1.9.14 - '@solid-primitives/rootless@1.4.5(solid-js@1.8.15)': + '@solid-primitives/static-store@0.1.3(solid-js@1.9.14)': dependencies: - '@solid-primitives/utils': 6.2.3(solid-js@1.8.15) - solid-js: 1.8.15 + '@solid-primitives/utils': 6.4.1(solid-js@1.9.14) + solid-js: 1.9.14 - '@solid-primitives/static-store@0.0.8(solid-js@1.8.15)': + '@solid-primitives/storage@4.3.5(solid-js@1.9.14)': dependencies: - '@solid-primitives/utils': 6.2.3(solid-js@1.8.15) - solid-js: 1.8.15 + '@solid-primitives/utils': 6.4.1(solid-js@1.9.14) + solid-js: 1.9.14 - '@solid-primitives/trigger@1.0.11(solid-js@1.8.15)': + '@solid-primitives/trigger@1.0.11(solid-js@1.9.14)': dependencies: - '@solid-primitives/utils': 6.2.3(solid-js@1.8.15) - solid-js: 1.8.15 + '@solid-primitives/utils': 6.4.1(solid-js@1.9.14) + solid-js: 1.9.14 - '@solid-primitives/utils@6.2.3(solid-js@1.8.15)': + '@solid-primitives/utils@6.4.1(solid-js@1.9.14)': dependencies: - solid-js: 1.8.15 + solid-js: 1.9.14 - '@solidjs/meta@0.29.3(solid-js@1.8.15)': + '@solidjs/meta@0.29.4(solid-js@1.9.14)': dependencies: - solid-js: 1.8.15 + solid-js: 1.9.14 - '@solidjs/router@0.12.4(solid-js@1.8.15)': + '@solidjs/router@0.15.3(solid-js@1.9.14)': dependencies: - solid-js: 1.8.15 + solid-js: 1.9.14 - '@solidjs/router@0.8.4(solid-js@1.8.15)': + '@solidjs/router@0.16.2(solid-js@1.9.14)': dependencies: - solid-js: 1.8.15 + solid-js: 1.9.14 - '@solidjs/start@0.6.1(@testing-library/jest-dom@6.4.2(vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0)))(rollup@4.18.0)(solid-js@1.8.15)(vinxi@0.3.9(@opentelemetry/api@1.8.0)(@testing-library/jest-dom@6.4.2(vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0)))(@types/node@20.5.4)(ioredis@5.4.1)(preact@10.22.0)(rollup@4.18.0)(terser@5.31.0))(vite@5.1.4(@types/node@20.5.4)(terser@5.31.0))': + '@solidjs/start@2.0.0-beta.0(@testing-library/jest-dom@6.9.1)(crossws@0.4.7(srvx@0.11.18))(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0))': dependencies: - '@vinxi/plugin-directives': 0.3.1(vinxi@0.3.9(@opentelemetry/api@1.8.0)(@testing-library/jest-dom@6.4.2(vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0)))(@types/node@20.5.4)(ioredis@5.4.1)(preact@10.22.0)(rollup@4.18.0)(terser@5.31.0)) - '@vinxi/server-components': 0.3.3(vinxi@0.3.9(@opentelemetry/api@1.8.0)(@testing-library/jest-dom@6.4.2(vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0)))(@types/node@20.5.4)(ioredis@5.4.1)(preact@10.22.0)(rollup@4.18.0)(terser@5.31.0)) - '@vinxi/server-functions': 0.3.2(vinxi@0.3.9(@opentelemetry/api@1.8.0)(@testing-library/jest-dom@6.4.2(vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0)))(@types/node@20.5.4)(ioredis@5.4.1)(preact@10.22.0)(rollup@4.18.0)(terser@5.31.0)) + '@babel/core': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + '@solidjs/meta': 0.29.4(solid-js@1.9.14) + '@types/babel__traverse': 7.28.0 + '@types/micromatch': 4.0.10 + cookie-es: 2.0.1 defu: 6.1.4 error-stack-parser: 2.1.4 - html-to-image: 1.11.11 + es-module-lexer: 2.2.0 + esbuild: 0.27.7 + fast-glob: 3.3.3 + h3: 2.0.1-rc.16(crossws@0.4.7(srvx@0.11.18)) + html-to-image: 1.11.13 + micromatch: 4.0.8 + path-to-regexp: 8.4.2 + pathe: 2.0.3 radix3: 1.1.2 - seroval: 1.0.7 - seroval-plugins: 1.0.7(seroval@1.0.7) - shikiji: 0.9.19 - source-map-js: 1.2.0 - terracotta: 1.0.5(solid-js@1.8.15) - vite-plugin-inspect: 0.7.42(rollup@4.18.0)(vite@5.1.4(@types/node@20.5.4)(terser@5.31.0)) - vite-plugin-solid: 2.9.1(@testing-library/jest-dom@6.4.2(vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0)))(solid-js@1.8.15)(vite@5.1.4(@types/node@20.5.4)(terser@5.31.0)) + seroval: 1.5.4 + seroval-plugins: 1.5.4(seroval@1.5.4) + shiki: 1.29.2 + solid-js: 1.9.14 + source-map-js: 1.2.1 + srvx: 0.11.18 + terracotta: 1.1.0(solid-js@1.9.14) + vite: 8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0) + vite-plugin-solid: 2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.14)(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0)) transitivePeerDependencies: - - '@nuxt/kit' - '@testing-library/jest-dom' - - rollup - - solid-js + - crossws - supports-color - - vinxi - - vite - '@solidjs/testing-library@0.8.6(@solidjs/router@0.12.4(solid-js@1.8.15))(solid-js@1.8.15)': + '@solidjs/testing-library@0.8.10(@solidjs/router@0.16.2(solid-js@1.9.14))(solid-js@1.9.14)': dependencies: - '@solidjs/router': 0.12.4(solid-js@1.8.15) - '@testing-library/dom': 9.3.4 - solid-js: 1.8.15 + '@testing-library/dom': 10.4.1 + solid-js: 1.9.14 + optionalDependencies: + '@solidjs/router': 0.16.2(solid-js@1.9.14) + + '@standard-schema/spec@1.1.0': {} '@swc/helpers@0.5.11': dependencies: tslib: 2.6.2 - '@tailwindcss/typography@0.5.9(tailwindcss@3.3.3(ts-node@10.9.2(@types/node@20.5.4)(typescript@4.9.5)))': - dependencies: - lodash.castarray: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.merge: 4.6.2 - postcss-selector-parser: 6.0.10 - tailwindcss: 3.3.3(ts-node@10.9.2(@types/node@20.5.4)(typescript@4.9.5)) - '@tanstack/solid-virtual@3.0.0-beta.6': dependencies: '@reach/observe-rect': 1.2.0 - '@testing-library/dom@9.3.4': + '@testing-library/dom@10.4.1': dependencies: - '@babel/code-frame': 7.24.6 + '@babel/code-frame': 7.29.7 '@babel/runtime': 7.24.6 '@types/aria-query': 5.0.4 - aria-query: 5.1.3 - chalk: 4.1.2 + aria-query: 5.3.0 dom-accessibility-api: 0.5.16 lz-string: 1.5.0 + picocolors: 1.1.1 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.4.2(vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0))': + '@testing-library/jest-dom@6.9.1': dependencies: - '@adobe/css-tools': 4.3.3 - '@babel/runtime': 7.24.6 + '@adobe/css-tools': 4.5.0 aria-query: 5.3.0 - chalk: 3.0.0 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 - lodash: 4.17.21 + picocolors: 1.1.1 redent: 3.0.0 - optionalDependencies: - vitest: 1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0) - '@testing-library/user-event@14.5.2(@testing-library/dom@9.3.4)': + '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': dependencies: - '@testing-library/dom': 9.3.4 - - '@tootallnate/once@2.0.0': {} + '@testing-library/dom': 10.4.1 '@tsconfig/node10@1.0.11': {} @@ -9374,35 +8641,45 @@ snapshots: '@tsconfig/node16@1.0.4': {} + '@tybys/wasm-util@0.10.3': + dependencies: + tslib: 2.6.2 + optional: true + '@types/acorn@4.0.6': dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.9 '@types/aria-query@5.0.4': {} '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.24.6 - '@babel/types': 7.24.6 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.6 + '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.29.7 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.24.6 - '@babel/types': 7.24.6 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 - '@types/babel__traverse@7.20.6': + '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.29.7 '@types/braces@3.0.4': {} + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + '@types/conventional-commits-parser@5.0.0': dependencies: '@types/node': 20.5.4 @@ -9412,11 +8689,13 @@ snapshots: dependencies: '@types/ms': 0.7.34 + '@types/deep-eql@4.0.2': {} + '@types/estree-jsx@1.0.5': dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.9 - '@types/estree@1.0.5': {} + '@types/estree@1.0.9': {} '@types/fs-extra@8.1.5': dependencies: @@ -9431,12 +8710,6 @@ snapshots: dependencies: '@types/unist': 3.0.2 - '@types/http-errors@2.0.4': {} - - '@types/http-proxy@1.17.14': - dependencies: - '@types/node': 20.5.4 - '@types/is-ci@3.0.4': dependencies: ci-info: 3.9.0 @@ -9447,12 +8720,10 @@ snapshots: '@types/mdx@2.0.13': {} - '@types/micromatch@4.0.7': + '@types/micromatch@4.0.10': dependencies: '@types/braces': 3.0.4 - '@types/mime@1.3.5': {} - '@types/minimatch@5.1.2': {} '@types/minimist@1.2.5': {} @@ -9471,42 +8742,16 @@ snapshots: '@types/semver@7.5.8': {} - '@types/send@0.17.4': - dependencies: - '@types/mime': 1.3.5 - '@types/node': 20.5.4 - - '@types/serve-static@1.15.7': - dependencies: - '@types/http-errors': 2.0.4 - '@types/node': 20.5.4 - '@types/send': 0.17.4 + '@types/ungap__structured-clone@1.2.0': {} '@types/unist@2.0.10': {} '@types/unist@3.0.2': {} - '@types/ws@8.5.10': - dependencies: - '@types/node': 20.5.4 - - '@typescript/twoslash@3.1.0': - dependencies: - '@typescript/vfs': 1.3.5 - debug: 4.3.5 - lz-string: 1.5.0 - transitivePeerDependencies: - - supports-color - - '@typescript/vfs@1.3.4': - dependencies: - debug: 4.3.5 - transitivePeerDependencies: - - supports-color - - '@typescript/vfs@1.3.5': + '@typescript/vfs@1.6.4(typescript@5.9.3)': dependencies: - debug: 4.3.5 + debug: 4.4.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -9528,115 +8773,32 @@ snapshots: '@vanilla-extract/private@1.0.5': {} - '@vercel/nft@0.26.5': - dependencies: - '@mapbox/node-pre-gyp': 1.0.11 - '@rollup/pluginutils': 4.2.1 - acorn: 8.10.0 - acorn-import-attributes: 1.9.5(acorn@8.10.0) - async-sema: 3.1.1 - bindings: 1.5.0 - estree-walker: 2.0.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - micromatch: 4.0.7 - node-gyp-build: 4.8.1 - resolve-from: 5.0.0 - transitivePeerDependencies: - - encoding - - supports-color - - '@vinxi/devtools@0.2.0(@babel/core@7.24.6)(@testing-library/jest-dom@6.4.2(vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0)))(preact@10.22.0)(rollup@4.18.0)(vite@5.1.4(@types/node@20.5.4)(terser@5.31.0))': - dependencies: - '@preact/preset-vite': 2.8.2(@babel/core@7.24.6)(preact@10.22.0)(vite@5.1.4(@types/node@20.5.4)(terser@5.31.0)) - '@solidjs/router': 0.8.4(solid-js@1.8.15) - birpc: 0.2.17 - solid-js: 1.8.15 - vite-plugin-inspect: 0.7.42(rollup@4.18.0)(vite@5.1.4(@types/node@20.5.4)(terser@5.31.0)) - vite-plugin-solid: 2.9.1(@testing-library/jest-dom@6.4.2(vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0)))(solid-js@1.8.15)(vite@5.1.4(@types/node@20.5.4)(terser@5.31.0)) - ws: 8.17.0 - transitivePeerDependencies: - - '@babel/core' - - '@nuxt/kit' - - '@testing-library/jest-dom' - - bufferutil - - preact - - rollup - - supports-color - - utf-8-validate - - vite - - '@vinxi/listhen@1.5.6': - dependencies: - '@parcel/watcher': 2.4.1 - '@parcel/watcher-wasm': 2.3.0 - citty: 0.1.6 - clipboardy: 4.0.0 - consola: 3.2.3 - defu: 6.1.4 - get-port-please: 3.1.2 - h3: 1.11.1 - http-shutdown: 1.2.2 - jiti: 1.21.0 - mlly: 1.7.0 - node-forge: 1.3.1 - pathe: 1.1.2 - std-env: 3.7.0 - ufo: 1.5.3 - untun: 0.1.3 - uqr: 0.1.2 - transitivePeerDependencies: - - uWebSockets.js - - '@vinxi/plugin-directives@0.3.1(vinxi@0.3.9(@opentelemetry/api@1.8.0)(@testing-library/jest-dom@6.4.2(vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0)))(@types/node@20.5.4)(ioredis@5.4.1)(preact@10.22.0)(rollup@4.18.0)(terser@5.31.0))': - dependencies: - '@babel/parser': 7.24.6 - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) - acorn-loose: 8.4.0 - acorn-typescript: 1.4.13(acorn@8.10.0) - astring: 1.8.6 - magicast: 0.2.11 - recast: 0.23.9 - tslib: 2.6.2 - vinxi: 0.3.9(@opentelemetry/api@1.8.0)(@testing-library/jest-dom@6.4.2(vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0)))(@types/node@20.5.4)(ioredis@5.4.1)(preact@10.22.0)(rollup@4.18.0)(terser@5.31.0) - - '@vinxi/plugin-mdx@3.7.1(@mdx-js/mdx@3.0.0)': + '@vitest/expect@1.3.1': dependencies: - '@alloc/quick-lru': 5.2.0 - '@mdx-js/mdx': 3.0.0 - esbuild: 0.18.7 - resolve: 1.22.8 - unified: 9.2.2 - vfile: 5.3.7 + '@vitest/spy': 1.3.1 + '@vitest/utils': 1.3.1 + chai: 4.4.1 - '@vinxi/server-components@0.3.3(vinxi@0.3.9(@opentelemetry/api@1.8.0)(@testing-library/jest-dom@6.4.2(vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0)))(@types/node@20.5.4)(ioredis@5.4.1)(preact@10.22.0)(rollup@4.18.0)(terser@5.31.0))': + '@vitest/expect@4.1.10': dependencies: - '@vinxi/plugin-directives': 0.3.1(vinxi@0.3.9(@opentelemetry/api@1.8.0)(@testing-library/jest-dom@6.4.2(vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0)))(@types/node@20.5.4)(ioredis@5.4.1)(preact@10.22.0)(rollup@4.18.0)(terser@5.31.0)) - acorn: 8.10.0 - acorn-loose: 8.4.0 - acorn-typescript: 1.4.13(acorn@8.10.0) - astring: 1.8.6 - magicast: 0.2.11 - recast: 0.23.9 - vinxi: 0.3.9(@opentelemetry/api@1.8.0)(@testing-library/jest-dom@6.4.2(vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0)))(@types/node@20.5.4)(ioredis@5.4.1)(preact@10.22.0)(rollup@4.18.0)(terser@5.31.0) + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.1.10 + '@vitest/utils': 4.1.10 + chai: 6.2.2 + tinyrainbow: 3.1.0 - '@vinxi/server-functions@0.3.2(vinxi@0.3.9(@opentelemetry/api@1.8.0)(@testing-library/jest-dom@6.4.2(vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0)))(@types/node@20.5.4)(ioredis@5.4.1)(preact@10.22.0)(rollup@4.18.0)(terser@5.31.0))': + '@vitest/mocker@4.1.10(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0))': dependencies: - '@vinxi/plugin-directives': 0.3.1(vinxi@0.3.9(@opentelemetry/api@1.8.0)(@testing-library/jest-dom@6.4.2(vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0)))(@types/node@20.5.4)(ioredis@5.4.1)(preact@10.22.0)(rollup@4.18.0)(terser@5.31.0)) - acorn: 8.10.0 - acorn-loose: 8.4.0 - acorn-typescript: 1.4.13(acorn@8.10.0) - astring: 1.8.6 - magicast: 0.2.11 - recast: 0.23.9 - vinxi: 0.3.9(@opentelemetry/api@1.8.0)(@testing-library/jest-dom@6.4.2(vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0)))(@types/node@20.5.4)(ioredis@5.4.1)(preact@10.22.0)(rollup@4.18.0)(terser@5.31.0) + '@vitest/spy': 4.1.10 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0) - '@vitest/expect@1.3.1': + '@vitest/pretty-format@4.1.10': dependencies: - '@vitest/spy': 1.3.1 - '@vitest/utils': 1.3.1 - chai: 4.4.1 + tinyrainbow: 3.1.0 '@vitest/runner@1.3.1': dependencies: @@ -9644,26 +8806,40 @@ snapshots: p-limit: 5.0.0 pathe: 1.1.2 + '@vitest/runner@4.1.10': + dependencies: + '@vitest/utils': 4.1.10 + pathe: 2.0.3 + '@vitest/snapshot@1.3.1': dependencies: - magic-string: 0.30.10 + magic-string: 0.30.21 pathe: 1.1.2 pretty-format: 29.7.0 + '@vitest/snapshot@4.1.10': + dependencies: + '@vitest/pretty-format': 4.1.10 + '@vitest/utils': 4.1.10 + magic-string: 0.30.21 + pathe: 2.0.3 + '@vitest/spy@1.3.1': dependencies: tinyspy: 2.2.1 - '@vitest/ui@1.6.0(vitest@1.3.1)': + '@vitest/spy@4.1.10': {} + + '@vitest/ui@4.1.10(vitest@4.1.10)': dependencies: - '@vitest/utils': 1.6.0 - fast-glob: 3.3.2 + '@vitest/utils': 4.1.10 fflate: 0.8.2 - flatted: 3.3.1 - pathe: 1.1.2 - picocolors: 1.0.1 - sirv: 2.0.4 - vitest: 1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0) + flatted: 3.4.2 + pathe: 2.0.3 + sirv: 3.0.2 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.0 + vitest: 4.1.10(@types/node@20.5.4)(@vitest/ui@4.1.10)(jsdom@29.1.1)(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0)) '@vitest/utils@1.3.1': dependencies: @@ -9672,62 +8848,24 @@ snapshots: loupe: 2.3.7 pretty-format: 29.7.0 - '@vitest/utils@1.6.0': + '@vitest/utils@4.1.10': dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 + '@vitest/pretty-format': 4.1.10 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 through: 2.3.8 - abab@2.0.6: {} - - abbrev@1.1.1: {} - - abort-controller@3.0.0: - dependencies: - event-target-shim: 5.0.1 - - acorn-globals@6.0.0: - dependencies: - acorn: 7.4.1 - acorn-walk: 7.2.0 - - acorn-import-attributes@1.9.5(acorn@8.10.0): - dependencies: - acorn: 8.10.0 - - acorn-jsx@5.3.2(acorn@8.10.0): - dependencies: - acorn: 8.10.0 - - acorn-loose@8.4.0: - dependencies: - acorn: 8.11.3 - - acorn-typescript@1.4.13(acorn@8.10.0): + acorn-jsx@5.3.2(acorn@8.17.0): dependencies: - acorn: 8.10.0 - - acorn-walk@7.2.0: {} + acorn: 8.17.0 acorn-walk@8.3.2: {} - acorn@7.4.1: {} - - acorn@8.10.0: {} - - acorn@8.11.3: {} - - agent-base@6.0.2: - dependencies: - debug: 4.3.5 - transitivePeerDependencies: - - supports-color + acorn@8.17.0: {} ahocorasick@1.0.2: {} @@ -9738,28 +8876,6 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 - algoliasearch@4.23.3: - dependencies: - '@algolia/cache-browser-local-storage': 4.23.3 - '@algolia/cache-common': 4.23.3 - '@algolia/cache-in-memory': 4.23.3 - '@algolia/client-account': 4.23.3 - '@algolia/client-analytics': 4.23.3 - '@algolia/client-common': 4.23.3 - '@algolia/client-personalization': 4.23.3 - '@algolia/client-search': 4.23.3 - '@algolia/logger-common': 4.23.3 - '@algolia/logger-console': 4.23.3 - '@algolia/recommend': 4.23.3 - '@algolia/requester-browser-xhr': 4.23.3 - '@algolia/requester-common': 4.23.3 - '@algolia/requester-node-http': 4.23.3 - '@algolia/transporter': 4.23.3 - - ansi-align@3.0.1: - dependencies: - string-width: 4.2.3 - ansi-colors@4.1.3: {} ansi-escapes@4.3.2: @@ -9772,8 +8888,6 @@ snapshots: ansi-regex@6.0.1: {} - ansi-sequence-parser@1.1.1: {} - ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 @@ -9788,7 +8902,7 @@ snapshots: ansi-truncate@1.1.2: dependencies: - fast-string-truncated-width: 1.1.0 + fast-string-truncated-width: 1.2.1 any-promise@1.3.0: {} @@ -9797,33 +8911,6 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 - aproba@2.0.0: {} - - archiver-utils@5.0.2: - dependencies: - glob: 10.4.1 - graceful-fs: 4.2.11 - is-stream: 2.0.1 - lazystream: 1.0.1 - lodash: 4.17.21 - normalize-path: 3.0.0 - readable-stream: 4.5.2 - - archiver@7.0.1: - dependencies: - archiver-utils: 5.0.2 - async: 3.2.5 - buffer-crc32: 1.0.0 - readable-stream: 4.5.2 - readdir-glob: 1.1.3 - tar-stream: 3.1.7 - zip-stream: 6.0.1 - - are-we-there-yet@2.0.0: - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - arg@4.1.3: {} arg@5.0.2: {} @@ -9834,10 +8921,6 @@ snapshots: argparse@2.0.1: {} - aria-query@5.1.3: - dependencies: - deep-equal: 2.2.3 - aria-query@5.3.0: dependencies: dequal: 2.0.3 @@ -9875,62 +8958,42 @@ snapshots: assertion-error@1.1.0: {} - ast-types@0.16.1: - dependencies: - tslib: 2.6.2 + assertion-error@2.0.1: {} astring@1.8.6: {} - async-sema@3.1.1: {} - - async@3.2.5: {} - - asynckit@0.4.0: {} - at-least-node@1.0.0: {} atomically@2.0.3: dependencies: stubborn-fs: 1.2.5 - when-exit: 2.1.2 - - autoprefixer@10.4.15(postcss@8.4.28): - dependencies: - browserslist: 4.23.0 - caniuse-lite: 1.0.30001625 - fraction.js: 4.3.7 - normalize-range: 0.1.2 - picocolors: 1.0.1 - postcss: 8.4.28 - postcss-value-parser: 4.2.0 + when-exit: 2.1.4 available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 - b4a@1.6.6: {} - babel-plugin-jsx-dom-expressions@0.36.18(@babel/core@7.22.10): dependencies: '@babel/core': 7.22.10 '@babel/helper-module-imports': 7.18.6 '@babel/plugin-syntax-jsx': 7.24.6(@babel/core@7.22.10) - '@babel/types': 7.24.6 + '@babel/types': 7.29.7 html-entities: 2.3.3 validate-html-nesting: 1.2.2 - babel-plugin-jsx-dom-expressions@0.37.21(@babel/core@7.24.6): + babel-plugin-jsx-dom-expressions@0.37.21(@babel/core@7.29.7): dependencies: - '@babel/core': 7.24.6 + '@babel/core': 7.29.7 '@babel/helper-module-imports': 7.18.6 - '@babel/plugin-syntax-jsx': 7.24.6(@babel/core@7.24.6) - '@babel/types': 7.24.6 + '@babel/plugin-syntax-jsx': 7.24.6(@babel/core@7.29.7) + '@babel/types': 7.29.7 html-entities: 2.3.3 validate-html-nesting: 1.2.2 babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.22.10): dependencies: - '@babel/compat-data': 7.24.6 + '@babel/compat-data': 7.29.7 '@babel/core': 7.22.10 '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.22.10) semver: 6.3.1 @@ -9952,44 +9015,35 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-transform-hook-names@1.0.2(@babel/core@7.24.6): - dependencies: - '@babel/core': 7.24.6 - babel-preset-solid@1.7.7(@babel/core@7.22.10): dependencies: '@babel/core': 7.22.10 babel-plugin-jsx-dom-expressions: 0.36.18(@babel/core@7.22.10) - babel-preset-solid@1.8.17(@babel/core@7.24.6): + babel-preset-solid@1.8.17(@babel/core@7.29.7): dependencies: - '@babel/core': 7.24.6 - babel-plugin-jsx-dom-expressions: 0.37.21(@babel/core@7.24.6) - - bail@1.0.5: {} + '@babel/core': 7.29.7 + babel-plugin-jsx-dom-expressions: 0.37.21(@babel/core@7.29.7) bail@2.0.2: {} balanced-match@1.0.2: {} - bare-events@2.3.1: - optional: true - base64-js@1.5.1: {} + baseline-browser-mapping@2.10.40: {} + + bcp-47-match@2.0.3: {} + better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 - big-integer@1.6.52: {} - - binary-extensions@2.3.0: {} - - bindings@1.5.0: + bidi-js@1.0.3: dependencies: - file-uri-to-path: 1.0.0 + require-from-string: 2.0.2 - birpc@0.2.17: {} + binary-extensions@2.3.0: {} bl@4.1.0: dependencies: @@ -9999,21 +9053,6 @@ snapshots: boolbase@1.0.0: {} - boxen@7.1.1: - dependencies: - ansi-align: 3.0.1 - camelcase: 7.0.1 - chalk: 5.3.0 - cli-boxes: 3.0.0 - string-width: 5.1.2 - type-fest: 2.19.0 - widest-line: 4.0.1 - wrap-ansi: 8.1.0 - - bplist-parser@0.2.0: - dependencies: - big-integer: 1.6.52 - brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -10031,16 +9070,13 @@ snapshots: dependencies: wcwidth: 1.0.1 - browser-process-hrtime@1.0.0: {} - - browserslist@4.23.0: + browserslist@4.28.4: dependencies: - caniuse-lite: 1.0.30001625 - electron-to-chromium: 1.4.788 - node-releases: 2.0.14 - update-browserslist-db: 1.0.16(browserslist@4.23.0) - - buffer-crc32@1.0.0: {} + baseline-browser-mapping: 2.10.40 + caniuse-lite: 1.0.30001800 + electron-to-chromium: 1.5.383 + node-releases: 2.0.50 + update-browserslist-db: 1.2.3(browserslist@4.28.4) buffer-from@1.1.2: {} @@ -10049,40 +9085,17 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - builtin-modules@3.3.0: {} - bundle-name@3.0.0: - dependencies: - run-applescript: 5.0.0 - bundle-require@4.2.1(esbuild@0.18.20): dependencies: esbuild: 0.18.20 load-tsconfig: 0.2.5 - busboy@1.6.0: - dependencies: - streamsearch: 1.1.0 - - c12@1.10.0: + bundle-require@5.1.0(esbuild@0.27.7): dependencies: - chokidar: 3.6.0 - confbox: 0.1.7 - defu: 6.1.4 - dotenv: 16.4.5 - giget: 1.2.3 - jiti: 1.21.0 - mlly: 1.7.0 - ohash: 1.1.3 - pathe: 1.1.2 - perfect-debounce: 1.0.0 - pkg-types: 1.1.1 - rc9: 2.1.2 + esbuild: 0.27.7 + load-tsconfig: 0.2.5 cac@6.7.14: {} @@ -10108,9 +9121,7 @@ snapshots: camelcase@5.3.1: {} - camelcase@7.0.1: {} - - caniuse-lite@1.0.30001625: {} + caniuse-lite@1.0.30001800: {} ccount@2.0.1: {} @@ -10124,23 +9135,21 @@ snapshots: pathval: 1.1.1 type-detect: 4.0.8 + chai@6.2.2: {} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - chalk@3.0.0: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.3.0: {} + chalk@5.3.0: + optional: true character-entities-html4@2.1.0: {} @@ -10168,15 +9177,16 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chownr@2.0.0: {} - - ci-info@3.9.0: {} + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 - citty@0.1.6: + chokidar@5.0.0: dependencies: - consola: 3.2.3 + readdirp: 5.0.0 + optional: true - cli-boxes@3.0.0: {} + ci-info@3.9.0: {} cli-cursor@3.1.0: dependencies: @@ -10186,12 +9196,6 @@ snapshots: cli-width@3.0.0: {} - clipboardy@4.0.0: - dependencies: - execa: 8.0.1 - is-wsl: 3.1.0 - is64bit: 2.0.0 - cliui@6.0.0: dependencies: string-width: 4.2.3 @@ -10206,9 +9210,8 @@ snapshots: clone@1.0.4: {} - clsx@2.0.0: {} - - cluster-key-slot@1.1.2: {} + cluster-key-slot@1.1.1: + optional: true collapse-white-space@2.1.0: {} @@ -10224,16 +9227,10 @@ snapshots: color-name@1.1.4: {} - color-support@1.1.3: {} - colorette@1.4.0: {} colorette@2.0.20: {} - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - comma-separated-tokens@2.0.3: {} commander@2.20.3: {} @@ -10242,10 +9239,10 @@ snapshots: commenting@1.1.0: {} - commitizen@4.3.0(@types/node@20.5.4)(typescript@4.9.5): + commitizen@4.3.0(@types/node@20.5.4)(typescript@6.0.3): dependencies: cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0(@types/node@20.5.4)(typescript@4.9.5) + cz-conventional-changelog: 3.3.0(@types/node@20.5.4)(typescript@6.0.3) dedent: 0.7.0 detect-indent: 6.1.0 find-node-modules: 2.1.3 @@ -10262,28 +9259,18 @@ snapshots: - '@types/node' - typescript - commondir@1.0.1: {} - compare-func@2.0.0: dependencies: array-ify: 1.0.0 dot-prop: 5.3.0 - compress-commons@6.0.2: - dependencies: - crc-32: 1.2.2 - crc32-stream: 6.0.0 - is-stream: 2.0.1 - normalize-path: 3.0.0 - readable-stream: 4.5.2 - concat-map@0.0.1: {} - confbox@0.1.7: {} + confbox@0.1.8: {} - consola@3.2.3: {} + confbox@0.2.4: {} - console-control-strings@1.1.0: {} + consola@3.4.2: {} conventional-changelog-angular@6.0.0: dependencies: @@ -10306,80 +9293,70 @@ snapshots: convert-source-map@2.0.0: {} - cookie-es@1.1.0: {} + cookie-es@2.0.1: {} core-js-compat@3.37.1: dependencies: - browserslist: 4.23.0 + browserslist: 4.28.4 - core-util-is@1.0.3: {} - - cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@4.9.5))(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5))(typescript@4.9.5): + cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.9.3))(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.9.3))(typescript@5.9.3): dependencies: '@types/node': 20.5.1 - cosmiconfig: 8.3.6(typescript@4.9.5) - ts-node: 10.9.2(@types/node@20.5.1)(typescript@4.9.5) - typescript: 4.9.5 + cosmiconfig: 8.3.6(typescript@5.9.3) + ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.9.3) + typescript: 5.9.3 - cosmiconfig-typescript-loader@5.0.0(@types/node@20.5.4)(cosmiconfig@9.0.0(typescript@4.9.5))(typescript@4.9.5): + cosmiconfig-typescript-loader@5.0.0(@types/node@20.5.4)(cosmiconfig@9.0.0(typescript@6.0.3))(typescript@6.0.3): dependencies: '@types/node': 20.5.4 - cosmiconfig: 9.0.0(typescript@4.9.5) + cosmiconfig: 9.0.0(typescript@6.0.3) jiti: 1.21.0 - typescript: 4.9.5 + typescript: 6.0.3 optional: true - cosmiconfig@8.3.6(typescript@4.9.5): + cosmiconfig@8.3.6(typescript@5.9.3): dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 4.9.5 + typescript: 5.9.3 - cosmiconfig@9.0.0(typescript@4.9.5): + cosmiconfig@9.0.0(typescript@6.0.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 4.9.5 + typescript: 6.0.3 optional: true - crc-32@1.2.2: {} - - crc32-stream@6.0.0: - dependencies: - crc-32: 1.2.2 - readable-stream: 4.5.2 - create-require@1.1.1: {} - croner@8.0.2: {} - cross-spawn@5.1.0: dependencies: lru-cache: 4.1.5 shebang-command: 1.2.0 which: 1.3.1 - cross-spawn@7.0.3: + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - crossws@0.2.4: {} + crossws@0.4.7(srvx@0.11.18): + optionalDependencies: + srvx: 0.11.18 + + css-selector-parser@3.3.0: {} - css-select@5.1.0: + css-tree@3.2.1: dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 5.0.3 - domutils: 3.1.0 - nth-check: 2.1.1 + mdn-data: 2.27.1 + source-map-js: 1.2.1 css-what@6.1.0: {} @@ -10387,14 +9364,6 @@ snapshots: cssesc@3.0.0: {} - cssom@0.3.8: {} - - cssom@0.5.0: {} - - cssstyle@2.3.0: - dependencies: - cssom: 0.3.8 - csstype@3.1.3: {} csv-generate@3.4.3: {} @@ -10410,27 +9379,28 @@ snapshots: csv-stringify: 5.6.5 stream-transform: 2.1.3 - cz-conventional-changelog@3.3.0(@types/node@20.5.4)(typescript@4.9.5): + cz-conventional-changelog@3.3.0(@types/node@20.5.4)(typescript@6.0.3): dependencies: chalk: 2.4.2 - commitizen: 4.3.0(@types/node@20.5.4)(typescript@4.9.5) + commitizen: 4.3.0(@types/node@20.5.4)(typescript@6.0.3) conventional-commit-types: 3.0.0 lodash.map: 4.6.0 longest: 2.0.1 word-wrap: 1.2.5 optionalDependencies: - '@commitlint/load': 19.2.0(@types/node@20.5.4)(typescript@4.9.5) + '@commitlint/load': 19.2.0(@types/node@20.5.4)(typescript@6.0.3) transitivePeerDependencies: - '@types/node' - typescript dargs@7.0.0: {} - data-urls@3.0.2: + data-urls@7.0.0: dependencies: - abab: 2.0.6 - whatwg-mimetype: 3.0.0 - whatwg-url: 11.0.0 + whatwg-mimetype: 5.0.0 + whatwg-url: 16.0.1 + transitivePeerDependencies: + - '@noble/hashes' data-view-buffer@1.0.1: dependencies: @@ -10450,20 +9420,11 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.1 - dax-sh@0.39.2: - dependencies: - '@deno/shim-deno': 0.19.1 - undici-types: 5.28.4 - - db0@0.1.4: {} - - debug@2.6.9: - dependencies: - ms: 2.0.0 + db0@0.3.4: {} - debug@4.3.5: + debug@4.4.3: dependencies: - ms: 2.1.2 + ms: 2.1.3 decamelize-keys@1.1.1: dependencies: @@ -10472,7 +9433,7 @@ snapshots: decamelize@1.2.0: {} - decimal.js@10.4.3: {} + decimal.js@10.6.0: {} decode-named-character-reference@1.0.2: dependencies: @@ -10484,43 +9445,10 @@ snapshots: dependencies: type-detect: 4.0.8 - deep-equal@2.2.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.4 - is-arguments: 1.1.1 - is-array-buffer: 3.0.4 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - isarray: 2.0.5 - object-is: 1.1.6 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - side-channel: 1.0.6 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.2 - which-typed-array: 1.1.15 - deep-object-diff@1.1.9: {} deepmerge@4.3.1: {} - default-browser-id@3.0.0: - dependencies: - bplist-parser: 0.2.0 - untildify: 4.0.0 - - default-browser@4.0.0: - dependencies: - bundle-name: 3.0.0 - default-browser-id: 3.0.0 - execa: 7.2.0 - titleize: 3.0.0 - defaults@1.0.4: dependencies: clone: 1.0.4 @@ -10531,10 +9459,6 @@ snapshots: es-errors: 1.3.0 gopd: 1.0.1 - define-lazy-prop@2.0.0: {} - - define-lazy-prop@3.0.0: {} - define-properties@1.2.1: dependencies: define-data-property: 1.1.4 @@ -10543,26 +9467,15 @@ snapshots: defu@6.1.4: {} - delayed-stream@1.0.0: {} - - delegates@1.0.0: {} - - denque@2.1.0: {} - - depd@2.0.0: {} + denque@2.1.0: + optional: true dequal@2.0.3: {} - destr@2.0.3: {} - - destroy@1.2.0: {} - detect-file@1.0.0: {} detect-indent@6.1.0: {} - detect-libc@1.0.3: {} - detect-libc@2.0.3: {} dettle@1.0.2: {} @@ -10577,62 +9490,37 @@ snapshots: diff@4.0.2: {} + diff@8.0.4: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 + direction@2.0.1: {} + dlv@1.1.3: {} dom-accessibility-api@0.5.16: {} dom-accessibility-api@0.6.3: {} - dom-serializer@2.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - - domelementtype@2.3.0: {} - - domexception@4.0.0: - dependencies: - webidl-conversions: 7.0.0 - - domhandler@5.0.3: - dependencies: - domelementtype: 2.3.0 - - domutils@3.1.0: - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - dot-prop@5.3.0: dependencies: is-obj: 2.0.0 - dot-prop@8.0.2: - dependencies: - type-fest: 3.13.1 - - dotenv@16.4.5: {} - - duplexer@0.1.2: {} + dotenv@17.4.2: + optional: true eastasianwidth@0.2.0: {} - ee-first@1.1.1: {} + electron-to-chromium@1.5.383: {} - electron-to-chromium@1.4.788: {} + emoji-regex-xs@1.0.0: {} emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} - encodeurl@1.0.2: {} - enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -10640,15 +9528,22 @@ snapshots: entities@4.5.0: {} + entities@8.0.0: {} + env-paths@2.2.1: optional: true + env-runner@0.1.15: + dependencies: + crossws: 0.4.7(srvx@0.11.18) + exsolve: 1.1.0 + httpxy: 0.5.4 + srvx: 0.11.18 + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - error-stack-parser-es@0.1.4: {} - error-stack-parser@2.1.4: dependencies: stackframe: 1.3.4 @@ -10708,19 +9603,7 @@ snapshots: es-errors@1.3.0: {} - es-get-iterator@1.1.3: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - is-arguments: 1.1.1 - is-map: 2.0.3 - is-set: 2.0.3 - is-string: 1.0.7 - isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 - - es-module-lexer@1.5.3: {} + es-module-lexer@2.2.0: {} es-object-atoms@1.0.0: dependencies: @@ -10742,6 +9625,20 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.17.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.2 + esbuild-android-64@0.15.18: optional: true @@ -10790,13 +9687,13 @@ snapshots: esbuild-openbsd-64@0.15.18: optional: true - esbuild-plugin-solid@0.5.0(esbuild@0.18.20)(solid-js@1.8.15): + esbuild-plugin-solid@0.5.0(esbuild@0.27.7)(solid-js@1.9.14): dependencies: '@babel/core': 7.22.10 '@babel/preset-typescript': 7.24.6(@babel/core@7.22.10) babel-preset-solid: 1.7.7(@babel/core@7.22.10) - esbuild: 0.18.20 - solid-js: 1.8.15 + esbuild: 0.27.7 + solid-js: 1.9.14 transitivePeerDependencies: - supports-color @@ -10862,31 +9759,6 @@ snapshots: '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 - esbuild@0.18.7: - optionalDependencies: - '@esbuild/android-arm': 0.18.7 - '@esbuild/android-arm64': 0.18.7 - '@esbuild/android-x64': 0.18.7 - '@esbuild/darwin-arm64': 0.18.7 - '@esbuild/darwin-x64': 0.18.7 - '@esbuild/freebsd-arm64': 0.18.7 - '@esbuild/freebsd-x64': 0.18.7 - '@esbuild/linux-arm': 0.18.7 - '@esbuild/linux-arm64': 0.18.7 - '@esbuild/linux-ia32': 0.18.7 - '@esbuild/linux-loong64': 0.18.7 - '@esbuild/linux-mips64el': 0.18.7 - '@esbuild/linux-ppc64': 0.18.7 - '@esbuild/linux-riscv64': 0.18.7 - '@esbuild/linux-s390x': 0.18.7 - '@esbuild/linux-x64': 0.18.7 - '@esbuild/netbsd-x64': 0.18.7 - '@esbuild/openbsd-x64': 0.18.7 - '@esbuild/sunos-x64': 0.18.7 - '@esbuild/win32-arm64': 0.18.7 - '@esbuild/win32-ia32': 0.18.7 - '@esbuild/win32-x64': 0.18.7 - esbuild@0.19.12: optionalDependencies: '@esbuild/aix-ppc64': 0.19.12 @@ -10913,55 +9785,46 @@ snapshots: '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 - esbuild@0.20.2: + esbuild@0.27.7: optionalDependencies: - '@esbuild/aix-ppc64': 0.20.2 - '@esbuild/android-arm': 0.20.2 - '@esbuild/android-arm64': 0.20.2 - '@esbuild/android-x64': 0.20.2 - '@esbuild/darwin-arm64': 0.20.2 - '@esbuild/darwin-x64': 0.20.2 - '@esbuild/freebsd-arm64': 0.20.2 - '@esbuild/freebsd-x64': 0.20.2 - '@esbuild/linux-arm': 0.20.2 - '@esbuild/linux-arm64': 0.20.2 - '@esbuild/linux-ia32': 0.20.2 - '@esbuild/linux-loong64': 0.20.2 - '@esbuild/linux-mips64el': 0.20.2 - '@esbuild/linux-ppc64': 0.20.2 - '@esbuild/linux-riscv64': 0.20.2 - '@esbuild/linux-s390x': 0.20.2 - '@esbuild/linux-x64': 0.20.2 - '@esbuild/netbsd-x64': 0.20.2 - '@esbuild/openbsd-x64': 0.20.2 - '@esbuild/sunos-x64': 0.20.2 - '@esbuild/win32-arm64': 0.20.2 - '@esbuild/win32-ia32': 0.20.2 - '@esbuild/win32-x64': 0.20.2 - - escalade@3.1.2: {} - - escape-html@1.0.3: {} + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + + escalade@3.2.0: {} escape-string-regexp@1.0.5: {} escape-string-regexp@5.0.0: {} - escodegen@2.1.0: - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - esprima@4.0.1: {} - estraverse@5.3.0: {} - estree-util-attach-comments@3.0.0: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.9 estree-util-build-jsx@3.0.1: dependencies: @@ -10972,11 +9835,20 @@ snapshots: estree-util-is-identifier-name@3.0.0: {} + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + estree-util-to-js@2.0.0: dependencies: '@types/estree-jsx': 1.0.5 astring: 1.8.6 - source-map: 0.7.4 + source-map: 0.7.6 + + estree-util-value-to-estree@3.5.0: + dependencies: + '@types/estree': 1.0.9 estree-util-visit@2.0.0: dependencies: @@ -10989,21 +9861,13 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.9 esutils@2.0.3: {} - etag@1.8.1: {} - - event-target-shim@5.0.1: {} - - eventemitter3@4.0.7: {} - - events@3.3.0: {} - execa@5.1.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 6.0.1 human-signals: 2.1.0 is-stream: 2.0.1 @@ -11013,21 +9877,9 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - execa@7.2.0: - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 4.3.1 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 3.0.7 - strip-final-newline: 3.0.0 - execa@8.0.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 8.0.1 human-signals: 5.0.0 is-stream: 3.0.0 @@ -11041,6 +9893,33 @@ snapshots: dependencies: homedir-polyfill: 1.0.3 + expect-type@1.4.0: {} + + expressive-code-twoslash@0.4.0(@expressive-code/core@0.41.7)(expressive-code@0.41.7)(typescript@5.9.3): + dependencies: + '@expressive-code/core': 0.41.7 + expressive-code: 0.41.7 + mdast-util-from-markdown: 2.0.3 + mdast-util-gfm: 3.1.0 + mdast-util-to-hast: 13.2.1 + twoslash: 0.2.12(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + expressive-code@0.41.7: + dependencies: + '@expressive-code/core': 0.41.7 + '@expressive-code/plugin-frames': 0.41.7 + '@expressive-code/plugin-shiki': 0.41.7 + '@expressive-code/plugin-text-markers': 0.41.7 + + exsolve@1.1.0: {} + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + extend@3.0.2: {} extendable-error@0.1.7: {} @@ -11053,23 +9932,19 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-fifo@1.3.2: {} - - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.7 + micromatch: 4.0.8 fast-ignore@1.1.3: dependencies: grammex: 3.1.3 string-escape-regex: 1.0.0 - fast-string-truncated-width@1.1.0: {} - fast-string-truncated-width@1.2.1: {} fast-string-width@1.1.0: @@ -11080,7 +9955,13 @@ snapshots: dependencies: reusify: 1.0.4 - fenceparser@1.1.1: {} + fault@2.0.1: + dependencies: + format: 0.2.2 + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 fflate@0.8.2: {} @@ -11088,8 +9969,6 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 - file-uri-to-path@1.0.0: {} - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -11101,16 +9980,10 @@ snapshots: find-root@1.1.0: {} - find-up-json@2.0.4: - dependencies: - find-up-path: 1.0.0 - find-up-json@2.0.5: dependencies: find-up-path: 1.0.1 - find-up-path@1.0.0: {} - find-up-path@1.0.1: {} find-up@4.1.0: @@ -11125,19 +9998,23 @@ snapshots: find-yarn-workspace-root2@1.2.16: dependencies: - micromatch: 4.0.7 + micromatch: 4.0.8 pkg-dir: 4.2.0 findup-sync@4.0.0: dependencies: detect-file: 1.0.0 is-glob: 4.0.3 - micromatch: 4.0.7 + micromatch: 4.0.8 resolve-dir: 1.0.1 - flatted@3.3.1: {} + fix-dts-default-cjs-exports@1.0.1: + dependencies: + magic-string: 0.30.21 + mlly: 1.8.2 + rollup: 4.62.2 - follow-redirects@1.15.6: {} + flatted@3.4.2: {} for-each@0.3.3: dependencies: @@ -11145,18 +10022,10 @@ snapshots: foreground-child@3.1.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@4.0.0: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - - fraction.js@4.3.7: {} - - fresh@0.5.2: {} + format@0.2.2: {} fs-extra@11.2.0: dependencies: @@ -11183,10 +10052,6 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -11205,18 +10070,6 @@ snapshots: functions-have-names@1.2.3: {} - gauge@3.0.2: - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - object-assign: 4.1.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} @@ -11235,8 +10088,6 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 - get-port-please@3.1.2: {} - get-stream@6.0.1: {} get-stream@8.0.1: {} @@ -11247,16 +10098,8 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.2.4 - giget@1.2.3: - dependencies: - citty: 0.1.6 - consola: 3.2.3 - defu: 6.1.4 - node-fetch-native: 1.6.4 - nypm: 0.3.8 - ohash: 1.1.3 - pathe: 1.1.2 - tar: 6.2.1 + giget@3.3.0: + optional: true git-raw-commits@2.0.11: dependencies: @@ -11293,14 +10136,6 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - glob@8.1.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - global-directory@4.0.1: dependencies: ini: 4.1.1 @@ -11336,7 +10171,7 @@ snapshots: '@types/glob': 7.2.0 array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.2 + fast-glob: 3.3.3 glob: 7.2.3 ignore: 5.3.1 merge2: 1.4.1 @@ -11346,20 +10181,11 @@ snapshots: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.2 + fast-glob: 3.3.3 ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 - globby@14.0.1: - dependencies: - '@sindresorhus/merge-streams': 2.3.0 - fast-glob: 3.3.2 - ignore: 5.3.1 - path-type: 5.0.0 - slash: 5.1.0 - unicorn-magic: 0.1.0 - gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 @@ -11370,24 +10196,26 @@ snapshots: grapheme-splitter@1.0.4: {} - gzip-size@7.0.0: + gray-matter@4.0.3: dependencies: - duplexer: 0.1.2 + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 - h3@1.11.1: + h3@2.0.1-rc.16(crossws@0.4.7(srvx@0.11.18)): dependencies: - cookie-es: 1.1.0 - crossws: 0.2.4 - defu: 6.1.4 - destr: 2.0.3 - iron-webcrypto: 1.2.1 - ohash: 1.1.3 - radix3: 1.1.2 - ufo: 1.5.3 - uncrypto: 0.1.3 - unenv: 1.9.0 - transitivePeerDependencies: - - uWebSockets.js + rou3: 0.8.1 + srvx: 0.11.18 + optionalDependencies: + crossws: 0.4.7(srvx@0.11.18) + + h3@2.0.1-rc.22(crossws@0.4.7(srvx@0.11.18)): + dependencies: + rou3: 0.8.1 + srvx: 0.11.18 + optionalDependencies: + crossws: 0.4.7(srvx@0.11.18) hard-rejection@2.1.0: {} @@ -11409,21 +10237,10 @@ snapshots: dependencies: has-symbols: 1.0.3 - has-unicode@2.0.1: {} - hasown@2.0.2: dependencies: function-bind: 1.1.2 - hast-util-from-html@2.0.1: - dependencies: - '@types/hast': 3.0.4 - devlop: 1.1.0 - hast-util-from-parse5: 8.0.1 - parse5: 7.1.2 - vfile: 6.0.1 - vfile-message: 4.0.2 - hast-util-from-parse5@8.0.1: dependencies: '@types/hast': 3.0.4 @@ -11435,10 +10252,18 @@ snapshots: vfile-location: 5.0.2 web-namespaces: 2.0.1 + hast-util-has-property@3.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-heading-rank@3.0.0: dependencies: '@types/hast': 3.0.4 + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-parse-selector@4.0.0: dependencies: '@types/hast': 3.0.4 @@ -11451,17 +10276,35 @@ snapshots: hast-util-from-parse5: 8.0.1 hast-util-to-parse5: 8.0.0 html-void-elements: 3.0.0 - mdast-util-to-hast: 13.1.0 + mdast-util-to-hast: 13.2.1 parse5: 7.1.2 unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 vfile: 6.0.1 web-namespaces: 2.0.1 zwitch: 2.0.4 + hast-util-select@6.0.4: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + bcp-47-match: 2.0.3 + comma-separated-tokens: 2.0.3 + css-selector-parser: 3.3.0 + devlop: 1.1.0 + direction: 2.0.1 + hast-util-has-property: 3.0.0 + hast-util-to-string: 3.0.0 + hast-util-whitespace: 3.0.0 + nth-check: 2.1.1 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 + hast-util-to-estree@3.1.0: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.9 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 @@ -11470,7 +10313,7 @@ snapshots: estree-util-is-identifier-name: 3.0.0 hast-util-whitespace: 3.0.0 mdast-util-mdx-expression: 2.0.0 - mdast-util-mdx-jsx: 3.1.2 + mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 property-information: 6.5.0 space-separated-tokens: 2.0.2 @@ -11480,9 +10323,23 @@ snapshots: transitivePeerDependencies: - supports-color + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + hast-util-to-jsx-runtime@2.3.0: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.9 '@types/hast': 3.0.4 '@types/unist': 3.0.2 comma-separated-tokens: 2.0.3 @@ -11490,7 +10347,7 @@ snapshots: estree-util-is-identifier-name: 3.0.0 hast-util-whitespace: 3.0.0 mdast-util-mdx-expression: 2.0.0 - mdast-util-mdx-jsx: 3.1.2 + mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 property-information: 6.5.0 space-separated-tokens: 2.0.2 @@ -11514,6 +10371,13 @@ snapshots: dependencies: '@types/hast': 3.0.4 + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + hast-util-whitespace@3.0.0: dependencies: '@types/hast': 3.0.4 @@ -11526,13 +10390,19 @@ snapshots: property-information: 6.5.0 space-separated-tokens: 2.0.2 - he@1.2.0: {} + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 homedir-polyfill@1.0.3: dependencies: parse-passwd: 1.0.0 - hookable@5.5.3: {} + hookable@6.1.1: {} hosted-git-info@2.8.9: {} @@ -11540,67 +10410,30 @@ snapshots: dependencies: lru-cache: 6.0.0 - html-encoding-sniffer@3.0.0: + html-encoding-sniffer@6.0.0: dependencies: - whatwg-encoding: 2.0.0 + '@exodus/bytes': 1.15.1 + transitivePeerDependencies: + - '@noble/hashes' html-entities@2.3.3: {} - html-to-image@1.11.11: {} + html-to-image@1.11.13: {} html-void-elements@3.0.0: {} - http-errors@2.0.0: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - - http-proxy-agent@5.0.0: - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.3.5 - transitivePeerDependencies: - - supports-color - - http-proxy@1.18.1: - dependencies: - eventemitter3: 4.0.7 - follow-redirects: 1.15.6 - requires-port: 1.0.0 - transitivePeerDependencies: - - debug - - http-shutdown@1.2.2: {} - - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.3.5 - transitivePeerDependencies: - - supports-color - - httpxy@0.1.5: {} + httpxy@0.5.4: {} human-id@1.0.2: {} human-signals@2.1.0: {} - human-signals@4.3.1: {} - human-signals@5.0.0: {} iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - ieee754@1.2.1: {} ignore@5.3.1: {} @@ -11610,7 +10443,7 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - import-meta-resolve@4.1.0: {} + import-meta-resolve@4.2.0: {} indent-string@4.0.0: {} @@ -11658,21 +10491,18 @@ snapshots: ionstore@1.0.1: {} - ioredis@5.4.1: + ioredis@5.11.1: dependencies: - '@ioredis/commands': 1.2.0 - cluster-key-slot: 1.1.2 - debug: 4.3.5 + '@ioredis/commands': 1.10.0 + cluster-key-slot: 1.1.1 + debug: 4.4.3 denque: 2.1.0 - lodash.defaults: 4.2.0 - lodash.isarguments: 3.1.0 redis-errors: 1.2.0 redis-parser: 3.0.0 standard-as-callback: 2.1.0 transitivePeerDependencies: - supports-color - - iron-webcrypto@1.2.1: {} + optional: true is-alphabetical@2.0.1: {} @@ -11681,11 +10511,6 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - is-arguments@1.1.1: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 @@ -11706,8 +10531,6 @@ snapshots: call-bind: 1.0.7 has-tostringtag: 1.0.2 - is-buffer@2.0.5: {} - is-builtin-module@3.2.1: dependencies: builtin-modules: 3.3.0 @@ -11732,9 +10555,7 @@ snapshots: is-decimal@2.0.1: {} - is-docker@2.2.1: {} - - is-docker@3.0.0: {} + is-extendable@0.1.1: {} is-extglob@2.1.1: {} @@ -11746,14 +10567,8 @@ snapshots: is-hexadecimal@2.0.1: {} - is-inside-container@1.0.0: - dependencies: - is-docker: 3.0.0 - is-interactive@1.0.0: {} - is-map@2.0.3: {} - is-module@1.0.0: {} is-negative-zero@2.0.3: {} @@ -11768,31 +10583,17 @@ snapshots: is-plain-obj@1.1.0: {} - is-plain-obj@2.1.0: {} - is-plain-obj@4.1.0: {} is-plain-object@3.0.1: {} is-potential-custom-element-name@1.0.1: {} - is-primitive@3.0.1: {} - - is-reference@1.2.1: - dependencies: - '@types/estree': 1.0.5 - - is-reference@3.0.2: - dependencies: - '@types/estree': 1.0.5 - is-regex@1.1.4: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - is-set@2.0.3: {} - is-shared-array-buffer@1.0.3: dependencies: call-bind: 1.0.7 @@ -11825,41 +10626,18 @@ snapshots: is-utf8@0.2.1: {} - is-weakmap@2.0.2: {} - is-weakref@1.0.2: dependencies: call-bind: 1.0.7 - is-weakset@2.0.3: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - is-what@4.1.16: {} is-windows@1.0.2: {} - is-wsl@2.2.0: - dependencies: - is-docker: 2.2.1 - - is-wsl@3.1.0: - dependencies: - is-inside-container: 1.0.0 - - is64bit@2.0.0: - dependencies: - system-architecture: 0.1.0 - - isarray@1.0.0: {} - isarray@2.0.5: {} isexe@2.0.0: {} - isexe@3.1.1: {} - jackspeak@3.1.2: dependencies: '@isaacs/cliui': 8.0.2 @@ -11868,6 +10646,9 @@ snapshots: jiti@1.21.0: {} + jiti@2.7.0: + optional: true + joycon@3.1.1: {} js-cleanup@1.2.0: @@ -11878,7 +10659,7 @@ snapshots: js-tokens@4.0.0: {} - js-tokens@9.0.0: {} + js-tokens@9.0.1: {} js-yaml@3.14.1: dependencies: @@ -11889,43 +10670,35 @@ snapshots: dependencies: argparse: 2.0.1 - jsdom@19.0.0: - dependencies: - abab: 2.0.6 - acorn: 8.10.0 - acorn-globals: 6.0.0 - cssom: 0.5.0 - cssstyle: 2.3.0 - data-urls: 3.0.2 - decimal.js: 10.4.3 - domexception: 4.0.0 - escodegen: 2.1.0 - form-data: 4.0.0 - html-encoding-sniffer: 3.0.0 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 + jsdom@29.1.1: + dependencies: + '@asamuzakjp/css-color': 5.1.11 + '@asamuzakjp/dom-selector': 7.1.1 + '@bramus/specificity': 2.4.2 + '@csstools/css-syntax-patches-for-csstree': 1.1.6(css-tree@3.2.1) + '@exodus/bytes': 1.15.1 + css-tree: 3.2.1 + data-urls: 7.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 6.0.0 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.10 - parse5: 6.0.1 - saxes: 5.0.1 + lru-cache: 11.5.1 + parse5: 8.0.1 + saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 4.1.4 - w3c-hr-time: 1.0.2 - w3c-xmlserializer: 3.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 2.0.0 - whatwg-mimetype: 3.0.0 - whatwg-url: 10.0.0 - ws: 8.17.0 - xml-name-validator: 4.0.0 + tough-cookie: 6.0.2 + undici: 7.28.0 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 8.0.1 + whatwg-mimetype: 5.0.0 + whatwg-url: 16.0.1 + xml-name-validator: 5.0.0 transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate + - '@noble/hashes' jsesc@0.5.0: {} - jsesc@2.5.2: {} + jsesc@3.1.0: {} json-parse-even-better-errors@2.3.1: {} @@ -11935,8 +10708,6 @@ snapshots: json5@2.2.3: {} - jsonc-parser@3.2.1: {} - jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 @@ -11955,15 +10726,54 @@ snapshots: kleur@4.1.5: {} - klona@2.0.6: {} + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true - knitwork@1.1.0: {} + lightningcss-win32-arm64-msvc@1.32.0: + optional: true - kolorist@1.8.0: {} + lightningcss-win32-x64-msvc@1.32.0: + optional: true - lazystream@1.0.1: + lightningcss@1.32.0: dependencies: - readable-stream: 2.3.8 + detect-libc: 2.0.3 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 lilconfig@2.1.0: {} @@ -11971,29 +10781,6 @@ snapshots: lines-and-columns@1.2.4: {} - listhen@1.7.2: - dependencies: - '@parcel/watcher': 2.4.1 - '@parcel/watcher-wasm': 2.4.1 - citty: 0.1.6 - clipboardy: 4.0.0 - consola: 3.2.3 - crossws: 0.2.4 - defu: 6.1.4 - get-port-please: 3.1.2 - h3: 1.11.1 - http-shutdown: 1.2.2 - jiti: 1.21.0 - mlly: 1.7.0 - node-forge: 1.3.1 - pathe: 1.1.2 - std-env: 3.7.0 - ufo: 1.5.3 - untun: 0.1.3 - uqr: 0.1.2 - transitivePeerDependencies: - - uWebSockets.js - load-tsconfig@0.2.5: {} load-yaml-file@0.2.0: @@ -12005,8 +10792,14 @@ snapshots: local-pkg@0.5.0: dependencies: - mlly: 1.7.0 - pkg-types: 1.1.1 + mlly: 1.8.2 + pkg-types: 1.3.1 + + local-pkg@1.2.1: + dependencies: + mlly: 1.8.2 + pkg-types: 2.3.1 + quansync: 0.2.11 locate-path@5.0.0: dependencies: @@ -12018,14 +10811,8 @@ snapshots: lodash.camelcase@4.3.0: {} - lodash.castarray@4.4.0: {} - lodash.debounce@4.0.8: {} - lodash.defaults@4.2.0: {} - - lodash.isarguments@3.1.0: {} - lodash.isfunction@3.0.9: {} lodash.isplainobject@4.0.6: {} @@ -12067,6 +10854,8 @@ snapshots: lru-cache@10.2.2: {} + lru-cache@11.5.1: {} + lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 @@ -12086,23 +10875,9 @@ snapshots: dependencies: sourcemap-codec: 1.4.8 - magic-string@0.30.10: - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - - magic-string@0.30.5: - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - - magicast@0.2.11: - dependencies: - '@babel/parser': 7.24.6 - '@babel/types': 7.24.6 - recast: 0.23.9 - - make-dir@3.1.0: + magic-string@0.30.21: dependencies: - semver: 6.3.1 + '@jridgewell/sourcemap-codec': 1.5.5 make-error@1.3.6: {} @@ -12114,14 +10889,28 @@ snapshots: markdown-table@3.0.3: {} - mdast-util-find-and-replace@3.0.1: + mdast-util-directive@3.1.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.2 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.4 + unist-util-visit-parents: 6.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-find-and-replace@3.0.2: dependencies: '@types/mdast': 4.0.4 escape-string-regexp: 5.0.0 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - mdast-util-from-markdown@2.0.1: + mdast-util-from-markdown@2.0.3: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.2 @@ -12138,19 +10927,30 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-frontmatter@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + escape-string-regexp: 5.0.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.0 + micromark-extension-frontmatter: 2.0.0 + transitivePeerDependencies: + - supports-color + mdast-util-gfm-autolink-literal@2.0.0: dependencies: '@types/mdast': 4.0.4 ccount: 2.0.1 devlop: 1.1.0 - mdast-util-find-and-replace: 3.0.1 + mdast-util-find-and-replace: 3.0.2 micromark-util-character: 2.1.0 mdast-util-gfm-footnote@2.0.0: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 + mdast-util-from-markdown: 2.0.3 mdast-util-to-markdown: 2.1.0 micromark-util-normalize-identifier: 2.0.0 transitivePeerDependencies: @@ -12159,7 +10959,7 @@ snapshots: mdast-util-gfm-strikethrough@2.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.1 + mdast-util-from-markdown: 2.0.3 mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color @@ -12169,7 +10969,7 @@ snapshots: '@types/mdast': 4.0.4 devlop: 1.1.0 markdown-table: 3.0.3 - mdast-util-from-markdown: 2.0.1 + mdast-util-from-markdown: 2.0.3 mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color @@ -12178,14 +10978,14 @@ snapshots: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 + mdast-util-from-markdown: 2.0.3 mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - mdast-util-gfm@3.0.0: + mdast-util-gfm@3.1.0: dependencies: - mdast-util-from-markdown: 2.0.1 + mdast-util-from-markdown: 2.0.3 mdast-util-gfm-autolink-literal: 2.0.0 mdast-util-gfm-footnote: 2.0.0 mdast-util-gfm-strikethrough: 2.0.0 @@ -12201,12 +11001,12 @@ snapshots: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 + mdast-util-from-markdown: 2.0.3 mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - mdast-util-mdx-jsx@3.1.2: + mdast-util-mdx-jsx@3.2.0: dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 @@ -12214,11 +11014,10 @@ snapshots: '@types/unist': 3.0.2 ccount: 2.0.1 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 + mdast-util-from-markdown: 2.0.3 mdast-util-to-markdown: 2.1.0 parse-entities: 4.0.1 stringify-entities: 4.0.4 - unist-util-remove-position: 5.0.0 unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 transitivePeerDependencies: @@ -12226,9 +11025,9 @@ snapshots: mdast-util-mdx@3.0.0: dependencies: - mdast-util-from-markdown: 2.0.1 + mdast-util-from-markdown: 2.0.3 mdast-util-mdx-expression: 2.0.0 - mdast-util-mdx-jsx: 3.1.2 + mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: @@ -12240,7 +11039,7 @@ snapshots: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 + mdast-util-from-markdown: 2.0.3 mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color @@ -12250,7 +11049,7 @@ snapshots: '@types/mdast': 4.0.4 unist-util-is: 6.0.0 - mdast-util-to-hast@13.1.0: + mdast-util-to-hast@13.2.1: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 @@ -12259,7 +11058,7 @@ snapshots: micromark-util-sanitize-uri: 2.0.0 trim-lines: 3.0.1 unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 vfile: 6.0.1 mdast-util-to-markdown@2.1.0: @@ -12270,13 +11069,25 @@ snapshots: mdast-util-phrasing: 4.1.0 mdast-util-to-string: 4.0.0 micromark-util-decode-string: 2.0.0 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 zwitch: 2.0.4 mdast-util-to-string@4.0.0: dependencies: '@types/mdast': 4.0.4 + mdast-util-toc@7.1.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/ungap__structured-clone': 1.2.0 + '@ungap/structured-clone': 1.2.0 + github-slugger: 2.0.0 + mdast-util-to-string: 4.0.0 + unist-util-is: 6.0.0 + unist-util-visit: 5.1.0 + + mdn-data@2.27.1: {} + media-query-parser@2.0.2: dependencies: '@babel/runtime': 7.24.6 @@ -12338,6 +11149,23 @@ snapshots: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + micromark-extension-directive@3.0.2: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + parse-entities: 4.0.1 + + micromark-extension-frontmatter@2.0.0: + dependencies: + fault: 2.0.1 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + micromark-extension-gfm-autolink-literal@2.0.0: dependencies: micromark-util-character: 2.1.0 @@ -12398,7 +11226,7 @@ snapshots: micromark-extension-mdx-expression@3.0.0: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.9 devlop: 1.1.0 micromark-factory-mdx-expression: 2.0.1 micromark-factory-space: 2.0.0 @@ -12410,7 +11238,7 @@ snapshots: micromark-extension-mdx-jsx@3.0.0: dependencies: '@types/acorn': 4.0.6 - '@types/estree': 1.0.5 + '@types/estree': 1.0.9 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 micromark-factory-mdx-expression: 2.0.1 @@ -12426,7 +11254,7 @@ snapshots: micromark-extension-mdxjs-esm@3.0.0: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.9 devlop: 1.1.0 micromark-core-commonmark: 2.0.1 micromark-util-character: 2.1.0 @@ -12438,8 +11266,8 @@ snapshots: micromark-extension-mdxjs@3.0.0: dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) micromark-extension-mdx-expression: 3.0.0 micromark-extension-mdx-jsx: 3.0.0 micromark-extension-mdx-md: 2.0.0 @@ -12462,7 +11290,7 @@ snapshots: micromark-factory-mdx-expression@2.0.1: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.9 devlop: 1.1.0 micromark-util-character: 2.1.0 micromark-util-events-to-acorn: 2.0.2 @@ -12526,7 +11354,7 @@ snapshots: micromark-util-events-to-acorn@2.0.2: dependencies: '@types/acorn': 4.0.6 - '@types/estree': 1.0.5 + '@types/estree': 1.0.9 '@types/unist': 3.0.2 devlop: 1.1.0 estree-util-visit: 2.0.0 @@ -12564,7 +11392,7 @@ snapshots: micromark@4.0.0: dependencies: '@types/debug': 4.1.12 - debug: 4.3.5 + debug: 4.4.3 decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.1 @@ -12583,23 +11411,11 @@ snapshots: transitivePeerDependencies: - supports-color - micromatch@4.0.7: + micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mime@1.6.0: {} - - mime@3.0.0: {} - - mime@4.0.3: {} - mimic-fn@2.1.0: {} mimic-fn@4.0.0: {} @@ -12610,10 +11426,6 @@ snapshots: dependencies: brace-expansion: 1.1.11 - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.1 - minimatch@9.0.4: dependencies: brace-expansion: 2.0.1 @@ -12628,44 +11440,25 @@ snapshots: minimist@1.2.8: {} - minipass@3.3.6: - dependencies: - yallist: 4.0.0 - - minipass@5.0.0: {} - minipass@7.1.2: {} minisearch@7.1.0: {} - minizlib@2.1.2: - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - mixme@0.5.10: {} - mkdirp@1.0.4: {} - mkdirp@3.0.1: {} - mlly@1.7.0: + mlly@1.8.2: dependencies: - acorn: 8.11.3 - pathe: 1.1.2 - pkg-types: 1.1.1 - ufo: 1.5.3 + acorn: 8.17.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 moment@2.29.4: {} - mri@1.2.0: {} - mrmime@2.0.0: {} - ms@2.0.0: {} - - ms@2.1.2: {} - ms@2.1.3: {} mute-stream@0.0.8: {} @@ -12676,77 +11469,32 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.7: {} - - nitropack@2.9.6(@opentelemetry/api@1.8.0): - dependencies: - '@cloudflare/kv-asset-handler': 0.3.2 - '@netlify/functions': 2.7.0(@opentelemetry/api@1.8.0) - '@rollup/plugin-alias': 5.1.0(rollup@4.18.0) - '@rollup/plugin-commonjs': 25.0.8(rollup@4.18.0) - '@rollup/plugin-inject': 5.0.5(rollup@4.18.0) - '@rollup/plugin-json': 6.1.0(rollup@4.18.0) - '@rollup/plugin-node-resolve': 15.2.3(rollup@4.18.0) - '@rollup/plugin-replace': 5.0.5(rollup@4.18.0) - '@rollup/plugin-terser': 0.4.4(rollup@4.18.0) - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) - '@types/http-proxy': 1.17.14 - '@vercel/nft': 0.26.5 - archiver: 7.0.1 - c12: 1.10.0 - chalk: 5.3.0 - chokidar: 3.6.0 - citty: 0.1.6 - consola: 3.2.3 - cookie-es: 1.1.0 - croner: 8.0.2 - crossws: 0.2.4 - db0: 0.1.4 - defu: 6.1.4 - destr: 2.0.3 - dot-prop: 8.0.2 - esbuild: 0.20.2 - escape-string-regexp: 5.0.0 - etag: 1.8.1 - fs-extra: 11.2.0 - globby: 14.0.1 - gzip-size: 7.0.0 - h3: 1.11.1 - hookable: 5.5.3 - httpxy: 0.1.5 - ioredis: 5.4.1 - is-primitive: 3.0.1 - jiti: 1.21.0 - klona: 2.0.6 - knitwork: 1.1.0 - listhen: 1.7.2 - magic-string: 0.30.10 - mime: 4.0.3 - mlly: 1.7.0 - mri: 1.2.0 - node-fetch-native: 1.6.4 - ofetch: 1.3.4 - ohash: 1.1.3 - openapi-typescript: 6.7.6 - pathe: 1.1.2 - perfect-debounce: 1.0.0 - pkg-types: 1.1.1 - pretty-bytes: 6.1.1 - radix3: 1.1.2 - rollup: 4.18.0 - rollup-plugin-visualizer: 5.12.0(rollup@4.18.0) - scule: 1.3.0 - semver: 7.6.2 - serve-placeholder: 2.0.1 - serve-static: 1.15.0 - std-env: 3.7.0 - ufo: 1.5.3 - uncrypto: 0.1.3 - unctx: 2.3.1 - unenv: 1.9.0 - unimport: 3.7.2(rollup@4.18.0) - unstorage: 1.10.2(ioredis@5.4.1) - unwasm: 0.3.9 + nanoid@3.3.15: {} + + nf3@0.3.18: {} + + nitro@3.0.260610-beta(chokidar@5.0.0)(dotenv@17.4.2)(giget@3.3.0)(ioredis@5.11.1)(jiti@2.7.0)(lru-cache@11.5.1)(rollup@4.62.2)(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0)): + dependencies: + consola: 3.4.2 + crossws: 0.4.7(srvx@0.11.18) + db0: 0.3.4 + env-runner: 0.1.15 + h3: 2.0.1-rc.22(crossws@0.4.7(srvx@0.11.18)) + hookable: 6.1.1 + nf3: 0.3.18 + ocache: 0.1.5 + ofetch: 2.0.0-alpha.3 + ohash: 2.0.11 + rolldown: 1.1.3 + srvx: 0.11.18 + unenv: 2.0.0-rc.24 + unstorage: 2.0.0-alpha.7(chokidar@5.0.0)(db0@0.3.4)(ioredis@5.11.1)(lru-cache@11.5.1)(ofetch@2.0.0-alpha.3) + optionalDependencies: + dotenv: 17.4.2 + giget: 3.3.0 + jiti: 2.7.0 + rollup: 4.62.2 + vite: 8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -12755,41 +11503,31 @@ snapshots: - '@azure/keyvault-secrets' - '@azure/storage-blob' - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' - '@libsql/client' - '@netlify/blobs' - - '@opentelemetry/api' + - '@netlify/runtime' - '@planetscale/database' - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' - '@vercel/kv' + - aws4fetch - better-sqlite3 + - chokidar - drizzle-orm - - encoding - idb-keyval - - supports-color - - uWebSockets.js - - node-addon-api@7.1.0: {} - - node-fetch-native@1.6.4: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-forge@1.3.1: {} - - node-gyp-build@4.8.1: {} - - node-html-parser@6.1.13: - dependencies: - css-select: 5.1.0 - he: 1.2.0 - - node-releases@2.0.14: {} + - ioredis + - lru-cache + - miniflare + - mongodb + - mysql2 + - sqlite3 + - uploadthing + - wrangler - nopt@5.0.0: - dependencies: - abbrev: 1.1.1 + node-releases@2.0.50: {} normalize-package-data@2.5.0: dependencies: @@ -12807,8 +11545,6 @@ snapshots: normalize-path@3.0.0: {} - normalize-range@0.1.2: {} - npm-run-path@4.0.1: dependencies: path-key: 3.1.1 @@ -12817,38 +11553,16 @@ snapshots: dependencies: path-key: 4.0.0 - npmlog@5.0.1: - dependencies: - are-we-there-yet: 2.0.0 - console-control-strings: 1.1.0 - gauge: 3.0.2 - set-blocking: 2.0.0 - nth-check@2.1.1: dependencies: boolbase: 1.0.0 - nwsapi@2.2.10: {} - - nypm@0.3.8: - dependencies: - citty: 0.1.6 - consola: 3.2.3 - execa: 8.0.1 - pathe: 1.1.2 - ufo: 1.5.3 - object-assign@4.1.1: {} object-hash@3.0.0: {} object-inspect@1.13.1: {} - object-is@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - object-keys@1.1.1: {} object.assign@4.1.5: @@ -12858,17 +11572,15 @@ snapshots: has-symbols: 1.0.3 object-keys: 1.1.1 - ofetch@1.3.4: + obug@2.1.3: {} + + ocache@0.1.5: dependencies: - destr: 2.0.3 - node-fetch-native: 1.6.4 - ufo: 1.5.3 + ohash: 2.0.11 - ohash@1.1.3: {} + ofetch@2.0.0-alpha.3: {} - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 + ohash@2.0.11: {} once@1.4.0: dependencies: @@ -12882,27 +11594,19 @@ snapshots: dependencies: mimic-fn: 4.0.0 - open@8.4.2: - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 + oniguruma-parser@0.12.2: {} - open@9.1.0: + oniguruma-to-es@2.3.0: dependencies: - default-browser: 4.0.0 - define-lazy-prop: 3.0.0 - is-inside-container: 1.0.0 - is-wsl: 2.2.0 + emoji-regex-xs: 1.0.0 + regex: 5.1.1 + regex-recursion: 5.1.1 - openapi-typescript@6.7.6: + oniguruma-to-es@4.3.6: dependencies: - ansi-colors: 4.1.3 - fast-glob: 3.3.2 - js-yaml: 4.1.0 - supports-color: 9.4.0 - undici: 5.28.4 - yargs-parser: 21.1.1 + oniguruma-parser: 0.12.2 + regex: 6.1.0 + regex-recursion: 6.0.2 ora@5.4.1: dependencies: @@ -12950,6 +11654,8 @@ snapshots: p-try@2.2.0: {} + package-manager-detector@1.7.0: {} + package-name-regex@2.0.6: {} parent-module@1.0.1: @@ -12969,7 +11675,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.24.6 + '@babel/code-frame': 7.29.7 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -12978,13 +11684,13 @@ snapshots: parse-passwd@1.0.0: {} - parse5@6.0.1: {} - parse5@7.1.2: dependencies: entities: 4.5.0 - parseurl@1.3.3: {} + parse5@8.0.1: + dependencies: + entities: 8.0.0 path-exists@4.0.0: {} @@ -13001,30 +11707,24 @@ snapshots: lru-cache: 10.2.2 minipass: 7.1.2 - path-to-regexp@6.2.2: {} + path-to-regexp@8.4.2: {} path-type@4.0.0: {} - path-type@5.0.0: {} - pathe@1.1.2: {} + pathe@2.0.3: {} + pathval@1.1.1: {} perf-regexes@1.0.1: {} - perfect-debounce@1.0.0: {} - - periscopic@3.1.0: - dependencies: - '@types/estree': 1.0.5 - estree-walker: 3.0.3 - is-reference: 3.0.2 - - picocolors@1.0.1: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} + picomatch@4.0.4: {} + pify@2.3.0: {} pify@4.0.1: {} @@ -13032,7 +11732,7 @@ snapshots: pioppo@1.1.1: dependencies: dettle: 1.0.2 - when-exit: 2.1.2 + when-exit: 2.1.4 pirates@4.0.6: {} @@ -13040,60 +11740,53 @@ snapshots: dependencies: find-up: 4.1.0 - pkg-types@1.1.1: + pkg-types@1.3.1: dependencies: - confbox: 0.1.7 - mlly: 1.7.0 - pathe: 1.1.2 + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 + + pkg-types@2.3.1: + dependencies: + confbox: 0.2.4 + exsolve: 1.1.0 + pathe: 2.0.3 possible-typed-array-names@1.0.0: {} - postcss-import@15.1.0(postcss@8.4.28): + postcss-import@15.1.0(postcss@8.5.16): dependencies: - postcss: 8.4.28 + postcss: 8.5.16 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - postcss-js@4.0.1(postcss@8.4.28): + postcss-js@4.0.1(postcss@8.5.16): dependencies: camelcase-css: 2.0.1 - postcss: 8.4.28 - - postcss-load-config@4.0.2(postcss@8.4.28)(ts-node@10.9.2(@types/node@20.5.4)(typescript@4.9.5)): - dependencies: - lilconfig: 3.1.1 - yaml: 2.4.2 - optionalDependencies: - postcss: 8.4.28 - ts-node: 10.9.2(@types/node@20.5.4)(typescript@4.9.5) + postcss: 8.5.16 - postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5)): + postcss-load-config@4.0.2(postcss@8.5.16)(ts-node@10.9.2(@types/node@20.5.4)(typescript@6.0.3)): dependencies: lilconfig: 3.1.1 - yaml: 2.4.2 + yaml: 2.9.0 optionalDependencies: - postcss: 8.4.38 - ts-node: 10.9.2(@types/node@20.5.1)(typescript@4.9.5) + postcss: 8.5.16 + ts-node: 10.9.2(@types/node@20.5.4)(typescript@6.0.3) - postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.5.4)(typescript@4.9.5)): + postcss-load-config@6.0.1(jiti@2.7.0)(postcss@8.5.16)(yaml@2.9.0): dependencies: lilconfig: 3.1.1 - yaml: 2.4.2 optionalDependencies: - postcss: 8.4.38 - ts-node: 10.9.2(@types/node@20.5.4)(typescript@4.9.5) + jiti: 2.7.0 + postcss: 8.5.16 + yaml: 2.9.0 - postcss-nested@6.0.1(postcss@8.4.28): + postcss-nested@6.0.1(postcss@8.5.16): dependencies: - postcss: 8.4.28 + postcss: 8.5.16 postcss-selector-parser: 6.1.0 - postcss-selector-parser@6.0.10: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - postcss-selector-parser@6.1.0: dependencies: cssesc: 3.0.0 @@ -13101,19 +11794,11 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.4.28: - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 - - postcss@8.4.38: + postcss@8.5.16: dependencies: - nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 - - preact@10.22.0: {} + nanoid: 3.3.15 + picocolors: 1.1.1 + source-map-js: 1.2.1 preferred-pm@3.1.3: dependencies: @@ -13132,7 +11817,7 @@ snapshots: dependencies: '@prettier/cli': 0.6.0(prettier@4.0.0-alpha.10) - pretty-bytes@6.1.1: {} + prettier@4.0.0-alpha.13: {} pretty-format@27.5.1: dependencies: @@ -13146,43 +11831,26 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 - process-nextick-args@2.0.1: {} - - process@0.11.10: {} - promise-make-naked@2.1.2: {} promise-resolve-timeout@2.0.1: {} property-information@6.5.0: {} - pseudomap@1.0.2: {} + property-information@7.2.0: {} - psl@1.9.0: {} + pseudomap@1.0.2: {} punycode@2.3.1: {} - querystringify@2.2.0: {} + quansync@0.2.11: {} queue-microtask@1.2.3: {} - queue-tick@1.0.1: {} - quick-lru@4.0.1: {} radix3@1.1.2: {} - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - range-parser@1.2.1: {} - - rc9@2.1.2: - dependencies: - defu: 6.1.4 - destr: 2.0.3 - react-is@17.0.2: {} react-is@18.3.1: {} @@ -13211,56 +11879,62 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - readable-stream@4.5.2: + readdirp@3.6.0: dependencies: - abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - string_decoder: 1.3.0 + picomatch: 2.3.1 - readdir-glob@1.1.3: + readdirp@4.1.2: {} + + readdirp@5.0.0: + optional: true + + recma-build-jsx@1.0.0: dependencies: - minimatch: 5.1.6 + '@types/estree': 1.0.9 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.1 - readdirp@3.6.0: + recma-jsx@1.0.1(acorn@8.17.0): dependencies: - picomatch: 2.3.1 + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 - recast@0.23.9: + recma-parse@1.0.0: dependencies: - ast-types: 0.16.1 - esprima: 4.0.1 - source-map: 0.6.1 - tiny-invariant: 1.3.3 - tslib: 2.6.2 + '@types/estree': 1.0.9 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.1 + + recma-stringify@1.0.0: + dependencies: + '@types/estree': 1.0.9 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.1 redent@3.0.0: dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 - redis-errors@1.2.0: {} + redis-errors@1.2.0: + optional: true redis-parser@3.0.0: dependencies: redis-errors: 1.2.0 + optional: true regenerate-unicode-properties@10.1.1: dependencies: @@ -13268,14 +11942,31 @@ snapshots: regenerate@1.4.2: {} - regenerator-runtime@0.13.11: {} - regenerator-runtime@0.14.1: {} regenerator-transform@0.15.2: dependencies: '@babel/runtime': 7.24.6 + regex-recursion@5.1.1: + dependencies: + regex: 5.1.1 + regex-utilities: 2.3.0 + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@5.1.1: + dependencies: + regex-utilities: 2.3.0 + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + regexp.prototype.flags@1.5.2: dependencies: call-bind: 1.0.7 @@ -13296,21 +11987,18 @@ snapshots: dependencies: jsesc: 0.5.0 - rehype-parse@9.0.0: + rehype-autolink-headings@7.1.0: dependencies: '@types/hast': 3.0.4 - hast-util-from-html: 2.0.1 - unified: 11.0.4 + '@ungap/structured-clone': 1.2.0 + hast-util-heading-rank: 3.0.0 + hast-util-is-element: 3.0.0 + unified: 11.0.5 + unist-util-visit: 5.1.0 - rehype-pretty-code@0.12.3(shikiji@0.9.19): + rehype-expressive-code@0.41.7: dependencies: - '@types/hast': 3.0.4 - hast-util-to-string: 3.0.0 - parse-numeric-range: 1.3.0 - rehype-parse: 9.0.0 - shikiji: 0.9.19 - unified: 11.0.4 - unist-util-visit: 5.0.0 + expressive-code: 0.41.7 rehype-raw@7.0.0: dependencies: @@ -13318,26 +12006,52 @@ snapshots: hast-util-raw: 9.0.3 vfile: 6.0.1 + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.9 + '@types/hast': 3.0.4 + hast-util-to-estree: 3.1.0 + transitivePeerDependencies: + - supports-color + rehype-slug@6.0.0: dependencies: '@types/hast': 3.0.4 github-slugger: 2.0.0 hast-util-heading-rank: 3.0.0 hast-util-to-string: 3.0.0 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 + + remark-directive@3.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-directive: 3.1.0 + micromark-extension-directive: 3.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-frontmatter@5.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-frontmatter: 2.0.1 + micromark-extension-frontmatter: 2.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color - remark-gfm@4.0.0: + remark-gfm@4.0.1: dependencies: '@types/mdast': 4.0.4 - mdast-util-gfm: 3.0.0 + mdast-util-gfm: 3.1.0 micromark-extension-gfm: 3.0.0 remark-parse: 11.0.0 remark-stringify: 11.0.0 - unified: 11.0.4 + unified: 11.0.5 transitivePeerDependencies: - supports-color - remark-mdx@3.0.1: + remark-mdx@3.1.1: dependencies: mdast-util-mdx: 3.0.0 micromark-extension-mdxjs: 3.0.0 @@ -13347,9 +12061,9 @@ snapshots: remark-parse@11.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.1 + mdast-util-from-markdown: 2.0.3 micromark-util-types: 2.0.0 - unified: 11.0.4 + unified: 11.0.5 transitivePeerDependencies: - supports-color @@ -13357,30 +12071,24 @@ snapshots: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - mdast-util-to-hast: 13.1.0 - unified: 11.0.4 + mdast-util-to-hast: 13.2.1 + unified: 11.0.5 vfile: 6.0.1 - remark-shiki-twoslash@3.1.3(typescript@4.9.5): - dependencies: - '@types/unist': 2.0.10 - '@typescript/twoslash': 3.1.0 - '@typescript/vfs': 1.3.4 - fenceparser: 1.1.1 - regenerator-runtime: 0.13.11 - shiki: 0.10.1 - shiki-twoslash: 3.1.2(typescript@4.9.5) - tslib: 2.1.0 - typescript: 4.9.5 - unist-util-visit: 2.0.3 - transitivePeerDependencies: - - supports-color - remark-stringify@11.0.0: dependencies: '@types/mdast': 4.0.4 mdast-util-to-markdown: 2.1.0 - unified: 11.0.4 + unified: 11.0.5 + + remark@15.0.1: + dependencies: + '@types/mdast': 4.0.4 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color require-directory@2.1.1: {} @@ -13388,8 +12096,6 @@ snapshots: require-main-filename@2.0.0: {} - requires-port@1.0.0: {} - resolve-dir@1.0.1: dependencies: expand-tilde: 2.0.2 @@ -13416,9 +12122,26 @@ snapshots: reusify@1.0.4: {} - rimraf@3.0.2: + rolldown@1.1.3: dependencies: - glob: 7.2.3 + '@oxc-project/types': 0.137.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.1.3 + '@rolldown/binding-darwin-arm64': 1.1.3 + '@rolldown/binding-darwin-x64': 1.1.3 + '@rolldown/binding-freebsd-x64': 1.1.3 + '@rolldown/binding-linux-arm-gnueabihf': 1.1.3 + '@rolldown/binding-linux-arm64-gnu': 1.1.3 + '@rolldown/binding-linux-arm64-musl': 1.1.3 + '@rolldown/binding-linux-ppc64-gnu': 1.1.3 + '@rolldown/binding-linux-s390x-gnu': 1.1.3 + '@rolldown/binding-linux-x64-gnu': 1.1.3 + '@rolldown/binding-linux-x64-musl': 1.1.3 + '@rolldown/binding-openharmony-arm64': 1.1.3 + '@rolldown/binding-wasm32-wasi': 1.1.3 + '@rolldown/binding-win32-arm64-msvc': 1.1.3 + '@rolldown/binding-win32-x64-msvc': 1.1.3 rollup-plugin-cleanup@3.2.1(rollup@3.28.1): dependencies: @@ -13439,7 +12162,7 @@ snapshots: commenting: 1.1.0 glob: 7.2.3 lodash: 4.17.21 - magic-string: 0.30.10 + magic-string: 0.30.21 mkdirp: 3.0.1 moment: 2.29.4 package-name-regex: 2.0.6 @@ -13447,15 +12170,6 @@ snapshots: spdx-expression-validate: 2.0.0 spdx-satisfies: 5.0.1 - rollup-plugin-visualizer@5.12.0(rollup@4.18.0): - dependencies: - open: 8.4.2 - picomatch: 2.3.1 - source-map: 0.7.4 - yargs: 17.7.2 - optionalDependencies: - rollup: 4.18.0 - rollup-pluginutils@2.8.2: dependencies: estree-walker: 0.6.1 @@ -13482,31 +12196,38 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - rollup@4.18.0: + rollup@4.62.2: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.9 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.18.0 - '@rollup/rollup-android-arm64': 4.18.0 - '@rollup/rollup-darwin-arm64': 4.18.0 - '@rollup/rollup-darwin-x64': 4.18.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 - '@rollup/rollup-linux-arm-musleabihf': 4.18.0 - '@rollup/rollup-linux-arm64-gnu': 4.18.0 - '@rollup/rollup-linux-arm64-musl': 4.18.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 - '@rollup/rollup-linux-riscv64-gnu': 4.18.0 - '@rollup/rollup-linux-s390x-gnu': 4.18.0 - '@rollup/rollup-linux-x64-gnu': 4.18.0 - '@rollup/rollup-linux-x64-musl': 4.18.0 - '@rollup/rollup-win32-arm64-msvc': 4.18.0 - '@rollup/rollup-win32-ia32-msvc': 4.18.0 - '@rollup/rollup-win32-x64-msvc': 4.18.0 + '@rollup/rollup-android-arm-eabi': 4.62.2 + '@rollup/rollup-android-arm64': 4.62.2 + '@rollup/rollup-darwin-arm64': 4.62.2 + '@rollup/rollup-darwin-x64': 4.62.2 + '@rollup/rollup-freebsd-arm64': 4.62.2 + '@rollup/rollup-freebsd-x64': 4.62.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.62.2 + '@rollup/rollup-linux-arm-musleabihf': 4.62.2 + '@rollup/rollup-linux-arm64-gnu': 4.62.2 + '@rollup/rollup-linux-arm64-musl': 4.62.2 + '@rollup/rollup-linux-loong64-gnu': 4.62.2 + '@rollup/rollup-linux-loong64-musl': 4.62.2 + '@rollup/rollup-linux-ppc64-gnu': 4.62.2 + '@rollup/rollup-linux-ppc64-musl': 4.62.2 + '@rollup/rollup-linux-riscv64-gnu': 4.62.2 + '@rollup/rollup-linux-riscv64-musl': 4.62.2 + '@rollup/rollup-linux-s390x-gnu': 4.62.2 + '@rollup/rollup-linux-x64-gnu': 4.62.2 + '@rollup/rollup-linux-x64-musl': 4.62.2 + '@rollup/rollup-openbsd-x64': 4.62.2 + '@rollup/rollup-openharmony-arm64': 4.62.2 + '@rollup/rollup-win32-arm64-msvc': 4.62.2 + '@rollup/rollup-win32-ia32-msvc': 4.62.2 + '@rollup/rollup-win32-x64-gnu': 4.62.2 + '@rollup/rollup-win32-x64-msvc': 4.62.2 fsevents: 2.3.3 - run-applescript@5.0.0: - dependencies: - execa: 5.1.1 + rou3@0.8.1: {} run-async@2.4.1: {} @@ -13525,8 +12246,6 @@ snapshots: has-symbols: 1.0.3 isarray: 2.0.5 - safe-buffer@5.1.2: {} - safe-buffer@5.2.1: {} safe-regex-test@1.0.3: @@ -13537,13 +12256,16 @@ snapshots: safer-buffer@2.1.2: {} - saxes@5.0.1: + saxes@6.0.0: dependencies: xmlchars: 2.2.0 scule@1.3.0: {} - search-insights@2.14.0: {} + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 semver@5.7.2: {} @@ -13555,46 +12277,11 @@ snapshots: semver@7.6.2: {} - send@0.18.0: - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - - serialize-javascript@6.0.2: + seroval-plugins@1.5.4(seroval@1.5.4): dependencies: - randombytes: 2.1.0 + seroval: 1.5.4 - seroval-plugins@1.0.7(seroval@1.0.7): - dependencies: - seroval: 1.0.7 - - seroval@1.0.7: {} - - serve-placeholder@2.0.1: - dependencies: - defu: 6.1.4 - - serve-static@1.15.0: - dependencies: - encodeurl: 1.0.2 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.18.0 - transitivePeerDependencies: - - supports-color + seroval@1.5.4: {} set-blocking@2.0.0: {} @@ -13614,8 +12301,6 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - setprototypeof@1.2.0: {} - shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 @@ -13628,34 +12313,27 @@ snapshots: shebang-regex@3.0.0: {} - shiki-twoslash@3.1.2(typescript@4.9.5): - dependencies: - '@typescript/twoslash': 3.1.0 - '@typescript/vfs': 1.3.4 - fenceparser: 1.1.1 - shiki: 0.10.1 - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - - shiki@0.10.1: - dependencies: - jsonc-parser: 3.2.1 - vscode-oniguruma: 1.7.0 - vscode-textmate: 5.2.0 - - shiki@0.14.7: + shiki@1.29.2: dependencies: - ansi-sequence-parser: 1.1.1 - jsonc-parser: 3.2.1 - vscode-oniguruma: 1.7.0 - vscode-textmate: 8.0.0 - - shikiji-core@0.9.19: {} + '@shikijs/core': 1.29.2 + '@shikijs/engine-javascript': 1.29.2 + '@shikijs/engine-oniguruma': 1.29.2 + '@shikijs/langs': 1.29.2 + '@shikijs/themes': 1.29.2 + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 - shikiji@0.9.19: + shiki@3.23.0: dependencies: - shikiji-core: 0.9.19 + '@shikijs/core': 3.23.0 + '@shikijs/engine-javascript': 3.23.0 + '@shikijs/engine-oniguruma': 3.23.0 + '@shikijs/langs': 3.23.0 + '@shikijs/themes': 3.23.0 + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 side-channel@1.0.6: dependencies: @@ -13670,7 +12348,7 @@ snapshots: signal-exit@4.1.0: {} - sirv@2.0.4: + sirv@3.0.2: dependencies: '@polka/url': 1.0.0-next.25 mrmime: 2.0.0 @@ -13680,10 +12358,6 @@ snapshots: slash@3.0.0: {} - slash@4.0.0: {} - - slash@5.1.0: {} - smartwrap@2.0.2: dependencies: array.prototype.flat: 1.3.2 @@ -13693,41 +12367,36 @@ snapshots: wcwidth: 1.0.1 yargs: 15.4.1 - smob@1.5.0: {} - - solid-js@1.8.15: + solid-js@1.9.14: dependencies: csstype: 3.1.3 - seroval: 1.0.7 - seroval-plugins: 1.0.7(seroval@1.0.7) - - solid-mdx@0.0.7(solid-js@1.8.15)(vite@5.1.4(@types/node@20.5.4)(terser@5.31.0)): - dependencies: - solid-js: 1.8.15 - vite: 5.1.4(@types/node@20.5.4)(terser@5.31.0) + seroval: 1.5.4 + seroval-plugins: 1.5.4(seroval@1.5.4) - solid-presence@0.1.8(solid-js@1.8.15): + solid-presence@0.1.8(solid-js@1.9.14): dependencies: - '@corvu/utils': 0.4.1(solid-js@1.8.15) - solid-js: 1.8.15 + '@corvu/utils': 0.4.1(solid-js@1.9.14) + solid-js: 1.9.14 - solid-prevent-scroll@0.1.7(solid-js@1.8.15): + solid-prevent-scroll@0.1.7(solid-js@1.9.14): dependencies: - '@corvu/utils': 0.2.0(solid-js@1.8.15) - solid-js: 1.8.15 + '@corvu/utils': 0.2.0(solid-js@1.9.14) + solid-js: 1.9.14 - solid-refresh@0.6.3(solid-js@1.8.15): + solid-refresh@0.6.3(solid-js@1.9.14): dependencies: - '@babel/generator': 7.24.6 - '@babel/helper-module-imports': 7.24.6 - '@babel/types': 7.24.6 - solid-js: 1.8.15 + '@babel/generator': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/types': 7.29.7 + solid-js: 1.9.14 + transitivePeerDependencies: + - supports-color - solid-use@0.8.0(solid-js@1.8.15): + solid-use@0.9.1(solid-js@1.9.14): dependencies: - solid-js: 1.8.15 + solid-js: 1.9.14 - source-map-js@1.2.0: {} + source-map-js@1.2.1: {} source-map-support@0.5.21: dependencies: @@ -13736,7 +12405,7 @@ snapshots: source-map@0.6.1: {} - source-map@0.7.4: {} + source-map@0.7.6: {} source-map@0.8.0-beta.0: dependencies: @@ -13796,38 +12465,25 @@ snapshots: sprintf-js@1.0.3: {} - stack-trace@1.0.0-pre2: {} + srvx@0.11.18: {} stackback@0.0.2: {} stackframe@1.3.4: {} - standard-as-callback@2.1.0: {} - - statuses@2.0.1: {} + standard-as-callback@2.1.0: + optional: true std-env@3.7.0: {} - stdin-blocker@2.0.0: {} + std-env@4.2.0: {} - stop-iteration-iterator@1.0.0: - dependencies: - internal-slot: 1.0.7 + stdin-blocker@2.0.0: {} stream-transform@2.1.3: dependencies: mixme: 0.5.10 - streamsearch@1.1.0: {} - - streamx@2.18.0: - dependencies: - fast-fifo: 1.3.2 - queue-tick: 1.0.1 - text-decoder: 1.1.0 - optionalDependencies: - bare-events: 2.3.1 - string-escape-regex@1.0.0: {} string-width@4.2.3: @@ -13861,10 +12517,6 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -13882,6 +12534,8 @@ snapshots: dependencies: ansi-regex: 6.0.1 + strip-bom-string@1.0.0: {} + strip-bom@3.0.0: {} strip-bom@4.0.0: {} @@ -13898,7 +12552,11 @@ snapshots: strip-literal@2.1.0: dependencies: - js-tokens: 9.0.0 + js-tokens: 9.0.1 + + strip-literal@3.1.0: + dependencies: + js-tokens: 9.0.1 stubborn-fs@1.2.5: {} @@ -13912,7 +12570,7 @@ snapshots: sucrase@3.35.0: dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.13 commander: 4.1.1 glob: 10.4.1 lines-and-columns: 1.2.4 @@ -13928,74 +12586,51 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-color@9.4.0: {} - supports-preserve-symlinks-flag@1.0.0: {} symbol-tree@3.2.4: {} - system-architecture@0.1.0: {} - - tailwindcss@3.3.3(ts-node@10.9.2(@types/node@20.5.4)(typescript@4.9.5)): + tailwindcss@3.3.3(ts-node@10.9.2(@types/node@20.5.4)(typescript@6.0.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 chokidar: 3.6.0 didyoumean: 1.2.2 dlv: 1.1.3 - fast-glob: 3.3.2 + fast-glob: 3.3.3 glob-parent: 6.0.2 is-glob: 4.0.3 jiti: 1.21.0 lilconfig: 2.1.0 - micromatch: 4.0.7 + micromatch: 4.0.8 normalize-path: 3.0.0 object-hash: 3.0.0 - picocolors: 1.0.1 - postcss: 8.4.28 - postcss-import: 15.1.0(postcss@8.4.28) - postcss-js: 4.0.1(postcss@8.4.28) - postcss-load-config: 4.0.2(postcss@8.4.28)(ts-node@10.9.2(@types/node@20.5.4)(typescript@4.9.5)) - postcss-nested: 6.0.1(postcss@8.4.28) + picocolors: 1.1.1 + postcss: 8.5.16 + postcss-import: 15.1.0(postcss@8.5.16) + postcss-js: 4.0.1(postcss@8.5.16) + postcss-load-config: 4.0.2(postcss@8.5.16)(ts-node@10.9.2(@types/node@20.5.4)(typescript@6.0.3)) + postcss-nested: 6.0.1(postcss@8.5.16) postcss-selector-parser: 6.1.0 resolve: 1.22.8 sucrase: 3.35.0 transitivePeerDependencies: - ts-node - tar-stream@3.1.7: - dependencies: - b4a: 1.6.6 - fast-fifo: 1.3.2 - streamx: 2.18.0 - - tar@6.2.1: - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - term-size@2.2.1: {} - terracotta@1.0.5(solid-js@1.8.15): + terracotta@1.1.0(solid-js@1.9.14): dependencies: - solid-js: 1.8.15 - solid-use: 0.8.0(solid-js@1.8.15) + solid-js: 1.9.14 + solid-use: 0.9.1(solid-js@1.9.14) terser@5.31.0: dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.10.0 + acorn: 8.17.0 commander: 2.20.3 source-map-support: 0.5.21 - text-decoder@1.1.0: - dependencies: - b4a: 1.6.6 - text-extensions@1.9.0: {} thenify-all@1.6.0: @@ -14022,21 +12657,17 @@ snapshots: tiny-parse-argv: 2.8.1 tiny-updater: 3.5.3 - tiny-colors@2.2.0: {} - tiny-colors@2.2.2: {} tiny-cursor@2.0.0: dependencies: - when-exit: 2.1.2 + when-exit: 2.1.4 tiny-editorconfig@1.0.0: dependencies: ini-simple-parser: 1.0.0 zeptomatch: 1.2.2 - tiny-invariant@1.3.3: {} - tiny-jsonc@1.0.1: {} tiny-levenshtein@1.0.1: {} @@ -14058,7 +12689,7 @@ snapshots: tiny-spinner@2.0.3: dependencies: stdin-blocker: 2.0.0 - tiny-colors: 2.2.0 + tiny-colors: 2.2.2 tiny-cursor: 2.0.0 tiny-truncate: 1.0.2 @@ -14072,42 +12703,50 @@ snapshots: tiny-colors: 2.2.2 when-exit: 2.1.4 - tinybench@2.8.0: {} + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyexec@1.2.4: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 tinypool@0.8.4: {} + tinyrainbow@3.1.0: {} + tinyspy@2.2.1: {} - titleize@3.0.0: {} + tldts-core@7.4.8: {} + + tldts@7.4.8: + dependencies: + tldts-core: 7.4.8 tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 - to-fast-properties@2.0.0: {} - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - toidentifier@1.0.1: {} + toml@3.0.0: {} totalist@3.0.1: {} - tough-cookie@4.1.4: + tough-cookie@6.0.2: dependencies: - psl: 1.9.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 - - tr46@0.0.3: {} + tldts: 7.4.8 tr46@1.0.1: dependencies: punycode: 2.3.1 - tr46@3.0.0: + tr46@6.0.0: dependencies: punycode: 2.3.1 @@ -14117,13 +12756,11 @@ snapshots: trim-newlines@3.0.1: {} - trough@1.0.5: {} - trough@2.2.0: {} ts-interface-checker@0.1.13: {} - ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5): + ts-node@10.9.2(@types/node@20.5.1)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -14131,17 +12768,17 @@ snapshots: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 20.5.1 - acorn: 8.10.0 + acorn: 8.17.0 acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.9.5 + typescript: 5.9.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - ts-node@10.9.2(@types/node@20.5.4)(typescript@4.9.5): + ts-node@10.9.2(@types/node@20.5.4)(typescript@6.0.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -14149,66 +12786,69 @@ snapshots: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 20.5.4 - acorn: 8.10.0 + acorn: 8.17.0 acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.9.5 + typescript: 6.0.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optional: true - tslib@2.1.0: {} - tslib@2.6.2: {} - tsup@7.2.0(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5))(typescript@4.9.5): + tsup@7.2.0(postcss@8.5.16)(ts-node@10.9.2(@types/node@20.5.4)(typescript@6.0.3))(typescript@6.0.3): dependencies: bundle-require: 4.2.1(esbuild@0.18.20) cac: 6.7.14 chokidar: 3.6.0 - debug: 4.3.5 + debug: 4.4.3 esbuild: 0.18.20 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5)) + postcss-load-config: 4.0.2(postcss@8.5.16)(ts-node@10.9.2(@types/node@20.5.4)(typescript@6.0.3)) resolve-from: 5.0.0 rollup: 3.28.1 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tree-kill: 1.2.2 optionalDependencies: - postcss: 8.4.38 - typescript: 4.9.5 + postcss: 8.5.16 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - ts-node - tsup@7.2.0(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.5.4)(typescript@4.9.5))(typescript@4.9.5): + tsup@8.5.1(jiti@2.7.0)(postcss@8.5.16)(typescript@6.0.3)(yaml@2.9.0): dependencies: - bundle-require: 4.2.1(esbuild@0.18.20) + bundle-require: 5.1.0(esbuild@0.27.7) cac: 6.7.14 - chokidar: 3.6.0 - debug: 4.3.5 - esbuild: 0.18.20 - execa: 5.1.1 - globby: 11.1.0 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.3 + esbuild: 0.27.7 + fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 - postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.5.4)(typescript@4.9.5)) + picocolors: 1.1.1 + postcss-load-config: 6.0.1(jiti@2.7.0)(postcss@8.5.16)(yaml@2.9.0) resolve-from: 5.0.0 - rollup: 3.28.1 - source-map: 0.8.0-beta.0 + rollup: 4.62.2 + source-map: 0.7.6 sucrase: 3.35.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.17 tree-kill: 1.2.2 optionalDependencies: - postcss: 8.4.38 - typescript: 4.9.5 + postcss: 8.5.16 + typescript: 6.0.3 transitivePeerDependencies: + - jiti - supports-color - - ts-node + - tsx + - yaml tty-table@4.2.3: dependencies: @@ -14247,6 +12887,16 @@ snapshots: turbo-windows-64: 1.10.13 turbo-windows-arm64: 1.10.13 + twoslash-protocol@0.2.12: {} + + twoslash@0.2.12(typescript@5.9.3): + dependencies: + '@typescript/vfs': 1.6.4(typescript@5.9.3) + twoslash-protocol: 0.2.12 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + type-detect@4.0.8: {} type-fest@0.13.1: {} @@ -14259,10 +12909,6 @@ snapshots: type-fest@0.8.1: {} - type-fest@2.19.0: {} - - type-fest@3.13.1: {} - typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.7 @@ -14297,7 +12943,11 @@ snapshots: typescript@4.9.5: {} - ufo@1.5.3: {} + typescript@5.9.3: {} + + typescript@6.0.3: {} + + ufo@1.6.4: {} unbox-primitive@1.0.2: dependencies: @@ -14306,32 +12956,11 @@ snapshots: has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - uncrypto@0.1.3: {} - - unctx@2.3.1: - dependencies: - acorn: 8.10.0 - estree-walker: 3.0.3 - magic-string: 0.30.10 - unplugin: 1.10.1 - - undici-types@5.28.4: {} - - undici@5.23.0: - dependencies: - busboy: 1.6.0 - - undici@5.28.4: - dependencies: - '@fastify/busboy': 2.1.1 + undici@7.28.0: {} - unenv@1.9.0: + unenv@2.0.0-rc.24: dependencies: - consola: 3.2.3 - defu: 6.1.4 - mime: 3.0.0 - node-fetch-native: 1.6.4 - pathe: 1.1.2 + pathe: 2.0.3 unicode-canonical-property-names-ecmascript@2.0.0: {} @@ -14344,9 +12973,7 @@ snapshots: unicode-property-aliases-ecmascript@2.1.0: {} - unicorn-magic@0.1.0: {} - - unified@11.0.4: + unified@11.0.5: dependencies: '@types/unist': 3.0.2 bail: 2.0.2 @@ -14356,82 +12983,64 @@ snapshots: trough: 2.2.0 vfile: 6.0.1 - unified@9.2.2: - dependencies: - '@types/unist': 2.0.10 - bail: 1.0.5 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 2.1.0 - trough: 1.0.5 - vfile: 4.2.1 - - unimport@3.7.2(rollup@4.18.0): + unimport@4.2.0: dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) - acorn: 8.11.3 + acorn: 8.17.0 escape-string-regexp: 5.0.0 estree-walker: 3.0.3 - fast-glob: 3.3.2 - local-pkg: 0.5.0 - magic-string: 0.30.10 - mlly: 1.7.0 - pathe: 1.1.2 - pkg-types: 1.1.1 + local-pkg: 1.2.1 + magic-string: 0.30.21 + mlly: 1.8.2 + pathe: 2.0.3 + picomatch: 4.0.4 + pkg-types: 2.3.1 scule: 1.3.0 - strip-literal: 2.1.0 - unplugin: 1.10.1 - transitivePeerDependencies: - - rollup + strip-literal: 3.1.0 + tinyglobby: 0.2.17 + unplugin: 2.3.11 + unplugin-utils: 0.2.5 - unist-util-is@4.1.0: {} - - unist-util-is@6.0.0: + unist-builder@4.0.0: dependencies: '@types/unist': 3.0.2 - unist-util-position-from-estree@2.0.0: + unist-util-find-after@5.0.0: dependencies: '@types/unist': 3.0.2 + unist-util-is: 6.0.0 - unist-util-position@5.0.0: + unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.2 - unist-util-remove-position@5.0.0: + unist-util-mdx-define@1.1.2: dependencies: - '@types/unist': 3.0.2 - unist-util-visit: 5.0.0 + '@types/estree': 1.0.9 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + vfile: 6.0.1 - unist-util-stringify-position@2.0.3: + unist-util-position-from-estree@2.0.0: dependencies: - '@types/unist': 2.0.10 + '@types/unist': 3.0.2 - unist-util-stringify-position@3.0.3: + unist-util-position@5.0.0: dependencies: - '@types/unist': 2.0.10 + '@types/unist': 3.0.2 unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.2 - unist-util-visit-parents@3.1.1: - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 4.1.0 - unist-util-visit-parents@6.0.1: dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 - unist-util-visit@2.0.3: - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 4.1.0 - unist-util-visit-parents: 3.1.1 - - unist-util-visit@5.0.0: + unist-util-visit@5.1.0: dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 @@ -14439,70 +13048,57 @@ snapshots: universalify@0.1.2: {} - universalify@0.2.0: {} - universalify@2.0.1: {} - unplugin@1.10.1: + unplugin-auto-import@19.3.0: dependencies: - acorn: 8.11.3 - chokidar: 3.6.0 - webpack-sources: 3.2.3 - webpack-virtual-modules: 0.6.1 + local-pkg: 1.2.1 + magic-string: 0.30.21 + picomatch: 4.0.4 + unimport: 4.2.0 + unplugin: 2.3.11 + unplugin-utils: 0.2.5 - unstorage@1.10.2(ioredis@5.4.1): + unplugin-icons@22.5.0: dependencies: - anymatch: 3.1.3 - chokidar: 3.6.0 - destr: 2.0.3 - h3: 1.11.1 - listhen: 1.7.2 - lru-cache: 10.2.2 - mri: 1.2.0 - node-fetch-native: 1.6.4 - ofetch: 1.3.4 - ufo: 1.5.3 - optionalDependencies: - ioredis: 5.4.1 + '@antfu/install-pkg': 1.1.0 + '@iconify/utils': 3.1.4 + debug: 4.4.3 + local-pkg: 1.2.1 + unplugin: 2.3.11 transitivePeerDependencies: - - uWebSockets.js - - untildify@4.0.0: {} + - supports-color - untun@0.1.3: + unplugin-utils@0.2.5: dependencies: - citty: 0.1.6 - consola: 3.2.3 - pathe: 1.1.2 + pathe: 2.0.3 + picomatch: 4.0.4 - unwasm@0.3.9: + unplugin@2.3.11: dependencies: - knitwork: 1.1.0 - magic-string: 0.30.10 - mlly: 1.7.0 - pathe: 1.1.2 - pkg-types: 1.1.1 - unplugin: 1.10.1 + '@jridgewell/remapping': 2.3.5 + acorn: 8.17.0 + picomatch: 4.0.4 + webpack-virtual-modules: 0.6.2 - update-browserslist-db@1.0.16(browserslist@4.23.0): - dependencies: - browserslist: 4.23.0 - escalade: 3.1.2 - picocolors: 1.0.1 + unstorage@2.0.0-alpha.7(chokidar@5.0.0)(db0@0.3.4)(ioredis@5.11.1)(lru-cache@11.5.1)(ofetch@2.0.0-alpha.3): + optionalDependencies: + chokidar: 5.0.0 + db0: 0.3.4 + ioredis: 5.11.1 + lru-cache: 11.5.1 + ofetch: 2.0.0-alpha.3 - uqr@0.1.2: {} + update-browserslist-db@1.2.3(browserslist@4.28.4): + dependencies: + browserslist: 4.28.4 + escalade: 3.2.0 + picocolors: 1.1.1 uri-js@4.4.1: dependencies: punycode: 2.3.1 - url-parse@1.5.10: - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - - urlpattern-polyfill@8.0.2: {} - util-deprecate@1.0.2: {} v8-compile-cache-lib@3.0.1: {} @@ -14519,125 +13115,24 @@ snapshots: '@types/unist': 3.0.2 vfile: 6.0.1 - vfile-message@2.0.4: - dependencies: - '@types/unist': 2.0.10 - unist-util-stringify-position: 2.0.3 - - vfile-message@3.1.4: - dependencies: - '@types/unist': 2.0.10 - unist-util-stringify-position: 3.0.3 - vfile-message@4.0.2: dependencies: '@types/unist': 3.0.2 unist-util-stringify-position: 4.0.0 - vfile@4.2.1: - dependencies: - '@types/unist': 2.0.10 - is-buffer: 2.0.5 - unist-util-stringify-position: 2.0.3 - vfile-message: 2.0.4 - - vfile@5.3.7: - dependencies: - '@types/unist': 2.0.10 - is-buffer: 2.0.5 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 - vfile@6.0.1: dependencies: '@types/unist': 3.0.2 unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - vinxi@0.3.9(@opentelemetry/api@1.8.0)(@testing-library/jest-dom@6.4.2(vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0)))(@types/node@20.5.4)(ioredis@5.4.1)(preact@10.22.0)(rollup@4.18.0)(terser@5.31.0): - dependencies: - '@babel/core': 7.24.6 - '@babel/plugin-syntax-jsx': 7.24.6(@babel/core@7.24.6) - '@babel/plugin-syntax-typescript': 7.24.6(@babel/core@7.24.6) - '@types/micromatch': 4.0.7 - '@types/serve-static': 1.15.7 - '@types/ws': 8.5.10 - '@vinxi/devtools': 0.2.0(@babel/core@7.24.6)(@testing-library/jest-dom@6.4.2(vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0)))(preact@10.22.0)(rollup@4.18.0)(vite@5.1.4(@types/node@20.5.4)(terser@5.31.0)) - '@vinxi/listhen': 1.5.6 - boxen: 7.1.1 - chokidar: 3.6.0 - citty: 0.1.6 - consola: 3.2.3 - crossws: 0.2.4 - dax-sh: 0.39.2 - defu: 6.1.4 - es-module-lexer: 1.5.3 - esbuild: 0.18.20 - fast-glob: 3.3.2 - get-port-please: 3.1.2 - h3: 1.11.1 - hookable: 5.5.3 - http-proxy: 1.18.1 - micromatch: 4.0.7 - nitropack: 2.9.6(@opentelemetry/api@1.8.0) - node-fetch-native: 1.6.4 - path-to-regexp: 6.2.2 - pathe: 1.1.2 - radix3: 1.1.2 - resolve: 1.22.8 - serve-placeholder: 2.0.1 - serve-static: 1.15.0 - ufo: 1.5.3 - unctx: 2.3.1 - unenv: 1.9.0 - unstorage: 1.10.2(ioredis@5.4.1) - vite: 5.1.4(@types/node@20.5.4)(terser@5.31.0) - ws: 8.17.0 - zod: 3.23.8 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@libsql/client' - - '@netlify/blobs' - - '@nuxt/kit' - - '@opentelemetry/api' - - '@planetscale/database' - - '@testing-library/jest-dom' - - '@types/node' - - '@upstash/redis' - - '@vercel/kv' - - better-sqlite3 - - bufferutil - - debug - - drizzle-orm - - encoding - - idb-keyval - - ioredis - - less - - lightningcss - - preact - - rollup - - sass - - stylus - - sugarss - - supports-color - - terser - - uWebSockets.js - - utf-8-validate - - xml2js - - vite-node@1.3.1(@types/node@20.5.4)(terser@5.31.0): + vite-node@1.3.1(@types/node@20.5.4)(lightningcss@1.32.0)(terser@5.31.0): dependencies: cac: 6.7.14 - debug: 4.3.5 + debug: 4.4.3 pathe: 1.1.2 - picocolors: 1.0.1 - vite: 5.1.4(@types/node@20.5.4)(terser@5.31.0) + picocolors: 1.1.1 + vite: 5.0.11(@types/node@20.5.4)(lightningcss@1.32.0)(terser@5.31.0) transitivePeerDependencies: - '@types/node' - less @@ -14648,80 +13143,52 @@ snapshots: - supports-color - terser - vite-plugin-inspect@0.7.42(rollup@4.18.0)(vite@5.1.4(@types/node@20.5.4)(terser@5.31.0)): - dependencies: - '@antfu/utils': 0.7.8 - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) - debug: 4.3.5 - error-stack-parser-es: 0.1.4 - fs-extra: 11.2.0 - open: 9.1.0 - picocolors: 1.0.1 - sirv: 2.0.4 - vite: 5.1.4(@types/node@20.5.4)(terser@5.31.0) - transitivePeerDependencies: - - rollup - - supports-color - - vite-plugin-solid@2.9.1(@testing-library/jest-dom@6.4.2(vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0)))(solid-js@1.8.15)(vite@5.1.4(@types/node@20.5.4)(terser@5.31.0)): - dependencies: - '@babel/core': 7.24.6 - '@types/babel__core': 7.20.5 - babel-preset-solid: 1.8.17(@babel/core@7.24.6) - merge-anything: 5.1.7 - solid-js: 1.8.15 - solid-refresh: 0.6.3(solid-js@1.8.15) - vite: 5.1.4(@types/node@20.5.4)(terser@5.31.0) - vitefu: 0.2.5(vite@5.1.4(@types/node@20.5.4)(terser@5.31.0)) - optionalDependencies: - '@testing-library/jest-dom': 6.4.2(vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0)) - transitivePeerDependencies: - - supports-color - - vite-plugin-solid@2.9.1(@testing-library/jest-dom@6.4.2(vitest@1.3.1))(solid-js@1.8.15)(vite@5.0.11(@types/node@20.5.4)(terser@5.31.0)): + vite-plugin-solid@2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.14)(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0)): dependencies: - '@babel/core': 7.24.6 + '@babel/core': 7.29.7 '@types/babel__core': 7.20.5 - babel-preset-solid: 1.8.17(@babel/core@7.24.6) + babel-preset-solid: 1.8.17(@babel/core@7.29.7) merge-anything: 5.1.7 - solid-js: 1.8.15 - solid-refresh: 0.6.3(solid-js@1.8.15) - vite: 5.0.11(@types/node@20.5.4)(terser@5.31.0) - vitefu: 0.2.5(vite@5.0.11(@types/node@20.5.4)(terser@5.31.0)) + solid-js: 1.9.14 + solid-refresh: 0.6.3(solid-js@1.9.14) + vite: 8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0) + vitefu: 1.1.3(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0)) optionalDependencies: - '@testing-library/jest-dom': 6.4.2(vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0)) + '@testing-library/jest-dom': 6.9.1 transitivePeerDependencies: - supports-color - vite@5.0.11(@types/node@20.5.4)(terser@5.31.0): + vite@5.0.11(@types/node@20.5.4)(lightningcss@1.32.0)(terser@5.31.0): dependencies: esbuild: 0.19.12 - postcss: 8.4.38 - rollup: 4.18.0 + postcss: 8.5.16 + rollup: 4.62.2 optionalDependencies: '@types/node': 20.5.4 fsevents: 2.3.3 + lightningcss: 1.32.0 terser: 5.31.0 - vite@5.1.4(@types/node@20.5.4)(terser@5.31.0): + vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0): dependencies: - esbuild: 0.19.12 - postcss: 8.4.38 - rollup: 4.18.0 + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.16 + rolldown: 1.1.3 + tinyglobby: 0.2.17 optionalDependencies: '@types/node': 20.5.4 + esbuild: 0.27.7 fsevents: 2.3.3 + jiti: 2.7.0 terser: 5.31.0 + yaml: 2.9.0 - vitefu@0.2.5(vite@5.0.11(@types/node@20.5.4)(terser@5.31.0)): - optionalDependencies: - vite: 5.0.11(@types/node@20.5.4)(terser@5.31.0) - - vitefu@0.2.5(vite@5.1.4(@types/node@20.5.4)(terser@5.31.0)): + vitefu@1.1.3(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0)): optionalDependencies: - vite: 5.1.4(@types/node@20.5.4)(terser@5.31.0) + vite: 8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0) - vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@1.6.0(vitest@1.3.1))(jsdom@19.0.0)(terser@5.31.0): + vitest@1.3.1(@types/node@20.5.4)(@vitest/ui@4.1.10(vitest@4.1.10))(jsdom@29.1.1)(lightningcss@1.32.0)(terser@5.31.0): dependencies: '@vitest/expect': 1.3.1 '@vitest/runner': 1.3.1 @@ -14730,23 +13197,23 @@ snapshots: '@vitest/utils': 1.3.1 acorn-walk: 8.3.2 chai: 4.4.1 - debug: 4.3.5 + debug: 4.4.3 execa: 8.0.1 local-pkg: 0.5.0 - magic-string: 0.30.10 + magic-string: 0.30.21 pathe: 1.1.2 - picocolors: 1.0.1 + picocolors: 1.1.1 std-env: 3.7.0 strip-literal: 2.1.0 - tinybench: 2.8.0 + tinybench: 2.9.0 tinypool: 0.8.4 - vite: 5.1.4(@types/node@20.5.4)(terser@5.31.0) - vite-node: 1.3.1(@types/node@20.5.4)(terser@5.31.0) - why-is-node-running: 2.2.2 + vite: 5.0.11(@types/node@20.5.4)(lightningcss@1.32.0)(terser@5.31.0) + vite-node: 1.3.1(@types/node@20.5.4)(lightningcss@1.32.0)(terser@5.31.0) + why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.5.4 - '@vitest/ui': 1.6.0(vitest@1.3.1) - jsdom: 19.0.0 + '@vitest/ui': 4.1.10(vitest@4.1.10) + jsdom: 29.1.1 transitivePeerDependencies: - less - lightningcss @@ -14756,19 +13223,38 @@ snapshots: - supports-color - terser - vscode-oniguruma@1.7.0: {} - - vscode-textmate@5.2.0: {} - - vscode-textmate@8.0.0: {} - - w3c-hr-time@1.0.2: - dependencies: - browser-process-hrtime: 1.0.0 + vitest@4.1.10(@types/node@20.5.4)(@vitest/ui@4.1.10)(jsdom@29.1.1)(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0)): + dependencies: + '@vitest/expect': 4.1.10 + '@vitest/mocker': 4.1.10(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.10 + '@vitest/runner': 4.1.10 + '@vitest/snapshot': 4.1.10 + '@vitest/spy': 4.1.10 + '@vitest/utils': 4.1.10 + es-module-lexer: 2.2.0 + expect-type: 1.4.0 + magic-string: 0.30.21 + obug: 2.1.3 + pathe: 2.0.3 + picomatch: 4.0.4 + std-env: 4.2.0 + tinybench: 2.9.0 + tinyexec: 1.2.4 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.0 + vite: 8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.5.4 + '@vitest/ui': 4.1.10(vitest@4.1.10) + jsdom: 29.1.1 + transitivePeerDependencies: + - msw - w3c-xmlserializer@3.0.0: + w3c-xmlserializer@5.0.0: dependencies: - xml-name-validator: 4.0.0 + xml-name-validator: 5.0.0 wcwidth@1.0.1: dependencies: @@ -14776,38 +13262,23 @@ snapshots: web-namespaces@2.0.1: {} - webidl-conversions@3.0.1: {} - webidl-conversions@4.0.2: {} - webidl-conversions@7.0.0: {} - - webpack-sources@3.2.3: {} + webidl-conversions@8.0.1: {} - webpack-virtual-modules@0.6.1: {} + webpack-virtual-modules@0.6.2: {} webworker-shim@1.1.0: {} - whatwg-encoding@2.0.0: - dependencies: - iconv-lite: 0.6.3 - - whatwg-mimetype@3.0.0: {} - - whatwg-url@10.0.0: - dependencies: - tr46: 3.0.0 - webidl-conversions: 7.0.0 - - whatwg-url@11.0.0: - dependencies: - tr46: 3.0.0 - webidl-conversions: 7.0.0 + whatwg-mimetype@5.0.0: {} - whatwg-url@5.0.0: + whatwg-url@16.0.1: dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 + '@exodus/bytes': 1.15.1 + tr46: 6.0.0 + webidl-conversions: 8.0.1 + transitivePeerDependencies: + - '@noble/hashes' whatwg-url@7.1.0: dependencies: @@ -14815,8 +13286,6 @@ snapshots: tr46: 1.0.1 webidl-conversions: 4.0.2 - when-exit@2.1.2: {} - when-exit@2.1.4: {} which-boxed-primitive@1.0.2: @@ -14827,13 +13296,6 @@ snapshots: is-string: 1.0.7 is-symbol: 1.0.4 - which-collection@1.0.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.3 - which-module@2.0.1: {} which-pm@2.0.0: @@ -14857,23 +13319,11 @@ snapshots: dependencies: isexe: 2.0.0 - which@4.0.0: - dependencies: - isexe: 3.1.1 - - why-is-node-running@2.2.2: + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 - wide-align@1.1.5: - dependencies: - string-width: 4.2.3 - - widest-line@4.0.1: - dependencies: - string-width: 5.1.2 - word-wrap@1.2.5: {} worktank@2.7.3: @@ -14901,9 +13351,7 @@ snapshots: wrappy@1.0.2: {} - ws@8.17.0: {} - - xml-name-validator@4.0.0: {} + xml-name-validator@5.0.0: {} xmlchars@2.2.0: {} @@ -14917,7 +13365,7 @@ snapshots: yallist@4.0.0: {} - yaml@2.4.2: {} + yaml@2.9.0: {} yargs-parser@18.1.3: dependencies: @@ -14945,7 +13393,7 @@ snapshots: yargs@17.7.2: dependencies: cliui: 8.0.1 - escalade: 3.1.2 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 @@ -14974,12 +13422,4 @@ snapshots: dependencies: grammex: 3.1.3 - zip-stream@6.0.1: - dependencies: - archiver-utils: 5.0.2 - compress-commons: 6.0.2 - readable-stream: 4.5.2 - - zod@3.23.8: {} - zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 286cf7f5..1565dd8b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,14 @@ packages: - apps/* - packages/* +allowBuilds: + "@biomejs/biome": false + "@parcel/watcher": false + esbuild: false +minimumReleaseAgeExclude: + - "@kobalte/solidbase@0.6.4 || 0.6.7 || 0.6.8 || 0.6.9-next.0 || 0.6.9-next.1 || 0.6.9 || 0.6.10" + - "@solidjs/router@0.16.2" + - "@solidjs/start@2.0.0-beta.0" +overrides: + solid-js: ">=1.9.14" +dedupePeerDependents: true diff --git a/tsconfig.json b/tsconfig.json index 3898a270..642419fd 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,9 +15,10 @@ "forceConsistentCasingInFileNames": true, "noFallthroughCasesInSwitch": false, "isolatedModules": true, + "ignoreDeprecations": "6.0", "jsx": "preserve", "jsxImportSource": "solid-js", - "moduleResolution": "Node", + "moduleResolution": "bundler", "resolveJsonModule": true, "skipLibCheck": true, "strict": true, @@ -26,7 +27,6 @@ "solid-js", "vite/client", "node", - "@testing-library/jest-dom", "vitest/globals" ] }, From bb59f5f31d958b79f882aa5c0f0af420207b8b8d Mon Sep 17 00:00:00 2001 From: jer3m01 Date: Sun, 19 Jul 2026 20:11:16 +1000 Subject: [PATCH 02/12] docs: styling fix (#697) --- apps/docs/package.json | 2 +- .../src/examples/navigation-menu.module.css | 2 ++ apps/docs/src/examples/pagination.module.css | 1 + .../src/routes/docs/changelog/(_)index.tsx | 17 ++++++++++++++++ apps/docs/src/routes/docs/changelog/index.tsx | 5 ----- .../routes/docs/core/(0)overview/(_)index.tsx | 17 ++++++++++++++++ .../core/(1)components/navigation-menu.mdx | 4 ++-- apps/docs/src/routes/docs/core/(_)index.tsx | 17 ++++++++++++++++ apps/docs/vite.config.ts | 20 +++++++++++++++---- pnpm-lock.yaml | 14 ++++++------- pnpm-workspace.yaml | 2 +- 11 files changed, 81 insertions(+), 20 deletions(-) create mode 100644 apps/docs/src/routes/docs/changelog/(_)index.tsx delete mode 100644 apps/docs/src/routes/docs/changelog/index.tsx create mode 100644 apps/docs/src/routes/docs/core/(0)overview/(_)index.tsx create mode 100644 apps/docs/src/routes/docs/core/(_)index.tsx diff --git a/apps/docs/package.json b/apps/docs/package.json index 6965cfc0..05e4ec3c 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -35,7 +35,7 @@ }, "dependencies": { "@kobalte/core": "workspace:*", - "@kobalte/solidbase": "0.6.10", + "@kobalte/solidbase": "0.6.11", "@solidjs/meta": "0.29.4", "@solidjs/router": "0.16.2", "@solidjs/start": "2.0.0-beta.0", diff --git a/apps/docs/src/examples/navigation-menu.module.css b/apps/docs/src/examples/navigation-menu.module.css index 79816387..c3aad7f7 100644 --- a/apps/docs/src/examples/navigation-menu.module.css +++ b/apps/docs/src/examples/navigation-menu.module.css @@ -6,6 +6,7 @@ background-color: white; width: max-content; border-radius: 6px; + list-style: none; } .navigation-menu__root[data-orientation="vertical"] { @@ -178,6 +179,7 @@ animation-timing-function: ease; animation-fill-mode: forwards; pointer-events: none; + list-style: none; } .navigation-menu__content[data-expanded] { diff --git a/apps/docs/src/examples/pagination.module.css b/apps/docs/src/examples/pagination.module.css index 54a8f0da..12508339 100644 --- a/apps/docs/src/examples/pagination.module.css +++ b/apps/docs/src/examples/pagination.module.css @@ -1,4 +1,5 @@ .pagination__root > ul { + list-style: none; display: inline-flex; align-items: center; justify-content: space-between; diff --git a/apps/docs/src/routes/docs/changelog/(_)index.tsx b/apps/docs/src/routes/docs/changelog/(_)index.tsx new file mode 100644 index 00000000..3c0a20b9 --- /dev/null +++ b/apps/docs/src/routes/docs/changelog/(_)index.tsx @@ -0,0 +1,17 @@ +import { Navigate, redirect } from "@solidjs/router"; + +const target = "./0-13-x"; + +export const route = { + preload() { + return redirect(target); + }, +}; + +export function GET() { + throw redirect(target); +} + +export default function () { + return ; +} diff --git a/apps/docs/src/routes/docs/changelog/index.tsx b/apps/docs/src/routes/docs/changelog/index.tsx deleted file mode 100644 index 850bcee1..00000000 --- a/apps/docs/src/routes/docs/changelog/index.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { Navigate } from "@solidjs/router"; - -export default function () { - return ; -} diff --git a/apps/docs/src/routes/docs/core/(0)overview/(_)index.tsx b/apps/docs/src/routes/docs/core/(0)overview/(_)index.tsx new file mode 100644 index 00000000..9c202c7d --- /dev/null +++ b/apps/docs/src/routes/docs/core/(0)overview/(_)index.tsx @@ -0,0 +1,17 @@ +import { Navigate, redirect } from "@solidjs/router"; + +const target = "./introduction"; + +export const route = { + preload() { + return redirect(target); + }, +}; + +export function GET() { + throw redirect(target); +} + +export default function () { + return ; +} diff --git a/apps/docs/src/routes/docs/core/(1)components/navigation-menu.mdx b/apps/docs/src/routes/docs/core/(1)components/navigation-menu.mdx index 506472e7..4cbe4c65 100644 --- a/apps/docs/src/routes/docs/core/(1)components/navigation-menu.mdx +++ b/apps/docs/src/routes/docs/core/(1)components/navigation-menu.mdx @@ -149,7 +149,7 @@ Since the viewport content has a position of `absolute` to allow animating, Koba The height and width will be copied from the active `NavigationMenu.Content`, which can either be set using CSS or automatically calculated based on it's content. Combined with a transition CSS rule the size can be animated. -```css {2-3} +```css {3-4} /* style.css */ .navigation-menu__viewport { width: var(--kb-navigation-menu-viewport-width); @@ -188,7 +188,7 @@ To make one of the navigation menu triggers a link instead of opening a menu, om We expose a CSS custom property `--kb-menu-content-transform-origin` which can be used to animate the viewport from its computed origin. -```css {2} +```css {3} /* style.css */ .navigation-menu__viewport { transform-origin: var(--kb-menu-content-transform-origin); diff --git a/apps/docs/src/routes/docs/core/(_)index.tsx b/apps/docs/src/routes/docs/core/(_)index.tsx new file mode 100644 index 00000000..cda9750f --- /dev/null +++ b/apps/docs/src/routes/docs/core/(_)index.tsx @@ -0,0 +1,17 @@ +import { Navigate, redirect } from "@solidjs/router"; + +const target = "/docs/core/overview/introduction"; + +export const route = { + preload() { + return redirect(target); + }, +}; + +export function GET() { + throw redirect(target); +} + +export default function () { + return ; +} diff --git a/apps/docs/vite.config.ts b/apps/docs/vite.config.ts index 79209be7..61a8f862 100644 --- a/apps/docs/vite.config.ts +++ b/apps/docs/vite.config.ts @@ -9,12 +9,14 @@ import { defineConfig } from "vite"; import { version as KBVersion } from "../../packages/core/package.json"; const theme = defineTheme({ - componentsPath: import.meta.resolve("./src/solidbase-theme"), + componentsPath: await import.meta.resolve("./src/solidbase-theme"), extends: defaultTheme, }); const solidBase = createSolidBase(theme); +const collator = new Intl.Collator(undefined, { numeric: true }); + export default defineConfig({ resolve: { dedupe: ["solid-js", "@solidjs/router"], @@ -84,9 +86,19 @@ export default defineConfig({ }, }, ), - "/docs/changelog": createDefaultThemeFilesystemSidebar( - "./src/routes/docs/changelog", - ), + "/docs/changelog": [ + { + title: "Changelog", + items: createDefaultThemeFilesystemSidebar( + "./src/routes/docs/changelog", + { + sort: (a, b) => { + return collator.compare(b.filePath, a.filePath); + }, + }, + ), + }, + ], }, search: { docsearch: { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e054a2e9..810eb61e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -111,8 +111,8 @@ importers: specifier: workspace:* version: link:../../packages/core '@kobalte/solidbase': - specifier: 0.6.10 - version: 0.6.10(@solidjs/start@2.0.0-beta.0(@testing-library/jest-dom@6.9.1)(crossws@0.4.7(srvx@0.11.18))(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0)))(solid-js@1.9.14)(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0)) + specifier: 0.6.11 + version: 0.6.11(@solidjs/start@2.0.0-beta.0(@testing-library/jest-dom@6.9.1)(crossws@0.4.7(srvx@0.11.18))(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0)))(solid-js@1.9.14)(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0)) '@solidjs/meta': specifier: 0.29.4 version: 0.29.4(solid-js@1.9.14) @@ -1687,8 +1687,8 @@ packages: peerDependencies: solid-js: '>=1.9.14' - '@kobalte/solidbase@0.6.10': - resolution: {integrity: sha512-pu26EwzfNbk/SHYIweNk06tyFxYbX29k3KSx/ei+KdZJYu1zUUKBAJ9EEaHgz9wEYfzlCVjvTV0ttm/6oQkgWA==} + '@kobalte/solidbase@0.6.11': + resolution: {integrity: sha512-OVj1Y3fX1Kz32kS6jdMXV9W8Lxr6dh/WgI0bFbtXTsp9QHIk4C0SZO+Our8vXKtm0Lnte9i3IFzxpt410QxosQ==} engines: {node: '>=22'} peerDependencies: '@solidjs/start': ^2.0.0 @@ -7537,7 +7537,7 @@ snapshots: '@types/node': 20.5.1 chalk: 4.1.2 cosmiconfig: 8.3.6(typescript@5.9.3) - cosmiconfig-typescript-loader: 4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.9.3))(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.9.3))(typescript@5.9.3) + cosmiconfig-typescript-loader: 4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.9.3))(ts-node@10.9.2(@types/node@20.5.4)(typescript@6.0.3))(typescript@5.9.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -8031,7 +8031,7 @@ snapshots: solid-presence: 0.1.8(solid-js@1.9.14) solid-prevent-scroll: 0.1.7(solid-js@1.9.14) - '@kobalte/solidbase@0.6.10(@solidjs/start@2.0.0-beta.0(@testing-library/jest-dom@6.9.1)(crossws@0.4.7(srvx@0.11.18))(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0)))(solid-js@1.9.14)(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0))': + '@kobalte/solidbase@0.6.11(@solidjs/start@2.0.0-beta.0(@testing-library/jest-dom@6.9.1)(crossws@0.4.7(srvx@0.11.18))(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0)))(solid-js@1.9.14)(vite@8.1.3(@types/node@20.5.4)(esbuild@0.27.7)(jiti@2.7.0)(terser@5.31.0)(yaml@2.9.0))': dependencies: '@alloc/quick-lru': 5.2.0 '@bprogress/core': 1.3.4 @@ -9299,7 +9299,7 @@ snapshots: dependencies: browserslist: 4.28.4 - cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.9.3))(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.9.3))(typescript@5.9.3): + cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.9.3))(ts-node@10.9.2(@types/node@20.5.4)(typescript@6.0.3))(typescript@5.9.3): dependencies: '@types/node': 20.5.1 cosmiconfig: 8.3.6(typescript@5.9.3) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 1565dd8b..862fb0db 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -6,7 +6,7 @@ allowBuilds: "@parcel/watcher": false esbuild: false minimumReleaseAgeExclude: - - "@kobalte/solidbase@0.6.4 || 0.6.7 || 0.6.8 || 0.6.9-next.0 || 0.6.9-next.1 || 0.6.9 || 0.6.10" + - "@kobalte/solidbase@0.6.4 || 0.6.7 || 0.6.8 || 0.6.9-next.0 || 0.6.9-next.1 || 0.6.9 || 0.6.10 || 0.6.11" - "@solidjs/router@0.16.2" - "@solidjs/start@2.0.0-beta.0" overrides: From dda35943a54ba34ea0ea74a81f0efe19117a7142 Mon Sep 17 00:00:00 2001 From: David Di Biase <1168397+davedbase@users.noreply.github.com> Date: Fri, 3 Jul 2026 16:51:26 -0400 Subject: [PATCH 03/12] chore: initial migration to Solid 2.0 (#673) --- .gitignore | 2 + .storybook/globals.css | 4 + .storybook/main.ts | 88 + .storybook/manager.ts | 12 + .storybook/preview.ts | 8 + .storybook/public/kobalte-logo.svg | 9 + .storybook/tsconfig.json | 12 + MIGRATION.md | 102 + apps/docs/src/entry-client.tsx | 2 +- apps/docs/src/examples/calendar.module.css | 241 + apps/docs/src/examples/calendar.tsx | 289 + apps/docs/src/examples/combobox.tsx | 5 +- apps/docs/src/examples/drawer.module.css | 205 + apps/docs/src/examples/drawer.tsx | 101 + apps/docs/src/examples/navigation-menu.tsx | 2 +- apps/docs/src/examples/otp-field.module.css | 76 + apps/docs/src/examples/otp-field.tsx | 186 + apps/docs/src/examples/radio-group.tsx | 5 +- .../src/examples/segmented-control.module.css | 15 +- apps/docs/src/examples/segmented-control.tsx | 5 +- apps/docs/src/examples/select.tsx | 2 +- apps/docs/src/examples/tabs.tsx | 5 +- apps/docs/src/examples/toggle-button.tsx | 5 +- apps/docs/src/examples/toggle-group.tsx | 5 +- apps/docs/src/routes/docs/changelog/2-0-x.mdx | 46 + .../docs/core/(1)components/calendar.mdx | 631 ++ .../routes/docs/core/(1)components/drawer.mdx | 464 ++ .../docs/core/(1)components/otp-field.mdx | 415 ++ .../docs/core/(1)components/resizable.mdx | 443 ++ apps/docs/tsconfig.json | 6 +- biome.json | 15 +- package.json | 60 +- packages/core/package.json | 23 +- .../core/src/accordion/accordion-content.tsx | 19 +- .../core/src/accordion/accordion-header.tsx | 2 +- .../core/src/accordion/accordion-item.tsx | 41 +- .../core/src/accordion/accordion-root.tsx | 57 +- .../core/src/accordion/accordion-trigger.tsx | 40 +- packages/core/src/accordion/index.tsx | 22 +- .../accordion/stories/accordion.stories.tsx | 290 + .../src/alert-dialog/alert-dialog-content.tsx | 3 +- packages/core/src/alert-dialog/index.tsx | 24 +- .../stories/alert-dialog.stories.tsx | 138 + packages/core/src/alert/alert-root.tsx | 2 +- packages/core/src/alert/index.tsx | 4 +- .../core/src/alert/stories/alert.stories.tsx | 138 + packages/core/src/badge/badge-root.tsx | 17 +- packages/core/src/badge/index.tsx | 4 +- .../core/src/badge/stories/badge.stories.tsx | 90 + .../src/breadcrumbs/breadcrumbs-context.tsx | 3 +- .../core/src/breadcrumbs/breadcrumbs-link.tsx | 16 +- .../core/src/breadcrumbs/breadcrumbs-root.tsx | 24 +- .../src/breadcrumbs/breadcrumbs-separator.tsx | 2 +- packages/core/src/breadcrumbs/index.tsx | 10 +- .../stories/breadcrumbs.stories.tsx | 157 + packages/core/src/button/button-root.tsx | 40 +- packages/core/src/button/index.tsx | 4 +- .../src/button/stories/button.stories.tsx | 296 + packages/core/src/calendar/calendar-body.tsx | 31 + .../core/src/calendar/calendar-context.tsx | 66 + .../calendar-grid-body-cell-context.tsx | 21 + .../calendar-grid-body-cell-trigger.tsx | 416 ++ .../src/calendar/calendar-grid-body-cell.tsx | 120 + .../src/calendar/calendar-grid-body-row.tsx | 44 + .../core/src/calendar/calendar-grid-body.tsx | 46 + .../src/calendar/calendar-grid-context.tsx | 14 + .../calendar/calendar-grid-header-cell.tsx | 44 + .../src/calendar/calendar-grid-header-row.tsx | 43 + .../src/calendar/calendar-grid-header.tsx | 47 + packages/core/src/calendar/calendar-grid.tsx | 236 + .../core/src/calendar/calendar-header.tsx | 33 + .../core/src/calendar/calendar-heading.tsx | 59 + .../src/calendar/calendar-next-trigger.tsx | 95 + .../src/calendar/calendar-prev-trigger.tsx | 99 + packages/core/src/calendar/calendar-root.tsx | 1058 +++ packages/core/src/calendar/calendar.intl.ts | 18 + packages/core/src/calendar/calendar.test.tsx | 286 + packages/core/src/calendar/index.tsx | 125 + .../src/calendar/stories/calendar.stories.tsx | 663 ++ packages/core/src/calendar/types.ts | 21 + packages/core/src/calendar/utils.ts | 843 +++ .../core/src/checkbox/checkbox-control.tsx | 11 +- .../src/checkbox/checkbox-description.tsx | 13 +- .../src/checkbox/checkbox-error-message.tsx | 3 +- .../core/src/checkbox/checkbox-indicator.tsx | 29 +- packages/core/src/checkbox/checkbox-input.tsx | 107 +- packages/core/src/checkbox/checkbox-label.tsx | 3 +- packages/core/src/checkbox/checkbox-root.tsx | 86 +- packages/core/src/checkbox/index.tsx | 26 +- .../src/checkbox/stories/checkbox.stories.tsx | 361 + .../src/collapsible/collapsible-content.tsx | 114 +- .../core/src/collapsible/collapsible-root.tsx | 36 +- .../src/collapsible/collapsible-trigger.tsx | 18 +- packages/core/src/collapsible/index.tsx | 14 +- .../stories/collapsible.stories.tsx | 160 + .../src/color-area/color-area-background.tsx | 50 +- .../src/color-area/color-area-context.tsx | 2 +- .../color-area-hidden-input-base.tsx | 61 +- .../color-area/color-area-hidden-input-x.tsx | 8 +- .../color-area/color-area-hidden-input-y.tsx | 8 +- .../core/src/color-area/color-area-root.tsx | 97 +- .../core/src/color-area/color-area-thumb.tsx | 29 +- .../src/color-area/create-color-area-state.ts | 4 +- packages/core/src/color-area/index.tsx | 40 +- .../color-area/stories/color-area.stories.tsx | 190 + .../color-channel-field-root.tsx | 43 +- .../core/src/color-channel-field/index.tsx | 42 +- .../stories/color-channel-field.stories.tsx | 202 + .../src/color-field/color-field-context.tsx | 3 +- .../src/color-field/color-field-input.tsx | 24 +- .../core/src/color-field/color-field-root.tsx | 30 +- packages/core/src/color-field/index.tsx | 22 +- .../stories/color-field.stories.tsx | 133 + .../src/color-mode/color-mode-provider.tsx | 8 +- .../core/src/color-mode/color-mode-script.tsx | 4 +- .../core/src/color-mode/storage-manager.ts | 2 +- packages/core/src/color-mode/utils.ts | 2 +- .../src/color-slider/color-slider-context.tsx | 7 +- .../src/color-slider/color-slider-root.tsx | 66 +- .../src/color-slider/color-slider-thumb.tsx | 13 +- .../src/color-slider/color-slider-track.tsx | 13 +- packages/core/src/color-slider/index.tsx | 30 +- .../stories/color-slider.stories.tsx | 269 + .../src/color-swatch/color-swatch-root.tsx | 33 +- packages/core/src/color-swatch/index.tsx | 4 +- .../stories/color-swatch.stories.tsx | 175 + .../src/color-wheel/color-wheel-context.tsx | 2 +- .../src/color-wheel/color-wheel-input.tsx | 38 +- .../core/src/color-wheel/color-wheel-root.tsx | 93 +- .../src/color-wheel/color-wheel-thumb.tsx | 42 +- .../src/color-wheel/color-wheel-track.tsx | 37 +- .../color-wheel/color-wheel-value-label.tsx | 2 +- .../color-wheel/create-color-wheel-state.ts | 3 +- packages/core/src/color-wheel/index.tsx | 30 +- .../stories/color-wheel.stories.tsx | 197 + packages/core/src/colors/index.tsx | 3 - packages/core/src/colors/intl.ts | 47 - packages/core/src/colors/types.ts | 116 - packages/core/src/colors/utils.test.ts | 134 - packages/core/src/colors/utils.ts | 905 --- packages/core/src/combobox/combobox-base.tsx | 532 +- .../core/src/combobox/combobox-content.tsx | 69 +- .../core/src/combobox/combobox-context.tsx | 3 +- .../core/src/combobox/combobox-control.tsx | 23 +- .../src/combobox/combobox-hidden-select.tsx | 2 +- packages/core/src/combobox/combobox-icon.tsx | 2 +- packages/core/src/combobox/combobox-input.tsx | 86 +- .../core/src/combobox/combobox-listbox.tsx | 18 +- .../core/src/combobox/combobox-portal.tsx | 4 +- packages/core/src/combobox/combobox-root.tsx | 35 +- .../core/src/combobox/combobox-trigger.tsx | 31 +- packages/core/src/combobox/combobox.test.tsx | 7 +- packages/core/src/combobox/index.tsx | 58 +- .../src/combobox/stories/combobox.stories.tsx | 600 ++ .../src/context-menu/context-menu-content.tsx | 15 +- .../src/context-menu/context-menu-context.tsx | 12 +- .../src/context-menu/context-menu-root.tsx | 15 +- .../src/context-menu/context-menu-trigger.tsx | 36 +- packages/core/src/context-menu/index.tsx | 64 +- .../stories/context-menu.stories.tsx | 229 + .../core/src/dialog/dialog-close-button.tsx | 18 +- packages/core/src/dialog/dialog-content.tsx | 75 +- packages/core/src/dialog/dialog-context.tsx | 2 +- .../core/src/dialog/dialog-description.tsx | 17 +- packages/core/src/dialog/dialog-overlay.tsx | 17 +- packages/core/src/dialog/dialog-portal.tsx | 2 +- packages/core/src/dialog/dialog-root.tsx | 58 +- packages/core/src/dialog/dialog-title.tsx | 21 +- packages/core/src/dialog/dialog-trigger.tsx | 22 +- packages/core/src/dialog/index.tsx | 20 +- .../core/src/dialog/minimal-dialog.test.tsx | 16 + .../src/dialog/stories/dialog.stories.tsx | 252 + .../dismissable-layer-context.tsx | 8 +- .../dismissable-layer/dismissable-layer.tsx | 163 +- packages/core/src/drawer/drawer-content.tsx | 443 ++ packages/core/src/drawer/drawer-context.tsx | 95 + packages/core/src/drawer/drawer-lib.ts | 147 + packages/core/src/drawer/drawer-overlay.tsx | 89 + packages/core/src/drawer/drawer-root.tsx | 292 + packages/core/src/drawer/drawer.test.tsx | 108 + packages/core/src/drawer/index.tsx | 125 + .../src/drawer/stories/drawer.stories.tsx | 542 ++ .../dropdown-menu/dropdown-menu-content.tsx | 17 +- .../src/dropdown-menu/dropdown-menu-root.tsx | 2 +- packages/core/src/dropdown-menu/index.tsx | 62 +- .../stories/dropdown-menu.stories.tsx | 262 + .../src/file-field/file-field-context.tsx | 9 +- .../src/file-field/file-field-dropzone.tsx | 38 +- .../file-field/file-field-hidden-input.tsx | 45 +- .../file-field/file-field-item-context.tsx | 3 +- .../file-field-item-delete-trigger.tsx | 18 +- .../src/file-field/file-field-item-list.tsx | 16 +- .../src/file-field/file-field-item-name.tsx | 2 +- .../file-field-item-preview-image.tsx | 44 +- .../file-field/file-field-item-preview.tsx | 9 +- .../src/file-field/file-field-item-size.tsx | 9 +- .../core/src/file-field/file-field-item.tsx | 2 +- .../core/src/file-field/file-field-label.tsx | 2 +- .../core/src/file-field/file-field-root.tsx | 70 +- .../src/file-field/file-field-trigger.tsx | 14 +- packages/core/src/file-field/index.tsx | 115 +- .../file-field/stories/file-field.stories.tsx | 167 + .../create-form-control-field.tsx | 51 +- .../form-control/create-form-control.test.tsx | 4 +- .../src/form-control/create-form-control.tsx | 133 +- .../src/form-control/form-control-context.tsx | 59 +- .../form-control/form-control-description.tsx | 30 +- .../form-control-error-message.tsx | 27 +- .../src/form-control/form-control-label.tsx | 34 +- .../src/hover-card/hover-card-content.tsx | 20 +- .../core/src/hover-card/hover-card-portal.tsx | 2 +- .../core/src/hover-card/hover-card-root.tsx | 70 +- .../src/hover-card/hover-card-trigger.tsx | 25 +- packages/core/src/hover-card/index.tsx | 14 +- .../hover-card/stories/hover-card.stories.tsx | 163 + .../core/src/i18n/create-default-locale.ts | 12 +- .../core/src/i18n/create-number-formatter.ts | 2 +- packages/core/src/i18n/i18n-provider.tsx | 30 +- packages/core/src/i18n/i18n.test.tsx | 8 +- packages/core/src/i18n/index.tsx | 30 + .../core/src/i18n/stories/i18n.stories.tsx | 491 ++ packages/core/src/image/image-fallback.tsx | 26 +- packages/core/src/image/image-img.tsx | 88 +- packages/core/src/image/image-root.tsx | 16 +- packages/core/src/image/index.tsx | 14 +- .../core/src/image/stories/image.stories.tsx | 123 + packages/core/src/index.tsx | 26 +- packages/core/src/link/index.tsx | 4 +- packages/core/src/link/link-root.tsx | 34 +- .../core/src/link/stories/link.stories.tsx | 83 + packages/core/src/list/create-list-state.ts | 20 +- .../core/src/list/create-selectable-list.ts | 4 +- .../list/create-single-select-list-state.ts | 10 +- packages/core/src/listbox/index.tsx | 26 +- .../src/listbox/listbox-item-description.tsx | 8 +- .../src/listbox/listbox-item-indicator.tsx | 7 +- .../core/src/listbox/listbox-item-label.tsx | 13 +- packages/core/src/listbox/listbox-item.tsx | 73 +- packages/core/src/listbox/listbox-root.tsx | 104 +- packages/core/src/listbox/listbox-section.tsx | 2 +- packages/core/src/listbox/listbox.test.tsx | 2 +- .../src/listbox/stories/listbox.stories.tsx | 274 + packages/core/src/menu/menu-checkbox-item.tsx | 18 +- packages/core/src/menu/menu-content-base.tsx | 81 +- packages/core/src/menu/menu-content.tsx | 14 +- packages/core/src/menu/menu-context.tsx | 6 +- packages/core/src/menu/menu-group-label.tsx | 17 +- packages/core/src/menu/menu-group.tsx | 11 +- packages/core/src/menu/menu-icon.tsx | 5 +- packages/core/src/menu/menu-item-base.tsx | 96 +- .../core/src/menu/menu-item-description.tsx | 17 +- .../core/src/menu/menu-item-indicator.tsx | 9 +- packages/core/src/menu/menu-item-label.tsx | 19 +- packages/core/src/menu/menu-item.tsx | 3 +- packages/core/src/menu/menu-portal.tsx | 4 +- packages/core/src/menu/menu-radio-group.tsx | 25 +- packages/core/src/menu/menu-radio-item.tsx | 13 +- packages/core/src/menu/menu-root.tsx | 31 +- packages/core/src/menu/menu-sub-content.tsx | 29 +- packages/core/src/menu/menu-sub-trigger.tsx | 129 +- packages/core/src/menu/menu-trigger.tsx | 68 +- packages/core/src/menu/menu.tsx | 157 +- .../core/src/menu/stories/menu.stories.tsx | 256 + packages/core/src/menu/utils.ts | 2 +- packages/core/src/menubar/index.tsx | 78 +- packages/core/src/menubar/menubar-context.tsx | 8 +- packages/core/src/menubar/menubar-menu.tsx | 8 +- packages/core/src/menubar/menubar-root.tsx | 125 +- packages/core/src/menubar/menubar-trigger.tsx | 3 +- .../src/menubar/stories/menubar.stories.tsx | 357 + packages/core/src/meter/index.tsx | 22 +- packages/core/src/meter/meter-fill.tsx | 8 +- packages/core/src/meter/meter-label.tsx | 17 +- packages/core/src/meter/meter-root.tsx | 46 +- packages/core/src/meter/meter-track.tsx | 2 +- packages/core/src/meter/meter-value-label.tsx | 2 +- .../core/src/meter/stories/meter.stories.tsx | 150 + packages/core/src/navigation-menu/index.tsx | 84 +- .../navigation-menu/navigation-menu-arrow.tsx | 19 +- .../navigation-menu-content.tsx | 90 +- .../navigation-menu-context.tsx | 10 +- .../navigation-menu/navigation-menu-item.tsx | 5 +- .../navigation-menu/navigation-menu-menu.tsx | 18 +- .../navigation-menu-portal.tsx | 10 +- .../navigation-menu/navigation-menu-root.tsx | 149 +- .../navigation-menu-trigger.tsx | 34 +- .../navigation-menu-viewport.tsx | 63 +- .../stories/navigation-menu.stories.tsx | 544 ++ packages/core/src/number-field/index.tsx | 44 +- .../src/number-field/number-field-context.tsx | 9 +- .../number-field-decrement-trigger.tsx | 3 +- .../number-field-hidden-input.tsx | 26 +- .../number-field-increment-trigger.tsx | 3 +- .../src/number-field/number-field-input.tsx | 280 +- .../src/number-field/number-field-root.tsx | 232 +- .../number-field-vary-trigger.tsx | 21 +- .../src/number-field/number-field.test.tsx | 7 +- .../stories/number-field.stories.tsx | 233 + packages/core/src/otp-field/index.tsx | 72 + .../core/src/otp-field/otp-field-context.tsx | 45 + .../src/otp-field/otp-field-description.tsx | 23 + .../src/otp-field/otp-field-error-message.tsx | 25 + .../core/src/otp-field/otp-field-input.tsx | 502 ++ .../core/src/otp-field/otp-field-label.tsx | 25 + .../core/src/otp-field/otp-field-root.tsx | 219 + .../core/src/otp-field/otp-field-style.ts | 51 + .../otp-field/stories/otp-field.stories.tsx | 212 + packages/core/src/pagination/index.tsx | 22 +- .../src/pagination/pagination-context.tsx | 4 +- .../src/pagination/pagination-ellipsis.tsx | 2 +- .../core/src/pagination/pagination-item.tsx | 21 +- .../core/src/pagination/pagination-items.tsx | 2 +- .../core/src/pagination/pagination-next.tsx | 16 +- .../src/pagination/pagination-previous.tsx | 18 +- .../core/src/pagination/pagination-root.tsx | 44 +- .../core/src/pagination/pagination.test.tsx | 8 +- .../pagination/stories/pagination.stories.tsx | 267 + packages/core/src/polymorphic/polymorphic.tsx | 17 +- .../stories/polymorphic.stories.tsx | 315 + packages/core/src/popover/index.tsx | 30 +- packages/core/src/popover/popover-anchor.tsx | 10 +- .../core/src/popover/popover-close-button.tsx | 20 +- packages/core/src/popover/popover-content.tsx | 72 +- .../core/src/popover/popover-description.tsx | 17 +- packages/core/src/popover/popover-portal.tsx | 2 +- packages/core/src/popover/popover-root.tsx | 76 +- packages/core/src/popover/popover-title.tsx | 17 +- packages/core/src/popover/popover-trigger.tsx | 25 +- .../src/popover/stories/popover.stories.tsx | 201 + packages/core/src/popper/index.tsx | 10 +- packages/core/src/popper/popper-arrow.tsx | 33 +- .../core/src/popper/popper-positioner.tsx | 16 +- packages/core/src/popper/popper-root.tsx | 42 +- .../create-controllable-signal.test.tsx | 213 - .../create-controllable-signal.ts | 88 - .../create-controllable-signal/index.ts | 1 - .../create-disclosure-state.test.ts | 34 +- .../create-disclosure-state.ts | 5 +- .../create-disclosure-state.stories.tsx | 135 + .../create-dom-collection-item.ts | 18 +- .../create-dom-collection.ts | 37 +- .../dom-collection-context.ts | 9 +- .../primitives/create-dom-collection/utils.ts | 59 +- .../create-escape-key-down.ts | 48 - .../create-escape-key-down/index.ts | 1 - .../create-focus-scope/create-focus-scope.tsx | 369 - .../primitives/create-focus-scope/index.ts | 1 - .../create-form-reset-listener.ts | 47 - .../create-form-reset-listener/index.ts | 1 - .../aria-hide-outside.test.tsx | 408 -- .../create-hide-outside.ts | 217 - .../primitives/create-hide-outside/index.ts | 1 - .../create-interact-outside.test.tsx | 245 - .../create-interact-outside.ts | 224 - .../create-interact-outside/index.ts | 1 - .../src/primitives/create-size/create-size.ts | 44 - .../core/src/primitives/create-size/index.ts | 1 - .../create-tag-name/create-tag-name.test.tsx | 39 +- .../create-tag-name/create-tag-name.ts | 13 +- .../stories/create-tag-name.stories.tsx | 151 + .../create-toggle-state.test.ts | 18 +- .../create-toggle-state.ts | 5 +- .../stories/create-toggle-state.stories.tsx | 152 + .../create-transition/create-transition.ts | 196 - .../get-transition-styles.test.ts | 54 - .../get-transition-styles.ts | 54 - .../src/primitives/create-transition/index.ts | 2 - .../src/primitives/create-transition/types.ts | 20 - packages/core/src/primitives/index.ts | 8 +- packages/core/src/progress/index.tsx | 22 +- packages/core/src/progress/progress-fill.tsx | 8 +- packages/core/src/progress/progress-label.tsx | 18 +- packages/core/src/progress/progress-root.tsx | 48 +- packages/core/src/progress/progress-track.tsx | 3 +- .../src/progress/progress-value-label.tsx | 3 +- .../src/progress/stories/progress.stories.tsx | 128 + packages/core/src/radio-group/index.tsx | 42 +- .../radio-group/radio-group-item-control.tsx | 11 +- .../radio-group-item-description.tsx | 10 +- .../radio-group-item-indicator.tsx | 18 +- .../radio-group/radio-group-item-input.tsx | 72 +- .../radio-group/radio-group-item-label.tsx | 10 +- .../core/src/radio-group/radio-group-item.tsx | 45 +- .../src/radio-group/radio-group-label.tsx | 3 +- .../core/src/radio-group/radio-group-root.tsx | 90 +- .../stories/radio-group.stories.tsx | 283 + packages/core/src/rating/rating-context.tsx | 2 +- packages/core/src/rating/rating-control.tsx | 7 +- .../core/src/rating/rating-hidden-input.tsx | 6 +- .../core/src/rating/rating-item-control.tsx | 7 +- .../src/rating/rating-item-description.tsx | 8 +- .../core/src/rating/rating-item-label.tsx | 18 +- packages/core/src/rating/rating-item.tsx | 85 +- packages/core/src/rating/rating-label.tsx | 3 +- packages/core/src/rating/rating-root.tsx | 102 +- .../src/rating/stories/rating.stories.tsx | 251 + packages/core/src/resizable/index.tsx | 61 + .../core/src/resizable/resizable-context.tsx | 73 + .../core/src/resizable/resizable-handle.tsx | 397 ++ packages/core/src/resizable/resizable-lib.ts | 969 +++ .../src/resizable/resizable-panel-context.tsx | 48 + .../core/src/resizable/resizable-panel.tsx | 309 + .../core/src/resizable/resizable-root.tsx | 534 ++ .../core/src/resizable/resizable.test.tsx | 105 + .../resizable/stories/resizable.stories.tsx | 386 ++ packages/core/src/search/index.tsx | 141 +- packages/core/src/search/search-indicator.tsx | 9 +- packages/core/src/search/search-no-result.tsx | 3 +- packages/core/src/search/search-root.tsx | 76 +- packages/core/src/search/search.test.tsx | 7 +- .../src/search/stories/search.stories.tsx | 313 + packages/core/src/segmented-control/index.tsx | 2 +- .../segmented-control-context.tsx | 2 +- .../segmented-control-indicator.tsx | 54 +- .../segmented-control-item-input.tsx | 15 +- .../segmented-control-item.tsx | 32 +- .../segmented-control-root.tsx | 33 +- .../stories/segmented-control.stories.tsx | 160 + .../core/src/select/hidden-select-base.tsx | 93 +- packages/core/src/select/index.tsx | 62 +- packages/core/src/select/select-base.tsx | 329 +- packages/core/src/select/select-content.tsx | 71 +- packages/core/src/select/select-context.tsx | 4 +- .../core/src/select/select-hidden-select.tsx | 2 +- packages/core/src/select/select-icon.tsx | 2 +- packages/core/src/select/select-label.tsx | 12 +- packages/core/src/select/select-listbox.tsx | 26 +- packages/core/src/select/select-portal.tsx | 4 +- packages/core/src/select/select-root.tsx | 37 +- packages/core/src/select/select-trigger.tsx | 71 +- packages/core/src/select/select-value.tsx | 25 +- packages/core/src/select/select.test.tsx | 4 +- .../src/select/stories/select.stories.tsx | 529 ++ .../create-multiple-selection-state.ts | 37 +- .../selection/create-selectable-collection.ts | 52 +- .../src/selection/create-selectable-item.ts | 54 +- .../core/src/selection/create-type-select.ts | 2 +- packages/core/src/separator/index.tsx | 4 +- .../core/src/separator/separator-root.tsx | 22 +- .../separator/stories/separator.stories.tsx | 47 + packages/core/src/skeleton/index.tsx | 7 +- packages/core/src/skeleton/skeleton-root.tsx | 35 +- .../src/skeleton/stories/skeleton.stories.tsx | 86 + packages/core/src/slider/index.tsx | 34 +- packages/core/src/slider/slider-context.tsx | 8 +- packages/core/src/slider/slider-fill.tsx | 8 +- packages/core/src/slider/slider-input.tsx | 54 +- packages/core/src/slider/slider-root.tsx | 116 +- packages/core/src/slider/slider-thumb.tsx | 64 +- packages/core/src/slider/slider-track.tsx | 34 +- .../core/src/slider/slider-value-label.tsx | 2 +- .../src/slider/stories/slider.stories.tsx | 207 + packages/core/src/spin-button/index.tsx | 4 +- .../core/src/spin-button/spin-button-root.tsx | 96 +- .../stories/spin-button.stories.tsx | 187 + packages/core/src/switch/index.tsx | 30 +- .../src/switch/stories/switch.stories.tsx | 257 + packages/core/src/switch/switch-control.tsx | 11 +- .../core/src/switch/switch-description.tsx | 11 +- .../core/src/switch/switch-error-message.tsx | 3 +- packages/core/src/switch/switch-input.tsx | 59 +- packages/core/src/switch/switch-label.tsx | 3 +- packages/core/src/switch/switch-root.tsx | 72 +- packages/core/src/switch/switch-thumb.tsx | 2 +- packages/core/src/tabs/index.tsx | 22 +- .../core/src/tabs/stories/tabs.stories.tsx | 276 + packages/core/src/tabs/tabs-content.tsx | 63 +- packages/core/src/tabs/tabs-context.tsx | 2 +- packages/core/src/tabs/tabs-indicator.tsx | 29 +- packages/core/src/tabs/tabs-list.tsx | 51 +- packages/core/src/tabs/tabs-root.tsx | 128 +- packages/core/src/tabs/tabs-trigger.tsx | 65 +- packages/core/src/text-field/index.tsx | 26 +- .../text-field/stories/text-field.stories.tsx | 209 + .../src/text-field/text-field-context.tsx | 3 +- .../core/src/text-field/text-field-input.tsx | 35 +- .../core/src/text-field/text-field-root.tsx | 55 +- .../src/text-field/text-field-text-area.tsx | 38 +- packages/core/src/time-field/index.tsx | 32 +- .../time-field/stories/time-field.stories.tsx | 177 + .../time-field/time-field-hidden-input.tsx | 6 +- .../core/src/time-field/time-field-input.tsx | 55 +- .../core/src/time-field/time-field-label.tsx | 3 +- .../core/src/time-field/time-field-root.tsx | 137 +- .../src/time-field/time-field-segment.tsx | 167 +- .../time-field-value-description.tsx | 16 +- packages/core/src/toast/index.tsx | 34 +- .../core/src/toast/stories/toast.stories.tsx | 318 + .../core/src/toast/toast-close-button.tsx | 17 +- packages/core/src/toast/toast-description.tsx | 17 +- packages/core/src/toast/toast-list.tsx | 103 +- .../core/src/toast/toast-progress-fill.tsx | 51 +- .../core/src/toast/toast-progress-track.tsx | 2 +- packages/core/src/toast/toast-region.tsx | 91 +- packages/core/src/toast/toast-root.tsx | 180 +- packages/core/src/toast/toast-store.ts | 42 +- packages/core/src/toast/toast-title.tsx | 21 +- packages/core/src/toast/toast.test.tsx | 28 +- packages/core/src/toggle-button/index.tsx | 4 +- .../stories/toggle-button.stories.tsx | 98 + .../src/toggle-button/toggle-button-root.tsx | 34 +- packages/core/src/toggle-group/index.tsx | 12 +- .../stories/toggle-group.stories.tsx | 172 + .../src/toggle-group/toggle-group-base.tsx | 56 +- .../src/toggle-group/toggle-group-item.tsx | 52 +- .../src/toggle-group/toggle-group-root.tsx | 33 +- .../src/toggle-group/toggle-group.test.tsx | 13 +- packages/core/src/tooltip/index.tsx | 14 +- .../src/tooltip/stories/tooltip.stories.tsx | 163 + packages/core/src/tooltip/tooltip-content.tsx | 25 +- packages/core/src/tooltip/tooltip-portal.tsx | 2 +- packages/core/src/tooltip/tooltip-root.tsx | 146 +- packages/core/src/tooltip/tooltip-trigger.tsx | 25 +- packages/core/tsconfig.json | 6 +- packages/core/tsup.config.ts | 4 +- packages/core/vite.config.ts | 23 +- packages/tailwindcss/package.json | 4 +- packages/tailwindcss/tsconfig.json | 4 +- packages/tests/package.json | 6 +- packages/tests/src/utils.ts | 3 +- packages/tests/tsconfig.json | 6 +- packages/utils/package.json | 17 +- packages/utils/src/events.ts | 2 +- packages/utils/src/focus-manager.ts | 2 +- packages/utils/src/platform.ts | 4 +- packages/utils/src/props.ts | 4 +- packages/utils/src/scroll-into-view.ts | 2 - packages/utils/src/styles.ts | 2 +- packages/utils/tsconfig.json | 6 +- packages/vanilla-extract/tsconfig.json | 4 +- pnpm-lock.yaml | 6142 +++++++++-------- pnpm-workspace.yaml | 46 +- postcss.config.cjs | 5 + tsconfig.json | 6 +- 534 files changed, 35465 insertions(+), 12257 deletions(-) create mode 100644 .storybook/globals.css create mode 100644 .storybook/main.ts create mode 100644 .storybook/manager.ts create mode 100644 .storybook/preview.ts create mode 100644 .storybook/public/kobalte-logo.svg create mode 100644 .storybook/tsconfig.json create mode 100644 MIGRATION.md create mode 100644 apps/docs/src/examples/calendar.module.css create mode 100644 apps/docs/src/examples/calendar.tsx create mode 100644 apps/docs/src/examples/drawer.module.css create mode 100644 apps/docs/src/examples/drawer.tsx create mode 100644 apps/docs/src/examples/otp-field.module.css create mode 100644 apps/docs/src/examples/otp-field.tsx create mode 100644 apps/docs/src/routes/docs/changelog/2-0-x.mdx create mode 100644 apps/docs/src/routes/docs/core/(1)components/calendar.mdx create mode 100644 apps/docs/src/routes/docs/core/(1)components/drawer.mdx create mode 100644 apps/docs/src/routes/docs/core/(1)components/otp-field.mdx create mode 100644 apps/docs/src/routes/docs/core/(1)components/resizable.mdx create mode 100644 packages/core/src/accordion/stories/accordion.stories.tsx create mode 100644 packages/core/src/alert-dialog/stories/alert-dialog.stories.tsx create mode 100644 packages/core/src/alert/stories/alert.stories.tsx create mode 100644 packages/core/src/badge/stories/badge.stories.tsx create mode 100644 packages/core/src/breadcrumbs/stories/breadcrumbs.stories.tsx create mode 100644 packages/core/src/button/stories/button.stories.tsx create mode 100644 packages/core/src/calendar/calendar-body.tsx create mode 100644 packages/core/src/calendar/calendar-context.tsx create mode 100644 packages/core/src/calendar/calendar-grid-body-cell-context.tsx create mode 100644 packages/core/src/calendar/calendar-grid-body-cell-trigger.tsx create mode 100644 packages/core/src/calendar/calendar-grid-body-cell.tsx create mode 100644 packages/core/src/calendar/calendar-grid-body-row.tsx create mode 100644 packages/core/src/calendar/calendar-grid-body.tsx create mode 100644 packages/core/src/calendar/calendar-grid-context.tsx create mode 100644 packages/core/src/calendar/calendar-grid-header-cell.tsx create mode 100644 packages/core/src/calendar/calendar-grid-header-row.tsx create mode 100644 packages/core/src/calendar/calendar-grid-header.tsx create mode 100644 packages/core/src/calendar/calendar-grid.tsx create mode 100644 packages/core/src/calendar/calendar-header.tsx create mode 100644 packages/core/src/calendar/calendar-heading.tsx create mode 100644 packages/core/src/calendar/calendar-next-trigger.tsx create mode 100644 packages/core/src/calendar/calendar-prev-trigger.tsx create mode 100644 packages/core/src/calendar/calendar-root.tsx create mode 100644 packages/core/src/calendar/calendar.intl.ts create mode 100644 packages/core/src/calendar/calendar.test.tsx create mode 100644 packages/core/src/calendar/index.tsx create mode 100644 packages/core/src/calendar/stories/calendar.stories.tsx create mode 100644 packages/core/src/calendar/types.ts create mode 100644 packages/core/src/calendar/utils.ts create mode 100644 packages/core/src/checkbox/stories/checkbox.stories.tsx create mode 100644 packages/core/src/collapsible/stories/collapsible.stories.tsx create mode 100644 packages/core/src/color-area/stories/color-area.stories.tsx create mode 100644 packages/core/src/color-channel-field/stories/color-channel-field.stories.tsx create mode 100644 packages/core/src/color-field/stories/color-field.stories.tsx create mode 100644 packages/core/src/color-slider/stories/color-slider.stories.tsx create mode 100644 packages/core/src/color-swatch/stories/color-swatch.stories.tsx create mode 100644 packages/core/src/color-wheel/stories/color-wheel.stories.tsx delete mode 100644 packages/core/src/colors/index.tsx delete mode 100644 packages/core/src/colors/intl.ts delete mode 100644 packages/core/src/colors/types.ts delete mode 100644 packages/core/src/colors/utils.test.ts delete mode 100644 packages/core/src/colors/utils.ts create mode 100644 packages/core/src/combobox/stories/combobox.stories.tsx create mode 100644 packages/core/src/context-menu/stories/context-menu.stories.tsx create mode 100644 packages/core/src/dialog/minimal-dialog.test.tsx create mode 100644 packages/core/src/dialog/stories/dialog.stories.tsx create mode 100644 packages/core/src/drawer/drawer-content.tsx create mode 100644 packages/core/src/drawer/drawer-context.tsx create mode 100644 packages/core/src/drawer/drawer-lib.ts create mode 100644 packages/core/src/drawer/drawer-overlay.tsx create mode 100644 packages/core/src/drawer/drawer-root.tsx create mode 100644 packages/core/src/drawer/drawer.test.tsx create mode 100644 packages/core/src/drawer/index.tsx create mode 100644 packages/core/src/drawer/stories/drawer.stories.tsx create mode 100644 packages/core/src/dropdown-menu/stories/dropdown-menu.stories.tsx create mode 100644 packages/core/src/file-field/stories/file-field.stories.tsx create mode 100644 packages/core/src/hover-card/stories/hover-card.stories.tsx create mode 100644 packages/core/src/i18n/stories/i18n.stories.tsx create mode 100644 packages/core/src/image/stories/image.stories.tsx create mode 100644 packages/core/src/link/stories/link.stories.tsx create mode 100644 packages/core/src/listbox/stories/listbox.stories.tsx create mode 100644 packages/core/src/menu/stories/menu.stories.tsx create mode 100644 packages/core/src/menubar/stories/menubar.stories.tsx create mode 100644 packages/core/src/meter/stories/meter.stories.tsx create mode 100644 packages/core/src/navigation-menu/stories/navigation-menu.stories.tsx create mode 100644 packages/core/src/number-field/stories/number-field.stories.tsx create mode 100644 packages/core/src/otp-field/index.tsx create mode 100644 packages/core/src/otp-field/otp-field-context.tsx create mode 100644 packages/core/src/otp-field/otp-field-description.tsx create mode 100644 packages/core/src/otp-field/otp-field-error-message.tsx create mode 100644 packages/core/src/otp-field/otp-field-input.tsx create mode 100644 packages/core/src/otp-field/otp-field-label.tsx create mode 100644 packages/core/src/otp-field/otp-field-root.tsx create mode 100644 packages/core/src/otp-field/otp-field-style.ts create mode 100644 packages/core/src/otp-field/stories/otp-field.stories.tsx create mode 100644 packages/core/src/pagination/stories/pagination.stories.tsx create mode 100644 packages/core/src/polymorphic/stories/polymorphic.stories.tsx create mode 100644 packages/core/src/popover/stories/popover.stories.tsx delete mode 100644 packages/core/src/primitives/create-controllable-signal/create-controllable-signal.test.tsx delete mode 100644 packages/core/src/primitives/create-controllable-signal/create-controllable-signal.ts delete mode 100644 packages/core/src/primitives/create-controllable-signal/index.ts create mode 100644 packages/core/src/primitives/create-disclosure-state/stories/create-disclosure-state.stories.tsx delete mode 100644 packages/core/src/primitives/create-escape-key-down/create-escape-key-down.ts delete mode 100644 packages/core/src/primitives/create-escape-key-down/index.ts delete mode 100644 packages/core/src/primitives/create-focus-scope/create-focus-scope.tsx delete mode 100644 packages/core/src/primitives/create-focus-scope/index.ts delete mode 100644 packages/core/src/primitives/create-form-reset-listener/create-form-reset-listener.ts delete mode 100644 packages/core/src/primitives/create-form-reset-listener/index.ts delete mode 100644 packages/core/src/primitives/create-hide-outside/aria-hide-outside.test.tsx delete mode 100644 packages/core/src/primitives/create-hide-outside/create-hide-outside.ts delete mode 100644 packages/core/src/primitives/create-hide-outside/index.ts delete mode 100644 packages/core/src/primitives/create-interact-outside/create-interact-outside.test.tsx delete mode 100644 packages/core/src/primitives/create-interact-outside/create-interact-outside.ts delete mode 100644 packages/core/src/primitives/create-interact-outside/index.ts delete mode 100644 packages/core/src/primitives/create-size/create-size.ts delete mode 100644 packages/core/src/primitives/create-size/index.ts create mode 100644 packages/core/src/primitives/create-tag-name/stories/create-tag-name.stories.tsx create mode 100644 packages/core/src/primitives/create-toggle-state/stories/create-toggle-state.stories.tsx delete mode 100644 packages/core/src/primitives/create-transition/create-transition.ts delete mode 100644 packages/core/src/primitives/create-transition/get-transition-styles.test.ts delete mode 100644 packages/core/src/primitives/create-transition/get-transition-styles.ts delete mode 100644 packages/core/src/primitives/create-transition/index.ts delete mode 100644 packages/core/src/primitives/create-transition/types.ts create mode 100644 packages/core/src/progress/stories/progress.stories.tsx create mode 100644 packages/core/src/radio-group/stories/radio-group.stories.tsx create mode 100644 packages/core/src/rating/stories/rating.stories.tsx create mode 100644 packages/core/src/resizable/index.tsx create mode 100644 packages/core/src/resizable/resizable-context.tsx create mode 100644 packages/core/src/resizable/resizable-handle.tsx create mode 100644 packages/core/src/resizable/resizable-lib.ts create mode 100644 packages/core/src/resizable/resizable-panel-context.tsx create mode 100644 packages/core/src/resizable/resizable-panel.tsx create mode 100644 packages/core/src/resizable/resizable-root.tsx create mode 100644 packages/core/src/resizable/resizable.test.tsx create mode 100644 packages/core/src/resizable/stories/resizable.stories.tsx create mode 100644 packages/core/src/search/stories/search.stories.tsx create mode 100644 packages/core/src/segmented-control/stories/segmented-control.stories.tsx create mode 100644 packages/core/src/select/stories/select.stories.tsx create mode 100644 packages/core/src/separator/stories/separator.stories.tsx create mode 100644 packages/core/src/skeleton/stories/skeleton.stories.tsx create mode 100644 packages/core/src/slider/stories/slider.stories.tsx create mode 100644 packages/core/src/spin-button/stories/spin-button.stories.tsx create mode 100644 packages/core/src/switch/stories/switch.stories.tsx create mode 100644 packages/core/src/tabs/stories/tabs.stories.tsx create mode 100644 packages/core/src/text-field/stories/text-field.stories.tsx create mode 100644 packages/core/src/time-field/stories/time-field.stories.tsx create mode 100644 packages/core/src/toast/stories/toast.stories.tsx create mode 100644 packages/core/src/toggle-button/stories/toggle-button.stories.tsx create mode 100644 packages/core/src/toggle-group/stories/toggle-group.stories.tsx create mode 100644 packages/core/src/tooltip/stories/tooltip.stories.tsx create mode 100644 postcss.config.cjs diff --git a/.gitignore b/.gitignore index 34a09ff9..34af82b4 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ npm-debug.log* yarn-debug.log* yarn-error.log* lerna-debug.log +.claude # local env files .env.local @@ -43,3 +44,4 @@ packages/core/NOTICE.txt .DS_Store Thumbs.db .vercel +/storybook-static diff --git a/.storybook/globals.css b/.storybook/globals.css new file mode 100644 index 00000000..4d5c8543 --- /dev/null +++ b/.storybook/globals.css @@ -0,0 +1,4 @@ +@import "tailwindcss"; + +@source "./.storybook/**/*.{ts,tsx}"; +@source "./packages/core/src/**/*.{ts,tsx}"; diff --git a/.storybook/main.ts b/.storybook/main.ts new file mode 100644 index 00000000..3f667384 --- /dev/null +++ b/.storybook/main.ts @@ -0,0 +1,88 @@ +import type { StorybookConfig } from "storybook-solidjs-vite"; +import { mergeConfig } from "vite"; + +const config: StorybookConfig = { + stories: ["../packages/core/src/**/stories/*.stories.{ts,tsx}"], + staticDirs: ["./public"], + addons: ["@storybook/addon-docs"], + framework: { + name: "storybook-solidjs-vite", + // docgen: false — storybook-solidjs-vite@10.5.2 bug: dynamic import('typescript') + // returns { default: ts } in ESM context so ts.sys is undefined inside the plugin + options: { docgen: false }, + }, + docs: {}, + async viteFinal(config) { + return mergeConfig(config, { + plugins: [ + { + name: "solid-addEventListener-compat", + transform(code: string, id: string) { + if ( + /\.(tsx?|jsx?)$/.test(id) && + code.includes("addEventListener as _$addEventListener") + ) { + return { + code: code.replace( + /\{ addEventListener as _\$addEventListener \}/g, + "{ addEvent as _$addEventListener }", + ), + map: null, + }; + } + }, + }, + // Intercept any file that imports the removed `on` helper from solid-js. + // Logs the filename so we can find the culprit, and replaces the import + // with a shim so rendering continues. + { + name: "solid-on-shim", + transform(code: string, id: string) { + if ( + code.includes("from 'solid-js'") || + code.includes('from "solid-js"') + ) { + if (/\bon\b/.test(code)) { + const hasOnImport = + /import\s*\{[^}]*\bon\b[^}]*\}\s*from\s*['"]solid-js['"]/.test( + code, + ); + if (hasOnImport) { + console.warn( + `[solid-on-shim] Found legacy 'on' import in: ${id}`, + ); + // Remove 'on' from the import and inject a no-op shim after the import + const patched = code + .replace(/,\s*\bon\b/g, "") + .replace(/\bon\b\s*,/g, "") + .replace(/\{\s*\bon\b\s*\}/g, "{ createEffect }"); + return { + code: + patched + + "\nconst on = (deps, fn) => { createEffect(deps, fn); };\n", + map: null, + }; + } + } + } + }, + }, + ], + resolve: { + alias: [ + { find: "solid-js/web", replacement: "@solidjs/web" }, + { + find: "@kobalte/utils", + replacement: new URL( + "../packages/utils/src/index.ts", + import.meta.url, + ).pathname, + }, + ], + dedupe: ["react", "react-dom", "solid-js", "@solidjs/signals", "@solidjs/web"], + }, + }); + }, +}; + +export default config; diff --git a/.storybook/manager.ts b/.storybook/manager.ts new file mode 100644 index 00000000..468395a8 --- /dev/null +++ b/.storybook/manager.ts @@ -0,0 +1,12 @@ +import { addons } from "storybook/manager-api"; +import { create } from "storybook/theming/create"; + +addons.setConfig({ + theme: create({ + base: "light", + brandTitle: "Kobalte", + brandImage: "/kobalte-logo.svg", + brandUrl: "https://kobalte.dev", + brandTarget: "_blank", + }), +}); diff --git a/.storybook/preview.ts b/.storybook/preview.ts new file mode 100644 index 00000000..d08dbb0e --- /dev/null +++ b/.storybook/preview.ts @@ -0,0 +1,8 @@ +import * as docsAnnotations from "@storybook/addon-docs/preview"; +import { definePreview } from "storybook-solidjs-vite/next"; +import "./globals.css"; + +export default definePreview({ + addons: [docsAnnotations], + parameters: { layout: "centered", docs: { toc: true } }, +}); diff --git a/.storybook/public/kobalte-logo.svg b/.storybook/public/kobalte-logo.svg new file mode 100644 index 00000000..3cfa8037 --- /dev/null +++ b/.storybook/public/kobalte-logo.svg @@ -0,0 +1,9 @@ + + Kobalte. + diff --git a/.storybook/tsconfig.json b/.storybook/tsconfig.json new file mode 100644 index 00000000..e7ea5eb1 --- /dev/null +++ b/.storybook/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "module": "ESNext", + "moduleResolution": "Bundler", + "jsxImportSource": "@solidjs/web", + "customConditions": ["@solid-primitives/source"], + "verbatimModuleSyntax": false, + "types": ["vite/client"] + }, + "include": ["./**/*", "../packages/core/src/*/stories/**/*"] +} diff --git a/MIGRATION.md b/MIGRATION.md new file mode 100644 index 00000000..39aad710 --- /dev/null +++ b/MIGRATION.md @@ -0,0 +1,102 @@ +# Solid 2.0 Migration Guide + +## Import paths + +`JSX`, `ValidComponent`, and `ComponentProps` moved out of `solid-js` into `@solidjs/web`. + +```ts +// before +import type { JSX, ValidComponent, ComponentProps } from "solid-js"; + +// after +import type { JSX, ValidComponent, ComponentProps } from "@solidjs/web"; +``` + +`solid-js/web` (the DOM renderer) is now `@solidjs/web`. + +```ts +import { render } from "@solidjs/web"; +``` + +## HTML attributes are lowercase + +Solid 2.0 uses lowercase HTML attribute names on native elements, matching the HTML spec rather than React conventions. + +```tsx +// before +
+ + +// after +
+ +``` + +This affects any `RenderProps` interface whose props are spread onto native elements via `Polymorphic`. Both the interface definition and the JSX must use the lowercase name. + +Other affected attributes: `autocomplete`, `autocorrect`, `spellcheck`, `enterkeyhint`, `contenteditable`, `inputmode`. + +## Renamed helpers + +| Solid 1.x | Solid 2.0 | +|-----------|-----------| +| `mergeProps` | `merge` | +| `splitProps` | `omit` | +| `unwrap` | `snapshot` | +| `onMount` | `onSettled` | +| `createComputed` | `createEffect` (split form) / `createMemo` | +| `Index` | `` | +| `classList` | `class` (object/array accepted) | +| `batch` | removed — writes are auto-batched | + +## Effects: split compute/apply form + +`createEffect` now takes two functions. Reactive reads belong in the first (compute), side effects in the second (apply). + +```ts +// before +createEffect(on(source, (value) => { el.title = value; })); + +// after +createEffect( + () => source(), + (value) => { el.title = value; }, +); +``` + +Cleanup is returned from the apply function instead of using `onCleanup`. + +```ts +createEffect( + () => source(), + (value) => { + const id = setTimeout(() => doWork(value), 100); + return () => clearTimeout(id); + }, +); +``` + +## Context: no more `.Provider` + +```tsx +// before + + +// after + +``` + +## Store setters are draft-first + +```ts +// before +import { produce } from "solid-js/store"; +setStore(produce(s => { s.count++; })); + +// after +setStore(s => { s.count++; }); +``` + +## Signals: no writes inside reactive scope + +Writing to a signal inside a component body, memo, or effect throws `SIGNAL_WRITE_IN_OWNED_SCOPE` in dev. Derive values with `createMemo` instead, or write in event handlers. diff --git a/apps/docs/src/entry-client.tsx b/apps/docs/src/entry-client.tsx index cf73e0f7..93211d71 100644 --- a/apps/docs/src/entry-client.tsx +++ b/apps/docs/src/entry-client.tsx @@ -1,3 +1,3 @@ -import { StartClient, mount } from "@solidjs/start/client"; +import { mount, StartClient } from "@solidjs/start/client"; mount(() => , document.getElementById("app")!); diff --git a/apps/docs/src/examples/calendar.module.css b/apps/docs/src/examples/calendar.module.css new file mode 100644 index 00000000..8ea15970 --- /dev/null +++ b/apps/docs/src/examples/calendar.module.css @@ -0,0 +1,241 @@ +.calendar { + display: inline-block; + background-color: white; + border: 1px solid hsl(214 32% 91%); + border-radius: 10px; + padding: 16px; + box-shadow: 0 1px 3px rgb(0 0 0 / 0.07); + font-family: inherit; +} + +.calendar__header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 12px; +} + +.calendar__heading { + font-size: 14px; + font-weight: 600; + color: hsl(222 47% 11%); +} + +.calendar__nav_button { + appearance: none; + display: inline-flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + border-radius: 6px; + border: 1px solid hsl(214 32% 91%); + background-color: white; + color: hsl(215 16% 47%); + cursor: pointer; + font-size: 16px; + line-height: 1; + flex-shrink: 0; + transition: background-color 150ms, color 150ms; +} + +.calendar__nav_button:hover { + background-color: hsl(210 40% 96%); + color: hsl(222 47% 11%); +} + +.calendar__nav_button:focus-visible { + outline: 2px solid hsl(221 83% 53%); + outline-offset: 2px; +} + +.calendar__nav_button[disabled] { + opacity: 0.4; + cursor: default; +} + +.calendar__body { + display: flex; + gap: 24px; +} + +.calendar__grid { + border-collapse: collapse; + width: 100%; +} + +.calendar__day_name { + font-size: 11px; + font-weight: 500; + color: hsl(215 16% 47%); + text-align: center; + padding: 4px 0 8px; + text-transform: uppercase; + letter-spacing: 0.04em; +} + +.calendar__cell_trigger { + display: flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + border-radius: 9999px; + font-size: 13px; + cursor: pointer; + user-select: none; + color: hsl(222 47% 11%); + transition: background-color 100ms; +} + +.calendar__cell_trigger:focus-visible { + outline: 2px solid hsl(221 83% 53%); + outline-offset: 1px; +} + +.calendar__cell_trigger[data-selected] { + background-color: hsl(221 83% 53%); + color: white; +} + +.calendar__cell_trigger[data-today] { + font-weight: 600; + color: hsl(221 83% 53%); +} + +.calendar__cell_trigger[data-today][data-selected] { + color: white; +} + +.calendar__cell_trigger[data-highlighted] { + background-color: hsl(210 40% 94%); +} + +.calendar__cell_trigger[data-highlighted][data-selected] { + background-color: hsl(221 83% 47%); +} + +.calendar__cell_trigger:hover:not([data-selected]):not([data-disabled]):not([data-unavailable]) { + background-color: hsl(210 40% 96%); +} + +.calendar__cell_trigger[data-selected]:hover { + background-color: hsl(221 83% 47%); +} + +.calendar__cell_trigger[data-disabled] { + opacity: 0.3; + cursor: default; +} + +.calendar__cell_trigger[data-unavailable] { + text-decoration: line-through; + opacity: 0.4; + cursor: default; +} + +.calendar__cell_trigger[data-outside-month] { + opacity: 0.2; +} + +.calendar__controlled_output { + font-size: 12px; + color: hsl(215 16% 47%); + margin: 0; +} + +/* ─── Date picker ───────────────────────────────────────────────────────────── */ + +.datepicker { + display: inline-flex; + align-items: center; + border: 1px solid hsl(214 32% 91%); + border-radius: 8px; + background-color: white; + overflow: hidden; + transition: box-shadow 150ms; +} + +.datepicker:focus-within { + box-shadow: 0 0 0 2px hsl(221 83% 53% / 0.3); + border-color: hsl(221 83% 53%); +} + +.datepicker__input { + flex: 1; + border: none; + outline: none; + padding: 0 12px; + height: 38px; + font-size: 14px; + color: hsl(222 47% 11%); + background: transparent; + cursor: default; + min-width: 180px; +} + +.datepicker__input::placeholder { + color: hsl(215 16% 65%); +} + +.datepicker__button { + display: inline-flex; + align-items: center; + justify-content: center; + width: 36px; + height: 38px; + border: none; + border-left: 1px solid hsl(214 32% 91%); + background-color: white; + color: hsl(215 16% 47%); + cursor: pointer; + flex-shrink: 0; + transition: background-color 150ms, color 150ms; +} + +.datepicker__button:hover { + background-color: hsl(210 40% 96%); + color: hsl(221 83% 53%); +} + +.datepicker__button:focus-visible { + outline: 2px solid hsl(221 83% 53%); + outline-offset: -2px; +} + +.datepicker__button[data-expanded] { + background-color: hsl(210 40% 96%); + color: hsl(221 83% 53%); +} + +.datepicker__popover { + z-index: 50; + transform-origin: var(--kb-popover-content-transform-origin); + animation: datepicker-hide 150ms ease-in forwards; +} + +.datepicker__popover[data-expanded] { + animation: datepicker-show 150ms ease-out; +} + +@keyframes datepicker-show { + from { + opacity: 0; + transform: translateY(-4px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes datepicker-hide { + from { + opacity: 1; + transform: translateY(0); + } + to { + opacity: 0; + transform: translateY(-4px); + } +} diff --git a/apps/docs/src/examples/calendar.tsx b/apps/docs/src/examples/calendar.tsx new file mode 100644 index 00000000..ece7666a --- /dev/null +++ b/apps/docs/src/examples/calendar.tsx @@ -0,0 +1,289 @@ +import { GregorianCalendar, isWeekend } from "@internationalized/date"; +import { createMemo, createSignal, Show } from "solid-js"; + +import { Calendar, type DateValue } from "@kobalte/core/calendar"; +import { Popover } from "@kobalte/core/popover"; +import style from "./calendar.module.css"; + +const createCalendar = () => new GregorianCalendar(); + +function CalendarGrid(props: { offset?: { months: number } }) { + return ( + + + + {(day) => ( + + {day().slice(0, 2)} + + )} + + + + {(weekIndex) => ( + + {(date) => ( + }> + {(d) => ( + + + + )} + + )} + + )} + + + ); +} + +export function BasicExample() { + return ( + + + + ‹ + + + + › + + + + + + + ); +} + +export function MultipleExample() { + return ( + + + + ‹ + + + + › + + + + + + + ); +} + +export function RangeExample() { + return ( + + + + ‹ + + + + › + + + + + + + + ); +} + +export function ControlledExample() { + const [value, setValue] = createSignal(null); + + return ( +
+ setValue(v as DateValue)} + class={style.calendar} + > + + + ‹ + + + + › + + + + + + +

+ {value() ? `Selected: ${value()!.toString()}` : "No date selected"} +

+
+ ); +} + +export function DisabledDatesExample() { + return ( + isWeekend(date, "en-US")} + class={style.calendar} + > + + + ‹ + + + + › + + + + + + + ); +} + +function CalendarIcon() { + return ( + + ); +} + +export function DatePickerExample() { + const [open, setOpen] = createSignal(false); + const [value, setValue] = createSignal(null); + + const formatted = createMemo(() => { + const v = value(); + if (!v) return ""; + const tz = Intl.DateTimeFormat().resolvedOptions().timeZone; + return new Intl.DateTimeFormat("en-US", { + month: "long", + day: "numeric", + year: "numeric", + }).format(v.toDate(tz)); + }); + + return ( + + + + + + + + + + { + setValue(v as DateValue); + setOpen(false); + }} + class={style.calendar} + > + + + ‹ + + + + › + + + + + + + + + + ); +} diff --git a/apps/docs/src/examples/combobox.tsx b/apps/docs/src/examples/combobox.tsx index 7560f2f0..70d51b25 100644 --- a/apps/docs/src/examples/combobox.tsx +++ b/apps/docs/src/examples/combobox.tsx @@ -1,4 +1,5 @@ -import { For, createSignal } from "solid-js"; +import { Combobox } from "@kobalte/core/combobox"; +import { createSignal, For } from "solid-js"; import { CaretSortIcon, CheckIcon, CrossIcon } from "../components"; import style from "./combobox.module.css"; @@ -11,8 +12,6 @@ const ALL_STRING_OPTIONS = [ "Pineapple", ]; -import { Combobox } from "@kobalte/core/combobox"; - export function BasicExample() { return ( + Open drawer + + + +
+
+ Drawer + + + +
+ + Drag the handle or swipe down to dismiss. The overlay opacity and + drawer position both track your finger in real time. + + + + + ); +} + +export function SnapPointsExample() { + return ( + + + Open with snap points + + + + +
+
+ Snap points + + + +
+ + This drawer has three snap points: closed,{" "} + peek (40%), and expanded (100%). + Drag to snap between them. + + + + + ); +} + +export function ControlledExample() { + const [open, setOpen] = createSignal(false); + + return ( +
+ + + Open settings + + + + +
+ Settings + + + +
+ + Open state is controlled by an external signal. + +
+ +
+
+
+
+ +
+ ); +} diff --git a/apps/docs/src/examples/navigation-menu.tsx b/apps/docs/src/examples/navigation-menu.tsx index 21cfcba7..0713b385 100644 --- a/apps/docs/src/examples/navigation-menu.tsx +++ b/apps/docs/src/examples/navigation-menu.tsx @@ -1,5 +1,5 @@ import { RadioGroup } from "@kobalte/core/radio-group"; -import { For, createSignal } from "solid-js"; +import { createSignal, For } from "solid-js"; import { ChevronDownIcon } from "../components"; import style from "./navigation-menu.module.css"; diff --git a/apps/docs/src/examples/otp-field.module.css b/apps/docs/src/examples/otp-field.module.css new file mode 100644 index 00000000..3ded4786 --- /dev/null +++ b/apps/docs/src/examples/otp-field.module.css @@ -0,0 +1,76 @@ +.otp-field { + display: flex; + gap: 8px; + align-items: center; +} + +.otp-field__slot { + position: relative; + display: flex; + align-items: center; + justify-content: center; + width: 44px; + height: 52px; + border-radius: 8px; + border: 1.5px solid hsl(240 6% 90%); + font-size: 20px; + font-weight: 600; + color: hsl(240 4% 16%); + transition: + border-color 150ms, + box-shadow 150ms; + user-select: none; +} + +.otp-field__slot[data-active] { + border-color: hsl(200 98% 39%); + box-shadow: 0 0 0 3px hsl(200 98% 39% / 0.15); + z-index: 1; +} + +.otp-field__caret { + width: 1.5px; + height: 24px; + background-color: hsl(200 98% 39%); + border-radius: 999px; + animation: otp-caret-blink 1.2s ease-out infinite; +} + +@keyframes otp-caret-blink { + 0%, + 70%, + 100% { + opacity: 1; + } + 20%, + 50% { + opacity: 0; + } +} + +[data-kb-theme="dark"] .otp-field__slot { + border-color: hsl(240 5% 34%); + color: hsl(0 100% 100% / 0.9); +} + +[data-kb-theme="dark"] .otp-field__slot[data-active] { + border-color: hsl(200 98% 39%); + box-shadow: 0 0 0 3px hsl(200 98% 39% / 0.2); +} + +/* Animated variant — char span mounts on each keystroke, triggering the animation */ +.otp-field__char { + display: inline-block; + animation: otp-slip-in 0.5s cubic-bezier(0.16, 1, 0.3, 1) both; +} + +@keyframes otp-slip-in { + from { + transform: translateY(8px); + opacity: 0; + } + to { + transform: translateY(0); + opacity: 1; + } +} diff --git a/apps/docs/src/examples/otp-field.tsx b/apps/docs/src/examples/otp-field.tsx new file mode 100644 index 00000000..904f4ac8 --- /dev/null +++ b/apps/docs/src/examples/otp-field.tsx @@ -0,0 +1,186 @@ +import { OTPField, useOTPFieldContext } from "@kobalte/core/otp-field"; +import { createSignal, For } from "solid-js"; + +import style from "./otp-field.module.css"; + +function makeSlots(n: number) { + return Array.from({ length: n }, (_, i) => i); +} + +function OtpSlot(props: { index: number }) { + const context = useOTPFieldContext(); + const char = () => context.value()[props.index]; + const isActive = () => context.activeSlots().includes(props.index); + const showCaret = () => + context.isInserting() && context.activeSlots()[0] === props.index; + + return ( +
+ {showCaret() ?
: char()} +
+ ); +} + +export function BasicExample() { + return ( + + + {(i) => } + + ); +} + +export function DefaultValueExample() { + return ( + + + {(i) => } + + ); +} + +export function ControlledExample() { + const [value, setValue] = createSignal(""); + + return ( + <> + + + {(i) => } + +

Value: {value()}

+ + ); +} + +export function OnCompleteExample() { + const [status, setStatus] = createSignal("Enter your 6-digit code."); + + return ( + <> + setStatus(`Code submitted: ${v}`)} + onChange={() => setStatus("Enter your 6-digit code.")} + class={style["otp-field"]} + > + + {(i) => } + +

{status()}

+ + ); +} + +export function CustomPatternExample() { + return ( + + + {(i) => } + + ); +} + +// AnimatedOtpSlot uses an exclusive caret-or-char render so the char +// mounts fresh on every keystroke, which naturally fires the CSS pop-in animation. +function AnimatedOtpSlot(props: { index: number }) { + const context = useOTPFieldContext(); + const char = () => context.value()[props.index]; + const isActive = () => context.activeSlots().includes(props.index); + const showCaret = () => + context.isInserting() && context.activeSlots()[0] === props.index; + + return ( +
+ {showCaret() ? ( +
+ ) : ( + {char()} + )} +
+ ); +} + +export function AnimatedExample() { + return ( + + + {(i) => } + + ); +} + +export function ValidationExample() { + const [value, setValue] = createSignal(""); + + const isInvalid = () => value().length > 0 && value().length < 6; + + return ( +
+ + + Verification code + +
+ + {(i) => } +
+ + Enter the 6-digit code sent to your device. + + + Please enter all 6 digits. + +
+
+ ); +} + +export function HTMLFormExample() { + let formRef: HTMLFormElement | undefined; + + const onSubmit = (e: SubmitEvent) => { + e.preventDefault(); + e.stopPropagation(); + const formData = new FormData(formRef); + alert(JSON.stringify(Object.fromEntries(formData), null, 2)); + }; + + return ( + + + + {(i) => } + +
+ + +
+ + ); +} diff --git a/apps/docs/src/examples/radio-group.tsx b/apps/docs/src/examples/radio-group.tsx index a1856893..fd716eb4 100644 --- a/apps/docs/src/examples/radio-group.tsx +++ b/apps/docs/src/examples/radio-group.tsx @@ -1,9 +1,8 @@ -import { For, createSignal } from "solid-js"; +import { RadioGroup } from "@kobalte/core/radio-group"; +import { createSignal, For } from "solid-js"; import style from "./radio-group.module.css"; -import { RadioGroup } from "@kobalte/core/radio-group"; - export function BasicExample() { return ( diff --git a/apps/docs/src/examples/segmented-control.module.css b/apps/docs/src/examples/segmented-control.module.css index caf9347b..7714d19b 100644 --- a/apps/docs/src/examples/segmented-control.module.css +++ b/apps/docs/src/examples/segmented-control.module.css @@ -93,7 +93,8 @@ box-shadow: 0px 1px 3px rgba(0 0 0 / 8%), 0px 2px 8px rgba(0 0 0 / 12%), - inset 0px 0px 0px var(--indicator-focus-shadow-width, 0px) var(--indicator-focus-shadow-color), + inset 0px 0px 0px var(--indicator-focus-shadow-width, 0px) + var(--indicator-focus-shadow-color), inset 0px 0px 0px var(--border-width) var(--border-active-color); content: ""; opacity: var(--pane-opacity, 1); @@ -132,7 +133,8 @@ } .segmented-control__item:has(.segmented-control__item-input:checked)::before, -.segmented-control__item:has(.segmented-control__item-input:checked) + ::before { +.segmented-control__item:has(.segmented-control__item-input:checked) + + ::before { opacity: 0; } @@ -184,16 +186,19 @@ opacity: 0.5; } -.segmented-control__item-input:not(:checked, :disabled) + .segmented-control__item-label { +.segmented-control__item-input:not(:checked, :disabled) + + .segmented-control__item-label { cursor: pointer; opacity: var(--item-label-opacity, 1); user-select: none; } -.segmented-control__item-input:not(:checked, :disabled) + .segmented-control__item-label:hover { +.segmented-control__item-input:not(:checked, :disabled) + + .segmented-control__item-label:hover { --item-label-opacity: 0.75; } -.segmented-control__item-input:not(:checked, :disabled) + .segmented-control__item-label:active { +.segmented-control__item-input:not(:checked, :disabled) + + .segmented-control__item-label:active { --item-label-opacity: 0.5; } diff --git a/apps/docs/src/examples/segmented-control.tsx b/apps/docs/src/examples/segmented-control.tsx index fb05e1e4..d3b20d64 100644 --- a/apps/docs/src/examples/segmented-control.tsx +++ b/apps/docs/src/examples/segmented-control.tsx @@ -1,9 +1,8 @@ -import { For, createSignal } from "solid-js"; +import { SegmentedControl } from "@kobalte/core/segmented-control"; +import { createSignal, For } from "solid-js"; import style from "./segmented-control.module.css"; -import { SegmentedControl } from "@kobalte/core/segmented-control"; - export function BasicExample() { return ( diff --git a/apps/docs/src/examples/select.tsx b/apps/docs/src/examples/select.tsx index 9907ec75..21917228 100644 --- a/apps/docs/src/examples/select.tsx +++ b/apps/docs/src/examples/select.tsx @@ -1,5 +1,5 @@ import { createVirtualizer } from "@tanstack/solid-virtual"; -import { For, createSignal } from "solid-js"; +import { createSignal, For } from "solid-js"; import { CaretSortIcon, CheckIcon, CrossIcon } from "../components"; import style from "./select.module.css"; diff --git a/apps/docs/src/examples/tabs.tsx b/apps/docs/src/examples/tabs.tsx index a0cf9416..af9a827c 100644 --- a/apps/docs/src/examples/tabs.tsx +++ b/apps/docs/src/examples/tabs.tsx @@ -1,9 +1,8 @@ -import { For, createSignal } from "solid-js"; +import { Tabs } from "@kobalte/core/tabs"; +import { createSignal, For } from "solid-js"; import style from "./tabs.module.css"; -import { Tabs } from "@kobalte/core/tabs"; - export function BasicExample() { return ( diff --git a/apps/docs/src/examples/toggle-button.tsx b/apps/docs/src/examples/toggle-button.tsx index b46d7271..ea94ebe9 100644 --- a/apps/docs/src/examples/toggle-button.tsx +++ b/apps/docs/src/examples/toggle-button.tsx @@ -1,10 +1,9 @@ -import { Show, createSignal } from "solid-js"; +import { ToggleButton } from "@kobalte/core/toggle-button"; +import { createSignal, Show } from "solid-js"; import { VolumeOffIcon, VolumeOnIcon } from "../components"; import style from "./toggle-button.module.css"; -import { ToggleButton } from "@kobalte/core/toggle-button"; - export function BasicExample() { return ( diff --git a/apps/docs/src/examples/toggle-group.tsx b/apps/docs/src/examples/toggle-group.tsx index b008b484..3dea032c 100644 --- a/apps/docs/src/examples/toggle-group.tsx +++ b/apps/docs/src/examples/toggle-group.tsx @@ -1,7 +1,6 @@ -import { type JSXElement, createSignal } from "solid-js"; -import style from "./toggle-group.module.css"; - import { ToggleGroup } from "@kobalte/core/toggle-group"; +import { createSignal, type JSXElement } from "solid-js"; +import style from "./toggle-group.module.css"; export function BasicExample() { return ( diff --git a/apps/docs/src/routes/docs/changelog/2-0-x.mdx b/apps/docs/src/routes/docs/changelog/2-0-x.mdx new file mode 100644 index 00000000..892b52e7 --- /dev/null +++ b/apps/docs/src/routes/docs/changelog/2-0-x.mdx @@ -0,0 +1,46 @@ +# v2.0.x + +## v2.0.0 + +**Breaking changes** + +- **Solid 2.0 is now required.** Peer dependencies are `solid-js@^2.0.0` and `@solidjs/web@^2.0.0`. Solid 1.x is no longer supported. +- The JSX import source has changed from `solid-js` to `@solidjs/web`. Update your `tsconfig.json`: + ```json + { "compilerOptions": { "jsxImportSource": "@solidjs/web" } } + ``` +- `JSX` namespace types and DOM-specific component types must now be imported from `@solidjs/web` instead of `solid-js`. +- Context providers now use the `value` prop directly — `` is replaced by ``. +- `tabIndex` prop renamed to lowercase `tabindex` to match the Solid 2.0 DOM attribute convention. + +**New features** + +- [New `Drawer` component](/docs/core/components/drawer) — a panel that slides in from any edge of the screen with drag-to-dismiss, snap-point support, and real-time overlay opacity tracking. Adapted from [corvu/drawer](https://github.com/corvudev/corvu/tree/main/packages/drawer) by Jasmin Noetzli (MIT). +- [New `Resizable` component](/docs/core/components/resizable) — a set of panels that can be resized by dragging the handles between them. Supports horizontal and vertical layouts, collapsible panels, pixel or fraction sizes, nested layouts, and full keyboard navigation. Adapted from [corvu/resizable](https://github.com/corvudev/corvu/tree/main/packages/resizable) by Jasmin Noetzli (MIT). +- [New `OTPField` component](/docs/core/components/otp-field) — an accessible one-time password input built from a hidden native `` and fully customisable visual slots. Supports autofill, custom character patterns, caret tracking, and Kobalte's standard form control system. + +**Solid Primitives integration** + +Internal primitives have been replaced with their `@solid-primitives` equivalents, reducing the custom code surface and aligning with the broader Solid ecosystem: + +- `createControllableSignal` → `@solid-primitives/controlled-signal` +- `createFormResetListener` → `@solid-primitives/form` +- `createSize` / `createElementSize` → `@solid-primitives/resize-observer` +- Reduced-motion detection → `@solid-primitives/media` (via interaction) +- Presence/exit animation management → `@solid-primitives/presence` +- i18n utilities → `@solid-primitives/i18n` +- Keyboard shortcut tracking → `@solid-primitives/keyboard` +- `combineStyle` / prop utilities → `@solid-primitives/props` +- Scroll locking → `@solid-primitives/scroll` +- A11y helpers → `@solid-primitives/a11y` +- Focus management → `@solid-primitives/focus` + +**Internal changes** + +- All components ported to the Solid 2.0 API: split `createEffect(compute, apply)` form, `omit` replacing `splitProps`, `merge` replacing `mergeProps`, auto-batched writes, and `` / `` replacing `` / `` in internal use. +- `createTransition` removed — superseded by Solid 2.0's built-in transition model. +- TypeScript updated to 6.0 with stricter type checking applied across all components. +- Biome updated to 2.5.1 for formatting and linting. +- pnpm updated to 11. +- Vite updated to 6, Vitest to 2, Storybook to 10, Tailwind CSS to 4. +- `@solidjs/testing-library` updated to 1.0.0-beta.2. diff --git a/apps/docs/src/routes/docs/core/(1)components/calendar.mdx b/apps/docs/src/routes/docs/core/(1)components/calendar.mdx new file mode 100644 index 00000000..b9fa6dbe --- /dev/null +++ b/apps/docs/src/routes/docs/core/(1)components/calendar.mdx @@ -0,0 +1,631 @@ +import { Preview, TabsSnippets } from "../../../../components"; +import { + BasicExample, + MultipleExample, + RangeExample, + ControlledExample, + DisabledDatesExample, + DatePickerExample, +} from "../../../../examples/calendar"; + +# Calendar + +A calendar displays one or more date grids and allows users to select a single date, multiple dates, or a date range. Ported from [corvu/calendar](https://corvu.dev/docs/primitives/calendar) by Jasmin Noetzli (MIT). + +## Import + +```ts +import { Calendar } from "@kobalte/core/calendar"; +// or +import { + Root, Header, Heading, PrevTrigger, NextTrigger, + Body, Grid, GridHeader, GridHeaderRow, GridHeaderCell, + GridBody, GridBodyRow, GridBodyCell, GridBodyCellTrigger, +} from "@kobalte/core/calendar"; +``` + +## Features + +- Single, multiple, and range selection modes. +- Keyboard navigation — arrow keys move focus, `Enter`/`Space` select. +- `minValue` / `maxValue` constraints with disabled state for out-of-range dates. +- `isDateUnavailable` callback marks specific dates as unavailable. +- Controlled and uncontrolled value. +- Internationalised via `@internationalized/date` — pluggable calendar systems (Gregorian, Buddhist, Hebrew, etc.). +- Live region announcements for screen readers. +- ARIA `role="group"` on root, `role="button"` on each day cell. + +## Anatomy + +- **Calendar.Root:** The root container. Manages all calendar state. +- **Calendar.Header:** Wraps the heading and navigation triggers. +- **Calendar.Heading:** Displays the visible date range label (e.g. "June 2025"). +- **Calendar.PrevTrigger:** Navigates to the previous page. +- **Calendar.NextTrigger:** Navigates to the next page. +- **Calendar.Body:** Wraps one or more `Calendar.Grid` elements. +- **Calendar.Grid:** Renders a `
` for one visible month (or duration). Accepts an `offset` prop to show additional months. +- **Calendar.GridHeader:** The `` section. +- **Calendar.GridHeaderRow:** A row of day-name header cells. +- **Calendar.GridHeaderCell:** A single day-name cell (e.g. "Mo"). +- **Calendar.GridBody:** The `` section. +- **Calendar.GridBodyRow:** A week row. Requires a `weekIndex` prop. +- **Calendar.GridBodyCell:** A `
` wrapping one day. Requires a `date` prop. +- **Calendar.GridBodyCellTrigger:** The interactive button inside each cell. + +```tsx + + + + + + + + + + + {(day) => {day()}} + + + + {(weekIndex) => ( + + {(date) => ( + }> + {(d) => ( + + + + )} + + )} + + )} + + + + +``` + +## Example + + + + + + + + index.tsx + style.css + + {/* */} + + ```tsx + import { Show } from "solid-js"; + import { Calendar } from "@kobalte/core/calendar"; + import { GregorianCalendar } from "@internationalized/date"; + import "./style.css"; + + const createCalendar = () => new GregorianCalendar(); + + function App() { + return ( + + + + ‹ + + + + › + + + + + + + {(day) => ( + + {day().slice(0, 2)} + + )} + + + + {(weekIndex) => ( + + {(date) => ( + }> + {(d) => ( + + + + )} + + )} + + )} + + + + + ); + } + ``` + + + ```css + .calendar { + display: inline-block; + background-color: white; + border: 1px solid hsl(214 32% 91%); + border-radius: 10px; + padding: 16px; + } + + .calendar__header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 12px; + } + + .calendar__heading { + font-size: 14px; + font-weight: 600; + } + + .calendar__nav-button { + display: inline-flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + border-radius: 6px; + border: 1px solid hsl(214 32% 91%); + background-color: white; + cursor: pointer; + } + + .calendar__nav-button[disabled] { + opacity: 0.4; + cursor: default; + } + + .calendar__body { + display: flex; + gap: 24px; + } + + .calendar__grid { + border-collapse: collapse; + } + + .calendar__day-name { + font-size: 11px; + text-align: center; + padding: 4px 0 8px; + text-transform: uppercase; + } + + .calendar__cell-trigger { + display: flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + border-radius: 9999px; + font-size: 13px; + cursor: pointer; + } + + .calendar__cell-trigger[data-selected] { + background-color: hsl(221 83% 53%); + color: white; + } + + .calendar__cell-trigger[data-today] { + font-weight: 600; + color: hsl(221 83% 53%); + } + + .calendar__cell-trigger[data-disabled] { + opacity: 0.3; + cursor: default; + } + + .calendar__cell-trigger[data-unavailable] { + text-decoration: line-through; + opacity: 0.4; + cursor: default; + } + + .calendar__cell-trigger[data-outside-month] { + opacity: 0.2; + } + ``` + + {/* */} + + +## Usage + +### Selection modes + +Use `selectionMode` to control what the user can pick. + +**Single** — default, picks one date at a time: + +```tsx + + ... + +``` + +**Multiple** — click any day to toggle it; multiple dates can be selected simultaneously: + + + + + +```tsx + + ... + +``` + +**Range** — click a start date, then an end date to select a contiguous span. Show multiple months side-by-side by setting `visibleDuration` and rendering additional `Calendar.Grid` elements with an `offset`: + + + + + +```tsx + + ... + + + + + +``` + +### Controlled value + +Pass `value` and `onChange` to control the selection externally. The value type matches the selection mode: `DateValue` for `"single"`, `DateValue[]` for `"multiple"`, and `RangeValue` for `"range"`. + + + + + +```tsx +import { createSignal } from "solid-js"; +import type { DateValue } from "@kobalte/core/calendar"; + +function App() { + const [value, setValue] = createSignal(null); + + return ( + setValue(v)} + > + ... + + ); +} +``` + +### Unavailable dates + +Use `isDateUnavailable` to mark specific dates as unselectable. Unavailable dates receive `data-unavailable` and cannot be focused via keyboard navigation. + + + + + +```tsx +import { isWeekend } from "@internationalized/date"; + + isWeekend(date, "en-US")} +> + ... + +``` + +In range mode, combine with `allowsNonContiguousRanges` to permit ranges that span unavailable dates: + +```tsx + isWeekend(date, "en-US")} + allowsNonContiguousRanges +> + ... + +``` + +### Min / max dates + +Constrain selectable dates with `minValue` and `maxValue`. Dates outside the range are disabled. + +```tsx +import { CalendarDate } from "@internationalized/date"; + + + ... + +``` + +### Default value + +Use `defaultValue` for an uncontrolled calendar with an initial selection: + +```tsx +import { CalendarDate } from "@internationalized/date"; + + + ... + +``` + +### Read only + +Set `readOnly` to show the current selection without allowing changes: + +```tsx + + ... + +``` + +### Disabled + +Set `disabled` to render the calendar in a non-interactive state: + +```tsx + + ... + +``` + +### Locale + +Pass a BCP 47 locale string to `locale` to control formatting (day names, month names, week start day): + +```tsx + + ... + +``` + +### Non-Gregorian calendars + +Supply any `@internationalized/date` calendar to `createCalendar`. The component adapts its grid logic automatically: + +```tsx +import { HebrewCalendar } from "@internationalized/date"; + + new HebrewCalendar()} selectionMode="single"> + ... + +``` + +## Date picker pattern + +Combine `Calendar` with `Popover` to build a date picker — an input that shows the selected date and a button that opens the calendar in a floating panel. + + + + + + + + index.tsx + style.css + + {/* */} + + ```tsx + import { createMemo, createSignal, Show } from "solid-js"; + import { Calendar, type DateValue } from "@kobalte/core/calendar"; + import { Popover } from "@kobalte/core/popover"; + import { GregorianCalendar } from "@internationalized/date"; + import "./style.css"; + + const createCalendar = () => new GregorianCalendar(); + + function DatePicker() { + const [open, setOpen] = createSignal(false); + const [value, setValue] = createSignal(null); + + const formatted = createMemo(() => { + const v = value(); + if (!v) return ""; + const tz = Intl.DateTimeFormat().resolvedOptions().timeZone; + return new Intl.DateTimeFormat("en-US", { + month: "long", day: "numeric", year: "numeric", + }).format(v.toDate(tz)); + }); + + return ( + + + + + {/* calendar icon */} + + + + + { + setValue(v as DateValue); + setOpen(false); + }} + class="calendar" + > + + + + + + + + + + {(day) => {day().slice(0, 2)}} + + + + {(weekIndex) => ( + + {(date) => ( + }> + {(d) => ( + + + + )} + + )} + + )} + + + + + + + + ); + } + ``` + + + ```css + .datepicker { + display: inline-flex; + align-items: center; + border: 1px solid hsl(214 32% 91%); + border-radius: 8px; + background-color: white; + overflow: hidden; + } + + .datepicker:focus-within { + box-shadow: 0 0 0 2px hsl(221 83% 53% / 0.3); + border-color: hsl(221 83% 53%); + } + + .datepicker__input { + flex: 1; + border: none; + outline: none; + padding: 0 12px; + height: 38px; + font-size: 14px; + background: transparent; + cursor: default; + min-width: 180px; + } + + .datepicker__input::placeholder { + color: hsl(215 16% 65%); + } + + .datepicker__button { + display: inline-flex; + align-items: center; + justify-content: center; + width: 36px; + height: 38px; + border: none; + border-left: 1px solid hsl(214 32% 91%); + background-color: white; + cursor: pointer; + } + + .datepicker__button:hover, + .datepicker__button[data-expanded] { + background-color: hsl(210 40% 96%); + color: hsl(221 83% 53%); + } + + .datepicker__popover { + z-index: 50; + transform-origin: var(--kb-popover-content-transform-origin); + animation: datepicker-hide 150ms ease-in forwards; + } + + .datepicker__popover[data-expanded] { + animation: datepicker-show 150ms ease-out; + } + + @keyframes datepicker-show { + from { opacity: 0; transform: translateY(-4px); } + to { opacity: 1; transform: translateY(0); } + } + + @keyframes datepicker-hide { + from { opacity: 1; transform: translateY(0); } + to { opacity: 0; transform: translateY(-4px); } + } + ``` + + {/* */} + + +## Data attributes + +### Calendar.GridBodyCellTrigger + +| Attribute | Value | +|---|---| +| `data-selected` | Present when the date is selected. | +| `data-today` | Present when the date is today. | +| `data-highlighted` | Present when the date is focused (keyboard). | +| `data-disabled` | Present when the date is disabled. | +| `data-unavailable` | Present when `isDateUnavailable` returns `true`. | +| `data-invalid` | Present when `validationState="invalid"`. | +| `data-weekend` | Present for weekend dates. | +| `data-outside-month` | Present when the date falls outside the grid's month. | +| `data-outside-visible-range` | Present when the date falls outside the visible range. | +| `data-selection-start` | Present on the start date of a range selection. | +| `data-selection-end` | Present on the end date of a range selection. | +| `data-value` | The ISO string of the date (e.g. `"2025-06-15"`). | +| `data-type` | Always `"day"`. | + +## Credits + +Calendar logic ported from [corvu/calendar](https://github.com/corvudev/corvu/tree/main/packages/calendar) by Jasmin Noetzli, licensed MIT. State management also draws on [React Spectrum's `useCalendarState`](https://github.com/adobe/react-spectrum), licensed Apache 2.0. diff --git a/apps/docs/src/routes/docs/core/(1)components/drawer.mdx b/apps/docs/src/routes/docs/core/(1)components/drawer.mdx new file mode 100644 index 00000000..4ebbc07a --- /dev/null +++ b/apps/docs/src/routes/docs/core/(1)components/drawer.mdx @@ -0,0 +1,464 @@ +import { Preview, Kbd, TabsSnippets } from "../../../../components"; +import { BasicExample, SnapPointsExample, ControlledExample } from "../../../../examples/drawer"; + +# Drawer + +A panel that slides in from the edge of the screen with drag-to-dismiss and snap-point support. Built on [Dialog](/docs/core/components/dialog) with a two-signal open pattern so content stays mounted during the closing animation. + +## Import + +```ts +import { Drawer } from "@kobalte/core/drawer"; +// or +import { Root, Trigger, Content, Overlay, Portal, CloseButton, Title, Description } from "@kobalte/core/drawer"; +``` + +## Features + +- Slides in from any of the four edges (`bottom`, `top`, `left`, `right`). +- Drag-to-dismiss with configurable snap points and velocity-based release. +- Overlay opacity tracks the drag position in real time. +- Scrollable children are handled automatically — the drag gesture does not conflict with internal scrolling. +- Snap points accept fractional values (`0`–`1`) or absolute pixel strings (`"200px"`). +- Programmatic snap-point control via `useContext().setActiveSnapPoint`. +- Supports modal and non-modal modes. +- Focus is trapped and scroll is locked when modal. +- Pressing Esc closes the drawer. +- Can be controlled or uncontrolled. + +## Anatomy + +- **Drawer:** Contains all the parts of a drawer. +- **Drawer.Trigger:** The button that opens the drawer. +- **Drawer.Portal:** Portals its children into the `body` when the drawer is open. +- **Drawer.Overlay:** The layer that covers the inert portion of the view when the drawer is open. Opacity is driven automatically by `openPercentage`. +- **Drawer.Content:** Contains the content rendered when the drawer is open. Handles all pointer and touch drag gestures. +- **Drawer.CloseButton:** The button that closes the drawer. +- **Drawer.Title:** An accessible title announced when the drawer is opened. +- **Drawer.Description:** An optional accessible description announced when the drawer is opened. + +```tsx + + + + + + + + + + + +``` + +## Example + + + + + + + + index.tsx + style.css + + {/* */} + + ```tsx + import { Drawer } from "@kobalte/core/drawer"; + import { CrossIcon } from "some-icon-library"; + import "./style.css"; + + function App() { + return ( + + Open drawer + + + +
+
+ Drawer + + + +
+ + Drag the handle or swipe down to dismiss. + + + + + ); + } + ``` + + + ```css + .drawer__trigger { + display: inline-flex; + align-items: center; + justify-content: center; + height: 40px; + padding: 0 16px; + border: none; + border-radius: 6px; + background-color: hsl(200 98% 39%); + color: white; + font-size: 16px; + cursor: pointer; + } + + /* Opacity is driven by JS (openPercentage). Only a CSS transition is needed. */ + .drawer__overlay { + position: fixed; + inset: 0; + z-index: 50; + background-color: rgb(0 0 0 / 0.4); + transition: opacity 350ms cubic-bezier(0.32, 0.72, 0, 1); + } + + .drawer__content { + position: fixed; + z-index: 50; + bottom: 0; + left: 0; + width: 100%; + height: 320px; + background-color: white; + border-radius: 12px 12px 0 0; + border-top: 1px solid hsl(240 5% 84%); + padding: 16px 24px 32px; + outline: none; + /* The drawer applies transform via inline style. This transition animates it. */ + transition: transform 350ms cubic-bezier(0.32, 0.72, 0, 1); + } + + .drawer__handle { + width: 48px; + height: 4px; + background-color: hsl(240 5% 84%); + border-radius: 9999px; + margin: 0 auto 16px; + } + + .drawer__header { + display: flex; + align-items: baseline; + justify-content: space-between; + margin-bottom: 8px; + } + + .drawer__close-button { + height: 16px; + width: 16px; + color: hsl(240 5% 34%); + } + + .drawer__title { + font-size: 18px; + font-weight: 500; + color: hsl(240 6% 10%); + } + + .drawer__description { + font-size: 14px; + color: hsl(240 5% 26%); + } + ``` + + {/* */} + + +## Usage + +### Side + +Use the `side` prop to control which edge of the viewport the drawer slides in from. + +```tsx +... +... +... +... {/* default */} +``` + +The `Drawer.Content` must be positioned against the matching edge: + +```css +/* right drawer */ +.drawer__content { + position: fixed; + top: 0; + right: 0; + height: 100%; + width: 320px; + transition: transform 350ms cubic-bezier(0.32, 0.72, 0, 1); +} + +/* bottom drawer */ +.drawer__content { + position: fixed; + bottom: 0; + left: 0; + width: 100%; + height: 320px; + transition: transform 350ms cubic-bezier(0.32, 0.72, 0, 1); +} +``` + +### Snap points + +Snap points define the positions the drawer can settle at. Each value is either a fraction of the drawer size (`0` = fully closed, `1` = fully open) or a pixel string (`"200px"`). + + + + + +```tsx +// Three snap points: closed, 40% peek, fully open + + ... + + +// Pixel-based snap point + + ... + +``` + +`defaultSnapPoint` sets which snap point the drawer opens to. Defaults to `1` (fully open). + +### Default open + +```tsx +... +``` + +### Controlled open + +The `open` prop makes the open state controlled. The `onOpenChange` event fires whenever the user interacts with the trigger, overlay, close button, or escape key. + + + + + +```tsx {3,6} +import { createSignal } from "solid-js"; + +function ControlledExample() { + const [open, setOpen] = createSignal(false); + + return ( + + ... + + ); +} +``` + +### Programmatic snap + +Access `setActiveSnapPoint` from context to snap to a specific position without dragging. + +```tsx +import { Drawer } from "@kobalte/core/drawer"; + +function SnapButtons() { + const ctx = Drawer.useContext(); + + return ( + <> + + + + ); +} + +function App() { + return ( + + Open + + + + + + + + ); +} +``` + +### Non-modal + +Set `modal={false}` to keep the background interactive and remove the overlay. Focus is not trapped. + +```tsx + + Open + + {/* No Drawer.Overlay */} + ... + + +``` + +### Drag handle + +Add a visible drag handle to hint that the drawer is draggable. Any element inside `Drawer.Content` is draggable by default — use `data-no-drag` to opt specific elements out. + +```tsx + +
+ ... + {/* This element will not initiate a drag */} +
Non-draggable region
+ +``` + +### Animating the overlay + +`Drawer.Overlay` automatically drives its `opacity` from the drawer's `openPercentage` (0 when fully closed, 1 when fully open). This means opacity tracks the drag position in real time with no extra JavaScript. + +To animate the opacity on open/close, add a CSS transition: + +```css +.drawer__overlay { + position: fixed; + inset: 0; + background-color: rgb(0 0 0 / 0.4); + /* opacity changes will be animated */ + transition: opacity 350ms cubic-bezier(0.32, 0.72, 0, 1); +} +``` + +The transition is automatically suppressed during drag so the opacity follows the finger instantly. + +### Custom damping and velocity + +Control the rubber-band feel when dragging past the most-open snap point, and the velocity threshold for snap selection on release. + +```tsx + 6 * Math.log(distance + 1)} + // Custom velocity: use raw distance/time ratio with no clamping + velocityFunction={(distance, time) => distance / time} + // Reset velocity window every 100ms (default: 200) + velocityCacheReset={100} + // Prevent fast flings from skipping intermediate snap points + allowSkippingSnapPoints={false} +> + ... + +``` + +## API Reference + +### Drawer + +`Drawer` is equivalent to the `Root` import from `@kobalte/core/drawer`. + +| Prop | Description | +| :--- | :--- | +| open | `boolean`
The controlled open state of the drawer. | +| defaultOpen | `boolean`
The default open state when initially rendered. Useful when you do not need to control the open state. | +| onOpenChange | `(open: boolean) => void`
Event handler called when the open state changes. | +| side | `"bottom" \| "top" \| "left" \| "right"`
Which edge of the viewport the drawer slides in from. **Default:** `"bottom"` | +| snapPoints | `DrawerSize[]`
Positions the drawer can settle at. Each value is a fraction (`0`–`1`) or a pixel string (`"200px"`). `0` = fully closed, `1` = fully open. **Default:** `[0, 1]` | +| breakPoints | `(DrawerSize \| null)[]`
Custom thresholds between adjacent snap points. Length must equal `snapPoints.length - 1`. Pass `null` to use the default midpoint. | +| defaultSnapPoint | `DrawerSize`
The snap point the drawer opens to. **Default:** `1` | +| activeSnapPoint | `DrawerSize`
The controlled active snap point. | +| onActiveSnapPointChange | `(snapPoint: DrawerSize) => void`
Event handler called when the active snap point changes. | +| dampFunction | `(distance: number) => number`
Controls rubber-band resistance when dragging past the most-open snap point. **Default:** `(d) => 6 * Math.log(d + 1)` | +| velocityFunction | `(distance: number, time: number) => number`
Computes the velocity multiplier used to project the release position for snap selection. **Default:** `d / t`, clamped to `1` when `\|v\| < 1` | +| velocityCacheReset | `number`
Milliseconds after which the cached drag distance resets for velocity calculation. **Default:** `200` | +| allowSkippingSnapPoints | `boolean`
Whether a high-velocity release can skip intermediate snap points. **Default:** `true` | +| handleScrollableElements | `boolean`
Whether the drag gesture yields to scrollable children. **Default:** `true` | +| id | `string`
A unique identifier for the component. If not provided, a generated id is used. | +| modal | `boolean`
When `true`: interaction with outside elements is disabled, scroll is locked, and focus is trapped inside the content. **Default:** `true` | +| preventScroll | `boolean`
Whether scroll should be locked even when `modal` is `false`. | +| translations | [`DrawerIntlTranslations`](https://github.com/kobaltedev/kobalte/blob/main/packages/core/src/dialog/dialog.intl.ts)
Localization strings. | + +### Drawer.Content + +| Prop | Description | +| :--- | :--- | +| onOpenAutoFocus | `(event: Event) => void`
Event handler called when focus moves into the content after opening. Can be prevented by calling `event.preventDefault`. | +| onCloseAutoFocus | `(event: Event) => void`
Event handler called when focus returns to the trigger after closing. Can be prevented by calling `event.preventDefault`. | +| onEscapeKeyDown | `(event: KeyboardEvent) => void`
Event handler called when the escape key is pressed. Can be prevented by calling `event.preventDefault`. | +| onPointerDownOutside | `(event: PointerDownOutsideEvent) => void`
Event handler called when a pointer event occurs outside the content. Can be prevented by calling `event.preventDefault`. | +| onFocusOutside | `(event: FocusOutsideEvent) => void`
Event handler called when focus moves outside the content. Can be prevented by calling `event.preventDefault`. | +| onInteractOutside | `(event: InteractOutsideEvent) => void`
Event handler called when an interaction occurs outside the content. Can be prevented by calling `event.preventDefault`. | + +| Data attribute | Description | +| :--- | :--- | +| data-side | The side the drawer appears from: `"bottom"`, `"top"`, `"left"`, or `"right"`. | +| data-expanded | Present when the drawer is open. | +| data-closed | Present when the drawer is closed. | +| data-opening | Present during the open transition. | +| data-closing | Present during the close transition. | +| data-snapping | Present while snapping to a snap point after a drag gesture. | +| data-transitioning | Present during any transition (opening, closing, or snapping). | + +### Drawer.Overlay + +| Data attribute | Description | +| :--- | :--- | +| data-expanded | Present when the drawer is open. | +| data-closing | Present during the close transition. | +| data-transitioning | Present during any transition. | + +### Drawer.Trigger + +`Drawer.Trigger` consists of [Button](/docs/core/components/button). + +| Data attribute | Description | +| :--- | :--- | +| data-expanded | Present when the drawer is open. | +| data-closed | Present when the drawer is closed. | + +### Drawer.useContext + +Access the drawer's reactive state from any component inside `Drawer`. Useful for reading position, building custom controls, or snapping programmatically. + +```tsx +const ctx = Drawer.useContext(); + +ctx.side() // DrawerSide — "bottom" | "top" | "left" | "right" +ctx.activeSnapPoint() // DrawerSize — the current snap point value +ctx.setActiveSnapPoint() // (snapPoint: DrawerSize) => void +ctx.openPercentage() // number — 0 (closed) to 1 (open), tracks drag in real time +ctx.translate() // number — pixel offset from the fully-open position +ctx.isDragging() // boolean +ctx.isTransitioning() // boolean +ctx.transitionState() // null | "opening" | "closing" | "snapping" +``` + +## Rendered elements + +| Component | Default rendered element | +| :--- | :--- | +| `Drawer` | none | +| `Drawer.Trigger` | `button` | +| `Drawer.Portal` | `Portal` | +| `Drawer.Overlay` | `div` | +| `Drawer.Content` | `div` | +| `Drawer.CloseButton` | `button` | +| `Drawer.Title` | `h2` | +| `Drawer.Description` | `p` | + +## Accessibility + +### Keyboard Interactions + +| Key | Description | +| :--- | :--- | +| Space | When focus is on the trigger, opens/closes the drawer. | +| Enter | When focus is on the trigger, opens/closes the drawer. | +| Tab | Moves focus to the next focusable element inside the drawer. | +| Shift + Tab | Moves focus to the previous focusable element inside the drawer. | +| Esc | Closes the drawer and returns focus to the trigger. | + +> Snap-point architecture and drag math are adapted from [corvu/drawer](https://github.com/corvudev/corvu/tree/main/packages/drawer) by Jasmin Noetzli (MIT). diff --git a/apps/docs/src/routes/docs/core/(1)components/otp-field.mdx b/apps/docs/src/routes/docs/core/(1)components/otp-field.mdx new file mode 100644 index 00000000..d6eec593 --- /dev/null +++ b/apps/docs/src/routes/docs/core/(1)components/otp-field.mdx @@ -0,0 +1,415 @@ +import { Preview, TabsSnippets } from "../../../../components"; +import { + AnimatedExample, + BasicExample, + ControlledExample, + CustomPatternExample, + DefaultValueExample, + HTMLFormExample, + OnCompleteExample, + ValidationExample, +} from "../../../../examples/otp-field"; + +# OTP Field + +An accessible one-time password input built from a hidden native `` and fully customizable visual slots. + +## Import + +```ts +import { OTPField } from "@kobalte/core/otp-field"; +// or +import { Root, Input, Label, Description, ErrorMessage } from "@kobalte/core/otp-field"; +// or (deprecated) +import { OTPField } from "@kobalte/core"; +``` + +## Features + +- Built with a hidden native `` that handles all keyboard interaction and browser autofill. +- Visual slots are fully customizable — build any design using the provided context hook. +- Active slot and caret position tracking exposed via context. +- Supports custom character patterns via a regex `pattern` prop. +- Syncs with form reset events. +- Can be controlled or uncontrolled. +- Shifts password manager icons to avoid overlapping the slots. +- Integrates with Kobalte's form control system — supports `validationState`, `required`, `disabled`, and `readOnly` with associated Label, Description, and ErrorMessage sub-components. + +## Anatomy + +The OTP field consists of: + +- **OTPField**: The root container that manages value state and provides form control context. +- **OTPField.Label**: A label that gives the user information on the OTP field. +- **OTPField.Input**: The hidden native `` that handles keyboard events, autofill, and selection tracking. +- **OTPField.Description**: A description that gives the user more information on the OTP field. +- **OTPField.ErrorMessage**: An error message that gives the user information on how to fix a validation error. +- **Slot** *(user-defined)*: A visual character cell built with `useOTPFieldContext`. + +```tsx + + + + {/* user-defined slot elements */} + + + +``` + +## Example + + + + + + + + index.tsx + style.css + + {/* */} + + ```tsx + import { OTPField, useOTPFieldContext } from "@kobalte/core/otp-field"; + import { For } from "solid-js"; + import "./style.css"; + + function makeSlots(n: number) { + return Array.from({ length: n }, (_, i) => i); + } + + function OtpSlot(props: { index: number }) { + const context = useOTPFieldContext(); + const char = () => context.value()[props.index]; + const isActive = () => context.activeSlots().includes(props.index); + const showCaret = () => + context.isInserting() && context.activeSlots()[0] === props.index; + + return ( +
+ {showCaret() ?
: char()} +
+ ); + } + + function App() { + return ( + + + {(i) => } + + ); + } + ``` + + + + ```css + .otp-field { + display: flex; + gap: 8px; + align-items: center; + } + + .otp-field__slot { + position: relative; + display: flex; + align-items: center; + justify-content: center; + width: 44px; + height: 52px; + border-radius: 8px; + border: 1.5px solid hsl(240 6% 90%); + font-size: 20px; + font-weight: 600; + color: hsl(240 4% 16%); + transition: border-color 150ms, box-shadow 150ms; + user-select: none; + } + + .otp-field__slot[data-active] { + border-color: hsl(200 98% 39%); + box-shadow: 0 0 0 3px hsl(200 98% 39% / 0.15); + } + + .otp-field__caret { + width: 1.5px; + height: 24px; + background-color: hsl(200 98% 39%); + border-radius: 999px; + animation: otp-caret-blink 1.2s ease-out infinite; + } + + @keyframes otp-caret-blink { + 0%, 70%, 100% { opacity: 1; } + 20%, 50% { opacity: 0; } + } + ``` + + + {/* */} + + +## Usage + +### Default value + +An initial, uncontrolled value can be provided using the `defaultValue` prop. + + + + + +```tsx {0} + + + {(i) => } + +``` + +### Controlled value + +The `value` and `onChange` props can be used to make the value controlled. + + + + + +```tsx {3,4,7-9} +import { createSignal } from "solid-js"; + +function ControlledExample() { + const [value, setValue] = createSignal(""); + + return ( + <> + + + {(i) => } + +

Value: {value()}

+ + ); +} +``` + +### Completion callback + +The `onComplete` prop fires once when all slots are filled. + + + + + +```tsx {5-7} + console.log("Complete:", v)} +> + + {(i) => } + +``` + +### Custom character pattern + +By default the input only accepts digits (`^\d*$`). Pass a `pattern` prop on `OTPField.Input` to allow other characters. + + + + + +```tsx {2} + + + {(i) => } + +``` + +Pass `pattern={null}` to disable validation entirely and allow any character. + +### Animated slots + +Render the caret and character **exclusively** (not overlaid) so the character `` mounts fresh on every keystroke. The CSS `animation` property fires on mount, producing a pop-in effect with no JavaScript. + + + + + + + + index.tsx + style.css + + {/* */} + + ```tsx + function AnimatedOtpSlot(props: { index: number }) { + const context = useOTPFieldContext(); + const char = () => context.value()[props.index]; + const isActive = () => context.activeSlots().includes(props.index); + const showCaret = () => + context.isInserting() && context.activeSlots()[0] === props.index; + + return ( +
+ {showCaret() ? ( +
+ ) : ( + {char()} + )} +
+ ); + } + ``` + + + + ```css + .otp-field__char { + display: inline-block; + animation: otp-slip-in 0.5s cubic-bezier(0.16, 1, 0.3, 1) both; + } + + @keyframes otp-slip-in { + from { + transform: translateY(8px); + opacity: 0; + } + to { + transform: translateY(0); + opacity: 1; + } + } + ``` + + + {/* */} + + +### Validation + +Use `validationState`, `OTPField.Label`, `OTPField.Description`, and `OTPField.ErrorMessage` to integrate with Kobalte's form control system. `OTPField.ErrorMessage` only renders when `validationState` is `"invalid"`. + + + + + +```tsx +function ValidationExample() { + const [value, setValue] = createSignal(""); + + const isInvalid = () => value().length > 0 && value().length < 6; + + return ( + + Verification code + + {/* ...slots... */} + + Enter the 6-digit code sent to your device. + + Please enter all 6 digits. + + ); +} +``` + +### HTML forms + +Add a `name` prop to `OTPField.Input` to include the value in form submissions. The field value resets automatically when the parent form is reset. + + + + + +```tsx {3} +
+ + + {(i) => } + +
+``` + +## API Reference + +### OTPField + +`OTPField` is equivalent to the `Root` import from `@kobalte/core/otp-field` (and deprecated `OTPField.Root`). + +| Prop | Description | +| :--------------- | :-------------------------------------------------------------------------------------------------------------- | +| maxLength | `number`
The maximum number of characters the OTP field accepts. | +| value | `string`
The controlled value of the OTP field. | +| defaultValue | `string`
The default value when initially rendered. Useful when you do not need to control the value. | +| onChange | `(value: string) => void`
Event handler called when the value changes. | +| onComplete | `(value: string) => void`
Event handler called once when all slots are filled. | +| shiftPWManagers | `boolean`
Whether to shift password manager icons to the right to avoid overlapping slots. Defaults to `true`. | +| id | `string`
A unique identifier. Used to generate ids for nested Label, Description, and ErrorMessage. Auto-generated if not provided. | +| name | `string`
The name used when submitting an HTML form. | +| validationState | `'valid' \| 'invalid'`
Whether the OTP field should display its "valid" or "invalid" visual styling. | +| required | `boolean`
Whether the user must fill the OTP field before the form can be submitted. | +| disabled | `boolean`
Whether the OTP field is disabled. | +| readOnly | `boolean`
Whether the OTP field is read only. | + +### OTPField.Label + +| Prop | Description | +| :--- | :---------- | +| `id` | `string`
The id of the label element. Auto-generated from the root id if not provided. | + +### OTPField.Description + +| Prop | Description | +| :--- | :---------- | +| `id` | `string`
The id of the description element. Auto-generated from the root id if not provided. | + +### OTPField.ErrorMessage + +| Prop | Description | +| :----------- | :--------------------------------------------------------------------------------------------------------------------------------------- | +| `forceMount` | `boolean`
Used to force mounting when more control is needed. Useful when controlling animation with SolidJS animation libraries. | + +### OTPField.Input + +| Prop | Description | +| :------------------ | :--------------------------------------------------------------------------------------------------------------------------------------- | +| pattern | `string \| null`
Regex pattern for allowed characters. Defaults to `'^\d*$'` (digits only). Pass `null` to allow any character. | +| noScriptCSSFallback | `string \| null`
CSS injected via `
+
+ + +
+

+ Top row: <button disabled>. Bottom + row:{" "} + + <div aria-disabled="true" data-disabled=""> + + . +

+
+ ), +}); + +/** + * `Button` is polymorphic — swap the rendered element while keeping accessibility semantics. + * Switch to `a` and it becomes an anchor; switch to `div` and `Button` adds `role="button"`. + */ +export const AsLink = meta.story({ + name: "As Link", + args: { as: "a" as string }, + argTypes: { + as: { control: "select", options: ["button", "a", "div", "span"] }, + }, + render: (args) => ( + + ), +}); + +/** Leading and trailing icon layouts for each variant. */ +export const WithIcon = meta.story({ + name: "With Icon", + render: () => ( +
+ + + + +
+ ), +}); + +/** + * Verifies that click events fire on any element type. + * Switch `as` to `div` or `span` — the counter still increments because + * `Button` synthesises keyboard + pointer handlers on non-native elements. + */ +export const ClickCounter = meta.story({ + name: "Click Counter", + args: { as: "button" as string }, + argTypes: { + as: { control: "select", options: ["button", "a", "div", "span"] }, + }, + render: (args) => { + const [count, setCount] = createSignal(0); + return ( +
+ +

+ Rendered as{" "} + <{args.as}> +

+
+ ); + }, +}); diff --git a/packages/core/src/calendar/calendar-body.tsx b/packages/core/src/calendar/calendar-body.tsx new file mode 100644 index 00000000..d3f1793a --- /dev/null +++ b/packages/core/src/calendar/calendar-body.tsx @@ -0,0 +1,31 @@ +import type { ValidComponent } from "@solidjs/web"; + +import { + type ElementOf, + Polymorphic, + type PolymorphicProps, +} from "../polymorphic"; + +export interface CalendarBodyOptions {} + +export interface CalendarBodyCommonProps {} + +export interface CalendarBodyRenderProps extends CalendarBodyCommonProps {} + +export type CalendarBodyProps< + T extends ValidComponent | HTMLElement = HTMLElement, +> = CalendarBodyOptions & Partial>>; + +/** + * Contains the calendar grids. + */ +export function CalendarBody( + props: PolymorphicProps>, +) { + return ( + + as="div" + {...(props as CalendarBodyProps)} + /> + ); +} diff --git a/packages/core/src/calendar/calendar-context.tsx b/packages/core/src/calendar/calendar-context.tsx new file mode 100644 index 00000000..fda4db8c --- /dev/null +++ b/packages/core/src/calendar/calendar-context.tsx @@ -0,0 +1,66 @@ +import type { CalendarDate, DateDuration } from "@internationalized/date"; +import type { RangeValue, ValidationState } from "@kobalte/utils"; +import { type Accessor, createContext, useContext } from "solid-js"; + +import type { Direction } from "../i18n"; +import type { CalendarIntlTranslations } from "./calendar.intl"; +import type { CalendarSelectionMode, DateValue } from "./types"; + +export interface CalendarDataSet {} + +export interface CalendarContextValue { + dataset: Accessor; + value: Accessor< + DateValue | DateValue[] | RangeValue | null | undefined + >; + startDate: Accessor; + endDate: Accessor; + anchorDate: Accessor; + focusedDate: Accessor; + highlightedRange: Accessor | undefined>; + visibleDuration: Accessor; + selectionMode: Accessor; + locale: Accessor; + direction: Accessor; + min: Accessor; + max: Accessor; + timeZone: Accessor; + validationState: Accessor; + translations: Accessor; + isDisabled: Accessor; + isReadOnly: Accessor; + isDragging: Accessor; + isCellSelected: (date: DateValue) => boolean; + isCellFocused: (date: DateValue) => boolean; + isCellDisabled: (date: DateValue) => boolean; + isCellUnavailable: (date: DateValue) => boolean; + isCellInvalid: (date: DateValue) => boolean; + setStartDate: (date: DateValue) => void; + setAnchorDate: (date: DateValue | undefined) => void; + setIsFocused: (value: boolean) => void; + setIsDragging: (value: boolean) => void; + selectFocusedDate: () => void; + selectDate: (date: DateValue) => void; + highlightDate: (date: DateValue) => void; + focusCell: (date: DateValue) => void; + focusNextDay: () => void; + focusPreviousDay: () => void; + focusNextPage: () => void; + focusPreviousPage: () => void; + focusNextRow: () => void; + focusPreviousRow: () => void; + focusSectionStart: () => void; + focusSectionEnd: () => void; + focusNextSection: (larger: boolean) => void; + focusPreviousSection: (larger: boolean) => void; + getDatesInWeek: ( + weekIndex: number, + from: DateValue, + ) => Array; +} + +export const CalendarContext = createContext(); + +export function useCalendarContext(): CalendarContextValue { + return useContext(CalendarContext)!; +} diff --git a/packages/core/src/calendar/calendar-grid-body-cell-context.tsx b/packages/core/src/calendar/calendar-grid-body-cell-context.tsx new file mode 100644 index 00000000..1797e108 --- /dev/null +++ b/packages/core/src/calendar/calendar-grid-body-cell-context.tsx @@ -0,0 +1,21 @@ +import { type Accessor, createContext, useContext } from "solid-js"; + +import type { DateValue } from "./types"; + +export interface CalendarGridBodyCellContextValue { + date: Accessor; + isSelected: Accessor; + isFocused: Accessor; + isDisabled: Accessor; + isUnavailable: Accessor; + isSelectable: Accessor; + isInvalid: Accessor; + isDateToday: Accessor; +} + +export const CalendarGridBodyCellContext = + createContext(); + +export function useCalendarGriBodyCellContext(): CalendarGridBodyCellContextValue { + return useContext(CalendarGridBodyCellContext)!; +} diff --git a/packages/core/src/calendar/calendar-grid-body-cell-trigger.tsx b/packages/core/src/calendar/calendar-grid-body-cell-trigger.tsx new file mode 100644 index 00000000..34974a8c --- /dev/null +++ b/packages/core/src/calendar/calendar-grid-body-cell-trigger.tsx @@ -0,0 +1,416 @@ +/* + * Portions of this file are based on code from react-spectrum. + * Apache License Version 2.0, Copyright 2020 Adobe. + * + * Credits to the React Spectrum team: + * https://github.com/adobe/react-spectrum/blob/a8903d3b8c462b85cc34e8565e1a1084827d0a29/packages/@react-aria/calendar/src/useCalendarCell.ts + */ + +import { isSameDay, isSameMonth, isWeekend } from "@internationalized/date"; +import { + callHandler, + focusWithoutScrolling, + getWindow, + mergeRefs, +} from "@kobalte/utils"; +import type { JSX, ValidComponent } from "@solidjs/web"; +import { createEffect, createMemo, omit } from "solid-js"; + +import { createDateFormatter } from "../i18n"; +import { + type ElementOf, + Polymorphic, + type PolymorphicProps, +} from "../polymorphic"; +import { useCalendarContext } from "./calendar-context"; +import { useCalendarGriBodyCellContext } from "./calendar-grid-body-cell-context"; +import { useCalendarGridContext } from "./calendar-grid-context"; +import { + asRangeValue, + getEraFormat, + getSelectedDateDescription, +} from "./utils"; + +export interface CalendarGridBodyCellTriggerOptions { + /** Whether the cell trigger is disabled. */ + disabled?: boolean; +} + +export interface CalendarGridBodyCellTriggerCommonProps< + T extends HTMLElement = HTMLDivElement, +> { + ref: T | ((el: T) => void); + onPointerEnter: JSX.EventHandlerUnion; + onPointerDown: JSX.EventHandlerUnion; + onPointerUp: JSX.EventHandlerUnion; + onPointerLeave: JSX.EventHandlerUnion; + onClick: JSX.EventHandlerUnion; + onKeyDown: JSX.EventHandlerUnion; +} + +export interface CalendarGridBodyCellTriggerRenderProps + extends CalendarGridBodyCellTriggerCommonProps { + role: "button"; + tabIndex: number | undefined; + disabled: boolean; + "aria-disabled": boolean | undefined; + "aria-invalid": boolean | undefined; + "aria-label": string; + "data-disabled": boolean | undefined; + "data-invalid": boolean | undefined; + "data-selected": boolean | undefined; + "data-value": string; + "data-type": string; + "data-today": boolean | undefined; + "data-weekend": boolean | undefined; + "data-highlighted": boolean | undefined; + "data-unavailable": boolean | undefined; + "data-selection-start": boolean | undefined; + "data-selection-end": boolean | undefined; + "data-outside-visible-range": boolean | undefined; + "data-outside-month": boolean | undefined; + onContextMenu: JSX.EventHandlerUnion; + children: string | undefined; +} + +export type CalendarGridBodyCellTriggerProps< + T extends ValidComponent | HTMLElement = HTMLElement, +> = CalendarGridBodyCellTriggerOptions & + Partial>>; + +export function CalendarGridBodyCellTrigger( + props: PolymorphicProps>, +) { + let ref: HTMLDivElement | undefined; + + const rootContext = useCalendarContext(); + const gridContext = useCalendarGridContext(); + const context = useCalendarGriBodyCellContext(); + + const others = omit( + props as CalendarGridBodyCellTriggerProps, + "ref", + "disabled", + "onPointerEnter", + "onPointerDown", + "onPointerUp", + "onPointerLeave", + "onClick", + "onKeyDown", + ); + + const isDisabled = () => + (props as CalendarGridBodyCellTriggerProps).disabled || context.isDisabled(); + + const isDateWeekend = () => { + return isWeekend(context.date(), rootContext.locale()); + }; + + const isOutsideVisibleRange = () => { + return ( + context.date().compare(rootContext.startDate()) < 0 || + context.date().compare(rootContext.endDate()) > 0 + ); + }; + + const isOutsideMonth = () => { + return !isSameMonth(gridContext.startDate(), context.date()); + }; + + const isSelectionStart = () => { + if (rootContext.selectionMode() !== "range") { + return false; + } + + const start = rootContext.highlightedRange()?.start; + + return start != null && isSameDay(context.date(), start); + }; + + const isSelectionEnd = () => { + if (rootContext.selectionMode() !== "range") { + return false; + } + + const end = rootContext.highlightedRange()?.end; + + return end != null && isSameDay(context.date(), end); + }; + + const tabIndex = createMemo(() => { + if (!isDisabled()) { + return isSameDay(context.date(), rootContext.focusedDate()) ? 0 : -1; + } + + return undefined; + }); + + const labelDateFormatter = createDateFormatter(() => ({ + weekday: "long", + day: "numeric", + month: "long", + year: "numeric", + era: getEraFormat(context.date()), + timeZone: rootContext.timeZone(), + })); + + const cellDateFormatter = createDateFormatter(() => ({ + day: "numeric", + timeZone: rootContext.timeZone(), + calendar: context.date().calendar.identifier, + })); + + const nativeDate = createMemo(() => { + return context.date().toDate(rootContext.timeZone()); + }); + + const formattedDate = createMemo(() => { + return cellDateFormatter() + .formatToParts(nativeDate()) + .find((part) => part.type === "day")?.value; + }); + + const ariaLabel = createMemo(() => { + let label = ""; + + // If this is a range calendar, add a description of the full selected range + // to the first and last selected date. + if (rootContext.selectionMode() === "range" && !rootContext.anchorDate()) { + const { start, end } = asRangeValue(rootContext.value()) ?? {}; + + if ( + start && + end && + (isSameDay(context.date(), start) || isSameDay(context.date(), end)) + ) { + label = `${getSelectedDateDescription( + rootContext.translations(), + context.date(), + rootContext.timeZone(), + )}, `; + } + } + + label += labelDateFormatter().format(nativeDate()); + if (context.isDateToday()) { + label = rootContext.translations().todayDate(label, context.isSelected()); + } else if (context.isSelected()) { + label = rootContext.translations().dateSelected(label); + } + + const min = rootContext.min(); + const max = rootContext.max(); + + if (min && isSameDay(context.date(), min)) { + label += `, ${rootContext.translations().minimumDate}`; + } else if (max && isSameDay(context.date(), max)) { + label += `, ${rootContext.translations().maximumDate}`; + } + + return label; + }); + + let isPointerDown = false; + let isAnchorPressed = false; + let isRangeBoundaryPressed = false; + let touchDragTimerRef: number | undefined; + + const onPressEnd = () => { + isRangeBoundaryPressed = false; + isAnchorPressed = false; + + if (touchDragTimerRef != null) { + getWindow(ref).clearTimeout(touchDragTimerRef); + touchDragTimerRef = undefined; + } + }; + + const onPointerEnter: JSX.EventHandlerUnion = ( + e, + ) => { + callHandler(e, (props as CalendarGridBodyCellTriggerProps).onPointerEnter as JSX.EventHandlerUnion); + + if ( + rootContext.selectionMode() === "range" && + (e.pointerType !== "touch" || rootContext.isDragging()) && + context.isSelectable() + ) { + rootContext.highlightDate(context.date()); + } + }; + + const onPointerLeave: JSX.EventHandlerUnion = ( + e, + ) => { + callHandler(e, (props as CalendarGridBodyCellTriggerProps).onPointerLeave as JSX.EventHandlerUnion); + + if (isPointerDown) { + onPressEnd(); + } + }; + + const onPointerDown: JSX.EventHandlerUnion = ( + e, + ) => { + callHandler(e, (props as CalendarGridBodyCellTriggerProps).onPointerDown as JSX.EventHandlerUnion); + isPointerDown = true; + + if ("releasePointerCapture" in e.target) { + (e.target as Element).releasePointerCapture(e.pointerId); + } + + if (rootContext.isReadOnly()) { + rootContext.focusCell(context.date()); + return; + } + + if (rootContext.selectionMode() === "range" && !rootContext.anchorDate()) { + const highlightedRange = rootContext.highlightedRange(); + + if (highlightedRange && !context.isInvalid()) { + if (isSameDay(context.date(), highlightedRange.start)) { + rootContext.setAnchorDate(highlightedRange.end); + rootContext.focusCell(context.date()); + rootContext.setIsDragging(true); + isRangeBoundaryPressed = true; + return; + } + if (isSameDay(context.date(), highlightedRange.end)) { + rootContext.setAnchorDate(highlightedRange.start); + rootContext.focusCell(context.date()); + rootContext.setIsDragging(true); + isRangeBoundaryPressed = true; + return; + } + } + + const startDragging = () => { + rootContext.setIsDragging(true); + touchDragTimerRef = undefined; + + rootContext.selectDate(context.date()); + rootContext.focusCell(context.date()); + isAnchorPressed = true; + }; + + if (e.pointerType === "touch") { + touchDragTimerRef = getWindow(ref).setTimeout(startDragging, 200); + } else { + startDragging(); + } + } + }; + + const onPointerUp: JSX.EventHandlerUnion = ( + e, + ) => { + callHandler(e, (props as CalendarGridBodyCellTriggerProps).onPointerUp as JSX.EventHandlerUnion); + isPointerDown = false; + + if (rootContext.isReadOnly() || rootContext.selectionMode() !== "range") { + onPressEnd(); + return; + } + + if (touchDragTimerRef != null) { + rootContext.selectDate(context.date()); + rootContext.focusCell(context.date()); + } + + if (isRangeBoundaryPressed) { + rootContext.setAnchorDate(context.date()); + } else if (rootContext.anchorDate() && !isAnchorPressed) { + rootContext.selectDate(context.date()); + rootContext.focusCell(context.date()); + } + + onPressEnd(); + }; + + const onClick: JSX.EventHandlerUnion = (e) => { + callHandler(e, (props as CalendarGridBodyCellTriggerProps).onClick as JSX.EventHandlerUnion); + + if (rootContext.selectionMode() !== "range" && context.isSelectable()) { + rootContext.selectDate(context.date()); + rootContext.focusCell(context.date()); + } + }; + + const onKeyDown: JSX.EventHandlerUnion = ( + e, + ) => { + callHandler(e, (props as CalendarGridBodyCellTriggerProps).onKeyDown as JSX.EventHandlerUnion); + + if (!["Enter", " "].includes(e.key)) { + return; + } + + if (rootContext.isReadOnly()) { + rootContext.focusCell(context.date()); + return; + } + + if (rootContext.selectionMode() === "range" && !rootContext.anchorDate()) { + e.stopPropagation(); + + rootContext.selectDate(context.date()); + let nextDay = context.date().add({ days: 1 }); + + if (rootContext.isCellInvalid(nextDay)) { + nextDay = context.date().subtract({ days: 1 }); + } + + if (!rootContext.isCellInvalid(nextDay)) { + rootContext.focusCell(nextDay); + } + } + }; + + // Focus the element when it becomes the focused date. + createEffect( + () => context.isFocused(), + (focused) => { + if (focused && ref) { + focusWithoutScrolling(ref); + } + }, + ); + + return ( + + as="div" + ref={mergeRefs((el) => (ref = el as HTMLDivElement), (props as CalendarGridBodyCellTriggerProps).ref as ((el: HTMLDivElement) => void) | undefined)} + role="button" + tabIndex={tabIndex()} + disabled={isDisabled()} + aria-disabled={!context.isSelectable() || undefined} + aria-invalid={context.isInvalid() || undefined} + aria-label={ariaLabel()} + data-disabled={isDisabled() || undefined} + data-invalid={context.isInvalid() || undefined} + data-selected={context.isSelected() || undefined} + data-value={context.date().toString()} + data-type="day" + data-today={context.isDateToday() || undefined} + data-weekend={isDateWeekend() || undefined} + data-highlighted={context.isFocused() || undefined} + data-unavailable={context.isUnavailable() || undefined} + data-selection-start={isSelectionStart() || undefined} + data-selection-end={isSelectionEnd() || undefined} + data-outside-visible-range={isOutsideVisibleRange() || undefined} + data-outside-month={isOutsideMonth() || undefined} + onPointerEnter={onPointerEnter} + onPointerLeave={onPointerLeave} + onPointerDown={onPointerDown} + onPointerUp={onPointerUp} + onClick={onClick} + onKeyDown={onKeyDown} + onContextMenu={(e: Event) => { + e.preventDefault(); + }} + {...others} + > + {formattedDate()} + + ); +} diff --git a/packages/core/src/calendar/calendar-grid-body-cell.tsx b/packages/core/src/calendar/calendar-grid-body-cell.tsx new file mode 100644 index 00000000..85ace043 --- /dev/null +++ b/packages/core/src/calendar/calendar-grid-body-cell.tsx @@ -0,0 +1,120 @@ +/* + * Portions of this file are based on code from react-spectrum. + * Apache License Version 2.0, Copyright 2020 Adobe. + * + * Credits to the React Spectrum team: + * https://github.com/adobe/react-spectrum/blob/a8903d3b8c462b85cc34e8565e1a1084827d0a29/packages/@react-aria/calendar/src/useCalendarCell.ts + */ + +import { isToday } from "@internationalized/date"; +import type { ValidComponent } from "@solidjs/web"; +import { createMemo, omit } from "solid-js"; + +import { + type ElementOf, + Polymorphic, + type PolymorphicProps, +} from "../polymorphic"; +import { useCalendarContext } from "./calendar-context"; +import { + CalendarGridBodyCellContext, + type CalendarGridBodyCellContextValue, +} from "./calendar-grid-body-cell-context"; +import type { DateValue } from "./types"; + +export interface CalendarGridBodyCellOptions { + /** The date that this cell represents. */ + date: DateValue; + + /** + * Whether the cell is disabled. By default, this is determined by the + * Calendar's `minValue`, `maxValue`, and `isDisabled` props. + */ + disabled?: boolean; +} + +export interface CalendarGridBodyCellCommonProps< + T extends HTMLElement = HTMLElement, +> {} + +export interface CalendarGridBodyCellRenderProps + extends CalendarGridBodyCellCommonProps { + role: "gridcell"; + "aria-disabled": boolean | undefined; + "aria-selected": boolean | undefined; + "aria-invalid": boolean | undefined; + "aria-current": "date" | undefined; + "data-value": string; +} + +export type CalendarGridBodyCellProps< + T extends ValidComponent | HTMLElement = HTMLElement, +> = CalendarGridBodyCellOptions & + Partial>>; + +/** + * A calendar grid body cell displays a date cell within a calendar grid which can be selected by the user. + */ +export function CalendarGridBodyCell( + props: PolymorphicProps>, +) { + const rootContext = useCalendarContext(); + const others = omit( + props as CalendarGridBodyCellProps, + "date", + "disabled", + ); + + const isSelected = createMemo(() => { + return rootContext.isCellSelected(props.date); + }); + + const isFocused = createMemo(() => { + return rootContext.isCellFocused(props.date); + }); + + const isDisabled = createMemo(() => { + return (props as CalendarGridBodyCellProps).disabled || + rootContext.isCellDisabled(props.date); + }); + + const isUnavailable = createMemo(() => { + return rootContext.isCellUnavailable(props.date); + }); + + const isSelectable = () => { + return !rootContext.isReadOnly() && !isDisabled() && !isUnavailable(); + }; + + const isInvalid = createMemo(() => { + return rootContext.validationState() === "invalid" && isSelected(); + }); + + const isDateToday = () => isToday(props.date, rootContext.timeZone()); + + const context: CalendarGridBodyCellContextValue = { + date: () => props.date, + isSelected, + isFocused, + isUnavailable, + isSelectable, + isDisabled, + isInvalid, + isDateToday, + }; + + return ( + + + as="td" + role="gridcell" + aria-disabled={!isSelectable() || undefined} + aria-selected={isSelected() || undefined} + aria-invalid={isInvalid() || undefined} + aria-current={isDateToday() ? "date" : undefined} + data-value={props.date.toString()} + {...others} + /> + + ); +} diff --git a/packages/core/src/calendar/calendar-grid-body-row.tsx b/packages/core/src/calendar/calendar-grid-body-row.tsx new file mode 100644 index 00000000..0da70b10 --- /dev/null +++ b/packages/core/src/calendar/calendar-grid-body-row.tsx @@ -0,0 +1,44 @@ +import type { ValidComponent } from "@solidjs/web"; +import { type Accessor, createMemo, For, type Element, omit } from "solid-js"; + +import { Polymorphic, type PolymorphicProps } from "../polymorphic"; +import { useCalendarContext } from "./calendar-context"; +import { useCalendarGridContext } from "./calendar-grid-context"; +import type { DateValue } from "./types"; + +export interface CalendarGridBodyRowOptions { + /** The index of the week to render. */ + weekIndex: number; + + /** + * Render prop used to render each cell of the week row, + * it receives a date accessor as parameter. + */ + children: (date: Accessor) => Element; +} + +export type CalendarGridBodyRowProps = + PolymorphicProps; + +/** + * A calendar grid body row displays a row of calendar cells within a month. + */ +export function CalendarGridBodyRow( + props: CalendarGridBodyRowProps, +) { + const rootContext = useCalendarContext(); + const context = useCalendarGridContext(); + const others = omit(props, "weekIndex", "children"); + + const datesInWeek = createMemo(() => { + return rootContext.getDatesInWeek(props.weekIndex, context.startDate()); + }); + + return ( + + + {props.children} + + + ); +} diff --git a/packages/core/src/calendar/calendar-grid-body.tsx b/packages/core/src/calendar/calendar-grid-body.tsx new file mode 100644 index 00000000..4bc1852f --- /dev/null +++ b/packages/core/src/calendar/calendar-grid-body.tsx @@ -0,0 +1,46 @@ +import { getWeeksInMonth } from "@internationalized/date"; +import type { ValidComponent } from "@solidjs/web"; +import { type Accessor, createMemo, For, type Element, omit } from "solid-js"; + +import { Polymorphic, type PolymorphicProps } from "../polymorphic"; +import { useCalendarContext } from "./calendar-context"; +import { useCalendarGridContext } from "./calendar-grid-context"; + +export interface CalendarGridBodyOptions { + /** + * Render prop used to render each row of the calendar grid, + * it receives a week index accessor as parameter. + */ + children: (weekIndex: Accessor) => Element; +} + +export type CalendarGridBodyProps = + PolymorphicProps; + +/** + * A calendar grid body displays a grid of calendar cells within a month. + */ +export function CalendarGridBody( + props: CalendarGridBodyProps, +) { + const rootContext = useCalendarContext(); + const context = useCalendarGridContext(); + const others = omit(props, "children"); + + const weekIndexes = createMemo(() => { + const weeksInMonth = getWeeksInMonth( + context.startDate(), + rootContext.locale(), + ); + + return [...new Array(weeksInMonth).keys()]; + }); + + return ( + + + {props.children} + + + ); +} diff --git a/packages/core/src/calendar/calendar-grid-context.tsx b/packages/core/src/calendar/calendar-grid-context.tsx new file mode 100644 index 00000000..0d960b15 --- /dev/null +++ b/packages/core/src/calendar/calendar-grid-context.tsx @@ -0,0 +1,14 @@ +import { type Accessor, createContext, useContext } from "solid-js"; + +import type { DateValue } from "./types"; + +export interface CalendarGridContextValue { + startDate: Accessor; + weekDays: Accessor; +} + +export const CalendarGridContext = createContext(); + +export function useCalendarGridContext(): CalendarGridContextValue { + return useContext(CalendarGridContext)!; +} diff --git a/packages/core/src/calendar/calendar-grid-header-cell.tsx b/packages/core/src/calendar/calendar-grid-header-cell.tsx new file mode 100644 index 00000000..c33846a9 --- /dev/null +++ b/packages/core/src/calendar/calendar-grid-header-cell.tsx @@ -0,0 +1,44 @@ +/* + * Portions of this file are based on code from react-spectrum. + * Apache License Version 2.0, Copyright 2020 Adobe. + * + * Credits to the React Spectrum team: + * https://github.com/adobe/react-spectrum/blob/0a1d0cd4e1b2f77eed7c0ea08fce8a04f8de6921/packages/@react-aria/calendar/src/useCalendarGrid.ts + * https://github.com/adobe/react-spectrum/blob/0a1d0cd4e1b2f77eed7c0ea08fce8a04f8de6921/packages/react-aria-components/src/Calendar.tsx + */ + +import type { ValidComponent } from "@solidjs/web"; + +import { + type ElementOf, + Polymorphic, + type PolymorphicProps, +} from "../polymorphic"; + +export interface CalendarGridHeaderCellOptions {} + +export interface CalendarGridHeaderCellCommonProps< + T extends HTMLElement = HTMLElement, +> {} + +export interface CalendarGridHeaderCellRenderProps + extends CalendarGridHeaderCellCommonProps {} + +export type CalendarGridHeaderCellProps< + T extends ValidComponent | HTMLElement = HTMLElement, +> = CalendarGridHeaderCellOptions & + Partial>>; + +/** + * A calendar grid header cell displays a week day name at the top of a column within a calendar. + */ +export function CalendarGridHeaderCell( + props: PolymorphicProps>, +) { + return ( + + as="th" + {...(props as CalendarGridHeaderCellProps)} + /> + ); +} diff --git a/packages/core/src/calendar/calendar-grid-header-row.tsx b/packages/core/src/calendar/calendar-grid-header-row.tsx new file mode 100644 index 00000000..753707fc --- /dev/null +++ b/packages/core/src/calendar/calendar-grid-header-row.tsx @@ -0,0 +1,43 @@ +/* + * Portions of this file are based on code from react-spectrum. + * Apache License Version 2.0, Copyright 2020 Adobe. + * + * Credits to the React Spectrum team: + * https://github.com/adobe/react-spectrum/blob/0a1d0cd4e1b2f77eed7c0ea08fce8a04f8de6921/packages/@react-aria/calendar/src/useCalendarGrid.ts + * https://github.com/adobe/react-spectrum/blob/0a1d0cd4e1b2f77eed7c0ea08fce8a04f8de6921/packages/react-aria-components/src/Calendar.tsx + */ + +import type { ValidComponent } from "@solidjs/web"; +import { type Accessor, For, type Element, omit } from "solid-js"; + +import { Polymorphic, type PolymorphicProps } from "../polymorphic"; +import { useCalendarGridContext } from "./calendar-grid-context"; + +export interface CalendarGridHeaderRowOptions { + /** + * Render prop used to render each cell of the header row, + * it receives a week day accessor as parameter. + */ + children: (weekDay: Accessor) => Element; +} + +export type CalendarGridHeaderRowProps = + PolymorphicProps; + +/** + * A calendar grid header row displays week day names inside a `Calendar.GridHeader`. + */ +export function CalendarGridHeaderRow( + props: CalendarGridHeaderRowProps, +) { + const context = useCalendarGridContext(); + const others = omit(props, "children"); + + return ( + + + {props.children} + + + ); +} diff --git a/packages/core/src/calendar/calendar-grid-header.tsx b/packages/core/src/calendar/calendar-grid-header.tsx new file mode 100644 index 00000000..8a309f3c --- /dev/null +++ b/packages/core/src/calendar/calendar-grid-header.tsx @@ -0,0 +1,47 @@ +/* + * Portions of this file are based on code from react-spectrum. + * Apache License Version 2.0, Copyright 2020 Adobe. + * + * Credits to the React Spectrum team: + * https://github.com/adobe/react-spectrum/blob/0a1d0cd4e1b2f77eed7c0ea08fce8a04f8de6921/packages/@react-aria/calendar/src/useCalendarGrid.ts + * https://github.com/adobe/react-spectrum/blob/0a1d0cd4e1b2f77eed7c0ea08fce8a04f8de6921/packages/react-aria-components/src/Calendar.tsx + */ + +import type { ValidComponent } from "@solidjs/web"; + +import { + type ElementOf, + Polymorphic, + type PolymorphicProps, +} from "../polymorphic"; + +export interface CalendarGridHeaderOptions {} + +export interface CalendarGridHeaderCommonProps< + T extends HTMLElement = HTMLElement, +> {} + +export interface CalendarGridHeaderRenderProps + extends CalendarGridHeaderCommonProps { + "aria-hidden": "true"; +} + +export type CalendarGridHeaderProps< + T extends ValidComponent | HTMLElement = HTMLElement, +> = CalendarGridHeaderOptions & + Partial>>; + +/** + * A calendar grid header displays a row of week day names at the top of a month. + */ +export function CalendarGridHeader( + props: PolymorphicProps>, +) { + return ( + + as="thead" + aria-hidden="true" + {...(props as CalendarGridHeaderProps)} + /> + ); +} diff --git a/packages/core/src/calendar/calendar-grid.tsx b/packages/core/src/calendar/calendar-grid.tsx new file mode 100644 index 00000000..f57f7a30 --- /dev/null +++ b/packages/core/src/calendar/calendar-grid.tsx @@ -0,0 +1,236 @@ +/* + * Portions of this file are based on code from react-spectrum. + * Apache License Version 2.0, Copyright 2020 Adobe. + * + * Credits to the React Spectrum team: + * https://github.com/adobe/react-spectrum/blob/0a1d0cd4e1b2f77eed7c0ea08fce8a04f8de6921/packages/@react-aria/calendar/src/useCalendarGrid.ts + */ + +import { + type DateDuration, + endOfMonth, + startOfWeek, + today, +} from "@internationalized/date"; +import { callHandler, mergeDefaultProps } from "@kobalte/utils"; +import type { JSX, ValidComponent } from "@solidjs/web"; +import { createMemo, omit } from "solid-js"; + +import { createDateFormatter } from "../i18n"; +import { + type ElementOf, + Polymorphic, + type PolymorphicProps, +} from "../polymorphic"; +import { useCalendarContext } from "./calendar-context"; +import { + CalendarGridContext, + type CalendarGridContextValue, +} from "./calendar-grid-context"; +import { getVisibleRangeDescription } from "./utils"; + +export interface CalendarGridOptions { + /** + * An offset from the beginning of the visible date range that this grid should display. + * Useful when displaying more than one month at a time. + */ + offset?: DateDuration; + + /** + * The format of weekday names to display in the `Calendar.GridHeader` + * e.g. single letter, abbreviation, or full day name. + */ + weekDayFormat?: "narrow" | "short" | "long"; +} + +export interface CalendarGridCommonProps { + onKeyDown: JSX.EventHandlerUnion; + onFocusIn: JSX.EventHandlerUnion; + onFocusOut: JSX.EventHandlerUnion; + "aria-label": string | undefined; +} + +export interface CalendarGridRenderProps extends CalendarGridCommonProps { + role: "grid"; + "aria-readonly": boolean | undefined; + "aria-disabled": boolean | undefined; + "aria-multiselectable": boolean; +} + +export type CalendarGridProps< + T extends ValidComponent | HTMLElement = HTMLElement, +> = CalendarGridOptions & Partial>>; + +/** + * A calendar grid displays a single grid of days within a calendar or range calendar which + * can be keyboard navigated and selected by the user. + */ +export function CalendarGrid( + props: PolymorphicProps>, +) { + const rootContext = useCalendarContext(); + + const mergedProps = mergeDefaultProps( + { weekDayFormat: "short" as const }, + props as CalendarGridProps, + ); + + const others = omit( + mergedProps, + "offset", + "weekDayFormat", + "onKeyDown", + "onFocusIn", + "onFocusOut", + "aria-label", + ); + + const startDate = createMemo(() => { + if (mergedProps.offset) { + return rootContext.startDate().add(mergedProps.offset); + } + + return rootContext.startDate(); + }); + + const endDate = createMemo(() => endOfMonth(startDate())); + + const dayFormatter = createDateFormatter(() => ({ + weekday: mergedProps.weekDayFormat, + timeZone: rootContext.timeZone(), + })); + + const weekDays = createMemo(() => { + const firstDayOfWeek = startOfWeek( + today(rootContext.timeZone()), + rootContext.locale(), + ); + + return [...new Array(7).keys()].map((index) => { + const date = firstDayOfWeek.add({ days: index }); + return dayFormatter().format(date.toDate(rootContext.timeZone())); + }); + }); + + const visibleRangeDescription = createMemo(() => { + return getVisibleRangeDescription( + rootContext.translations(), + startDate(), + endDate(), + rootContext.timeZone(), + true, + ); + }); + + const ariaLabel = () => { + return [mergedProps["aria-label"], visibleRangeDescription()] + .filter(Boolean) + .join(", "); + }; + + const onKeyDown: JSX.EventHandlerUnion = ( + e, + ) => { + callHandler(e, mergedProps.onKeyDown as JSX.EventHandlerUnion | undefined); + + switch (e.key) { + case "Enter": + case " ": + e.preventDefault(); + rootContext.selectFocusedDate(); + break; + case "PageUp": + e.preventDefault(); + e.stopPropagation(); + rootContext.focusPreviousSection(e.shiftKey); + break; + case "PageDown": + e.preventDefault(); + e.stopPropagation(); + rootContext.focusNextSection(e.shiftKey); + break; + case "End": + e.preventDefault(); + e.stopPropagation(); + rootContext.focusSectionEnd(); + break; + case "Home": + e.preventDefault(); + e.stopPropagation(); + rootContext.focusSectionStart(); + break; + case "ArrowLeft": + e.preventDefault(); + e.stopPropagation(); + if (rootContext.direction() === "rtl") { + rootContext.focusNextDay(); + } else { + rootContext.focusPreviousDay(); + } + break; + case "ArrowUp": + e.preventDefault(); + e.stopPropagation(); + rootContext.focusPreviousRow(); + break; + case "ArrowRight": + e.preventDefault(); + e.stopPropagation(); + if (rootContext.direction() === "rtl") { + rootContext.focusPreviousDay(); + } else { + rootContext.focusNextDay(); + } + break; + case "ArrowDown": + e.preventDefault(); + e.stopPropagation(); + rootContext.focusNextRow(); + break; + case "Escape": + if (rootContext.selectionMode() === "range") { + e.preventDefault(); + rootContext.setAnchorDate(undefined); + } + break; + } + }; + + const onFocusIn: JSX.FocusEventHandlerUnion = ( + e, + ) => { + callHandler(e, mergedProps.onFocusIn as JSX.FocusEventHandlerUnion | undefined); + + rootContext.setIsFocused(true); + }; + + const onFocusOut: JSX.FocusEventHandlerUnion = ( + e, + ) => { + callHandler(e, mergedProps.onFocusOut as JSX.FocusEventHandlerUnion | undefined); + + rootContext.setIsFocused(false); + }; + + const context: CalendarGridContextValue = { + startDate, + weekDays, + }; + + return ( + + + as="table" + role="grid" + aria-readonly={rootContext.isReadOnly() || undefined} + aria-disabled={rootContext.isDisabled() || undefined} + aria-multiselectable={rootContext.selectionMode() !== "single"} + aria-label={ariaLabel()} + onKeyDown={onKeyDown} + onFocusIn={onFocusIn} + onFocusOut={onFocusOut} + {...others} + /> + + ); +} diff --git a/packages/core/src/calendar/calendar-header.tsx b/packages/core/src/calendar/calendar-header.tsx new file mode 100644 index 00000000..8d8e1f21 --- /dev/null +++ b/packages/core/src/calendar/calendar-header.tsx @@ -0,0 +1,33 @@ +import type { ValidComponent } from "@solidjs/web"; + +import { + type ElementOf, + Polymorphic, + type PolymorphicProps, +} from "../polymorphic"; + +export interface CalendarHeaderOptions {} + +export interface CalendarHeaderCommonProps< + T extends HTMLElement = HTMLElement, +> {} + +export interface CalendarHeaderRenderProps extends CalendarHeaderCommonProps {} + +export type CalendarHeaderProps< + T extends ValidComponent | HTMLElement = HTMLElement, +> = CalendarHeaderOptions & Partial>>; + +/** + * Contains the calendar heading and navigation triggers. + */ +export function CalendarHeader( + props: PolymorphicProps>, +) { + return ( + + as="header" + {...(props as CalendarHeaderProps)} + /> + ); +} diff --git a/packages/core/src/calendar/calendar-heading.tsx b/packages/core/src/calendar/calendar-heading.tsx new file mode 100644 index 00000000..6d548915 --- /dev/null +++ b/packages/core/src/calendar/calendar-heading.tsx @@ -0,0 +1,59 @@ +/* + * Portions of this file are based on code from react-spectrum. + * Apache License Version 2.0, Copyright 2020 Adobe. + * + * Credits to the React Spectrum team: + * https://github.com/adobe/react-spectrum/blob/0a1d0cd4e1b2f77eed7c0ea08fce8a04f8de6921/packages/@react-stately/calendar/src/useCalendarState.ts + * https://github.com/adobe/react-spectrum/blob/0a1d0cd4e1b2f77eed7c0ea08fce8a04f8de6921/packages/@react-aria/calendar/src/useCalendarBase.ts + */ + +import type { ValidComponent } from "@solidjs/web"; +import { createMemo } from "solid-js"; + +import { + type ElementOf, + Polymorphic, + type PolymorphicProps, +} from "../polymorphic"; +import { useCalendarContext } from "./calendar-context"; +import { getVisibleRangeDescription } from "./utils"; + +export interface CalendarHeadingOptions {} + +export interface CalendarHeadingCommonProps< + T extends HTMLElement = HTMLElement, +> {} + +export interface CalendarHeadingRenderProps extends CalendarHeadingCommonProps { + children: string; +} + +export type CalendarHeadingProps< + T extends ValidComponent | HTMLElement = HTMLElement, +> = CalendarHeadingOptions & + Partial>>; + +export function CalendarHeading( + props: PolymorphicProps>, +) { + const rootContext = useCalendarContext(); + + const title = createMemo(() => { + return getVisibleRangeDescription( + rootContext.translations(), + rootContext.startDate(), + rootContext.endDate(), + rootContext.timeZone(), + false, + ); + }); + + return ( + + as="h2" + {...(props as CalendarHeadingProps)} + > + {title()} + + ); +} diff --git a/packages/core/src/calendar/calendar-next-trigger.tsx b/packages/core/src/calendar/calendar-next-trigger.tsx new file mode 100644 index 00000000..a7c3e308 --- /dev/null +++ b/packages/core/src/calendar/calendar-next-trigger.tsx @@ -0,0 +1,95 @@ +/* + * Portions of this file are based on code from react-spectrum. + * Apache License Version 2.0, Copyright 2020 Adobe. + * + * Credits to the React Spectrum team: + * https://github.com/adobe/react-spectrum/blob/0a1d0cd4e1b2f77eed7c0ea08fce8a04f8de6921/packages/@react-stately/calendar/src/useCalendarState.ts + * https://github.com/adobe/react-spectrum/blob/0a1d0cd4e1b2f77eed7c0ea08fce8a04f8de6921/packages/@react-aria/calendar/src/useCalendarBase.ts + */ + +import { callHandler } from "@kobalte/utils"; +import type { JSX, ValidComponent } from "@solidjs/web"; +import { createEffect, createMemo, omit } from "solid-js"; + +import * as Button from "../button"; +import { type ElementOf, type PolymorphicProps } from "../polymorphic"; +import { useCalendarContext } from "./calendar-context"; +import { isNextVisibleRangeInvalid } from "./utils"; + +export interface CalendarNextTriggerOptions extends Button.ButtonRootOptions {} + +export interface CalendarNextTriggerCommonProps< + T extends HTMLElement = HTMLElement, +> extends Button.ButtonRootCommonProps { + onClick: JSX.EventHandlerUnion; + onFocus: JSX.FocusEventHandlerUnion; + onBlur: JSX.FocusEventHandlerUnion; +} + +export interface CalendarNextTriggerRenderProps + extends CalendarNextTriggerCommonProps, + Button.ButtonRootRenderProps {} + +export type CalendarNextTriggerProps< + T extends ValidComponent | HTMLElement = HTMLElement, +> = CalendarNextTriggerOptions & + Partial>>; + +export function CalendarNextTrigger( + props: PolymorphicProps>, +) { + const context = useCalendarContext(); + + const others = omit(props as CalendarNextTriggerProps, "disabled", "onClick", "onFocus", "onBlur"); + + let nextTriggerFocused = false; + + const nextTriggerDisabled = createMemo(() => { + return ( + (props as CalendarNextTriggerProps).disabled || + context.isDisabled() || + isNextVisibleRangeInvalid(context.endDate(), context.min(), context.max()) + ); + }); + + const onClick: JSX.EventHandlerUnion = (e) => { + callHandler(e, (props as CalendarNextTriggerProps).onClick as JSX.EventHandlerUnion); + context.focusNextPage(); + }; + + const onFocus: JSX.FocusEventHandlerUnion = ( + e, + ) => { + callHandler(e, (props as CalendarNextTriggerProps).onFocus as JSX.FocusEventHandlerUnion); + nextTriggerFocused = true; + }; + + const onBlur: JSX.FocusEventHandlerUnion = ( + e, + ) => { + callHandler(e, (props as CalendarNextTriggerProps).onBlur as JSX.FocusEventHandlerUnion); + nextTriggerFocused = false; + }; + + // If the trigger becomes disabled while focused, move focus to the calendar body. + createEffect( + () => nextTriggerDisabled(), + (disabled) => { + if (disabled && nextTriggerFocused) { + nextTriggerFocused = false; + context.setIsFocused(true); + } + }, + ); + + return ( + + ); +} diff --git a/packages/core/src/calendar/calendar-prev-trigger.tsx b/packages/core/src/calendar/calendar-prev-trigger.tsx new file mode 100644 index 00000000..70c61ab8 --- /dev/null +++ b/packages/core/src/calendar/calendar-prev-trigger.tsx @@ -0,0 +1,99 @@ +/* + * Portions of this file are based on code from react-spectrum. + * Apache License Version 2.0, Copyright 2020 Adobe. + * + * Credits to the React Spectrum team: + * https://github.com/adobe/react-spectrum/blob/0a1d0cd4e1b2f77eed7c0ea08fce8a04f8de6921/packages/@react-stately/calendar/src/useCalendarState.ts + * https://github.com/adobe/react-spectrum/blob/0a1d0cd4e1b2f77eed7c0ea08fce8a04f8de6921/packages/@react-aria/calendar/src/useCalendarBase.ts + */ + +import { callHandler } from "@kobalte/utils"; +import type { JSX, ValidComponent } from "@solidjs/web"; +import { createEffect, createMemo, omit } from "solid-js"; + +import * as Button from "../button"; +import { type ElementOf, type PolymorphicProps } from "../polymorphic"; +import { useCalendarContext } from "./calendar-context"; +import { isPreviousVisibleRangeInvalid } from "./utils"; + +export interface CalendarPrevTriggerOptions extends Button.ButtonRootOptions {} + +export interface CalendarPrevTriggerCommonProps< + T extends HTMLElement = HTMLElement, +> extends Button.ButtonRootCommonProps { + onClick: JSX.EventHandlerUnion; + onFocus: JSX.FocusEventHandlerUnion; + onBlur: JSX.FocusEventHandlerUnion; +} + +export interface CalendarPrevTriggerRenderProps + extends CalendarPrevTriggerCommonProps, + Button.ButtonRootRenderProps {} + +export type CalendarPrevTriggerProps< + T extends ValidComponent | HTMLElement = HTMLElement, +> = CalendarPrevTriggerOptions & + Partial>>; + +export function CalendarPrevTrigger( + props: PolymorphicProps>, +) { + const context = useCalendarContext(); + + const others = omit(props as CalendarPrevTriggerProps, "disabled", "onClick", "onFocus", "onBlur"); + + let prevTriggerFocused = false; + + const prevTriggerDisabled = createMemo(() => { + return ( + (props as CalendarPrevTriggerProps).disabled || + context.isDisabled() || + isPreviousVisibleRangeInvalid( + context.startDate(), + context.min(), + context.max(), + ) + ); + }); + + const onClick: JSX.EventHandlerUnion = (e) => { + callHandler(e, (props as CalendarPrevTriggerProps).onClick as JSX.EventHandlerUnion); + context.focusPreviousPage(); + }; + + const onFocus: JSX.FocusEventHandlerUnion = ( + e, + ) => { + callHandler(e, (props as CalendarPrevTriggerProps).onFocus as JSX.FocusEventHandlerUnion); + prevTriggerFocused = true; + }; + + const onBlur: JSX.FocusEventHandlerUnion = ( + e, + ) => { + callHandler(e, (props as CalendarPrevTriggerProps).onBlur as JSX.FocusEventHandlerUnion); + prevTriggerFocused = false; + }; + + // If the trigger becomes disabled while focused, move focus to the calendar body. + createEffect( + () => prevTriggerDisabled(), + (disabled) => { + if (disabled && prevTriggerFocused) { + prevTriggerFocused = false; + context.setIsFocused(true); + } + }, + ); + + return ( + + ); +} diff --git a/packages/core/src/calendar/calendar-root.tsx b/packages/core/src/calendar/calendar-root.tsx new file mode 100644 index 00000000..99fa7d0f --- /dev/null +++ b/packages/core/src/calendar/calendar-root.tsx @@ -0,0 +1,1058 @@ +/* + * Portions of this file are based on code from react-spectrum. + * Apache License Version 2.0, Copyright 2020 Adobe. + * + * Credits to the React Spectrum team: + * https://github.com/adobe/react-spectrum/blob/0a1d0cd4e1b2f77eed7c0ea08fce8a04f8de6921/packages/@react-stately/calendar/src/useCalendarState.ts + * https://github.com/adobe/react-spectrum/blob/0a1d0cd4e1b2f77eed7c0ea08fce8a04f8de6921/packages/@react-aria/calendar/src/useCalendarBase.ts + */ + +import { + type Calendar, + type DateDuration, + DateFormatter, + GregorianCalendar, + getDayOfWeek, + isSameDay, + maxDate, + minDate, + startOfWeek, + toCalendar, + toCalendarDate, + today, +} from "@internationalized/date"; +import { + contains, + getDocument, + getWindow, + mergeDefaultProps, + mergeRefs, + type RangeValue, + type ValidationState, +} from "@kobalte/utils"; +import type { ValidComponent } from "@solidjs/web"; +import { isServer } from "@solidjs/web"; +import { + type Accessor, + createEffect, + createMemo, + createSignal, + omit, +} from "solid-js"; + +import { getReadingDirection, useLocale } from "../i18n"; +import { announce } from "../live-announcer"; +import { + type ElementOf, + Polymorphic, + type PolymorphicProps, +} from "../polymorphic"; +import { createInteractOutside } from "@solid-primitives/interaction"; +import { createControllableSignal } from "../primitives"; +import { + CALENDAR_INTL_MESSAGES, + type CalendarIntlTranslations, +} from "./calendar.intl"; +import { + CalendarContext, + type CalendarContextValue, + type CalendarDataSet, +} from "./calendar-context"; +import type { CalendarSelectionMode, DateAlignment, DateValue } from "./types"; +import { + alignCenter, + alignDate, + asArrayValue, + asRangeValue, + asSingleValue, + constrainValue, + getAdjustedDateFn, + getArrayValueOfSelection, + getEndDate, + getFirstValueOfSelection, + getNextPage, + getNextRow, + getNextSection, + getNextUnavailableDate, + getPreviousAvailableDate, + getPreviousPage, + getPreviousRow, + getPreviousSection, + getSectionEnd, + getSectionStart, + getSelectedDateDescription, + getSelectedDateRangeDescription, + getVisibleRangeDescription, + isDateInvalid, + makeCalendarDateRange, + sortDates, +} from "./utils"; + +export interface CalendarSingleSelectionOptions { + /** The selection mode of the calendar. */ + selectionMode: "single"; + + /** The controlled selected date of the calendar. */ + value?: DateValue | null; + + /** + * The date of the calendar that should be selected when initially rendered. + * Useful when you do not need to control the state of the calendar. + */ + defaultValue?: DateValue | null; + + /** Event handler called when the selected date change. */ + onChange?: (value: DateValue) => void; +} + +export interface CalendarMultipleSelectionOptions { + /** The selection mode of the calendar. */ + selectionMode: "multiple"; + + /** The controlled selected dates of the calendar. */ + value?: DateValue[] | null; + + /** + * The dates of the calendar that should be selected when initially rendered. + * Useful when you do not need to control the state of the calendar. + */ + defaultValue?: DateValue[] | null; + + /** Event handler called when the selected dates change. */ + onChange?: (value: DateValue[]) => void; +} + +export interface CalendarRangeSelectionOptions { + /** The selection mode of the calendar. */ + selectionMode: "range"; + + /** The controlled selected date range of the calendar. */ + value?: RangeValue | null; + + /** + * The date range of the calendar that should be selected when initially rendered. + * Useful when you do not need to control the state of the calendar. + */ + defaultValue?: RangeValue | null; + + /** Event handler called when the selected date range change. */ + onChange?: (value: RangeValue) => void; +} + +export type CalendarRootOptions = ( + | CalendarSingleSelectionOptions + | CalendarMultipleSelectionOptions + | CalendarRangeSelectionOptions +) & { + /** The localized strings of the component. */ + translations?: CalendarIntlTranslations; + + /** + * A function that creates a [Calendar](https://react-spectrum.adobe.com/internationalized/date/Calendar.html) + * object for a given calendar identifier. Such a function may be imported from the + * `@internationalized/date` package, or manually implemented to include support for + * only certain calendars. + */ + createCalendar: (name: string) => Calendar; + + /** The locale to display and edit the value according to. */ + locale?: string; + + /** + * The amount of days that will be displayed at once. + * This affects how pagination works. + */ + visibleDuration?: DateDuration; + + /** Determines how to align the initial selection relative to the visible date range. */ + selectionAlignment?: DateAlignment; + + /** The minimum allowed date that a user may select. */ + minValue?: DateValue; + + /** The maximum allowed date that a user may select. */ + maxValue?: DateValue; + + /** + * Callback that is called for each date of the calendar. + * If it returns true, then the date is unavailable. + */ + isDateUnavailable?: (date: DateValue) => boolean; + + /** + * In "range" selection mode, when combined with `isDateUnavailable`, + * determines whether non-contiguous ranges, i.e. ranges containing unavailable dates, may be selected. + */ + allowsNonContiguousRanges?: boolean; + + /** Whether to automatically focus the calendar when it mounts. */ + autoFocus?: boolean; + + /** Controls the currently focused date within the calendar. */ + focusedValue?: DateValue; + + /** The date that is focused when the calendar first mounts. */ + defaultFocusedValue?: DateValue; + + /** Handler that is called when the focused date changes. */ + onFocusChange?: (date: DateValue) => void; + + /** Whether the current selection is valid or invalid according to application logic. */ + validationState?: ValidationState; + + /** Whether the calendar is disabled. */ + disabled?: boolean; + + /** Whether the calendar value is read only. */ + readOnly?: boolean; + }; + +export interface CalendarRootCommonProps { + ref: T | ((el: T) => void); + "aria-label": string | undefined; +} + +export interface CalendarRootRenderProps extends CalendarRootCommonProps { + role: "group"; +} + +export type CalendarRootProps< + T extends ValidComponent | HTMLElement = HTMLElement, +> = CalendarRootOptions & Partial>>; + +/** + * A calendar displays one or more date grids and allows users to select a single, multiple or range of dates. + */ +export function CalendarRoot( + props: PolymorphicProps>, +) { + let ref: HTMLElement | undefined; + + const merged = mergeDefaultProps( + { + visibleDuration: { months: 1 }, + selectionMode: "single" as CalendarSelectionMode, + translations: CALENDAR_INTL_MESSAGES, + }, + props as CalendarRootProps, + ); + + const others = omit( + merged, + "translations", + "ref", + "locale", + "createCalendar", + "visibleDuration", + "selectionAlignment", + "selectionMode", + "value", + "defaultValue", + "onChange", + "minValue", + "maxValue", + "isDateUnavailable", + "allowsNonContiguousRanges", + "autoFocus", + "focusedValue", + "defaultFocusedValue", + "onFocusChange", + "validationState", + "disabled", + "readOnly", + "aria-label", + ); + + const locale = createMemo(() => { + return merged.locale ?? useLocale().locale(); + }); + + const resolvedOptions = createMemo(() => { + return new DateFormatter(locale()).resolvedOptions(); + }); + + const direction = createMemo(() => { + return getReadingDirection(locale()); + }); + + const calendar = createMemo(() => { + return merged.createCalendar(resolvedOptions().calendar); + }); + + const [value, setControlledValue] = createControllableSignal< + DateValue | DateValue[] | RangeValue | null | undefined + >({ + value: () => merged.value, + defaultValue: () => merged.defaultValue, + onChange: (value) => (merged.onChange as ((v: typeof value) => void) | undefined)?.(value), + }); + + const [availableRange, setAvailableRange] = + createSignal>(); + + const selectionAlignment = createMemo(() => { + if (merged.selectionMode === "range") { + const valueRange = asRangeValue(value()); + + if (valueRange?.start && valueRange.end) { + const start = alignCenter( + toCalendarDate(valueRange.start), + merged.visibleDuration!, + locale(), + merged.minValue, + merged.maxValue, + ); + + const end = start.add(merged.visibleDuration!).subtract({ days: 1 }); + + if (valueRange.end.compare(end) > 0) { + return "start"; + } + } + + return "center"; + } + + return merged.selectionAlignment ?? "center"; + }); + + const min = createMemo(() => { + const startRange = availableRange()?.start; + + if (merged.selectionMode === "range" && merged.minValue && startRange) { + return maxDate(merged.minValue, startRange); + } + + return merged.minValue; + }); + + const max = createMemo(() => { + const endRange = availableRange()?.end; + + if (merged.selectionMode === "range" && merged.maxValue && endRange) { + return minDate(merged.maxValue, endRange); + } + + return merged.maxValue; + }); + + const calendarDateValue = createMemo(() => { + return getArrayValueOfSelection(merged.selectionMode, value()).map((date) => + toCalendar(toCalendarDate(date), calendar()), + ); + }); + + const timeZone = createMemo(() => { + const firstValue = getFirstValueOfSelection(merged.selectionMode, value()); + + if (firstValue && "timeZone" in firstValue) { + return firstValue.timeZone; + } + + return resolvedOptions().timeZone; + }); + + const focusedCalendarDate = createMemo(() => { + if (merged.focusedValue) { + return constrainValue( + toCalendar(toCalendarDate(merged.focusedValue), calendar()), + min(), + max(), + ); + } + + return undefined; + }); + + const defaultFocusedCalendarDate = createMemo(() => { + return constrainValue( + merged.defaultFocusedValue + ? toCalendar(toCalendarDate(merged.defaultFocusedValue), calendar()) + : calendarDateValue()[0] || toCalendar(today(timeZone()), calendar()), + min(), + max(), + ); + }); + + const [focusedDate, setFocusedDate] = createControllableSignal({ + value: focusedCalendarDate, + defaultValue: defaultFocusedCalendarDate, + onChange: (value) => merged.onFocusChange?.(value), + }); + + const [startDate, setStartDate] = createSignal( + alignDate( + focusedDate()!, + selectionAlignment(), + merged.visibleDuration!, + locale(), + min(), + max(), + ), + ); + + const endDate = createMemo(() => { + return getEndDate(startDate(), merged.visibleDuration!); + }); + + const [isFocused, setIsFocused] = createSignal(merged.autoFocus || false); + + const [isDragging, setIsDragging] = createSignal(false); + + const visibleRangeDescription = createMemo(() => { + return getVisibleRangeDescription( + merged.translations!, + startDate(), + endDate(), + timeZone(), + true, + ); + }); + + const ariaLabel = () => { + return [merged["aria-label"], visibleRangeDescription()] + .filter(Boolean) + .join(", "); + }; + + const isCellDisabled = (date: DateValue) => { + return ( + merged.disabled || + date.compare(startDate()) < 0 || + date.compare(endDate()) > 0 || + isDateInvalid(date, min(), max()) + ); + }; + + const isCellUnavailable = (date: DateValue) => { + return merged.isDateUnavailable?.(date) ?? false; + }; + + const updateAvailableRange = (date: DateValue | undefined) => { + if (date && merged.isDateUnavailable && !merged.allowsNonContiguousRanges) { + setAvailableRange({ + start: getNextUnavailableDate( + date, + startDate(), + endDate(), + isCellUnavailable, + -1, + ), + end: getNextUnavailableDate( + date, + startDate(), + endDate(), + isCellUnavailable, + 1, + ), + }); + } else { + setAvailableRange(undefined); + } + }; + + const [anchorDate, setAnchorDate] = createControllableSignal< + DateValue | undefined + >({ + onChange: (value) => updateAvailableRange(value), + }); + + const highlightedRange = createMemo(() => { + if (merged.selectionMode !== "range") { + return undefined; + } + + const resolvedAnchorDate = anchorDate(); + + if (resolvedAnchorDate) { + return makeCalendarDateRange(resolvedAnchorDate, focusedDate()!); + } + + const { start, end } = asRangeValue(value()) ?? {}; + + return makeCalendarDateRange(start, end); + }); + + const validationState = createMemo(() => { + if (merged.validationState) { + return merged.validationState; + } + + if (calendarDateValue().length <= 0) { + return null; + } + + if (merged.selectionMode === "range" && anchorDate()) { + return null; + } + + const isSomeDateInvalid = calendarDateValue().some((date) => { + return ( + merged.isDateUnavailable?.(date) || isDateInvalid(date, min(), max()) + ); + }); + + return isSomeDateInvalid ? "invalid" : null; + }); + + const isCellSelected = (cellDate: DateValue) => { + const isAvailable = + !isCellDisabled(cellDate) && !isCellUnavailable(cellDate); + + if (merged.selectionMode === "range") { + const { start, end } = highlightedRange() ?? {}; + + const isInRange = + start != null && + cellDate.compare(start) >= 0 && + end != null && + cellDate.compare(end) <= 0; + + return isInRange && isAvailable; + } + + return ( + calendarDateValue().some((date) => isSameDay(cellDate, date)) && + isAvailable + ); + }; + + const isCellFocused = (date: DateValue) => { + const resolvedFocusedDate = focusedDate(); + + return ( + isFocused() && + resolvedFocusedDate != null && + isSameDay(date, resolvedFocusedDate) + ); + }; + + const isCellInvalid = (date: DateValue) => { + if (merged.selectionMode === "range") { + return ( + isDateInvalid(date, min(), max()) || + isDateInvalid(date, availableRange()?.start, availableRange()?.end) + ); + } + + return isDateInvalid(date, min(), max()); + }; + + const selectDate = (date: DateValue) => { + if (merged.readOnly || merged.disabled) { + return; + } + + let newValue = getPreviousAvailableDate( + constrainValue(date, min(), max()), + startDate(), + merged.isDateUnavailable, + ); + + if (!newValue) { + return; + } + + if (merged.selectionMode === "single") { + setControlledValue((prev) => { + const prevValue = asSingleValue(prev); + + if (!newValue) { + return prevValue; + } + + return convertValue(newValue, prevValue); + }); + } else if (merged.selectionMode === "multiple") { + setControlledValue((prev) => { + const prevValue = asArrayValue(prev) ?? []; + + if (!newValue) { + return prevValue; + } + + newValue = convertValue(newValue, prevValue[0]); + + const index = prevValue.findIndex( + (date) => newValue != null && isSameDay(date, newValue), + ); + + // If new value is already selected, remove it. + if (index !== -1) { + const nextValues = [...prevValue]; + nextValues.splice(index, 1); + return sortDates(nextValues); + } + return sortDates([...prevValue, newValue]); + }); + } else if (merged.selectionMode === "range") { + if (!anchorDate()) { + setAnchorDate(newValue); + } else { + setControlledValue((prev) => { + const prevRange = asRangeValue(prev); + + const range = makeCalendarDateRange(anchorDate(), newValue); + + if (!range) { + return prevRange; + } + + return { + start: convertValue(range.start, prevRange?.start), + end: convertValue(range.end, prevRange?.end), + }; + }); + + setAnchorDate(undefined); + } + } + }; + + const selectFocusedDate = () => { + selectDate(focusedDate()!); + }; + + const focusCell = (date: DateValue) => { + setFocusedDate(constrainValue(date, min(), max())); + + if (!isFocused()) { + setIsFocused(true); + } + }; + + const highlightDate = (date: DateValue) => { + if (anchorDate()) { + focusCell(date); + } + }; + + const focusNextDay = () => { + focusCell(focusedDate()!.add({ days: 1 })); + }; + + const focusPreviousDay = () => { + focusCell(focusedDate()!.subtract({ days: 1 })); + }; + + const focusNextRow = () => { + const row = getNextRow( + focusedDate()!, + startDate(), + merged.visibleDuration!, + locale(), + min(), + max(), + ); + + if (row) { + setStartDate(row.startDate); + focusCell(row.focusedDate); + } + }; + + const focusPreviousRow = () => { + const row = getPreviousRow( + focusedDate()!, + startDate(), + merged.visibleDuration!, + locale(), + min(), + max(), + ); + + if (row) { + setStartDate(row.startDate); + focusCell(row.focusedDate); + } + }; + + const focusNextPage = () => { + const page = getNextPage( + focusedDate()!, + startDate(), + merged.visibleDuration!, + locale(), + min(), + max(), + ); + + setFocusedDate(constrainValue(page.focusedDate, min(), max())); + setStartDate(page.startDate); + }; + + const focusPreviousPage = () => { + const page = getPreviousPage( + focusedDate()!, + startDate(), + merged.visibleDuration!, + locale(), + min(), + max(), + ); + + setFocusedDate(constrainValue(page.focusedDate, min(), max())); + setStartDate(page.startDate); + }; + + const focusSectionStart = () => { + const section = getSectionStart( + focusedDate()!, + startDate(), + merged.visibleDuration!, + locale(), + min(), + max(), + ); + + if (section) { + setStartDate(section.startDate); + focusCell(section.focusedDate); + } + }; + + const focusSectionEnd = () => { + const section = getSectionEnd( + focusedDate()!, + startDate(), + merged.visibleDuration!, + locale(), + min(), + max(), + ); + + if (section) { + setStartDate(section.startDate); + focusCell(section.focusedDate); + } + }; + + const focusNextSection = (larger: boolean) => { + const section = getNextSection( + focusedDate()!, + startDate(), + larger, + merged.visibleDuration!, + locale(), + min(), + max(), + ); + + if (section) { + setStartDate(section.startDate); + focusCell(section.focusedDate); + } + }; + + const focusPreviousSection = (larger: boolean) => { + const section = getPreviousSection( + focusedDate()!, + startDate(), + larger, + merged.visibleDuration!, + locale(), + min(), + max(), + ); + + if (section) { + setStartDate(section.startDate); + focusCell(section.focusedDate); + } + }; + + const getDatesInWeek = (weekIndex: number, from: DateValue) => { + let date = from.add({ weeks: weekIndex }); + const dates = []; + + date = startOfWeek(date, locale()); + + // startOfWeek will clamp dates within the calendar system's valid range, which may + // start in the middle of a week. In this case, add null placeholders. + const dayOfWeek = getDayOfWeek(date, locale()); + for (let i = 0; i < dayOfWeek; i++) { + dates.push(null); + } + + while (dates.length < 7) { + dates.push(date); + const nextDate = date.add({ days: 1 }); + if (isSameDay(date, nextDate)) { + break; + } + date = nextDate; + } + + // Add null placeholders if at the end of the calendar system. + while (dates.length < 7) { + dates.push(null); + } + + return dates; + }; + + createInteractOutside( + { + onInteractOutside: () => { + // Stop range selection on interaction outside the calendar, e.g. tabbing away from the calendar. + if (merged.selectionMode === "range" && anchorDate()) { + selectFocusedDate(); + } + }, + }, + () => ref, + ); + + // Reset focused date and visible range when calendar changes. + let lastCalendarIdentifier = calendar().identifier; + + createEffect( + () => calendar(), + (cal) => { + if (cal.identifier !== lastCalendarIdentifier) { + const newFocusedDate = toCalendar(focusedDate()!, cal); + + setStartDate( + alignCenter( + newFocusedDate, + merged.visibleDuration!, + locale(), + min(), + max(), + ), + ); + + setFocusedDate(newFocusedDate); + + lastCalendarIdentifier = cal.identifier; + } + }, + ); + + // Adjust start/focused dates when visible duration, locale, or min/max change. + createEffect( + () => { + const adjust = getAdjustedDateFn( + merged.visibleDuration!, + locale(), + min(), + max(), + ); + + return adjust({ + startDate: startDate(), + focusedDate: focusedDate()!, + }); + }, + (adjustment) => { + setStartDate(adjustment.startDate); + setFocusedDate(adjustment.focusedDate); + }, + ); + + // Announce when the visible date range changes only when not focused on the grid. + createEffect( + () => ({ + notFocused: !isFocused(), + description: visibleRangeDescription(), + }), + ({ notFocused, description }) => { + if (notFocused) { + announce(description); + } + }, + ); + + // Announce when the selected value changes. + createEffect( + () => { + let description: string | null | undefined; + + if (merged.selectionMode === "single") { + const date = asSingleValue(value()); + description = + date && + getSelectedDateDescription(merged.translations!, date, timeZone()); + } else if (merged.selectionMode === "multiple") { + const dates = asArrayValue(value()); + description = dates + ?.map((date) => + getSelectedDateDescription(merged.translations!, date, timeZone()), + ) + .join(", "); + } else if (merged.selectionMode === "range") { + const dateRange = asRangeValue(value()) ?? {}; + description = getSelectedDateRangeDescription( + merged.translations!, + dateRange, + anchorDate(), + timeZone(), + ); + } + + return description; + }, + (description) => { + if (description) { + announce(description, "polite", 4000); + } + }, + ); + + // In "range" selection mode, update the available range if the visible range changes. + createEffect( + () => { startDate(); endDate(); }, + () => { + if (merged.selectionMode === "range") { + updateAvailableRange(anchorDate()); + } + }, + ); + + let isVirtualClick = false; + + // Handle range drag-to-select pointer events. + createEffect( + () => ({ + enabled: !isServer && merged.selectionMode === "range" && !!ref, + }), + ({ enabled }) => { + if (!enabled) return; + + const win = getWindow(ref!); + const doc = getDocument(ref!); + + // We need to ignore virtual pointer events from VoiceOver due to these bugs. + // https://bugs.webkit.org/show_bug.cgi?id=222627 + // https://bugs.webkit.org/show_bug.cgi?id=223202 + const onWindowPointerDown = (e: PointerEvent) => { + isVirtualClick = e.width === 0 && e.height === 0; + }; + + // Stop range selection when pressing or releasing a pointer outside the calendar body, + // except when pressing the next or previous buttons to switch months. + const endDragging = (e: PointerEvent) => { + if (isVirtualClick) { + isVirtualClick = false; + return; + } + + setIsDragging(false); + if (!anchorDate()) { + return; + } + + const target = e.target as Element; + if ( + contains(ref, doc.activeElement) && + (!contains(ref, target) || + !target.closest('button, [role="button"]')) + ) { + selectFocusedDate(); + } + }; + + // Prevent touch scrolling while dragging + const onTouchMove = (e: TouchEvent) => { + if (isDragging()) { + e.preventDefault(); + } + }; + + win.addEventListener("pointerdown", onWindowPointerDown); + win.addEventListener("pointerup", endDragging); + win.addEventListener("pointercancel", endDragging); + ref!.addEventListener("touchmove", onTouchMove, { + passive: false, + capture: true, + }); + + return () => { + win.removeEventListener("pointerdown", onWindowPointerDown); + win.removeEventListener("pointerup", endDragging); + win.removeEventListener("pointercancel", endDragging); + ref?.removeEventListener("touchmove", onTouchMove, { capture: true }); + }; + }, + ); + + const dataset: Accessor = createMemo(() => ({})); + + const context: CalendarContextValue = { + dataset, + value, + isDisabled: () => merged.disabled ?? false, + isReadOnly: () => merged.readOnly ?? false, + isDragging, + isCellUnavailable, + isCellDisabled, + isCellSelected, + isCellFocused, + isCellInvalid, + validationState, + startDate, + endDate, + anchorDate, + focusedDate: () => focusedDate()!, + visibleDuration: () => merged.visibleDuration!, + selectionMode: () => merged.selectionMode!, + locale, + highlightedRange, + direction, + min, + max, + timeZone, + translations: () => merged.translations!, + setStartDate, + setAnchorDate, + setIsFocused, + setIsDragging, + selectFocusedDate, + selectDate, + highlightDate, + focusCell, + focusNextDay, + focusPreviousDay, + focusNextPage, + focusPreviousPage, + focusNextRow, + focusPreviousRow, + focusSectionStart, + focusSectionEnd, + focusNextSection, + focusPreviousSection, + getDatesInWeek, + }; + + return ( + + + ref={mergeRefs((el) => (ref = el), merged.ref)} + as="div" + role="group" + aria-label={ariaLabel()} + {...others} + /> + + ); +} + +function convertValue( + newValue: DateValue, + oldValue?: DateValue | null, +): DateValue { + // The display calendar should not have any effect on the emitted value. + // Emit dates in the same calendar as the original value, if any, otherwise gregorian. + // biome-ignore lint/style/noParameterAssign: convert parameter + newValue = toCalendar( + newValue, + oldValue?.calendar || new GregorianCalendar(), + ); + + // Preserve time if the input value had one. + if (oldValue && "hour" in oldValue) { + return oldValue.set(newValue); + } + + return newValue; +} diff --git a/packages/core/src/calendar/calendar.intl.ts b/packages/core/src/calendar/calendar.intl.ts new file mode 100644 index 00000000..376314e0 --- /dev/null +++ b/packages/core/src/calendar/calendar.intl.ts @@ -0,0 +1,18 @@ +export const CALENDAR_INTL_MESSAGES = { + previous: "Previous", + next: "Next", + selectedDateDescription: (date: string) => `Selected Date: ${date}`, + selectedRangeDescription: (dateRange: string) => + `Selected Range: ${dateRange}`, + todayDate: (date: string, isSelected: boolean) => + `Today, ${date} ${isSelected ? " selected" : ""}`, + dateSelected: (date: string) => `${date} selected`, + startRangeSelectionPrompt: "Click to start selecting date range", + finishRangeSelectionPrompt: "Click to finish selecting date range", + minimumDate: "First available date", + maximumDate: "Last available date", + dateRange: (startDate: string, endDate: string) => + `${startDate} to ${endDate}`, +}; + +export type CalendarIntlTranslations = typeof CALENDAR_INTL_MESSAGES; diff --git a/packages/core/src/calendar/calendar.test.tsx b/packages/core/src/calendar/calendar.test.tsx new file mode 100644 index 00000000..ba412327 --- /dev/null +++ b/packages/core/src/calendar/calendar.test.tsx @@ -0,0 +1,286 @@ +/* + * Calendar logic ported from corvu/calendar (MIT) by Jasmin Noetzli. + * State management based on React Spectrum (Apache 2.0, Adobe). + */ + +import { CalendarDate, GregorianCalendar } from "@internationalized/date"; +import { fireEvent, render } from "@solidjs/testing-library"; +import type { ComponentProps } from "solid-js"; +import { createSignal, flush, Show } from "solid-js"; +import { vi } from "vitest"; + +import * as Calendar from "."; + +const createGregorianCalendar = () => new GregorianCalendar(); + +// Pin to January 2024 for deterministic heading/cell assertions. +const JAN_2024 = new CalendarDate(2024, 1, 15); +const JAN_01_2024 = new CalendarDate(2024, 1, 1); +const JAN_10_2024 = new CalendarDate(2024, 1, 10); +const JAN_20_2024 = new CalendarDate(2024, 1, 20); + +function CalendarExample(props: Partial>) { + return ( + + + + + + + + + + + {(day) => ( + + {day().slice(0, 2)} + + )} + + + + {(weekIndex) => ( + + {(date) => ( + }> + {(d) => ( + + + + )} + + )} + + )} + + + + + ); +} + +describe("Calendar", () => { + it("root has role='group'", () => { + const { getByRole } = render(() => ); + expect(getByRole("group")).toBeInTheDocument(); + }); + + it("heading shows the focused month and year", () => { + const { getByTestId } = render(() => ); + expect(getByTestId("heading")).toHaveTextContent("January 2024"); + }); + + it("next trigger advances to the following month", async () => { + const { getByTestId } = render(() => ); + fireEvent.click(getByTestId("next")); + flush(); + expect(getByTestId("heading")).toHaveTextContent("February 2024"); + }); + + it("prev trigger moves back to the previous month", async () => { + const { getByTestId } = render(() => ); + fireEvent.click(getByTestId("prev")); + flush(); + expect(getByTestId("heading")).toHaveTextContent("December 2023"); + }); + + it("clicking a date adds data-selected to its trigger", async () => { + const { container } = render(() => ); + const cell = container.querySelector( + '[data-value="2024-01-15"][data-type="day"]', + ) as HTMLElement; + expect(cell).toBeInTheDocument(); + + fireEvent.click(cell); + flush(); + + expect(cell).toHaveAttribute("data-selected"); + }); + + it("fires onChange with the selected date", async () => { + const onChange = vi.fn(); + const { container } = render(() => ( + + )); + const cell = container.querySelector( + '[data-value="2024-01-15"][data-type="day"]', + ) as HTMLElement; + + fireEvent.click(cell); + flush(); + + expect(onChange).toHaveBeenCalledOnce(); + const selected = onChange.mock.calls[0][0] as CalendarDate; + expect(selected.toString()).toBe("2024-01-15"); + }); + + it("clicking a selected date in multiple mode deselects it", async () => { + const { container } = render(() => ( + + )); + const cell = container.querySelector( + '[data-value="2024-01-15"][data-type="day"]', + ) as HTMLElement; + expect(cell).toHaveAttribute("data-selected"); + + fireEvent.click(cell); + flush(); + + expect(cell).not.toHaveAttribute("data-selected"); + }); + + it("disabled calendar: cells carry data-disabled and onChange does not fire", async () => { + const onChange = vi.fn(); + const { container } = render(() => ( + + )); + const cell = container.querySelector( + '[data-value="2024-01-15"][data-type="day"]', + ) as HTMLElement; + expect(cell).toHaveAttribute("data-disabled"); + + fireEvent.click(cell); + flush(); + + expect(onChange).not.toHaveBeenCalled(); + expect(cell).not.toHaveAttribute("data-selected"); + }); + + it("readOnly calendar: existing selection is shown but clicks are ignored", async () => { + const onChange = vi.fn(); + const { container } = render(() => ( + + )); + const selected = container.querySelector( + '[data-value="2024-01-15"][data-type="day"]', + ) as HTMLElement; + expect(selected).toHaveAttribute("data-selected"); + + const other = container.querySelector( + '[data-value="2024-01-10"][data-type="day"]', + ) as HTMLElement; + fireEvent.click(other); + flush(); + + expect(onChange).not.toHaveBeenCalled(); + expect(selected).toHaveAttribute("data-selected"); + expect(other).not.toHaveAttribute("data-selected"); + }); + + it("isDateUnavailable marks matching dates with data-unavailable", () => { + const { container } = render(() => ( + + d.compare(JAN_10_2024) === 0 + } + /> + )); + const unavailable = container.querySelector( + '[data-value="2024-01-10"][data-type="day"]', + ) as HTMLElement; + expect(unavailable).toHaveAttribute("data-unavailable"); + }); + + it("minValue disables dates before the minimum", () => { + const { container } = render(() => ( + + )); + const beforeMin = container.querySelector( + '[data-value="2024-01-01"][data-type="day"]', + ) as HTMLElement; + expect(beforeMin).toHaveAttribute("data-disabled"); + }); + + it("maxValue disables dates after the maximum", () => { + const { container } = render(() => ( + + )); + const afterMax = container.querySelector( + '[data-value="2024-01-20"][data-type="day"]', + ) as HTMLElement; + expect(afterMax).toHaveAttribute("data-disabled"); + }); + + it("multiple selection: clicking two dates selects both", async () => { + const { container } = render(() => ( + + )); + const cell1 = container.querySelector( + '[data-value="2024-01-10"][data-type="day"]', + ) as HTMLElement; + const cell2 = container.querySelector( + '[data-value="2024-01-20"][data-type="day"]', + ) as HTMLElement; + + fireEvent.click(cell1); + flush(); + fireEvent.click(cell2); + flush(); + + expect(cell1).toHaveAttribute("data-selected"); + expect(cell2).toHaveAttribute("data-selected"); + }); + + it("range selection: onChange fires with start and end after both are chosen", async () => { + const onChange = vi.fn(); + const { container } = render(() => ( + + )); + + const start = container.querySelector( + '[data-value="2024-01-10"][data-type="day"]', + ) as HTMLElement; + const end = container.querySelector( + '[data-value="2024-01-20"][data-type="day"]', + ) as HTMLElement; + + // Range selection uses pointer events, not click. + // pointerDown on start sets the anchor; pointerUp on end commits the range. + fireEvent.pointerDown(start, { pointerId: 1 }); + flush(); + fireEvent.pointerUp(start, { pointerId: 1 }); + flush(); + fireEvent.pointerDown(end, { pointerId: 1 }); + flush(); + fireEvent.pointerUp(end, { pointerId: 1 }); + flush(); + + expect(onChange).toHaveBeenCalledOnce(); + const range = onChange.mock.calls[0][0] as { + start: CalendarDate; + end: CalendarDate; + }; + expect(range.start.toString()).toBe("2024-01-10"); + expect(range.end.toString()).toBe("2024-01-20"); + }); + + it("controlled value: externally changing value updates the selected date", async () => { + const [value, setValue] = createSignal(null); + const { container } = render(() => ( + setValue(v as CalendarDate)} + /> + )); + + const cell = container.querySelector( + '[data-value="2024-01-15"][data-type="day"]', + ) as HTMLElement; + expect(cell).not.toHaveAttribute("data-selected"); + + setValue(JAN_2024); + flush(); + + expect(cell).toHaveAttribute("data-selected"); + }); +}); diff --git a/packages/core/src/calendar/index.tsx b/packages/core/src/calendar/index.tsx new file mode 100644 index 00000000..f6b28e9d --- /dev/null +++ b/packages/core/src/calendar/index.tsx @@ -0,0 +1,125 @@ +import { useCalendarContext as useContext } from "./calendar-context"; +import { + CalendarBody as Body, + type CalendarBodyProps, +} from "./calendar-body"; +import { + CalendarGrid as Grid, + type CalendarGridOptions, + type CalendarGridProps, +} from "./calendar-grid"; +import { + CalendarGridBody as GridBody, + type CalendarGridBodyProps, +} from "./calendar-grid-body"; +import { + CalendarGridBodyCell as GridBodyCell, + type CalendarGridBodyCellProps, +} from "./calendar-grid-body-cell"; +import { + CalendarGridBodyCellTrigger as GridBodyCellTrigger, + type CalendarGridBodyCellTriggerProps, +} from "./calendar-grid-body-cell-trigger"; +import { + CalendarGridBodyRow as GridBodyRow, + type CalendarGridBodyRowProps, +} from "./calendar-grid-body-row"; +import { + CalendarGridHeader as GridHeader, + type CalendarGridHeaderProps, +} from "./calendar-grid-header"; +import { + CalendarGridHeaderCell as GridHeaderCell, + type CalendarGridHeaderCellProps, +} from "./calendar-grid-header-cell"; +import { + CalendarGridHeaderRow as GridHeaderRow, + type CalendarGridHeaderRowProps, +} from "./calendar-grid-header-row"; +import { + CalendarHeader as Header, + type CalendarHeaderProps, +} from "./calendar-header"; +import { + CalendarHeading as Heading, + type CalendarHeadingProps, +} from "./calendar-heading"; +import { + CalendarNextTrigger as NextTrigger, + type CalendarNextTriggerOptions, + type CalendarNextTriggerProps, +} from "./calendar-next-trigger"; +import { + CalendarPrevTrigger as PrevTrigger, + type CalendarPrevTriggerOptions, + type CalendarPrevTriggerProps, +} from "./calendar-prev-trigger"; +import { + CalendarRoot as Root, + type CalendarMultipleSelectionOptions, + type CalendarRangeSelectionOptions, + type CalendarRootOptions, + type CalendarRootProps, + type CalendarSingleSelectionOptions, +} from "./calendar-root"; +import type { DateAlignment, DateValue } from "./types"; + +export type { + CalendarBodyProps, + CalendarGridBodyCellProps, + CalendarGridBodyCellTriggerProps, + CalendarGridBodyProps, + CalendarGridBodyRowProps, + CalendarGridHeaderCellProps, + CalendarGridHeaderProps, + CalendarGridHeaderRowProps, + CalendarGridOptions, + CalendarGridProps, + CalendarHeaderProps, + CalendarHeadingProps, + CalendarMultipleSelectionOptions, + CalendarNextTriggerOptions, + CalendarNextTriggerProps, + CalendarPrevTriggerOptions, + CalendarPrevTriggerProps, + CalendarRangeSelectionOptions, + CalendarRootOptions, + CalendarRootProps, + CalendarSingleSelectionOptions, + DateAlignment, + DateValue, +}; + +export const Calendar = Object.assign(Root, { + Body, + Grid, + GridBody, + GridBodyCell, + GridBodyCellTrigger, + GridBodyRow, + GridHeader, + GridHeaderCell, + GridHeaderRow, + Header, + Heading, + NextTrigger, + PrevTrigger, + useContext, +}); + +export { + Body, + Grid, + GridBody, + GridBodyCell, + GridBodyCellTrigger, + GridBodyRow, + GridHeader, + GridHeaderCell, + GridHeaderRow, + Header, + Heading, + NextTrigger, + PrevTrigger, + Root, +}; diff --git a/packages/core/src/calendar/stories/calendar.stories.tsx b/packages/core/src/calendar/stories/calendar.stories.tsx new file mode 100644 index 00000000..95c60ebb --- /dev/null +++ b/packages/core/src/calendar/stories/calendar.stories.tsx @@ -0,0 +1,663 @@ +/* + * Calendar stories for Kobalte. + * + * Calendar logic ported from corvu/calendar (MIT) by Jasmin Noetzli: + * https://github.com/corvudev/corvu/tree/main/packages/calendar + */ + +import { + CalendarDate, + GregorianCalendar, + isWeekend, + today, +} from "@internationalized/date"; +import { createMemo, createSignal, Show } from "solid-js"; +// biome-ignore lint/style/useImportType: storybook meta helper +import preview from "../../../../../.storybook/preview"; +import { + Body, + Grid, + GridBody, + GridBodyCell, + GridBodyCellTrigger, + GridBodyRow, + GridHeader, + GridHeaderCell, + GridHeaderRow, + Header, + Heading, + NextTrigger, + PrevTrigger, + Root, +} from "../index"; +import { Popover } from "../../popover"; +import type { DateValue } from "../types"; +import type { RangeValue } from "@kobalte/utils"; + +const meta = preview.meta({ + title: "Components/Calendar", + tags: ["autodocs"], +}); + +export default meta; +const createCalendar = () => new GregorianCalendar(); +const rootStyle: Record = { + display: "inline-block", + background: "#fff", + border: "1px solid #e2e8f0", + "border-radius": "10px", + padding: "16px", + "box-shadow": "0 1px 4px rgba(0,0,0,0.06)", + "font-family": "sans-serif", +}; + +const headerStyle: Record = { + display: "flex", + "align-items": "center", + "justify-content": "space-between", + "margin-bottom": "12px", +}; + +const headingStyle: Record = { + "font-size": "14px", + "font-weight": "600", + color: "#0f172a", +}; + +const navBtnStyle: Record = { + display: "inline-flex", + "align-items": "center", + "justify-content": "center", + width: "28px", + height: "28px", + "border-radius": "6px", + border: "1px solid #e2e8f0", + background: "#fff", + color: "#475569", + cursor: "pointer", + "font-size": "14px", + "line-height": "1", + "flex-shrink": "0", +}; + +const tableStyle: Record = { + "border-collapse": "collapse", + width: "100%", +}; + +const dayNameStyle: Record = { + "font-size": "11px", + "font-weight": "500", + color: "#94a3b8", + "text-align": "center", + padding: "4px 0 8px", + "text-transform": "uppercase", + "letter-spacing": "0.03em", +}; + +// Cell trigger gets a class string; we rely on data attributes for state styling +const cellTriggerClass = + "w-8 h-8 flex items-center justify-center rounded-full text-sm cursor-pointer select-none " + + "text-slate-700 " + + "data-[selected]:bg-blue-500 data-[selected]:text-white " + + "data-[today]:font-semibold data-[today]:text-blue-600 " + + "data-[today][data-selected]:text-white " + + "data-[disabled]:opacity-30 data-[disabled]:cursor-default " + + "data-[unavailable]:line-through data-[unavailable]:opacity-40 data-[unavailable]:cursor-default " + + "data-[outside-month]:opacity-20 " + + "hover:bg-slate-100 data-[selected]:hover:bg-blue-600 data-[disabled]:hover:bg-transparent " + + "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-1"; + +const rangeStartClass = + "w-8 h-8 flex items-center justify-center text-sm cursor-pointer select-none " + + "text-white bg-blue-500 rounded-full " + + "data-[disabled]:opacity-30 data-[disabled]:cursor-default " + + "hover:bg-blue-600 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-1"; +interface ShellProps { + selectionMode?: "single" | "multiple" | "range"; + value?: DateValue | DateValue[] | RangeValue | null; + defaultValue?: DateValue | DateValue[] | RangeValue | null; + onChange?: (value: DateValue | DateValue[] | RangeValue) => void; + isDateUnavailable?: (date: DateValue) => boolean; + minValue?: DateValue; + maxValue?: DateValue; + disabled?: boolean; + readOnly?: boolean; + visibleDuration?: { months?: number; days?: number; weeks?: number; years?: number }; + /** Show two months side by side (for range picker). */ + twoMonths?: boolean; +} + +function CalendarShell(props: ShellProps) { + const { twoMonths: _twoMonths, ...rest } = props; + const twoMonths = _twoMonths; + + return ( + +
+ + ‹ + + + + › + +
+ + + + + {(day) => ( + + {day().slice(0, 2)} + + )} + + + + {(weekIndex) => ( + + {(date) => ( + }> + {(d) => ( + + + + )} + + )} + + )} + + + + + + + {(day) => ( + + {day().slice(0, 2)} + + )} + + + + {(weekIndex) => ( + + {(date) => ( + }> + {(d) => ( + + + + )} + + )} + + )} + + + + +
+ ); +} +/** Select a single date. Click a day to select it; click again to keep it selected. */ +export const Single = meta.story({ + name: "Single", + render: () => , +}); + +/** Select multiple non-contiguous dates by clicking each one. Click a selected date to deselect it. */ +export const Multiple = meta.story({ + name: "Multiple", + render: () => , +}); + +/** Select a date range by clicking a start date, then an end date. Two months are shown for easier cross-month selection. */ +export const Range = meta.story({ + name: "Range", + render: () => ( + + ), +}); + +/** Controlled single-selection with the selected date displayed below. */ +function ControlledDemo() { + const [value, setValue] = createSignal(null); + + return ( +
+ setValue(v as unknown as DateValue)} + /> +

+ {value() + ? `Selected: ${value()!.toString()}` + : "No date selected"} +

+
+ ); +} + +/** Controlled value — the selected date is stored externally and shown beneath the calendar. */ +export const Controlled = meta.story({ + name: "Controlled", + render: () => , +}); + +/** Weekend days are marked unavailable. Clicking or navigating to them has no effect. */ +export const DisabledDates = meta.story({ + name: "Disabled Dates (Weekends)", + render: () => ( + isWeekend(date, "en-US")} + /> + ), +}); + +/** Selection is constrained between two dates. Dates outside the range are disabled. */ +function MinMaxDemo() { + const tz = "UTC"; + const base = today(tz); + const min = new CalendarDate(base.year, base.month, 1); + const max = new CalendarDate(base.year, base.month, 15); + + return ( +
+

+ Only the 1st – 15th of this month are selectable. +

+ +
+ ); +} + +/** `minValue` and `maxValue` cap the selectable range to the first half of the current month. */ +export const MinMax = meta.story({ + name: "Min / Max Dates", + render: () => , +}); + +/** The entire calendar is read-only — selection state is shown but cannot be changed. */ +export const ReadOnly = meta.story({ + name: "Read Only", + render: () => ( + + ), +}); + +/** A disabled calendar renders its dates but blocks all interaction. */ +export const Disabled = meta.story({ + name: "Disabled", + render: () => ( + + ), +}); + +function CalendarSVGIcon() { + return ( + + ); +} + +function DatePickerDemo() { + const [open, setOpen] = createSignal(false); + const [value, setValue] = createSignal(null); + + const formatted = createMemo(() => { + const v = value(); + if (!v) return ""; + const tz = Intl.DateTimeFormat().resolvedOptions().timeZone; + return new Intl.DateTimeFormat("en-US", { + month: "long", + day: "numeric", + year: "numeric", + }).format(v.toDate(tz)); + }); + + const inputStyle: Record = { + flex: "1", + border: "none", + outline: "none", + padding: "0 10px", + height: "38px", + "font-size": "14px", + "font-family": "sans-serif", + color: "#0f172a", + background: "transparent", + cursor: "default", + "min-width": "180px", + }; + + const iconBtnStyle: Record = { + display: "inline-flex", + "align-items": "center", + "justify-content": "center", + width: "36px", + height: "38px", + border: "none", + "border-left": "1px solid #e2e8f0", + background: "white", + color: "#64748b", + cursor: "pointer", + "flex-shrink": "0", + }; + + const anchorStyle: Record = { + display: "inline-flex", + "align-items": "center", + border: "1px solid #e2e8f0", + "border-radius": "8px", + background: "white", + overflow: "hidden", + "box-shadow": "0 1px 2px rgba(0,0,0,0.05)", + }; + + const popoverContentStyle: Record = { + "z-index": "50", + outline: "none", + }; + + return ( + + + + + + + + + + { + setValue(v as DateValue); + setOpen(false); + }} + style={rootStyle} + > +
+ + ‹ + + + + › + +
+ + + + + {(day) => ( + + {day().slice(0, 2)} + + )} + + + + {(weekIndex) => ( + + {(date) => ( + }> + {(d) => ( + + + + )} + + )} + + )} + + + +
+
+
+
+ ); +} + +/** An input that displays the selected date with a button to open a calendar picker. */ +export const DatePicker = meta.story({ + name: "Date Picker", + render: () => , +}); + +function DateRangePickerDemo() { + const [open, setOpen] = createSignal(false); + const [value, setValue] = createSignal | null>(null); + + const formatDate = (date: DateValue | undefined) => { + if (!date) return ""; + const tz = Intl.DateTimeFormat().resolvedOptions().timeZone; + return new Intl.DateTimeFormat("en-US", { + month: "short", + day: "numeric", + year: "numeric", + }).format(date.toDate(tz)); + }; + + const anchorStyle: Record = { + display: "inline-flex", + "align-items": "center", + border: "1px solid #e2e8f0", + "border-radius": "8px", + background: "white", + overflow: "hidden", + "box-shadow": "0 1px 2px rgba(0,0,0,0.05)", + }; + + const inputStyle: Record = { + border: "none", + outline: "none", + padding: "0 10px", + height: "38px", + "font-size": "14px", + "font-family": "sans-serif", + color: "#0f172a", + background: "transparent", + cursor: "default", + width: "130px", + }; + + const dividerStyle: Record = { + color: "#94a3b8", + "font-size": "14px", + "font-family": "sans-serif", + "flex-shrink": "0", + "user-select": "none", + }; + + const iconBtnStyle: Record = { + display: "inline-flex", + "align-items": "center", + "justify-content": "center", + width: "36px", + height: "38px", + border: "none", + "border-left": "1px solid #e2e8f0", + background: "white", + color: "#64748b", + cursor: "pointer", + "flex-shrink": "0", + }; + + const twoMonthRootStyle: Record = { + ...rootStyle, + display: "inline-block", + }; + + const twoGridsStyle: Record = { + display: "flex", + gap: "24px", + }; + + return ( + + + + + + + + + + + + { + const range = v as RangeValue; + setValue(range); + setOpen(false); + }} + style={twoMonthRootStyle} + > +
+ + ‹ + + + + › + +
+ + + + + {(day) => ( + + {day().slice(0, 2)} + + )} + + + + {(weekIndex) => ( + + {(date) => ( + }> + {(d) => ( + + + + )} + + )} + + )} + + + + + + {(day) => ( + + {day().slice(0, 2)} + + )} + + + + {(weekIndex) => ( + + {(date) => ( + }> + {(d) => ( + + + + )} + + )} + + )} + + + +
+
+
+
+ ); +} + +/** Two inputs (start / end) with a button that opens a two-month range calendar. Selecting the end date closes the picker. */ +export const DateRangePicker = meta.story({ + name: "Date Range Picker", + render: () => , +}); diff --git a/packages/core/src/calendar/types.ts b/packages/core/src/calendar/types.ts new file mode 100644 index 00000000..779d8776 --- /dev/null +++ b/packages/core/src/calendar/types.ts @@ -0,0 +1,21 @@ +/* + * Portions of this file are based on code from react-spectrum. + * Apache License Version 2.0, Copyright 2020 Adobe. + * + * Credits to the React Spectrum team: + * https://github.com/adobe/react-spectrum/blob/0a1d0cd4e1b2f77eed7c0ea08fce8a04f8de6921/packages/@react-types/calendar/src/index.d.ts + */ + +import type { + CalendarDate, + CalendarDateTime, + Time, + ZonedDateTime, +} from "@internationalized/date"; + +export type DateValue = CalendarDate | CalendarDateTime | ZonedDateTime; +export type TimeValue = Time | CalendarDateTime | ZonedDateTime; + +export type DateAlignment = "start" | "center" | "end"; + +export type CalendarSelectionMode = "single" | "multiple" | "range"; diff --git a/packages/core/src/calendar/utils.ts b/packages/core/src/calendar/utils.ts new file mode 100644 index 00000000..6a4e2f2c --- /dev/null +++ b/packages/core/src/calendar/utils.ts @@ -0,0 +1,843 @@ +/* + * Portions of this file are based on code from react-spectrum. + * Apache License Version 2.0, Copyright 2020 Adobe. + * + * Credits to the React Spectrum team: + * https://github.com/adobe/react-spectrum/blob/0a1d0cd4e1b2f77eed7c0ea08fce8a04f8de6921/packages/@react-stately/calendar/src/utils.ts + * + * Portions of this file are based on code from zag, based on code from react-spectrum. + * MIT Licensed, Copyright (c) 2021 Chakra UI. + * + * Credits to the Chakra UI team: + * https://github.com/chakra-ui/zag/blob/main/packages/utilities/date-utils/src/pagination.ts + */ + +import { + type CalendarDate, + type DateDuration, + type DateFormatter, + endOfMonth, + endOfWeek, + isSameDay, + maxDate, + minDate, + startOfMonth, + startOfWeek, + startOfYear, + toCalendarDate, +} from "@internationalized/date"; +import type { RangeValue } from "@kobalte/utils"; + +import { createDateFormatter } from "../i18n"; +import type { CalendarIntlTranslations } from "./calendar.intl"; +import type { CalendarSelectionMode, DateAlignment, DateValue } from "./types"; + + +export function constrainStart( + date: DateValue, + aligned: DateValue, + duration: DateDuration, + locale: string, + min?: DateValue, + max?: DateValue, +): DateValue { + let computedDate = aligned; + + if (min && date.compare(min) >= 0) { + computedDate = maxDate( + computedDate, + alignStart(toCalendarDate(min), duration, locale), + ); + } + + if (max && date.compare(max) <= 0) { + computedDate = minDate( + computedDate, + alignEnd(toCalendarDate(max), duration, locale), + ); + } + + return computedDate; +} + +export function constrainValue( + date: DateValue, + min?: DateValue, + max?: DateValue, +): DateValue { + let computedDate = date; + + if (min) { + computedDate = maxDate(computedDate, toCalendarDate(min)); + } + + if (max) { + computedDate = minDate(computedDate, toCalendarDate(max)); + } + + return computedDate; +} + + +export function alignStart( + date: DateValue, + duration: DateDuration, + locale: string, + min?: DateValue, + max?: DateValue, +): DateValue { + // align to the start of the largest unit + let aligned = date; + if (duration.years) { + aligned = startOfYear(date); + } else if (duration.months) { + aligned = startOfMonth(date); + } else if (duration.weeks) { + aligned = startOfWeek(date, locale); + } + + return constrainStart(date, aligned, duration, locale, min, max); +} + +export function alignCenter( + date: DateValue, + duration: DateDuration, + locale: string, + min?: DateValue, + max?: DateValue, +): DateValue { + const halfDuration: DateDuration = {}; + + for (const key in duration) { + // @ts-expect-error + halfDuration[key] = Math.floor(duration[key] / 2); + + // @ts-expect-error + if (halfDuration[key] > 0 && duration[key] % 2 === 0) { + // @ts-expect-error + halfDuration[key]--; + } + } + + const aligned = alignStart(date, duration, locale).subtract(halfDuration); + return constrainStart(date, aligned, duration, locale, min, max); +} + +export function alignEnd( + date: DateValue, + duration: DateDuration, + locale: string, + min?: DateValue, + max?: DateValue, +): DateValue { + const d: DateDuration = { ...duration }; + + // subtract 1 from the smallest unit + if (d.days) { + d.days--; + } else if (d.weeks) { + d.weeks--; + } else if (d.months) { + d.months--; + } else if (d.years) { + d.years--; + } + + const aligned = alignStart(date, duration, locale).subtract(d); + return constrainStart(date, aligned, duration, locale, min, max); +} + +export function alignDate( + date: DateValue, + alignment: DateAlignment, + duration: DateDuration, + locale: string, + min?: DateValue | undefined, + max?: DateValue | undefined, +) { + switch (alignment) { + case "start": + return alignStart(date, duration, locale, min, max); + case "end": + return alignEnd(date, duration, locale, min, max); + default: + return alignCenter(date, duration, locale, min, max); + } +} + +export function alignStartDate( + date: DateValue, + startDate: DateValue, + endDate: DateValue, + duration: DateDuration, + locale: string, + min?: DateValue | undefined, + max?: DateValue | undefined, +) { + if (date.compare(startDate) < 0) { + return alignEnd(date, duration, locale, min, max); + } + if (date.compare(endDate) > 0) { + return alignStart(date, duration, locale, min, max); + } + return startDate; +} + + +export function isDateInvalid( + date?: DateValue | null, + minValue?: DateValue | null, + maxValue?: DateValue | null, +) { + return ( + date != null && + ((minValue != null && date.compare(minValue) < 0) || + (maxValue != null && date.compare(maxValue) > 0)) + ); +} + +export function isPreviousVisibleRangeInvalid( + startDate: DateValue, + min?: DateValue | null, + max?: DateValue | null, +) { + const prevDate = startDate.subtract({ days: 1 }); + + return isSameDay(prevDate, startDate) || isDateInvalid(prevDate, min, max); +} + +export function isNextVisibleRangeInvalid( + endDate: DateValue, + min?: DateValue | null, + max?: DateValue | null, +) { + // Adding may return the same date if we reached the end of time + // according to the calendar system (e.g. 9999-12-31). + const nextDate = endDate.add({ days: 1 }); + + return isSameDay(nextDate, endDate) || isDateInvalid(nextDate, min, max); +} + + +export function getEndDate(startDate: DateValue, duration: DateDuration) { + const d = { ...duration }; + + if (d.days) { + d.days--; + } else { + d.days = -1; + } + + return startDate.add(d); +} + +export function getAdjustedDateFn( + visibleDuration: DateDuration, + locale: string, + min?: DateValue, + max?: DateValue, +) { + return function getDate(options: { + startDate: DateValue; + focusedDate: DateValue; + }) { + const { startDate, focusedDate } = options; + const endDate = getEndDate(startDate, visibleDuration); + + // If the focused date was moved to an invalid value, it can't be focused, so constrain it. + if (isDateInvalid(focusedDate, min, max)) { + return { + startDate, + endDate, + focusedDate: constrainValue(focusedDate, min, max), + }; + } + + if (focusedDate.compare(startDate) < 0) { + return { + startDate: alignEnd(focusedDate, visibleDuration, locale, min, max), + endDate, + focusedDate: constrainValue(focusedDate, min, max), + }; + } + + if (focusedDate.compare(endDate) > 0) { + return { + startDate: alignStart(focusedDate, visibleDuration, locale, min, max), + endDate, + focusedDate: constrainValue(focusedDate, min, max), + }; + } + + return { + startDate, + endDate, + focusedDate: constrainValue(focusedDate, min, max), + }; + }; +} + +export function getUnitDuration(duration: DateDuration) { + const unit = { ...duration }; + + for (const key in unit) { + // @ts-expect-error + unit[key] = 1; + } + + return unit; +} + +export function getNextUnavailableDate( + anchorDate: DateValue, + start: DateValue, + end: DateValue, + isDateUnavailableFn: (date: DateValue) => boolean, + dir: number, +): DateValue | undefined { + let nextDate = anchorDate.add({ days: dir }); + while ( + (dir < 0 ? nextDate.compare(start) >= 0 : nextDate.compare(end) <= 0) && + !isDateUnavailableFn(nextDate) + ) { + nextDate = nextDate.add({ days: dir }); + } + + if (isDateUnavailableFn(nextDate)) { + return nextDate.add({ days: -dir }); + } + + return undefined; +} + +export function getPreviousAvailableDate( + date: DateValue, + min: DateValue, + isDateUnavailable?: (date: DateValue) => boolean, +) { + if (!isDateUnavailable) { + return date; + } + + while (date.compare(min) >= 0 && isDateUnavailable(date)) { + // biome-ignore lint/style/noParameterAssign: used in loop + date = date.subtract({ days: 1 }); + } + + if (date.compare(min) >= 0) { + return date; + } +} + +export function getEraFormat(date: DateValue): "short" | undefined { + return date?.calendar.identifier === "gregory" && date.era === "BC" + ? "short" + : undefined; +} + +/** Return the first value of the selection depending on the selection mode. */ +export function getFirstValueOfSelection( + selectionMode: CalendarSelectionMode, + value: DateValue | DateValue[] | RangeValue | null | undefined, +) { + let firstValue: DateValue | null | undefined; + + if (selectionMode === "single") { + firstValue = asSingleValue(value); + } else if (selectionMode === "multiple") { + firstValue = asArrayValue(value)?.[0]; + } else if (selectionMode === "range") { + const { start } = asRangeValue(value) ?? {}; + firstValue = start; + } + + return firstValue; +} + +/** Return an array of values for the selection depending on the selection mode. */ +export function getArrayValueOfSelection( + selectionMode: CalendarSelectionMode, + value: DateValue | DateValue[] | RangeValue | null | undefined, +) { + let values: Array = []; + + if (selectionMode === "single") { + values = [asSingleValue(value)]; + } else if (selectionMode === "multiple") { + values = asArrayValue(value) ?? []; + } else if (selectionMode === "range") { + const { start, end } = asRangeValue(value) ?? {}; + values = [start, end]; + } + + return values.filter(Boolean) as DateValue[]; +} + + +function formatRange( + dateFormatter: DateFormatter, + translations: CalendarIntlTranslations, + start: DateValue, + end: DateValue, + timeZone: string, +) { + const parts = dateFormatter.formatRangeToParts( + start.toDate(timeZone), + end.toDate(timeZone), + ); + + // Find the separator between the start and end date. This is determined + // by finding the last shared literal before the end range. + let separatorIndex = -1; + + for (let i = 0; i < parts.length; i++) { + const part = parts[i]; + + if (part.source === "shared" && part.type === "literal") { + separatorIndex = i; + } else if (part.source === "endRange") { + break; + } + } + + // Now we can combine the parts into start and end strings. + let startValue = ""; + let endValue = ""; + + for (let i = 0; i < parts.length; i++) { + if (i < separatorIndex) { + startValue += parts[i].value; + } else if (i > separatorIndex) { + endValue += parts[i].value; + } + } + + return translations.dateRange(startValue, endValue); +} + + +export function getSelectedDateDescription( + translations: CalendarIntlTranslations, + value: DateValue, + timeZone: string, +) { + const dateFormatter = createDateFormatter(() => ({ + weekday: "long", + month: "long", + year: "numeric", + day: "numeric", + era: getEraFormat(value), + timeZone: timeZone, + })); + + return translations.selectedDateDescription( + dateFormatter().format(value.toDate(timeZone)), + ); +} + +export function getSelectedDateRangeDescription( + translations: CalendarIntlTranslations, + highlightedRange: { start?: DateValue; end?: DateValue }, + anchorDate: DateValue | undefined, + timeZone: string, +) { + const start = highlightedRange.start; + const end = highlightedRange.end; + + if (!anchorDate && start && end) { + const dateFormatter = createDateFormatter(() => ({ + weekday: "long", + month: "long", + year: "numeric", + day: "numeric", + era: getEraFormat(start) || getEraFormat(end), + timeZone: timeZone, + })); + + // Use a single date message if the start and end dates are the same day, + // otherwise include both dates. + if (isSameDay(start, end)) { + const date = dateFormatter().format(start.toDate(timeZone)); + return translations.selectedDateDescription(date); + } + const dateRange = formatRange( + dateFormatter(), + translations, + start, + end, + timeZone, + ); + return translations.selectedRangeDescription(dateRange); + } + + // No message if currently selecting a range, or there is nothing highlighted. + return ""; +} + +export function getVisibleRangeDescription( + translations: CalendarIntlTranslations, + startDate: DateValue, + endDate: DateValue, + timeZone: string, + isAria: boolean, +) { + const era = getEraFormat(startDate) || getEraFormat(endDate); + + const monthFormatter = createDateFormatter(() => ({ + month: "long", + year: "numeric", + era, + calendar: startDate.calendar.identifier, + timeZone, + })); + + const dateFormatter = createDateFormatter(() => ({ + month: "long", + year: "numeric", + day: "numeric", + era, + calendar: startDate.calendar.identifier, + timeZone, + })); + + // Special case for month granularity. Format as a single month if only a + // single month is visible, otherwise format as a range of months. + if (isSameDay(startDate, startOfMonth(startDate))) { + if (isSameDay(endDate, endOfMonth(startDate))) { + return monthFormatter().format(startDate.toDate(timeZone)); + } + if (isSameDay(endDate, endOfMonth(endDate))) { + if (isAria) { + return formatRange( + monthFormatter(), + translations, + startDate, + endDate, + timeZone, + ); + } + + return monthFormatter().formatRange( + startDate.toDate(timeZone), + endDate.toDate(timeZone), + ); + } + } + + if (isAria) { + return formatRange( + dateFormatter(), + translations, + startDate, + endDate, + timeZone, + ); + } + + return dateFormatter().formatRange( + startDate.toDate(timeZone), + endDate.toDate(timeZone), + ); +} + + +export function getNextPage( + focusedDate: DateValue, + startDate: DateValue, + visibleDuration: DateDuration, + locale: string, + min?: DateValue, + max?: DateValue, +) { + const adjust = getAdjustedDateFn(visibleDuration, locale, min, max); + const start = startDate.add(visibleDuration); + + return adjust({ + focusedDate: focusedDate.add(visibleDuration), + startDate: alignStart( + constrainStart(focusedDate, start, visibleDuration, locale, min, max), + visibleDuration, + locale, + ), + }); +} + +export function getPreviousPage( + focusedDate: DateValue, + startDate: DateValue, + visibleDuration: DateDuration, + locale: string, + min?: DateValue, + max?: DateValue, +) { + const adjust = getAdjustedDateFn(visibleDuration, locale, min, max); + const start = startDate.subtract(visibleDuration); + + return adjust({ + focusedDate: focusedDate.subtract(visibleDuration), + startDate: alignStart( + constrainStart(focusedDate, start, visibleDuration, locale, min, max), + visibleDuration, + locale, + ), + }); +} + +export function getNextRow( + focusedDate: DateValue, + startDate: DateValue, + visibleDuration: DateDuration, + locale: string, + min?: DateValue, + max?: DateValue, +) { + const adjust = getAdjustedDateFn(visibleDuration, locale, min, max); + + if (visibleDuration.days) { + return getNextPage( + focusedDate, + startDate, + visibleDuration, + locale, + min, + max, + ); + } + + if ( + visibleDuration.weeks || + visibleDuration.months || + visibleDuration.years + ) { + return adjust({ + focusedDate: focusedDate.add({ weeks: 1 }), + startDate, + }); + } +} + +export function getPreviousRow( + focusedDate: DateValue, + startDate: DateValue, + visibleDuration: DateDuration, + locale: string, + min?: DateValue, + max?: DateValue, +) { + const adjust = getAdjustedDateFn(visibleDuration, locale, min, max); + + if (visibleDuration.days) { + return getPreviousPage( + focusedDate, + startDate, + visibleDuration, + locale, + min, + max, + ); + } + + if ( + visibleDuration.weeks || + visibleDuration.months || + visibleDuration.years + ) { + return adjust({ + focusedDate: focusedDate.subtract({ weeks: 1 }), + startDate, + }); + } +} + +export function getSectionStart( + focusedDate: DateValue, + startDate: DateValue, + visibleDuration: DateDuration, + locale: string, + min?: DateValue, + max?: DateValue, +) { + const adjust = getAdjustedDateFn(visibleDuration, locale, min, max); + + if (visibleDuration.days) { + return adjust({ + focusedDate: startDate, + startDate, + }); + } + + if (visibleDuration.weeks) { + return adjust({ + focusedDate: startOfWeek(focusedDate, locale), + startDate, + }); + } + + if (visibleDuration.months || visibleDuration.years) { + return adjust({ + focusedDate: startOfMonth(focusedDate), + startDate, + }); + } +} + +export function getSectionEnd( + focusedDate: DateValue, + startDate: DateValue, + visibleDuration: DateDuration, + locale: string, + min?: DateValue, + max?: DateValue, +) { + const adjust = getAdjustedDateFn(visibleDuration, locale, min, max); + const endDate = getEndDate(startDate, visibleDuration); + + if (visibleDuration.days) { + return adjust({ + focusedDate: endDate, + startDate, + }); + } + + if (visibleDuration.weeks) { + return adjust({ + //@ts-expect-error - endOfWeek is loosely typed + focusedDate: endOfWeek(focusedDate, locale), + startDate, + }); + } + + if (visibleDuration.months || visibleDuration.years) { + return adjust({ + focusedDate: endOfMonth(focusedDate), + startDate, + }); + } +} + +export function getNextSection( + focusedDate: DateValue, + startDate: DateValue, + larger: boolean, + visibleDuration: DateDuration, + locale: string, + min?: DateValue, + max?: DateValue, +) { + const adjust = getAdjustedDateFn(visibleDuration, locale, min, max); + + if (!larger && !visibleDuration.days) { + return adjust({ + focusedDate: focusedDate.add(getUnitDuration(visibleDuration)), + startDate, + }); + } + + if (visibleDuration.days) { + return getNextPage( + focusedDate, + startDate, + visibleDuration, + locale, + min, + max, + ); + } + + if (visibleDuration.weeks) { + return adjust({ + focusedDate: focusedDate.add({ months: 1 }), + startDate, + }); + } + + if (visibleDuration.months || visibleDuration.years) { + return adjust({ + focusedDate: focusedDate.add({ years: 1 }), + startDate, + }); + } +} + +export function getPreviousSection( + focusedDate: DateValue, + startDate: DateValue, + larger: boolean, + visibleDuration: DateDuration, + locale: string, + min?: DateValue, + max?: DateValue, +) { + const adjust = getAdjustedDateFn(visibleDuration, locale, min, max); + + if (!larger && !visibleDuration.days) { + return adjust({ + focusedDate: focusedDate.subtract(getUnitDuration(visibleDuration)), + startDate, + }); + } + + if (visibleDuration.days) { + return getPreviousPage( + focusedDate, + startDate, + visibleDuration, + locale, + min, + max, + ); + } + + if (visibleDuration.weeks) { + return adjust({ + focusedDate: focusedDate.subtract({ months: 1 }), + startDate, + }); + } + + if (visibleDuration.months || visibleDuration.years) { + return adjust({ + focusedDate: focusedDate.subtract({ years: 1 }), + startDate, + }); + } +} + + +type CalendarValue = DateValue | DateValue[] | RangeValue; + +export function asCalendarValue( + value: CalendarValue | null | undefined, +): T | null | undefined { + return value as T | null | undefined; +} + +export const asSingleValue = (v: CalendarValue | null | undefined) => + asCalendarValue(v); + +export const asArrayValue = (v: CalendarValue | null | undefined) => + asCalendarValue(v); + +export const asRangeValue = (v: CalendarValue | null | undefined) => + asCalendarValue>(v); + + +export function sortDates(values: DateValue[]) { + return values.sort((a, b) => a.compare(b)); +} + +export function makeCalendarDateRange( + start?: DateValue, + end?: DateValue, +): RangeValue | undefined { + if (!start || !end) { + return undefined; + } + + if (end.compare(start) < 0) { + // biome-ignore lint/style/noParameterAssign: flip parameters + [start, end] = [end, start]; + } + + return { start: toCalendarDate(start), end: toCalendarDate(end) }; +} diff --git a/packages/core/src/checkbox/checkbox-control.tsx b/packages/core/src/checkbox/checkbox-control.tsx index 48331d66..15386c92 100644 --- a/packages/core/src/checkbox/checkbox-control.tsx +++ b/packages/core/src/checkbox/checkbox-control.tsx @@ -1,5 +1,6 @@ -import { EventKey, callHandler, mergeDefaultProps } from "@kobalte/utils"; -import { type JSX, type ValidComponent, splitProps } from "solid-js"; +import { callHandler, EventKey, mergeDefaultProps } from "@kobalte/utils"; +import type { JSX, ValidComponent } from "@solidjs/web"; +import { omit } from "solid-js"; import { type FormControlDataSet, @@ -47,17 +48,17 @@ export function CheckboxControl( props as CheckboxControlProps, ); - const [local, others] = splitProps(mergedProps, ["onClick", "onKeyDown"]); + const others = omit(mergedProps, "onClick", "onKeyDown"); const onClick: JSX.EventHandlerUnion = (e) => { - callHandler(e, local.onClick); + callHandler(e, mergedProps.onClick); context.toggle(); context.inputRef()?.focus({ preventScroll: true }); }; const onKeyDown: JSX.EventHandlerUnion = (e) => { - callHandler(e, local.onKeyDown); + callHandler(e, mergedProps.onKeyDown); if (e.key === EventKey.Space) { context.toggle(); diff --git a/packages/core/src/checkbox/checkbox-description.tsx b/packages/core/src/checkbox/checkbox-description.tsx index 185f05d0..967df1e1 100644 --- a/packages/core/src/checkbox/checkbox-description.tsx +++ b/packages/core/src/checkbox/checkbox-description.tsx @@ -1,19 +1,19 @@ -import type { Component, ValidComponent } from "solid-js"; +import type { ValidComponent } from "@solidjs/web"; +import type { Component } from "solid-js"; import { FormControlDescription, type FormControlDescriptionCommonProps, type FormControlDescriptionProps, type FormControlDescriptionRenderProps, } from "../form-control"; -import type { ElementOf, PolymorphicProps } from "../polymorphic"; +import type { PolymorphicProps } from "../polymorphic"; import { type CheckboxDataSet, useCheckboxContext } from "./checkbox-context"; export interface CheckboxDescriptionOptions extends FormControlDescriptionProps {} -export interface CheckboxDescriptionCommonProps< - T extends HTMLElement = HTMLElement, -> extends FormControlDescriptionCommonProps {} +export interface CheckboxDescriptionCommonProps + extends FormControlDescriptionCommonProps {} export interface CheckboxDescriptionRenderProps extends CheckboxDescriptionCommonProps, @@ -22,8 +22,7 @@ export interface CheckboxDescriptionRenderProps export type CheckboxDescriptionProps< T extends ValidComponent | HTMLElement = HTMLElement, -> = CheckboxDescriptionOptions & - Partial>>; +> = CheckboxDescriptionOptions & Partial; /** * The description that gives the user more information on the checkbox. diff --git a/packages/core/src/checkbox/checkbox-error-message.tsx b/packages/core/src/checkbox/checkbox-error-message.tsx index a96dc1ca..b3be46cb 100644 --- a/packages/core/src/checkbox/checkbox-error-message.tsx +++ b/packages/core/src/checkbox/checkbox-error-message.tsx @@ -1,4 +1,5 @@ -import type { Component, ValidComponent } from "solid-js"; +import type { ValidComponent } from "@solidjs/web"; +import type { Component } from "solid-js"; import { FormControlErrorMessage, type FormControlErrorMessageCommonProps, diff --git a/packages/core/src/checkbox/checkbox-indicator.tsx b/packages/core/src/checkbox/checkbox-indicator.tsx index 6b15e561..6982c5d3 100644 --- a/packages/core/src/checkbox/checkbox-indicator.tsx +++ b/packages/core/src/checkbox/checkbox-indicator.tsx @@ -1,13 +1,7 @@ import { mergeDefaultProps, mergeRefs } from "@kobalte/utils"; -import { - Show, - type ValidComponent, - createEffect, - createSignal, - splitProps, -} from "solid-js"; - -import createPresence from "solid-presence"; +import { createPresence } from "@solid-primitives/presence"; +import type { ValidComponent } from "@solidjs/web"; +import { createSignal, omit, Show } from "solid-js"; import { type FormControlDataSet, useFormControlContext, @@ -63,19 +57,22 @@ export function CheckboxIndicator( props as CheckboxIndicatorProps, ); - const [local, others] = splitProps(mergedProps, ["ref", "forceMount"]); + const others = omit(mergedProps, "ref", "forceMount"); - const { present } = createPresence({ - show: () => - local.forceMount || context.indeterminate() || context.checked(), - element: () => ref() ?? null, - }); + const { isMounted: present } = createPresence( + () => + mergedProps.forceMount || + context.indeterminate() || + context.checked() || + undefined, + { transitionDuration: 0 }, + ); return ( as="div" - ref={mergeRefs(setRef, local.ref)} + ref={mergeRefs(setRef, mergedProps.ref)} {...formControlContext.dataset()} {...context.dataset()} {...others} diff --git a/packages/core/src/checkbox/checkbox-input.tsx b/packages/core/src/checkbox/checkbox-input.tsx index c2290905..72a77084 100644 --- a/packages/core/src/checkbox/checkbox-input.tsx +++ b/packages/core/src/checkbox/checkbox-input.tsx @@ -14,19 +14,13 @@ import { visuallyHiddenStyles, } from "@kobalte/utils"; import { combineStyle } from "@solid-primitives/props"; -import { - type JSX, - type ValidComponent, - createEffect, - createSignal, - on, - splitProps, -} from "solid-js"; +import type { JSX, ValidComponent } from "@solidjs/web"; +import { createEffect, createSignal, omit } from "solid-js"; import { + createFormControlField, FORM_CONTROL_FIELD_PROP_NAMES, type FormControlDataSet, - createFormControlField, useFormControlContext, } from "../form-control"; import { @@ -63,10 +57,10 @@ export interface CheckboxInputRenderProps required: boolean | undefined; disabled: boolean | undefined; readonly: boolean | undefined; - "aria-invalid": boolean | undefined; - "aria-required": boolean | undefined; - "aria-disabled": boolean | undefined; - "aria-readonly": boolean | undefined; + "aria-invalid": "true" | undefined; + "aria-required": "true" | undefined; + "aria-disabled": "true" | undefined; + "aria-readonly": "true" | undefined; } export type CheckboxInputProps< @@ -79,7 +73,9 @@ export type CheckboxInputProps< export function CheckboxInput( props: PolymorphicProps>, ) { - let ref: HTMLInputElement | undefined; + const [ref, setRef] = createSignal(undefined, { + ownedWrite: true, + }); const formControlContext = useFormControlContext(); const context = useCheckboxContext(); @@ -91,10 +87,25 @@ export function CheckboxInput( props as CheckboxInputProps, ); - const [local, formControlFieldProps, others] = splitProps( + const formControlFieldProps = omit( + mergedProps, + "ref", + "style", + "onChange", + "onFocus", + "onBlur", + ); + const others = omit( mergedProps, - ["ref", "style", "onChange", "onFocus", "onBlur"], - FORM_CONTROL_FIELD_PROP_NAMES, + "ref", + "style", + "onChange", + "onFocus", + "onBlur", + "id", + "aria-label", + "aria-labelledby", + "aria-describedby", ); const { fieldProps } = createFormControlField(formControlFieldProps); @@ -102,7 +113,7 @@ export function CheckboxInput( const [isInternalChangeEvent, setIsInternalChangeEvent] = createSignal(false); const onChange: JSX.EventHandlerUnion = (e) => { - callHandler(e, local.onChange); + callHandler(e, mergedProps.onChange); e.stopPropagation(); @@ -124,32 +135,28 @@ export function CheckboxInput( }; const onFocus: JSX.EventHandlerUnion = (e) => { - callHandler(e, local.onFocus); + callHandler(e, mergedProps.onFocus); context.setIsFocused(true); }; const onBlur: JSX.EventHandlerUnion = (e) => { - callHandler(e, local.onBlur); + callHandler(e, mergedProps.onBlur); context.setIsFocused(false); }; createEffect( - on( - [() => context.checked(), () => context.value()], - () => { - setIsInternalChangeEvent(true); - - ref?.dispatchEvent( - new Event("input", { bubbles: true, cancelable: true }), - ); - ref?.dispatchEvent( - new Event("change", { bubbles: true, cancelable: true }), - ); - }, - { - defer: true, - }, - ), + () => [context.checked(), context.value()], + () => { + setIsInternalChangeEvent(true); + + ref()?.dispatchEvent( + new Event("input", { bubbles: true, cancelable: true }), + ); + ref()?.dispatchEvent( + new Event("change", { bubbles: true, cancelable: true }), + ); + }, + { defer: true }, ); // indeterminate is a property, but it can only be set via javascript @@ -158,14 +165,12 @@ export function CheckboxInput( // Clicking on the input will change its internal `indeterminate` state. // To prevent this, we need to force the input `indeterminate` state to be in sync with our. createEffect( - on( - [() => ref, () => context.indeterminate(), () => context.checked()], - ([ref, indeterminate]) => { - if (ref) { - ref.indeterminate = indeterminate; - } - }, - ), + () => [ref(), context.indeterminate(), context.checked()] as const, + ([elRef, indeterminate]) => { + if (elRef) { + elRef.indeterminate = indeterminate; + } + }, ); return ( @@ -173,8 +178,8 @@ export function CheckboxInput( as="input" ref={mergeRefs((el) => { context.setInputRef(el); - ref = el; - }, local.ref)} + setRef(el); + }, mergedProps.ref)} type="checkbox" id={fieldProps.id()} name={formControlContext.name()} @@ -183,16 +188,16 @@ export function CheckboxInput( required={formControlContext.isRequired()} disabled={formControlContext.isDisabled()} readonly={formControlContext.isReadOnly()} - style={combineStyle(visuallyHiddenStyles, local.style)} + style={combineStyle(visuallyHiddenStyles, mergedProps.style)} aria-label={fieldProps.ariaLabel()} aria-labelledby={fieldProps.ariaLabelledBy()} aria-describedby={fieldProps.ariaDescribedBy()} aria-invalid={ - formControlContext.validationState() === "invalid" || undefined + formControlContext.validationState() === "invalid" ? "true" : undefined } - aria-required={formControlContext.isRequired()} - aria-disabled={formControlContext.isDisabled()} - aria-readonly={formControlContext.isReadOnly()} + aria-required={formControlContext.isRequired() ? "true" : undefined} + aria-disabled={formControlContext.isDisabled() ? "true" : undefined} + aria-readonly={formControlContext.isReadOnly() ? "true" : undefined} onChange={onChange} onFocus={onFocus} onBlur={onBlur} diff --git a/packages/core/src/checkbox/checkbox-label.tsx b/packages/core/src/checkbox/checkbox-label.tsx index cb30749d..10818e2a 100644 --- a/packages/core/src/checkbox/checkbox-label.tsx +++ b/packages/core/src/checkbox/checkbox-label.tsx @@ -1,4 +1,5 @@ -import type { Component, ValidComponent } from "solid-js"; +import type { ValidComponent } from "@solidjs/web"; +import type { Component } from "solid-js"; import { FormControlLabel, type FormControlLabelCommonProps, diff --git a/packages/core/src/checkbox/checkbox-root.tsx b/packages/core/src/checkbox/checkbox-root.tsx index eeb8d17b..3ecbb09f 100644 --- a/packages/core/src/checkbox/checkbox-root.tsx +++ b/packages/core/src/checkbox/checkbox-root.tsx @@ -7,38 +7,37 @@ */ import { - OverrideComponentProps, - type ValidationState, access, callHandler, createGenerateId, isFunction, mergeDefaultProps, mergeRefs, + OverrideComponentProps, + type ValidationState, } from "@kobalte/utils"; +import { createFormResetListener } from "@solid-primitives/form"; +import type { JSX, ValidComponent } from "@solidjs/web"; import { type Accessor, - type JSX, - type ValidComponent, children, createMemo, createSignal, createUniqueId, - splitProps, + omit, } from "solid-js"; - import { + createFormControl, FORM_CONTROL_PROP_NAMES, FormControlContext, type FormControlDataSet, - createFormControl, } from "../form-control"; import { type ElementOf, Polymorphic, type PolymorphicProps, } from "../polymorphic"; -import { createFormResetListener, createToggleState } from "../primitives"; +import { createToggleState } from "../primitives"; import { CheckboxContext, type CheckboxContextValue, @@ -140,43 +139,60 @@ export function CheckboxRoot( props as CheckboxRootProps, ); - const [local, formControlProps, others] = splitProps( + const formControlProps = omit( mergedProps, - [ - "ref", - "children", - "value", - "checked", - "defaultChecked", - "indeterminate", - "onChange", - "onPointerDown", - ], - FORM_CONTROL_PROP_NAMES, + "ref", + "children", + "value", + "checked", + "defaultChecked", + "indeterminate", + "onChange", + "onPointerDown", + ); + const others = omit( + mergedProps, + "ref", + "children", + "value", + "checked", + "defaultChecked", + "indeterminate", + "onChange", + "onPointerDown", + "id", + "name", + "validationState", + "required", + "disabled", + "readOnly", ); - const [inputRef, setInputRef] = createSignal(); + const [inputRef, setInputRef] = createSignal( + undefined, + { ownedWrite: true }, + ); const [isFocused, setIsFocused] = createSignal(false); const { formControlContext } = createFormControl(formControlProps); const state = createToggleState({ - isSelected: () => local.checked, - defaultIsSelected: () => local.defaultChecked, - onSelectedChange: (selected) => local.onChange?.(selected), + isSelected: () => mergedProps.checked, + defaultIsSelected: () => mergedProps.defaultChecked, + onSelectedChange: (selected) => mergedProps.onChange?.(selected), isDisabled: () => formControlContext.isDisabled(), isReadOnly: () => formControlContext.isReadOnly(), }); createFormResetListener( () => ref, - () => state.setIsSelected(local.defaultChecked ?? false), + () => state.setIsSelected(mergedProps.defaultChecked ?? false), ); const onPointerDown: JSX.EventHandlerUnion = ( e, ) => { - callHandler(e, local.onPointerDown); + callHandler(e, mergedProps.onPointerDown); // For consistency with native, prevent the input blurs on pointer down. if (isFocused()) { @@ -186,14 +202,14 @@ export function CheckboxRoot( const dataset: Accessor = createMemo(() => ({ "data-checked": state.isSelected() ? "" : undefined, - "data-indeterminate": local.indeterminate ? "" : undefined, + "data-indeterminate": mergedProps.indeterminate ? "" : undefined, })); const context: CheckboxContextValue = { - value: () => local.value!, + value: () => mergedProps.value!, dataset, checked: () => state.isSelected(), - indeterminate: () => local.indeterminate ?? false, + indeterminate: () => mergedProps.indeterminate ?? false, inputRef, generateId: createGenerateId(() => access(formControlProps.id)!), toggle: () => state.toggle(), @@ -203,11 +219,11 @@ export function CheckboxRoot( }; return ( - - + + as="div" - ref={mergeRefs((el) => (ref = el), local.ref)} + ref={mergeRefs((el) => (ref = el), mergedProps.ref)} role="group" id={access(formControlProps.id)} onPointerDown={onPointerDown} @@ -216,11 +232,11 @@ export function CheckboxRoot( {...others} > - {local.children} + {mergedProps.children} - - + + ); } diff --git a/packages/core/src/checkbox/index.tsx b/packages/core/src/checkbox/index.tsx index 8fc17ebd..ac7f7ee1 100644 --- a/packages/core/src/checkbox/index.tsx +++ b/packages/core/src/checkbox/index.tsx @@ -49,30 +49,30 @@ import { } from "./checkbox-root"; export type { - CheckboxControlOptions, CheckboxControlCommonProps, - CheckboxControlRenderProps, + CheckboxControlOptions, CheckboxControlProps, - CheckboxDescriptionOptions, + CheckboxControlRenderProps, CheckboxDescriptionCommonProps, - CheckboxDescriptionRenderProps, + CheckboxDescriptionOptions, CheckboxDescriptionProps, - CheckboxErrorMessageOptions, + CheckboxDescriptionRenderProps, CheckboxErrorMessageCommonProps, - CheckboxErrorMessageRenderProps, + CheckboxErrorMessageOptions, CheckboxErrorMessageProps, - CheckboxIndicatorOptions, + CheckboxErrorMessageRenderProps, CheckboxIndicatorCommonProps, - CheckboxIndicatorRenderProps, + CheckboxIndicatorOptions, CheckboxIndicatorProps, - CheckboxInputOptions, + CheckboxIndicatorRenderProps, CheckboxInputCommonProps, - CheckboxInputRenderProps, + CheckboxInputOptions, CheckboxInputProps, - CheckboxLabelOptions, + CheckboxInputRenderProps, CheckboxLabelCommonProps, - CheckboxLabelRenderProps, + CheckboxLabelOptions, CheckboxLabelProps, + CheckboxLabelRenderProps, CheckboxRootOptions, CheckboxRootProps, }; @@ -91,6 +91,6 @@ export const Checkbox = Object.assign(Root, { * API will most probably change */ export { - useCheckboxContext, type CheckboxContextValue, + useCheckboxContext, } from "./checkbox-context"; diff --git a/packages/core/src/checkbox/stories/checkbox.stories.tsx b/packages/core/src/checkbox/stories/checkbox.stories.tsx new file mode 100644 index 00000000..071f9352 --- /dev/null +++ b/packages/core/src/checkbox/stories/checkbox.stories.tsx @@ -0,0 +1,361 @@ +import { createSignal } from "solid-js"; +import preview from "../../../../../.storybook/preview.js"; +import { + Control, + Description, + ErrorMessage, + Indicator, + Input, + Label, + Root, +} from "../index"; + +const meta = preview.meta({ + title: "Components/Checkbox", + tags: ["autodocs"], +}); + +export default meta; + +const rootClass = "flex items-center gap-3 font-sans"; + +const controlClass = + "relative flex h-5 w-5 shrink-0 cursor-pointer items-center justify-center rounded border-2 border-slate-300 bg-white transition-colors duration-150 focus-within:outline-none focus-within:ring-2 focus-within:ring-blue-500 focus-within:ring-offset-2 data-[checked]:border-blue-500 data-[checked]:bg-blue-500 data-[indeterminate]:border-blue-500 data-[indeterminate]:bg-blue-500 data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50"; + +const labelClass = + "text-sm font-medium text-slate-700 select-none cursor-pointer"; + +const descriptionClass = "text-xs text-slate-500 mt-0.5"; +const errorClass = "text-xs text-red-600 mt-0.5"; + +function CheckIcon() { + return ( + + ); +} + +function DashIcon() { + return ( + + ); +} + +/** A minimal checkbox with a label. */ +export const Default = meta.story({ + name: "Default", + render: () => ( + + + + + + + + + + ), +}); + +/** `defaultChecked` pre-checks the box without controlling state. */ +export const DefaultChecked = meta.story({ + name: "Default Checked", + render: () => ( + + + + + + + + + + ), +}); + +/** `indeterminate` renders the dash state regardless of checked. */ +export const Indeterminate = meta.story({ + name: "Indeterminate", + render: () => ( +
+ + + + + + + + + + + + + + + + + + +
+ ), +}); + +/** A `Description` adds context below the label. */ +export const WithDescription = meta.story({ + name: "With Description", + render: () => ( + + + + + + + +
+ + + Receive emails about new products and features. + +
+
+ ), +}); + +/** `disabled` prevents interaction and dims the control. */ +export const Disabled = meta.story({ + name: "Disabled", + render: () => ( +
+ + + + + + + + + + + + + + + + + + +
+ ), +}); + +/** `readOnly` shows the current state without allowing changes. */ +export const ReadOnly = meta.story({ + name: "Read Only", + render: () => ( + + + + + + + + + + ), +}); + +function ControlledDemo() { + const [checked, setChecked] = createSignal(false); + return ( +
+ + + + + + + + + +

+ State: {checked() ? "checked" : "unchecked"} +

+ +
+ ); +} + +/** `checked` + `onChange` give full external control. */ +export const Controlled = meta.story({ + name: "Controlled", + render: () => , +}); + +function ValidationDemo() { + const [checked, setChecked] = createSignal(false); + return ( + +
+ + + + + + +
+ + + You must accept to continue. + +
+
+ + You must accept the terms and conditions. + +
+ ); +} + +/** `validationState="invalid"` reveals the `ErrorMessage` and applies `data-invalid` to parts. */ +export const WithValidation = meta.story({ + name: "With Validation", + render: () => , +}); + +function RenderPropDemo() { + return ( + + {(state) => ( + <> + + + {state.indeterminate() ? : } + + + + + + )} + + ); +} + +/** The `children` render prop exposes internal state to derive UI from. */ +export const RenderProp = meta.story({ + name: "Render Prop", + render: () => , +}); + +function SelectAllDemo() { + const items = ["Comments", "Mentions", "Follows", "Reminders"] as const; + const [checked, setChecked] = createSignal>( + new Set(["Comments", "Mentions"]), + ); + + const allChecked = () => checked().size === items.length; + const someChecked = () => checked().size > 0 && !allChecked(); + + const toggleAll = (on: boolean) => { + setChecked(on ? new Set(items) : new Set()); + }; + + const toggle = (item: string) => { + setChecked((prev) => { + const next = new Set(prev); + next.has(item) ? next.delete(item) : next.add(item); + return next; + }); + }; + + return ( +
+ + + {someChecked() ? : } + + + + +
+ {items.map((item) => ( + toggle(item)} + > + + + + + + + + + ))} +
+
+ ); +} + +/** A parent "select all" checkbox with indeterminate state drives a group of children. */ +export const SelectAll = meta.story({ + name: "Select All", + render: () => , +}); diff --git a/packages/core/src/collapsible/collapsible-content.tsx b/packages/core/src/collapsible/collapsible-content.tsx index d74cffc3..b0153e65 100644 --- a/packages/core/src/collapsible/collapsible-content.tsx +++ b/packages/core/src/collapsible/collapsible-content.tsx @@ -7,20 +7,10 @@ */ import { mergeDefaultProps, mergeRefs } from "@kobalte/utils"; -import { - type JSX, - Show, - type ValidComponent, - createEffect, - createSignal, - on, - onCleanup, - onMount, - splitProps, -} from "solid-js"; - +import { createPresence } from "@solid-primitives/presence"; import { combineStyle } from "@solid-primitives/props"; -import createPresence from "solid-presence"; +import type { JSX, ValidComponent } from "@solidjs/web"; +import { createEffect, createSignal, omit, onSettled, Show } from "solid-js"; import { type ElementOf, Polymorphic, @@ -65,12 +55,12 @@ export function CollapsibleContent( props as CollapsibleContentProps, ); - const [local, others] = splitProps(mergedProps, ["ref", "id", "style"]); + const others = omit(mergedProps, "ref", "id", "style"); - const { present } = createPresence({ - show: context.shouldMount, - element: () => ref() ?? null, - }); + const { isMounted: present } = createPresence( + () => context.shouldMount() || undefined, + { transitionDuration: 0 }, + ); const [height, setHeight] = createSignal(0); const [width, setWidth] = createSignal(0); @@ -80,68 +70,66 @@ export function CollapsibleContent( const isOpen = () => context.isOpen() || present(); let isMountAnimationPrevented = isOpen(); - onMount(() => { + onSettled(() => { const raf = requestAnimationFrame(() => { isMountAnimationPrevented = false; }); - onCleanup(() => { + return () => { cancelAnimationFrame(raf); - }); + }; }); createEffect( - on( - /** - * depends on `present` because it will be `false` on - * animation end (so when close finishes). This allows us to - * retrieve the dimensions *before* closing. - */ - present, - () => { - if (!ref()) { - return; - } - - // block any animations/transitions so the element renders at its full dimensions - ref()!.style.transitionDuration = "0s"; - ref()!.style.animationName = "none"; - - // get width and height from full dimensions - const rect = ref()!.getBoundingClientRect(); - setHeight(rect.height); - setWidth(rect.width); - - // kick off any animations/transitions that were originally set up if it isn't the initial mount - if (!isMountAnimationPrevented) { - ref()!.style.transitionDuration = ""; - ref()!.style.animationName = ""; - } - }, - ), + /** + * depends on `present` because it will be `false` on + * animation end (so when close finishes). This allows us to + * retrieve the dimensions *before* closing. + */ + () => present(), + () => { + if (!ref()) { + return; + } + + // block any animations/transitions so the element renders at its full dimensions + ref()!.style.transitionDuration = "0s"; + ref()!.style.animationName = "none"; + + // get width and height from full dimensions + const rect = ref()!.getBoundingClientRect(); + setHeight(rect.height); + setWidth(rect.width); + + // kick off any animations/transitions that were originally set up if it isn't the initial mount + if (!isMountAnimationPrevented) { + ref()!.style.transitionDuration = ""; + ref()!.style.animationName = ""; + } + }, ); createEffect( - on( - context.isOpen, - (open) => { - if (!open && ref()) { - ref()!.style.transitionDuration = ""; - ref()!.style.animationName = ""; - } - }, - { defer: true }, - ), + () => context.isOpen(), + (open) => { + if (!open && ref()) { + ref()!.style.transitionDuration = ""; + ref()!.style.animationName = ""; + } + }, ); - createEffect(() => onCleanup(context.registerContentId(local.id))); + createEffect( + () => mergedProps.id, + (id) => context.registerContentId(id), + ); return ( as="div" - ref={mergeRefs(setRef, local.ref)} - id={local.id} + ref={mergeRefs(setRef, mergedProps.ref)} + id={mergedProps.id} style={combineStyle( { "--kb-collapsible-content-height": height() @@ -151,7 +139,7 @@ export function CollapsibleContent( ? `${width()}px` : undefined, }, - local.style, + mergedProps.style, )} {...context.dataset()} {...others} diff --git a/packages/core/src/collapsible/collapsible-root.tsx b/packages/core/src/collapsible/collapsible-root.tsx index 95848d97..f94a1576 100644 --- a/packages/core/src/collapsible/collapsible-root.tsx +++ b/packages/core/src/collapsible/collapsible-root.tsx @@ -6,18 +6,14 @@ * https://github.com/radix-ui/primitives/blob/21a7c97dc8efa79fecca36428eec49f187294085/packages/react/collapsible/src/Collapsible.tsx */ -import { - OverrideComponentProps, - createGenerateId, - mergeDefaultProps, -} from "@kobalte/utils"; +import { createGenerateId, mergeDefaultProps } from "@kobalte/utils"; +import type { ValidComponent } from "@solidjs/web"; import { type Accessor, - type ValidComponent, createMemo, createSignal, createUniqueId, - splitProps, + omit, } from "solid-js"; import { @@ -82,33 +78,37 @@ export function CollapsibleRoot( props as CollapsibleRootProps, ); - const [local, others] = splitProps(mergedProps, [ + const others = omit( + mergedProps, "open", "defaultOpen", "onOpenChange", "disabled", "forceMount", - ]); + ); - const [contentId, setContentId] = createSignal(); + const [contentId, setContentId] = createSignal( + undefined, + { ownedWrite: true }, + ); const disclosureState = createDisclosureState({ - open: () => local.open, - defaultOpen: () => local.defaultOpen, - onOpenChange: (isOpen) => local.onOpenChange?.(isOpen), + open: () => mergedProps.open, + defaultOpen: () => mergedProps.defaultOpen, + onOpenChange: (isOpen) => mergedProps.onOpenChange?.(isOpen), }); const dataset: Accessor = createMemo(() => ({ "data-expanded": disclosureState.isOpen() ? "" : undefined, "data-closed": !disclosureState.isOpen() ? "" : undefined, - "data-disabled": local.disabled ? "" : undefined, + "data-disabled": mergedProps.disabled ? "" : undefined, })); const context: CollapsibleContextValue = { dataset, isOpen: disclosureState.isOpen, - disabled: () => local.disabled ?? false, - shouldMount: () => local.forceMount || disclosureState.isOpen(), + disabled: () => mergedProps.disabled ?? false, + shouldMount: () => mergedProps.forceMount || disclosureState.isOpen(), contentId, toggle: disclosureState.toggle, generateId: createGenerateId(() => others.id!), @@ -116,12 +116,12 @@ export function CollapsibleRoot( }; return ( - + as="div" {...dataset()} {...others} /> - + ); } diff --git a/packages/core/src/collapsible/collapsible-trigger.tsx b/packages/core/src/collapsible/collapsible-trigger.tsx index 918e066d..2f85b89f 100644 --- a/packages/core/src/collapsible/collapsible-trigger.tsx +++ b/packages/core/src/collapsible/collapsible-trigger.tsx @@ -7,12 +7,8 @@ */ import { callHandler } from "@kobalte/utils"; -import { - type Component, - type JSX, - type ValidComponent, - splitProps, -} from "solid-js"; +import type { JSX, ValidComponent } from "@solidjs/web"; +import { type Component, omit } from "solid-js"; import * as Button from "../button"; import type { ElementOf, PolymorphicProps } from "../polymorphic"; @@ -30,7 +26,7 @@ export interface CollapsibleTriggerCommonProps< export interface CollapsibleTriggerRenderProps extends CollapsibleTriggerCommonProps, Button.ButtonRootRenderProps { - "aria-expanded": boolean; + "aria-expanded": "true" | "false"; "aria-controls": string | undefined; } @@ -47,10 +43,10 @@ export function CollapsibleTrigger( ) { const context = useCollapsibleContext(); - const [local, others] = splitProps(props, ["onClick"]); + const others = omit(props, "onClick"); - const onClick: JSX.EventHandlerUnion = (e) => { - callHandler(e, local.onClick); + const onClick: JSX.EventHandlerUnion = (e) => { + callHandler(e, props.onClick as JSX.EventHandlerUnion); context.toggle(); }; @@ -60,7 +56,7 @@ export function CollapsibleTrigger( Omit > > - aria-expanded={context.isOpen()} + aria-expanded={context.isOpen() ? "true" : "false"} aria-controls={context.isOpen() ? context.contentId() : undefined} disabled={context.disabled()} onClick={onClick} diff --git a/packages/core/src/collapsible/index.tsx b/packages/core/src/collapsible/index.tsx index 2b329620..92391fd6 100644 --- a/packages/core/src/collapsible/index.tsx +++ b/packages/core/src/collapsible/index.tsx @@ -21,18 +21,18 @@ import { } from "./collapsible-trigger"; export type { - CollapsibleContentOptions, CollapsibleContentCommonProps, - CollapsibleContentRenderProps, + CollapsibleContentOptions, CollapsibleContentProps, - CollapsibleRootOptions, + CollapsibleContentRenderProps, CollapsibleRootCommonProps, - CollapsibleRootRenderProps, + CollapsibleRootOptions, CollapsibleRootProps, - CollapsibleTriggerOptions, + CollapsibleRootRenderProps, CollapsibleTriggerCommonProps, - CollapsibleTriggerRenderProps, + CollapsibleTriggerOptions, CollapsibleTriggerProps, + CollapsibleTriggerRenderProps, }; export { Content, Root, Trigger }; @@ -45,6 +45,6 @@ export const Collapsible = Object.assign(Root, { * API will most probably change */ export { - useCollapsibleContext, type CollapsibleContextValue, + useCollapsibleContext, } from "./collapsible-context"; diff --git a/packages/core/src/collapsible/stories/collapsible.stories.tsx b/packages/core/src/collapsible/stories/collapsible.stories.tsx new file mode 100644 index 00000000..ad33e474 --- /dev/null +++ b/packages/core/src/collapsible/stories/collapsible.stories.tsx @@ -0,0 +1,160 @@ +import { createSignal } from "solid-js"; +import preview from "../../../../../.storybook/preview.js"; +import { Content, Root, Trigger } from "../index"; + +const meta = preview.meta({ + title: "Components/Collapsible", + tags: ["autodocs"], +}); + +export default meta; + +function Chevron() { + return ( + + ); +} + +const rootClass = + "w-80 rounded-lg border border-slate-200 overflow-hidden font-sans"; + +const triggerClass = + "flex w-full items-center justify-between bg-white px-4 py-3.5 text-left text-sm font-medium text-slate-900 hover:bg-slate-50 transition-colors data-[expanded]:text-blue-600 data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50 cursor-pointer"; + +const contentClass = "overflow-hidden bg-slate-50"; + +const contentTextClass = "px-4 py-3 text-sm text-slate-600 leading-relaxed m-0"; + +/** Basic expand/collapse panel. */ +export const Default = meta.story({ + name: "Default", + render: () => ( + + + What is Kobalte? + + + +

+ Kobalte is a UI toolkit for building accessible web apps and design + systems with SolidJS. It provides a set of low-level UI components and + primitives which can be the foundation for your design system + implementation. +

+
+
+ ), +}); + +/** `defaultOpen` pre-opens the panel on mount without controlling state. */ +export const DefaultOpen = meta.story({ + name: "Default Open", + render: () => ( + + + Open by default + + + +

+ This panel was open on mount via the defaultOpen prop. It + is still uncontrolled — clicking the trigger toggles it normally. +

+
+
+ ), +}); + +/** `disabled` prevents the trigger from toggling. */ +export const Disabled = meta.story({ + name: "Disabled", + render: () => ( + + + Cannot be toggled + + + +

+ This content is not reachable when disabled. +

+
+
+ ), +}); + +/** + * Smooth expand/collapse using the CSS `grid-template-rows` trick. + * `forceMount` keeps content in the DOM so the exit animation plays before unmount. + * `data-[expanded]` / `data-[closed]` drive the transition. + */ +export const Animated = meta.story({ + name: "Animated", + render: () => ( + + + Animated collapsible + + + +
+

+ This content animates open and closed using a CSS{" "} + grid-template-rows transition. The{" "} + --kb-collapsible-content-height CSS variable is also + available for custom animations. +

+
+
+
+ ), +}); + +function ControlledDemo() { + const [open, setOpen] = createSignal(false); + return ( +
+ + + Controlled panel + + + +

+ State is controlled externally. The button below also toggles it. +

+
+
+ +
+ ); +} + +/** + * Pass `open` + `onOpenChange` for fully controlled state. + * The button and the Controls panel both drive the open state. + */ +export const Controlled = meta.story({ + name: "Controlled", + render: () => , +}); diff --git a/packages/core/src/color-area/color-area-background.tsx b/packages/core/src/color-area/color-area-background.tsx index 44306bf2..f152b6a5 100644 --- a/packages/core/src/color-area/color-area-background.tsx +++ b/packages/core/src/color-area/color-area-background.tsx @@ -1,14 +1,12 @@ import { callHandler, mergeRefs } from "@kobalte/utils"; import { combineStyle } from "@solid-primitives/props"; import { - type JSX, - type ValidComponent, - createMemo, - createSignal, - splitProps, -} from "solid-js"; -import type { Color, ColorChannel } from "../colors"; -import { parseColor } from "../colors"; + type Color, + type ColorChannel, + parseColor, +} from "@solid-primitives/utils/colors"; +import type { JSX, ValidComponent } from "@solidjs/web"; +import { createMemo, createSignal, omit } from "solid-js"; import { type FormControlDataSet, useFormControlContext, @@ -48,12 +46,13 @@ export function ColorAreaBackground( const context = useColorAreaContext(); const formControlContext = useFormControlContext(); - const [local, others] = splitProps(props, [ + const others = omit( + props, "style", "onPointerDown", "onPointerMove", "onPointerUp", - ]); + ); const { direction } = useLocale(); @@ -92,7 +91,12 @@ export function ColorAreaBackground( const onPointerDown: JSX.EventHandlerUnion = ( e, ) => { - callHandler(e, local.onPointerDown); + callHandler( + e, + props.onPointerDown as + | JSX.EventHandlerUnion + | undefined, + ); const target = e.target as HTMLElement; target.setPointerCapture(e.pointerId); @@ -106,7 +110,12 @@ export function ColorAreaBackground( const onPointerMove: JSX.EventHandlerUnion = ( e, ) => { - callHandler(e, local.onPointerMove); + callHandler( + e, + props.onPointerMove as + | JSX.EventHandlerUnion + | undefined, + ); const target = e.target as HTMLElement; @@ -120,7 +129,12 @@ export function ColorAreaBackground( }; const onPointerUp: JSX.EventHandlerUnion = (e) => { - callHandler(e, local.onPointerUp); + callHandler( + e, + props.onPointerUp as + | JSX.EventHandlerUnion + | undefined, + ); const target = e.target as HTMLElement; @@ -156,9 +170,9 @@ export function ColorAreaBackground( const bg = context.state .value() .getColorChannels() - .filter((c) => c !== context.state.channels().zChannel) + .filter((c: ColorChannel) => c !== context.state.channels().zChannel) .map( - (c) => + (c: ColorChannel) => `linear-gradient(to ${c === context.state.channels().xChannel ? end : "top"}, ${hslChannels[c as Exclude](value)})`, ) .reverse(); @@ -179,9 +193,9 @@ export function ColorAreaBackground( const bg = context.state .value() .getColorChannels() - .filter((c) => c !== context.state.channels().zChannel) + .filter((c: ColorChannel) => c !== context.state.channels().zChannel) .map( - (c) => + (c: ColorChannel) => `linear-gradient(to ${c === context.state.channels().xChannel ? end : "top"}, ${hsbChannels[c as Exclude](value)})`, ) .reverse(); @@ -206,7 +220,7 @@ export function ColorAreaBackground( "forced-color-adjust": "none", ...backgroundStyles(), }, - local.style, + props.style, )} onPointerDown={onPointerDown} onPointerMove={onPointerMove} diff --git a/packages/core/src/color-area/color-area-context.tsx b/packages/core/src/color-area/color-area-context.tsx index 7ea88cd6..8cea8704 100644 --- a/packages/core/src/color-area/color-area-context.tsx +++ b/packages/core/src/color-area/color-area-context.tsx @@ -1,5 +1,5 @@ +import type { Color } from "@solid-primitives/utils/colors"; import { type Accessor, createContext, useContext } from "solid-js"; -import type { Color } from "../colors/types"; import type { ColorAreaIntlTranslations } from "./color-area.intl"; import type { ColorAreaState } from "./create-color-area-state"; diff --git a/packages/core/src/color-area/color-area-hidden-input-base.tsx b/packages/core/src/color-area/color-area-hidden-input-base.tsx index 6fec4036..ba88c343 100644 --- a/packages/core/src/color-area/color-area-hidden-input-base.tsx +++ b/packages/core/src/color-area/color-area-hidden-input-base.tsx @@ -4,16 +4,12 @@ import { visuallyHiddenStyles, } from "@kobalte/utils"; import { combineStyle } from "@solid-primitives/props"; +import { COLOR_INTL_TRANSLATIONS } from "@solid-primitives/utils/colors"; +import type { ComponentProps, JSX } from "@solidjs/web"; +import { createMemo, omit } from "solid-js"; import { - type ComponentProps, - type JSX, - createMemo, - splitProps, -} from "solid-js"; -import { COLOR_INTL_TRANSLATIONS } from "../colors"; -import { - FORM_CONTROL_FIELD_PROP_NAMES, createFormControlField, + FORM_CONTROL_FIELD_PROP_NAMES, useFormControlContext, } from "../form-control"; import { useColorAreaContext } from "./color-area-context"; @@ -40,15 +36,27 @@ export function ColorAreaHiddenInputBase(props: ColorAreaHiddenInputBaseProps) { props, ); - const [local, formControlFieldProps, others] = splitProps( + const formControlFieldProps = omit( + mergedProps, + "style", + "orientation", + "onChange", + "onFocus", + "onBlur", + ); + const others = omit( mergedProps, - ["style", "orientation", "onChange", "onFocus", "onBlur"], - FORM_CONTROL_FIELD_PROP_NAMES, + "style", + "orientation", + "onChange", + "onFocus", + "onBlur", + ...FORM_CONTROL_FIELD_PROP_NAMES, ); - const { fieldProps } = createFormControlField(formControlFieldProps); + const { fieldProps } = createFormControlField(formControlFieldProps as any); - const isVertical = () => local.orientation === "vertical"; + const isVertical = () => mergedProps.orientation === "vertical"; const ariaLabel = () => { return [fieldProps.ariaLabel(), context.translations().colorPicker] @@ -56,8 +64,15 @@ export function ColorAreaHiddenInputBase(props: ColorAreaHiddenInputBaseProps) { .join(", "); }; - const onChange: JSX.EventHandlerUnion = (e) => { - callHandler(e, local.onChange); + const onChange: JSX.ChangeEventHandlerUnion = ( + e, + ) => { + callHandler( + e as Event & { currentTarget: HTMLInputElement; target: Element }, + mergedProps.onChange as + | JSX.EventHandlerUnion + | undefined, + ); const target = e.target as HTMLInputElement; isVertical() @@ -89,7 +104,7 @@ export function ColorAreaHiddenInputBase(props: ColorAreaHiddenInputBaseProps) { (isVertical() ? context.yName() : context.xName()) || formControlContext.name() } - tabIndex={context.state.isDisabled() ? undefined : -1} + tabindex={context.state.isDisabled() ? undefined : -1} min={isVertical() ? context.state.yMinValue() : context.state.xMinValue()} max={isVertical() ? context.state.yMaxValue() : context.state.xMaxValue()} step={isVertical() ? context.state.yStep() : context.state.xStep()} @@ -97,20 +112,20 @@ export function ColorAreaHiddenInputBase(props: ColorAreaHiddenInputBaseProps) { required={formControlContext.isRequired()} disabled={formControlContext.isDisabled()} readonly={formControlContext.isReadOnly()} - style={combineStyle({ ...visuallyHiddenStyles }, local.style)} + style={combineStyle({ ...visuallyHiddenStyles }, mergedProps.style)} aria-roledescription={context.translations().twoDimensionalSlider} aria-valuetext={valueText()} - aria-orientation={local.orientation} + aria-orientation={mergedProps.orientation} aria-label={ariaLabel()} aria-labelledby={fieldProps.ariaLabelledBy()} aria-describedby={fieldProps.ariaDescribedBy()} aria-invalid={ - formControlContext.validationState() === "invalid" || undefined + formControlContext.validationState() === "invalid" ? "true" : undefined } - aria-required={formControlContext.isRequired() || undefined} - aria-disabled={formControlContext.isDisabled() || undefined} - aria-readonly={formControlContext.isReadOnly() || undefined} - data-orientation={local.orientation} + aria-required={formControlContext.isRequired() ? "true" : undefined} + aria-disabled={formControlContext.isDisabled() ? "true" : undefined} + aria-readonly={formControlContext.isReadOnly() ? "true" : undefined} + data-orientation={mergedProps.orientation} onChange={onChange} {...formControlContext.dataset()} {...others} diff --git a/packages/core/src/color-area/color-area-hidden-input-x.tsx b/packages/core/src/color-area/color-area-hidden-input-x.tsx index 606adc6d..85ee45e5 100644 --- a/packages/core/src/color-area/color-area-hidden-input-x.tsx +++ b/packages/core/src/color-area/color-area-hidden-input-x.tsx @@ -1,7 +1,9 @@ -import type { ComponentProps } from "solid-js"; -import { ColorAreaHiddenInputBase } from "./color-area-hidden-input-base"; +import { + ColorAreaHiddenInputBase, + type ColorAreaHiddenInputBaseProps, +} from "./color-area-hidden-input-base"; -export type ColorAreaHiddenInputXProps = ComponentProps<"input">; +export type ColorAreaHiddenInputXProps = ColorAreaHiddenInputBaseProps; export function ColorAreaHiddenInputX(props: ColorAreaHiddenInputXProps) { return ; diff --git a/packages/core/src/color-area/color-area-hidden-input-y.tsx b/packages/core/src/color-area/color-area-hidden-input-y.tsx index cf4e14ff..bd7f88f5 100644 --- a/packages/core/src/color-area/color-area-hidden-input-y.tsx +++ b/packages/core/src/color-area/color-area-hidden-input-y.tsx @@ -1,7 +1,9 @@ -import type { ComponentProps } from "solid-js"; -import { ColorAreaHiddenInputBase } from "./color-area-hidden-input-base"; +import { + ColorAreaHiddenInputBase, + type ColorAreaHiddenInputBaseProps, +} from "./color-area-hidden-input-base"; -export type ColorAreaHiddenInputYProps = ComponentProps<"input">; +export type ColorAreaHiddenInputYProps = ColorAreaHiddenInputBaseProps; export function ColorAreaHiddenInputY(props: ColorAreaHiddenInputYProps) { return ; diff --git a/packages/core/src/color-area/color-area-root.tsx b/packages/core/src/color-area/color-area-root.tsx index a6615dcb..0af448c5 100644 --- a/packages/core/src/color-area/color-area-root.tsx +++ b/packages/core/src/color-area/color-area-root.tsx @@ -1,25 +1,25 @@ import { - type ValidationState, access, clamp, createGenerateId, mergeDefaultProps, mergeRefs, + type ValidationState, } from "@kobalte/utils"; +import { createFormResetListener } from "@solid-primitives/form"; import { - type ValidComponent, - createSignal, - createUniqueId, - splitProps, -} from "solid-js"; - -import { parseColor } from "../colors"; -import type { Color, ColorChannel, ColorSpace } from "../colors/types"; + type Color, + type ColorChannel, + type ColorSpace, + parseColor, +} from "@solid-primitives/utils/colors"; +import type { ValidComponent } from "@solidjs/web"; +import { createSignal, createUniqueId, omit } from "solid-js"; import { + createFormControl, FORM_CONTROL_PROP_NAMES, FormControlContext, type FormControlDataSet, - createFormControl, } from "../form-control"; import { useLocale } from "../i18n"; import { @@ -27,15 +27,14 @@ import { Polymorphic, type PolymorphicProps, } from "../polymorphic"; -import { createFormResetListener } from "../primitives"; -import { - ColorAreaContext, - type ColorAreaContextValue, -} from "./color-area-context"; import { COLOR_AREA_INTL_TRANSLATIONS, type ColorAreaIntlTranslations, } from "./color-area.intl"; +import { + ColorAreaContext, + type ColorAreaContextValue, +} from "./color-area-context"; import { createColorAreaState } from "./create-color-area-state"; export interface ColorAreaRootOptions { @@ -133,39 +132,37 @@ export function ColorAreaRoot( props as ColorAreaRootProps, ); - const [local, formControlProps, others] = splitProps( + const others = omit( mergedProps, - [ - "ref", - "value", - "defaultValue", - "colorSpace", - "xChannel", - "yChannel", - "onChange", - "onChangeEnd", - "translations", - "xName", - "yName", - "disabled", - ], - FORM_CONTROL_PROP_NAMES, + "ref", + "value", + "defaultValue", + "colorSpace", + "xChannel", + "yChannel", + "onChange", + "onChangeEnd", + "translations", + "xName", + "yName", + "disabled", + ...FORM_CONTROL_PROP_NAMES, ); - const { formControlContext } = createFormControl(formControlProps); + const { formControlContext } = createFormControl(mergedProps); const { direction } = useLocale(); const [backgroundRef, setBackgroundRef] = createSignal(); const [thumbRef, setThumbRef] = createSignal(); const state = createColorAreaState({ - value: () => local.value, - defaultValue: () => local.defaultValue, - onChange: local.onChange, - onChangeEnd: local.onChangeEnd, - colorSpace: () => local.colorSpace, - xChannel: () => local.xChannel, - yChannel: () => local.yChannel, + value: () => mergedProps.value, + defaultValue: () => mergedProps.defaultValue, + onChange: mergedProps.onChange, + onChangeEnd: mergedProps.onChangeEnd, + colorSpace: () => mergedProps.colorSpace, + xChannel: () => mergedProps.xChannel, + yChannel: () => mergedProps.yChannel, isDisabled: () => formControlContext.isDisabled() ?? false, }); @@ -199,7 +196,7 @@ export function ColorAreaRoot( const xPercent = clamp(currentPosition.x / width, 0, 1); const yPercent = clamp(currentPosition.y / height, 0, 1); state.setThumbPercent({ x: xPercent, y: yPercent }); - local.onChange?.(state.value()); + mergedProps.onChange?.(state.value()); }; const onDragEnd = () => { @@ -300,33 +297,33 @@ export function ColorAreaRoot( const context: ColorAreaContextValue = { state, - xName: () => local.xName, - yName: () => local.yName, + xName: () => mergedProps.xName, + yName: () => mergedProps.yName, onDragStart, onDrag, onDragEnd, - translations: () => local.translations, + translations: () => mergedProps.translations, getDisplayColor, onStepKeyDown, backgroundRef, setBackgroundRef, thumbRef, setThumbRef, - generateId: createGenerateId(() => access(formControlProps.id)!), + generateId: createGenerateId(() => access(mergedProps.id)!), }; return ( - - + + as="div" - ref={mergeRefs((el) => (ref = el), local.ref)} + ref={mergeRefs((el) => (ref = el), mergedProps.ref)} role="group" - id={access(formControlProps.id)!} + id={access(mergedProps.id)!} {...formControlContext.dataset()} {...others} /> - - + + ); } diff --git a/packages/core/src/color-area/color-area-thumb.tsx b/packages/core/src/color-area/color-area-thumb.tsx index 050e6c3d..31b044f7 100644 --- a/packages/core/src/color-area/color-area-thumb.tsx +++ b/packages/core/src/color-area/color-area-thumb.tsx @@ -1,7 +1,8 @@ import { callHandler, mergeRefs } from "@kobalte/utils"; import { combineStyle } from "@solid-primitives/props"; -import { type JSX, type ValidComponent, splitProps } from "solid-js"; -import { COLOR_INTL_TRANSLATIONS } from "../colors"; +import { COLOR_INTL_TRANSLATIONS } from "@solid-primitives/utils/colors"; +import type { JSX, ValidComponent } from "@solidjs/web"; +import { omit } from "solid-js"; import { useFormControlContext } from "../form-control"; import { type ElementOf, @@ -37,14 +38,15 @@ export function ColorAreaThumb( const context = useColorAreaContext(); const formControlContext = useFormControlContext(); - const [local, others] = splitProps(props, [ + const others = omit( + props, "style", "aria-label", "onKeyDown", "onPointerDown", "onPointerMove", "onPointerUp", - ]); + ); const ariaLabel = () => { const xChannel = context.state.channels().xChannel; @@ -55,12 +57,12 @@ export function ColorAreaThumb( .value() .getColorName(COLOR_INTL_TRANSLATIONS); return ( - local["aria-label"] ?? [xChannelName, yChannelName, colorName].join(", ") + props["aria-label"] ?? [xChannelName, yChannelName, colorName].join(", ") ); }; const onKeyDown: JSX.EventHandlerUnion = (e) => { - callHandler(e, local.onKeyDown); + callHandler(e, props.onKeyDown); context.onStepKeyDown(e); }; @@ -69,7 +71,12 @@ export function ColorAreaThumb( const onPointerDown: JSX.EventHandlerUnion = ( e, ) => { - callHandler(e, local.onPointerDown); + callHandler( + e, + props.onPointerDown as + | JSX.EventHandlerUnion + | undefined, + ); const target = e.currentTarget as HTMLElement; @@ -87,7 +94,7 @@ export function ColorAreaThumb( const onPointerMove: JSX.EventHandlerUnion = (e) => { e.stopPropagation(); - callHandler(e, local.onPointerMove); + callHandler(e, props.onPointerMove); const target = e.currentTarget as HTMLElement; @@ -104,7 +111,7 @@ export function ColorAreaThumb( const onPointerUp: JSX.EventHandlerUnion = (e) => { e.stopPropagation(); - callHandler(e, local.onPointerUp); + callHandler(e, props.onPointerUp); const target = e.currentTarget as HTMLElement; @@ -119,7 +126,7 @@ export function ColorAreaThumb( as="span" ref={mergeRefs(context.setThumbRef, props.ref)} role="presentation" - tabIndex={context.state.isDisabled() ? undefined : 0} + tabindex={context.state.isDisabled() ? undefined : 0} style={combineStyle( { position: "absolute", @@ -130,7 +137,7 @@ export function ColorAreaThumb( "touch-action": "none", "--kb-color-current": context.state.value().toString(), }, - local.style, + props.style, )} aria-label={ariaLabel()} onKeyDown={onKeyDown} diff --git a/packages/core/src/color-area/create-color-area-state.ts b/packages/core/src/color-area/create-color-area-state.ts index 6c20d7f3..39a70b9d 100644 --- a/packages/core/src/color-area/create-color-area-state.ts +++ b/packages/core/src/color-area/create-color-area-state.ts @@ -1,11 +1,11 @@ import { clamp, mergeDefaultProps, snapValueToStep } from "@kobalte/utils"; -import { type Accessor, createMemo, createSignal } from "solid-js"; import { type Color, type ColorChannel, type ColorSpace, parseColor, -} from "../colors"; +} from "@solid-primitives/utils/colors"; +import { type Accessor, createMemo, createSignal } from "solid-js"; import { createControllableSignal } from "../primitives"; export interface ColorAreaState { diff --git a/packages/core/src/color-area/index.tsx b/packages/core/src/color-area/index.tsx index 47390e2f..d0d330a8 100644 --- a/packages/core/src/color-area/index.tsx +++ b/packages/core/src/color-area/index.tsx @@ -47,42 +47,42 @@ import { } from "./color-area-thumb"; export type { - ColorAreaDescriptionProps, - ColorAreaDescriptionOptions, + ColorAreaBackgroundCommonProps, + ColorAreaBackgroundOptions, + ColorAreaBackgroundProps, + ColorAreaBackgroundRenderProps, ColorAreaDescriptionCommonProps, + ColorAreaDescriptionOptions, + ColorAreaDescriptionProps, ColorAreaDescriptionRenderProps, - ColorAreaErrorMessageOptions, ColorAreaErrorMessageCommonProps, - ColorAreaErrorMessageRenderProps, + ColorAreaErrorMessageOptions, ColorAreaErrorMessageProps, - ColorAreaLabelOptions, + ColorAreaErrorMessageRenderProps, + ColorAreaHiddenInputXProps, + ColorAreaHiddenInputYProps, ColorAreaLabelCommonProps, - ColorAreaLabelRenderProps, + ColorAreaLabelOptions, ColorAreaLabelProps, - ColorAreaRootOptions, + ColorAreaLabelRenderProps, ColorAreaRootCommonProps, - ColorAreaRootRenderProps, + ColorAreaRootOptions, ColorAreaRootProps, - ColorAreaBackgroundOptions, - ColorAreaBackgroundCommonProps, - ColorAreaBackgroundRenderProps, - ColorAreaBackgroundProps, - ColorAreaThumbOptions, + ColorAreaRootRenderProps, ColorAreaThumbCommonProps, - ColorAreaThumbRenderProps, + ColorAreaThumbOptions, ColorAreaThumbProps, - ColorAreaHiddenInputXProps, - ColorAreaHiddenInputYProps, + ColorAreaThumbRenderProps, }; export { + Background, Description, ErrorMessage, + HiddenInputX, + HiddenInputY, Label, Root, - Background, Thumb, - HiddenInputX, - HiddenInputY, }; export const ColorArea = Object.assign(Root, { @@ -99,6 +99,6 @@ export const ColorArea = Object.assign(Root, { * API will most probably change */ export { - useColorAreaContext, type ColorAreaContextValue, + useColorAreaContext, } from "./color-area-context"; diff --git a/packages/core/src/color-area/stories/color-area.stories.tsx b/packages/core/src/color-area/stories/color-area.stories.tsx new file mode 100644 index 00000000..0279f2f6 --- /dev/null +++ b/packages/core/src/color-area/stories/color-area.stories.tsx @@ -0,0 +1,190 @@ +import type { Color } from "@solid-primitives/utils/colors"; +import { parseColor } from "@solid-primitives/utils/colors"; +import { createSignal } from "solid-js"; +import preview from "../../../../../.storybook/preview.js"; +import { + Background, + Description, + ErrorMessage, + HiddenInputX, + HiddenInputY, + Label, + Root, + Thumb, +} from "../index"; + +const meta = preview.meta({ + title: "Components/ColorArea", + tags: ["autodocs"], + argTypes: { + disabled: { control: "boolean" }, + readOnly: { control: "boolean" }, + }, + args: { + disabled: false, + readOnly: false, + }, +}); + +export default meta; + +const rootClass = "relative inline-flex flex-col gap-2 font-sans select-none"; +const backgroundClass = + "relative w-48 h-48 rounded-md cursor-crosshair touch-none forced-colors:forced-color-adjust-none"; +const thumbClass = + "w-5 h-5 rounded-full border-2 border-white shadow-md cursor-grab focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white forced-colors:forced-color-adjust-none"; +const labelClass = "text-sm font-medium text-slate-700"; +const errorClass = "text-xs text-red-600"; +const descClass = "text-xs text-slate-500"; + +/** HSL color area with saturation/lightness axes. */ +export const Default = meta.story({ + name: "Default", + args: { disabled: false, readOnly: false }, + render: (args) => ( + + + + + + + + + + ), +}); + +/** Controlled color area with external signal. */ +function ControlledDemo() { + const [color, setColor] = createSignal( + parseColor("hsl(120, 60%, 50%)"), + ); + return ( +
+ + + + + + + + + +

+ Current: {color().toString("hex")} +

+
+ ); +} + +export const Controlled = meta.story({ + name: "Controlled", + render: () => , +}); + +/** Color area starting at an uncontrolled default value. */ +export const DefaultValue = meta.story({ + name: "Default Value", + render: () => ( + + + + + + + + + + ), +}); + +/** Disabled color area — not interactive. */ +export const Disabled = meta.story({ + name: "Disabled", + render: () => ( + + + + + + + + + + ), +}); + +/** RGB color space with red/green axes. */ +export const RGBSpace = meta.story({ + name: "RGB Space", + render: () => ( + + + + + + + + + + ), +}); + +/** With validation state and error message. */ +export const WithValidation = meta.story({ + name: "With Validation", + render: () => ( + + + + + + + + + + Select a hue between 180–260°. + + + Please select a blue or purple hue. + + + ), +}); diff --git a/packages/core/src/color-channel-field/color-channel-field-root.tsx b/packages/core/src/color-channel-field/color-channel-field-root.tsx index a38ce9d6..cfab0594 100644 --- a/packages/core/src/color-channel-field/color-channel-field-root.tsx +++ b/packages/core/src/color-channel-field/color-channel-field-root.tsx @@ -1,13 +1,12 @@ import { clamp, mergeDefaultProps } from "@kobalte/utils"; import { - type Component, - type ValidComponent, - createMemo, - createUniqueId, - splitProps, -} from "solid-js"; -import type { Color, ColorChannel, ColorSpace } from "../colors"; -import { parseColor } from "../colors"; + type Color, + type ColorChannel, + type ColorSpace, + parseColor, +} from "@solid-primitives/utils/colors"; +import type { ValidComponent } from "@solidjs/web"; +import { type Component, createMemo, createUniqueId, omit } from "solid-js"; import * as NumberField from "../number-field"; import type { ElementOf, PolymorphicProps } from "../polymorphic"; import { createControllableSignal } from "../primitives"; @@ -67,28 +66,32 @@ export function ColorChannelFieldRoot( props as ColorChannelFieldRootProps, ); - const [local, others] = splitProps(mergedProps, [ + const others = omit( + mergedProps, "value", "defaultValue", "onChange", "channel", "colorSpace", - ]); + ); const [value, setValue] = createControllableSignal({ - value: () => local.value, - defaultValue: () => local.defaultValue ?? parseColor("hsl(0, 100%, 50%)"), - onChange: (value) => local.onChange?.(value), + value: () => mergedProps.value, + defaultValue: () => + mergedProps.defaultValue ?? parseColor("hsl(0, 100%, 50%)"), + onChange: (value) => mergedProps.onChange?.(value), }); const color = createMemo(() => - local.colorSpace ? value()!.toFormat(local.colorSpace) : value(), + mergedProps.colorSpace + ? value()!.toFormat(mergedProps.colorSpace) + : value(), ); - const range = createMemo(() => color()!.getChannelRange(local.channel)); + const range = createMemo(() => color()!.getChannelRange(mergedProps.channel)); const formatOptions = createMemo(() => - color()!.getChannelFormatOptions(local.channel), + color()!.getChannelFormatOptions(mergedProps.channel), ); const multiplier = createMemo(() => @@ -97,7 +100,7 @@ export function ColorChannelFieldRoot( const onRawValueChange = (value: number) => { if (Number.isNaN(value)) { - setValue(color()!.withChannelValue(local.channel, Number.NaN)); + setValue(color()!.withChannelValue(mergedProps.channel, Number.NaN)); return; } @@ -111,7 +114,7 @@ export function ColorChannelFieldRoot( const roundedValue = Math.round(clampedValue * 10 ** digits) / 10 ** digits; - setValue(color()!.withChannelValue(local.channel, roundedValue)); + setValue(color()!.withChannelValue(mergedProps.channel, roundedValue)); }; return ( @@ -124,9 +127,9 @@ export function ColorChannelFieldRoot( > > rawValue={ - Number.isNaN(color()!.getChannelValue(local.channel)) + Number.isNaN(color()!.getChannelValue(mergedProps.channel)) ? undefined - : color()!.getChannelValue(local.channel) / multiplier() + : color()!.getChannelValue(mergedProps.channel) / multiplier() } minValue={range().minValue / multiplier()} maxValue={range().maxValue / multiplier()} diff --git a/packages/core/src/color-channel-field/index.tsx b/packages/core/src/color-channel-field/index.tsx index b43ac3a7..d13ae6f1 100644 --- a/packages/core/src/color-channel-field/index.tsx +++ b/packages/core/src/color-channel-field/index.tsx @@ -44,43 +44,43 @@ import { } from "./color-channel-field-root"; export type { - ColorChannelFieldDescriptionOptions, + ColorChannelFieldDecrementTriggerCommonProps, + ColorChannelFieldDecrementTriggerOptions, + ColorChannelFieldDecrementTriggerProps, + ColorChannelFieldDecrementTriggerRenderProps, ColorChannelFieldDescriptionCommonProps, - ColorChannelFieldDescriptionRenderProps, + ColorChannelFieldDescriptionOptions, ColorChannelFieldDescriptionProps, - ColorChannelFieldErrorMessageOptions, + ColorChannelFieldDescriptionRenderProps, ColorChannelFieldErrorMessageCommonProps, - ColorChannelFieldErrorMessageRenderProps, + ColorChannelFieldErrorMessageOptions, ColorChannelFieldErrorMessageProps, - ColorChannelFieldInputOptions, + ColorChannelFieldErrorMessageRenderProps, + ColorChannelFieldHiddenInputProps, + ColorChannelFieldIncrementTriggerCommonProps, + ColorChannelFieldIncrementTriggerOptions, + ColorChannelFieldIncrementTriggerProps, + ColorChannelFieldIncrementTriggerRenderProps, ColorChannelFieldInputCommonProps, - ColorChannelFieldInputRenderProps, + ColorChannelFieldInputOptions, ColorChannelFieldInputProps, - ColorChannelFieldLabelOptions, + ColorChannelFieldInputRenderProps, ColorChannelFieldLabelCommonProps, - ColorChannelFieldLabelRenderProps, + ColorChannelFieldLabelOptions, ColorChannelFieldLabelProps, - ColorChannelFieldRootOptions, + ColorChannelFieldLabelRenderProps, ColorChannelFieldRootCommonProps, - ColorChannelFieldRootRenderProps, + ColorChannelFieldRootOptions, ColorChannelFieldRootProps, - ColorChannelFieldHiddenInputProps, - ColorChannelFieldIncrementTriggerOptions, - ColorChannelFieldIncrementTriggerCommonProps, - ColorChannelFieldIncrementTriggerRenderProps, - ColorChannelFieldIncrementTriggerProps, - ColorChannelFieldDecrementTriggerOptions, - ColorChannelFieldDecrementTriggerCommonProps, - ColorChannelFieldDecrementTriggerRenderProps, - ColorChannelFieldDecrementTriggerProps, + ColorChannelFieldRootRenderProps, }; export { + DecrementTrigger, Description, ErrorMessage, HiddenInput, - Input, IncrementTrigger, - DecrementTrigger, + Input, Label, Root, }; diff --git a/packages/core/src/color-channel-field/stories/color-channel-field.stories.tsx b/packages/core/src/color-channel-field/stories/color-channel-field.stories.tsx new file mode 100644 index 00000000..e7f7e570 --- /dev/null +++ b/packages/core/src/color-channel-field/stories/color-channel-field.stories.tsx @@ -0,0 +1,202 @@ +import type { Color, ColorChannel } from "@solid-primitives/utils/colors"; +import { parseColor } from "@solid-primitives/utils/colors"; +import { createSignal } from "solid-js"; +import preview from "../../../../../.storybook/preview.js"; +import { + DecrementTrigger, + Description, + ErrorMessage, + IncrementTrigger, + Input, + Label, + Root, +} from "../index"; + +const meta = preview.meta({ + title: "Components/ColorChannelField", + tags: ["autodocs"], + argTypes: { + channel: { + control: "select", + options: [ + "hue", + "saturation", + "lightness", + "red", + "green", + "blue", + "alpha", + ], + }, + disabled: { control: "boolean" }, + }, + args: { + channel: "hue", + disabled: false, + }, +}); + +export default meta; + +const rootClass = "flex flex-col gap-1.5 font-sans w-48"; +const labelClass = "text-sm font-medium text-slate-700"; +const inputWrapClass = + "flex h-9 items-center rounded-md border border-slate-300 bg-white text-sm text-slate-900 " + + "focus-within:ring-2 focus-within:ring-blue-500 data-[invalid]:border-red-500 data-[disabled]:bg-slate-100"; +const inputClass = + "h-full w-full min-w-0 rounded-md px-3 bg-transparent outline-none data-[disabled]:cursor-not-allowed"; +const btnClass = + "flex h-full w-7 shrink-0 items-center justify-center border-l border-slate-300 text-slate-500 " + + "hover:bg-slate-50 first-of-type:rounded-l-md first-of-type:border-l-0 last-of-type:rounded-r-md " + + "data-[disabled]:opacity-40 data-[disabled]:cursor-not-allowed"; +const errorClass = "text-xs text-red-600"; +const descClass = "text-xs text-slate-500"; + +/** Single channel field driven by the selected channel control. */ +export const Default = meta.story({ + name: "Default", + args: { channel: "hue", disabled: false }, + render: (args) => ( + + +
+ + + + +
+
+ ), +}); + +/** Controlled — hue channel synced to a signal. */ +function ControlledDemo() { + const [color, setColor] = createSignal( + parseColor("hsl(200, 70%, 50%)"), + ); + return ( +
+ + +
+ + + + +
+
+

+ Color: {color().toString("css")} +

+
+ ); +} + +export const Controlled = meta.story({ + name: "Controlled", + render: () => , +}); + +/** All HSL channels as a combined editor. */ +function HSLEditorDemo() { + const [color, setColor] = createSignal( + parseColor("hsl(200, 70%, 50%)"), + ); + const channels: ColorChannel[] = ["hue", "saturation", "lightness"]; + return ( +
+ {channels.map((ch) => ( + + +
+ + + + +
+
+ ))} +
+
+ ); +} + +export const HSLEditor = meta.story({ + name: "HSL Editor", + render: () => , +}); + +/** Disabled channel field. */ +export const Disabled = meta.story({ + name: "Disabled", + render: () => ( + + +
+ + + + +
+
+ ), +}); + +/** Alpha channel field. */ +export const Alpha = meta.story({ + name: "Alpha Channel", + render: () => ( + + +
+ + + + +
+ Adjusts color transparency. +
+ ), +}); + +/** With validation error. */ +export const Invalid = meta.story({ + name: "Invalid", + render: () => ( + + +
+ + + + +
+ + Value is too dark — choose above 20%. + +
+ ), +}); diff --git a/packages/core/src/color-field/color-field-context.tsx b/packages/core/src/color-field/color-field-context.tsx index 50bef0f5..ded125f7 100644 --- a/packages/core/src/color-field/color-field-context.tsx +++ b/packages/core/src/color-field/color-field-context.tsx @@ -1,4 +1,5 @@ -import { type JSX, createContext, useContext } from "solid-js"; +import type { JSX } from "@solidjs/web"; +import { createContext, useContext } from "solid-js"; export interface ColorFieldContextValue { onBlur: JSX.EventHandlerUnion; diff --git a/packages/core/src/color-field/color-field-input.tsx b/packages/core/src/color-field/color-field-input.tsx index 1ed27f58..02fc475d 100644 --- a/packages/core/src/color-field/color-field-input.tsx +++ b/packages/core/src/color-field/color-field-input.tsx @@ -1,10 +1,6 @@ import { composeEventHandlers } from "@kobalte/utils"; -import { - type Component, - type JSX, - type ValidComponent, - splitProps, -} from "solid-js"; +import type { JSX, ValidComponent } from "@solidjs/web"; +import { type Component, omit } from "solid-js"; import type { ElementOf, PolymorphicProps } from "../polymorphic"; import * as TextField from "../text-field"; import { useColorFieldContext } from "./color-field-context"; @@ -21,9 +17,9 @@ export interface ColorFieldInputCommonProps< export interface ColorFieldInputRenderProps extends ColorFieldInputCommonProps, TextField.TextFieldInputRenderProps { - autoComplete: "off"; - autoCorrect: "off"; - spellCheck: "false"; + autocomplete: "off"; + autocorrect: "off"; + spellcheck: "false"; } export type ColorFieldInputProps< @@ -35,7 +31,7 @@ export function ColorFieldInput( ) { const context = useColorFieldContext(); - const [local, others] = splitProps(props, ["onBlur"]); + const others = omit(props, "onBlur"); return ( ( > > > - autoComplete="off" - autoCorrect="off" - spellCheck="false" - onBlur={composeEventHandlers([local.onBlur, context.onBlur])} + autocomplete="off" + autocorrect="off" + spellcheck="false" + onBlur={composeEventHandlers([props.onBlur, context.onBlur])} {...others} /> ); diff --git a/packages/core/src/color-field/color-field-root.tsx b/packages/core/src/color-field/color-field-root.tsx index 706a8b77..81bfd108 100644 --- a/packages/core/src/color-field/color-field-root.tsx +++ b/packages/core/src/color-field/color-field-root.tsx @@ -1,15 +1,13 @@ import { mergeDefaultProps } from "@kobalte/utils"; +import { parseColor } from "@solid-primitives/utils/colors"; +import type { JSX, ValidComponent } from "@solidjs/web"; import { type Component, - type JSX, - type ValidComponent, - batch, createMemo, createSignal, createUniqueId, - splitProps, + omit, } from "solid-js"; -import { parseColor } from "../colors"; import type { ElementOf, PolymorphicProps } from "../polymorphic"; import { createControllableSignal } from "../primitives"; import * as TextField from "../text-field"; @@ -44,14 +42,10 @@ export function ColorFieldRoot( props as ColorFieldRootProps, ); - const [local, others] = splitProps(mergedProps, [ - "value", - "defaultValue", - "onChange", - ]); + const others = omit(mergedProps, "value", "defaultValue", "onChange"); const defaultValue = createMemo(() => { - let defaultValue = local.defaultValue; + let defaultValue = mergedProps.defaultValue; try { defaultValue = parseColor( defaultValue?.startsWith("#") ? defaultValue : `#${defaultValue}`, @@ -63,9 +57,9 @@ export function ColorFieldRoot( }); const [value, setValue] = createControllableSignal({ - value: () => local.value, + value: () => mergedProps.value, defaultValue, - onChange: (value) => local.onChange?.(value), + onChange: (value) => mergedProps.onChange?.(value), }); const [prevValue, setPrevValue] = createSignal(value()); @@ -94,10 +88,8 @@ export function ColorFieldRoot( } return; } - batch(() => { - setValue(newValue); - setPrevValue(newValue); - }); + setValue(newValue); + setPrevValue(newValue); }; const context: ColorFieldContextValue = { @@ -105,7 +97,7 @@ export function ColorFieldRoot( }; return ( - + ( onChange={onChange} {...others} /> - + ); } diff --git a/packages/core/src/color-field/index.tsx b/packages/core/src/color-field/index.tsx index af0952ad..3256c05f 100644 --- a/packages/core/src/color-field/index.tsx +++ b/packages/core/src/color-field/index.tsx @@ -31,26 +31,26 @@ import { } from "./color-field-root"; export type { - ColorFieldDescriptionOptions, ColorFieldDescriptionCommonProps, - ColorFieldDescriptionRenderProps, + ColorFieldDescriptionOptions, ColorFieldDescriptionProps, - ColorFieldErrorMessageOptions, + ColorFieldDescriptionRenderProps, ColorFieldErrorMessageCommonProps, - ColorFieldErrorMessageRenderProps, + ColorFieldErrorMessageOptions, ColorFieldErrorMessageProps, - ColorFieldInputOptions, + ColorFieldErrorMessageRenderProps, ColorFieldInputCommonProps, - ColorFieldInputRenderProps, + ColorFieldInputOptions, ColorFieldInputProps, - ColorFieldLabelOptions, + ColorFieldInputRenderProps, ColorFieldLabelCommonProps, - ColorFieldLabelRenderProps, + ColorFieldLabelOptions, ColorFieldLabelProps, - ColorFieldRootOptions, + ColorFieldLabelRenderProps, ColorFieldRootCommonProps, - ColorFieldRootRenderProps, + ColorFieldRootOptions, ColorFieldRootProps, + ColorFieldRootRenderProps, }; export { Description, ErrorMessage, Input, Label, Root }; @@ -65,6 +65,6 @@ export const ColorField = Object.assign(Root, { * API will most probably change */ export { - useColorFieldContext, type ColorFieldContextValue, + useColorFieldContext, } from "./color-field-context"; diff --git a/packages/core/src/color-field/stories/color-field.stories.tsx b/packages/core/src/color-field/stories/color-field.stories.tsx new file mode 100644 index 00000000..397b49f7 --- /dev/null +++ b/packages/core/src/color-field/stories/color-field.stories.tsx @@ -0,0 +1,133 @@ +import { isValidColor } from "@solid-primitives/utils/colors"; +import { createSignal } from "solid-js"; +import preview from "../../../../../.storybook/preview.js"; +import { Description, ErrorMessage, Input, Label, Root } from "../index"; + +const meta = preview.meta({ + title: "Components/ColorField", + tags: ["autodocs"], + argTypes: { + disabled: { control: "boolean" }, + readOnly: { control: "boolean" }, + placeholder: { control: "text" }, + }, + args: { + disabled: false, + readOnly: false, + placeholder: "#000000", + }, +}); + +export default meta; + +const rootClass = "flex flex-col gap-1.5 font-sans w-48"; +const labelClass = "text-sm font-medium text-slate-700"; +const inputClass = + "h-9 rounded-md border border-slate-300 bg-white px-3 text-sm text-slate-900 placeholder:text-slate-400 " + + "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 " + + "data-[invalid]:border-red-500 data-[disabled]:bg-slate-100 data-[disabled]:cursor-not-allowed"; +const descClass = "text-xs text-slate-500"; +const errorClass = "text-xs text-red-600"; + +/** Default hex color field with a color swatch preview. */ +export const Default = meta.story({ + name: "Default", + args: { disabled: false, readOnly: false, placeholder: "#000000" }, + render: (args) => ( + + + + + ), +}); + +/** Controlled color field synced to a signal. */ +function ControlledDemo() { + const [hex, setHex] = createSignal("#3b82f6"); + const valid = () => + !hex() || isValidColor(hex().startsWith("#") ? hex() : `#${hex()}`); + return ( +
+ + +
+
+ +
+ Invalid hex color. + +

+ Value: {hex()} +

+
+ ); +} + +export const Controlled = meta.story({ + name: "Controlled", + render: () => , +}); + +/** With a default value pre-populated. */ +export const DefaultValue = meta.story({ + name: "Default Value", + render: () => ( + + + + Enter a hex value without #. + + ), +}); + +/** Disabled field — not editable. */ +export const Disabled = meta.story({ + name: "Disabled", + render: () => ( + + + + + ), +}); + +/** Read-only field. */ +export const ReadOnly = meta.story({ + name: "Read Only", + render: () => ( + + + + + ), +}); + +/** Validation state showing invalid feedback. */ +export const Invalid = meta.story({ + name: "Invalid", + render: () => ( + + + + Not a valid hex color. + + ), +}); diff --git a/packages/core/src/color-mode/color-mode-provider.tsx b/packages/core/src/color-mode/color-mode-provider.tsx index 590e2f3f..11d9114e 100644 --- a/packages/core/src/color-mode/color-mode-provider.tsx +++ b/packages/core/src/color-mode/color-mode-provider.tsx @@ -17,8 +17,8 @@ import type { ConfigColorMode, } from "./types"; import { - FALLBACK_COLOR_MODE_VALUE, addColorModeListener, + FALLBACK_COLOR_MODE_VALUE, getInitialColorMode, getSystemColorMode, setColorModeDataset, @@ -79,9 +79,5 @@ export function ColorModeProvider(props: ColorModeProviderProps) { toggleColorMode, }; - return ( - - {props.children} - - ); + return {props.children}; } diff --git a/packages/core/src/color-mode/color-mode-script.tsx b/packages/core/src/color-mode/color-mode-script.tsx index 3003b826..342423df 100644 --- a/packages/core/src/color-mode/color-mode-script.tsx +++ b/packages/core/src/color-mode/color-mode-script.tsx @@ -6,7 +6,7 @@ * https://github.com/chakra-ui/chakra-ui/blob/132a98958be64e46619b1e280ca6405d0a833cb0/packages/components/color-mode/src/color-mode-script.tsx */ -import { createMemo, mergeProps } from "solid-js"; +import { createMemo, merge } from "solid-js"; import { COLOR_MODE_STORAGE_KEY } from "./storage-manager"; import type { ColorModeScriptProps, ConfigColorMode } from "./types"; @@ -26,7 +26,7 @@ function normalize(initialColorMode: ConfigColorMode) { } export function ColorModeScript(props: ColorModeScriptProps) { - const mergedProps = mergeProps( + const mergedProps = merge( { initialColorMode: FALLBACK_COLOR_MODE_VALUE, storageType: "localStorage", diff --git a/packages/core/src/color-mode/storage-manager.ts b/packages/core/src/color-mode/storage-manager.ts index b4c3cc35..c2ce2e5d 100644 --- a/packages/core/src/color-mode/storage-manager.ts +++ b/packages/core/src/color-mode/storage-manager.ts @@ -6,7 +6,7 @@ * https://github.com/chakra-ui/chakra-ui/blob/main/packages/color-mode/src/storage-manager.ts */ -import { isServer } from "solid-js/web"; +import { isServer } from "@solidjs/web"; import type { ColorModeStorageManager, diff --git a/packages/core/src/color-mode/utils.ts b/packages/core/src/color-mode/utils.ts index 72b6820e..fadd939d 100644 --- a/packages/core/src/color-mode/utils.ts +++ b/packages/core/src/color-mode/utils.ts @@ -6,7 +6,7 @@ * https://github.com/chakra-ui/chakra-ui/blob/main/packages/color-mode/src/color-mode.utils.ts */ -import { isServer } from "solid-js/web"; +import { isServer } from "@solidjs/web"; import type { ColorMode, diff --git a/packages/core/src/color-slider/color-slider-context.tsx b/packages/core/src/color-slider/color-slider-context.tsx index 67a47892..79786fb9 100644 --- a/packages/core/src/color-slider/color-slider-context.tsx +++ b/packages/core/src/color-slider/color-slider-context.tsx @@ -1,6 +1,9 @@ +import type { + Color, + ColorChannel, + ColorIntlTranslations, +} from "@solid-primitives/utils/colors"; import { type Accessor, createContext, useContext } from "solid-js"; -import type { ColorIntlTranslations } from "../colors"; -import type { Color, ColorChannel } from "../colors"; export interface ColorSliderContextValue { readonly value: Accessor; diff --git a/packages/core/src/color-slider/color-slider-root.tsx b/packages/core/src/color-slider/color-slider-root.tsx index 511b5993..905dcc80 100644 --- a/packages/core/src/color-slider/color-slider-root.tsx +++ b/packages/core/src/color-slider/color-slider-root.tsx @@ -1,17 +1,16 @@ -import { type ValidationState, mergeDefaultProps } from "@kobalte/utils"; +import { mergeDefaultProps, type ValidationState } from "@kobalte/utils"; +import { createControllableSignal } from "@solid-primitives/controlled-signal"; import { - type Component, - type ValidComponent, - createMemo, - createUniqueId, - splitProps, -} from "solid-js"; - -import { COLOR_INTL_TRANSLATIONS, type ColorIntlTranslations } from "../colors"; -import type { Color, ColorChannel, ColorSpace } from "../colors"; -import { parseColor } from "../colors"; + COLOR_INTL_TRANSLATIONS, + type Color, + type ColorChannel, + type ColorIntlTranslations, + type ColorSpace, + parseColor, +} from "@solid-primitives/utils/colors"; +import type { ValidComponent } from "@solidjs/web"; +import { type Component, createMemo, createUniqueId, omit } from "solid-js"; import type { ElementOf, PolymorphicProps } from "../polymorphic"; -import { createControllableSignal } from "../primitives/create-controllable-signal"; import * as Slider from "../slider"; import { ColorSliderContext, @@ -106,7 +105,8 @@ export function ColorSliderRoot( props as ColorSliderRootProps, ); - const [local, others] = splitProps(mergedProps, [ + const others = omit( + mergedProps, "value", "defaultValue", "onChange", @@ -115,36 +115,40 @@ export function ColorSliderRoot( "colorSpace", "getValueLabel", "translations", - ]); + ); const [value, setValue] = createControllableSignal({ - value: () => local.value, - defaultValue: () => local.defaultValue, - onChange: (value) => local.onChange?.(value), + value: () => mergedProps.value, + defaultValue: () => mergedProps.defaultValue, + onChange: (value) => mergedProps.onChange?.(value), }); const color = createMemo(() => { - return local.colorSpace ? value()!.toFormat(local.colorSpace) : value()!; + return mergedProps.colorSpace + ? value()!.toFormat(mergedProps.colorSpace) + : value()!; }); const onChange = (value: number[]) => { - setValue(color()!.withChannelValue(local.channel, value[0])); + setValue(color()!.withChannelValue(mergedProps.channel, value[0])); }; const onChangeEnd = (value: number[]) => { - local.onChangeEnd?.(color()!.withChannelValue(local.channel, value[0])); + mergedProps.onChangeEnd?.( + color()!.withChannelValue(mergedProps.channel, value[0]), + ); }; const getValueLabel = createMemo(() => { - if (local.getValueLabel) { - return local.getValueLabel(color()!); + if (mergedProps.getValueLabel) { + return mergedProps.getValueLabel(color()!); } - return color()!.formatChannelValue(local.channel); + return color()!.formatChannelValue(mergedProps.channel); }); const getDisplayColor = createMemo(() => { - switch (local.channel) { + switch (mergedProps.channel) { case "hue": return parseColor(`hsl(${color()!.getChannelValue("hue")}, 100%, 50%)`); case "lightness": @@ -158,31 +162,31 @@ export function ColorSliderRoot( return color()!; } default: - throw new Error(`Unknown color channel: ${local.channel}`); + throw new Error(`Unknown color channel: ${mergedProps.channel}`); } }); const context: ColorSliderContextValue = { value: color, - channel: () => local.channel, + channel: () => mergedProps.channel, getDisplayColor, - translations: () => local.translations, + translations: () => mergedProps.translations, }; return ( - + > > - value={[color()!.getChannelValue(local.channel)]} + value={[color()!.getChannelValue(mergedProps.channel)]} onChange={onChange} onChangeEnd={onChangeEnd} getValueLabel={getValueLabel} - {...color()!.getChannelRange(local.channel)} + {...color()!.getChannelRange(mergedProps.channel)} {...others} /> - + ); } diff --git a/packages/core/src/color-slider/color-slider-thumb.tsx b/packages/core/src/color-slider/color-slider-thumb.tsx index 979d4ea9..4407af95 100644 --- a/packages/core/src/color-slider/color-slider-thumb.tsx +++ b/packages/core/src/color-slider/color-slider-thumb.tsx @@ -1,11 +1,6 @@ import { combineStyle } from "@solid-primitives/props"; -import { - type Component, - type JSX, - type ValidComponent, - createMemo, - splitProps, -} from "solid-js"; +import type { JSX, ValidComponent } from "@solidjs/web"; +import { type Component, createMemo, omit } from "solid-js"; import type { ElementOf, PolymorphicProps } from "../polymorphic"; import * as Slider from "../slider"; import { useColorSliderContext } from "./color-slider-context"; @@ -32,7 +27,7 @@ export function ColorSliderThumb( ) { const context = useColorSliderContext(); - const [local, others] = splitProps(props, ["style"]); + const others = omit(props, "style"); const valueText = createMemo(() => { const formattedValue = context @@ -59,7 +54,7 @@ export function ColorSliderThumb( "forced-color-adjust": "none", "--kb-color-current": context.value().toString(), }, - local.style, + props.style, )} aria-valuetext={valueText()} {...others} diff --git a/packages/core/src/color-slider/color-slider-track.tsx b/packages/core/src/color-slider/color-slider-track.tsx index 5b8de4da..bb1f257f 100644 --- a/packages/core/src/color-slider/color-slider-track.tsx +++ b/packages/core/src/color-slider/color-slider-track.tsx @@ -1,11 +1,6 @@ import { combineStyle } from "@solid-primitives/props"; -import { - type Component, - type JSX, - type ValidComponent, - createMemo, - splitProps, -} from "solid-js"; +import type { JSX, ValidComponent } from "@solidjs/web"; +import { type Component, createMemo, omit } from "solid-js"; import { useLocale } from "../i18n"; import type { ElementOf, PolymorphicProps } from "../polymorphic"; import * as Slider from "../slider"; @@ -35,7 +30,7 @@ export function ColorSliderTrack( const sliderContext = useSliderContext(); const context = useColorSliderContext(); - const [local, others] = splitProps(props, ["style"]); + const others = omit(props, "style"); const { direction } = useLocale(); @@ -114,7 +109,7 @@ export function ColorSliderTrack( "forced-color-adjust": "none", background: backgroundStyles(), }, - local.style, + props.style, )} {...others} /> diff --git a/packages/core/src/color-slider/index.tsx b/packages/core/src/color-slider/index.tsx index b8012229..65ed4ff1 100644 --- a/packages/core/src/color-slider/index.tsx +++ b/packages/core/src/color-slider/index.tsx @@ -48,35 +48,35 @@ import { } from "./color-slider-track"; export type { - ColorSliderDescriptionProps, - ColorSliderDescriptionOptions, ColorSliderDescriptionCommonProps, + ColorSliderDescriptionOptions, + ColorSliderDescriptionProps, ColorSliderDescriptionRenderProps, - ColorSliderErrorMessageOptions, ColorSliderErrorMessageCommonProps, - ColorSliderErrorMessageRenderProps, + ColorSliderErrorMessageOptions, ColorSliderErrorMessageProps, + ColorSliderErrorMessageRenderProps, ColorSliderInputProps, - ColorSliderLabelOptions, ColorSliderLabelCommonProps, - ColorSliderLabelRenderProps, + ColorSliderLabelOptions, ColorSliderLabelProps, - ColorSliderRootOptions, + ColorSliderLabelRenderProps, ColorSliderRootCommonProps, - ColorSliderRootRenderProps, + ColorSliderRootOptions, ColorSliderRootProps, - ColorSliderThumbOptions, + ColorSliderRootRenderProps, ColorSliderThumbCommonProps, - ColorSliderThumbRenderProps, + ColorSliderThumbOptions, ColorSliderThumbProps, - ColorSliderTrackOptions, + ColorSliderThumbRenderProps, ColorSliderTrackCommonProps, - ColorSliderTrackRenderProps, + ColorSliderTrackOptions, ColorSliderTrackProps, - ColorSliderValueLabelOptions, + ColorSliderTrackRenderProps, ColorSliderValueLabelCommonProps, - ColorSliderValueLabelRenderProps, + ColorSliderValueLabelOptions, ColorSliderValueLabelProps, + ColorSliderValueLabelRenderProps, }; export { Description, @@ -103,6 +103,6 @@ export const ColorSlider = Object.assign(Root, { * API will most probably change */ export { - useColorSliderContext, type ColorSliderContextValue, + useColorSliderContext, } from "./color-slider-context"; diff --git a/packages/core/src/color-slider/stories/color-slider.stories.tsx b/packages/core/src/color-slider/stories/color-slider.stories.tsx new file mode 100644 index 00000000..4046392d --- /dev/null +++ b/packages/core/src/color-slider/stories/color-slider.stories.tsx @@ -0,0 +1,269 @@ +import type { Color, ColorChannel } from "@solid-primitives/utils/colors"; +import { parseColor } from "@solid-primitives/utils/colors"; +import { createSignal } from "solid-js"; +import preview from "../../../../../.storybook/preview.js"; +import { + Description, + ErrorMessage, + Input, + Label, + Root, + Thumb, + Track, + ValueLabel, +} from "../index"; + +const meta = preview.meta({ + title: "Components/ColorSlider", + tags: ["autodocs"], + argTypes: { + channel: { + control: "select", + options: [ + "hue", + "saturation", + "lightness", + "brightness", + "red", + "green", + "blue", + "alpha", + ], + }, + orientation: { + control: "radio", + options: ["horizontal", "vertical"], + }, + disabled: { control: "boolean" }, + }, + args: { + channel: "hue", + orientation: "horizontal", + disabled: false, + }, +}); + +export default meta; + +const trackClass = + "relative flex h-3 w-56 items-center rounded-full cursor-pointer select-none touch-none forced-colors:forced-color-adjust-none"; +const thumbClass = + "block h-5 w-5 rounded-full border-2 border-white shadow-md cursor-grab " + + "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white focus-visible:ring-offset-1 " + + "forced-colors:forced-color-adjust-none"; +const labelClass = "text-sm font-medium text-slate-700"; +const errorClass = "text-xs text-red-600"; +const descClass = "text-xs text-slate-500"; + +/** Single-channel slider with controls. */ +export const Default = meta.story({ + name: "Default", + args: { channel: "hue", orientation: "horizontal", disabled: false }, + render: (args) => ( +
+ +
+ + +
+ + + + + +
+
+ ), +}); + +/** Hue slider — the rainbow gradient. */ +export const Hue = meta.story({ + name: "Hue", + render: () => ( + +
+ + +
+ + + + + +
+ ), +}); + +/** Alpha slider with a checkered background for transparency. */ +export const Alpha = meta.story({ + name: "Alpha", + render: () => ( + +
+ + +
+
+ + + + + +
+
+ ), +}); + +/** Controlled slider — all changes reflected in a signal. */ +function ControlledDemo() { + const [color, setColor] = createSignal( + parseColor("hsl(120, 80%, 50%)"), + ); + return ( +
+ +
+ + +
+ + + + + +
+
+

+ Value: {color().toString("css")} +

+
+ ); +} + +export const Controlled = meta.story({ + name: "Controlled", + render: () => , +}); + +/** Vertical orientation. */ +export const Vertical = meta.story({ + name: "Vertical", + render: () => ( + + + + + + + + + + ), +}); + +/** Disabled slider. */ +export const Disabled = meta.story({ + name: "Disabled", + render: () => ( + +
+ + +
+ + + + + +
+ ), +}); + +/** With validation and error message. */ +export const WithValidation = meta.story({ + name: "With Validation", + render: () => ( + +
+ + +
+ + + + + + + Pick a value above 30% for readability. + + Lightness is too low. +
+ ), +}); diff --git a/packages/core/src/color-swatch/color-swatch-root.tsx b/packages/core/src/color-swatch/color-swatch-root.tsx index 0a02607c..3e3605d4 100644 --- a/packages/core/src/color-swatch/color-swatch-root.tsx +++ b/packages/core/src/color-swatch/color-swatch-root.tsx @@ -1,13 +1,11 @@ import { mergeDefaultProps } from "@kobalte/utils"; import { combineStyle } from "@solid-primitives/props"; import { - type JSX, - type ValidComponent, - createUniqueId, - splitProps, -} from "solid-js"; -import { COLOR_INTL_TRANSLATIONS } from "../colors"; -import type { Color } from "../colors"; + COLOR_INTL_TRANSLATIONS, + type Color, +} from "@solid-primitives/utils/colors"; +import type { JSX, ValidComponent } from "@solidjs/web"; +import { createUniqueId, omit } from "solid-js"; import { type ElementOf, Polymorphic, @@ -60,36 +58,37 @@ export function ColorSwatchRoot( props as ColorSwatchRootProps, ); - const [local, others] = splitProps(mergedProps, [ + const others = omit( + mergedProps, "style", "value", "colorName", "aria-label", "translations", - ]); + ); const ariaLabel = () => { const colorName = - local.colorName ?? - (local.value.getChannelValue("alpha") === 0 - ? local.translations.transparent - : local.value.getColorName(COLOR_INTL_TRANSLATIONS)); + mergedProps.colorName ?? + (mergedProps.value.getChannelValue("alpha") === 0 + ? mergedProps.translations.transparent + : mergedProps.value.getColorName(COLOR_INTL_TRANSLATIONS)); - return [colorName, local["aria-label"]].filter(Boolean).join(", "); + return [colorName, mergedProps["aria-label"]].filter(Boolean).join(", "); }; return ( as="div" role="img" - aria-roledescription={local.translations.roleDescription} + aria-roledescription={mergedProps.translations.roleDescription} aria-label={ariaLabel()} style={combineStyle( { - "background-color": local.value.toString("css"), + "background-color": mergedProps.value.toString("css"), "forced-color-adjust": "none", }, - local.style, + mergedProps.style, )} {...others} /> diff --git a/packages/core/src/color-swatch/index.tsx b/packages/core/src/color-swatch/index.tsx index e2997608..13558d57 100644 --- a/packages/core/src/color-swatch/index.tsx +++ b/packages/core/src/color-swatch/index.tsx @@ -7,10 +7,10 @@ import { } from "./color-swatch-root"; export type { - ColorSwatchRootOptions, ColorSwatchRootCommonProps, - ColorSwatchRootRenderProps, + ColorSwatchRootOptions, ColorSwatchRootProps, + ColorSwatchRootRenderProps, }; export { Root }; diff --git a/packages/core/src/color-swatch/stories/color-swatch.stories.tsx b/packages/core/src/color-swatch/stories/color-swatch.stories.tsx new file mode 100644 index 00000000..fa9f7cf4 --- /dev/null +++ b/packages/core/src/color-swatch/stories/color-swatch.stories.tsx @@ -0,0 +1,175 @@ +import type { Color } from "@solid-primitives/utils/colors"; +import { + colorScale, + parseColor, + perceptualColorScale, +} from "@solid-primitives/utils/colors"; +import { createSignal, For } from "solid-js"; +import preview from "../../../../../.storybook/preview.js"; +import { Root } from "../index"; + +const meta = preview.meta({ + title: "Components/ColorSwatch", + tags: ["autodocs"], + argTypes: { + color: { control: "color" }, + size: { + control: "select", + options: ["sm", "md", "lg"], + }, + }, + args: { + color: "#3b82f6", + size: "md", + }, +}); + +export default meta; + +const sizeMap = { + sm: "w-6 h-6", + md: "w-10 h-10", + lg: "w-16 h-16", +}; + +/** Single color swatch — the basic use case. */ +export const Default = meta.story({ + name: "Default", + args: { color: "#3b82f6", size: "md" }, + render: (args) => { + const color = () => { + try { + return parseColor(args.color as string); + } catch { + return parseColor("#3b82f6"); + } + }; + return ( + + ); + }, +}); + +/** A palette of swatches from a perceptual color scale. */ +export const Palette = meta.story({ + name: "Palette", + render: () => { + const scale = perceptualColorScale( + parseColor("#ef4444"), + parseColor("#3b82f6"), + 7, + ); + return ( +
+ + {(color) => ( + + )} + +
+ ); + }, +}); + +/** A standard RGB color scale using colorScale. */ +export const ColorScale = meta.story({ + name: "Color Scale", + render: () => { + const scale = colorScale(parseColor("#000000"), parseColor("#ffffff"), 9); + return ( +
+ + {(color) => ( + + )} + +
+ ); + }, +}); + +/** Transparent / zero-alpha swatch. */ +export const Transparent = meta.story({ + name: "Transparent", + render: () => ( + + ), +}); + +/** Interactive swatch grid — click to select. */ +function SelectableSwatchDemo() { + const palette: Color[] = [ + "#ef4444", + "#f97316", + "#eab308", + "#22c55e", + "#3b82f6", + "#a855f7", + "#ec4899", + "#64748b", + ].map(parseColor); + + const [selected, setSelected] = createSignal(palette[4]); + + return ( +
+
+ + {(color) => ( + + )} + +
+

+ Selected: {selected().toString("hex")} +

+
+ ); +} + +export const Selectable = meta.story({ + name: "Selectable", + render: () => , +}); + +/** Custom color name override. */ +export const CustomName = meta.story({ + name: "Custom Name", + render: () => ( +
+ + Midnight Navy +
+ ), +}); diff --git a/packages/core/src/color-wheel/color-wheel-context.tsx b/packages/core/src/color-wheel/color-wheel-context.tsx index 61358693..dcd6a5c4 100644 --- a/packages/core/src/color-wheel/color-wheel-context.tsx +++ b/packages/core/src/color-wheel/color-wheel-context.tsx @@ -1,5 +1,5 @@ +import type { Color } from "@solid-primitives/utils/colors"; import { type Accessor, createContext, useContext } from "solid-js"; -import type { Color } from "../colors"; import type { ColorWheelState } from "./create-color-wheel-state"; export interface ColorWheelContextValue { diff --git a/packages/core/src/color-wheel/color-wheel-input.tsx b/packages/core/src/color-wheel/color-wheel-input.tsx index 4a2c0232..16750f18 100644 --- a/packages/core/src/color-wheel/color-wheel-input.tsx +++ b/packages/core/src/color-wheel/color-wheel-input.tsx @@ -3,12 +3,12 @@ import { mergeDefaultProps, visuallyHiddenStyles, } from "@kobalte/utils"; -import { type ComponentProps, type JSX, splitProps } from "solid-js"; - import { combineStyle } from "@solid-primitives/props"; +import type { ComponentProps, JSX } from "@solidjs/web"; +import { omit } from "solid-js"; import { - FORM_CONTROL_FIELD_PROP_NAMES, createFormControlField, + FORM_CONTROL_FIELD_PROP_NAMES, useFormControlContext, } from "../form-control"; import { useColorWheelContext } from "./color-wheel-context"; @@ -28,18 +28,24 @@ export function ColorWheelInput(props: ColorWheelInputProps) { props, ); - const [local, formControlFieldProps, others] = splitProps( + const formControlFieldProps = omit(mergedProps, "style", "onChange"); + const others = omit( mergedProps, - ["style", "onChange"], - FORM_CONTROL_FIELD_PROP_NAMES, + "style", + "onChange", + ...FORM_CONTROL_FIELD_PROP_NAMES, ); - const { fieldProps } = createFormControlField(formControlFieldProps); + const { fieldProps } = createFormControlField(formControlFieldProps as any); - const onChange: JSX.EventHandlerUnion = (e) => { + const onChange: JSX.ChangeEventHandlerUnion = ( + e, + ) => { callHandler( - e, - local.onChange as JSX.EventHandlerUnion, + e as Event & { currentTarget: HTMLInputElement; target: Element }, + mergedProps.onChange as + | JSX.EventHandlerUnion + | undefined, ); const target = e.target as HTMLInputElement; @@ -59,7 +65,7 @@ export function ColorWheelInput(props: ColorWheelInputProps) { type="range" id={fieldProps.id()} name={formControlContext.name()} - tabIndex={context.state.isDisabled() ? undefined : -1} + tabindex={context.state.isDisabled() ? undefined : -1} min={context.state.minValue()} max={context.state.maxValue()} step={context.state.step()} @@ -67,17 +73,17 @@ export function ColorWheelInput(props: ColorWheelInputProps) { required={formControlContext.isRequired()} disabled={formControlContext.isDisabled()} readonly={formControlContext.isReadOnly()} - style={combineStyle({ ...visuallyHiddenStyles }, local.style)} + style={combineStyle({ ...visuallyHiddenStyles }, mergedProps.style)} aria-valuetext={context.getThumbValueLabel()} aria-label={fieldProps.ariaLabel()} aria-labelledby={fieldProps.ariaLabelledBy()} aria-describedby={fieldProps.ariaDescribedBy()} aria-invalid={ - formControlContext.validationState() === "invalid" || undefined + formControlContext.validationState() === "invalid" ? "true" : undefined } - aria-required={formControlContext.isRequired() || undefined} - aria-disabled={formControlContext.isDisabled() || undefined} - aria-readonly={formControlContext.isReadOnly() || undefined} + aria-required={formControlContext.isRequired() ? "true" : undefined} + aria-disabled={formControlContext.isDisabled() ? "true" : undefined} + aria-readonly={formControlContext.isReadOnly() ? "true" : undefined} onChange={onChange} {...formControlContext.dataset()} {...others} diff --git a/packages/core/src/color-wheel/color-wheel-root.tsx b/packages/core/src/color-wheel/color-wheel-root.tsx index 1dc60b07..4cff66ed 100644 --- a/packages/core/src/color-wheel/color-wheel-root.tsx +++ b/packages/core/src/color-wheel/color-wheel-root.tsx @@ -1,26 +1,25 @@ import { - type ValidationState, access, createGenerateId, mergeDefaultProps, mergeRefs, + type ValidationState, } from "@kobalte/utils"; +import { createFormResetListener } from "@solid-primitives/form"; +import { createElementSize } from "@solid-primitives/resize-observer"; + import { - type ValidComponent, - createEffect, - createMemo, - createSignal, - createUniqueId, - splitProps, -} from "solid-js"; - -import { COLOR_INTL_TRANSLATIONS, type ColorIntlTranslations } from "../colors"; -import type { Color } from "../colors"; + COLOR_INTL_TRANSLATIONS, + type Color, + type ColorIntlTranslations, +} from "@solid-primitives/utils/colors"; +import type { ValidComponent } from "@solidjs/web"; +import { createMemo, createSignal, createUniqueId, omit } from "solid-js"; import { + createFormControl, FORM_CONTROL_PROP_NAMES, FormControlContext, type FormControlDataSet, - createFormControl, } from "../form-control"; import { useLocale } from "../i18n"; import { @@ -28,8 +27,6 @@ import { Polymorphic, type PolymorphicProps, } from "../polymorphic"; -import { createFormResetListener } from "../primitives"; -import { createSize } from "../primitives/create-size"; import { ColorWheelContext, type ColorWheelContextValue, @@ -121,20 +118,28 @@ export function ColorWheelRoot( props as ColorWheelRootProps, ); - const [local, formControlProps, others] = splitProps( + const formControlProps = omit( + mergedProps, + "ref", + "value", + "defaultValue", + "thickness", + "onChange", + "onChangeEnd", + "getValueLabel", + "translations", + ); + const others = omit( mergedProps, - [ - "ref", - "value", - "defaultValue", - "thickness", - "onChange", - "onChangeEnd", - "getValueLabel", - "translations", - "disabled", - ], - FORM_CONTROL_PROP_NAMES, + "ref", + "value", + "defaultValue", + "thickness", + "onChange", + "onChangeEnd", + "getValueLabel", + "translations", + ...FORM_CONTROL_PROP_NAMES, ); const { formControlContext } = createFormControl(formControlProps); @@ -143,23 +148,23 @@ export function ColorWheelRoot( const [trackRef, setTrackRef] = createSignal(); const [thumbRef, setThumbRef] = createSignal(); - const size = createSize(trackRef); + const size = createElementSize(trackRef); const outerRadius = createMemo(() => { - if (size.width() === 0) return undefined; + if (size.width === null) return undefined; - return size.width() / 2; + return size.width / 2; }); const thumbRadius = () => - ((139.75 - (local.thickness / 100) * 70) * outerRadius()!) / 140; + ((139.75 - (mergedProps.thickness / 100) * 70) * outerRadius()!) / 140; const state = createColorWheelState({ - value: () => local.value, - defaultValue: () => local.defaultValue, + value: () => mergedProps.value, + defaultValue: () => mergedProps.defaultValue, thumbRadius, - onChange: local.onChange, - onChangeEnd: local.onChangeEnd, + onChange: mergedProps.onChange, + onChangeEnd: mergedProps.onChangeEnd, isDisabled: () => formControlContext.isDisabled() ?? false, }); @@ -185,7 +190,7 @@ export function ColorWheelRoot( currentPosition.x += deltaX; currentPosition.y += deltaY; state.setThumbValue(currentPosition.x, currentPosition.y, thumbRadius()); - local.onChange?.(state.value()); + mergedProps.onChange?.(state.value()); }; const onDragEnd = () => { @@ -194,7 +199,7 @@ export function ColorWheelRoot( }; const getThumbValueLabel = () => - `${state.value().formatChannelValue("hue")}, ${context.state.value().getHueName(local.translations)}`; + `${state.value().formatChannelValue("hue")}, ${context.state.value().getHueName(mergedProps.translations)}`; const onHomeKeyDown = (event: KeyboardEvent) => { if (!formControlContext.isDisabled()) { @@ -270,12 +275,12 @@ export function ColorWheelRoot( const context: ColorWheelContextValue = { state, outerRadius, - thickness: () => local.thickness, + thickness: () => mergedProps.thickness, onDragStart, onDrag, onDragEnd, getThumbValueLabel, - getValueLabel: local.getValueLabel, + getValueLabel: mergedProps.getValueLabel, onStepKeyDown, trackRef, setTrackRef, @@ -285,17 +290,17 @@ export function ColorWheelRoot( }; return ( - - + + as="div" - ref={mergeRefs(setRef, local.ref)} + ref={mergeRefs(setRef, mergedProps.ref)} role="group" id={access(formControlProps.id)!} {...formControlContext.dataset()} {...others} /> - - + + ); } diff --git a/packages/core/src/color-wheel/color-wheel-thumb.tsx b/packages/core/src/color-wheel/color-wheel-thumb.tsx index 4a08b542..8341d7db 100644 --- a/packages/core/src/color-wheel/color-wheel-thumb.tsx +++ b/packages/core/src/color-wheel/color-wheel-thumb.tsx @@ -1,14 +1,10 @@ import { callHandler, mergeDefaultProps, mergeRefs } from "@kobalte/utils"; import { combineStyle } from "@solid-primitives/props"; +import type { JSX, ValidComponent } from "@solidjs/web"; +import { createSignal, omit } from "solid-js"; import { - type JSX, - type ValidComponent, - createSignal, - splitProps, -} from "solid-js"; -import { - FORM_CONTROL_FIELD_PROP_NAMES, createFormControlField, + FORM_CONTROL_FIELD_PROP_NAMES, useFormControlContext, } from "../form-control"; import { @@ -36,7 +32,7 @@ export interface ColorWheelThumbCommonProps< export interface ColorWheelThumbRenderProps extends ColorWheelThumbCommonProps { role: "slider"; - tabIndex: 0 | undefined; + tabindex: 0 | undefined; "aria-valuetext": string; "aria-valuemin": number; "aria-valuenow": number | undefined; @@ -60,16 +56,28 @@ export function ColorWheelThumb( props as ColorWheelThumbProps, ); - const [local, formControlFieldProps, others] = splitProps( + const formControlFieldProps = omit( + mergedProps, + "style", + "onKeyDown", + "onPointerDown", + "onPointerMove", + "onPointerUp", + ); + const others = omit( mergedProps, - ["style", "onKeyDown", "onPointerDown", "onPointerMove", "onPointerUp"], - FORM_CONTROL_FIELD_PROP_NAMES, + "style", + "onKeyDown", + "onPointerDown", + "onPointerMove", + "onPointerUp", + ...FORM_CONTROL_FIELD_PROP_NAMES, ); const { fieldProps } = createFormControlField(formControlFieldProps); const onKeyDown: JSX.EventHandlerUnion = (e) => { - callHandler(e, local.onKeyDown); + callHandler(e, mergedProps.onKeyDown); context.onStepKeyDown(e); }; @@ -88,7 +96,7 @@ export function ColorWheelThumb( const onPointerDown: JSX.EventHandlerUnion = ( e, ) => { - callHandler(e, local.onPointerDown); + callHandler(e, mergedProps.onPointerDown); const target = e.currentTarget as HTMLElement; @@ -104,7 +112,7 @@ export function ColorWheelThumb( const onPointerMove: JSX.EventHandlerUnion = (e) => { e.stopPropagation(); - callHandler(e, local.onPointerMove); + callHandler(e, mergedProps.onPointerMove); const target = e.currentTarget as HTMLElement; @@ -121,7 +129,7 @@ export function ColorWheelThumb( const onPointerUp: JSX.EventHandlerUnion = (e) => { e.stopPropagation(); - callHandler(e, local.onPointerUp); + callHandler(e, mergedProps.onPointerUp); const target = e.currentTarget as HTMLElement; @@ -137,7 +145,7 @@ export function ColorWheelThumb( ref={mergeRefs(context.setThumbRef, props.ref)} role="slider" id={fieldProps.id()} - tabIndex={context.state.isDisabled() ? undefined : 0} + tabindex={context.state.isDisabled() ? undefined : 0} style={combineStyle( { position: "absolute", @@ -150,7 +158,7 @@ export function ColorWheelThumb( transition: "opacity .1s linear", "--kb-color-current": context.state.value().toString(), }, - local.style, + mergedProps.style, )} aria-valuetext={context.getThumbValueLabel()} aria-valuemin={context.state.minValue()} diff --git a/packages/core/src/color-wheel/color-wheel-track.tsx b/packages/core/src/color-wheel/color-wheel-track.tsx index 4e3b46df..59733e50 100644 --- a/packages/core/src/color-wheel/color-wheel-track.tsx +++ b/packages/core/src/color-wheel/color-wheel-track.tsx @@ -1,12 +1,7 @@ import { callHandler, mergeRefs } from "@kobalte/utils"; import { combineStyle } from "@solid-primitives/props"; -import { - type JSX, - type ValidComponent, - createMemo, - createSignal, - splitProps, -} from "solid-js"; +import type { JSX, ValidComponent } from "@solidjs/web"; +import { createMemo, createSignal, omit } from "solid-js"; import { type FormControlDataSet, useFormControlContext, @@ -43,12 +38,13 @@ export function ColorWheelTrack( const context = useColorWheelContext(); const formControlContext = useFormControlContext(); - const [local, others] = splitProps(props, [ + const others = omit( + props, "style", "onPointerDown", "onPointerMove", "onPointerUp", - ]); + ); const [sRect, setRect] = createSignal(); @@ -66,7 +62,12 @@ export function ColorWheelTrack( const onPointerDown: JSX.EventHandlerUnion = ( e, ) => { - callHandler(e, local.onPointerDown); + callHandler( + e, + props.onPointerDown as + | JSX.EventHandlerUnion + | undefined, + ); const target = e.target as HTMLElement; target.setPointerCapture(e.pointerId); @@ -80,7 +81,12 @@ export function ColorWheelTrack( const onPointerMove: JSX.EventHandlerUnion = ( e, ) => { - callHandler(e, local.onPointerMove); + callHandler( + e, + props.onPointerMove as + | JSX.EventHandlerUnion + | undefined, + ); const target = e.target as HTMLElement; @@ -94,7 +100,12 @@ export function ColorWheelTrack( }; const onPointerUp: JSX.EventHandlerUnion = (e) => { - callHandler(e, local.onPointerUp); + callHandler( + e, + props.onPointerUp as + | JSX.EventHandlerUnion + | undefined, + ); const target = e.target as HTMLElement; @@ -124,7 +135,7 @@ export function ColorWheelTrack( "clip-path": "circle(50%)", mask: `radial-gradient(#0000 ${70 - (context.thickness() / 100) * 70}%, #000 ${70.5 - (context.thickness() / 100) * 70}%)`, }, - local.style, + props.style, )} onPointerDown={onPointerDown} onPointerMove={onPointerMove} diff --git a/packages/core/src/color-wheel/color-wheel-value-label.tsx b/packages/core/src/color-wheel/color-wheel-value-label.tsx index e24bebcb..8be4ac8c 100644 --- a/packages/core/src/color-wheel/color-wheel-value-label.tsx +++ b/packages/core/src/color-wheel/color-wheel-value-label.tsx @@ -1,4 +1,4 @@ -import type { JSX, ValidComponent } from "solid-js"; +import type { JSX, ValidComponent } from "@solidjs/web"; import { type FormControlDataSet, diff --git a/packages/core/src/color-wheel/create-color-wheel-state.ts b/packages/core/src/color-wheel/create-color-wheel-state.ts index 3dcdd002..3d2c3605 100644 --- a/packages/core/src/color-wheel/create-color-wheel-state.ts +++ b/packages/core/src/color-wheel/create-color-wheel-state.ts @@ -1,7 +1,6 @@ import { mergeDefaultProps } from "@kobalte/utils"; +import { type Color, parseColor } from "@solid-primitives/utils/colors"; import { type Accessor, createMemo, createSignal } from "solid-js"; -import type { Color } from "../colors"; -import { parseColor } from "../colors"; import { createControllableSignal } from "../primitives"; import { angleToCartesian, diff --git a/packages/core/src/color-wheel/index.tsx b/packages/core/src/color-wheel/index.tsx index 520310e3..2e78dd31 100644 --- a/packages/core/src/color-wheel/index.tsx +++ b/packages/core/src/color-wheel/index.tsx @@ -50,35 +50,35 @@ import { } from "./color-wheel-value-label"; export type { - ColorWheelDescriptionProps, - ColorWheelDescriptionOptions, ColorWheelDescriptionCommonProps, + ColorWheelDescriptionOptions, + ColorWheelDescriptionProps, ColorWheelDescriptionRenderProps, - ColorWheelErrorMessageOptions, ColorWheelErrorMessageCommonProps, - ColorWheelErrorMessageRenderProps, + ColorWheelErrorMessageOptions, ColorWheelErrorMessageProps, + ColorWheelErrorMessageRenderProps, ColorWheelInputProps, - ColorWheelLabelOptions, ColorWheelLabelCommonProps, - ColorWheelLabelRenderProps, + ColorWheelLabelOptions, ColorWheelLabelProps, - ColorWheelRootOptions, + ColorWheelLabelRenderProps, ColorWheelRootCommonProps, - ColorWheelRootRenderProps, + ColorWheelRootOptions, ColorWheelRootProps, - ColorWheelThumbOptions, + ColorWheelRootRenderProps, ColorWheelThumbCommonProps, - ColorWheelThumbRenderProps, + ColorWheelThumbOptions, ColorWheelThumbProps, - ColorWheelTrackOptions, + ColorWheelThumbRenderProps, ColorWheelTrackCommonProps, - ColorWheelTrackRenderProps, + ColorWheelTrackOptions, ColorWheelTrackProps, - ColorWheelValueLabelOptions, + ColorWheelTrackRenderProps, ColorWheelValueLabelCommonProps, - ColorWheelValueLabelRenderProps, + ColorWheelValueLabelOptions, ColorWheelValueLabelProps, + ColorWheelValueLabelRenderProps, }; export { Description, @@ -105,6 +105,6 @@ export const ColorWheel = Object.assign(Root, { * API will most probably change */ export { - useColorWheelContext, type ColorWheelContextValue, + useColorWheelContext, } from "./color-wheel-context"; diff --git a/packages/core/src/color-wheel/stories/color-wheel.stories.tsx b/packages/core/src/color-wheel/stories/color-wheel.stories.tsx new file mode 100644 index 00000000..e639f15f --- /dev/null +++ b/packages/core/src/color-wheel/stories/color-wheel.stories.tsx @@ -0,0 +1,197 @@ +import type { Color } from "@solid-primitives/utils/colors"; +import { parseColor } from "@solid-primitives/utils/colors"; +import { createSignal } from "solid-js"; +import preview from "../../../../../.storybook/preview.js"; +import { + Description, + ErrorMessage, + Input, + Label, + Root, + Thumb, + Track, + ValueLabel, +} from "../index"; + +const meta = preview.meta({ + title: "Components/ColorWheel", + tags: ["autodocs"], + argTypes: { + thickness: { control: { type: "range", min: 10, max: 80, step: 5 } }, + disabled: { control: "boolean" }, + }, + args: { + thickness: 28, + disabled: false, + }, +}); + +export default meta; + +const thumbClass = + "w-5 h-5 rounded-full border-2 border-white shadow-md cursor-grab " + + "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white " + + "forced-colors:forced-color-adjust-none"; +const labelClass = "text-sm font-medium text-slate-700"; +const errorClass = "text-xs text-red-600"; +const descClass = "text-xs text-slate-500"; + +/** Standard color wheel with controls. */ +export const Default = meta.story({ + name: "Default", + args: { thickness: 28, disabled: false }, + render: (args) => ( +
+ + + + + + + + + +
+ ), +}); + +/** Controlled wheel — hue synced to a signal. */ +function ControlledDemo() { + const [color, setColor] = createSignal( + parseColor("hsl(120, 80%, 50%)"), + ); + return ( +
+ + + + + + + +
+

+ Hue: {Math.round(color().getChannelValue("hue"))}° +

+
+ ); +} + +export const Controlled = meta.story({ + name: "Controlled", + render: () => , +}); + +/** Thin track variant. */ +export const ThinTrack = meta.story({ + name: "Thin Track", + render: () => ( + + + + + + + + ), +}); + +/** Thick track variant. */ +export const ThickTrack = meta.story({ + name: "Thick Track", + render: () => ( + + + + + + + + ), +}); + +/** Disabled wheel — not interactive. */ +export const Disabled = meta.story({ + name: "Disabled", + render: () => ( + + + + + + + + ), +}); + +/** Wheel with label, value label, description and error. */ +export const WithValidation = meta.story({ + name: "With Validation", + render: () => ( +
+ + + + + + + + + Select a cool hue (180–270°). + + + Please select a blue or purple hue. + + +
+ ), +}); diff --git a/packages/core/src/colors/index.tsx b/packages/core/src/colors/index.tsx deleted file mode 100644 index 8b520e86..00000000 --- a/packages/core/src/colors/index.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./intl"; -export * from "./types"; -export * from "./utils"; diff --git a/packages/core/src/colors/intl.ts b/packages/core/src/colors/intl.ts deleted file mode 100644 index e8662ca1..00000000 --- a/packages/core/src/colors/intl.ts +++ /dev/null @@ -1,47 +0,0 @@ -export const COLOR_INTL_TRANSLATIONS = { - hue: "Hue", - saturation: "Saturation", - lightness: "Lightness", - brightness: "Brightness", - red: "Red", - green: "Green", - blue: "Blue", - alpha: "Alpha", - colorName: (lightness: string, chroma: string, hue: string) => - `${lightness} ${chroma} ${hue}`, - transparentColorName: ( - lightness: string, - chroma: string, - hue: string, - percentTransparent: string, - ) => `${lightness} ${chroma} ${hue}, ${percentTransparent} transparent`, - "very dark": "very dark", - dark: "dark", - light: "light", - "very light": "very light", - pale: "pale", - grayish: "grayish", - vibrant: "vibrant", - black: "black", - white: "white", - gray: "gray", - pink: "pink", - "pink red": "pink red", - "red orange": "red orange", - brown: "brown", - orange: "orange", - "orange yellow": "orange yellow", - "brown yellow": "brown yellow", - yellow: "yellow", - "yellow green": "yellow green", - "green cyan": "green cyan", - cyan: "cyan", - "cyan blue": "cyan blue", - "blue purple": "blue purple", - purple: "purple", - "purple magenta": "purple magenta", - magenta: "magenta", - "magenta pink": "magenta pink", -}; - -export type ColorIntlTranslations = typeof COLOR_INTL_TRANSLATIONS; diff --git a/packages/core/src/colors/types.ts b/packages/core/src/colors/types.ts deleted file mode 100644 index 6a0975e6..00000000 --- a/packages/core/src/colors/types.ts +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Portions of this file are based on code from react-spectrum. - * Apache License Version 2.0, Copyright 2020 Adobe. - * - * Credits to the React Spectrum team: - * https://github.com/adobe/react-spectrum/blob/68e305768cb829bab7b9836dded593bd731259f3/packages/%40react-types/color/src/index.d.ts - * - */ - -import type { ColorIntlTranslations } from "./intl"; - -/** A list of supported color formats. */ -export type ColorFormat = - | "hex" - | "hexa" - | "rgb" - | "rgba" - | "hsl" - | "hsla" - | "hsb" - | "hsba"; - -export type ColorSpace = "rgb" | "hsl" | "hsb"; - -/** A list of color channels. */ -export type ColorChannel = - | "hue" - | "saturation" - | "brightness" - | "lightness" - | "red" - | "green" - | "blue" - | "alpha"; - -export type ColorAxes = { - xChannel: ColorChannel; - yChannel: ColorChannel; - zChannel: ColorChannel; -}; - -export interface ColorChannelRange { - /** The minimum value of the color channel. */ - minValue: number; - /** The maximum value of the color channel. */ - maxValue: number; - /** The step value of the color channel, used when incrementing and decrementing. */ - step: number; - /** The page step value of the color channel, used when incrementing and decrementing. */ - pageSize: number; -} - -/** Represents a color value. */ -export interface Color { - /** Converts the color to the given color format, and returns a new Color object. */ - toFormat(format: ColorFormat): Color; - /** Converts the color to a string in the given format. */ - toString(format?: ColorFormat | "css"): string; - /** Returns a duplicate of the color value. */ - clone(): Color; - /** Converts the color to hex, and returns an integer representation. */ - toHexInt(): number; - /** - * Returns the numeric value for a given channel. - * Throws an error if the channel is unsupported in the current color format. - */ - getChannelValue(channel: ColorChannel): number; - /** - * Sets the numeric value for a given channel, and returns a new Color object. - * Throws an error if the channel is unsupported in the current color format. - */ - withChannelValue(channel: ColorChannel, value: number): Color; - /** - * Returns the minimum, maximum, and step values for a given channel. - */ - getChannelRange(channel: ColorChannel): ColorChannelRange; - /** - * Returns a localized color channel name for a given channel and locale, - * for use in visual or accessibility labels. - */ - getChannelName( - channel: ColorChannel, - translations: ColorIntlTranslations, - ): string; - /** - * Returns the number formatting options for the given channel. - */ - getChannelFormatOptions(channel: ColorChannel): Intl.NumberFormatOptions; - /** - * Formats the numeric value for a given channel for display according to the provided locale. - */ - formatChannelValue(channel: ColorChannel): string; - /** - * Returns the color space, 'rgb', 'hsb' or 'hsl', for the current color. - */ - getColorSpace(): ColorSpace; - /** - * Returns the color space axes, xChannel, yChannel, zChannel. - */ - getColorSpaceAxes(xyChannels: { - xChannel?: ColorChannel; - yChannel?: ColorChannel; - }): ColorAxes; - /** - * Returns an array of the color channels within the current color space space. - */ - getColorChannels(): [ColorChannel, ColorChannel, ColorChannel]; - /** - * Returns a localized name for the color, for use in visual or accessibility labels. - */ - getColorName(translations: ColorIntlTranslations): string; - /** - * Returns a localized name for the hue, for use in visual or accessibility labels. - */ - getHueName(translations: ColorIntlTranslations): string; -} diff --git a/packages/core/src/colors/utils.test.ts b/packages/core/src/colors/utils.test.ts deleted file mode 100644 index 34452edb..00000000 --- a/packages/core/src/colors/utils.test.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { describe, expect, it } from "vitest"; -import type { ColorChannel } from "./types"; -import { parseColor } from "./utils"; - -const hexValues = [{ raw: "#000000", string: "#000000" }]; -const hexaValues = [{ raw: "#00000080", string: "#00000080" }]; -const rgbValues = [ - { raw: "rgb(50 100 200)", alpha: false, string: "rgb(50, 100, 200)" }, - { - raw: "rgb(50 100 200 / 0.2)", - alpha: true, - string: "rgb(50, 100, 200 / 0.2)", - }, - { - raw: "rgb(50 100 200 / 20%)", - alpha: true, - string: "rgb(50, 100, 200 / 0.2)", - }, - { - raw: "rgba(50, 100, 200, 0.2)", - alpha: true, - string: "rgb(50, 100, 200 / 0.2)", - }, - { raw: "rgb(50, 100, 200)", alpha: false, string: "rgb(50, 100, 200)" }, - { raw: "rgb(50,100,200)", alpha: false, string: "rgb(50, 100, 200)" }, -]; - -describe("parseColor", () => { - describe("RGBColor", () => { - it.each(rgbValues)("correct parse string %s to color", (item) => { - const result = parseColor(item.raw); - expect(result.getColorSpace()).toBe("rgb"); - expect(result.getColorChannels()).toStrictEqual< - [ColorChannel, ColorChannel, ColorChannel] - >(["red", "green", "blue"]); - }); - - it.each(rgbValues)("correct result toString", (item) => { - const result = parseColor(item.raw); - expect(result.toString()).toBe(item.string); - }); - - it("correct result toString from rgb to hex", () => { - const result = parseColor("rgb(0 0 0)"); - expect(result.toString("hex")).toBe("#000000"); - }); - - it("correct result toString from rgb to hexa", () => { - const result = parseColor("rgb(0 0 0 / 0.5)"); - expect(result.toString("hexa")).toBe("#00000080"); - }); - - it("correct result toString from rgb to hsl", () => { - const result = parseColor("rgb(50 100 200)"); - expect(result.toFormat("hsl").toString("hsl")).toBe( - "hsl(220 60% 49.02%)", - ); - }); - - it("correct result toString from rgb to hsla", () => { - const result = parseColor("rgb(50 100 200 / 0.5)"); - expect(result.toFormat("hsla").toString("hsla")).toBe( - "hsla(220 60% 49.02% / 0.5)", - ); - }); - - it.each(rgbValues)( - "correctly parses and converts to various formats", - (item) => { - const result = parseColor(item.raw); - - // Verify initial color space and channels - expect(result.getColorSpace()).toBe("rgb"); - expect(result.getColorChannels()).toStrictEqual< - [ColorChannel, ColorChannel, ColorChannel] - >(["red", "green", "blue"]); - - // Verify string representation - expect(result.toString()).toBe(item.string); - - // Verify conversion to hex - if (!item.alpha) { - expect(result.toString("hex")).toBe("#3264C8"); - } - - // Verify conversion to hexa - if (item.alpha) { - expect(result.toString("hexa")).toBe("#3264C833"); - } - - // Verify conversion to HSL - const hslResult = result.toFormat("hsl"); - - // Verify conversion to HSLA - if (item.alpha) { - expect(hslResult.toString("hsl")).toBe("hsl(220 60% 49.02% / 0.2)"); - - const hslaResult = result.toFormat("hsla"); - expect(hslaResult.toString("hsla")).toBe( - "hsla(220 60% 49.02% / 0.2)", - ); - } else { - expect(hslResult.toString("hsl")).toBe("hsl(220 60% 49.02%)"); - } - - // Verify conversion to HSB - const hsbResult = result.toFormat("hsb"); - expect(hsbResult.toString("hsb")).toBe("hsb(220 75% 78.43%)"); - - // Verify conversion to HSBA - if (item.alpha) { - const hsbaResult = result.toFormat("hsba"); - expect(hsbaResult.toString("hsba")).toBe("hsba(220 75% 78.43% 0.2)"); - } - }, - ); - - it("throws an error for invalid color strings", () => { - const invalidColors = ["invalid", "#zzzzzz"]; - for (const color of invalidColors) { - expect(() => parseColor(color)).toThrowError( - `Invalid color value: ${color}`, - ); - } - }); - - it("handles edge cases for alpha values", () => { - const result = parseColor("rgb(50 100 200 / 0)"); - expect(result.toFormat("hsba").toString("hsba")).toBe( - "hsba(220 75% 78.43% 0)", - ); - }); - }); -}); diff --git a/packages/core/src/colors/utils.ts b/packages/core/src/colors/utils.ts deleted file mode 100644 index 540f8219..00000000 --- a/packages/core/src/colors/utils.ts +++ /dev/null @@ -1,905 +0,0 @@ -/* - * Portions of this file are based on code from react-spectrum. - * Apache License Version 2.0, Copyright 2020 Adobe. - * - * Credits to the React Spectrum team: - * https://github.com/adobe/react-spectrum/blob/68e305768cb829bab7b9836dded593bd731259f3/packages/%40react-stately/color/src/Color.ts - * - */ - -import { clamp } from "@kobalte/utils"; -import { createNumberFormatter } from "../i18n"; -import type { ColorIntlTranslations } from "./intl"; -import type { - ColorAxes, - ColorChannel, - ColorChannelRange, - ColorFormat, - ColorSpace, - Color as IColor, -} from "./types"; - -/** Parses a color from a string value. Throws an error if the string could not be parsed. */ -export function parseColor(value: string): IColor { - const res = - RGBColor.parse(value) || HSBColor.parse(value) || HSLColor.parse(value); - if (res) { - return res; - } - - throw new Error(`Invalid color value: ${value}`); -} - -export function normalizeColor(v: string | IColor) { - if (typeof v === "string") { - return parseColor(v); - } - return v; -} - -/** Returns a list of color channels for a given color space. */ -export function getColorChannels(colorSpace: ColorSpace) { - switch (colorSpace) { - case "rgb": - return RGBColor.colorChannels; - case "hsl": - return HSLColor.colorChannels; - case "hsb": - return HSBColor.colorChannels; - } -} - -/** - * Returns the hue value normalized to the range of 0 to 360. - */ -export function normalizeHue(hue: number) { - if (hue === 360) { - return hue; - } - - return ((hue % 360) + 360) % 360; -} - -// Lightness threshold between orange and brown. -const ORANGE_LIGHTNESS_THRESHOLD = 0.68; -// Lightness threshold between pure yellow and "yellow green". -const YELLOW_GREEN_LIGHTNESS_THRESHOLD = 0.85; -// The maximum lightness considered to be "dark". -const MAX_DARK_LIGHTNESS = 0.55; -// The chroma threshold between gray and color. -const GRAY_THRESHOLD = 0.001; -const OKLCH_HUES: [number, string][] = [ - [0, "pink"], - [15, "red"], - [48, "orange"], - [94, "yellow"], - [135, "green"], - [175, "cyan"], - [264, "blue"], - [284, "purple"], - [320, "magenta"], - [349, "pink"], -]; - -abstract class Color implements IColor { - abstract toFormat(format: ColorFormat): IColor; - abstract toString(format: ColorFormat | "css"): string; - abstract clone(): IColor; - abstract getChannelRange(channel: ColorChannel): ColorChannelRange; - abstract getChannelFormatOptions( - channel: ColorChannel, - ): Intl.NumberFormatOptions; - abstract formatChannelValue(channel: ColorChannel): string; - - toHexInt(): number { - return this.toFormat("rgb").toHexInt(); - } - - getChannelValue(channel: ColorChannel): number { - if (channel in this) { - //@ts-expect-error - return this[channel]; - } - - throw new Error(`Unsupported color channel: ${channel}`); - } - - withChannelValue(channel: ColorChannel, value: number): IColor { - if (channel in this) { - const x = this.clone(); - //@ts-expect-error - x[channel] = value; - return x; - } - - throw new Error(`Unsupported color channel: ${channel}`); - } - - getChannelName(channel: ColorChannel, translations: ColorIntlTranslations) { - return translations[channel]; - } - - abstract getColorSpace(): ColorSpace; - - getColorSpaceAxes(xyChannels: { - xChannel?: ColorChannel; - yChannel?: ColorChannel; - }): ColorAxes { - const { xChannel, yChannel } = xyChannels; - const xCh = - xChannel || this.getColorChannels().find((c) => c !== yChannel)!; - const yCh = yChannel || this.getColorChannels().find((c) => c !== xCh)!; - const zCh = this.getColorChannels().find((c) => c !== xCh && c !== yCh)!; - - return { xChannel: xCh, yChannel: yCh, zChannel: zCh }; - } - - abstract getColorChannels(): [ColorChannel, ColorChannel, ColorChannel]; - - getColorName(translations: ColorIntlTranslations): string { - // Convert to oklch color space, which has perceptually uniform lightness across all hues. - let [l, c, h] = toOKLCH(this); - - if (l > 0.999) { - return translations.white; - } - - if (l < 0.001) { - return translations.black; - } - - let hue: string; - [hue, l] = this.getOklchHue(l, c, h, translations); - - let lightness = ""; - let chroma = ""; - if (c <= 0.1 && c >= GRAY_THRESHOLD) { - if (l >= 0.7) { - chroma = "pale"; - } else { - chroma = "grayish"; - } - } else if (c >= 0.15) { - chroma = "vibrant"; - } - - if (l < 0.3) { - lightness = "very dark"; - } else if (l < MAX_DARK_LIGHTNESS) { - lightness = "dark"; - } else if (l < 0.7) { - // none - } else if (l < 0.85) { - lightness = "light"; - } else { - lightness = "very light"; - } - - if (chroma) { - //@ts-expect-error - chroma = translations[chroma]; - } - - if (lightness) { - //@ts-expect-error - lightness = translations[lightness]; - } - - const alpha = this.getChannelValue("alpha"); - if (alpha < 1) { - const percentTransparent = createNumberFormatter(() => ({ - style: "percent", - }))().format(1 - alpha); - return translations - .transparentColorName(lightness, chroma, hue, percentTransparent) - .replace(/\s+/g, " ") - .trim(); - } - return translations - .colorName(lightness, chroma, hue) - .replace(/\s+/g, " ") - .trim(); - } - - private getOklchHue( - l: number, - c: number, - h: number, - translations: ColorIntlTranslations, - ): [string, number] { - if (c < GRAY_THRESHOLD) { - return [translations.gray, l]; - } - - for (let i = 0; i < OKLCH_HUES.length; i++) { - let [hue, hueName] = OKLCH_HUES[i]; - const [nextHue, nextHueName] = OKLCH_HUES[i + 1] || [360, "pink"]; - if (h >= hue && h < nextHue) { - // Split orange hue into brown/orange depending on lightness. - if (hueName === "orange") { - if (l < ORANGE_LIGHTNESS_THRESHOLD) { - hueName = "brown"; - } else { - // Adjust lightness. - // biome-ignore lint/style/noParameterAssign: - l = l - ORANGE_LIGHTNESS_THRESHOLD + MAX_DARK_LIGHTNESS; - } - } - - // If the hue is at least halfway to the next hue, add the next hue name as well. - if (h > hue + (nextHue - hue) / 2 && hueName !== nextHueName) { - hueName = `${hueName} ${nextHueName}`; - } else if ( - hueName === "yellow" && - l < YELLOW_GREEN_LIGHTNESS_THRESHOLD - ) { - // Yellow shifts toward green at lower lightnesses. - hueName = "yellow green"; - } - //@ts-expect-error - const name = translations[hueName]; - return [name, l]; - } - } - - throw new Error("Unexpected hue"); - } - - getHueName(translations: ColorIntlTranslations): string { - const [l, c, h] = toOKLCH(this); - const [name] = this.getOklchHue(l, c, h, translations); - return name; - } -} - -class RGBColor extends Color { - constructor( - private red: number, - private green: number, - private blue: number, - private alpha: number, - ) { - super(); - } - - static parse(value: string) { - let colors: Array = []; - // matching #rgb, #rgba, #rrggbb, #rrggbbaa - if (/^#[\da-f]+$/i.test(value) && [4, 5, 7, 9].includes(value.length)) { - const values = ( - value.length < 6 ? value.replace(/[^#]/gi, "$&$&") : value - ) - .slice(1) - .split(""); - while (values.length > 0) { - colors.push(Number.parseInt(values.splice(0, 2).join(""), 16)); - } - colors[3] = colors[3] !== undefined ? colors[3] / 255 : undefined; - } - - // matching rgb(rrr, ggg, bbb), rgba(rrr, ggg, bbb, 0.a), rgb(rrr ggg bbb), rgba(rrr ggg bbb a) - const match = value.match(/^rgba?\((.*)\)$/); - if (match?.[1]) { - colors = match[1] - .replace(/(\d+)%$/u, (_substring, numberValue) => - (Number(numberValue) / 100).toString(), - ) - .replaceAll(/,|\//gu, " ") - .replaceAll(/\s{2,}/gu, " ") - .split(" ") - .map((value) => { - return Number(value.trim()); - }); - colors = colors.map((num, i) => { - return clamp(num ?? 0, 0, i < 3 ? 255 : 1); - }); - } - if ( - colors[0] === undefined || - colors[1] === undefined || - colors[2] === undefined - ) { - return undefined; - } - - return colors.length < 3 - ? undefined - : new RGBColor(colors[0], colors[1], colors[2], colors[3] ?? 1); - } - - toString(format: ColorFormat | "css" = "css") { - switch (format) { - case "hex": - return `#${( - this.red.toString(16).padStart(2, "0") + - this.green.toString(16).padStart(2, "0") + - this.blue.toString(16).padStart(2, "0") - ).toUpperCase()}`; - case "hexa": - return `#${( - this.red.toString(16).padStart(2, "0") + - this.green.toString(16).padStart(2, "0") + - this.blue.toString(16).padStart(2, "0") + - Math.round(this.alpha * 255) - .toString(16) - .padStart(2, "0") - ).toUpperCase()}`; - case "css": - case "rgb": - return `rgb(${this.red}, ${this.green}, ${this.blue}${this.alpha !== 1 && this.alpha !== 100 ? ` / ${this?.alpha}` : ""})`; - case "rgba": - return `rgba(${this.red}, ${this.green}, ${this.blue}, ${this.alpha})`; - default: - return this.toFormat(format).toString(format); - } - } - - toFormat(format: ColorFormat): IColor { - switch (format) { - case "hex": - case "hexa": - case "rgb": - case "rgba": - return this; - case "hsb": - case "hsba": - return this.toHSB(); - case "hsl": - case "hsla": - return this.toHSL(); - default: - throw new Error(`Unsupported color conversion: rgb -> ${format}`); - } - } - - toHexInt(): number { - return (this.red << 16) | (this.green << 8) | this.blue; - } - - /** - * Converts an RGB color value to HSB. - * Conversion formula adapted from https://en.wikipedia.org/wiki/HSL_and_HSV#From_RGB. - * @returns An HSBColor object. - */ - private toHSB(): IColor { - const red = this.red / 255; - const green = this.green / 255; - const blue = this.blue / 255; - const min = Math.min(red, green, blue); - const brightness = Math.max(red, green, blue); - const chroma = brightness - min; - const saturation = brightness === 0 ? 0 : chroma / brightness; - let hue = 0; // achromatic - - if (chroma !== 0) { - switch (brightness) { - case red: - hue = (green - blue) / chroma + (green < blue ? 6 : 0); - break; - case green: - hue = (blue - red) / chroma + 2; - break; - case blue: - hue = (red - green) / chroma + 4; - break; - } - - hue /= 6; - } - - return new HSBColor( - toFixedNumber(hue * 360, 2), - toFixedNumber(saturation * 100, 2), - toFixedNumber(brightness * 100, 2), - this.alpha, - ); - } - - /** - * Converts an RGB color value to HSL. - * Conversion formula adapted from https://en.wikipedia.org/wiki/HSL_and_HSV#From_RGB. - * @returns An HSLColor object. - */ - private toHSL(): IColor { - const red = this.red / 255; - const green = this.green / 255; - const blue = this.blue / 255; - const min = Math.min(red, green, blue); - const max = Math.max(red, green, blue); - const lightness = (max + min) / 2; - const chroma = max - min; - let hue: number; - let saturation: number; - - if (chroma === 0) { - hue = saturation = 0; // achromatic - } else { - saturation = chroma / (lightness < 0.5 ? max + min : 2 - max - min); - - switch (max) { - case red: - hue = (green - blue) / chroma + (green < blue ? 6 : 0); - break; - case green: - hue = (blue - red) / chroma + 2; - break; - default: - hue = (red - green) / chroma + 4; - break; - } - - hue /= 6; - } - - return new HSLColor( - toFixedNumber(hue * 360, 2), - toFixedNumber(saturation * 100, 2), - toFixedNumber(lightness * 100, 2), - this.alpha, - ); - } - - clone(): IColor { - return new RGBColor(this.red, this.green, this.blue, this.alpha); - } - - getChannelRange(channel: ColorChannel): ColorChannelRange { - switch (channel) { - case "red": - case "green": - case "blue": - return { minValue: 0x0, maxValue: 0xff, step: 0x1, pageSize: 0x11 }; - case "alpha": - return { minValue: 0, maxValue: 1, step: 0.01, pageSize: 0.1 }; - default: - throw new Error(`Unknown color channel: ${channel}`); - } - } - - getChannelFormatOptions(channel: ColorChannel): Intl.NumberFormatOptions { - switch (channel) { - case "red": - case "green": - case "blue": - return { style: "decimal" }; - case "alpha": - return { style: "percent", maximumFractionDigits: 2 }; - default: - throw new Error(`Unknown color channel: ${channel}`); - } - } - - formatChannelValue(channel: ColorChannel) { - const options = this.getChannelFormatOptions(channel); - const value = this.getChannelValue(channel); - return createNumberFormatter(() => options)().format(value); - } - - getColorSpace(): ColorSpace { - return "rgb"; - } - - static colorChannels: [ColorChannel, ColorChannel, ColorChannel] = [ - "red", - "green", - "blue", - ]; - getColorChannels(): [ColorChannel, ColorChannel, ColorChannel] { - return RGBColor.colorChannels; - } -} - -// X = -// before/after a comma, 0 or more whitespaces are allowed -// - hsb(X, X%, X%) -// - hsba(X, X%, X%, X) -const HSB_REGEX = - /hsb\(([-+]?\d+(?:.\d+)?\s*,\s*[-+]?\d+(?:.\d+)?%\s*,\s*[-+]?\d+(?:.\d+)?%)\)|hsba\(([-+]?\d+(?:.\d+)?\s*,\s*[-+]?\d+(?:.\d+)?%\s*,\s*[-+]?\d+(?:.\d+)?%\s*,\s*[-+]?\d(.\d+)?)\)/; - -class HSBColor extends Color { - constructor( - private hue: number, - private saturation: number, - private brightness: number, - private alpha: number, - ) { - super(); - } - - static parse(value: string): HSBColor | undefined { - let m: RegExpMatchArray | null; - if ((m = value.match(HSB_REGEX))) { - const [h, s, b, a] = (m[1] ?? m[2]) - .split(",") - .map((n) => Number(n.trim().replace("%", ""))); - return new HSBColor( - normalizeHue(h), - clamp(s, 0, 100), - clamp(b, 0, 100), - clamp(a ?? 1, 0, 1), - ); - } - } - - toString(format: ColorFormat | "css" = "css") { - switch (format) { - case "css": - return this.toHSL().toString("css"); - case "hex": - return this.toRGB().toString("hex"); - case "hexa": - return this.toRGB().toString("hexa"); - case "hsb": - return `hsb(${this.hue} ${toFixedNumber(this.saturation, 2)}% ${toFixedNumber(this.brightness, 2)}%)`; - case "hsba": - return `hsba(${this.hue} ${toFixedNumber(this.saturation, 2)}% ${toFixedNumber(this.brightness, 2)}% ${this.alpha})`; - default: - return this.toFormat(format).toString(format); - } - } - - toFormat(format: ColorFormat): IColor { - switch (format) { - case "hsb": - case "hsba": - return this; - case "hsl": - case "hsla": - return this.toHSL(); - case "rgb": - case "rgba": - return this.toRGB(); - default: - throw new Error(`Unsupported color conversion: hsb -> ${format}`); - } - } - - /** - * Converts a HSB color to HSL. - * Conversion formula adapted from https://en.wikipedia.org/wiki/HSL_and_HSV#HSV_to_HSL. - * @returns An HSLColor object. - */ - private toHSL(): IColor { - let saturation = this.saturation / 100; - const brightness = this.brightness / 100; - const lightness = brightness * (1 - saturation / 2); - saturation = - lightness === 0 || lightness === 1 - ? 0 - : (brightness - lightness) / Math.min(lightness, 1 - lightness); - - return new HSLColor( - toFixedNumber(this.hue, 2), - toFixedNumber(saturation * 100, 2), - toFixedNumber(lightness * 100, 2), - this.alpha, - ); - } - - /** - * Converts a HSV color value to RGB. - * Conversion formula adapted from https://en.wikipedia.org/wiki/HSL_and_HSV#HSV_to_RGB_alternative. - * @returns An RGBColor object. - */ - private toRGB(): IColor { - const hue = this.hue; - const saturation = this.saturation / 100; - const brightness = this.brightness / 100; - const fn = (n: number, k = (n + hue / 60) % 6) => - brightness - saturation * brightness * Math.max(Math.min(k, 4 - k, 1), 0); - return new RGBColor( - Math.round(fn(5) * 255), - Math.round(fn(3) * 255), - Math.round(fn(1) * 255), - this.alpha, - ); - } - - clone(): IColor { - return new HSBColor(this.hue, this.saturation, this.brightness, this.alpha); - } - - getChannelRange(channel: ColorChannel): ColorChannelRange { - switch (channel) { - case "hue": - return { minValue: 0, maxValue: 360, step: 1, pageSize: 15 }; - case "saturation": - case "brightness": - return { minValue: 0, maxValue: 100, step: 1, pageSize: 10 }; - case "alpha": - return { minValue: 0, maxValue: 1, step: 0.01, pageSize: 0.1 }; - default: - throw new Error(`Unknown color channel: ${channel}`); - } - } - - getChannelFormatOptions(channel: ColorChannel): Intl.NumberFormatOptions { - switch (channel) { - case "hue": - return { style: "unit", unit: "degree", unitDisplay: "narrow" }; - case "saturation": - case "brightness": - case "alpha": - return { style: "percent", maximumFractionDigits: 2 }; - default: - throw new Error(`Unknown color channel: ${channel}`); - } - } - - formatChannelValue(channel: ColorChannel) { - const options = this.getChannelFormatOptions(channel); - let value = this.getChannelValue(channel); - if (channel === "saturation" || channel === "brightness") { - value /= 100; - } - return createNumberFormatter(() => options)().format(value); - } - - getColorSpace(): ColorSpace { - return "hsb"; - } - - static colorChannels: [ColorChannel, ColorChannel, ColorChannel] = [ - "hue", - "saturation", - "brightness", - ]; - getColorChannels(): [ColorChannel, ColorChannel, ColorChannel] { - return HSBColor.colorChannels; - } -} - -// X = -// before/after a comma, 0 or more whitespaces are allowed -// - hsl(X, X%, X%) -// - hsla(X, X%, X%, X) -const HSL_REGEX = - /hsl\(([-+]?\d+(?:.\d+)?\s*,\s*[-+]?\d+(?:.\d+)?%\s*,\s*[-+]?\d+(?:.\d+)?%)\)|hsla\(([-+]?\d+(?:.\d+)?\s*,\s*[-+]?\d+(?:.\d+)?%\s*,\s*[-+]?\d+(?:.\d+)?%\s*,\s*[-+]?\d(.\d+)?)\)/; - -class HSLColor extends Color { - constructor( - private hue: number, - private saturation: number, - private lightness: number, - private alpha: number, - ) { - super(); - } - - static parse(value: string): HSLColor | undefined { - let m: RegExpMatchArray | null; - if ((m = value.match(HSL_REGEX))) { - const [h, s, l, a] = (m[1] ?? m[2]) - .split(",") - .map((n) => Number(n.trim().replace("%", ""))); - return new HSLColor( - normalizeHue(h), - clamp(s, 0, 100), - clamp(l, 0, 100), - clamp(a ?? 1, 0, 1), - ); - } - } - - toString(format: ColorFormat | "css" = "css") { - switch (format) { - case "hex": - return this.toRGB().toString("hex"); - case "hexa": - return this.toRGB().toString("hexa"); - case "hsl": - return `hsl(${this.hue} ${toFixedNumber(this.saturation, 2)}% ${toFixedNumber(this.lightness, 2)}%${this.alpha !== 1 && this.alpha !== 100 ? ` / ${this.alpha}` : ""})`; - case "css": - case "hsla": - return `hsla(${this.hue} ${toFixedNumber(this.saturation, 2)}% ${toFixedNumber(this.lightness, 2)}% / ${this.alpha})`; - default: - return this.toFormat(format).toString(format); - } - } - toFormat(format: ColorFormat): IColor { - switch (format) { - case "hsl": - case "hsla": - return this; - case "hsb": - case "hsba": - return this.toHSB(); - case "rgb": - case "rgba": - return this.toRGB(); - default: - throw new Error(`Unsupported color conversion: hsl -> ${format}`); - } - } - - /** - * Converts a HSL color to HSB. - * Conversion formula adapted from https://en.wikipedia.org/wiki/HSL_and_HSV#HSL_to_HSV. - * @returns An HSBColor object. - */ - private toHSB(): IColor { - let saturation = this.saturation / 100; - const lightness = this.lightness / 100; - const brightness = - lightness + saturation * Math.min(lightness, 1 - lightness); - saturation = brightness === 0 ? 0 : 2 * (1 - lightness / brightness); - return new HSBColor( - toFixedNumber(this.hue, 2), - toFixedNumber(saturation * 100, 2), - toFixedNumber(brightness * 100, 2), - this.alpha, - ); - } - - /** - * Converts a HSL color to RGB. - * Conversion formula adapted from https://en.wikipedia.org/wiki/HSL_and_HSV#HSL_to_RGB_alternative. - * @returns An RGBColor object. - */ - private toRGB(): IColor { - const hue = this.hue; - const saturation = this.saturation / 100; - const lightness = this.lightness / 100; - const a = saturation * Math.min(lightness, 1 - lightness); - const fn = (n: number, k = (n + hue / 30) % 12) => - lightness - a * Math.max(Math.min(k - 3, 9 - k, 1), -1); - return new RGBColor( - Math.round(fn(0) * 255), - Math.round(fn(8) * 255), - Math.round(fn(4) * 255), - this.alpha, - ); - } - - clone(): IColor { - return new HSLColor(this.hue, this.saturation, this.lightness, this.alpha); - } - - getChannelRange(channel: ColorChannel): ColorChannelRange { - switch (channel) { - case "hue": - return { minValue: 0, maxValue: 360, step: 1, pageSize: 15 }; - case "saturation": - case "lightness": - return { minValue: 0, maxValue: 100, step: 1, pageSize: 10 }; - case "alpha": - return { minValue: 0, maxValue: 1, step: 0.01, pageSize: 0.1 }; - default: - throw new Error(`Unknown color channel: ${channel}`); - } - } - - getChannelFormatOptions(channel: ColorChannel): Intl.NumberFormatOptions { - switch (channel) { - case "hue": - return { style: "unit", unit: "degree", unitDisplay: "narrow" }; - case "saturation": - case "lightness": - case "alpha": - return { style: "percent", maximumFractionDigits: 2 }; - default: - throw new Error(`Unknown color channel: ${channel}`); - } - } - - formatChannelValue(channel: ColorChannel) { - const options = this.getChannelFormatOptions(channel); - let value = this.getChannelValue(channel); - if (channel === "saturation" || channel === "lightness") { - value /= 100; - } - return createNumberFormatter(() => options)().format(value); - } - - getColorSpace(): ColorSpace { - return "hsl"; - } - - static colorChannels: [ColorChannel, ColorChannel, ColorChannel] = [ - "hue", - "saturation", - "lightness", - ]; - getColorChannels(): [ColorChannel, ColorChannel, ColorChannel] { - return HSLColor.colorChannels; - } -} - -// https://www.w3.org/TR/css-color-4/#color-conversion-code -function toOKLCH(color: Color) { - const rgb = color.toFormat("rgb"); - let red = rgb.getChannelValue("red") / 255; - let green = rgb.getChannelValue("green") / 255; - let blue = rgb.getChannelValue("blue") / 255; - [red, green, blue] = lin_sRGB(red, green, blue); - const [x, y, z] = lin_sRGB_to_XYZ(red, green, blue); - const [l, a, b] = XYZ_to_OKLab(x, y, z); - return OKLab_to_OKLCH(l, a, b); -} - -function OKLab_to_OKLCH( - l: number, - a: number, - b: number, -): [number, number, number] { - const hue = (Math.atan2(b, a) * 180) / Math.PI; - return [ - l, - Math.sqrt(a ** 2 + b ** 2), // Chroma - hue >= 0 ? hue : hue + 360, // Hue, in degrees [0 to 360) - ]; -} - -function lin_sRGB(r: number, g: number, b: number): [number, number, number] { - // convert an array of sRGB values - // where in-gamut values are in the range [0 - 1] - // to linear light (un-companded) form. - // https://en.wikipedia.org/wiki/SRGB - // Extended transfer function: - // for negative values, linear portion is extended on reflection of axis, - // then reflected power function is used. - return [lin_sRGB_component(r), lin_sRGB_component(g), lin_sRGB_component(b)]; -} - -function lin_sRGB_component(val: number) { - const sign = val < 0 ? -1 : 1; - const abs = Math.abs(val); - - if (abs <= 0.04045) { - return val / 12.92; - } - - return sign * ((abs + 0.055) / 1.055) ** 2.4; -} - -function lin_sRGB_to_XYZ(r: number, g: number, b: number) { - // convert an array of linear-light sRGB values to CIE XYZ - // using sRGB's own white, D65 (no chromatic adaptation) - const M = [ - 506752 / 1228815, - 87881 / 245763, - 12673 / 70218, - 87098 / 409605, - 175762 / 245763, - 12673 / 175545, - 7918 / 409605, - 87881 / 737289, - 1001167 / 1053270, - ]; - return multiplyMatrix(M, r, g, b); -} - -function XYZ_to_OKLab(x: number, y: number, z: number) { - // Given XYZ relative to D65, convert to OKLab - const XYZtoLMS = [ - 0.819022437996703, 0.3619062600528904, -0.1288737815209879, - 0.0329836539323885, 0.9292868615863434, 0.0361446663506424, - 0.0481771893596242, 0.2642395317527308, 0.6335478284694309, - ]; - const LMStoOKLab = [ - 0.210454268309314, 0.7936177747023054, -0.0040720430116193, - 1.9779985324311684, -2.4285922420485799, 0.450593709617411, - 0.0259040424655478, 0.7827717124575296, -0.8086757549230774, - ]; - - const [a, b, c] = multiplyMatrix(XYZtoLMS, x, y, z); - return multiplyMatrix(LMStoOKLab, Math.cbrt(a), Math.cbrt(b), Math.cbrt(c)); -} - -function multiplyMatrix( - m: number[], - x: number, - y: number, - z: number, -): [number, number, number] { - const a = m[0] * x + m[1] * y + m[2] * z; - const b = m[3] * x + m[4] * y + m[5] * z; - const c = m[6] * x + m[7] * y + m[8] * z; - return [a, b, c]; -} - -function toFixedNumber(value: number, digits: number, base = 10): number { - const pow = base ** digits; - - return Math.round(value * pow) / pow; -} diff --git a/packages/core/src/combobox/combobox-base.tsx b/packages/core/src/combobox/combobox-base.tsx index 74622890..718e0a71 100644 --- a/packages/core/src/combobox/combobox-base.tsx +++ b/packages/core/src/combobox/combobox-base.tsx @@ -8,36 +8,34 @@ */ import { - type ValidationState, access, createGenerateId, focusWithoutScrolling, isAppleDevice, isFunction, mergeDefaultProps, + type ValidationState, } from "@kobalte/utils"; +import { createFormResetListener } from "@solid-primitives/form"; +import { createPresence } from "@solid-primitives/presence"; +import type { JSX, ValidComponent } from "@solidjs/web"; import { type Accessor, type Component, - type JSX, - type ValidComponent, createEffect, createMemo, createSignal, createUniqueId, - on, - splitProps, + omit, } from "solid-js"; - -import createPresence from "solid-presence"; import { + createFormControl, FORM_CONTROL_PROP_NAMES, FormControlContext, type FormControlDataSet, - createFormControl, } from "../form-control"; import { createFilter } from "../i18n"; -import { ListKeyboardDelegate, createListState } from "../list"; +import { createListState, ListKeyboardDelegate } from "../list"; import { announce } from "../live-announcer"; import { type ElementOf, @@ -49,27 +47,26 @@ import { type CollectionNode, createControllableSignal, createDisclosureState, - createFormResetListener, createRegisterId, getItemCount, } from "../primitives"; import { + createSelectableCollection, type FocusStrategy, type KeyboardDelegate, Selection, type SelectionBehavior, type SelectionMode, - createSelectableCollection, } from "../selection"; +import { + COMBOBOX_INTL_TRANSLATIONS, + type ComboboxIntlTranslations, +} from "./combobox.intl"; import { ComboboxContext, type ComboboxContextValue, type ComboboxDataSet, } from "./combobox-context"; -import { - COMBOBOX_INTL_TRANSLATIONS, - type ComboboxIntlTranslations, -} from "./combobox.intl"; import type { ComboboxTriggerMode } from "./types"; export interface ComboboxBaseItemComponentProps