diff --git a/apps/frontend-vike/+server.ts b/apps/frontend-vike/+server.ts new file mode 100644 index 0000000..5de14ff --- /dev/null +++ b/apps/frontend-vike/+server.ts @@ -0,0 +1,12 @@ +import type { Server } from "vike/types"; +import { app } from "./server/elysia"; + +const port = process.env.PORT ? parseInt(process.env.PORT, 10) : 3000; + +// https://vike.dev/server +export default { + fetch: app.fetch, + prod: { + port, + }, +} satisfies Server; diff --git a/apps/frontend-vike/.env.example b/apps/frontend-vike/.env.example new file mode 100644 index 0000000..13eee6f --- /dev/null +++ b/apps/frontend-vike/.env.example @@ -0,0 +1,22 @@ +## Main System +# example: https://example.com +APP_URL="http://localhost:3000" + +## Umami Analytics +# example: https://example.com +UMAMI_HOST="" +# example: 661b12d9-a926-466d-8739-de23ee40fd5d +UMAMI_WEBSITE_ID="" + +## Sentry +# Sentry DNS. Used for Error Reporting on the Server +SENTRY_DSN= +# Sentry DNS. Used for Error Reporting in the Browser +PUBLIC_ENV__SENTRY_DSN= + +# Force enable Sentry in development mode +FORCE_ENABLE_IN_DEV=false + +## System +# example: production +NODE_ENV= \ No newline at end of file diff --git a/apps/frontend-vike/.env.sentry-build-plugin b/apps/frontend-vike/.env.sentry-build-plugin new file mode 100644 index 0000000..d2c76bd --- /dev/null +++ b/apps/frontend-vike/.env.sentry-build-plugin @@ -0,0 +1,8 @@ +# Sentry Organization Slug. Used for Upload of Source Maps +SENTRY_ORG= + +# Sentry Project Slug. Used for Upload of Source Maps +SENTRY_PROJECT= + +# Sentry Auth Token. Used for Upload of Source Maps +SENTRY_AUTH_TOKEN= diff --git a/apps/frontend-vike/.gitignore b/apps/frontend-vike/.gitignore new file mode 100644 index 0000000..a22092b --- /dev/null +++ b/apps/frontend-vike/.gitignore @@ -0,0 +1,261 @@ +# File created using '.gitignore Generator' for Visual Studio Code: https://bit.ly/vscode-gig +# Created by https://www.toptal.com/developers/gitignore/api/vuejs,vue,visualstudiocode,storybookjs,osx,nuxtjs,macos,linux,node +# Edit at https://www.toptal.com/developers/gitignore?templates=vuejs,vue,visualstudiocode,storybookjs,osx,nuxtjs,macos,linux,node + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### macOS Patch ### +# iCloud generated files +*.icloud + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### Node Patch ### +# Serverless Webpack directories +.webpack/ + +# Optional stylelint cache + +# SvelteKit build / generate output +.svelte-kit + +### NuxtJS ### +# Generated dirs +.nuxt-* +.output +.gen + +# Node dependencies +node_modules + +# System files + +### OSX ### +# General + +# Icon must end with two \r + +# Thumbnails + +# Files that might appear in the root of a volume + +# Directories potentially created on remote AFP share + +### StorybookJs ### +# gitignore template for the Storybook, UI guide for front apps +# website: https://storybook.js.org/ + +storybook-static/ + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +### Vue ### +# gitignore template for Vue.js projects +# +# Recommended template: Node.gitignore + +# TODO: where does this rule come from? +docs/_book + +# TODO: where does this rule come from? +test/ + +### Vuejs ### +# Recommended template: Node.gitignore + +dist/ +npm-debug.log +yarn-error.log + +# End of https://www.toptal.com/developers/gitignore/api/vuejs,vue,visualstudiocode,storybookjs,osx,nuxtjs,macos,linux,node + +# Custom rules (everything added below won't be overriden by 'Generate .gitignore File' if you use 'Update' option) +node_modules/ diff --git a/apps/frontend-vike/.storybook/main.ts b/apps/frontend-vike/.storybook/main.ts new file mode 100644 index 0000000..74a1c69 --- /dev/null +++ b/apps/frontend-vike/.storybook/main.ts @@ -0,0 +1,16 @@ +import type { StorybookConfig } from '@storybook/vue3-vite'; + +const config: StorybookConfig = { + "stories": [ + "../stories/**/*.mdx", + "../stories/**/*.stories.@(js|jsx|mjs|ts|tsx)" + ], + "addons": [ + "@chromatic-com/storybook", + "@storybook/addon-vitest", + "@storybook/addon-a11y", + "@storybook/addon-docs" + ], + "framework": "@storybook/vue3-vite" +}; +export default config; \ No newline at end of file diff --git a/apps/frontend-vike/.storybook/preview.ts b/apps/frontend-vike/.storybook/preview.ts new file mode 100644 index 0000000..71de191 --- /dev/null +++ b/apps/frontend-vike/.storybook/preview.ts @@ -0,0 +1,21 @@ +import type { Preview } from '@storybook/vue3-vite' + +const preview: Preview = { + parameters: { + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/i, + }, + }, + + a11y: { + // 'todo' - show a11y violations in the test UI only + // 'error' - fail CI on a11y violations + // 'off' - skip a11y checks entirely + test: 'todo' + } + }, +}; + +export default preview; \ No newline at end of file diff --git a/apps/frontend-vike/README.md b/apps/frontend-vike/README.md new file mode 100644 index 0000000..24980f6 --- /dev/null +++ b/apps/frontend-vike/README.md @@ -0,0 +1,60 @@ +Generated with [vike.dev/new](https://vike.dev/new) ([version 627](https://www.npmjs.com/package/create-vike/v/0.0.627)) using this command: + +```sh +pnpm create vike@latest --vue --tailwindcss --hono --sentry --storybook +``` + +## Contents + +- [Vike](#vike) + - [Plus files](#plus-files) + - [Routing](#routing) + - [SSR](#ssr) + - [HTML Streaming](#html-streaming) +- [Sentry Browser / Error Tracking & Performance Monitoring](#sentry-browser--error-tracking--performance-monitoring) + +## Vike + +This app is ready to start. It's powered by [Vike](https://vike.dev) and [Vue](https://vuejs.org/guide/quick-start.html). + +### Plus files + +[The + files are the interface](https://vike.dev/config) between Vike and your code. + +- [`+config.ts`](https://vike.dev/settings) — Settings (e.g. ``) +- [`+Page.vue`](https://vike.dev/Page) — The `<Page>` component +- [`+data.ts`](https://vike.dev/data) — Fetching data (for your `<Page>` component) +- [`+Layout.vue`](https://vike.dev/Layout) — The `<Layout>` component (wraps your `<Page>` components) +- [`+Head.vue`](https://vike.dev/Head) - Sets `<head>` tags +- [`/pages/_error/+Page.vue`](https://vike.dev/error-page) — The error page (rendered when an error occurs) +- [`+onPageTransitionStart.ts`](https://vike.dev/onPageTransitionStart) and `+onPageTransitionEnd.ts` — For page transition animations + +### Routing + +[Vike's built-in router](https://vike.dev/routing) lets you choose between: + +- [Filesystem Routing](https://vike.dev/filesystem-routing) (the URL of a page is determined based on where its `+Page.vue` file is located on the filesystem) +- [Route Strings](https://vike.dev/route-string) +- [Route Functions](https://vike.dev/route-function) + +### SSR + +SSR is enabled by default. You can [disable it](https://vike.dev/ssr) for all or specific pages. + +### HTML Streaming + +You can [enable/disable HTML streaming](https://vike.dev/stream) for all or specific pages. + +## Sentry Browser / Error Tracking & Performance Monitoring + +This app is integrated with [Sentry](https://sentry.io) for error tracking. + +> \[!NOTE] +> Sentry Error Tracking is **only activated in production** (`import.meta.env.PROD === true`)! + +**Testing Sentry** receiving Errors: + +1. Build & Start the app `pnpm build && pnpm preview`. +2. open Testpage in browser: http://localhost:3000/sentry. +3. check your [Sentry Dashboard](https://sentry.io) for new Errors. + diff --git a/apps/frontend-vike/TODO.md b/apps/frontend-vike/TODO.md new file mode 100644 index 0000000..2ced863 --- /dev/null +++ b/apps/frontend-vike/TODO.md @@ -0,0 +1,10 @@ +Follow the steps below to finish setting up your application. + +## Sentry Browser / Error Tracking & Performance Monitoring + +Add your Sentry DSN to `.env` file. +You can configure [Sentry for the browser](https://docs.sentry.io/platforms/javascript/guides/vue/) in `sentry.browser.config.ts`. + +Upload of source maps to Sentry is handled by the [`sentryVitePlugin`](https://docs.sentry.io/platforms/javascript/sourcemaps/uploading/vite/) in `vite.config.ts`. +You have to configure `SENTRY_ORG`, `SENTRY_PROJECT` and `SENTRY_AUTH_TOKEN` in the `.env.sentry-build-plugin` file with the values from your Sentry account. + diff --git a/apps/frontend-vike/components.json b/apps/frontend-vike/components.json new file mode 100644 index 0000000..5afc501 --- /dev/null +++ b/apps/frontend-vike/components.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://shadcn-vue.com/schema.json", + "style": "new-york", + "font": "noto-sans", + "typescript": true, + "tailwind": { + "config": "", + "css": "src/assets/css/tailwind.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "iconLibrary": "phosphor", + "rtl": false, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "composables": "@/composables" + }, + "registries": {} +} diff --git a/apps/frontend-vike/openapitools.json b/apps/frontend-vike/openapitools.json new file mode 100644 index 0000000..0f7e625 --- /dev/null +++ b/apps/frontend-vike/openapitools.json @@ -0,0 +1,7 @@ +{ + "$schema": "./node_modules/@openapitools/openapi-generator-cli/config.schema.json", + "spaces": 2, + "generator-cli": { + "version": "7.22.0" + } +} diff --git a/apps/frontend-vike/package.json b/apps/frontend-vike/package.json new file mode 100644 index 0000000..24e179f --- /dev/null +++ b/apps/frontend-vike/package.json @@ -0,0 +1,57 @@ +{ + "name": "frontend-vike", + "type": "module", + "scripts": { + "dev": "vike dev", + "build": "vike build", + "preview": "vike build && vike preview", + "prod": "vike build && node ./dist/server/index.mjs", + "storybook": "storybook dev -p 6006", + "build-storybook": "storybook build" + }, + "dependencies": { + "@phosphor-icons/vue": "2.2.1", + "@sentry/vue": "10.52.0", + "@unhead/vue": "3.1.0", + "@universal-middleware/core": "0.4.17", + "@vikejs/elysia": "0.2.0", + "@vikejs/hono": "0.2.0", + "@vueuse/core": "14.3.0", + "arkenv": "0.11.0", + "arktype": "2.2.0", + "class-variance-authority": "0.7.1", + "clsx": "2.1.1", + "dotenv": "17.4.2", + "elysia": "1.4.28", + "hono": "4.12.18", + "lucide-vue-next": "1.0.0", + "reka-ui": "2.9.7", + "tailwind-merge": "3.6.0", + "vike": "0.4.259", + "vike-vue": "0.9.11", + "vue": "3.5.34" + }, + "devDependencies": { + "@chromatic-com/storybook": "5.1.2", + "@sentry/vite-plugin": "5.2.1", + "@storybook/addon-a11y": "10.3.6", + "@storybook/addon-docs": "10.3.6", + "@storybook/addon-vitest": "10.3.6", + "@storybook/vue3-vite": "10.3.6", + "@tailwindcss/vite": "4.3.0", + "@types/node": "20.19.37", + "@vitejs/plugin-vue": "6.0.6", + "@vitest/browser-playwright": "4.1.6", + "@vitest/coverage-v8": "4.1.6", + "playwright": "1.59.1", + "rolldown": "1.0.1", + "storybook": "10.3.6", + "tailwindcss": "4.3.0", + "tw-animate-css": "1.4.0", + "typescript": "6.0.3", + "vite": "catalog:", + "vite-bundle-analyzer": "1.3.8", + "vite-plus": "catalog:", + "vitest": "catalog:" + } +} diff --git a/apps/frontend-vike/pnpm-lock.yaml b/apps/frontend-vike/pnpm-lock.yaml new file mode 100644 index 0000000..518e6ca --- /dev/null +++ b/apps/frontend-vike/pnpm-lock.yaml @@ -0,0 +1,7019 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +catalogs: + default: + vite-plus: + specifier: 0.1.21 + version: 0.1.21 + +overrides: + vite: npm:@voidzero-dev/vite-plus-core@0.1.21 + vitest: npm:@voidzero-dev/vite-plus-test@0.1.21 + +importers: + + .: + dependencies: + '@phosphor-icons/vue': + specifier: 2.2.1 + version: 2.2.1(vue@3.5.34(typescript@6.0.3)) + '@sentry/vue': + specifier: 10.52.0 + version: 10.52.0(vue@3.5.34(typescript@6.0.3)) + '@unhead/vue': + specifier: 3.1.0 + version: 3.1.0(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.0.1)(typescript@6.0.3)(vue@3.5.34(typescript@6.0.3)) + '@universal-middleware/core': + specifier: 0.4.17 + version: 0.4.17(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15) + '@vikejs/elysia': + specifier: 0.2.0 + version: 0.2.0(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15)(vike@0.4.259(@voidzero-dev/vite-plus-core@0.1.21)(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15)) + '@vikejs/hono': + specifier: 0.2.0 + version: 0.2.0(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15)(vike@0.4.259(@voidzero-dev/vite-plus-core@0.1.21)(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15)) + '@vueuse/core': + specifier: 14.3.0 + version: 14.3.0(vue@3.5.34(typescript@6.0.3)) + arkenv: + specifier: 0.11.0 + version: 0.11.0(arktype@2.2.0) + arktype: + specifier: 2.2.0 + version: 2.2.0 + class-variance-authority: + specifier: 0.7.1 + version: 0.7.1 + clsx: + specifier: 2.1.1 + version: 2.1.1 + dotenv: + specifier: 17.4.2 + version: 17.4.2 + elysia: + specifier: 1.4.28 + version: 1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3) + hono: + specifier: 4.12.18 + version: 4.12.18 + lucide-vue-next: + specifier: 1.0.0 + version: 1.0.0(vue@3.5.34(typescript@6.0.3)) + reka-ui: + specifier: 2.9.7 + version: 2.9.7(vue@3.5.34(typescript@6.0.3)) + tailwind-merge: + specifier: 3.6.0 + version: 3.6.0 + vike: + specifier: 0.4.259 + version: 0.4.259(@voidzero-dev/vite-plus-core@0.1.21)(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15) + vike-vue: + specifier: 0.9.11 + version: 0.9.11(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vike@0.4.259(@voidzero-dev/vite-plus-core@0.1.21)(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15))(vue@3.5.34(typescript@6.0.3)) + vue: + specifier: 3.5.34 + version: 3.5.34(typescript@6.0.3) + devDependencies: + '@chromatic-com/storybook': + specifier: 5.1.2 + version: 5.1.2(storybook@10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3))) + '@sentry/vite-plugin': + specifier: 5.2.1 + version: 5.2.1 + '@storybook/addon-a11y': + specifier: 10.3.6 + version: 10.3.6(storybook@10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3))) + '@storybook/addon-docs': + specifier: 10.3.6 + version: 10.3.6(@types/react@19.2.14)(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(storybook@10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3))) + '@storybook/addon-vitest': + specifier: 10.3.6 + version: 10.3.6(@vitest/browser-playwright@4.1.6(@voidzero-dev/vite-plus-core@0.1.21)(@voidzero-dev/vite-plus-test@0.1.21)(playwright@1.59.1))(@vitest/browser@4.1.6)(@vitest/runner@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3))) + '@storybook/vue3-vite': + specifier: 10.3.6 + version: 10.3.6(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(storybook@10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)))(vue@3.5.34(typescript@6.0.3)) + '@tailwindcss/vite': + specifier: 4.3.0 + version: 4.3.0(@voidzero-dev/vite-plus-core@0.1.21) + '@types/node': + specifier: 20.19.37 + version: 20.19.37 + '@vitejs/devtools': + specifier: 0.1.24 + version: 0.1.24(@pnpm/logger@1001.0.1)(@voidzero-dev/vite-plus-core@0.1.21)(typescript@6.0.3) + '@vitejs/plugin-vue': + specifier: 6.0.6 + version: 6.0.6(@voidzero-dev/vite-plus-core@0.1.21)(vue@3.5.34(typescript@6.0.3)) + '@vitest/browser-playwright': + specifier: 4.1.6 + version: 4.1.6(@voidzero-dev/vite-plus-core@0.1.21)(@voidzero-dev/vite-plus-test@0.1.21)(playwright@1.59.1) + '@vitest/coverage-v8': + specifier: 4.1.6 + version: 4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21) + playwright: + specifier: 1.59.1 + version: 1.59.1 + rolldown: + specifier: 1.0.1 + version: 1.0.1 + storybook: + specifier: 10.3.6 + version: 10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)) + tailwindcss: + specifier: 4.3.0 + version: 4.3.0 + tw-animate-css: + specifier: 1.4.0 + version: 1.4.0 + typescript: + specifier: 6.0.3 + version: 6.0.3 + vite: + specifier: npm:@voidzero-dev/vite-plus-core@0.1.21 + version: '@voidzero-dev/vite-plus-core@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)' + vite-bundle-analyzer: + specifier: 1.3.8 + version: 1.3.8 + vite-plus: + specifier: 'catalog:' + version: 0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3) + vitest: + specifier: npm:@voidzero-dev/vite-plus-test@0.1.21 + version: '@voidzero-dev/vite-plus-test@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)' + +packages: + + '@adobe/css-tools@4.4.4': + resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} + + '@ark/schema@0.56.0': + resolution: {integrity: sha512-ECg3hox/6Z/nLajxXqNhgPtNdHWC9zNsDyskwO28WinoFEnWow4IsERNz9AnXRhTZJnYIlAJ4uGn3nlLk65vZA==} + + '@ark/util@0.56.0': + resolution: {integrity: sha512-BghfRC8b9pNs3vBoDJhcta0/c1J1rsoS1+HgVUreMFPdhz/CRAKReAu57YEllNaSy98rWAdY1gE+gFup7OXpgA==} + + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.3': + resolution: {integrity: sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.0': + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.1': + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.29.2': + resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.3': + resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.29.2': + resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} + + '@blazediff/core@1.9.1': + resolution: {integrity: sha512-ehg3jIkYKulZh+8om/O25vkvSsXXwC+skXmyA87FFx6A/45eqOkZsBltMw/TVteb0mloiGT8oGRTcjRAz66zaA==} + + '@borewit/text-codec@0.2.2': + resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==} + + '@brillout/import@0.2.6': + resolution: {integrity: sha512-1GUTmADc8trUC1YSW2lp9r6PmwluMoEyHajnE1kxVdbKGD0wJOlq/DvTWMUqLtBDCnQR+n//qgMtz6HwA/lotA==} + + '@brillout/json-serializer@0.5.23': + resolution: {integrity: sha512-nM7okvu4UaoxYshKB+903s3/UpIBdkJl++iDT3gOLnHaSqY6HbhAXTsUTxrroAAcIt6RKQfShaKjCBlzR2A1Gg==} + + '@brillout/picocolors@1.0.30': + resolution: {integrity: sha512-xJjdgyN1H0qh2nB2xlzazIipiDixuUd9oD5msh/Qv5bXJG9j8MSD/m4lREt6Z10ej6FF31b8vB4tdT7lDUbiyA==} + + '@brillout/vite-plugin-server-entry@0.7.18': + resolution: {integrity: sha512-j3neG+vaIZ2AbP2/vGgaIyJwrFIxlK3xd3Ey2EGBswCvAGeI4QSSfXGbb7R3b3H8223PgTTsWOZuZH0Y8Ope2w==} + + '@chromatic-com/storybook@5.1.2': + resolution: {integrity: sha512-H/hgvwC3E+OtseP2OT2QYUJH2VfnzT6wM3pWOkaNV6g7QI+VUdWJbeJ3o2jFqvEPQNqzhQKWDOlvM4lu+7is6g==} + engines: {node: '>=20.0.0', yarn: '>=1.22.18'} + peerDependencies: + storybook: ^0.0.0-0 || ^10.1.0 || ^10.1.0-0 || ^10.2.0-0 || ^10.3.0-0 || ^10.4.0-0 + + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + + '@emnapi/core@1.9.2': + resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + + '@emnapi/runtime@1.9.2': + resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} + + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.28.0': + resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.28.0': + resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.28.0': + resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.28.0': + resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.28.0': + resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.0': + resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.28.0': + resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.0': + resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.28.0': + resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.28.0': + resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.28.0': + resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.28.0': + resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.28.0': + resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.28.0': + resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.0': + resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.28.0': + resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.28.0': + resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.28.0': + resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.0': + resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.28.0': + resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.0': + resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.28.0': + resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.28.0': + resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.28.0': + resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.28.0': + resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.28.0': + resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@floating-ui/core@1.7.5': + resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + + '@floating-ui/dom@1.7.6': + resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + + '@floating-ui/utils@0.2.11': + resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + + '@floating-ui/vue@1.1.11': + resolution: {integrity: sha512-HzHKCNVxnGS35r9fCHBc3+uCnjw9IWIlCPL683cGgM9Kgj2BiAl8x1mS7vtvP6F9S/e/q4O6MApwSHj8hNLGfw==} + + '@gwhitney/detect-indent@7.0.1': + resolution: {integrity: sha512-7bQW+gkKa2kKZPeJf6+c6gFK9ARxQfn+FKy9ScTBppyKRWH2KzsmweXUoklqeEiHiNVWaeP5csIdsNq6w7QhzA==} + engines: {node: '>=12.20'} + + '@internationalized/date@3.12.1': + resolution: {integrity: sha512-6IedsVWXyq4P9Tj+TxuU8WGWM70hYLl12nbYU8jkikVpa6WXapFazPUcHUMDMoWftIDE2ILDkFFte6W2nFCkRQ==} + + '@internationalized/number@3.6.6': + resolution: {integrity: sha512-iFgmQaXHE0vytNfpLZWOC2mEJCBRzcUxt53Xf/yCXG93lRvqas237i3r7X4RKMwO3txiyZD4mQjKAByFv6UGSQ==} + + '@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/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@mdx-js/react@3.1.1': + resolution: {integrity: sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + + '@neoconfetti/react@1.0.0': + resolution: {integrity: sha512-klcSooChXXOzIm+SE5IISIAn3bYzYfPjbX7D7HoqZL84oAfgREeSg5vSIaSFH+DaGzzvImTyWe1OyrJ67vik4A==} + + '@oxc-parser/binding-android-arm-eabi@0.126.0': + resolution: {integrity: sha512-svyoHt25J4741QJ5aa4R+h0iiBeSRt63Lr3aAZcxy2c/NeSE1IfDeMnSij6rIg7EjxkdlXzz613wUjeCeilBNA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxc-parser/binding-android-arm-eabi@0.127.0': + resolution: {integrity: sha512-0LC7ye4hvqbIKxAzThzvswgHLFu2AURKzYLeSVvLdu2TBOYWQDmHnTqPLeA597BcUCxiLqLsS4CJ5uoI5WYWCQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxc-parser/binding-android-arm64@0.104.0': + resolution: {integrity: sha512-2a4tk6mtkPbGwT4Zi8pjOqMkmkrvc/Pussmas+uXoiCVv7sn7P7Jn93ATu/HK49dxIwvrvQCZ3BcS0KhAvKxlQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxc-parser/binding-android-arm64@0.126.0': + resolution: {integrity: sha512-hPEBRKgplp1mG9GkINFsr4JVMDNrGJLOqfDaadTWpAoTnzYR5Rmv8RMvB3hJZpiNvbk1aacopdHUP1pggMQ/cw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxc-parser/binding-android-arm64@0.127.0': + resolution: {integrity: sha512-b5jtVTH6AU5CJXHNdj7Jj9IEiR9yVjjnwHzPJhGyHGPdcsZSzBCkS9GBbV33niRMvKthDwQRFRJfI4a+k4PvYg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxc-parser/binding-darwin-arm64@0.104.0': + resolution: {integrity: sha512-qprm6/Hr35TSCkJoo+huRHq3siyqRyMBtNVNJQkJorZAGcffQTzzdhmzJnA7TQc+WnN36/Jq56D7/INu0/2knQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-arm64@0.126.0': + resolution: {integrity: sha512-ccRpu9sdYmznePJQG5halhs0FW5tw5a8zRSoZXOzM1OjoeZ4jiRRruFiPclsD59edoVAK1l83dvfjWz1nQi6lg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-arm64@0.127.0': + resolution: {integrity: sha512-obCE8B7ISKkJidjlhv9xRGJPOSDG2Yu6PRga9Ruaz35uintHxbp1Ki/Yc71wx4rj3Edrm0a1kzG1TAwit0wFpg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.104.0': + resolution: {integrity: sha512-Xpu0l/l2zCUeheIrpu7dz6FxQ96W0f8Dq9rhYE1yLtTqQpMGhefnEV5Lr8qd15clwniZiKWZO6FGQawQ7npt3Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.126.0': + resolution: {integrity: sha512-CHB4zVjNSKqx8Fw9pHowzQQnjjuq04i4Ng0Avj+DixlwhwAoMYqlFbocYIlbg+q3zOLGlm7vEHm83jqEMitnyg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.127.0': + resolution: {integrity: sha512-JL6Xb5IwPQT8rUzlpsX7E+AgfcdNklXNPFp8pjCQQ5MQOQo5rtEB2ui+3Hgg9Sn7Y9Egj6YOLLiHhLpdAe12Aw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-freebsd-x64@0.104.0': + resolution: {integrity: sha512-I++fE3ZrhjtLzA0mqFcC/GuA6+dWNa/QkJJfm7sS4NGGQhipQQ2vikCK6jZK1YGIsbDFDrSoQCfA3tQfeK6pqg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxc-parser/binding-freebsd-x64@0.126.0': + resolution: {integrity: sha512-RQ3nEJdcDKBfBjmLJ3Vl1d0KQERPV1P8eUrnBm7+VTYyoaJSPLVFuPg1mlD1hk3n0/879VLFMfusFkBal4ssWQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxc-parser/binding-freebsd-x64@0.127.0': + resolution: {integrity: sha512-SDQ/3MQFw58fqQz3Z1PhSKFF3JoCF4gmlNjziDm8X02tTahCw0qJbd7FGPDKw1i4VTBZene9JPyC3mHtSvi+wA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxc-parser/binding-linux-arm-gnueabihf@0.104.0': + resolution: {integrity: sha512-JkvwCNZm3ZwVG1r+c3LrcrxpJ1YXAtYEbVwOcwe+wh6LnltGoxEEZk7Zo9259jch8GiWW6AfRGDQY2FxzWJT7A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-gnueabihf@0.126.0': + resolution: {integrity: sha512-onipc2wCDA7Bauzb4KK1mab0GsEDf4ujiIfWECdnmY/2LlzAoX3xdQRLAUyEDB1kn3yilHBrkmXDdHluyHXxiw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-gnueabihf@0.127.0': + resolution: {integrity: sha512-Av+D1MIqzV0YMGPT9we2SIZaMKD7Cxs4CvXSx/yxaWHewZjYEjScpOf5igc8IILASViw4WTnjlwUdI1KzVtDHQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-musleabihf@0.126.0': + resolution: {integrity: sha512-5BuJJPohrV5NJ8lmcYOMbfRCUGoYH5J9HZHeuqOLwkHXWAuPMN3X1h8bC/2mWjmosdbfTtmyIdX3spS/TkqKNg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-musleabihf@0.127.0': + resolution: {integrity: sha512-Cs2fdJ8cPpFdeebj6p4dag8A4+56hPvZ0AhQQzlaLswGz1tz7bXt1nETLeorrM9+AMcWFFkqxcXwDGfTVidY8g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm64-gnu@0.104.0': + resolution: {integrity: sha512-CD9Tzp3dfMtujHikS0JwTIOaDUCBWItvziUTDYsMXrfVHjfSaGGsaKqIQmNsG1Qg7QdmtMZtMW0pQcHGZQ2OoA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-arm64-gnu@0.126.0': + resolution: {integrity: sha512-r2KApRgm2pOJaduRm6GOT8x0whcr67AyejNkSdzPt34GJ+Y3axcXN2mwlTs+8lfO/SSmpO5ZJGYiHYnxEE0jkw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-arm64-gnu@0.127.0': + resolution: {integrity: sha512-qdOfTcT6SY8gsJrrV92uyEUyjqMGPpIB5JZUG6QN5dukYd+7/j0kX6MwK1DgQj39jtUYixxPiaRUiEN1+0CXgQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-arm64-musl@0.104.0': + resolution: {integrity: sha512-lARUu7lrZ7CoAm2arLJQkq9Sem2NiC3DaphmPvlf2X+ngkWcYUCRxZanhe+++x/bVzKrwvxormC3IVaulP51mQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-arm64-musl@0.126.0': + resolution: {integrity: sha512-FQ+MMh7MT0Dr/u8+RWmWKlfoeWPQyHDbhhxJShJlYtROXXPHsRs9EvmQOZZ3sx4Nn7JU8NX+oyw2YzQ7anBJcA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-arm64-musl@0.127.0': + resolution: {integrity: sha512-EoTCZneNFU/P2qrpEM+RHmQwt+CvDkyGESG6qhr7KaegXLZwePfbrkCDfAk8/rhxbDUVGsZILX+2tqPzFtoFWA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-ppc64-gnu@0.126.0': + resolution: {integrity: sha512-Wv/T8C98hRQhGTlx2XFyLn5raRMp9U1lOQD+YnXNgAr7wHbJJpZ8mDBU7Rw+M3WytGcGTFcr6kqgfyQeHVtLbQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-ppc64-gnu@0.127.0': + resolution: {integrity: sha512-zALjmZYgxFLHjXeudcDF0xFGNydTAtkAeXAr2EuC17ywCyFxcmQra4w0BMde0Yi/re4Bi4iwEoEXtYN7l6eBLQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-riscv64-gnu@0.104.0': + resolution: {integrity: sha512-hnPWrncj89/7AiMt19Juqpa04z8OpJrIf3/ToGkJafZ3A1ZN50atyNKQD5EmGs2/gdaFxF4hG3zUnLKhX9nTtQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-riscv64-gnu@0.126.0': + resolution: {integrity: sha512-DHx1rT1zauW0ZbLHOiQh5AC9Xs3UkWx2XmfZHs+7nnWYr3sagrufoUQC+/XPwwjMIlCFXiFGM0sFh3TyOCZwqA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-riscv64-gnu@0.127.0': + resolution: {integrity: sha512-fPP8M6zQLS7Jz7o9d5ArUSuAuSK3e+WCYVrCpdzeCOejidtZExJ9tjhDrAd3HEPqARBCPmdpqxESPFqy44vkBQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-riscv64-musl@0.126.0': + resolution: {integrity: sha512-umDc2mTShH0U2zcEYf8mIJ163seLJNn54ZUZYeI5jD4qlg9izPwoLrC2aNPKlMJTu6u/ysmQWiEvIiaAG+INkw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-riscv64-musl@0.127.0': + resolution: {integrity: sha512-7IcC4Ao02oGpfnjt+X/oF4U2mllo2qoSkw5xxiXNKL9MCTsTiAC6616beOuehdxGcnz1bRoPC1RQ2f1GQDdN+g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-s390x-gnu@0.104.0': + resolution: {integrity: sha512-VegcKzBgUoHQ/p5NyV+GrdEgJEXhX4AD+kCZng+viP/eNsZJgmp2K1jDBCeLSUZIdSmdldK5wlSma3Bf8MKcUQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-s390x-gnu@0.126.0': + resolution: {integrity: sha512-PXXeWayclRtO1pxQEeCpiqIglQdhK2mAI2VX5xnsWdImzSB5GpoQ8TNw7vTCKk2k+GZuxl+q1knncidjCyUP9w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-s390x-gnu@0.127.0': + resolution: {integrity: sha512-pbXIhiNFHoqWeqDNLiJ9JkpHz1IM9k4DXa66x+1GTWMG7iLxtkXgE53iiuKSXwmk3zIYmaPVfBvgcAhS583K4Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-x64-gnu@0.104.0': + resolution: {integrity: sha512-nDtCJIwaNgVNLR1EOgb1Xsz7VL3TOASLRbQEC+wLZycs3CCETlGNQht5OqwXPNjbem61kl4l8dvuEavu8BRT/Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-x64-gnu@0.126.0': + resolution: {integrity: sha512-wzocjxm34TbB3bFlqG65JiLtvf6ZDg2ZxRkLLbgXwDQUNU+0MPjQN8zy/0jBKNA5fnPLk3XeVdZ7Uin+7+CVkg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-x64-gnu@0.127.0': + resolution: {integrity: sha512-MYCguB9RvBvlSd6gbuNI7QwiLoCCAlGnlRJFPrzLI6U1/9wkC/WK6LtBAUln55H1Ctqw45PWmqrobKoMhsYQzQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-x64-musl@0.104.0': + resolution: {integrity: sha512-E98MNPE3d88D2xUABQYWH2cYqLA/mmOM4XL3CZHaG5dM68sN3fzCyV0ryK5skq4hVK1L2e6jk79z5oLArsCYyA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-x64-musl@0.126.0': + resolution: {integrity: sha512-e83uftP60jmkPs2+CW6T6A1GYzN2H6IumDAiTntv9WyHR73PI3ImHNBkYqnA3ukeKI3xjcCbhSh9QeJWmufxGQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-x64-musl@0.127.0': + resolution: {integrity: sha512-5eY0B/bxf1xIUxb4NOTvOI3KWtBQfPWYyKAzgcrCt0mDibSZygVpO1Pz8bkeiSZ5Jj9+M09dkggG3H8I5d0Uyg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-openharmony-arm64@0.104.0': + resolution: {integrity: sha512-/FNOTg5tzlpB0hunjdI1AiJp2lC8NvBl0HpqMk0qp42KAK+yOe7nyw7XcNpMH7SvhmPe+R3oyJV8UQv953sCvA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxc-parser/binding-openharmony-arm64@0.126.0': + resolution: {integrity: sha512-4WiOILHnPrTDY2/L4mE6PZCYwLN1d3ghma6BuTJ452CCgzRMt3uFplCtR+o3r9zdUWJYb370UizpI9CUcWXr1A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxc-parser/binding-openharmony-arm64@0.127.0': + resolution: {integrity: sha512-Gld0ajrFTUXNtdw20fVBuTQx66FA75nIVg+//pPfR3sXkuABB4mTBhl3r9JNzrJpgW//qiwxf0nWXUWGJSL3UQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxc-parser/binding-wasm32-wasi@0.104.0': + resolution: {integrity: sha512-I+xnHDxkInzHBZV+YERIvvrt+GFwEBdgq/RUax5jLl8yHg5iPVq11qtGh3m+2v8zAjQXYPmBbcANNGWwgXqtWQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-parser/binding-wasm32-wasi@0.126.0': + resolution: {integrity: sha512-Y17hhnrQTrxgAxAyAq401vnN9URsAL4s5AjqpG1NDsXSlhe1yBNnns+rC2P6xcMoitgX5nKH2ryYt9oiFRlzLw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-parser/binding-wasm32-wasi@0.127.0': + resolution: {integrity: sha512-T6KVD7rhLzFlwGRXMnxUFfkCZD8FHnb968wVXW1mXzgRFc5RNXOBY2mPPDZ77x5Ln76ltLMgtPg0cOkU1NSrEQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@oxc-parser/binding-win32-arm64-msvc@0.104.0': + resolution: {integrity: sha512-EWHVWfllZGTJFWfjfBKzvS/0uuw6/Z3+o598VTvySamy5fz2f4P1mNElvTi4tGGhbm1sGTYnYRNRW8XBAnGUGg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-arm64-msvc@0.126.0': + resolution: {integrity: sha512-Znug1u1iRvT4VC3jANz6nhGBHsFwEFMxuimYpJFwMtsB6H5FcEoZRMmH26tHkSTD03JvDmG+gB65W3ajLjPcSw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-arm64-msvc@0.127.0': + resolution: {integrity: sha512-Ujvw4X+LD1CCGULcsQcvb4YNVoBGqt+JHgNNzGGaCImELiZLk477ifUH53gIbE7EKd933NdTi25JWEr9K2HwXw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-ia32-msvc@0.126.0': + resolution: {integrity: sha512-qrw7mx5hFFTxVSXToOA40hpnjgNB/DJprZchtB4rDKNLKqkD3F26HbzaQeH1nxAKej0efSZfJd5Sw3qdtOLGhw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-parser/binding-win32-ia32-msvc@0.127.0': + resolution: {integrity: sha512-0cwxKO7KHQQQfo4Uf4B2SQrhgm+cJaP9OvFFhx52Tkg4bezsacu83GB2/In5bC415Ueeym+kXdnge/57rbSfTw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.104.0': + resolution: {integrity: sha512-Nj7zeywIvxBRRd0I6NrdGufOOdiwQcAKnkRwtWo5dejPTmR1XM+9iRHJztoKacejW5+VOdEwQrfCjpa8MdLJBQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.126.0': + resolution: {integrity: sha512-ibB1s+mPUFXvS7MFJO2jpw/aCNs/P6ifnWlRyTYB+WYBpniOiCcHQQskZneJtwcjQMDRol3RGG3ihoYnzXSY4w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.127.0': + resolution: {integrity: sha512-rOrnSQSCbhI2kowr9XxE7m9a8oQXnBHjnS6j95LxxAnEZ0+Fz20WlRXG4ondQb+ejjt2KOsa65sE6++L6kUd+w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxc-project/runtime@0.129.0': + resolution: {integrity: sha512-0+S67blQakgeNqoKGozOUp5rQBrz2ynXZ2QIINXZPiafsD0YL0UogB9hAWc1S7k6VSNwKYC/N7MqT0V6IzpHkQ==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@oxc-project/types@0.104.0': + resolution: {integrity: sha512-We30k+29WpOerl3gCb1v8IFL4vmKTkghjist4TQ89yw7adGDCKFGf8+4mA4H3Ek5ajRzzBZ7BtGY8aIaOv9oFQ==} + + '@oxc-project/types@0.126.0': + resolution: {integrity: sha512-oGfVtjAgwQVVpfBrbtk4e1XDyWHRFta6BS3GWVzrF8xYBT2VGQAk39yJS/wFSMrZqoiCU4oghT3Ch0HaHGIHcQ==} + + '@oxc-project/types@0.127.0': + resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} + + '@oxc-project/types@0.129.0': + resolution: {integrity: sha512-3oz8m3FGdr2nDXVqmFUw7jolKliC4MoyXYIG2c7gpjBnzUWQpUGIYcXYKxTdTi+N2jusvt610ckTMkxdwHkYEg==} + + '@oxc-project/types@0.130.0': + resolution: {integrity: sha512-ibD2usx9JRu7f5pu2tMKMI4cpA4NgXJQoYRP4pQ7Pxmn1l6k/53qWtQWZayhYy3X4QZkt90Ot+mJEaeXouio6Q==} + + '@oxfmt/binding-android-arm-eabi@0.48.0': + resolution: {integrity: sha512-uwqk+/KhQvBIpULD8SMM/zAafMRC/+DV/xsEQjkkIsJ/kLmEI/2bxonVowcYTiXqqZ/a0FEW8DPkZY3VvwELDA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxfmt/binding-android-arm64@0.48.0': + resolution: {integrity: sha512-VUCiKuXK5+McVssgHEJdrcGK7hRJzrRb36zm9/jwzMholyYt4BgXhw5Nm1V1DX6Ce717Zi/1jk432b/tgmQgtQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxfmt/binding-darwin-arm64@0.48.0': + resolution: {integrity: sha512-IkKp8rnIyQLW6Jt+6jragCbUVYSayk55lapiprLjIVvt4NczLyO/nwX2GgefLQ5iaBdfS8UEAFgCs/pLO6Cl0w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxfmt/binding-darwin-x64@0.48.0': + resolution: {integrity: sha512-+aFuhsGIuvnoOjXyKVHMhPKJZR1kQkAl8QyrKoMlA7yJsSTC3N0Asl53La8TChSHhW8epToQ/Q0nvLmEmfNmLg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxfmt/binding-freebsd-x64@0.48.0': + resolution: {integrity: sha512-fbqzQL8FjI9gGnktI7RIo0dksDziTAYBy7xlI7jU7eID5fxLF/25fS4Xj6GydD8Y5oWHL83U4NK160QaOAxtyg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxfmt/binding-linux-arm-gnueabihf@0.48.0': + resolution: {integrity: sha512-hn4i0zhAyTiB3ZHjQfYUZkDvrbVkohw1S7pySWxWUoZ87HnkDoTFThj7QTxk40hNPOTUP0vHbPRNamFIv1HBJQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm-musleabihf@0.48.0': + resolution: {integrity: sha512-R4WBD9qF3QM9hqgdAa+fBGXmquTvDUujrPQ36t2Sjk8RPOSKGHDeN7l/khr10hqbQaOq9KCgPHG9ubNET/X/RQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm64-gnu@0.48.0': + resolution: {integrity: sha512-5bVdwSwlm1M8wbYCorLOxWxUBw/8tBvHYyQNIfwWVPwOJaj5vg1APSGJQVpwJfV5VNE9PSrR91UKEpoNwHhqUA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-arm64-musl@0.48.0': + resolution: {integrity: sha512-vCS3Fk7gFslTqE1lUE2IlroyVV7u/9SmMA/uBqDoshuck2psGWcjW0ePyPZI3rM3+qtf2pDaMVIKMHozraifuw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-ppc64-gnu@0.48.0': + resolution: {integrity: sha512-gKtfFfueUClXDumyoHUbymqRf7prHejOOyzJK0eIJn93GF9JBdFHdo60TM1ZBHxkEwZvjuOgHmKtneKbEOc/Eg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-gnu@0.48.0': + resolution: {integrity: sha512-SYt0UhOvZD/UwZz9sXq6J2uAw8o24f5VZpLB2DH01f6MevshmlgakQlZe2lwek2sZJkd07eLu7mZa0g7yeiw7Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-musl@0.48.0': + resolution: {integrity: sha512-JLbrwck2AopG4ud/XklZO5N+qxGC7cS7ROvXZVNfx0MCLDDL2kGOLvzuWORkVjnjAM0CMAfIMU2zNBtQbM+4dw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-s390x-gnu@0.48.0': + resolution: {integrity: sha512-mdxt5L8OQLxkQH+JVpdC/lknZNe0lX4hlO3d8+xvw2wToo+iDrid9tiGOd5bmHfUVd5wVhrUry0qlu5vq66NkQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-gnu@0.48.0': + resolution: {integrity: sha512-oEz1BQwMrV7OMEFx/3VPDU3n9TM0AnxpktDYXjEg5i6nTX87wo18wSfBvkl4tzAICdKtoAQAdBIl7Y7hsPlx5w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-musl@0.48.0': + resolution: {integrity: sha512-g2SKTTurP5mWjd8Ecait0erYqmltL4IqW1EwttM25BxM6NiTt4ubobJYMR1uox1V2QgG4UfHH10CGRvWlUixjw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-openharmony-arm64@0.48.0': + resolution: {integrity: sha512-CIg24VgheEpvolHL2gQuax5qcQ602bRMHrJ9g8XsQr3iVj9aSPgopigBKuMqrXsupwkrU+RQCn5cG8PgFntR6w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxfmt/binding-win32-arm64-msvc@0.48.0': + resolution: {integrity: sha512-zeaWkcxcEULwkGF3I/HgEvcDPN8buYDrxibBUa/IFh5Vmwyge+KpLO+hEwSovW349H0O/C0Z2kaFmEzEDm00/Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxfmt/binding-win32-ia32-msvc@0.48.0': + resolution: {integrity: sha512-yiEKnIAGvx5CyZQOlMaNlZkAbwT7/Quk0j3WLt+PR5hK+qYjPTRRJYDfD77wCBPLvEYAG41v4KG3iL0H+uxoxg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxfmt/binding-win32-x64-msvc@0.48.0': + resolution: {integrity: sha512-GSD2+7t2UoVMV2NgxXypa4bKewflPMAjYnF0Xw9/ht82ZfafAHhb8STwrEd7wlH2PFogt5zw3WVCxYJaHUdbeQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxlint-tsgolint/darwin-arm64@0.22.1': + resolution: {integrity: sha512-4150Lpgc1YM09GcjA6GSrra1JoPjC7aOpfywLjWEY4vW0Sd1qKzqHF1WRaiw0/qUZ40OATYdv3aRd7ipPkWQbw==} + cpu: [arm64] + os: [darwin] + + '@oxlint-tsgolint/darwin-x64@0.22.1': + resolution: {integrity: sha512-vFWcPWYOgZs4HWcgS1EjUZg33NLcNfEYU49KGImmCfZWkflENrmBYV4HN/C0YeAPum6ZZ/goPSvQrB/cOD+NfA==} + cpu: [x64] + os: [darwin] + + '@oxlint-tsgolint/linux-arm64@0.22.1': + resolution: {integrity: sha512-6LiUpP0Zir3+29FvBm7Y28q/dBjSHqTZ5MhG1Ckw4fGhI4cAvbcwXaKvbjx1TP7rRmBNOoq/M5xdpHjTb+GAew==} + cpu: [arm64] + os: [linux] + + '@oxlint-tsgolint/linux-x64@0.22.1': + resolution: {integrity: sha512-fuX1hEQfpHauUbXADsfqVhRzrUrGabzGXbj5wsp2vKhV5uk/Rze8Mba9GdjFGECzvXudMGqHqxB4r6jGRdhxVA==} + cpu: [x64] + os: [linux] + + '@oxlint-tsgolint/win32-arm64@0.22.1': + resolution: {integrity: sha512-8SZidAj+jrbZf9ZjBEYW0tiNZ+KasqB2zgW26qdiPpQSF/DzURnPmXz651IeA9YsmbVdHGIooEHUmev6QJdquA==} + cpu: [arm64] + os: [win32] + + '@oxlint-tsgolint/win32-x64@0.22.1': + resolution: {integrity: sha512-QweSk9H5lFh5Y+WUf2Kq/OAN88V6+62ZwGhP38gqdRotI90luXSMkruFTj7Q2rYrzH4ZVNaSqx7NY8JpSfIzqg==} + cpu: [x64] + os: [win32] + + '@oxlint/binding-android-arm-eabi@1.63.0': + resolution: {integrity: sha512-A9xLtQt7i0OA1PoB/meog6kikXI9CdwEp7ZwQqmgnpKn3G3b1orvTDy8CQ6T7w1HvDrgWGB78PkFKcWgibcTCg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxlint/binding-android-arm64@1.63.0': + resolution: {integrity: sha512-SQo+ZMvdR9l3CxZp5W5gFNxSiDxclY6lOzzNpKYLF8asESpm3Pwumx0gER5T7aHLF1/2BAAtLD3DiDkdgy4V1A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxlint/binding-darwin-arm64@1.63.0': + resolution: {integrity: sha512-6W82XjJDTmMnjg30427l0dufpnyLoq7wEukKdM6/g2VIybRVuQiBVh43EA4b+UxZ3+tLcKm+Or/pXGNgLCEU8g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxlint/binding-darwin-x64@1.63.0': + resolution: {integrity: sha512-CnWd/YCuVG5W1BYkjJEVbJG11o526O9qAwBEQM+nh8K19CRFUkFdROXCyYkGmroHEYQe4vgQ6+lh3550Lp35Xw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxlint/binding-freebsd-x64@1.63.0': + resolution: {integrity: sha512-a4eZAqrmtajqcxfdAzC+l7g3PaE3V8hpAYqqeD3fTxLXOMFdK3eNTZrU80n4dDEVm0JXy1aL5PqvqWldBl6zYA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/binding-linux-arm-gnueabihf@1.63.0': + resolution: {integrity: sha512-tYUtU9TdbU3uXF5D62g5zXJ13iniFGhXQx5vp9cyEjGdbSAY3VdFBSaldYvyoDmgMZ0ZYuwQP1Y4t2Fhejwa0w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm-musleabihf@1.63.0': + resolution: {integrity: sha512-I5r3twFf776UZg9dmRo2xbrKt00tTkORXEVe0ctg4vdTkQvJAjiCHxnbAU2HL1AiJ9cqADA76MAliuilsAWnvg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm64-gnu@1.63.0': + resolution: {integrity: sha512-t7ltUkg6FFh4b564QyGir8xIj/QZbXu8FlcRkcyW9+ztr/mfRHlvUOFd95pJCXi9s/L5DrUeWWgpXRS+V+6igQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-arm64-musl@1.63.0': + resolution: {integrity: sha512-Q5mmZy/XWjuYFUuQyYjOvZ5U/JkKEwnpir6hGxhh6HcdP0V/BKxLo8dqkfF/t7r7AguB17dfS/8+go5AQDRR6g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-ppc64-gnu@1.63.0': + resolution: {integrity: sha512-uBGtuZ0TzLB4x5wVa82HGNvYqY8buwDhyCnCP0R0gkk9szqVsP0MeTtD5HX7EsEuFIt+aYmYxuxeVxs3nTSwtQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-gnu@1.63.0': + resolution: {integrity: sha512-h4s6FwxE+9MeA181o0dnDwHP32Y/bG8EiB/vrD6Ib+AMt6haigDc/0bUtI/sLmQDBMJnUfaCmtSSrEAqjtEVrA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-musl@1.63.0': + resolution: {integrity: sha512-2EaNcCBR8Mcjl5ARtuN3BdEpVkX7KpjSjMGZ/mJMIeaXgTtdz5ytg2VwygMSStA/k0ixfvZFoZOfjDEcouV5vQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-s390x-gnu@1.63.0': + resolution: {integrity: sha512-p4hlf/fd7TrYYl3QrWWD0GocqJefwMu3cHQhmi2FvEB/YOvFb5DZN3SMBaPi7B1TM5DeypkEtrVib674q1KKPg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-gnu@1.63.0': + resolution: {integrity: sha512-Vgq9rkRVcPcjbcH+ihYTfpeR7vCXfqpd+z5ItTGc0yYUV59L5ceHYN1iV4H9bKGV7Rn5hkVc7x3mSvHegduENA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-musl@1.63.0': + resolution: {integrity: sha512-3/Lkq/ncooA61rorrC+ZQed1Bc4VpGj+WnGsp58zmxKgvZ2vhreu+dcVyr3mX8NUpq7mfZ4gDDTou/yrF1Pd7A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxlint/binding-openharmony-arm64@1.63.0': + resolution: {integrity: sha512-0/EdD/6hDkx5Mfd769PTjvEM8mZ/6Dfukp1dBCL/2PjlIVGEtYdNZyok6ChqYPsT9JcFnlQnUeQzO0/1L/oC9w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxlint/binding-win32-arm64-msvc@1.63.0': + resolution: {integrity: sha512-wb0CUkN8ngwPiRQBjD1Cj0LsHeNvm+Xt6YBHDMtj2DVQVD6Oj8Ri7g6BD+KICf6LaBqZlmzOvy6nF9E/8yyGOg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxlint/binding-win32-ia32-msvc@1.63.0': + resolution: {integrity: sha512-BX5iq+ovdNlVYhSn5qPMUIT0uwAwt2lmEnCnzK+Gkhw4DovIvhGb96OFhV8yzQNUnQxn/xGkOR+X+BLrLDNm8w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxlint/binding-win32-x64-msvc@1.63.0': + resolution: {integrity: sha512-QeN/WELOfsXMeYwxvfgQrl6CbVftYUCZsGXHjXQd5Trccm8+i4gmtxaOui4xbJQaiDlviF8F3yLSBloQUeFsfA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@phosphor-icons/vue@2.2.1': + resolution: {integrity: sha512-3RNg1utc2Z5RwPKWFkW3eXI/0BfQAwXgtFxPUPeSzi55jGYUq16b+UqcgbKLazWFlwg5R92OCLKjDiJjeiJcnA==} + engines: {node: '>=14'} + peerDependencies: + vue: '>=3.2.39' + + '@pnpm/constants@1001.3.1': + resolution: {integrity: sha512-2hf0s4pVrVEH8RvdJJ7YRKjQdiG8m0iAT26TTqXnCbK30kKwJW69VLmP5tED5zstmDRXcOeH5eRcrpkdwczQ9g==} + engines: {node: '>=18.12'} + + '@pnpm/core-loggers@1001.0.9': + resolution: {integrity: sha512-pW58m3ssrwVjwhlmTXDW1dh1sv2y6R2Gl5YvQInjM2d01/5mre/sYAY4MK3XfgEShZJQxv6wVXDUvyHHJ0oizg==} + engines: {node: '>=18.12'} + peerDependencies: + '@pnpm/logger': '>=1001.0.0 <1002.0.0' + + '@pnpm/error@1000.1.0': + resolution: {integrity: sha512-Dqc2IJJPjUatwc9Letw+vG29rnaMrDGi5g6WCx1HiZYm0obXbTmLygeRafMbgf+sLKXrWE1shOeiayQuczBdoA==} + engines: {node: '>=18.12'} + + '@pnpm/graceful-fs@1000.1.0': + resolution: {integrity: sha512-EsMX4slK0qJN2AR0/AYohY5m0HQNYGMNe+jhN74O994zp22/WbX+PbkIKyw3UQn39yQm2+z6SgwklDxbeapsmQ==} + engines: {node: '>=18.12'} + + '@pnpm/logger@1001.0.1': + resolution: {integrity: sha512-gdwlAMXC4Wc0s7Dmg/4wNybMEd/4lSd9LsXQxeg/piWY0PPXjgz1IXJWnVScx6dZRaaodWP3c1ornrw8mZdFZw==} + engines: {node: '>=18.12'} + + '@pnpm/manifest-utils@1002.0.5': + resolution: {integrity: sha512-2DSwQ6pP73IuJS5mCCtPd5fibJwuAdufXKuSL/Oq1n6AggCqy8616Xea1X3RH3z5dL4mn7Z4EZ+vnX8jX3Wrfw==} + engines: {node: '>=18.12'} + peerDependencies: + '@pnpm/logger': ^1001.0.1 + + '@pnpm/read-project-manifest@1001.2.6': + resolution: {integrity: sha512-BcNO50lAkE4m9JaJ0WmG3m/DH/qLSvMgZywtmb/dfyyLVu5nDZfDqmOd8U+f1NhLcLMbBK6AnS3hyUqZYvw9Vg==} + engines: {node: '>=18.12'} + peerDependencies: + '@pnpm/logger': ^1001.0.1 + + '@pnpm/semver.peer-range@1000.0.0': + resolution: {integrity: sha512-r6VzkrdH7ZKjPmAogTNvxuV/UyS/xwHNme+ZuEFiG0UthZgqudDftYtKmG20fcfrjG1lgJbbWICA8KvZy7mmbw==} + engines: {node: '>=18.12'} + + '@pnpm/text.comments-parser@1000.0.0': + resolution: {integrity: sha512-ivv/esrETOq9uMiKOC0ddVZ1BktEGsfsMQ9RWmrDpwPiqFSqWsIspnquxTBmm5GflC5N06fbqjGOpulZVYo3vQ==} + engines: {node: '>=18.12'} + + '@pnpm/types@1001.3.0': + resolution: {integrity: sha512-NLTXheat/u7OEGg5M5vF6Z85zx8uKUZE0+whtX/sbFV2XL48RdnOWGPTKYuVVkv8M+launaLUTgGEXNs/ess2w==} + engines: {node: '>=18.12'} + + '@pnpm/write-project-manifest@1000.0.16': + resolution: {integrity: sha512-zG68fk03ryot7TWUl9S/ShQ91uHWzIL9sVr2aQCuNHJo8G9kjsG6S0p58Zj/voahdDQeakZYYBSJ0mjNZeiJnw==} + engines: {node: '>=18.12'} + + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + + '@publint/pack@0.1.4': + resolution: {integrity: sha512-HDVTWq3H0uTXiU0eeSQntcVUTPP3GamzeXI41+x7uU9J65JgWQh3qWZHblR1i0npXfFtF+mxBiU2nJH8znxWnQ==} + engines: {node: '>=18'} + + '@quansync/fs@1.0.0': + resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} + + '@rolldown/binding-android-arm64@1.0.1': + resolution: {integrity: sha512-fJI3I0r3C3Oj/zdBCpaCmBRZYf07xpaq4yCfDDoSFm+beWNzbIl26puW8RraUdugoJw/95zerNOn6jasAhzSmg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.1': + resolution: {integrity: sha512-cKnAhWEsV7TPcA/5EAteDp6KcJZBQ2G+BqE7zayMMi7kMvwRsbv7WT9aOnn0WNl4SKEIf43vjS31iUPu80nzXg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.1': + resolution: {integrity: sha512-YKrVwQjIRBPo+5G/u03wGjbdy4q7pyzCe93DK9VJ7zkVmeg8LJ7GbgsiHWdR4xSoe4CAXRD7Bcjgbtr64bkXNg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.1': + resolution: {integrity: sha512-z/oBsREo46SsFqBwYtFe0kpJeBijAT48O/WXLI4suiCLBkr03RTtTJMCzSdDd2znlh8VJizL09XVkQgk8IZonw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.1': + resolution: {integrity: sha512-ik8q7GM11zxvYxFc2PeDcT6TBvhCQMaUxfph/M5l9sKuTs/Sjg3L+Byw0F7w0ZVLBZmx30P+gG0ECzzN+MFcmQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.1': + resolution: {integrity: sha512-QoSx2EkyrrdZ6kcyE8stqZ62t0Yra8Fs5ia9lOxJrh6TMQJK7gQKmscdTHf7pOXKREKrVwOtJcQG3qVSfc866A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.0.1': + resolution: {integrity: sha512-uwNwFpwKeNiZawfAWBgg0VIztPTV3ihhh1vV334h9ivnNLorxnQMU6Fz8wG1Zb4Qh9LC1/MkcyT3YlDXG3Rsgg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.0.1': + resolution: {integrity: sha512-zY1bul7OWr7DFBiJ++wofXvnr8B45ce3QsQUhKrIhXsygAh7bTkwyeM1bi1a2g5C/yC/N8TZyGDEoMfm/l9mpg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.0.1': + resolution: {integrity: sha512-0frlsT/f4Ft6I7SMESTKnF3cZsdicQn1dCMkF/jT9wDLE+gGoiQfv1nmT9e+s7s/fekvvy6tZM2jHvI2tkbJDQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.0.1': + resolution: {integrity: sha512-XABVmGp9Tg0WspTVvwduTc4fpqy6JnAUrSQe6OuyqD/03nI7r0O9OWUkMIwFrjKAIqolvqoA4ZrJppgwE0Gxmw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.0.1': + resolution: {integrity: sha512-bV4fzswuzVcKD90o/VM6QqKxnxlDq0g2BISDLNVmxrnhpv1DDbyPhCIjYfvzYLV+MvkKKnQt2Q6AO86SEBULUQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.0.1': + resolution: {integrity: sha512-/Mh0Zhq3OP7fVs0kcQHZP6lZEthMGTaSf8UBQYSFEZDWGXXlEC+nJ6EqenaK2t4LBXMe3A+K/G2BVXXdtOr4PQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.1': + resolution: {integrity: sha512-+1xc9X45l8ufsBAm6Gjvx2qDRIY9lTVt0cgWNcJ+1gdhXvkbxePA60yRTwSTuXL09CMhyJmjpV7E3NoyxbqFQQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.1': + resolution: {integrity: sha512-1D+UqZdfnuR+Jy1GgMJwi85bD40H21uNmOPRWQhw4oRSuolZ/B5rixZ45DK2KXOTCvmVCecauWgEhbw8bI7tOw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.1': + resolution: {integrity: sha512-INAycaWuhlOK3wk4mRHGsdgwYWmd9cChdPdE9bwWmy6rn9VqVNYNFGhOdXrofXUxwHIncSiPNb8tNm8knDVIeQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/debug@1.0.1': + resolution: {integrity: sha512-ovyIps5Q+wp/6TAiVWqP9mWxJ9hWaP05JevNys17UB4/NNK/3EDTtOen7wCNsjoxoZCP5MR268CkyMkD5klcvw==} + + '@rolldown/pluginutils@1.0.0': + resolution: {integrity: sha512-aKs/3GSWyV0mrhNmt/96/Z3yczC3yvrzYATCiCXQebBsGyYzjNdUphRVLeJQ67ySKVXRfMxt2lm12pmXvbPFQQ==} + + '@rolldown/pluginutils@1.0.0-rc.13': + resolution: {integrity: sha512-3ngTAv6F/Py35BsYbeeLeecvhMKdsKm4AoOETVhAA+Qc8nrA2I0kF7oa93mE9qnIurngOSpMnQ0x2nQY2FPviA==} + + '@sentry-internal/browser-utils@10.52.0': + resolution: {integrity: sha512-x/yEPZdpH6NGQeoeQnV9tj8reAH8twNttiltGZl2o8Rk7sQeUfe7E8yuYP2XbJ2RqyZK5qRS3COrNyMPzf6KFA==} + engines: {node: '>=18'} + + '@sentry-internal/feedback@10.52.0': + resolution: {integrity: sha512-5kAn1W8ZvCuHtEHXpq6iRkUMdNCilwww+YxaN2yofVrCivAbB3Ha5JJUMqmWOPW0pC27zGYmoJMIDvG+PczUxA==} + engines: {node: '>=18'} + + '@sentry-internal/replay-canvas@10.52.0': + resolution: {integrity: sha512-BI5ie4dxPuUJ344CXVSnAxY1xZCbghglPSCIlTOYODpR9so9yo5IZh+Mwspt0oWsUMaxWJiQSNYlbPWi7WDavg==} + engines: {node: '>=18'} + + '@sentry-internal/replay@10.52.0': + resolution: {integrity: sha512-diywyuc/H7VTUR+W5ryVmLF+0X4UP1OskMqb6V8RSAvJHcj2JmIm7uP+Fc6ACTno+b6AUShwT/L4xVXzO6X9Cw==} + engines: {node: '>=18'} + + '@sentry/babel-plugin-component-annotate@5.2.1': + resolution: {integrity: sha512-QQ9AL5EXIbSK26ObLVtiU6l3tCUdpGSJ/6VwDkPhC3qvtoksSlcoU9Yzm7XC0NBcvu1N2abL5R7gckKGZ4JewQ==} + engines: {node: '>= 18'} + + '@sentry/browser@10.52.0': + resolution: {integrity: sha512-ijL9jN86oXwXQWbwhPlEb70ODJSEmjxQEQdnZkC4gDWbjswcwvRsVJPYk+1xl2ir2iZixRIHipVxDcLwian35g==} + engines: {node: '>=18'} + + '@sentry/bundler-plugin-core@5.2.1': + resolution: {integrity: sha512-uXb+TOZKXxm2STsP3iR70Jh/yYHwlHOvql7w/bUVYgDyiB/1Mv0D6oNGS0kelsgBsBwCq3ngyJYlyNy3oM1pPw==} + engines: {node: '>= 18'} + + '@sentry/cli-darwin@2.58.5': + resolution: {integrity: sha512-lYrNzenZFJftfwSya7gwrHGxtE+Kob/e1sr9lmHMFOd4utDlmq0XFDllmdZAMf21fxcPRI1GL28ejZ3bId01fQ==} + engines: {node: '>=10'} + os: [darwin] + + '@sentry/cli-linux-arm64@2.58.5': + resolution: {integrity: sha512-/4gywFeBqRB6tR/iGMRAJ3HRqY6Z7Yp4l8ZCbl0TDLAfHNxu7schEw4tSnm2/Hh9eNMiOVy4z58uzAWlZXAYBQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux, freebsd, android] + + '@sentry/cli-linux-arm@2.58.5': + resolution: {integrity: sha512-KtHweSIomYL4WVDrBrYSYJricKAAzxUgX86kc6OnlikbyOhoK6Fy8Vs6vwd52P6dvWPjgrMpUYjW2M5pYXQDUw==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux, freebsd, android] + + '@sentry/cli-linux-i686@2.58.5': + resolution: {integrity: sha512-G7261dkmyxqlMdyvyP06b+RTIVzp1gZNgglj5UksxSouSUqRd/46W/2pQeOMPhloDYo9yLtCN2YFb3Mw4aUsWw==} + engines: {node: '>=10'} + cpu: [x86, ia32] + os: [linux, freebsd, android] + + '@sentry/cli-linux-x64@2.58.5': + resolution: {integrity: sha512-rP04494RSmt86xChkQ+ecBNRYSPbyXc4u0IA7R7N1pSLCyO74e5w5Al+LnAq35cMfVbZgz5Sm0iGLjyiUu4I1g==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux, freebsd, android] + + '@sentry/cli-win32-arm64@2.58.5': + resolution: {integrity: sha512-AOJ2nCXlQL1KBaCzv38m3i2VmSHNurUpm7xVKd6yAHX+ZoVBI8VT0EgvwmtJR2TY2N2hNCC7UrgRmdUsQ152bA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@sentry/cli-win32-i686@2.58.5': + resolution: {integrity: sha512-EsuboLSOnlrN7MMPJ1eFvfMDm+BnzOaSWl8eYhNo8W/BIrmNgpRUdBwnWn9Q2UOjJj5ZopukmsiMYtU/D7ml9g==} + engines: {node: '>=10'} + cpu: [x86, ia32] + os: [win32] + + '@sentry/cli-win32-x64@2.58.5': + resolution: {integrity: sha512-IZf+XIMiQwj+5NzqbOQfywlOitmCV424Vtf9c+ep61AaVScUFD1TSrQbOcJJv5xGxhlxNOMNgMeZhdexdzrKZg==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@sentry/cli@2.58.5': + resolution: {integrity: sha512-tavJ7yGUZV+z3Ct2/ZB6mg339i08sAk6HDkgqmSRuQEu2iLS5sl9HIvuXfM6xjv8fwlgFOSy++WNABNAcGHUbg==} + engines: {node: '>= 10'} + hasBin: true + + '@sentry/core@10.52.0': + resolution: {integrity: sha512-VA/kAqLhkMnRWY2RXdBLyTemR9D4m7MVRy/gyapoq9yvllVPx9WXbvKgnMP2LQp7mFgT/oLFvw58aQKaYTGn3A==} + engines: {node: '>=18'} + + '@sentry/rollup-plugin@5.2.1': + resolution: {integrity: sha512-LKJyL4fzcHnHExipVN0/QinhBNoGZt+UXg8xJaqc6MwOolOhxHW0ii2hu1OZsiOhX0+r9MK7T+a7Sx0F0bzdMQ==} + engines: {node: '>= 18'} + peerDependencies: + rollup: '>=3.2.0' + peerDependenciesMeta: + rollup: + optional: true + + '@sentry/vite-plugin@5.2.1': + resolution: {integrity: sha512-sSQzOhN8xvo/R70vqgyonnC/fwXpJ1kbkJ0g81Xy/OR+N89+v5tPN4VlKTAq3T2c5yAPE39XCbdgeEnI4kbWGg==} + engines: {node: '>= 18'} + + '@sentry/vue@10.52.0': + resolution: {integrity: sha512-6MHYKXGQz39yFJ27HzNYGWJtmwDhEwp7EvCm6cJPBlXQNbYOoNTDrzq4TuI0cLJzyAW7mIQ+k4n4iMpa6EbfaA==} + engines: {node: '>=18'} + peerDependencies: + '@tanstack/vue-router': ^1.64.0 + pinia: 2.x || 3.x + vue: 2.x || 3.x + peerDependenciesMeta: + '@tanstack/vue-router': + optional: true + pinia: + optional: true + + '@sinclair/typebox@0.34.49': + resolution: {integrity: sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==} + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@storybook/addon-a11y@10.3.6': + resolution: {integrity: sha512-cbwXIT5CeHZ9AFbTKQ6YB7Ct6TAl/kKOgALbvzzVtFfRvm51JYygGaiJaB7PbPWn9wgJP2olJcFt+erlEc6cRw==} + peerDependencies: + storybook: ^10.3.6 + + '@storybook/addon-docs@10.3.6': + resolution: {integrity: sha512-TvIdADVPtauxW0LzXIpIv7X6GxwetorhyNh+6+7MHC27XSBCWVxxRUwL63YeLlHTuXsIk0quG3b1xgwVRzWOJA==} + peerDependencies: + storybook: ^10.3.6 + + '@storybook/addon-vitest@10.3.6': + resolution: {integrity: sha512-HXj7RrPJY+xzoNjL+xZu2oLw1fI5BA87Noh1NAXMPuECHR5R5fuRM/tTsJuIGXHFMO06FjSi/rekDIfCj1fL4w==} + peerDependencies: + '@vitest/browser': ^3.0.0 || ^4.0.0 + '@vitest/browser-playwright': ^4.0.0 + '@vitest/runner': ^3.0.0 || ^4.0.0 + storybook: ^10.3.6 + vitest: ^3.0.0 || ^4.0.0 + peerDependenciesMeta: + '@vitest/browser': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/runner': + optional: true + vitest: + optional: true + + '@storybook/builder-vite@10.3.6': + resolution: {integrity: sha512-gpvR/sE4BcrFtmQZ+Ker7zD23oQzoVeqD9nF6cK6yzY+Q0svJXyX2EPmFG4y+EwygD5/vNzDpP84gGMut8VRwg==} + peerDependencies: + storybook: ^10.3.6 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@storybook/csf-plugin@10.3.6': + resolution: {integrity: sha512-9kBf7VRdRqTSIYo+rPtVn5yjYYyK8kP2QhEYx3oiXvfwy4RexmbJnhk/tXa/lNiTqukA1TqaWQ2+5MqF4fu6YQ==} + peerDependencies: + esbuild: '*' + rollup: '*' + storybook: ^10.3.6 + vite: '*' + webpack: '*' + peerDependenciesMeta: + esbuild: + optional: true + rollup: + optional: true + vite: + optional: true + webpack: + optional: true + + '@storybook/global@5.0.0': + resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} + + '@storybook/icons@2.0.2': + resolution: {integrity: sha512-KZBCpXsshAIjczYNXR/rlxEtCUX/eAbpFNwKi8bcOomrLA4t/SyPz5RF+lVPO2oZBUE4sAkt43mfJUevQDSEEw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@storybook/react-dom-shim@10.3.6': + resolution: {integrity: sha512-/Tu1gPu+Fw+zOnAGmxRmOD30FX3a04LxcTAKflEtdpmtIMVR5bA3qpjy+f5YhoyDCecbXyKmL1OeIU2FIIZHqQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^10.3.6 + + '@storybook/vue3-vite@10.3.6': + resolution: {integrity: sha512-49rwk3jRU3j0rjtuSVIIMUhv+6iPvW8v9LKVI3XVVU4//RkZjGa6FA/hMVTmtMzU1yOtlDGYB6Ku9PvOTG56nA==} + peerDependencies: + storybook: ^10.3.6 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@storybook/vue3@10.3.6': + resolution: {integrity: sha512-QXBq+l8h9DkrDxMKLkHp/1rGrFi3jGzng5YOsWmUfiJFNe0Nbj8ezGODr4Lgcc4SK8G3eBk/QRfBflmIcf+2gw==} + peerDependencies: + storybook: ^10.3.6 + vue: ^3.0.0 + + '@swc/helpers@0.5.21': + resolution: {integrity: sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==} + + '@tailwindcss/node@4.3.0': + resolution: {integrity: sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==} + + '@tailwindcss/oxide-android-arm64@4.3.0': + resolution: {integrity: sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.3.0': + resolution: {integrity: sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.3.0': + resolution: {integrity: sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.3.0': + resolution: {integrity: sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + resolution: {integrity: sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + resolution: {integrity: sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + resolution: {integrity: sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + resolution: {integrity: sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + resolution: {integrity: sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + resolution: {integrity: sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + resolution: {integrity: sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + resolution: {integrity: sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.3.0': + resolution: {integrity: sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==} + engines: {node: '>= 20'} + + '@tailwindcss/vite@4.3.0': + resolution: {integrity: sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 || ^8 + + '@tanstack/virtual-core@3.14.0': + resolution: {integrity: sha512-JLANqGy/D6k4Ujmh8Tr25lGimuOXNiaVyXaCAZS0W+1390sADdGnyUdSWNIfd49gebtIxGMij4IktRVzrdr12Q==} + + '@tanstack/vue-virtual@3.13.24': + resolution: {integrity: sha512-A0k2qF0zFSUStXSZkGXABouXr2Tw2Ztl/cVIYG9qy84uR8W7UNjAcX3DvzBS3YnDcwvLxab8v7dbmYBZ39itDA==} + peerDependencies: + vue: ^2.7.0 || ^3.0.0 + + '@testing-library/dom@10.4.1': + resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + engines: {node: '>=18'} + + '@testing-library/jest-dom@6.9.1': + resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + + '@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' + + '@tokenizer/inflate@0.4.1': + resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} + engines: {node: '>=18'} + + '@tokenizer/token@0.3.0': + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + + '@types/node@20.19.37': + resolution: {integrity: sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==} + + '@types/react@19.2.14': + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + + '@unhead/bundler@3.1.0': + resolution: {integrity: sha512-PzIa26mo1fk2t3KJ6ACJXTi1MD1nDJXb4hl/P8+UTMmdK0EWyDo3LMttePsIgKKR5PTnrtSeyhd43Pdoym4z2g==} + peerDependencies: + '@unhead/cli': ^3.1.0 + esbuild: '>=0.17.0' + lightningcss: '>=1.20.0' + rolldown: '>=1.0.0-beta.0' + unhead: ^3.1.0 + vite: '>=6.4.2' + webpack: '>=5.0.0' + peerDependenciesMeta: + '@unhead/cli': + optional: true + esbuild: + optional: true + lightningcss: + optional: true + rolldown: + optional: true + vite: + optional: true + webpack: + optional: true + + '@unhead/vue@3.1.0': + resolution: {integrity: sha512-ib0YCfaoD0lL40Dg1FEQJksZhZ5Q+LMESXUxyfMrtlSUb43+Ha7btUIPyQuAfkjhlTihE1x5i9QdswEdhe0LWg==} + peerDependencies: + vite: '>=6.4.2' + vue: '>=3.5.18' + webpack: '>=5.0.0' + peerDependenciesMeta: + vite: + optional: true + webpack: + optional: true + + '@universal-deploy/netlify@0.2.2': + resolution: {integrity: sha512-10JY+1z0aun66IegHhVdOBTgXioI0+hgA0IVc0zgZvm2C7g2eQWpv48wtqCZZsXyUxajKcIlxiYxIuhuRIdfrQ==} + peerDependencies: + vite: '>=7.1' + + '@universal-deploy/node@0.1.6': + resolution: {integrity: sha512-VcYUNiE596Mbm0fCX1TWK6fAXgJgOz4Msa+PORxZCPZrTLw+qDABeE031XWSfQ8bAF9d/DXtGywIA/RAi8oCXg==} + peerDependencies: + vite: '>=7.1' + peerDependenciesMeta: + vite: + optional: true + + '@universal-deploy/store@0.2.1': + resolution: {integrity: sha512-9CYaStacvufXAaVmaf8dxEVptqpcX5m9+vz1PIlN4gjYKlXfOdbZTuhv2xLwp3mj4jBR2/8VYdF5Vviw9cBYEA==} + peerDependencies: + srvx: '*' + peerDependenciesMeta: + srvx: + optional: true + + '@universal-deploy/vite@0.1.9': + resolution: {integrity: sha512-wKf9aP/3OJwr08JmWMa4ot69L+tA/61VzhqE1uh/YqXXl8HXugQPF11RcOIQRCgpRLvO2QDLLNNJ7K1LLxLu1A==} + peerDependencies: + vite: '>=7.1' + peerDependenciesMeta: + vite: + optional: true + + '@universal-middleware/core@0.4.17': + resolution: {integrity: sha512-q+/nXW9DQ94RtmlghC57DhwEvjrqxX57EtU40iaM3U+eYTKc+FVnEdlpdrYX8kCAdEU7zVBLBlFgJre+VrXoUg==} + peerDependencies: + '@cloudflare/workers-types': ^4.20260302.0 + '@hattip/core': ^0.0.49 + '@types/express': ^4 || ^5 + '@webroute/route': ^0.8.0 + elysia: ^1.4.25 + fastify: ^5.7.4 + h3: ^1.15.5 + hono: ^4.11.9 + srvx: '>=0.8' + peerDependenciesMeta: + '@cloudflare/workers-types': + optional: true + '@hattip/core': + optional: true + '@types/express': + optional: true + '@webroute/route': + optional: true + elysia: + optional: true + fastify: + optional: true + h3: + optional: true + hono: + optional: true + srvx: + optional: true + + '@universal-middleware/elysia@0.6.4': + resolution: {integrity: sha512-M+Amena5LwwbHRFqxMc7AzEp8ROGwOyV8vxdmsQA0qd42JljlvnNVDngP3jHyHVBb6oWsyheoSGSRB8lkWY2pA==} + + '@universal-middleware/express@0.4.26': + resolution: {integrity: sha512-zPtCWn4/kObx+Rd7UMpqjb1VP9qDzJEeb/oeN96nZv2b+wHvF9KKck9tftziuzeUYazjYrQ+Ug+aKVC6C7ndUw==} + + '@universal-middleware/hono@0.4.21': + resolution: {integrity: sha512-HvzvJ/4DIbj8z/OWzirZZGBhWbv/w/UTNUMLKt35U3wVUJRPDZVRm3SzJR55jQfoN4MBD6DvAT5jKFjdZzsPQg==} + + '@universal-middleware/node@0.1.0': + resolution: {integrity: sha512-I03mkOhw0Ka28MtALkpoGJYE8YYSJxmq/iambaqKGXxlFXgLI/VXlw0LmX9iansUzbolNq4hWFMfHyNp2xb4jA==} + + '@valibot/to-json-schema@1.7.0': + resolution: {integrity: sha512-Y3pPVibbIOHzohrlxSINvO7w/bvXkoYS3BQHoImV9ynE+bXKf171bdMucPurV2zp7gdmt0L1HCcNAsbo7cFRQw==} + peerDependencies: + valibot: ^1.4.0 + + '@vikejs/elysia@0.2.0': + resolution: {integrity: sha512-DQaQCwE7IeRqhLR5J8z5qHcwqrOhzEy3oJgaF3B2NlEyuudGVcBAUIiMNLOGRXprfpgafP+I6RCXOkulFT7vIA==} + peerDependencies: + elysia: ^1.0.0 + vike: ^0.4.255 + + '@vikejs/hono@0.2.0': + resolution: {integrity: sha512-kM0CLN+qmjkJTvtHEHo7KiEbqnLAhibn7jqNWzlsfKXVjN0VIkY1U0E9hU7zIWYkxw6KCA2kNDt6IVRRixBsKw==} + peerDependencies: + hono: ^4.0.0 + vike: ^0.4.255 + + '@vitejs/devtools-kit@0.1.22': + resolution: {integrity: sha512-oEQloUS0B8YoKnRxqvt4qYQJBRWGQ6RdcC02QZWXACw+f7OUL021JXH6zZJm0Nq3U2rOsBcc6Mg1/4qMuaswXA==} + peerDependencies: + vite: '*' + + '@vitejs/devtools-kit@0.1.24': + resolution: {integrity: sha512-sHM4i80Rrx4HTv/c2d28pQpeMz99GQe/2lVvJvna9t/YcoVouqpsms8oKiF/NcX8474A5gx3TtJHXWvqbov1dg==} + peerDependencies: + vite: '*' + + '@vitejs/devtools-rolldown@0.1.24': + resolution: {integrity: sha512-KN3Bd7O0/xAq9KKjH9R1hrbw5GK3eKq563IExw8jf/FjiTllppR/iNUnlg6JHBLG3wVBFrhxL6bHjgQUAaBDBQ==} + + '@vitejs/devtools@0.1.24': + resolution: {integrity: sha512-XPsNo8fTXtshuQrK5ddnlZzE9wtGJWs1Xfu9g1bMKZoM/XI+ool1zPSM1k8RHE09LPiUf/5E29KykResyyKx/w==} + hasBin: true + peerDependencies: + vite: '*' + + '@vitejs/plugin-vue@6.0.6': + resolution: {integrity: sha512-u9HHgfrq3AjXlysn0eINFnWQOJQLO9WN6VprZ8FXl7A2bYisv3Hui9Ij+7QZ41F/WYWarHjwBbXtD7dKg3uxbg==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + vue: ^3.2.25 + + '@vitest/browser-playwright@4.1.6': + resolution: {integrity: sha512-4csoeyl/qwHyxU2zNL0++WaoDr8YJDXOQPwWPNJoTZ+QzcdO3INYKgF5Zfz730Io7zbkuv914aZmfQ+QE+1Hvw==} + peerDependencies: + playwright: '*' + vitest: 4.1.6 + + '@vitest/browser@4.1.6': + resolution: {integrity: sha512-ynsspTubXGSpa58JFJ24xIQt4z4A25epSbugEyaTmmrV1//Wec9EgE/LtoaC6yxUrXi5P7erGHRrkdZIHaVQuA==} + peerDependencies: + vitest: 4.1.6 + + '@vitest/coverage-v8@4.1.6': + resolution: {integrity: sha512-36l628fQ/9a/8ihy97eOtEnvWQEdqULQOJtcaxtoNq0G1w3Mxd4szSahOaMM9/NGyZ+hyKcMtIW/WIxq0XQViQ==} + peerDependencies: + '@vitest/browser': 4.1.6 + vitest: 4.1.6 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + + '@vitest/mocker@4.1.6': + resolution: {integrity: sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + + '@vitest/pretty-format@4.1.6': + resolution: {integrity: sha512-h5SxD/IzNhZYnrSZRsUZQIC+vD0GY8cUvq0iwsmkFKixRCKLLWqCXa/FIQ4S1R+sI+PGoojkHsdNrbZiM9Qpgw==} + + '@vitest/runner@4.1.6': + resolution: {integrity: sha512-nOPCmn2+yD0ZNmKdsXGv/UxMMWbMuKeD6GyYncNwdkYDxpQvrPSKYj2rWuDjC2Y4b6w6hjip5dBKFzEUuZe3vA==} + + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + + '@vitest/spy@4.1.6': + resolution: {integrity: sha512-JFKxMx6udhwKh/Ldo270e17QX710vgunMkuPAvXjHSvC6oqLWAHhVhjg/I71q0u0CBSErIODV1Kjv0FQNSWjdg==} + + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + + '@vitest/utils@4.1.6': + resolution: {integrity: sha512-FxIY+U81R3LGKCxaHHFRQ5+g6/iRgGLmeHWdp2Amj4ljQRrEIWHmZyDfDYBRZlpyqA7qKxtS9DD1dhk8RnRIVQ==} + + '@voidzero-dev/vite-plus-core@0.1.21': + resolution: {integrity: sha512-BEnqw8h2vxgKkzBjmmW4e1kwPwzoWc+jXJQB+7e0Dm1/1AkdTaQ9FgUMFzDfYrwTDkGzCZHSSsHDOl3RERQFTA==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@arethetypeswrong/core': ^0.18.1 + '@tsdown/css': 0.22.0 + '@tsdown/exe': 0.22.0 + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.1.18 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + publint: ^0.3.8 + 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 + typescript: ^5.0.0 || ^6.0.0 + unplugin-unused: ^0.5.0 + unrun: '*' + yaml: ^2.4.2 + peerDependenciesMeta: + '@arethetypeswrong/core': + optional: true + '@tsdown/css': + optional: true + '@tsdown/exe': + optional: true + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + publint: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + typescript: + optional: true + unplugin-unused: + optional: true + unrun: + optional: true + yaml: + optional: true + + '@voidzero-dev/vite-plus-darwin-arm64@0.1.21': + resolution: {integrity: sha512-T7mPiDbE7VtjpegtJJ/e/uQOjOA/ufMo7npAaP9WVHxUEWLaR/OjVXXL9ALiW+CfKEQ0Qk/iWDB0mI6YMndzNQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@voidzero-dev/vite-plus-darwin-x64@0.1.21': + resolution: {integrity: sha512-DqS0ZJ0sRtXu55loEIz/mkX99fl1HQ0b9UUj+Qm13NoMfh6JC8d0g6J+Dbu/EJy0TEU7QLjCXoALLQ7ZrsW34g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@voidzero-dev/vite-plus-linux-arm64-gnu@0.1.21': + resolution: {integrity: sha512-PoW375e3pSayRuN43agoe8LdItEa82bPhcaW7elPxoiO8puynB+4x5Xy5ozU5XgjEuCB3nYKE6R/b9peWsaFEQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@voidzero-dev/vite-plus-linux-arm64-musl@0.1.21': + resolution: {integrity: sha512-Q5c6i1TyRuMELDcGozuI5Y0JhIZsSbAJ067Okty6XmoJ5tSmUnMzEO5HKRmgjfGryjJpn5dpUKXzj2eWsdx+6g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@voidzero-dev/vite-plus-linux-x64-gnu@0.1.21': + resolution: {integrity: sha512-DquiIAvGIUIJBfqOnqAtBPoyhNIGLM1DzswzDPddO5kjg6NCE4hPbFr5ncjhSKqyp88Kd1YWYD93yg3FAdr/EA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@voidzero-dev/vite-plus-linux-x64-musl@0.1.21': + resolution: {integrity: sha512-/nVT+eFySYwf3uEv+n9FrdJ0bg3SbfqUkAnIxH7XMQ/hhmU4lAE2dH4SiUqk6h70gESaFHfJmhWtp5Qzt/W7Vw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@voidzero-dev/vite-plus-test@0.1.21': + resolution: {integrity: sha512-kRUh2rELGFg9Agv2OhoaNCSRfy7XUFCL9n+aNEvSStI/p8C5iPMMe2auZCfbLbUcvpsDFvNVOwtY4XQRDFJiJQ==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/coverage-istanbul': 4.1.5 + '@vitest/coverage-v8': 4.1.5 + '@vitest/ui': 4.1.5 + 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/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + '@voidzero-dev/vite-plus-win32-arm64-msvc@0.1.21': + resolution: {integrity: sha512-KhEqfRKlfuuVJb2eY8ZCmmXcxUqy8/ZBZPWPipxcB1QDWIykyN5F4zbewLxXw18JL/Q0ISP0p7V8RIldAh4Gyw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@voidzero-dev/vite-plus-win32-x64-msvc@0.1.21': + resolution: {integrity: sha512-lH8d2qElBfUUpejZhYvK3CrP6kHTz0z2jff/ZowlY6jkr1pQkYj3EVhRi5r81DXcbXZs9yAbXbBPw8mVZtG9FA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@volar/language-core@2.4.15': + resolution: {integrity: sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==} + + '@volar/source-map@2.4.15': + resolution: {integrity: sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==} + + '@volar/typescript@2.4.15': + resolution: {integrity: sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==} + + '@vue/compiler-core@3.5.34': + resolution: {integrity: sha512-s9cLyK5mLcvZ4Agva5QgRsQyLKvts9WbU9DB6NqiZkkGEdwmcEiylj5Jbwkp680drF/NNCV8OlAJSe+yMLxaJw==} + + '@vue/compiler-dom@3.5.34': + resolution: {integrity: sha512-EbF/T++k0e2MMZlJsBhzK8Sgwt0HcIPOhzn1CTB/lv6sQcyk+OWf8YeiLxZp3ro7MbbLcAfAJ6sEvjFWuNgUCw==} + + '@vue/compiler-sfc@3.5.34': + resolution: {integrity: sha512-D/ihr6uZeIt6r+pVZf46RWT1fAsLFMbUP7k8G1VkiiWexriED9GrX3echHd4Abbt17zjlfiFJ8z7a3BxZOPNjg==} + + '@vue/compiler-ssr@3.5.34': + resolution: {integrity: sha512-cDtTHKibkThKGHH1SP+WdccquNRYQDFH6rRjQCqT9G2ltFAfoR5pUftpab/z+aM5mW9HLLVQW7hfKKQe/1GBeQ==} + + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + + '@vue/language-core@2.2.12': + resolution: {integrity: sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/reactivity@3.5.34': + resolution: {integrity: sha512-y9XDjCEuBp+98k+UL5dbYkh57AHU4o6cxZedOPXw3bmrZZYLQsVHguGurq7hVrPCSrQtrnz1f9dssyFr+dMXfQ==} + + '@vue/runtime-core@3.5.34': + resolution: {integrity: sha512-mKeBYvu8tcMSLhypAHBmriUFfWXKTCF/23Z4jiCoYK3UtWepkliViNLuR90V9XOyD62mUxs9p1jsrpK3CCGIzw==} + + '@vue/runtime-dom@3.5.34': + resolution: {integrity: sha512-e8kZzERmCwUnBRVsgSQlAfrfU2rGoy0FFKPBXSlfEjc/O3KfA7QP0t1/2ZylrbchjmIKB4dPTd07A6WPr0eOrg==} + + '@vue/server-renderer@3.5.34': + resolution: {integrity: sha512-nHxmJoTrKsmrkbILRhkC9gY1G3moZbJTqCzDd7DOOzG5KH9oeJ0Unqrff5f9v0pW//jES05ZkJcNtfE8JjOIew==} + peerDependencies: + vue: 3.5.34 + + '@vue/shared@3.5.34': + resolution: {integrity: sha512-24uqU4OIiX29ryC3MeWid/Xf2fa2EFRUVLb77nRhk+UrTVrh/XiGtFAFmJBAtBRbjwNdsPRP+jj/OL27Eg1NDA==} + + '@vueuse/core@14.3.0': + resolution: {integrity: sha512-aHfz47g0ZhMtTVHmIzMVpJy8ePhhOy68GY5bv110+5DVtZ+W7BsOx+m61UNQqfrWyPztIHIanWa3E2tib3NFIw==} + peerDependencies: + vue: ^3.5.0 + + '@vueuse/metadata@14.3.0': + resolution: {integrity: sha512-BwxmbAzwAVF50+MW57GXOUEV61nFBGnlBvrTqj49PqWJu3uw7hdu72ztXeZ33RdZtDY6kO+bfCAE1PCn88Tktw==} + + '@vueuse/shared@14.3.0': + resolution: {integrity: sha512-bZpge9eSXwa4ToSiqJ7j6KRwhAsneMFoSz3LMWKQDkqimm3D/tbFlrklrs/IOqC8tEcYmXQZJ6N0UrjhBirVCg==} + peerDependencies: + vue: ^3.5.0 + + '@webcontainer/env@1.1.1': + resolution: {integrity: sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng==} + + acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + alien-signals@1.0.13: + resolution: {integrity: sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + arkenv@0.11.0: + resolution: {integrity: sha512-XLVk3uiNRwlaqJiRWqVGz5y75P30DczxuupzVz3EEbs2j539ftwusvlK+5y/MOIerUbskSpsm6c6B61YMr/UPA==} + peerDependencies: + arktype: ^2.1.22 + peerDependenciesMeta: + arktype: + optional: true + + arkregex@0.0.5: + resolution: {integrity: sha512-ncYjBdLlh5/QnVsAA8De16Tc9EqmYM7y/WU9j+236KcyYNUXogpz3sC4ATIZYzzLxwI+0sEOaQLEmLmRleaEXw==} + + arktype@2.2.0: + resolution: {integrity: sha512-t54MZ7ti5BhOEvzEkgKnWvqj+UbDfWig+DHr5I34xatymPusKLS0lQpNJd8M6DzmIto2QGszHfNKoFIT8tMCZQ==} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + assert-never@1.4.0: + resolution: {integrity: sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + + ast-v8-to-istanbul@1.0.0: + resolution: {integrity: sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==} + + axe-core@4.11.4: + resolution: {integrity: sha512-KunSNx+TVpkAw/6ULfhnx+HWRecjqZGTOyquAoWHYLRSdK1tB5Ihce1ZW+UY3fj33bYAFWPu7W/GRSmmrCGuxA==} + engines: {node: '>=4'} + + babel-walk@3.0.0-canary-5: + resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} + engines: {node: '>= 10.0.0'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + baseline-browser-mapping@2.10.29: + resolution: {integrity: sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + birpc@4.0.0: + resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} + + bole@5.0.29: + resolution: {integrity: sha512-eYR9i2ubLv5/4TFGyZsQ1cVH4jF9+qLJA72Aow+E7ZZQfqHqQNUZeX3w+pVWF76PQyjl5eDKf2xylyOOX76ozA==} + + brace-expansion@2.1.0: + resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==} + + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + engines: {node: 18 || 20 || >=22} + + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + cac@7.0.0: + resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} + engines: {node: '>=20.19.0'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + caniuse-lite@1.0.30001792: + resolution: {integrity: sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==} + + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + + character-parser@2.2.0: + resolution: {integrity: sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==} + + check-error@2.1.3: + resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} + engines: {node: '>= 16'} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + chromatic@13.3.5: + resolution: {integrity: sha512-MzPhxpl838qJUo0A55osCF2ifwPbjcIPeElr1d4SHcjnHoIcg7l1syJDrAYK/a+PcCBrOGi06jPNpQAln5hWgw==} + hasBin: true + peerDependencies: + '@chromatic-com/cypress': ^0.*.* || ^1.0.0 + '@chromatic-com/playwright': ^0.*.* || ^1.0.0 + peerDependenciesMeta: + '@chromatic-com/cypress': + optional: true + '@chromatic-com/playwright': + optional: true + + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + constantinople@4.0.1: + resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} + + convert-route@1.1.1: + resolution: {integrity: sha512-FENJ90K52uyE/qpbjy0i0gbglgKaL50BweqXx2OPaSG/pby2woRrnAdSVcGCdFFVvb/u/UTGqKybohiqcFWCMQ==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-es@1.2.3: + resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} + + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} + + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + + css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.5.0: + resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} + engines: {node: '>=18'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + devframe@0.1.22: + resolution: {integrity: sha512-2/dyUB8U/hg5BOk5cdrAWpesQIAx6P33GOjmVBdWOnTdZGHgZisN1y6lu2NAZYXTSgEYE3Sxyt59lN1I6/NSCQ==} + peerDependencies: + '@modelcontextprotocol/sdk': ^1.0.0 + peerDependenciesMeta: + '@modelcontextprotocol/sdk': + optional: true + + devframe@0.2.2: + resolution: {integrity: sha512-nB5xJR0XREJSVD7Me7j9UUY1NIpPlBGYI/b6EMigeoVPaUv7/RwKf/uyc/94P00yMMxQzSMy/94NzWemDd70SQ==} + peerDependencies: + '@modelcontextprotocol/sdk': ^1.0.0 + peerDependenciesMeta: + '@modelcontextprotocol/sdk': + optional: true + + diff@9.0.0: + resolution: {integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==} + engines: {node: '>=0.3.1'} + + doctypes@1.1.0: + resolution: {integrity: sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==} + + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + + dotenv@17.4.2: + resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + electron-to-chromium@1.5.353: + resolution: {integrity: sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w==} + + elysia@1.4.28: + resolution: {integrity: sha512-Vrx8sBnvq8squS/3yNBzR1jBXI+SgmnmvwawPjNuEHndUe5l1jV2Gp6JJ4ulDkEB8On6bWmmuyPpA+bq4t+WYg==} + peerDependencies: + '@sinclair/typebox': '>= 0.34.0 < 1' + '@types/bun': '>= 1.2.0' + exact-mirror: '>= 0.0.9' + file-type: '>= 20.0.0' + openapi-types: '>= 12.0.0' + typescript: '>= 5.0.0' + peerDependenciesMeta: + '@types/bun': + optional: true + typescript: + optional: true + + enhanced-resolve@5.21.2: + resolution: {integrity: sha512-xe9vQb5kReirPUxgQrXA3ihgbCqssmTiM7cOZ+Gzu+VeGWgpV98lLZvp0dl4yriyAePcewxGUs9UpKD8PET9KQ==} + engines: {node: '>=10.13.0'} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.28.0: + resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + esm-resolve@1.0.11: + resolution: {integrity: sha512-LxF0wfUQm3ldUDHkkV2MIbvvY0TgzIpJ420jHSV1Dm+IlplBEWiJTKWM61GtxUfvjV6iD4OtTYFGAGM2uuIUWg==} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + exact-mirror@1.0.0: + resolution: {integrity: sha512-tB6QSwlyUDZh22vS4ytBjmTvpMJ7eNNqSUtH4w7TpQsE7//V+MsdWUhO0B1UptzStDFHQBCxfJPtDDiVaFfRyQ==} + peerDependencies: + typebox: '>= 1.1.0' + peerDependenciesMeta: + typebox: + optional: true + + fast-decode-uri-component@1.0.1: + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-type@22.0.1: + resolution: {integrity: sha512-ww5Mhre0EE+jmBvOXTmXAbEMuZE7uX4a3+oRCQFNj8w++g3ev913N6tXQz0XTXbueQ5TWQfm6BdaViEHHn8bhA==} + engines: {node: '>=22'} + + filesize@10.1.6: + resolution: {integrity: sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==} + engines: {node: '>= 10.4.0'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-port-please@3.2.0: + resolution: {integrity: sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + h3@1.15.11: + resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} + + 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 + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hash-sum@2.0.0: + resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} + + hasown@2.0.3: + resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hono@4.12.18: + resolution: {integrity: sha512-RWzP96k/yv0PQfyXnWjs6zot20TqfpfsNXhOnev8d1InAxubW93L11/oNUc3tQqn2G0bSdAOBpX+2uDFHV7kdQ==} + engines: {node: '>=16.9.0'} + + hookable@6.1.1: + resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + individual@3.0.0: + resolution: {integrity: sha512-rUY5vtT748NMRbEMrTNiFfy29BgGZwGXUi2NFUVMWQrogSLzlJvQV9eeMWi+g1aVaQ53tpyLAQtd5x/JH0Nh1g==} + + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + engines: {node: '>= 0.4'} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-expression@4.0.0: + resolution: {integrity: sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} + engines: {node: '>=16'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + + js-stringify@1.0.2: + resolution: {integrity: sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==} + + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + + jstransformer@1.0.0: + resolution: {integrity: sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==} + + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + 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'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + logs-sdk@0.0.6: + resolution: {integrity: sha512-G4M1C9aLLBOIWpmw/Lqk4zrap/T2IJsoUOuUDjRcVSLy6lHQqxr3wCqIT1FvvpYTUYpEwvu4utsMY42jTNvx8Q==} + + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + + lru-cache@11.3.6: + resolution: {integrity: sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@8.0.5: + resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} + engines: {node: '>=16.14'} + + lucide-vue-next@1.0.0: + resolution: {integrity: sha512-V6SPvx1IHTj/UY+FrIYWV5faISsPSb8BnWSFDxAtezWKvWc9ZZ40PDrdu1/Qb5vg4lHWr1hs1BAMGVGm6V1Xdg==} + peerDependencies: + vue: '>=3.0.1' + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + magic-regexp@0.10.0: + resolution: {integrity: sha512-Uly1Bu4lO1hwHUW0CQeSWuRtzCMNO00CmXtS8N6fyvB3B979GOEEeAkiTUDsmbYLAbvpUS/Kt5c4ibosAzVyVg==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magicast@0.5.2: + resolution: {integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + memoirist@0.4.0: + resolution: {integrity: sha512-zxTgA0mSYELa66DimuNQDvyLq36AwDlTuVRbnQtB+VuTcKWm5Qc4z3WkSpgsFWHNhexqkIooqpv4hdcqrX5Nmg==} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + + 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: + optional: true + + node-mock-http@1.0.4: + resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} + + node-releases@2.0.38: + resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + + ofetch@1.5.1: + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} + + openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + + oxc-parser@0.104.0: + resolution: {integrity: sha512-sIEpobLwe7KhW1JdTvBJkNDgjJarHNsx+Q37iRNyASvmlDOD+f8Qirvwp6nFNz7Q5q3JcsJ1dpKM+oMPTDF/dw==} + engines: {node: ^20.19.0 || >=22.12.0} + + oxc-parser@0.126.0: + resolution: {integrity: sha512-FktCvLby/mOHyuijZt22+nOt10dS24gGUZE3XwIbUg7Kf4+rer3/5T7RgwzazlNuVsCjPloZ3p8E+4ONT3A8Kw==} + engines: {node: ^20.19.0 || >=22.12.0} + + oxc-parser@0.127.0: + resolution: {integrity: sha512-bkgD4qHlN7WxLdX8bLXdaU54TtQtAIg/ZBAfm0aje/mo3MRDo3P0hZSgr4U7O3xfX+fQmR5AP04JS/TGcZLcFA==} + engines: {node: ^20.19.0 || >=22.12.0} + + oxc-walker@0.6.0: + resolution: {integrity: sha512-BA3hlxq5+Sgzp7TCQF52XDXCK5mwoIZuIuxv/+JuuTzOs2RXkLqWZgZ69d8pJDDjnL7wiREZTWHBzFp/UWH88Q==} + peerDependencies: + oxc-parser: '>=0.98.0' + + oxc-walker@0.7.0: + resolution: {integrity: sha512-54B4KUhrzbzc4sKvKwVYm7E2PgeROpGba0/2nlNZMqfDyca+yOor5IMb4WLGBatGDT0nkzYdYuzylg7n3YfB7A==} + peerDependencies: + oxc-parser: '>=0.98.0' + + oxfmt@0.48.0: + resolution: {integrity: sha512-AVaLh+7XeGx+R1zfFV+f6VV61nT2MWVJXVUDhbTm5LBWGyNt64xAyh3NYYyjeY2WykNt9AvqSQLPHcbWquYF9g==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + oxlint-tsgolint@0.22.1: + resolution: {integrity: sha512-YUSGSLUnoolsu8gxISEDio3q1rtsCozwfOzASUn3DT2mR2EeQ93uEEnen7s+6LpF+lyTQFln1pQfqwBh/fsVEg==} + hasBin: true + + oxlint@1.63.0: + resolution: {integrity: sha512-9TGXetdjgIHOJ9OiReomP7nnrMkV9HxC1xM2ramJSLQpzxjsAJtQwa4wqkJN2f/uCrqZuJseFuSlWDdvcruveg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.22.1' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@7.3.0: + resolution: {integrity: sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==} + engines: {node: '>=20'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + package-manager-detector@1.6.0: + resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + + perfect-debounce@2.1.0: + resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + pixelmatch@7.2.0: + resolution: {integrity: sha512-xhcb4yHu9sM/G7foGzoLtXYcC0zHEaOXXjRKhGup0fw78Nf2Tkiapv4EQyMzrbcmQPsllAI7DbFY2UT7PlI9Pg==} + hasBin: true + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + playwright-core@1.59.1: + resolution: {integrity: sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.59.1: + resolution: {integrity: sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==} + engines: {node: '>=18'} + hasBin: true + + pngjs@7.0.0: + resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==} + engines: {node: '>=14.19.0'} + + postcss@8.5.14: + resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} + engines: {node: ^10 || ^12 || >=14} + + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + publint@0.3.21: + resolution: {integrity: sha512-OqejcnMV6E9zel2oCrUOJEiiFkGiAAni0A6ibfQNh1k9Gu5z4F+Yso8lllam7AzmV6Do0vp7u3UpZNRBwuXaHQ==} + engines: {node: '>=18'} + hasBin: true + + pug-attrs@3.0.0: + resolution: {integrity: sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==} + + pug-code-gen@3.0.4: + resolution: {integrity: sha512-6okWYIKdasTyXICyEtvobmTZAVX57JkzgzIi4iRJlin8kmhG+Xry2dsus+Mun/nGCn6F2U49haHI5mkELXB14g==} + + pug-error@2.1.0: + resolution: {integrity: sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==} + + pug-filters@4.0.0: + resolution: {integrity: sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==} + + pug-lexer@5.0.1: + resolution: {integrity: sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==} + + pug-linker@4.0.0: + resolution: {integrity: sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==} + + pug-load@3.0.0: + resolution: {integrity: sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==} + + pug-parser@6.0.0: + resolution: {integrity: sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==} + + pug-runtime@3.0.1: + resolution: {integrity: sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==} + + pug-strip-comments@2.0.0: + resolution: {integrity: sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==} + + pug-walk@2.0.0: + resolution: {integrity: sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==} + + pug@3.0.4: + resolution: {integrity: sha512-kFfq5mMzrS7+wrl5pLJzZEzemx34OQ0w4SARfhy/3yxTlhbstsudDwJzhf1hP02yHzbjoVMSXUj/Sz6RNfMyXg==} + + quansync@1.0.0: + resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} + + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + + react-dom@19.2.6: + resolution: {integrity: sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==} + peerDependencies: + react: ^19.2.6 + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react@19.2.6: + resolution: {integrity: sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==} + engines: {node: '>=0.10.0'} + + read-yaml-file@2.1.0: + resolution: {integrity: sha512-UkRNRIwnhG+y7hpqnycCL/xbTk7+ia9VuVTC0S+zVbwd65DI9eUpRMfsWIGrCWxTU/mi+JW8cHQCrv+zfCbEPQ==} + engines: {node: '>=10.13'} + + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + + recast@0.23.11: + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + + regexparam@3.0.0: + resolution: {integrity: sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==} + engines: {node: '>=8'} + + reka-ui@2.9.7: + resolution: {integrity: sha512-aX7foYYR20v4+majO58OJJdBNfLMm0eJb448l9N4JVy8JB7GXOr4H/S4a+J1pkcoxZH8Cb7YHpJ855+miAm7sA==} + peerDependencies: + vue: '>= 3.4.0' + + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true + + rolldown@1.0.1: + resolution: {integrity: sha512-X0KQHljNnEkWNqqiz9zJrGunh1B0HgOxLXvnFpCOcadzcy5qohZ3tqMEUg00vncoRovXuK3ZqCT9KnnKzoInFQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rou3@0.8.1: + resolution: {integrity: sha512-ePa+XGk00/3HuCqrEnK3LxJW7I0SdNg6EFzKUJG73hMAdDcOUC/i/aSz7LSDwLrGr33kal/rqOGydzwl6U7zBA==} + + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.8.0: + resolution: {integrity: sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==} + engines: {node: '>=10'} + hasBin: true + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + srvx@0.11.15: + resolution: {integrity: sha512-iXsux0UcOjdvs0LCMa2Ws3WwcDUozA3JN3BquNXkaFPP7TpRqgunKdEgoZ/uwb1J6xaYHfxtz9Twlh6yzwM6Tg==} + engines: {node: '>=20.16.0'} + hasBin: true + + std-env@4.1.0: + resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} + + storybook@10.3.6: + resolution: {integrity: sha512-vbSz7g/1rGMC1uAULqMZjALkIuLu2QABqfhRYhyr/11kzyesi+vAmwyJLukZP1FfecxGOgMwOh6GS0YsGpHAvQ==} + hasBin: true + peerDependencies: + prettier: ^2 || ^3 + vite-plus: ^0.1.15 + peerDependenciesMeta: + prettier: + optional: true + vite-plus: + optional: true + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-comments-strings@1.2.0: + resolution: {integrity: sha512-zwF4bmnyEjZwRhaak9jUWNxc0DoeKBJ7lwSN/LEc8dQXZcUFG6auaaTQJokQWXopLdM3iTx01nQT8E4aL29DAQ==} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strtok3@10.3.5: + resolution: {integrity: sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==} + engines: {node: '>=18'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tailwind-merge@3.6.0: + resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==} + + tailwindcss@4.3.0: + resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} + + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@1.1.2: + resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==} + engines: {node: '>=18'} + + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + + tinypool@2.1.0: + resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + engines: {node: ^20.0.0 || >=22.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyrainbow@3.1.0: + resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + engines: {node: '>=14.0.0'} + + tldts-core@7.0.30: + resolution: {integrity: sha512-uiHN8PIB1VmWyS98eZYja4xzlYqeFZVjb4OuYlJQnZAuJhMw4PbKQOKgHKhBdJR3FE/t5mUQ1Kd80++B+qhD1Q==} + + tldts@7.0.30: + resolution: {integrity: sha512-ELrFxuqsDdHUwoh0XxDbxuLD3Wnz49Z57IFvTtvWy1hJdcMZjXLIuonjilCiWHlT2GbE4Wlv1wKVTzDFnXH1aw==} + hasBin: true + + token-stream@1.0.0: + resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==} + + token-types@6.1.2: + resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} + engines: {node: '>=14.16'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + tough-cookie@6.0.1: + resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} + engines: {node: '>=16'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + ts-map@1.0.3: + resolution: {integrity: sha512-vDWbsl26LIcPGmDpoVzjEP6+hvHZkBkLW7JpvwbCv/5IYPJlsbzCVXY3wsCeAxAUeTclNOUZxnLdGh3VBD/J6w==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tw-animate-css@1.4.0: + resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-level-regexp@0.1.17: + resolution: {integrity: sha512-wTk4DH3cxwk196uGLK/E9pE45aLfeKJacKmcEgEOA/q5dnPGNxXt0cfYdFxb57L+sEpf1oJH4Dnx/pnRcku9jg==} + + 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==} + + uint8array-extras@1.5.0: + resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} + engines: {node: '>=18'} + + unconfig-core@7.5.0: + resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} + + unconfig@7.5.0: + resolution: {integrity: sha512-oi8Qy2JV4D3UQ0PsopR28CzdQ3S/5A1zwsUwp/rosSbfhJ5z7b90bIyTwi/F7hCLD4SGcZVjDzd4XoUQcEanvA==} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + unhead@3.1.0: + resolution: {integrity: sha512-SH1PAjAMspLIoBjAjE/R8hty2NYo7YcIrdu5I+PVfiW4QmmwEG4pgoiKG0MCs6WRSwiatzeha+4lqSqvHW9PEg==} + peerDependencies: + vite: '>=6.4.2' + peerDependenciesMeta: + vite: + optional: true + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unplugin@2.3.11: + resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} + engines: {node: '>=18.12.0'} + + unplugin@3.0.0: + resolution: {integrity: sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==} + engines: {node: ^20.19.0 || >=22.12.0} + + unstorage@1.17.5: + resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6 || ^7 || ^8 + '@deno/kv': '>=0.9.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.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 + '@vercel/kv': ^1 || ^2 || ^3 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + 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 + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + valibot@1.4.0: + resolution: {integrity: sha512-iC/x7fVcSyOwlm/VSt7RlHnzNGLGvR9GnxdifUeWoCJo0q4ZZvrVkIHC6faTlkxG47I2Y4UrFquPuVHCrOnrLg==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + + vike-vue@0.9.11: + resolution: {integrity: sha512-Ujcu7NG/ZFsiAgEomA0PtuHFg0J/BMcol/QHiDzaIlov2JSiDfapyBLidrPVTrHwLHvmeCnxa4ruVqG+/Vj1XA==} + peerDependencies: + vike: '>=0.4.191' + vue: '>=3.0.0' + + vike@0.4.259: + resolution: {integrity: sha512-5S+rgfLYfozCqXTlyZzr6P4FXOIoPcsSbqYO32keBK2Jun4AKR5BI/sQiP3w09Zq/WZkywEu0ofHFAAxtaIdSg==} + engines: {node: '>=20.19.0'} + hasBin: true + peerDependencies: + react-streaming: '>=0.3.42' + vite: '>=6.3.0' + peerDependenciesMeta: + react-streaming: + optional: true + vite: + optional: true + + vite-bundle-analyzer@1.3.8: + resolution: {integrity: sha512-IIk7WPhoYs7pyo75jwI+dFt7yykgjK7NY+dqnJtiZnyqP2k6NgPb3TY80FLFjtgnfk/o+OjI18+anKyeviCbRA==} + hasBin: true + + vite-plugin-wrapper@0.1.0: + resolution: {integrity: sha512-orELI9PzoYKFRsI8TP4pTt05rL0oS68u8kJSANpJLZWdYdkqEsjEPrTLG1U/7x5PlACxIebmkbiBPaCg/oPSsw==} + peerDependencies: + vite: '>=7' + + vite-plus@0.1.21: + resolution: {integrity: sha512-7MLc9abMelE8g5/vj/xEY8joWT9PLnN/XjX3FhwOliB75WOX3YADcMEFrufmvnl+D4UhrMNZQa2k3A5CSuFJhw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + vue-component-meta@2.2.12: + resolution: {integrity: sha512-dQU6/obNSNbennJ1xd+rhDid4g3vQro+9qUBBIg8HMZH2Zs1jTpkFNxuQ3z77bOlU+ew08Qck9sbYkdSePr0Pw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + vue-component-type-helpers@2.2.12: + resolution: {integrity: sha512-YbGqHZ5/eW4SnkPNR44mKVc6ZKQoRs/Rux1sxC6rdwXb4qpbOSYfDr9DsTHolOTGmIKgM9j141mZbBeg05R1pw==} + + vue-component-type-helpers@3.2.9: + resolution: {integrity: sha512-S3BiWYaLSzHxTpln665ELSrMR9UYmrIDUmhik7nVZxmJjTKL2/a+ew1hvGxksKelivm0ujjWfG1fYOiU/2e8rA==} + + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-docgen-api@4.79.2: + resolution: {integrity: sha512-n9ENAcs+40awPZMsas7STqjkZiVlIjxIKgiJr5rSohDP0/JCrD9VtlzNojafsA1MChm/hz2h3PDtUedx3lbgfA==} + peerDependencies: + vue: '>=2' + + vue-inbrowser-compiler-independent-utils@4.71.1: + resolution: {integrity: sha512-K3wt3iVmNGaFEOUR4JIThQRWfqokxLfnPslD41FDZB2ajXp789+wCqJyGYlIFsvEQ2P61PInw6/ph5iiqg51gg==} + peerDependencies: + vue: '>=2' + + vue-virtual-scroller@3.0.3: + resolution: {integrity: sha512-nLWjtpPf/GyvIEEIWAuzevmTlC/aVf0yOcNkXDTUxZWyshsK6B6vc8R8wo9Nb8bpjy7wbi1zPMhzTKwUvWHQmg==} + peerDependencies: + vue: ^3.3.0 + + vue@3.5.34: + resolution: {integrity: sha512-WdLBG9gm02OgJIG9axd5Hpx0TFLdzVgfG2evFFu8Rur5O/IoGc5cMjnjh3tPL6GnRGsYvUhBSKVPYVcxRKpMCA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + with@7.0.2: + resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} + engines: {node: '>= 10.0.0'} + + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + write-yaml-file@5.0.0: + resolution: {integrity: sha512-FdNA4RyH1L43TlvGG8qOMIfcEczwA5ij+zLXUy3Z83CjxhLvcV7/Q/8pk22wnCgYw7PJhtK+7lhO+qqyT4NdvQ==} + engines: {node: '>=16.14'} + + ws@8.20.0: + resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.20.1: + resolution: {integrity: sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + +snapshots: + + '@adobe/css-tools@4.4.4': {} + + '@ark/schema@0.56.0': + dependencies: + '@ark/util': 0.56.0 + + '@ark/util@0.56.0': {} + + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.3': {} + + '@babel/core@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helpers': 7.29.2 + '@babel/parser': 7.29.3 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.1': + dependencies: + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.28.6': + dependencies: + '@babel/compat-data': 7.29.3 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.28.6': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.29.2': + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + + '@babel/parser@7.29.3': + dependencies: + '@babel/types': 7.29.0 + + '@babel/runtime@7.29.2': {} + + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 + + '@babel/traverse@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.3 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@bcoe/v8-coverage@1.0.2': {} + + '@blazediff/core@1.9.1': {} + + '@borewit/text-codec@0.2.2': {} + + '@brillout/import@0.2.6': {} + + '@brillout/json-serializer@0.5.23': {} + + '@brillout/picocolors@1.0.30': {} + + '@brillout/vite-plugin-server-entry@0.7.18': + dependencies: + '@brillout/import': 0.2.6 + '@brillout/picocolors': 1.0.30 + + '@chromatic-com/storybook@5.1.2(storybook@10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)))': + dependencies: + '@neoconfetti/react': 1.0.0 + chromatic: 13.3.5 + filesize: 10.1.6 + jsonfile: 6.2.1 + storybook: 10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)) + strip-ansi: 7.2.0 + transitivePeerDependencies: + - '@chromatic-com/cypress' + - '@chromatic-com/playwright' + + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/core@1.9.2': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.9.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.27.7': + optional: true + + '@esbuild/aix-ppc64@0.28.0': + optional: true + + '@esbuild/android-arm64@0.27.7': + optional: true + + '@esbuild/android-arm64@0.28.0': + optional: true + + '@esbuild/android-arm@0.27.7': + optional: true + + '@esbuild/android-arm@0.28.0': + optional: true + + '@esbuild/android-x64@0.27.7': + optional: true + + '@esbuild/android-x64@0.28.0': + optional: true + + '@esbuild/darwin-arm64@0.27.7': + optional: true + + '@esbuild/darwin-arm64@0.28.0': + optional: true + + '@esbuild/darwin-x64@0.27.7': + optional: true + + '@esbuild/darwin-x64@0.28.0': + optional: true + + '@esbuild/freebsd-arm64@0.27.7': + optional: true + + '@esbuild/freebsd-arm64@0.28.0': + optional: true + + '@esbuild/freebsd-x64@0.27.7': + optional: true + + '@esbuild/freebsd-x64@0.28.0': + optional: true + + '@esbuild/linux-arm64@0.27.7': + optional: true + + '@esbuild/linux-arm64@0.28.0': + optional: true + + '@esbuild/linux-arm@0.27.7': + optional: true + + '@esbuild/linux-arm@0.28.0': + optional: true + + '@esbuild/linux-ia32@0.27.7': + optional: true + + '@esbuild/linux-ia32@0.28.0': + optional: true + + '@esbuild/linux-loong64@0.27.7': + optional: true + + '@esbuild/linux-loong64@0.28.0': + optional: true + + '@esbuild/linux-mips64el@0.27.7': + optional: true + + '@esbuild/linux-mips64el@0.28.0': + optional: true + + '@esbuild/linux-ppc64@0.27.7': + optional: true + + '@esbuild/linux-ppc64@0.28.0': + optional: true + + '@esbuild/linux-riscv64@0.27.7': + optional: true + + '@esbuild/linux-riscv64@0.28.0': + optional: true + + '@esbuild/linux-s390x@0.27.7': + optional: true + + '@esbuild/linux-s390x@0.28.0': + optional: true + + '@esbuild/linux-x64@0.27.7': + optional: true + + '@esbuild/linux-x64@0.28.0': + optional: true + + '@esbuild/netbsd-arm64@0.27.7': + optional: true + + '@esbuild/netbsd-arm64@0.28.0': + optional: true + + '@esbuild/netbsd-x64@0.27.7': + optional: true + + '@esbuild/netbsd-x64@0.28.0': + optional: true + + '@esbuild/openbsd-arm64@0.27.7': + optional: true + + '@esbuild/openbsd-arm64@0.28.0': + optional: true + + '@esbuild/openbsd-x64@0.27.7': + optional: true + + '@esbuild/openbsd-x64@0.28.0': + optional: true + + '@esbuild/openharmony-arm64@0.27.7': + optional: true + + '@esbuild/openharmony-arm64@0.28.0': + optional: true + + '@esbuild/sunos-x64@0.27.7': + optional: true + + '@esbuild/sunos-x64@0.28.0': + optional: true + + '@esbuild/win32-arm64@0.27.7': + optional: true + + '@esbuild/win32-arm64@0.28.0': + optional: true + + '@esbuild/win32-ia32@0.27.7': + optional: true + + '@esbuild/win32-ia32@0.28.0': + optional: true + + '@esbuild/win32-x64@0.27.7': + optional: true + + '@esbuild/win32-x64@0.28.0': + optional: true + + '@floating-ui/core@1.7.5': + dependencies: + '@floating-ui/utils': 0.2.11 + + '@floating-ui/dom@1.7.6': + dependencies: + '@floating-ui/core': 1.7.5 + '@floating-ui/utils': 0.2.11 + + '@floating-ui/utils@0.2.11': {} + + '@floating-ui/vue@1.1.11(vue@3.5.34(typescript@6.0.3))': + dependencies: + '@floating-ui/dom': 1.7.6 + '@floating-ui/utils': 0.2.11 + vue-demi: 0.14.10(vue@3.5.34(typescript@6.0.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@gwhitney/detect-indent@7.0.1': {} + + '@internationalized/date@3.12.1': + dependencies: + '@swc/helpers': 0.5.21 + + '@internationalized/number@3.6.6': + dependencies: + '@swc/helpers': 0.5.21 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@mdx-js/react@3.1.1(@types/react@19.2.14)(react@19.2.6)': + dependencies: + '@types/mdx': 2.0.13 + '@types/react': 19.2.14 + react: 19.2.6 + + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 + optional: true + + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + dependencies: + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 + '@tybys/wasm-util': 0.10.2 + optional: true + + '@neoconfetti/react@1.0.0': {} + + '@oxc-parser/binding-android-arm-eabi@0.126.0': + optional: true + + '@oxc-parser/binding-android-arm-eabi@0.127.0': + optional: true + + '@oxc-parser/binding-android-arm64@0.104.0': + optional: true + + '@oxc-parser/binding-android-arm64@0.126.0': + optional: true + + '@oxc-parser/binding-android-arm64@0.127.0': + optional: true + + '@oxc-parser/binding-darwin-arm64@0.104.0': + optional: true + + '@oxc-parser/binding-darwin-arm64@0.126.0': + optional: true + + '@oxc-parser/binding-darwin-arm64@0.127.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.104.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.126.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.127.0': + optional: true + + '@oxc-parser/binding-freebsd-x64@0.104.0': + optional: true + + '@oxc-parser/binding-freebsd-x64@0.126.0': + optional: true + + '@oxc-parser/binding-freebsd-x64@0.127.0': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.104.0': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.126.0': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.127.0': + optional: true + + '@oxc-parser/binding-linux-arm-musleabihf@0.126.0': + optional: true + + '@oxc-parser/binding-linux-arm-musleabihf@0.127.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.104.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.126.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.127.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.104.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.126.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.127.0': + optional: true + + '@oxc-parser/binding-linux-ppc64-gnu@0.126.0': + optional: true + + '@oxc-parser/binding-linux-ppc64-gnu@0.127.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-gnu@0.104.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-gnu@0.126.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-gnu@0.127.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-musl@0.126.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-musl@0.127.0': + optional: true + + '@oxc-parser/binding-linux-s390x-gnu@0.104.0': + optional: true + + '@oxc-parser/binding-linux-s390x-gnu@0.126.0': + optional: true + + '@oxc-parser/binding-linux-s390x-gnu@0.127.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.104.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.126.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.127.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.104.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.126.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.127.0': + optional: true + + '@oxc-parser/binding-openharmony-arm64@0.104.0': + optional: true + + '@oxc-parser/binding-openharmony-arm64@0.126.0': + optional: true + + '@oxc-parser/binding-openharmony-arm64@0.127.0': + optional: true + + '@oxc-parser/binding-wasm32-wasi@0.104.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + optional: true + + '@oxc-parser/binding-wasm32-wasi@0.126.0': + dependencies: + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + optional: true + + '@oxc-parser/binding-wasm32-wasi@0.127.0': + dependencies: + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.104.0': + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.126.0': + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.127.0': + optional: true + + '@oxc-parser/binding-win32-ia32-msvc@0.126.0': + optional: true + + '@oxc-parser/binding-win32-ia32-msvc@0.127.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.104.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.126.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.127.0': + optional: true + + '@oxc-project/runtime@0.129.0': {} + + '@oxc-project/types@0.104.0': {} + + '@oxc-project/types@0.126.0': {} + + '@oxc-project/types@0.127.0': {} + + '@oxc-project/types@0.129.0': {} + + '@oxc-project/types@0.130.0': {} + + '@oxfmt/binding-android-arm-eabi@0.48.0': + optional: true + + '@oxfmt/binding-android-arm64@0.48.0': + optional: true + + '@oxfmt/binding-darwin-arm64@0.48.0': + optional: true + + '@oxfmt/binding-darwin-x64@0.48.0': + optional: true + + '@oxfmt/binding-freebsd-x64@0.48.0': + optional: true + + '@oxfmt/binding-linux-arm-gnueabihf@0.48.0': + optional: true + + '@oxfmt/binding-linux-arm-musleabihf@0.48.0': + optional: true + + '@oxfmt/binding-linux-arm64-gnu@0.48.0': + optional: true + + '@oxfmt/binding-linux-arm64-musl@0.48.0': + optional: true + + '@oxfmt/binding-linux-ppc64-gnu@0.48.0': + optional: true + + '@oxfmt/binding-linux-riscv64-gnu@0.48.0': + optional: true + + '@oxfmt/binding-linux-riscv64-musl@0.48.0': + optional: true + + '@oxfmt/binding-linux-s390x-gnu@0.48.0': + optional: true + + '@oxfmt/binding-linux-x64-gnu@0.48.0': + optional: true + + '@oxfmt/binding-linux-x64-musl@0.48.0': + optional: true + + '@oxfmt/binding-openharmony-arm64@0.48.0': + optional: true + + '@oxfmt/binding-win32-arm64-msvc@0.48.0': + optional: true + + '@oxfmt/binding-win32-ia32-msvc@0.48.0': + optional: true + + '@oxfmt/binding-win32-x64-msvc@0.48.0': + optional: true + + '@oxlint-tsgolint/darwin-arm64@0.22.1': + optional: true + + '@oxlint-tsgolint/darwin-x64@0.22.1': + optional: true + + '@oxlint-tsgolint/linux-arm64@0.22.1': + optional: true + + '@oxlint-tsgolint/linux-x64@0.22.1': + optional: true + + '@oxlint-tsgolint/win32-arm64@0.22.1': + optional: true + + '@oxlint-tsgolint/win32-x64@0.22.1': + optional: true + + '@oxlint/binding-android-arm-eabi@1.63.0': + optional: true + + '@oxlint/binding-android-arm64@1.63.0': + optional: true + + '@oxlint/binding-darwin-arm64@1.63.0': + optional: true + + '@oxlint/binding-darwin-x64@1.63.0': + optional: true + + '@oxlint/binding-freebsd-x64@1.63.0': + optional: true + + '@oxlint/binding-linux-arm-gnueabihf@1.63.0': + optional: true + + '@oxlint/binding-linux-arm-musleabihf@1.63.0': + optional: true + + '@oxlint/binding-linux-arm64-gnu@1.63.0': + optional: true + + '@oxlint/binding-linux-arm64-musl@1.63.0': + optional: true + + '@oxlint/binding-linux-ppc64-gnu@1.63.0': + optional: true + + '@oxlint/binding-linux-riscv64-gnu@1.63.0': + optional: true + + '@oxlint/binding-linux-riscv64-musl@1.63.0': + optional: true + + '@oxlint/binding-linux-s390x-gnu@1.63.0': + optional: true + + '@oxlint/binding-linux-x64-gnu@1.63.0': + optional: true + + '@oxlint/binding-linux-x64-musl@1.63.0': + optional: true + + '@oxlint/binding-openharmony-arm64@1.63.0': + optional: true + + '@oxlint/binding-win32-arm64-msvc@1.63.0': + optional: true + + '@oxlint/binding-win32-ia32-msvc@1.63.0': + optional: true + + '@oxlint/binding-win32-x64-msvc@1.63.0': + optional: true + + '@phosphor-icons/vue@2.2.1(vue@3.5.34(typescript@6.0.3))': + dependencies: + vue: 3.5.34(typescript@6.0.3) + + '@pnpm/constants@1001.3.1': {} + + '@pnpm/core-loggers@1001.0.9(@pnpm/logger@1001.0.1)': + dependencies: + '@pnpm/logger': 1001.0.1 + '@pnpm/types': 1001.3.0 + + '@pnpm/error@1000.1.0': + dependencies: + '@pnpm/constants': 1001.3.1 + + '@pnpm/graceful-fs@1000.1.0': + dependencies: + graceful-fs: 4.2.11 + + '@pnpm/logger@1001.0.1': + dependencies: + bole: 5.0.29 + split2: 4.2.0 + + '@pnpm/manifest-utils@1002.0.5(@pnpm/logger@1001.0.1)': + dependencies: + '@pnpm/core-loggers': 1001.0.9(@pnpm/logger@1001.0.1) + '@pnpm/error': 1000.1.0 + '@pnpm/logger': 1001.0.1 + '@pnpm/semver.peer-range': 1000.0.0 + '@pnpm/types': 1001.3.0 + semver: 7.8.0 + + '@pnpm/read-project-manifest@1001.2.6(@pnpm/logger@1001.0.1)': + dependencies: + '@gwhitney/detect-indent': 7.0.1 + '@pnpm/error': 1000.1.0 + '@pnpm/graceful-fs': 1000.1.0 + '@pnpm/logger': 1001.0.1 + '@pnpm/manifest-utils': 1002.0.5(@pnpm/logger@1001.0.1) + '@pnpm/text.comments-parser': 1000.0.0 + '@pnpm/types': 1001.3.0 + '@pnpm/write-project-manifest': 1000.0.16 + fast-deep-equal: 3.1.3 + is-windows: 1.0.2 + json5: 2.2.3 + parse-json: 5.2.0 + read-yaml-file: 2.1.0 + strip-bom: 4.0.0 + + '@pnpm/semver.peer-range@1000.0.0': + dependencies: + semver: 7.8.0 + + '@pnpm/text.comments-parser@1000.0.0': + dependencies: + strip-comments-strings: 1.2.0 + + '@pnpm/types@1001.3.0': {} + + '@pnpm/write-project-manifest@1000.0.16': + dependencies: + '@pnpm/text.comments-parser': 1000.0.0 + '@pnpm/types': 1001.3.0 + json5: 2.2.3 + write-file-atomic: 5.0.1 + write-yaml-file: 5.0.0 + + '@polka/url@1.0.0-next.29': {} + + '@publint/pack@0.1.4': {} + + '@quansync/fs@1.0.0': + dependencies: + quansync: 1.0.0 + + '@rolldown/binding-android-arm64@1.0.1': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.1': + optional: true + + '@rolldown/binding-darwin-x64@1.0.1': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.1': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.1': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.1': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.1': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.0.1': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.0.1': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.1': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.1': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.1': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.1': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.1': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.1': + optional: true + + '@rolldown/debug@1.0.1': {} + + '@rolldown/pluginutils@1.0.0': {} + + '@rolldown/pluginutils@1.0.0-rc.13': {} + + '@sentry-internal/browser-utils@10.52.0': + dependencies: + '@sentry/core': 10.52.0 + + '@sentry-internal/feedback@10.52.0': + dependencies: + '@sentry/core': 10.52.0 + + '@sentry-internal/replay-canvas@10.52.0': + dependencies: + '@sentry-internal/replay': 10.52.0 + '@sentry/core': 10.52.0 + + '@sentry-internal/replay@10.52.0': + dependencies: + '@sentry-internal/browser-utils': 10.52.0 + '@sentry/core': 10.52.0 + + '@sentry/babel-plugin-component-annotate@5.2.1': {} + + '@sentry/browser@10.52.0': + dependencies: + '@sentry-internal/browser-utils': 10.52.0 + '@sentry-internal/feedback': 10.52.0 + '@sentry-internal/replay': 10.52.0 + '@sentry-internal/replay-canvas': 10.52.0 + '@sentry/core': 10.52.0 + + '@sentry/bundler-plugin-core@5.2.1': + dependencies: + '@babel/core': 7.29.0 + '@sentry/babel-plugin-component-annotate': 5.2.1 + '@sentry/cli': 2.58.5 + dotenv: 16.6.1 + find-up: 5.0.0 + glob: 13.0.6 + magic-string: 0.30.21 + transitivePeerDependencies: + - encoding + - supports-color + + '@sentry/cli-darwin@2.58.5': + optional: true + + '@sentry/cli-linux-arm64@2.58.5': + optional: true + + '@sentry/cli-linux-arm@2.58.5': + optional: true + + '@sentry/cli-linux-i686@2.58.5': + optional: true + + '@sentry/cli-linux-x64@2.58.5': + optional: true + + '@sentry/cli-win32-arm64@2.58.5': + optional: true + + '@sentry/cli-win32-i686@2.58.5': + optional: true + + '@sentry/cli-win32-x64@2.58.5': + optional: true + + '@sentry/cli@2.58.5': + dependencies: + https-proxy-agent: 5.0.1 + node-fetch: 2.7.0 + progress: 2.0.3 + proxy-from-env: 1.1.0 + which: 2.0.2 + optionalDependencies: + '@sentry/cli-darwin': 2.58.5 + '@sentry/cli-linux-arm': 2.58.5 + '@sentry/cli-linux-arm64': 2.58.5 + '@sentry/cli-linux-i686': 2.58.5 + '@sentry/cli-linux-x64': 2.58.5 + '@sentry/cli-win32-arm64': 2.58.5 + '@sentry/cli-win32-i686': 2.58.5 + '@sentry/cli-win32-x64': 2.58.5 + transitivePeerDependencies: + - encoding + - supports-color + + '@sentry/core@10.52.0': {} + + '@sentry/rollup-plugin@5.2.1': + dependencies: + '@sentry/bundler-plugin-core': 5.2.1 + magic-string: 0.30.21 + transitivePeerDependencies: + - encoding + - supports-color + + '@sentry/vite-plugin@5.2.1': + dependencies: + '@sentry/bundler-plugin-core': 5.2.1 + '@sentry/rollup-plugin': 5.2.1 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@sentry/vue@10.52.0(vue@3.5.34(typescript@6.0.3))': + dependencies: + '@sentry/browser': 10.52.0 + '@sentry/core': 10.52.0 + vue: 3.5.34(typescript@6.0.3) + + '@sinclair/typebox@0.34.49': {} + + '@standard-schema/spec@1.1.0': {} + + '@storybook/addon-a11y@10.3.6(storybook@10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)))': + dependencies: + '@storybook/global': 5.0.0 + axe-core: 4.11.4 + storybook: 10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)) + + '@storybook/addon-docs@10.3.6(@types/react@19.2.14)(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(storybook@10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)))': + dependencies: + '@mdx-js/react': 3.1.1(@types/react@19.2.14)(react@19.2.6) + '@storybook/csf-plugin': 10.3.6(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(storybook@10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3))) + '@storybook/icons': 2.0.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@storybook/react-dom-shim': 10.3.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3))) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + storybook: 10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)) + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@types/react' + - esbuild + - rollup + - vite + - webpack + + '@storybook/addon-vitest@10.3.6(@vitest/browser-playwright@4.1.6(@voidzero-dev/vite-plus-core@0.1.21)(@voidzero-dev/vite-plus-test@0.1.21)(playwright@1.59.1))(@vitest/browser@4.1.6)(@vitest/runner@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)))': + dependencies: + '@storybook/global': 5.0.0 + '@storybook/icons': 2.0.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + storybook: 10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)) + optionalDependencies: + '@vitest/browser': 4.1.6(@voidzero-dev/vite-plus-core@0.1.21)(@voidzero-dev/vite-plus-test@0.1.21) + '@vitest/browser-playwright': 4.1.6(@voidzero-dev/vite-plus-core@0.1.21)(@voidzero-dev/vite-plus-test@0.1.21)(playwright@1.59.1) + '@vitest/runner': 4.1.6 + vitest: '@voidzero-dev/vite-plus-test@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)' + transitivePeerDependencies: + - react + - react-dom + + '@storybook/builder-vite@10.3.6(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(storybook@10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)))': + dependencies: + '@storybook/csf-plugin': 10.3.6(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(storybook@10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3))) + storybook: 10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)) + ts-dedent: 2.2.0 + vite: '@voidzero-dev/vite-plus-core@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)' + transitivePeerDependencies: + - esbuild + - rollup + - webpack + + '@storybook/csf-plugin@10.3.6(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(storybook@10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)))': + dependencies: + storybook: 10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)) + unplugin: 2.3.11 + optionalDependencies: + esbuild: 0.28.0 + vite: '@voidzero-dev/vite-plus-core@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)' + + '@storybook/global@5.0.0': {} + + '@storybook/icons@2.0.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + dependencies: + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + + '@storybook/react-dom-shim@10.3.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)))': + dependencies: + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + storybook: 10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)) + + '@storybook/vue3-vite@10.3.6(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(storybook@10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)))(vue@3.5.34(typescript@6.0.3))': + dependencies: + '@storybook/builder-vite': 10.3.6(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(storybook@10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3))) + '@storybook/vue3': 10.3.6(storybook@10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)))(vue@3.5.34(typescript@6.0.3)) + magic-string: 0.30.21 + storybook: 10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)) + typescript: 5.9.3 + vite: '@voidzero-dev/vite-plus-core@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)' + vue-component-meta: 2.2.12(typescript@5.9.3) + vue-docgen-api: 4.79.2(vue@3.5.34(typescript@6.0.3)) + transitivePeerDependencies: + - esbuild + - rollup + - vue + - webpack + + '@storybook/vue3@10.3.6(storybook@10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)))(vue@3.5.34(typescript@6.0.3))': + dependencies: + '@storybook/global': 5.0.0 + storybook: 10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)) + type-fest: 2.19.0 + vue: 3.5.34(typescript@6.0.3) + vue-component-type-helpers: 3.2.9 + + '@swc/helpers@0.5.21': + dependencies: + tslib: 2.8.1 + + '@tailwindcss/node@4.3.0': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.21.2 + jiti: 2.7.0 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.3.0 + + '@tailwindcss/oxide-android-arm64@4.3.0': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.3.0': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.3.0': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + optional: true + + '@tailwindcss/oxide@4.3.0': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-x64': 4.3.0 + '@tailwindcss/oxide-freebsd-x64': 4.3.0 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.0 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.0 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-x64-musl': 4.3.0 + '@tailwindcss/oxide-wasm32-wasi': 4.3.0 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.0 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.0 + + '@tailwindcss/vite@4.3.0(@voidzero-dev/vite-plus-core@0.1.21)': + dependencies: + '@tailwindcss/node': 4.3.0 + '@tailwindcss/oxide': 4.3.0 + tailwindcss: 4.3.0 + vite: '@voidzero-dev/vite-plus-core@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)' + + '@tanstack/virtual-core@3.14.0': {} + + '@tanstack/vue-virtual@3.13.24(vue@3.5.34(typescript@6.0.3))': + dependencies: + '@tanstack/virtual-core': 3.14.0 + vue: 3.5.34(typescript@6.0.3) + + '@testing-library/dom@10.4.1': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/runtime': 7.29.2 + '@types/aria-query': 5.0.4 + 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.9.1': + dependencies: + '@adobe/css-tools': 4.4.4 + aria-query: 5.3.2 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + picocolors: 1.1.1 + redent: 3.0.0 + + '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': + dependencies: + '@testing-library/dom': 10.4.1 + + '@tokenizer/inflate@0.4.1': + dependencies: + debug: 4.4.3 + token-types: 6.1.2 + transitivePeerDependencies: + - supports-color + + '@tokenizer/token@0.3.0': {} + + '@tybys/wasm-util@0.10.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/aria-query@5.0.4': {} + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/deep-eql@4.0.2': {} + + '@types/estree@1.0.9': {} + + '@types/mdx@2.0.13': {} + + '@types/node@20.19.37': + dependencies: + undici-types: 6.21.0 + + '@types/react@19.2.14': + dependencies: + csstype: 3.2.3 + + '@types/web-bluetooth@0.0.21': {} + + '@unhead/bundler@3.1.0(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.0.1)(typescript@6.0.3)(unhead@3.1.0(@voidzero-dev/vite-plus-core@0.1.21))': + dependencies: + '@vitejs/devtools-kit': 0.1.22(@voidzero-dev/vite-plus-core@0.1.21)(typescript@6.0.3) + magic-string: 0.30.21 + oxc-parser: 0.127.0 + oxc-walker: 0.7.0(oxc-parser@0.127.0) + ufo: 1.6.4 + unhead: 3.1.0(@voidzero-dev/vite-plus-core@0.1.21) + unplugin: 3.0.0 + optionalDependencies: + esbuild: 0.28.0 + lightningcss: 1.32.0 + rolldown: 1.0.1 + vite: '@voidzero-dev/vite-plus-core@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)' + transitivePeerDependencies: + - '@modelcontextprotocol/sdk' + - bufferutil + - typescript + - utf-8-validate + + '@unhead/vue@3.1.0(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.0.1)(typescript@6.0.3)(vue@3.5.34(typescript@6.0.3))': + dependencies: + '@unhead/bundler': 3.1.0(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.0.1)(typescript@6.0.3)(unhead@3.1.0(@voidzero-dev/vite-plus-core@0.1.21)) + hookable: 6.1.1 + unhead: 3.1.0(@voidzero-dev/vite-plus-core@0.1.21) + unplugin: 3.0.0 + vue: 3.5.34(typescript@6.0.3) + optionalDependencies: + vite: '@voidzero-dev/vite-plus-core@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)' + transitivePeerDependencies: + - '@modelcontextprotocol/sdk' + - '@unhead/cli' + - bufferutil + - esbuild + - lightningcss + - rolldown + - typescript + - utf-8-validate + + '@universal-deploy/netlify@0.2.2(@voidzero-dev/vite-plus-core@0.1.21)(srvx@0.11.15)': + dependencies: + '@universal-deploy/store': 0.2.1(srvx@0.11.15) + vite: '@voidzero-dev/vite-plus-core@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)' + transitivePeerDependencies: + - srvx + + '@universal-deploy/node@0.1.6(@voidzero-dev/vite-plus-core@0.1.21)': + dependencies: + '@universal-deploy/store': 0.2.1(srvx@0.11.15) + magic-string: 0.30.21 + srvx: 0.11.15 + optionalDependencies: + vite: '@voidzero-dev/vite-plus-core@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)' + + '@universal-deploy/store@0.2.1(srvx@0.11.15)': + dependencies: + rou3: 0.8.1 + optionalDependencies: + srvx: 0.11.15 + + '@universal-deploy/vite@0.1.9(@voidzero-dev/vite-plus-core@0.1.21)(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15)': + dependencies: + '@universal-deploy/netlify': 0.2.2(@voidzero-dev/vite-plus-core@0.1.21)(srvx@0.11.15) + '@universal-deploy/node': 0.1.6(@voidzero-dev/vite-plus-core@0.1.21) + '@universal-deploy/store': 0.2.1(srvx@0.11.15) + '@universal-middleware/express': 0.4.26(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15) + magic-string: 0.30.21 + rou3: 0.8.1 + optionalDependencies: + vite: '@voidzero-dev/vite-plus-core@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)' + transitivePeerDependencies: + - '@cloudflare/workers-types' + - '@hattip/core' + - '@types/express' + - '@webroute/route' + - elysia + - fastify + - h3 + - hono + - srvx + + '@universal-middleware/core@0.4.17(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15)': + dependencies: + regexparam: 3.0.0 + tough-cookie: 6.0.1 + optionalDependencies: + elysia: 1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3) + h3: 1.15.11 + hono: 4.12.18 + srvx: 0.11.15 + + '@universal-middleware/elysia@0.6.4(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15)': + dependencies: + '@universal-middleware/core': 0.4.17(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15) + transitivePeerDependencies: + - '@cloudflare/workers-types' + - '@hattip/core' + - '@types/express' + - '@webroute/route' + - elysia + - fastify + - h3 + - hono + - srvx + + '@universal-middleware/express@0.4.26(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15)': + dependencies: + '@universal-middleware/core': 0.4.17(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15) + '@universal-middleware/node': 0.1.0(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15) + transitivePeerDependencies: + - '@cloudflare/workers-types' + - '@hattip/core' + - '@types/express' + - '@webroute/route' + - elysia + - fastify + - h3 + - hono + - srvx + + '@universal-middleware/hono@0.4.21(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15)': + dependencies: + '@universal-middleware/core': 0.4.17(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15) + transitivePeerDependencies: + - '@cloudflare/workers-types' + - '@hattip/core' + - '@types/express' + - '@webroute/route' + - elysia + - fastify + - h3 + - hono + - srvx + + '@universal-middleware/node@0.1.0(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15)': + dependencies: + '@universal-middleware/core': 0.4.17(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15) + transitivePeerDependencies: + - '@cloudflare/workers-types' + - '@hattip/core' + - '@types/express' + - '@webroute/route' + - elysia + - fastify + - h3 + - hono + - srvx + + '@valibot/to-json-schema@1.7.0(valibot@1.4.0(typescript@6.0.3))': + dependencies: + valibot: 1.4.0(typescript@6.0.3) + + '@vikejs/elysia@0.2.0(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15)(vike@0.4.259(@voidzero-dev/vite-plus-core@0.1.21)(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15))': + dependencies: + '@universal-middleware/elysia': 0.6.4(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15) + elysia: 1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3) + vike: 0.4.259(@voidzero-dev/vite-plus-core@0.1.21)(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15) + transitivePeerDependencies: + - '@cloudflare/workers-types' + - '@hattip/core' + - '@types/express' + - '@webroute/route' + - fastify + - h3 + - hono + - srvx + + '@vikejs/hono@0.2.0(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15)(vike@0.4.259(@voidzero-dev/vite-plus-core@0.1.21)(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15))': + dependencies: + '@universal-middleware/hono': 0.4.21(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15) + hono: 4.12.18 + vike: 0.4.259(@voidzero-dev/vite-plus-core@0.1.21)(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15) + transitivePeerDependencies: + - '@cloudflare/workers-types' + - '@hattip/core' + - '@types/express' + - '@webroute/route' + - elysia + - fastify + - h3 + - srvx + + '@vitejs/devtools-kit@0.1.22(@voidzero-dev/vite-plus-core@0.1.21)(typescript@6.0.3)': + dependencies: + birpc: 4.0.0 + devframe: 0.1.22(typescript@6.0.3) + logs-sdk: 0.0.6 + mlly: 1.8.2 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + tinyexec: 1.1.2 + vite: '@voidzero-dev/vite-plus-core@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)' + transitivePeerDependencies: + - '@modelcontextprotocol/sdk' + - bufferutil + - typescript + - utf-8-validate + + '@vitejs/devtools-kit@0.1.24(@voidzero-dev/vite-plus-core@0.1.21)(typescript@6.0.3)': + dependencies: + birpc: 4.0.0 + devframe: 0.2.2(typescript@6.0.3) + logs-sdk: 0.0.6 + mlly: 1.8.2 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + tinyexec: 1.1.2 + vite: '@voidzero-dev/vite-plus-core@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)' + transitivePeerDependencies: + - '@modelcontextprotocol/sdk' + - bufferutil + - crossws + - typescript + - utf-8-validate + + '@vitejs/devtools-rolldown@0.1.24(@pnpm/logger@1001.0.1)(@voidzero-dev/vite-plus-core@0.1.21)(typescript@6.0.3)(vue@3.5.34(typescript@6.0.3))': + dependencies: + '@floating-ui/dom': 1.7.6 + '@pnpm/read-project-manifest': 1001.2.6(@pnpm/logger@1001.0.1) + '@rolldown/debug': 1.0.1 + '@vitejs/devtools-kit': 0.1.24(@voidzero-dev/vite-plus-core@0.1.21)(typescript@6.0.3) + birpc: 4.0.0 + cac: 7.0.0 + d3-shape: 3.2.0 + devframe: 0.2.2(typescript@6.0.3) + diff: 9.0.0 + get-port-please: 3.2.0 + h3: 2.0.1-rc.22 + logs-sdk: 0.0.6 + mlly: 1.8.2 + mrmime: 2.0.1 + p-limit: 7.3.0 + pathe: 2.0.3 + publint: 0.3.21 + split2: 4.2.0 + tinyglobby: 0.2.16 + unconfig: 7.5.0 + unstorage: 1.17.5 + vue-virtual-scroller: 3.0.3(vue@3.5.34(typescript@6.0.3)) + ws: 8.20.1 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@modelcontextprotocol/sdk' + - '@netlify/blobs' + - '@planetscale/database' + - '@pnpm/logger' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - crossws + - db0 + - idb-keyval + - ioredis + - typescript + - uploadthing + - utf-8-validate + - vite + - vue + + '@vitejs/devtools@0.1.24(@pnpm/logger@1001.0.1)(@voidzero-dev/vite-plus-core@0.1.21)(typescript@6.0.3)': + dependencies: + '@vitejs/devtools-kit': 0.1.24(@voidzero-dev/vite-plus-core@0.1.21)(typescript@6.0.3) + '@vitejs/devtools-rolldown': 0.1.24(@pnpm/logger@1001.0.1)(@voidzero-dev/vite-plus-core@0.1.21)(typescript@6.0.3)(vue@3.5.34(typescript@6.0.3)) + birpc: 4.0.0 + cac: 7.0.0 + devframe: 0.2.2(typescript@6.0.3) + h3: 2.0.1-rc.22 + logs-sdk: 0.0.6 + mlly: 1.8.2 + obug: 2.1.1 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + tinyexec: 1.1.2 + vite: '@voidzero-dev/vite-plus-core@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)' + vue: 3.5.34(typescript@6.0.3) + ws: 8.20.1 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@modelcontextprotocol/sdk' + - '@netlify/blobs' + - '@planetscale/database' + - '@pnpm/logger' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - crossws + - db0 + - idb-keyval + - ioredis + - typescript + - uploadthing + - utf-8-validate + + '@vitejs/plugin-vue@6.0.6(@voidzero-dev/vite-plus-core@0.1.21)(vue@3.5.34(typescript@6.0.3))': + dependencies: + '@rolldown/pluginutils': 1.0.0-rc.13 + vite: '@voidzero-dev/vite-plus-core@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)' + vue: 3.5.34(typescript@6.0.3) + + '@vitest/browser-playwright@4.1.6(@voidzero-dev/vite-plus-core@0.1.21)(@voidzero-dev/vite-plus-test@0.1.21)(playwright@1.59.1)': + dependencies: + '@vitest/browser': 4.1.6(@voidzero-dev/vite-plus-core@0.1.21)(@voidzero-dev/vite-plus-test@0.1.21) + '@vitest/mocker': 4.1.6(@voidzero-dev/vite-plus-core@0.1.21) + playwright: 1.59.1 + tinyrainbow: 3.1.0 + vitest: '@voidzero-dev/vite-plus-test@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)' + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + + '@vitest/browser@4.1.6(@voidzero-dev/vite-plus-core@0.1.21)(@voidzero-dev/vite-plus-test@0.1.21)': + dependencies: + '@blazediff/core': 1.9.1 + '@vitest/mocker': 4.1.6(@voidzero-dev/vite-plus-core@0.1.21) + '@vitest/utils': 4.1.6 + magic-string: 0.30.21 + pngjs: 7.0.0 + sirv: 3.0.2 + tinyrainbow: 3.1.0 + vitest: '@voidzero-dev/vite-plus-test@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)' + ws: 8.20.0 + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + + '@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21)': + dependencies: + '@bcoe/v8-coverage': 1.0.2 + '@vitest/utils': 4.1.6 + ast-v8-to-istanbul: 1.0.0 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.2.0 + magicast: 0.5.2 + obug: 2.1.1 + std-env: 4.1.0 + tinyrainbow: 3.1.0 + vitest: '@voidzero-dev/vite-plus-test@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)' + optionalDependencies: + '@vitest/browser': 4.1.6(@voidzero-dev/vite-plus-core@0.1.21)(@voidzero-dev/vite-plus-test@0.1.21) + + '@vitest/expect@3.2.4': + dependencies: + '@types/chai': 5.2.3 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + tinyrainbow: 2.0.0 + + '@vitest/mocker@4.1.6(@voidzero-dev/vite-plus-core@0.1.21)': + dependencies: + '@vitest/spy': 4.1.6 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: '@voidzero-dev/vite-plus-core@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)' + + '@vitest/pretty-format@3.2.4': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/pretty-format@4.1.6': + dependencies: + tinyrainbow: 3.1.0 + + '@vitest/runner@4.1.6': + dependencies: + '@vitest/utils': 4.1.6 + pathe: 2.0.3 + optional: true + + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.4 + + '@vitest/spy@4.1.6': {} + + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.1 + tinyrainbow: 2.0.0 + + '@vitest/utils@4.1.6': + dependencies: + '@vitest/pretty-format': 4.1.6 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 + + '@voidzero-dev/vite-plus-core@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)': + dependencies: + '@oxc-project/runtime': 0.129.0 + '@oxc-project/types': 0.129.0 + lightningcss: 1.32.0 + postcss: 8.5.14 + optionalDependencies: + '@types/node': 20.19.37 + '@vitejs/devtools': 0.1.24(@pnpm/logger@1001.0.1)(@voidzero-dev/vite-plus-core@0.1.21)(typescript@6.0.3) + esbuild: 0.28.0 + fsevents: 2.3.3 + jiti: 2.7.0 + publint: 0.3.21 + typescript: 6.0.3 + + '@voidzero-dev/vite-plus-darwin-arm64@0.1.21': + optional: true + + '@voidzero-dev/vite-plus-darwin-x64@0.1.21': + optional: true + + '@voidzero-dev/vite-plus-linux-arm64-gnu@0.1.21': + optional: true + + '@voidzero-dev/vite-plus-linux-arm64-musl@0.1.21': + optional: true + + '@voidzero-dev/vite-plus-linux-x64-gnu@0.1.21': + optional: true + + '@voidzero-dev/vite-plus-linux-x64-musl@0.1.21': + optional: true + + '@voidzero-dev/vite-plus-test@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)': + dependencies: + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@voidzero-dev/vite-plus-core': 0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3) + es-module-lexer: 1.7.0 + obug: 2.1.1 + pixelmatch: 7.2.0 + pngjs: 7.0.0 + sirv: 3.0.2 + std-env: 4.1.0 + tinybench: 2.9.0 + tinyexec: 1.1.2 + tinyglobby: 0.2.16 + vite: '@voidzero-dev/vite-plus-core@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)' + ws: 8.20.0 + optionalDependencies: + '@types/node': 20.19.37 + '@vitest/coverage-v8': 4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21) + transitivePeerDependencies: + - '@arethetypeswrong/core' + - '@tsdown/css' + - '@tsdown/exe' + - '@vitejs/devtools' + - bufferutil + - esbuild + - jiti + - less + - publint + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - typescript + - unplugin-unused + - unrun + - utf-8-validate + - yaml + + '@voidzero-dev/vite-plus-win32-arm64-msvc@0.1.21': + optional: true + + '@voidzero-dev/vite-plus-win32-x64-msvc@0.1.21': + optional: true + + '@volar/language-core@2.4.15': + dependencies: + '@volar/source-map': 2.4.15 + + '@volar/source-map@2.4.15': {} + + '@volar/typescript@2.4.15': + dependencies: + '@volar/language-core': 2.4.15 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vue/compiler-core@3.5.34': + dependencies: + '@babel/parser': 7.29.3 + '@vue/shared': 3.5.34 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.34': + dependencies: + '@vue/compiler-core': 3.5.34 + '@vue/shared': 3.5.34 + + '@vue/compiler-sfc@3.5.34': + dependencies: + '@babel/parser': 7.29.3 + '@vue/compiler-core': 3.5.34 + '@vue/compiler-dom': 3.5.34 + '@vue/compiler-ssr': 3.5.34 + '@vue/shared': 3.5.34 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.14 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.34': + dependencies: + '@vue/compiler-dom': 3.5.34 + '@vue/shared': 3.5.34 + + '@vue/compiler-vue2@2.7.16': + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + '@vue/language-core@2.2.12(typescript@5.9.3)': + dependencies: + '@volar/language-core': 2.4.15 + '@vue/compiler-dom': 3.5.34 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.34 + alien-signals: 1.0.13 + minimatch: 9.0.9 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.9.3 + + '@vue/reactivity@3.5.34': + dependencies: + '@vue/shared': 3.5.34 + + '@vue/runtime-core@3.5.34': + dependencies: + '@vue/reactivity': 3.5.34 + '@vue/shared': 3.5.34 + + '@vue/runtime-dom@3.5.34': + dependencies: + '@vue/reactivity': 3.5.34 + '@vue/runtime-core': 3.5.34 + '@vue/shared': 3.5.34 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.34(vue@3.5.34(typescript@6.0.3))': + dependencies: + '@vue/compiler-ssr': 3.5.34 + '@vue/shared': 3.5.34 + vue: 3.5.34(typescript@6.0.3) + + '@vue/shared@3.5.34': {} + + '@vueuse/core@14.3.0(vue@3.5.34(typescript@6.0.3))': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 14.3.0 + '@vueuse/shared': 14.3.0(vue@3.5.34(typescript@6.0.3)) + vue: 3.5.34(typescript@6.0.3) + + '@vueuse/metadata@14.3.0': {} + + '@vueuse/shared@14.3.0(vue@3.5.34(typescript@6.0.3))': + dependencies: + vue: 3.5.34(typescript@6.0.3) + + '@webcontainer/env@1.1.1': {} + + acorn@7.4.1: {} + + acorn@8.16.0: {} + + agent-base@6.0.2: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + alien-signals@1.0.13: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@5.2.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + + argparse@2.0.1: {} + + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + aria-query@5.3.2: {} + + arkenv@0.11.0(arktype@2.2.0): + optionalDependencies: + arktype: 2.2.0 + + arkregex@0.0.5: + dependencies: + '@ark/util': 0.56.0 + + arktype@2.2.0: + dependencies: + '@ark/schema': 0.56.0 + '@ark/util': 0.56.0 + arkregex: 0.0.5 + + asap@2.0.6: {} + + assert-never@1.4.0: {} + + assertion-error@2.0.1: {} + + ast-types@0.16.1: + dependencies: + tslib: 2.8.1 + + ast-v8-to-istanbul@1.0.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + estree-walker: 3.0.3 + js-tokens: 10.0.0 + + axe-core@4.11.4: {} + + babel-walk@3.0.0-canary-5: + dependencies: + '@babel/types': 7.29.0 + + balanced-match@1.0.2: {} + + balanced-match@4.0.4: {} + + baseline-browser-mapping@2.10.29: {} + + birpc@4.0.0: {} + + bole@5.0.29: + dependencies: + fast-safe-stringify: 2.1.1 + individual: 3.0.0 + + brace-expansion@2.1.0: + dependencies: + balanced-match: 1.0.2 + + brace-expansion@5.0.6: + dependencies: + balanced-match: 4.0.4 + + browserslist@4.28.2: + dependencies: + baseline-browser-mapping: 2.10.29 + caniuse-lite: 1.0.30001792 + electron-to-chromium: 1.5.353 + node-releases: 2.0.38 + update-browserslist-db: 1.2.3(browserslist@4.28.2) + + buffer-from@1.1.2: {} + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + + cac@6.7.14: {} + + cac@7.0.0: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + caniuse-lite@1.0.30001792: {} + + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.3 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + + character-parser@2.2.0: + dependencies: + is-regex: 1.2.1 + + check-error@2.1.3: {} + + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + + chromatic@13.3.5: {} + + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + + clsx@2.1.1: {} + + confbox@0.1.8: {} + + constantinople@4.0.1: + dependencies: + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 + + convert-route@1.1.1: {} + + convert-source-map@2.0.0: {} + + cookie-es@1.2.3: {} + + cookie@1.1.1: {} + + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 + + css.escape@1.5.1: {} + + csstype@3.2.3: {} + + d3-path@3.1.0: {} + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + de-indent@1.0.2: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + deep-eql@5.0.2: {} + + default-browser-id@5.0.1: {} + + default-browser@5.5.0: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.1 + + define-lazy-prop@3.0.0: {} + + defu@6.1.7: {} + + dequal@2.0.3: {} + + destr@2.0.5: {} + + detect-libc@2.1.2: {} + + devframe@0.1.22(typescript@6.0.3): + dependencies: + '@valibot/to-json-schema': 1.7.0(valibot@1.4.0(typescript@6.0.3)) + birpc: 4.0.0 + cac: 7.0.0 + h3: 1.15.11 + logs-sdk: 0.0.6 + mrmime: 2.0.1 + pathe: 2.0.3 + valibot: 1.4.0(typescript@6.0.3) + ws: 8.20.0 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + + devframe@0.2.2(typescript@6.0.3): + dependencies: + '@valibot/to-json-schema': 1.7.0(valibot@1.4.0(typescript@6.0.3)) + birpc: 4.0.0 + cac: 7.0.0 + h3: 2.0.1-rc.22 + logs-sdk: 0.0.6 + mrmime: 2.0.1 + pathe: 2.0.3 + valibot: 1.4.0(typescript@6.0.3) + ws: 8.20.1 + transitivePeerDependencies: + - bufferutil + - crossws + - typescript + - utf-8-validate + + diff@9.0.0: {} + + doctypes@1.1.0: {} + + dom-accessibility-api@0.5.16: {} + + dom-accessibility-api@0.6.3: {} + + dotenv@16.6.1: {} + + dotenv@17.4.2: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + electron-to-chromium@1.5.353: {} + + elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3): + dependencies: + '@sinclair/typebox': 0.34.49 + cookie: 1.1.1 + exact-mirror: 1.0.0 + fast-decode-uri-component: 1.0.1 + file-type: 22.0.1 + memoirist: 0.4.0 + openapi-types: 12.1.3 + optionalDependencies: + typescript: 6.0.3 + + enhanced-resolve@5.21.2: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + + entities@7.0.1: {} + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + esbuild@0.27.7: + optionalDependencies: + '@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 + + esbuild@0.28.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.0 + '@esbuild/android-arm': 0.28.0 + '@esbuild/android-arm64': 0.28.0 + '@esbuild/android-x64': 0.28.0 + '@esbuild/darwin-arm64': 0.28.0 + '@esbuild/darwin-x64': 0.28.0 + '@esbuild/freebsd-arm64': 0.28.0 + '@esbuild/freebsd-x64': 0.28.0 + '@esbuild/linux-arm': 0.28.0 + '@esbuild/linux-arm64': 0.28.0 + '@esbuild/linux-ia32': 0.28.0 + '@esbuild/linux-loong64': 0.28.0 + '@esbuild/linux-mips64el': 0.28.0 + '@esbuild/linux-ppc64': 0.28.0 + '@esbuild/linux-riscv64': 0.28.0 + '@esbuild/linux-s390x': 0.28.0 + '@esbuild/linux-x64': 0.28.0 + '@esbuild/netbsd-arm64': 0.28.0 + '@esbuild/netbsd-x64': 0.28.0 + '@esbuild/openbsd-arm64': 0.28.0 + '@esbuild/openbsd-x64': 0.28.0 + '@esbuild/openharmony-arm64': 0.28.0 + '@esbuild/sunos-x64': 0.28.0 + '@esbuild/win32-arm64': 0.28.0 + '@esbuild/win32-ia32': 0.28.0 + '@esbuild/win32-x64': 0.28.0 + + escalade@3.2.0: {} + + esm-resolve@1.0.11: {} + + esprima@4.0.1: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.9 + + exact-mirror@1.0.0: {} + + fast-decode-uri-component@1.0.1: {} + + fast-deep-equal@3.1.3: {} + + fast-safe-stringify@2.1.1: {} + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + file-type@22.0.1: + dependencies: + '@tokenizer/inflate': 0.4.1 + strtok3: 10.3.5 + token-types: 6.1.2 + uint8array-extras: 1.5.0 + transitivePeerDependencies: + - supports-color + + filesize@10.1.6: {} + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + fsevents@2.3.2: + optional: true + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.3 + math-intrinsics: 1.1.0 + + get-port-please@3.2.0: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + glob@13.0.6: + dependencies: + minimatch: 10.2.5 + minipass: 7.1.3 + path-scurry: 2.0.2 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + h3@1.15.11: + dependencies: + cookie-es: 1.2.3 + crossws: 0.3.5 + defu: 6.1.7 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.4 + radix3: 1.1.2 + ufo: 1.6.4 + uncrypto: 0.1.3 + + h3@2.0.1-rc.22: + dependencies: + rou3: 0.8.1 + srvx: 0.11.15 + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hash-sum@2.0.0: {} + + hasown@2.0.3: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + hono@4.12.18: {} + + hookable@6.1.1: {} + + html-escaper@2.0.2: {} + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + ieee754@1.2.1: {} + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + individual@3.0.0: {} + + iron-webcrypto@1.2.1: {} + + is-arrayish@0.2.1: {} + + is-core-module@2.16.2: + dependencies: + hasown: 2.0.3 + + is-docker@3.0.0: {} + + is-expression@4.0.0: + dependencies: + acorn: 7.4.1 + object-assign: 4.1.1 + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-promise@2.2.2: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.3 + + is-windows@1.0.2: {} + + is-wsl@3.1.1: + dependencies: + is-inside-container: 1.0.0 + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jiti@2.7.0: {} + + js-stringify@1.0.2: {} + + js-tokens@10.0.0: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-parse-even-better-errors@2.3.1: {} + + json5@2.2.3: {} + + jsonfile@6.2.1: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jstransformer@1.0.0: + dependencies: + is-promise: 2.2.2 + promise: 7.3.1 + + 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 + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + 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 + + lines-and-columns@1.2.4: {} + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + logs-sdk@0.0.6: + dependencies: + magic-string: 0.30.21 + oxc-parser: 0.126.0 + unplugin: 3.0.0 + + loupe@3.2.1: {} + + lru-cache@11.3.6: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@8.0.5: {} + + lucide-vue-next@1.0.0(vue@3.5.34(typescript@6.0.3)): + dependencies: + vue: 3.5.34(typescript@6.0.3) + + lz-string@1.5.0: {} + + magic-regexp@0.10.0: + dependencies: + estree-walker: 3.0.3 + magic-string: 0.30.21 + mlly: 1.8.2 + regexp-tree: 0.1.27 + type-level-regexp: 0.1.17 + ufo: 1.6.4 + unplugin: 2.3.11 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.5.2: + dependencies: + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 + source-map-js: 1.2.1 + + make-dir@4.0.0: + dependencies: + semver: 7.8.0 + + math-intrinsics@1.1.0: {} + + memoirist@0.4.0: {} + + min-indent@1.0.1: {} + + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.6 + + minimatch@9.0.9: + dependencies: + brace-expansion: 2.1.0 + + minipass@7.1.3: {} + + mlly@1.8.2: + dependencies: + acorn: 8.16.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 + + mri@1.2.0: {} + + mrmime@2.0.1: {} + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + nanoid@3.3.12: {} + + node-fetch-native@1.6.7: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-mock-http@1.0.4: {} + + node-releases@2.0.38: {} + + normalize-path@3.0.0: {} + + object-assign@4.1.1: {} + + obug@2.1.1: {} + + ofetch@1.5.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.4 + + ohash@2.0.11: {} + + open@10.2.0: + dependencies: + default-browser: 5.5.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 + + openapi-types@12.1.3: {} + + oxc-parser@0.104.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): + dependencies: + '@oxc-project/types': 0.104.0 + optionalDependencies: + '@oxc-parser/binding-android-arm64': 0.104.0 + '@oxc-parser/binding-darwin-arm64': 0.104.0 + '@oxc-parser/binding-darwin-x64': 0.104.0 + '@oxc-parser/binding-freebsd-x64': 0.104.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.104.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.104.0 + '@oxc-parser/binding-linux-arm64-musl': 0.104.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.104.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.104.0 + '@oxc-parser/binding-linux-x64-gnu': 0.104.0 + '@oxc-parser/binding-linux-x64-musl': 0.104.0 + '@oxc-parser/binding-openharmony-arm64': 0.104.0 + '@oxc-parser/binding-wasm32-wasi': 0.104.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@oxc-parser/binding-win32-arm64-msvc': 0.104.0 + '@oxc-parser/binding-win32-x64-msvc': 0.104.0 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + + oxc-parser@0.126.0: + dependencies: + '@oxc-project/types': 0.126.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.126.0 + '@oxc-parser/binding-android-arm64': 0.126.0 + '@oxc-parser/binding-darwin-arm64': 0.126.0 + '@oxc-parser/binding-darwin-x64': 0.126.0 + '@oxc-parser/binding-freebsd-x64': 0.126.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.126.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.126.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.126.0 + '@oxc-parser/binding-linux-arm64-musl': 0.126.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.126.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.126.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.126.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.126.0 + '@oxc-parser/binding-linux-x64-gnu': 0.126.0 + '@oxc-parser/binding-linux-x64-musl': 0.126.0 + '@oxc-parser/binding-openharmony-arm64': 0.126.0 + '@oxc-parser/binding-wasm32-wasi': 0.126.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.126.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.126.0 + '@oxc-parser/binding-win32-x64-msvc': 0.126.0 + + oxc-parser@0.127.0: + dependencies: + '@oxc-project/types': 0.127.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.127.0 + '@oxc-parser/binding-android-arm64': 0.127.0 + '@oxc-parser/binding-darwin-arm64': 0.127.0 + '@oxc-parser/binding-darwin-x64': 0.127.0 + '@oxc-parser/binding-freebsd-x64': 0.127.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.127.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.127.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.127.0 + '@oxc-parser/binding-linux-arm64-musl': 0.127.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.127.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.127.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.127.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.127.0 + '@oxc-parser/binding-linux-x64-gnu': 0.127.0 + '@oxc-parser/binding-linux-x64-musl': 0.127.0 + '@oxc-parser/binding-openharmony-arm64': 0.127.0 + '@oxc-parser/binding-wasm32-wasi': 0.127.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.127.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.127.0 + '@oxc-parser/binding-win32-x64-msvc': 0.127.0 + + oxc-walker@0.6.0(oxc-parser@0.104.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)): + dependencies: + magic-regexp: 0.10.0 + oxc-parser: 0.104.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + + oxc-walker@0.7.0(oxc-parser@0.127.0): + dependencies: + magic-regexp: 0.10.0 + oxc-parser: 0.127.0 + + oxfmt@0.48.0: + dependencies: + tinypool: 2.1.0 + optionalDependencies: + '@oxfmt/binding-android-arm-eabi': 0.48.0 + '@oxfmt/binding-android-arm64': 0.48.0 + '@oxfmt/binding-darwin-arm64': 0.48.0 + '@oxfmt/binding-darwin-x64': 0.48.0 + '@oxfmt/binding-freebsd-x64': 0.48.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.48.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.48.0 + '@oxfmt/binding-linux-arm64-gnu': 0.48.0 + '@oxfmt/binding-linux-arm64-musl': 0.48.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.48.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.48.0 + '@oxfmt/binding-linux-riscv64-musl': 0.48.0 + '@oxfmt/binding-linux-s390x-gnu': 0.48.0 + '@oxfmt/binding-linux-x64-gnu': 0.48.0 + '@oxfmt/binding-linux-x64-musl': 0.48.0 + '@oxfmt/binding-openharmony-arm64': 0.48.0 + '@oxfmt/binding-win32-arm64-msvc': 0.48.0 + '@oxfmt/binding-win32-ia32-msvc': 0.48.0 + '@oxfmt/binding-win32-x64-msvc': 0.48.0 + + oxlint-tsgolint@0.22.1: + optionalDependencies: + '@oxlint-tsgolint/darwin-arm64': 0.22.1 + '@oxlint-tsgolint/darwin-x64': 0.22.1 + '@oxlint-tsgolint/linux-arm64': 0.22.1 + '@oxlint-tsgolint/linux-x64': 0.22.1 + '@oxlint-tsgolint/win32-arm64': 0.22.1 + '@oxlint-tsgolint/win32-x64': 0.22.1 + + oxlint@1.63.0(oxlint-tsgolint@0.22.1): + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.63.0 + '@oxlint/binding-android-arm64': 1.63.0 + '@oxlint/binding-darwin-arm64': 1.63.0 + '@oxlint/binding-darwin-x64': 1.63.0 + '@oxlint/binding-freebsd-x64': 1.63.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.63.0 + '@oxlint/binding-linux-arm-musleabihf': 1.63.0 + '@oxlint/binding-linux-arm64-gnu': 1.63.0 + '@oxlint/binding-linux-arm64-musl': 1.63.0 + '@oxlint/binding-linux-ppc64-gnu': 1.63.0 + '@oxlint/binding-linux-riscv64-gnu': 1.63.0 + '@oxlint/binding-linux-riscv64-musl': 1.63.0 + '@oxlint/binding-linux-s390x-gnu': 1.63.0 + '@oxlint/binding-linux-x64-gnu': 1.63.0 + '@oxlint/binding-linux-x64-musl': 1.63.0 + '@oxlint/binding-openharmony-arm64': 1.63.0 + '@oxlint/binding-win32-arm64-msvc': 1.63.0 + '@oxlint/binding-win32-ia32-msvc': 1.63.0 + '@oxlint/binding-win32-x64-msvc': 1.63.0 + oxlint-tsgolint: 0.22.1 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-limit@7.3.0: + dependencies: + yocto-queue: 1.2.2 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + package-manager-detector@1.6.0: {} + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.0 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-parse@1.0.7: {} + + path-scurry@2.0.2: + dependencies: + lru-cache: 11.3.6 + minipass: 7.1.3 + + pathe@2.0.3: {} + + pathval@2.0.1: {} + + perfect-debounce@2.1.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + picomatch@4.0.4: {} + + pixelmatch@7.2.0: + dependencies: + pngjs: 7.0.0 + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 + + playwright-core@1.59.1: {} + + playwright@1.59.1: + dependencies: + playwright-core: 1.59.1 + optionalDependencies: + fsevents: 2.3.2 + + pngjs@7.0.0: {} + + postcss@8.5.14: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + + progress@2.0.3: {} + + promise@7.3.1: + dependencies: + asap: 2.0.6 + + proxy-from-env@1.1.0: {} + + publint@0.3.21: + dependencies: + '@publint/pack': 0.1.4 + package-manager-detector: 1.6.0 + picocolors: 1.1.1 + sade: 1.8.1 + + pug-attrs@3.0.0: + dependencies: + constantinople: 4.0.1 + js-stringify: 1.0.2 + pug-runtime: 3.0.1 + + pug-code-gen@3.0.4: + dependencies: + constantinople: 4.0.1 + doctypes: 1.1.0 + js-stringify: 1.0.2 + pug-attrs: 3.0.0 + pug-error: 2.1.0 + pug-runtime: 3.0.1 + void-elements: 3.1.0 + with: 7.0.2 + + pug-error@2.1.0: {} + + pug-filters@4.0.0: + dependencies: + constantinople: 4.0.1 + jstransformer: 1.0.0 + pug-error: 2.1.0 + pug-walk: 2.0.0 + resolve: 1.22.12 + + pug-lexer@5.0.1: + dependencies: + character-parser: 2.2.0 + is-expression: 4.0.0 + pug-error: 2.1.0 + + pug-linker@4.0.0: + dependencies: + pug-error: 2.1.0 + pug-walk: 2.0.0 + + pug-load@3.0.0: + dependencies: + object-assign: 4.1.1 + pug-walk: 2.0.0 + + pug-parser@6.0.0: + dependencies: + pug-error: 2.1.0 + token-stream: 1.0.0 + + pug-runtime@3.0.1: {} + + pug-strip-comments@2.0.0: + dependencies: + pug-error: 2.1.0 + + pug-walk@2.0.0: {} + + pug@3.0.4: + dependencies: + pug-code-gen: 3.0.4 + pug-filters: 4.0.0 + pug-lexer: 5.0.1 + pug-linker: 4.0.0 + pug-load: 3.0.0 + pug-parser: 6.0.0 + pug-runtime: 3.0.1 + pug-strip-comments: 2.0.0 + + quansync@1.0.0: {} + + radix3@1.1.2: {} + + react-dom@19.2.6(react@19.2.6): + dependencies: + react: 19.2.6 + scheduler: 0.27.0 + + react-is@17.0.2: {} + + react@19.2.6: {} + + read-yaml-file@2.1.0: + dependencies: + js-yaml: 4.1.1 + strip-bom: 4.0.0 + + readdirp@5.0.0: {} + + recast@0.23.11: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + + regexp-tree@0.1.27: {} + + regexparam@3.0.0: {} + + reka-ui@2.9.7(vue@3.5.34(typescript@6.0.3)): + dependencies: + '@floating-ui/dom': 1.7.6 + '@floating-ui/vue': 1.1.11(vue@3.5.34(typescript@6.0.3)) + '@internationalized/date': 3.12.1 + '@internationalized/number': 3.6.6 + '@tanstack/vue-virtual': 3.13.24(vue@3.5.34(typescript@6.0.3)) + '@vueuse/core': 14.3.0(vue@3.5.34(typescript@6.0.3)) + '@vueuse/shared': 14.3.0(vue@3.5.34(typescript@6.0.3)) + aria-hidden: 1.2.6 + defu: 6.1.7 + ohash: 2.0.11 + vue: 3.5.34(typescript@6.0.3) + transitivePeerDependencies: + - '@vue/composition-api' + + resolve@1.22.12: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.2 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + rolldown@1.0.1: + dependencies: + '@oxc-project/types': 0.130.0 + '@rolldown/pluginutils': 1.0.0 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.1 + '@rolldown/binding-darwin-arm64': 1.0.1 + '@rolldown/binding-darwin-x64': 1.0.1 + '@rolldown/binding-freebsd-x64': 1.0.1 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.1 + '@rolldown/binding-linux-arm64-gnu': 1.0.1 + '@rolldown/binding-linux-arm64-musl': 1.0.1 + '@rolldown/binding-linux-ppc64-gnu': 1.0.1 + '@rolldown/binding-linux-s390x-gnu': 1.0.1 + '@rolldown/binding-linux-x64-gnu': 1.0.1 + '@rolldown/binding-linux-x64-musl': 1.0.1 + '@rolldown/binding-openharmony-arm64': 1.0.1 + '@rolldown/binding-wasm32-wasi': 1.0.1 + '@rolldown/binding-win32-arm64-msvc': 1.0.1 + '@rolldown/binding-win32-x64-msvc': 1.0.1 + + rou3@0.8.1: {} + + run-applescript@7.1.0: {} + + sade@1.8.1: + dependencies: + mri: 1.2.0 + + scheduler@0.27.0: {} + + semver@6.3.1: {} + + semver@7.8.0: {} + + signal-exit@4.1.0: {} + + sirv@3.0.2: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + split2@4.2.0: {} + + srvx@0.11.15: {} + + std-env@4.1.0: {} + + storybook@10.3.6(@testing-library/dom@10.4.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)): + dependencies: + '@storybook/global': 5.0.0 + '@storybook/icons': 2.0.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@testing-library/jest-dom': 6.9.1 + '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) + '@vitest/expect': 3.2.4 + '@vitest/spy': 3.2.4 + '@webcontainer/env': 1.1.1 + esbuild: 0.27.7 + open: 10.2.0 + recast: 0.23.11 + semver: 7.8.0 + use-sync-external-store: 1.6.0(react@19.2.6) + ws: 8.20.0 + optionalDependencies: + vite-plus: 0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3) + transitivePeerDependencies: + - '@testing-library/dom' + - bufferutil + - react + - react-dom + - utf-8-validate + + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.2.2 + + strip-bom@4.0.0: {} + + strip-comments-strings@1.2.0: {} + + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + strtok3@10.3.5: + dependencies: + '@tokenizer/token': 0.3.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + tailwind-merge@3.6.0: {} + + tailwindcss@4.3.0: {} + + tapable@2.3.3: {} + + tiny-invariant@1.3.3: {} + + tinybench@2.9.0: {} + + tinyexec@1.1.2: {} + + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + tinypool@2.1.0: {} + + tinyrainbow@2.0.0: {} + + tinyrainbow@3.1.0: {} + + tinyspy@4.0.4: {} + + tldts-core@7.0.30: {} + + tldts@7.0.30: + dependencies: + tldts-core: 7.0.30 + + token-stream@1.0.0: {} + + token-types@6.1.2: + dependencies: + '@borewit/text-codec': 0.2.2 + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + + totalist@3.0.1: {} + + tough-cookie@6.0.1: + dependencies: + tldts: 7.0.30 + + tr46@0.0.3: {} + + ts-dedent@2.2.0: {} + + ts-map@1.0.3: {} + + tslib@2.8.1: {} + + tw-animate-css@1.4.0: {} + + type-fest@2.19.0: {} + + type-level-regexp@0.1.17: {} + + typescript@5.9.3: {} + + typescript@6.0.3: {} + + ufo@1.6.4: {} + + uint8array-extras@1.5.0: {} + + unconfig-core@7.5.0: + dependencies: + '@quansync/fs': 1.0.0 + quansync: 1.0.0 + + unconfig@7.5.0: + dependencies: + '@quansync/fs': 1.0.0 + defu: 6.1.7 + jiti: 2.7.0 + quansync: 1.0.0 + unconfig-core: 7.5.0 + + uncrypto@0.1.3: {} + + undici-types@6.21.0: {} + + unhead@3.1.0(@voidzero-dev/vite-plus-core@0.1.21): + dependencies: + hookable: 6.1.1 + unplugin: 3.0.0 + optionalDependencies: + vite: '@voidzero-dev/vite-plus-core@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)' + + universalify@2.0.1: {} + + unplugin@2.3.11: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.16.0 + picomatch: 4.0.4 + webpack-virtual-modules: 0.6.2 + + unplugin@3.0.0: + dependencies: + '@jridgewell/remapping': 2.3.5 + picomatch: 4.0.4 + webpack-virtual-modules: 0.6.2 + + unstorage@1.17.5: + dependencies: + anymatch: 3.1.3 + chokidar: 5.0.0 + destr: 2.0.5 + h3: 1.15.11 + lru-cache: 11.3.6 + node-fetch-native: 1.6.7 + ofetch: 1.5.1 + ufo: 1.6.4 + + update-browserslist-db@1.2.3(browserslist@4.28.2): + dependencies: + browserslist: 4.28.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + use-sync-external-store@1.6.0(react@19.2.6): + dependencies: + react: 19.2.6 + + valibot@1.4.0(typescript@6.0.3): + optionalDependencies: + typescript: 6.0.3 + + vike-vue@0.9.11(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vike@0.4.259(@voidzero-dev/vite-plus-core@0.1.21)(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15))(vue@3.5.34(typescript@6.0.3)): + dependencies: + magic-string: 0.30.21 + oxc-parser: 0.104.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + oxc-walker: 0.6.0(oxc-parser@0.104.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)) + vike: 0.4.259(@voidzero-dev/vite-plus-core@0.1.21)(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15) + vue: 3.5.34(typescript@6.0.3) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + + vike@0.4.259(@voidzero-dev/vite-plus-core@0.1.21)(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15): + dependencies: + '@babel/core': 7.29.0 + '@babel/types': 7.29.0 + '@brillout/import': 0.2.6 + '@brillout/json-serializer': 0.5.23 + '@brillout/picocolors': 1.0.30 + '@brillout/vite-plugin-server-entry': 0.7.18 + '@universal-deploy/store': 0.2.1(srvx@0.11.15) + '@universal-deploy/vite': 0.1.9(@voidzero-dev/vite-plus-core@0.1.21)(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15) + '@universal-middleware/core': 0.4.17(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15) + '@universal-middleware/node': 0.1.0(elysia@1.4.28(@sinclair/typebox@0.34.49)(exact-mirror@1.0.0)(file-type@22.0.1)(openapi-types@12.1.3)(typescript@6.0.3))(h3@1.15.11)(hono@4.12.18)(srvx@0.11.15) + cac: 6.7.14 + convert-route: 1.1.1 + es-module-lexer: 1.7.0 + esbuild: 0.28.0 + json5: 2.2.3 + magic-string: 0.30.21 + picomatch: 4.0.4 + semver: 7.8.0 + sirv: 3.0.2 + source-map-support: 0.5.21 + tinyglobby: 0.2.16 + vite-plugin-wrapper: 0.1.0(@voidzero-dev/vite-plus-core@0.1.21) + optionalDependencies: + vite: '@voidzero-dev/vite-plus-core@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)' + transitivePeerDependencies: + - '@cloudflare/workers-types' + - '@hattip/core' + - '@types/express' + - '@webroute/route' + - elysia + - fastify + - h3 + - hono + - srvx + - supports-color + + vite-bundle-analyzer@1.3.8: {} + + vite-plugin-wrapper@0.1.0(@voidzero-dev/vite-plus-core@0.1.21): + dependencies: + vite: '@voidzero-dev/vite-plus-core@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3)' + + vite-plus@0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3): + dependencies: + '@oxc-project/types': 0.129.0 + '@voidzero-dev/vite-plus-core': 0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3) + '@voidzero-dev/vite-plus-test': 0.1.21(@types/node@20.19.37)(@vitejs/devtools@0.1.24)(@vitest/coverage-v8@4.1.6(@vitest/browser@4.1.6)(@voidzero-dev/vite-plus-test@0.1.21))(@voidzero-dev/vite-plus-core@0.1.21)(esbuild@0.28.0)(jiti@2.7.0)(publint@0.3.21)(typescript@6.0.3) + oxfmt: 0.48.0 + oxlint: 1.63.0(oxlint-tsgolint@0.22.1) + oxlint-tsgolint: 0.22.1 + optionalDependencies: + '@voidzero-dev/vite-plus-darwin-arm64': 0.1.21 + '@voidzero-dev/vite-plus-darwin-x64': 0.1.21 + '@voidzero-dev/vite-plus-linux-arm64-gnu': 0.1.21 + '@voidzero-dev/vite-plus-linux-arm64-musl': 0.1.21 + '@voidzero-dev/vite-plus-linux-x64-gnu': 0.1.21 + '@voidzero-dev/vite-plus-linux-x64-musl': 0.1.21 + '@voidzero-dev/vite-plus-win32-arm64-msvc': 0.1.21 + '@voidzero-dev/vite-plus-win32-x64-msvc': 0.1.21 + transitivePeerDependencies: + - '@arethetypeswrong/core' + - '@edge-runtime/vm' + - '@opentelemetry/api' + - '@tsdown/css' + - '@tsdown/exe' + - '@types/node' + - '@vitejs/devtools' + - '@vitest/coverage-istanbul' + - '@vitest/coverage-v8' + - '@vitest/ui' + - bufferutil + - esbuild + - happy-dom + - jiti + - jsdom + - less + - publint + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - typescript + - unplugin-unused + - unrun + - utf-8-validate + - vite + - yaml + + void-elements@3.1.0: {} + + vscode-uri@3.1.0: {} + + vue-component-meta@2.2.12(typescript@5.9.3): + dependencies: + '@volar/typescript': 2.4.15 + '@vue/language-core': 2.2.12(typescript@5.9.3) + path-browserify: 1.0.1 + vue-component-type-helpers: 2.2.12 + optionalDependencies: + typescript: 5.9.3 + + vue-component-type-helpers@2.2.12: {} + + vue-component-type-helpers@3.2.9: {} + + vue-demi@0.14.10(vue@3.5.34(typescript@6.0.3)): + dependencies: + vue: 3.5.34(typescript@6.0.3) + + vue-docgen-api@4.79.2(vue@3.5.34(typescript@6.0.3)): + dependencies: + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 + '@vue/compiler-dom': 3.5.34 + '@vue/compiler-sfc': 3.5.34 + ast-types: 0.16.1 + esm-resolve: 1.0.11 + hash-sum: 2.0.0 + lru-cache: 8.0.5 + pug: 3.0.4 + recast: 0.23.11 + ts-map: 1.0.3 + vue: 3.5.34(typescript@6.0.3) + vue-inbrowser-compiler-independent-utils: 4.71.1(vue@3.5.34(typescript@6.0.3)) + + vue-inbrowser-compiler-independent-utils@4.71.1(vue@3.5.34(typescript@6.0.3)): + dependencies: + vue: 3.5.34(typescript@6.0.3) + + vue-virtual-scroller@3.0.3(vue@3.5.34(typescript@6.0.3)): + dependencies: + vue: 3.5.34(typescript@6.0.3) + + vue@3.5.34(typescript@6.0.3): + dependencies: + '@vue/compiler-dom': 3.5.34 + '@vue/compiler-sfc': 3.5.34 + '@vue/runtime-dom': 3.5.34 + '@vue/server-renderer': 3.5.34(vue@3.5.34(typescript@6.0.3)) + '@vue/shared': 3.5.34 + optionalDependencies: + typescript: 6.0.3 + + webidl-conversions@3.0.1: {} + + webpack-virtual-modules@0.6.2: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + with@7.0.2: + dependencies: + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 + assert-never: 1.4.0 + babel-walk: 3.0.0-canary-5 + + write-file-atomic@5.0.1: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + + write-yaml-file@5.0.0: + dependencies: + js-yaml: 4.1.1 + write-file-atomic: 5.0.1 + + ws@8.20.0: {} + + ws@8.20.1: {} + + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.1 + + yallist@3.1.1: {} + + yocto-queue@0.1.0: {} + + yocto-queue@1.2.2: {} diff --git a/apps/frontend-vike/pnpm-workspace.yaml b/apps/frontend-vike/pnpm-workspace.yaml new file mode 100644 index 0000000..d8563f5 --- /dev/null +++ b/apps/frontend-vike/pnpm-workspace.yaml @@ -0,0 +1,19 @@ +allowBuilds: + '@sentry/cli': true + esbuild: true +catalog: + vite: npm:@voidzero-dev/vite-plus-core@0.1.21 + vite-plus: 0.1.21 + vitest: npm:@voidzero-dev/vite-plus-test@0.1.21 +overrides: + vite: 'catalog:' + vitest: 'catalog:' +peerDependencyRules: + allowAny: + - '@vitest/coverage-v8' + - vite + - vitest + allowedVersions: + vite: '*' + vitest: '*' +saveExact: true diff --git a/apps/frontend-vike/sentry.browser.config.ts b/apps/frontend-vike/sentry.browser.config.ts new file mode 100644 index 0000000..3a622f6 --- /dev/null +++ b/apps/frontend-vike/sentry.browser.config.ts @@ -0,0 +1,22 @@ +import * as Sentry from "@sentry/vue"; +import { getCurrentInstance } from "vue"; + +export const sentryBrowserConfig = () => { + import.meta.env.PROD === true && + Sentry.init({ + app: getCurrentInstance()?.appContext.app, + dsn: import.meta.env.PUBLIC_ENV__SENTRY_DSN, + environment: "production-frontend", + // enabled: import.meta.env.DEV ? false : true, + integrations: [Sentry.replayIntegration()], + // Set tracesSampleRate to 1.0 to capture 100% + // of transactions for tracing. + tracesSampleRate: 1.0, + // Set `tracePropagationTargets` to control for which URLs trace propagation should be enabled + tracePropagationTargets: [/^\//, /^https:\/\/yourserver\.io\/api/], + // Capture Replay for 10% of all sessions, + // plus for 100% of sessions with an error + replaysSessionSampleRate: 0.1, + replaysOnErrorSampleRate: 1.0, + }); +}; diff --git a/apps/frontend-vike/server/elysia.ts b/apps/frontend-vike/server/elysia.ts new file mode 100644 index 0000000..49ec650 --- /dev/null +++ b/apps/frontend-vike/server/elysia.ts @@ -0,0 +1,14 @@ +import { createTodoHandler } from "#/middlewares/create-todo-handler"; +import { settingInjector } from "#/middlewares/setting-injector"; +import vike from '@vikejs/elysia'; +import { Elysia } from 'elysia'; + +function getApp() { + const app = new Elysia(); + + vike(app, [settingInjector, createTodoHandler]); + + return app; +} + +export const app = getApp(); diff --git a/apps/frontend-vike/server/hono.ts b/apps/frontend-vike/server/hono.ts new file mode 100644 index 0000000..bac5f41 --- /dev/null +++ b/apps/frontend-vike/server/hono.ts @@ -0,0 +1,17 @@ +import { createTodoHandler } from "./middlewares/create-todo-handler"; +import vike from "@vikejs/hono"; +import { Hono } from "hono"; + + +/** + * @deprecated 問題がない限りはこのファイルは削除される予定です。elysiaのほうが恐らくbun向きです。 + */ +function getApp() { + const app = new Hono(); + + vike(app, [createTodoHandler]); + + return app; +} + +export const app = getApp(); diff --git a/apps/frontend-vike/server/middlewares/create-todo-handler.ts b/apps/frontend-vike/server/middlewares/create-todo-handler.ts new file mode 100644 index 0000000..3b10610 --- /dev/null +++ b/apps/frontend-vike/server/middlewares/create-todo-handler.ts @@ -0,0 +1,20 @@ +import { enhance, type UniversalHandler } from "@universal-middleware/core"; + +// Note: You can directly define a server middleware instead of defining a Universal Middleware. (You can remove @universal-middleware/* — Vike's scaffolder uses it only to simplify its internal logic, see https://github.com/vikejs/vike/discussions/3116) +export const createTodoHandler: UniversalHandler<Universal.Context & object> = enhance( + async (request, _context, _runtime) => { + // In a real case, user-provided data should ALWAYS be validated with tools like zod + const newTodo = (await request.json()) as { text: string }; + + // This is where you'd persist the data + console.log("Received new todo", newTodo); + + return new Response(JSON.stringify({ status: "OK" }), { + status: 200, + headers: { + "content-type": "application/json", + }, + }); + }, + { name: "my-app:todo-handler", path: `/api/todo/create`, method: ["GET", "POST"], immutable: false }, +); diff --git a/apps/frontend-vike/server/middlewares/setting-injector.ts b/apps/frontend-vike/server/middlewares/setting-injector.ts new file mode 100644 index 0000000..ed523c1 --- /dev/null +++ b/apps/frontend-vike/server/middlewares/setting-injector.ts @@ -0,0 +1,46 @@ +import { + enhance, + MiddlewareOrder, + type UniversalMiddleware, +} from "@universal-middleware/core"; +import { appEnvSettings } from "#/settings/env"; + +type AppSettings = { + env: typeof appEnvSettings; +}; + +type SettingsContext = Universal.Context & { + settings: AppSettings; +}; + +export const appSettings = { + env: appEnvSettings, +} satisfies AppSettings; + +const injectSettings: UniversalMiddleware<Universal.Context, SettingsContext> = ( + _request, + context, +) => ({ + ...context, + settings: appSettings, +}); + +export const settingInjector = enhance(injectSettings, { + name: "app:setting-injector", + order: MiddlewareOrder.CUSTOM_PRE_PROCESSING, + immutable: true, +}); + +declare global { + namespace Universal { + interface Context { + settings?: AppSettings; + } + } + + namespace Vike { + interface PageContext { + settings: AppSettings; + } + } +} diff --git a/apps/frontend-vike/server/settings/env.ts b/apps/frontend-vike/server/settings/env.ts new file mode 100644 index 0000000..f6d46ba --- /dev/null +++ b/apps/frontend-vike/server/settings/env.ts @@ -0,0 +1,13 @@ +import arkenv from "arkenv"; + +export const appEnvSettings = arkenv({ + // Main System + APP_URL: "string.url", + + // Umami Analytics + "UMAMI_HOST?": "string.url", + "UMAMI_WEBSITE_ID?": "string.uuid.v4", + + // Sentry + "FORCE_ENABLE_IN_DEV?": "boolean", +}); diff --git a/apps/frontend-vike/src/assets/css/tailwind.css b/apps/frontend-vike/src/assets/css/tailwind.css new file mode 100644 index 0000000..1c462bc --- /dev/null +++ b/apps/frontend-vike/src/assets/css/tailwind.css @@ -0,0 +1,123 @@ +@import url('https://fonts.googleapis.com/css2?family=Noto+Sans:wght@400;500;600;700&display=swap'); + +@import 'tailwindcss'; +@import 'tw-animate-css'; + +@custom-variant dark (&:is(.dark *)); + +@theme inline { + --font-heading: var(--font-sans); + --color-sidebar-ring: var(--sidebar-ring); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar: var(--sidebar); + --color-chart-5: var(--chart-5); + --color-chart-4: var(--chart-4); + --color-chart-3: var(--chart-3); + --color-chart-2: var(--chart-2); + --color-chart-1: var(--chart-1); + --color-ring: var(--ring); + --color-input: var(--input); + --color-border: var(--border); + --color-destructive: var(--destructive); + --color-accent-foreground: var(--accent-foreground); + --color-accent: var(--accent); + --color-muted-foreground: var(--muted-foreground); + --color-muted: var(--muted); + --color-secondary-foreground: var(--secondary-foreground); + --color-secondary: var(--secondary); + --color-primary-foreground: var(--primary-foreground); + --color-primary: var(--primary); + --color-popover-foreground: var(--popover-foreground); + --color-popover: var(--popover); + --color-card-foreground: var(--card-foreground); + --color-card: var(--card); + --color-foreground: var(--foreground); + --color-background: var(--background); + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); +} + +:root { + --radius: 0.625rem; + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.205 0 0); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted: oklch(0.97 0 0); + --muted-foreground: oklch(0.556 0 0); + --accent: oklch(0.97 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --input: oklch(0.922 0 0); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); + --background: oklch(1 0 0); + --foreground: oklch(0.145 0 0); +} + +.dark { + --background: oklch(0.145 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.205 0 0); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.205 0 0); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.922 0 0); + --primary-foreground: oklch(0.205 0 0); + --secondary: oklch(0.269 0 0); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.556 0 0); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.556 0 0); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/apps/frontend-vike/src/assets/logo.svg b/apps/frontend-vike/src/assets/logo.svg new file mode 100644 index 0000000..0fb65c0 --- /dev/null +++ b/apps/frontend-vike/src/assets/logo.svg @@ -0,0 +1,67 @@ +<svg class="hammer" width="41.217" height="41.217" version="1.1" viewBox="-50 -50 41.217 41.217" xmlns="http://www.w3.org/2000/svg"> + <defs> + <mask id="mask111"> + <rect x="-19.21" y="-25.7" width="46.217" height="41.217" fill="url(#linearGradient115)"/> + </mask> + <linearGradient id="linearGradient115" x1="-25.395" x2="-25.395" y1="-9.3005" y2="-18.03" gradientTransform="matrix(1.0589 0 0 .94436 30.79 24.3)" gradientUnits="userSpaceOnUse"> + <stop offset="0"/> + <stop stop-color="#fff" offset="1"/> + </linearGradient> + </defs> + <g transform="translate(-33.29,-24.3)" mask="url(#mask111)"> + <g stroke-linecap="round" stroke-linejoin="round"> + <path d="m-8.511-10.449 1.126 4.064 2.707-2.765z" fill="#ababab"/> + <path d="m-2.273-24.496-6.238 14.047 3.833 1.299 6.238-14.048z" fill="#949494"/> + <path d="m-2.273-24.496 3.465-1.204.368 2.502z" fill="#ababab"/> + <path d="m17.511 4.674-2.707 2.766-22.189-13.825 2.707-2.765z" fill="#949494"/> + </g> + <g stroke="#878787"> + <path d="m-9.045 20.369-1.169 2.634" stroke-width="9.6"/> + <path d="m-12.418 23.191c-1.85-1.153-2.326-2.132-1.086-2.238 1.239-.106 3.642.709 5.493 1.862s2.326 2.132 1.087 2.238c-1.24.106-3.643-.709-5.494-1.862" fill="#878787" stroke-linecap="round" stroke-linejoin="round"/> + <path d="m-11.248 20.557c1.851 1.153 4.254 1.968 5.493 1.862 1.24-.106.764-1.085-1.086-2.238-1.851-1.153-4.254-1.968-5.494-1.862-1.239.106-.764 1.085 1.087 2.238" fill="#878787" stroke-linecap="round" stroke-linejoin="round"/> + </g> + <g stroke-linecap="round" stroke-linejoin="round"> + <path d="m-16.71-9.748 8.199-.701 1.126 4.064-8.199.701z" fill="#949494"/> + <path d="m23.749-9.373-6.238 14.047-22.189-13.824 6.238-14.048z" fill="#757575"/> + <path d="m10.271-16.073 3.751 3.534c.062.058.083.156.052.238l-1.95 5.128c-.046.121-.18.153-.268.065l-1.024-1.03c-.095-.096-.242-.048-.275.091l-.516 2.152c-.034.145-.191.19-.284.082 0 0-.606-.696-.606-.696-.094-.108-.25-.063-.285.082l-.803 3.384c-.05.212-.317.178-.336-.043l-.014-.147s.058-9.892.058-9.892c.001-.165.165-.253.277-.148l1.077 1.009c.101.095.25.034.274-.111l.597-3.587c.025-.146.174-.206.275-.111z" fill="#fbbf28" stroke="#fbbf28" stroke-width=".6"/> + </g> + <g stroke="#808080"> + <path d="m-8.362 18.833-.39.878" stroke-width="9.1"/> + <path d="m-10.956 19.899c-1.85-1.153-2.326-2.132-1.086-2.238 1.239-.106 3.642.708 5.493 1.861s2.326 2.132 1.087 2.238c-1.24.106-3.643-.708-5.494-1.861" fill="#808080" stroke-linecap="round" stroke-linejoin="round" stroke-width=".5"/> + <path d="m-10.566 19.021c1.851 1.153 4.254 1.967 5.494 1.861 1.239-.106.764-1.085-1.087-2.238s-4.254-1.967-5.494-1.861c-1.239.106-.764 1.085 1.087 2.238" fill="#808080" stroke-linecap="round" stroke-linejoin="round" stroke-width=".5"/> + </g> + <path d="m-16.71-9.748 8.199-.701 6.238-14.047-8.199.701z" fill="#757575" stroke-linecap="round" stroke-linejoin="round"/> + <path d="m-1.754 3.951-6.511 14.662" stroke="#91512b" stroke-width="8.6"/> + <g stroke-linecap="round" stroke-linejoin="round"> + <path d="m-10.468 18.801c-1.851-1.153-2.327-2.132-1.087-2.238 1.239-.106 3.643.709 5.493 1.862 1.851 1.153 2.327 2.132 1.087 2.238-1.239.106-3.643-.708-5.493-1.862" fill="#91512b"/> + <path d="m-3.958 4.139c1.851 1.153 4.254 1.968 5.494 1.862 1.239-.106.764-1.086-1.087-2.239s-4.254-1.967-5.493-1.861c-1.24.106-.764 1.085 1.086 2.238" fill="#91512b"/> + <path d="m1.192-25.7.368 2.502 22.189 13.825-.368-2.503z" fill="#949494"/> + <path d="m-10.472-23.795 8.199-.701 3.465-1.204-8.199.701z" fill="#949494"/> + </g> + <g stroke="#6e6e6e"> + <path d="m-.487 1.097-1.17 2.634" stroke-width="9.1"/> + <path d="m-3.86 3.92c-1.851-1.153-2.326-2.132-1.087-2.238s3.643.708 5.493 1.861c1.851 1.153 2.327 2.132 1.087 2.238-1.239.106-3.643-.708-5.493-1.861" fill="#6e6e6e" stroke-linecap="round" stroke-linejoin="round" stroke-width=".5"/> + <path d="m-2.691 1.286c1.851 1.153 4.254 1.967 5.494 1.861 1.239-.106.764-1.085-1.087-2.238s-4.254-1.967-5.493-1.861c-1.24.106-.764 1.085 1.086 2.238" fill="#6e6e6e" stroke-linecap="round" stroke-linejoin="round" stroke-width=".5"/> + </g> + <g stroke-linecap="round" stroke-linejoin="round"> + <path d="m18.269 6.236-3.465 1.204 2.707-2.766z" fill="#ababab"/> + <path d="m14.804 7.44-8.199.701-22.189-13.825 8.199-.701z" fill="#757575"/> + <path d="m-16.71-9.748 1.126 4.064-.367-2.502z" fill="#ababab"/> + <path d="m24.507-7.812-6.238 14.048-.758-1.562 6.238-14.047z" fill="#949494"/> + <path d="m-10.472-23.795-6.238 14.047.759 1.562 6.237-14.048z" fill="#949494"/> + <path d="m24.507-7.812-1.126-4.064.368 2.503z" fill="#ababab"/> + <path d="m23.381-11.876-8.199.701-22.189-13.824 8.199-.701z" fill="#757575"/> + <path d="m-10.472-23.795 3.465-1.204-2.707 2.765z" fill="#ababab"/> + <path d="m18.269 6.236-8.199.701-3.465 1.204 8.199-.701z" fill="#949494"/> + <path d="m-15.951-8.186.367 2.502 22.189 13.825-.367-2.503z" fill="#949494"/> + <path d="m18.269 6.236-8.199.701 6.238-14.048 8.199-.701z" fill="#757575"/> + <path d="m-9.714-22.234-6.237 14.048 22.189 13.824 6.237-14.047z" fill="#757575"/> + <path d="m2.545-12.79-4.583-1.659c-.076-.027-.156.008-.195.085 0 0-2.463 4.808-2.463 4.808-.058.114-.005.263.107.298l1.296.416c.122.039.171.21.093.321 0 0-1.205 1.722-1.205 1.722-.081.116-.024.294.105.325l.827.196c.128.031.186.209.104.325 0 0-1.899 2.701-1.899 2.701-.118.169.056.41.22.304l.11-.07 6.849-5.661c.115-.095.083-.304-.054-.354l-1.312-.48c-.123-.045-.165-.224-.078-.331 0 0 2.157-2.615 2.157-2.615.087-.106.045-.286-.079-.331z" fill="#fbbf28" stroke="#fbbf28" stroke-width=".6"/> + <path d="m24.507-7.812-8.199.701-1.126-4.064 8.199-.701z" fill="#949494"/> + <path d="m15.182-11.175-2.707 2.766-22.189-13.825 2.707-2.765z" fill="#949494"/> + <path d="m10.07 6.937-3.465 1.204-.367-2.503z" fill="#ababab"/> + <path d="m16.308-7.111-6.238 14.048-3.832-1.299 6.237-14.047z" fill="#949494"/> + <path d="m16.308-7.111-1.126-4.064-2.707 2.766z" fill="#ababab"/> + </g> + </g> +</svg> diff --git a/apps/frontend-vike/src/components/Content.vue b/apps/frontend-vike/src/components/Content.vue new file mode 100644 index 0000000..79729a9 --- /dev/null +++ b/apps/frontend-vike/src/components/Content.vue @@ -0,0 +1,22 @@ +<template> + <div id="page-container"> + <div id="page-content" class="p-5 pb-12 min-h-screen"> + <slot /> + </div> + </div> +</template> + +<style> +/* Page Transition Animation */ +body.page-transition #page-content { + opacity: 0; +} +</style> + +<style scoped> +/* Page Transition Animation */ +#page-content { + opacity: 1; + transition: opacity 0.3s ease-in-out; +} +</style> diff --git a/apps/frontend-vike/src/components/Counter.vue b/apps/frontend-vike/src/components/Counter.vue new file mode 100644 index 0000000..9bf910b --- /dev/null +++ b/apps/frontend-vike/src/components/Counter.vue @@ -0,0 +1,15 @@ +<template> + <button + type="button" + class="inline-block border border-black rounded bg-gray-200 px-2 py-1 text-xs font-medium uppercase leading-normal" + @click="state.count++" + > + Counter {{ state.count }} + </button> +</template> + +<script setup lang="ts"> +import { reactive } from "vue"; + +const state = reactive({ count: 0 }); +</script> diff --git a/apps/frontend-vike/src/components/Link.vue b/apps/frontend-vike/src/components/Link.vue new file mode 100644 index 0000000..18aa1f7 --- /dev/null +++ b/apps/frontend-vike/src/components/Link.vue @@ -0,0 +1,27 @@ +<template> + <a :class="{ active: isActive }"> + <slot /> + </a> +</template> + +<script lang="ts" setup> +import { usePageContext } from "vike-vue/usePageContext"; +import { computed, useAttrs } from "vue"; + +const pageContext = usePageContext(); +const { href } = useAttrs(); +const isActive = computed(() => { + const { urlPathname } = pageContext; + return href === "/" ? urlPathname === href : urlPathname.startsWith(href); +}); +</script> + +<style scoped> +a { + padding: 2px 10px; + margin-left: -10px; +} +a.active { + background-color: #eee; +} +</style> diff --git a/apps/frontend-vike/src/components/Logo.vue b/apps/frontend-vike/src/components/Logo.vue new file mode 100644 index 0000000..6a0f07c --- /dev/null +++ b/apps/frontend-vike/src/components/Logo.vue @@ -0,0 +1,7 @@ +<template> + <div class="p-5 mb-2"> + <a href="/"> + <img src="../assets/logo.svg" height="64" width="64" /> + </a> + </div> +</template> diff --git a/apps/frontend-vike/src/components/Sidebar.vue b/apps/frontend-vike/src/components/Sidebar.vue new file mode 100644 index 0000000..46959ab --- /dev/null +++ b/apps/frontend-vike/src/components/Sidebar.vue @@ -0,0 +1,5 @@ +<template> + <div id="sidebar" class="p-5 flex flex-col shrink-0 border-r-2 border-r-gray-200"> + <slot /> + </div> +</template> diff --git a/apps/frontend-vike/src/components/sidebar/AppSidebar.vue b/apps/frontend-vike/src/components/sidebar/AppSidebar.vue new file mode 100644 index 0000000..68f2ef8 --- /dev/null +++ b/apps/frontend-vike/src/components/sidebar/AppSidebar.vue @@ -0,0 +1,183 @@ +<script setup lang="ts"> +import type { SidebarProps } from '@/components/ui/sidebar'; + +import { + AudioWaveform, + BookOpen, + Bot, + Command, + Frame, + GalleryVerticalEnd, + Map, + PieChart, + Settings2, + SquareTerminal, +} from 'lucide-vue-next'; +import NavMain from '@/components/sidebar/NavMain.vue'; +import NavProjects from '@/components/sidebar/NavProjects.vue'; +import NavUser from '@/components/sidebar/NavUser.vue'; +import TenantSwitcher from '@/components/sidebar/TenantSwitcher.vue'; + +import { + Sidebar, + SidebarContent, + SidebarFooter, + SidebarHeader, + SidebarRail, +} from '@/components/ui/sidebar'; + +const props = withDefaults(defineProps<SidebarProps>(), { + collapsible: 'icon', +}); + +// This is sample data. +const data = { + user: { + name: 'shadcn', + email: 'm@example.com', + avatar: '/avatars/shadcn.jpg', + }, + teams: [ + { + name: 'Acme Inc', + logo: GalleryVerticalEnd, + plan: 'Enterprise', + }, + { + name: 'Acme Corp.', + logo: AudioWaveform, + plan: 'Startup', + }, + { + name: 'Evil Corp.', + logo: Command, + plan: 'Free', + }, + ], + navMain: [ + { + title: 'Labels', + url: '/labels', + icon: SquareTerminal, + isActive: true, + }, + { + title: 'Playground', + url: '#', + icon: SquareTerminal, + items: [ + { + title: 'History', + url: '#', + }, + { + title: 'Starred', + url: '#', + }, + { + title: 'Settings', + url: '#', + }, + ], + }, + { + title: 'Models', + url: '#', + icon: Bot, + items: [ + { + title: 'Genesis', + url: '#', + }, + { + title: 'Explorer', + url: '#', + }, + { + title: 'Quantum', + url: '#', + }, + ], + }, + { + title: 'Documentation', + url: '#', + icon: BookOpen, + items: [ + { + title: 'Introduction', + url: '#', + }, + { + title: 'Get Started', + url: '#', + }, + { + title: 'Tutorials', + url: '#', + }, + { + title: 'Changelog', + url: '#', + }, + ], + }, + { + title: 'Settings', + url: '#', + icon: Settings2, + items: [ + { + title: 'General', + url: '#', + }, + { + title: 'Team', + url: '#', + }, + { + title: 'Billing', + url: '#', + }, + { + title: 'Limits', + url: '#', + }, + ], + }, + ], + projects: [ + { + name: 'Design Engineering', + url: '#', + icon: Frame, + }, + { + name: 'Sales & Marketing', + url: '#', + icon: PieChart, + }, + { + name: 'Travel', + url: '#', + icon: Map, + }, + ], +}; +</script> + +<template> + <Sidebar v-bind="props"> + <SidebarHeader> + <TenantSwitcher :tenants="data.teams" /> + </SidebarHeader> + <SidebarContent> + <NavMain :items="data.navMain" /> + <NavProjects :projects="data.projects" /> + </SidebarContent> + <SidebarFooter> + <NavUser :user="data.user" /> + </SidebarFooter> + <SidebarRail /> + </Sidebar> +</template> diff --git a/apps/frontend-vike/src/components/sidebar/AppSidebarSkeleton.vue b/apps/frontend-vike/src/components/sidebar/AppSidebarSkeleton.vue new file mode 100644 index 0000000..e8bb176 --- /dev/null +++ b/apps/frontend-vike/src/components/sidebar/AppSidebarSkeleton.vue @@ -0,0 +1,41 @@ +<script setup lang="ts"> +import { Skeleton } from '@/components/ui/skeleton'; +import { + Sidebar, + SidebarContent, + SidebarFooter, + SidebarHeader, + SidebarRail, +} from '@/components/ui/sidebar'; +</script> + +<template> + <Sidebar collapsible="icon"> + <SidebarHeader class="p-2"> + <Skeleton class="h-10 w-full rounded-lg" /> + </SidebarHeader> + <SidebarContent class="gap-4 p-2"> + <div class="space-y-2"> + <Skeleton class="h-8 w-full" /> + <Skeleton class="h-8 w-5/6" /> + <Skeleton class="h-8 w-4/6" /> + </div> + <div class="space-y-2"> + <Skeleton class="h-4 w-20" /> + <Skeleton class="h-8 w-full" /> + <Skeleton class="h-8 w-full" /> + <Skeleton class="h-8 w-3/4" /> + </div> + </SidebarContent> + <SidebarFooter class="p-2"> + <div class="flex items-center gap-2"> + <Skeleton class="size-8 shrink-0 rounded-full" /> + <div class="min-w-0 flex-1 space-y-1.5"> + <Skeleton class="h-3 w-24" /> + <Skeleton class="h-3 w-32" /> + </div> + </div> + </SidebarFooter> + <SidebarRail /> + </Sidebar> +</template> diff --git a/apps/frontend-vike/src/components/sidebar/NavMain.vue b/apps/frontend-vike/src/components/sidebar/NavMain.vue new file mode 100644 index 0000000..52edd22 --- /dev/null +++ b/apps/frontend-vike/src/components/sidebar/NavMain.vue @@ -0,0 +1,66 @@ +<script setup lang="ts"> +import type { LucideIcon } from 'lucide-vue-next'; +import { PhCaretRight } from '@phosphor-icons/vue'; +import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible'; +import { + SidebarGroup, + SidebarGroupLabel, + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, + SidebarMenuSub, + SidebarMenuSubButton, + SidebarMenuSubItem, +} from '@/components/ui/sidebar'; + +defineProps<{ + items: { + title: string; + url: string; + icon?: LucideIcon; + isActive?: boolean; + items?: { + title: string; + url: string; + }[]; + }[]; +}>(); +</script> + +<template> + <SidebarGroup> + <SidebarGroupLabel>Platform</SidebarGroupLabel> + <SidebarMenu> + <Collapsible + v-for="item in items" + :key="item.title" + as-child + :default-open="item.isActive" + class="group/collapsible" + > + <SidebarMenuItem> + <CollapsibleTrigger as-child> + <SidebarMenuButton :tooltip="item.title"> + <component :is="item.icon" v-if="item.icon" /> + <span>{{ item.title }}</span> + <PhCaretRight + class="ml-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90" + /> + </SidebarMenuButton> + </CollapsibleTrigger> + <CollapsibleContent> + <SidebarMenuSub> + <SidebarMenuSubItem v-for="subItem in item.items" :key="subItem.title"> + <SidebarMenuSubButton as-child> + <a :href="subItem.url"> + <span>{{ subItem.title }}</span> + </a> + </SidebarMenuSubButton> + </SidebarMenuSubItem> + </SidebarMenuSub> + </CollapsibleContent> + </SidebarMenuItem> + </Collapsible> + </SidebarMenu> + </SidebarGroup> +</template> diff --git a/apps/frontend-vike/src/components/sidebar/NavProjects.vue b/apps/frontend-vike/src/components/sidebar/NavProjects.vue new file mode 100644 index 0000000..bc3bc13 --- /dev/null +++ b/apps/frontend-vike/src/components/sidebar/NavProjects.vue @@ -0,0 +1,80 @@ +<script setup lang="ts"> +import type { LucideIcon } from 'lucide-vue-next'; +import { PhFolder, PhShare, PhDotsThree, PhTrash } from '@phosphor-icons/vue'; + +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu'; +import { + SidebarGroup, + SidebarGroupLabel, + SidebarMenu, + SidebarMenuAction, + SidebarMenuButton, + SidebarMenuItem, + useSidebar, +} from '@/components/ui/sidebar'; + +defineProps<{ + projects: { + name: string; + url: string; + icon: LucideIcon; + }[]; +}>(); + +const { isMobile } = useSidebar(); +</script> + +<template> + <SidebarGroup class="group-data-[collapsible=icon]:hidden"> + <SidebarGroupLabel>Projects</SidebarGroupLabel> + <SidebarMenu> + <SidebarMenuItem v-for="item in projects" :key="item.name"> + <SidebarMenuButton as-child> + <a :href="item.url"> + <component :is="item.icon" /> + <span>{{ item.name }}</span> + </a> + </SidebarMenuButton> + <DropdownMenu> + <DropdownMenuTrigger as-child> + <SidebarMenuAction show-on-hover> + <PhDotsThree /> + <span class="sr-only">More</span> + </SidebarMenuAction> + </DropdownMenuTrigger> + <DropdownMenuContent + class="w-48 rounded-lg" + :side="isMobile ? 'bottom' : 'right'" + :align="isMobile ? 'end' : 'start'" + > + <DropdownMenuItem> + <PhFolder class="text-muted-foreground" /> + <span>View Project</span> + </DropdownMenuItem> + <DropdownMenuItem> + <PhShare class="text-muted-foreground" /> + <span>Share Project</span> + </DropdownMenuItem> + <DropdownMenuSeparator /> + <DropdownMenuItem> + <PhTrash class="text-muted-foreground" /> + <span>Delete Project</span> + </DropdownMenuItem> + </DropdownMenuContent> + </DropdownMenu> + </SidebarMenuItem> + <SidebarMenuItem> + <SidebarMenuButton class="text-sidebar-foreground/70"> + <PhDotsThree class="text-sidebar-foreground/70" /> + <span>More</span> + </SidebarMenuButton> + </SidebarMenuItem> + </SidebarMenu> + </SidebarGroup> +</template> diff --git a/apps/frontend-vike/src/components/sidebar/NavUser.vue b/apps/frontend-vike/src/components/sidebar/NavUser.vue new file mode 100644 index 0000000..58c502f --- /dev/null +++ b/apps/frontend-vike/src/components/sidebar/NavUser.vue @@ -0,0 +1,108 @@ +<script setup lang="ts"> +import { + PhSealCheck, + PhBell, + PhCaretUpDown, + PhCreditCard, + PhSignOut, + PhSparkle, +} from '@phosphor-icons/vue'; + +import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu'; +import { + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, + useSidebar, +} from '@/components/ui/sidebar'; + +const props = defineProps<{ + user: { + name: string; + email: string; + avatar: string; + }; +}>(); + +const { isMobile } = useSidebar(); +</script> + +<template> + <SidebarMenu> + <SidebarMenuItem> + <DropdownMenu> + <DropdownMenuTrigger as-child> + <SidebarMenuButton + size="lg" + class="data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground" + > + <Avatar class="h-8 w-8 rounded-lg"> + <AvatarImage :src="user.avatar" :alt="user.name" /> + <AvatarFallback class="rounded-lg"> CN </AvatarFallback> + </Avatar> + <div class="grid flex-1 text-left text-sm leading-tight"> + <span class="truncate font-medium">{{ user.name }}</span> + <span class="truncate text-xs">{{ user.email }}</span> + </div> + <PhCaretUpDown class="ml-auto size-4" /> + </SidebarMenuButton> + </DropdownMenuTrigger> + <DropdownMenuContent + class="w-(--reka-dropdown-menu-trigger-width) min-w-56 rounded-lg" + :side="isMobile ? 'bottom' : 'right'" + align="end" + :side-offset="4" + > + <DropdownMenuLabel class="p-0 font-normal"> + <div class="flex items-center gap-2 px-1 py-1.5 text-left text-sm"> + <Avatar class="h-8 w-8 rounded-lg"> + <AvatarImage :src="user.avatar" :alt="user.name" /> + <AvatarFallback class="rounded-lg"> CN </AvatarFallback> + </Avatar> + <div class="grid flex-1 text-left text-sm leading-tight"> + <span class="truncate font-semibold">{{ user.name }}</span> + <span class="truncate text-xs">{{ user.email }}</span> + </div> + </div> + </DropdownMenuLabel> + <DropdownMenuSeparator /> + <DropdownMenuGroup> + <DropdownMenuItem> + <PhSparkle /> + Upgrade to Pro + </DropdownMenuItem> + </DropdownMenuGroup> + <DropdownMenuSeparator /> + <DropdownMenuGroup> + <DropdownMenuItem> + <PhSealCheck /> + Account + </DropdownMenuItem> + <DropdownMenuItem> + <PhCreditCard /> + Billing + </DropdownMenuItem> + <DropdownMenuItem> + <PhBell /> + Notifications + </DropdownMenuItem> + </DropdownMenuGroup> + <DropdownMenuSeparator /> + <DropdownMenuItem> + <PhSignOut /> + Log out + </DropdownMenuItem> + </DropdownMenuContent> + </DropdownMenu> + </SidebarMenuItem> + </SidebarMenu> +</template> diff --git a/apps/frontend-vike/src/components/sidebar/TenantSwitcher.vue b/apps/frontend-vike/src/components/sidebar/TenantSwitcher.vue new file mode 100644 index 0000000..074ee9e --- /dev/null +++ b/apps/frontend-vike/src/components/sidebar/TenantSwitcher.vue @@ -0,0 +1,88 @@ +<script setup lang="ts"> +import type { Component } from 'vue'; + +import { PhCaretUpDown, PhPlus } from '@phosphor-icons/vue'; +import { ref } from 'vue'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu'; + +import { + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, + useSidebar, +} from '@/components/ui/sidebar'; + +const props = defineProps<{ + tenants: { + name: string; + logo: Component; + plan: string; + }[]; +}>(); + +const { isMobile } = useSidebar(); +const activeTenant = ref(props.tenants[0]!); +</script> + +<template> + <SidebarMenu> + <SidebarMenuItem> + <DropdownMenu> + <DropdownMenuTrigger as-child> + <SidebarMenuButton + size="lg" + class="data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground" + > + <div + class="flex aspect-square size-8 items-center justify-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground" + > + <component :is="activeTenant.logo" class="size-4" /> + </div> + <div class="grid flex-1 text-left text-sm leading-tight"> + <span class="truncate font-medium"> + {{ activeTenant.name }} + </span> + <span class="truncate text-xs">{{ activeTenant.plan }}</span> + </div> + <PhCaretUpDown class="ml-auto" /> + </SidebarMenuButton> + </DropdownMenuTrigger> + <DropdownMenuContent + class="w-(--reka-dropdown-menu-trigger-width) min-w-56 rounded-lg" + align="start" + :side="isMobile ? 'bottom' : 'right'" + :side-offset="4" + > + <DropdownMenuLabel class="text-xs text-muted-foreground"> Teams </DropdownMenuLabel> + <DropdownMenuItem + v-for="(tenant, index) in tenants" + :key="tenant.name" + class="gap-2 p-2" + @click="activeTenant = tenant" + > + <div class="flex size-6 items-center justify-center rounded-sm border"> + <component :is="tenant.logo" class="size-3.5 shrink-0" /> + </div> + {{ tenant.name }} + <!-- <DropdownMenuShortcut>⌘{{ index + 1 }}</DropdownMenuShortcut> --> + </DropdownMenuItem> + <DropdownMenuSeparator /> + <DropdownMenuItem class="gap-2 p-2"> + <div class="flex size-6 items-center justify-center rounded-md border bg-transparent"> + <PhPlus class="size-4" /> + </div> + <div class="font-medium text-muted-foreground">Add tenant</div> + </DropdownMenuItem> + </DropdownMenuContent> + </DropdownMenu> + </SidebarMenuItem> + </SidebarMenu> +</template> diff --git a/apps/frontend-vike/src/components/ui/avatar/Avatar.vue b/apps/frontend-vike/src/components/ui/avatar/Avatar.vue new file mode 100644 index 0000000..bb7e669 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/avatar/Avatar.vue @@ -0,0 +1,18 @@ +<script setup lang="ts"> +import type { HTMLAttributes } from "vue" +import { AvatarRoot } from "reka-ui" +import { cn } from "@/lib/utils" + +const props = defineProps<{ + class?: HTMLAttributes["class"] +}>() +</script> + +<template> + <AvatarRoot + data-slot="avatar" + :class="cn('relative flex size-8 shrink-0 overflow-hidden rounded-full', props.class)" + > + <slot /> + </AvatarRoot> +</template> diff --git a/apps/frontend-vike/src/components/ui/avatar/AvatarFallback.vue b/apps/frontend-vike/src/components/ui/avatar/AvatarFallback.vue new file mode 100644 index 0000000..16b588a --- /dev/null +++ b/apps/frontend-vike/src/components/ui/avatar/AvatarFallback.vue @@ -0,0 +1,21 @@ +<script setup lang="ts"> +import type { AvatarFallbackProps } from "reka-ui" +import type { HTMLAttributes } from "vue" +import { reactiveOmit } from "@vueuse/core" +import { AvatarFallback } from "reka-ui" +import { cn } from "@/lib/utils" + +const props = defineProps<AvatarFallbackProps & { class?: HTMLAttributes["class"] }>() + +const delegatedProps = reactiveOmit(props, "class") +</script> + +<template> + <AvatarFallback + data-slot="avatar-fallback" + v-bind="delegatedProps" + :class="cn('bg-muted flex size-full items-center justify-center rounded-full', props.class)" + > + <slot /> + </AvatarFallback> +</template> diff --git a/apps/frontend-vike/src/components/ui/avatar/AvatarImage.vue b/apps/frontend-vike/src/components/ui/avatar/AvatarImage.vue new file mode 100644 index 0000000..24a8166 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/avatar/AvatarImage.vue @@ -0,0 +1,16 @@ +<script setup lang="ts"> +import type { AvatarImageProps } from "reka-ui" +import { AvatarImage } from "reka-ui" + +const props = defineProps<AvatarImageProps>() +</script> + +<template> + <AvatarImage + data-slot="avatar-image" + v-bind="props" + class="aspect-square size-full" + > + <slot /> + </AvatarImage> +</template> diff --git a/apps/frontend-vike/src/components/ui/avatar/index.ts b/apps/frontend-vike/src/components/ui/avatar/index.ts new file mode 100644 index 0000000..cf0e003 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/avatar/index.ts @@ -0,0 +1,3 @@ +export { default as Avatar } from "./Avatar.vue" +export { default as AvatarFallback } from "./AvatarFallback.vue" +export { default as AvatarImage } from "./AvatarImage.vue" diff --git a/apps/frontend-vike/src/components/ui/breadcrumb/Breadcrumb.vue b/apps/frontend-vike/src/components/ui/breadcrumb/Breadcrumb.vue new file mode 100644 index 0000000..c5be5f0 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/breadcrumb/Breadcrumb.vue @@ -0,0 +1,17 @@ +<script lang="ts" setup> +import type { HTMLAttributes } from "vue" + +const props = defineProps<{ + class?: HTMLAttributes["class"] +}>() +</script> + +<template> + <nav + aria-label="breadcrumb" + data-slot="breadcrumb" + :class="props.class" + > + <slot /> + </nav> +</template> diff --git a/apps/frontend-vike/src/components/ui/breadcrumb/BreadcrumbEllipsis.vue b/apps/frontend-vike/src/components/ui/breadcrumb/BreadcrumbEllipsis.vue new file mode 100644 index 0000000..5f48e89 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/breadcrumb/BreadcrumbEllipsis.vue @@ -0,0 +1,23 @@ +<script lang="ts" setup> +import type { HTMLAttributes } from "vue" +import { PhDotsThree } from '@phosphor-icons/vue' +import { cn } from "@/lib/utils" + +const props = defineProps<{ + class?: HTMLAttributes["class"] +}>() +</script> + +<template> + <span + data-slot="breadcrumb-ellipsis" + role="presentation" + aria-hidden="true" + :class="cn('flex size-9 items-center justify-center', props.class)" + > + <slot> + <PhDotsThree class="size-4" /> + </slot> + <span class="sr-only">More</span> + </span> +</template> diff --git a/apps/frontend-vike/src/components/ui/breadcrumb/BreadcrumbItem.vue b/apps/frontend-vike/src/components/ui/breadcrumb/BreadcrumbItem.vue new file mode 100644 index 0000000..e3dce68 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/breadcrumb/BreadcrumbItem.vue @@ -0,0 +1,17 @@ +<script lang="ts" setup> +import type { HTMLAttributes } from "vue" +import { cn } from "@/lib/utils" + +const props = defineProps<{ + class?: HTMLAttributes["class"] +}>() +</script> + +<template> + <li + data-slot="breadcrumb-item" + :class="cn('inline-flex items-center gap-1.5', props.class)" + > + <slot /> + </li> +</template> diff --git a/apps/frontend-vike/src/components/ui/breadcrumb/BreadcrumbLink.vue b/apps/frontend-vike/src/components/ui/breadcrumb/BreadcrumbLink.vue new file mode 100644 index 0000000..5d96381 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/breadcrumb/BreadcrumbLink.vue @@ -0,0 +1,21 @@ +<script lang="ts" setup> +import type { PrimitiveProps } from "reka-ui" +import type { HTMLAttributes } from "vue" +import { Primitive } from "reka-ui" +import { cn } from "@/lib/utils" + +const props = withDefaults(defineProps<PrimitiveProps & { class?: HTMLAttributes["class"] }>(), { + as: "a", +}) +</script> + +<template> + <Primitive + data-slot="breadcrumb-link" + :as="as" + :as-child="asChild" + :class="cn('hover:text-foreground transition-colors', props.class)" + > + <slot /> + </Primitive> +</template> diff --git a/apps/frontend-vike/src/components/ui/breadcrumb/BreadcrumbList.vue b/apps/frontend-vike/src/components/ui/breadcrumb/BreadcrumbList.vue new file mode 100644 index 0000000..fc62811 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/breadcrumb/BreadcrumbList.vue @@ -0,0 +1,17 @@ +<script lang="ts" setup> +import type { HTMLAttributes } from "vue" +import { cn } from "@/lib/utils" + +const props = defineProps<{ + class?: HTMLAttributes["class"] +}>() +</script> + +<template> + <ol + data-slot="breadcrumb-list" + :class="cn('text-muted-foreground flex flex-wrap items-center gap-1.5 text-sm break-words sm:gap-2.5', props.class)" + > + <slot /> + </ol> +</template> diff --git a/apps/frontend-vike/src/components/ui/breadcrumb/BreadcrumbPage.vue b/apps/frontend-vike/src/components/ui/breadcrumb/BreadcrumbPage.vue new file mode 100644 index 0000000..b429b20 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/breadcrumb/BreadcrumbPage.vue @@ -0,0 +1,20 @@ +<script lang="ts" setup> +import type { HTMLAttributes } from "vue" +import { cn } from "@/lib/utils" + +const props = defineProps<{ + class?: HTMLAttributes["class"] +}>() +</script> + +<template> + <span + data-slot="breadcrumb-page" + role="link" + aria-disabled="true" + aria-current="page" + :class="cn('text-foreground font-normal', props.class)" + > + <slot /> + </span> +</template> diff --git a/apps/frontend-vike/src/components/ui/breadcrumb/BreadcrumbSeparator.vue b/apps/frontend-vike/src/components/ui/breadcrumb/BreadcrumbSeparator.vue new file mode 100644 index 0000000..44f50f2 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/breadcrumb/BreadcrumbSeparator.vue @@ -0,0 +1,22 @@ +<script lang="ts" setup> +import type { HTMLAttributes } from "vue" +import { PhCaretRight } from '@phosphor-icons/vue' +import { cn } from "@/lib/utils" + +const props = defineProps<{ + class?: HTMLAttributes["class"] +}>() +</script> + +<template> + <li + data-slot="breadcrumb-separator" + role="presentation" + aria-hidden="true" + :class="cn('[&>svg]:size-3.5', props.class)" + > + <slot> + <PhCaretRight /> + </slot> + </li> +</template> diff --git a/apps/frontend-vike/src/components/ui/breadcrumb/index.ts b/apps/frontend-vike/src/components/ui/breadcrumb/index.ts new file mode 100644 index 0000000..f4eafdc --- /dev/null +++ b/apps/frontend-vike/src/components/ui/breadcrumb/index.ts @@ -0,0 +1,7 @@ +export { default as Breadcrumb } from "./Breadcrumb.vue" +export { default as BreadcrumbEllipsis } from "./BreadcrumbEllipsis.vue" +export { default as BreadcrumbItem } from "./BreadcrumbItem.vue" +export { default as BreadcrumbLink } from "./BreadcrumbLink.vue" +export { default as BreadcrumbList } from "./BreadcrumbList.vue" +export { default as BreadcrumbPage } from "./BreadcrumbPage.vue" +export { default as BreadcrumbSeparator } from "./BreadcrumbSeparator.vue" diff --git a/apps/frontend-vike/src/components/ui/button/Button.vue b/apps/frontend-vike/src/components/ui/button/Button.vue new file mode 100644 index 0000000..3763470 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/button/Button.vue @@ -0,0 +1,31 @@ +<script setup lang="ts"> +import type { PrimitiveProps } from "reka-ui" +import type { HTMLAttributes } from "vue" +import type { ButtonVariants } from "." +import { Primitive } from "reka-ui" +import { cn } from "@/lib/utils" +import { buttonVariants } from "." + +interface Props extends PrimitiveProps { + variant?: ButtonVariants["variant"] + size?: ButtonVariants["size"] + class?: HTMLAttributes["class"] +} + +const props = withDefaults(defineProps<Props>(), { + as: "button", +}) +</script> + +<template> + <Primitive + data-slot="button" + :data-variant="variant" + :data-size="size" + :as="as" + :as-child="asChild" + :class="cn(buttonVariants({ variant, size }), props.class)" + > + <slot /> + </Primitive> +</template> diff --git a/apps/frontend-vike/src/components/ui/button/index.ts b/apps/frontend-vike/src/components/ui/button/index.ts new file mode 100644 index 0000000..26e2c55 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/button/index.ts @@ -0,0 +1,38 @@ +import type { VariantProps } from "class-variance-authority" +import { cva } from "class-variance-authority" + +export { default as Button } from "./Button.vue" + +export const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground hover:bg-primary/90", + destructive: + "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", + outline: + "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50", + secondary: + "bg-secondary text-secondary-foreground hover:bg-secondary/80", + ghost: + "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + "default": "h-9 px-4 py-2 has-[>svg]:px-3", + "sm": "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5", + "lg": "h-10 rounded-md px-6 has-[>svg]:px-4", + "icon": "size-9", + "icon-sm": "size-8", + "icon-lg": "size-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + }, +) +export type ButtonVariants = VariantProps<typeof buttonVariants> diff --git a/apps/frontend-vike/src/components/ui/collapsible/Collapsible.vue b/apps/frontend-vike/src/components/ui/collapsible/Collapsible.vue new file mode 100644 index 0000000..70a9497 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/collapsible/Collapsible.vue @@ -0,0 +1,19 @@ +<script setup lang="ts"> +import type { CollapsibleRootEmits, CollapsibleRootProps } from "reka-ui" +import { CollapsibleRoot, useForwardPropsEmits } from "reka-ui" + +const props = defineProps<CollapsibleRootProps>() +const emits = defineEmits<CollapsibleRootEmits>() + +const forwarded = useForwardPropsEmits(props, emits) +</script> + +<template> + <CollapsibleRoot + v-slot="slotProps" + data-slot="collapsible" + v-bind="forwarded" + > + <slot v-bind="slotProps" /> + </CollapsibleRoot> +</template> diff --git a/apps/frontend-vike/src/components/ui/collapsible/CollapsibleContent.vue b/apps/frontend-vike/src/components/ui/collapsible/CollapsibleContent.vue new file mode 100644 index 0000000..8be0a11 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/collapsible/CollapsibleContent.vue @@ -0,0 +1,15 @@ +<script setup lang="ts"> +import type { CollapsibleContentProps } from "reka-ui" +import { CollapsibleContent } from "reka-ui" + +const props = defineProps<CollapsibleContentProps>() +</script> + +<template> + <CollapsibleContent + data-slot="collapsible-content" + v-bind="props" + > + <slot /> + </CollapsibleContent> +</template> diff --git a/apps/frontend-vike/src/components/ui/collapsible/CollapsibleTrigger.vue b/apps/frontend-vike/src/components/ui/collapsible/CollapsibleTrigger.vue new file mode 100644 index 0000000..33bec78 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/collapsible/CollapsibleTrigger.vue @@ -0,0 +1,15 @@ +<script setup lang="ts"> +import type { CollapsibleTriggerProps } from "reka-ui" +import { CollapsibleTrigger } from "reka-ui" + +const props = defineProps<CollapsibleTriggerProps>() +</script> + +<template> + <CollapsibleTrigger + data-slot="collapsible-trigger" + v-bind="props" + > + <slot /> + </CollapsibleTrigger> +</template> diff --git a/apps/frontend-vike/src/components/ui/collapsible/index.ts b/apps/frontend-vike/src/components/ui/collapsible/index.ts new file mode 100644 index 0000000..86a031d --- /dev/null +++ b/apps/frontend-vike/src/components/ui/collapsible/index.ts @@ -0,0 +1,3 @@ +export { default as Collapsible } from "./Collapsible.vue" +export { default as CollapsibleContent } from "./CollapsibleContent.vue" +export { default as CollapsibleTrigger } from "./CollapsibleTrigger.vue" diff --git a/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenu.vue b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenu.vue new file mode 100644 index 0000000..e1c9ee3 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenu.vue @@ -0,0 +1,19 @@ +<script setup lang="ts"> +import type { DropdownMenuRootEmits, DropdownMenuRootProps } from "reka-ui" +import { DropdownMenuRoot, useForwardPropsEmits } from "reka-ui" + +const props = defineProps<DropdownMenuRootProps>() +const emits = defineEmits<DropdownMenuRootEmits>() + +const forwarded = useForwardPropsEmits(props, emits) +</script> + +<template> + <DropdownMenuRoot + v-slot="slotProps" + data-slot="dropdown-menu" + v-bind="forwarded" + > + <slot v-bind="slotProps" /> + </DropdownMenuRoot> +</template> diff --git a/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue new file mode 100644 index 0000000..af2fd1c --- /dev/null +++ b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue @@ -0,0 +1,39 @@ +<script setup lang="ts"> +import type { DropdownMenuCheckboxItemEmits, DropdownMenuCheckboxItemProps } from "reka-ui" +import type { HTMLAttributes } from "vue" +import { reactiveOmit } from "@vueuse/core" +import { PhCheck } from '@phosphor-icons/vue' +import { + DropdownMenuCheckboxItem, + DropdownMenuItemIndicator, + useForwardPropsEmits, +} from "reka-ui" +import { cn } from "@/lib/utils" + +const props = defineProps<DropdownMenuCheckboxItemProps & { class?: HTMLAttributes["class"] }>() +const emits = defineEmits<DropdownMenuCheckboxItemEmits>() + +const delegatedProps = reactiveOmit(props, "class") + +const forwarded = useForwardPropsEmits(delegatedProps, emits) +</script> + +<template> + <DropdownMenuCheckboxItem + data-slot="dropdown-menu-checkbox-item" + v-bind="forwarded" + :class=" cn( + 'focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=\'size-\'])]:size-4', + props.class, + )" + > + <span class="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center"> + <DropdownMenuItemIndicator> + <slot name="indicator-icon"> + <PhCheck class="size-4" /> + </slot> + </DropdownMenuItemIndicator> + </span> + <slot /> + </DropdownMenuCheckboxItem> +</template> diff --git a/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuContent.vue b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuContent.vue new file mode 100644 index 0000000..7c43014 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuContent.vue @@ -0,0 +1,39 @@ +<script setup lang="ts"> +import type { DropdownMenuContentEmits, DropdownMenuContentProps } from "reka-ui" +import type { HTMLAttributes } from "vue" +import { reactiveOmit } from "@vueuse/core" +import { + DropdownMenuContent, + DropdownMenuPortal, + useForwardPropsEmits, +} from "reka-ui" +import { cn } from "@/lib/utils" + +defineOptions({ + inheritAttrs: false, +}) + +const props = withDefaults( + defineProps<DropdownMenuContentProps & { class?: HTMLAttributes["class"] }>(), + { + sideOffset: 4, + }, +) +const emits = defineEmits<DropdownMenuContentEmits>() + +const delegatedProps = reactiveOmit(props, "class") + +const forwarded = useForwardPropsEmits(delegatedProps, emits) +</script> + +<template> + <DropdownMenuPortal> + <DropdownMenuContent + data-slot="dropdown-menu-content" + v-bind="{ ...$attrs, ...forwarded }" + :class="cn('bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--reka-dropdown-menu-content-available-height) min-w-[8rem] origin-(--reka-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md', props.class)" + > + <slot /> + </DropdownMenuContent> + </DropdownMenuPortal> +</template> diff --git a/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuGroup.vue b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuGroup.vue new file mode 100644 index 0000000..da634ec --- /dev/null +++ b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuGroup.vue @@ -0,0 +1,15 @@ +<script setup lang="ts"> +import type { DropdownMenuGroupProps } from "reka-ui" +import { DropdownMenuGroup } from "reka-ui" + +const props = defineProps<DropdownMenuGroupProps>() +</script> + +<template> + <DropdownMenuGroup + data-slot="dropdown-menu-group" + v-bind="props" + > + <slot /> + </DropdownMenuGroup> +</template> diff --git a/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuItem.vue b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuItem.vue new file mode 100644 index 0000000..f56cae3 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuItem.vue @@ -0,0 +1,31 @@ +<script setup lang="ts"> +import type { DropdownMenuItemProps } from "reka-ui" +import type { HTMLAttributes } from "vue" +import { reactiveOmit } from "@vueuse/core" +import { DropdownMenuItem, useForwardProps } from "reka-ui" +import { cn } from "@/lib/utils" + +const props = withDefaults(defineProps<DropdownMenuItemProps & { + class?: HTMLAttributes["class"] + inset?: boolean + variant?: "default" | "destructive" +}>(), { + variant: "default", +}) + +const delegatedProps = reactiveOmit(props, "inset", "variant", "class") + +const forwardedProps = useForwardProps(delegatedProps) +</script> + +<template> + <DropdownMenuItem + data-slot="dropdown-menu-item" + :data-inset="inset ? '' : undefined" + :data-variant="variant" + v-bind="forwardedProps" + :class="cn('focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*=\'text-\'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=\'size-\'])]:size-4', props.class)" + > + <slot /> + </DropdownMenuItem> +</template> diff --git a/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuLabel.vue b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuLabel.vue new file mode 100644 index 0000000..8bca83c --- /dev/null +++ b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuLabel.vue @@ -0,0 +1,23 @@ +<script setup lang="ts"> +import type { DropdownMenuLabelProps } from "reka-ui" +import type { HTMLAttributes } from "vue" +import { reactiveOmit } from "@vueuse/core" +import { DropdownMenuLabel, useForwardProps } from "reka-ui" +import { cn } from "@/lib/utils" + +const props = defineProps<DropdownMenuLabelProps & { class?: HTMLAttributes["class"], inset?: boolean }>() + +const delegatedProps = reactiveOmit(props, "class", "inset") +const forwardedProps = useForwardProps(delegatedProps) +</script> + +<template> + <DropdownMenuLabel + data-slot="dropdown-menu-label" + :data-inset="inset ? '' : undefined" + v-bind="forwardedProps" + :class="cn('px-2 py-1.5 text-sm font-medium data-[inset]:pl-8', props.class)" + > + <slot /> + </DropdownMenuLabel> +</template> diff --git a/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue new file mode 100644 index 0000000..fe82cad --- /dev/null +++ b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue @@ -0,0 +1,21 @@ +<script setup lang="ts"> +import type { DropdownMenuRadioGroupEmits, DropdownMenuRadioGroupProps } from "reka-ui" +import { + DropdownMenuRadioGroup, + useForwardPropsEmits, +} from "reka-ui" + +const props = defineProps<DropdownMenuRadioGroupProps>() +const emits = defineEmits<DropdownMenuRadioGroupEmits>() + +const forwarded = useForwardPropsEmits(props, emits) +</script> + +<template> + <DropdownMenuRadioGroup + data-slot="dropdown-menu-radio-group" + v-bind="forwarded" + > + <slot /> + </DropdownMenuRadioGroup> +</template> diff --git a/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue new file mode 100644 index 0000000..da95bcf --- /dev/null +++ b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue @@ -0,0 +1,40 @@ +<script setup lang="ts"> +import type { DropdownMenuRadioItemEmits, DropdownMenuRadioItemProps } from "reka-ui" +import type { HTMLAttributes } from "vue" +import { reactiveOmit } from "@vueuse/core" +import { PhCircle } from '@phosphor-icons/vue' +import { + DropdownMenuItemIndicator, + DropdownMenuRadioItem, + useForwardPropsEmits, +} from "reka-ui" +import { cn } from "@/lib/utils" + +const props = defineProps<DropdownMenuRadioItemProps & { class?: HTMLAttributes["class"] }>() + +const emits = defineEmits<DropdownMenuRadioItemEmits>() + +const delegatedProps = reactiveOmit(props, "class") + +const forwarded = useForwardPropsEmits(delegatedProps, emits) +</script> + +<template> + <DropdownMenuRadioItem + data-slot="dropdown-menu-radio-item" + v-bind="forwarded" + :class="cn( + 'focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=\'size-\'])]:size-4', + props.class, + )" + > + <span class="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center"> + <DropdownMenuItemIndicator> + <slot name="indicator-icon"> + <PhCircle class="size-2 fill-current" /> + </slot> + </DropdownMenuItemIndicator> + </span> + <slot /> + </DropdownMenuRadioItem> +</template> diff --git a/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue new file mode 100644 index 0000000..1b936c3 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue @@ -0,0 +1,23 @@ +<script setup lang="ts"> +import type { DropdownMenuSeparatorProps } from "reka-ui" +import type { HTMLAttributes } from "vue" +import { reactiveOmit } from "@vueuse/core" +import { + DropdownMenuSeparator, +} from "reka-ui" +import { cn } from "@/lib/utils" + +const props = defineProps<DropdownMenuSeparatorProps & { + class?: HTMLAttributes["class"] +}>() + +const delegatedProps = reactiveOmit(props, "class") +</script> + +<template> + <DropdownMenuSeparator + data-slot="dropdown-menu-separator" + v-bind="delegatedProps" + :class="cn('bg-border -mx-1 my-1 h-px', props.class)" + /> +</template> diff --git a/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue new file mode 100644 index 0000000..60be75c --- /dev/null +++ b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue @@ -0,0 +1,17 @@ +<script setup lang="ts"> +import type { HTMLAttributes } from "vue" +import { cn } from "@/lib/utils" + +const props = defineProps<{ + class?: HTMLAttributes["class"] +}>() +</script> + +<template> + <span + data-slot="dropdown-menu-shortcut" + :class="cn('text-muted-foreground ml-auto text-xs tracking-widest', props.class)" + > + <slot /> + </span> +</template> diff --git a/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuSub.vue b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuSub.vue new file mode 100644 index 0000000..7472e77 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuSub.vue @@ -0,0 +1,18 @@ +<script setup lang="ts"> +import type { DropdownMenuSubEmits, DropdownMenuSubProps } from "reka-ui" +import { + DropdownMenuSub, + useForwardPropsEmits, +} from "reka-ui" + +const props = defineProps<DropdownMenuSubProps>() +const emits = defineEmits<DropdownMenuSubEmits>() + +const forwarded = useForwardPropsEmits(props, emits) +</script> + +<template> + <DropdownMenuSub v-slot="slotProps" data-slot="dropdown-menu-sub" v-bind="forwarded"> + <slot v-bind="slotProps" /> + </DropdownMenuSub> +</template> diff --git a/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue new file mode 100644 index 0000000..d7c6b08 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue @@ -0,0 +1,27 @@ +<script setup lang="ts"> +import type { DropdownMenuSubContentEmits, DropdownMenuSubContentProps } from "reka-ui" +import type { HTMLAttributes } from "vue" +import { reactiveOmit } from "@vueuse/core" +import { + DropdownMenuSubContent, + useForwardPropsEmits, +} from "reka-ui" +import { cn } from "@/lib/utils" + +const props = defineProps<DropdownMenuSubContentProps & { class?: HTMLAttributes["class"] }>() +const emits = defineEmits<DropdownMenuSubContentEmits>() + +const delegatedProps = reactiveOmit(props, "class") + +const forwarded = useForwardPropsEmits(delegatedProps, emits) +</script> + +<template> + <DropdownMenuSubContent + data-slot="dropdown-menu-sub-content" + v-bind="forwarded" + :class="cn('bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--reka-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg', props.class)" + > + <slot /> + </DropdownMenuSubContent> +</template> diff --git a/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue new file mode 100644 index 0000000..5805640 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue @@ -0,0 +1,31 @@ +<script setup lang="ts"> +import type { DropdownMenuSubTriggerProps } from "reka-ui" +import type { HTMLAttributes } from "vue" +import { reactiveOmit } from "@vueuse/core" +import { PhCaretRight } from '@phosphor-icons/vue' +import { + DropdownMenuSubTrigger, + useForwardProps, +} from "reka-ui" +import { cn } from "@/lib/utils" + +const props = defineProps<DropdownMenuSubTriggerProps & { class?: HTMLAttributes["class"], inset?: boolean }>() + +const delegatedProps = reactiveOmit(props, "class", "inset") +const forwardedProps = useForwardProps(delegatedProps) +</script> + +<template> + <DropdownMenuSubTrigger + data-slot="dropdown-menu-sub-trigger" + v-bind="forwardedProps" + :data-inset="inset ? '' : undefined" + :class="cn( + 'focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=\'size-\'])]:size-4 data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*=\'text-\'])]:text-muted-foreground', + props.class, + )" + > + <slot /> + <PhCaretRight class="ml-auto size-4" /> + </DropdownMenuSubTrigger> +</template> diff --git a/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue new file mode 100644 index 0000000..75cd747 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue @@ -0,0 +1,17 @@ +<script setup lang="ts"> +import type { DropdownMenuTriggerProps } from "reka-ui" +import { DropdownMenuTrigger, useForwardProps } from "reka-ui" + +const props = defineProps<DropdownMenuTriggerProps>() + +const forwardedProps = useForwardProps(props) +</script> + +<template> + <DropdownMenuTrigger + data-slot="dropdown-menu-trigger" + v-bind="forwardedProps" + > + <slot /> + </DropdownMenuTrigger> +</template> diff --git a/apps/frontend-vike/src/components/ui/dropdown-menu/index.ts b/apps/frontend-vike/src/components/ui/dropdown-menu/index.ts new file mode 100644 index 0000000..955fe3a --- /dev/null +++ b/apps/frontend-vike/src/components/ui/dropdown-menu/index.ts @@ -0,0 +1,16 @@ +export { default as DropdownMenu } from "./DropdownMenu.vue" + +export { default as DropdownMenuCheckboxItem } from "./DropdownMenuCheckboxItem.vue" +export { default as DropdownMenuContent } from "./DropdownMenuContent.vue" +export { default as DropdownMenuGroup } from "./DropdownMenuGroup.vue" +export { default as DropdownMenuItem } from "./DropdownMenuItem.vue" +export { default as DropdownMenuLabel } from "./DropdownMenuLabel.vue" +export { default as DropdownMenuRadioGroup } from "./DropdownMenuRadioGroup.vue" +export { default as DropdownMenuRadioItem } from "./DropdownMenuRadioItem.vue" +export { default as DropdownMenuSeparator } from "./DropdownMenuSeparator.vue" +export { default as DropdownMenuShortcut } from "./DropdownMenuShortcut.vue" +export { default as DropdownMenuSub } from "./DropdownMenuSub.vue" +export { default as DropdownMenuSubContent } from "./DropdownMenuSubContent.vue" +export { default as DropdownMenuSubTrigger } from "./DropdownMenuSubTrigger.vue" +export { default as DropdownMenuTrigger } from "./DropdownMenuTrigger.vue" +export { DropdownMenuPortal } from "reka-ui" diff --git a/apps/frontend-vike/src/components/ui/input/Input.vue b/apps/frontend-vike/src/components/ui/input/Input.vue new file mode 100644 index 0000000..e5135c1 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/input/Input.vue @@ -0,0 +1,33 @@ +<script setup lang="ts"> +import type { HTMLAttributes } from "vue" +import { useVModel } from "@vueuse/core" +import { cn } from "@/lib/utils" + +const props = defineProps<{ + defaultValue?: string | number + modelValue?: string | number + class?: HTMLAttributes["class"] +}>() + +const emits = defineEmits<{ + (e: "update:modelValue", payload: string | number): void +}>() + +const modelValue = useVModel(props, "modelValue", emits, { + passive: true, + defaultValue: props.defaultValue, +}) +</script> + +<template> + <input + v-model="modelValue" + data-slot="input" + :class="cn( + 'file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm', + 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]', + 'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive', + props.class, + )" + > +</template> diff --git a/apps/frontend-vike/src/components/ui/input/index.ts b/apps/frontend-vike/src/components/ui/input/index.ts new file mode 100644 index 0000000..9976b86 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/input/index.ts @@ -0,0 +1 @@ +export { default as Input } from "./Input.vue" diff --git a/apps/frontend-vike/src/components/ui/separator/Separator.vue b/apps/frontend-vike/src/components/ui/separator/Separator.vue new file mode 100644 index 0000000..78d60ec --- /dev/null +++ b/apps/frontend-vike/src/components/ui/separator/Separator.vue @@ -0,0 +1,29 @@ +<script setup lang="ts"> +import type { SeparatorProps } from "reka-ui" +import type { HTMLAttributes } from "vue" +import { reactiveOmit } from "@vueuse/core" +import { Separator } from "reka-ui" +import { cn } from "@/lib/utils" + +const props = withDefaults(defineProps< + SeparatorProps & { class?: HTMLAttributes["class"] } +>(), { + orientation: "horizontal", + decorative: true, +}) + +const delegatedProps = reactiveOmit(props, "class") +</script> + +<template> + <Separator + data-slot="separator" + v-bind="delegatedProps" + :class=" + cn( + 'bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px', + props.class, + ) + " + /> +</template> diff --git a/apps/frontend-vike/src/components/ui/separator/index.ts b/apps/frontend-vike/src/components/ui/separator/index.ts new file mode 100644 index 0000000..4407287 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/separator/index.ts @@ -0,0 +1 @@ +export { default as Separator } from "./Separator.vue" diff --git a/apps/frontend-vike/src/components/ui/sheet/Sheet.vue b/apps/frontend-vike/src/components/ui/sheet/Sheet.vue new file mode 100644 index 0000000..8522f84 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sheet/Sheet.vue @@ -0,0 +1,19 @@ +<script setup lang="ts"> +import type { DialogRootEmits, DialogRootProps } from "reka-ui" +import { DialogRoot, useForwardPropsEmits } from "reka-ui" + +const props = defineProps<DialogRootProps>() +const emits = defineEmits<DialogRootEmits>() + +const forwarded = useForwardPropsEmits(props, emits) +</script> + +<template> + <DialogRoot + v-slot="slotProps" + data-slot="sheet" + v-bind="forwarded" + > + <slot v-bind="slotProps" /> + </DialogRoot> +</template> diff --git a/apps/frontend-vike/src/components/ui/sheet/SheetClose.vue b/apps/frontend-vike/src/components/ui/sheet/SheetClose.vue new file mode 100644 index 0000000..39a942c --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sheet/SheetClose.vue @@ -0,0 +1,15 @@ +<script setup lang="ts"> +import type { DialogCloseProps } from "reka-ui" +import { DialogClose } from "reka-ui" + +const props = defineProps<DialogCloseProps>() +</script> + +<template> + <DialogClose + data-slot="sheet-close" + v-bind="props" + > + <slot /> + </DialogClose> +</template> diff --git a/apps/frontend-vike/src/components/ui/sheet/SheetContent.vue b/apps/frontend-vike/src/components/ui/sheet/SheetContent.vue new file mode 100644 index 0000000..9a8ad6c --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sheet/SheetContent.vue @@ -0,0 +1,62 @@ +<script setup lang="ts"> +import type { DialogContentEmits, DialogContentProps } from "reka-ui" +import type { HTMLAttributes } from "vue" +import { reactiveOmit } from "@vueuse/core" +import { PhX } from '@phosphor-icons/vue' +import { + DialogClose, + DialogContent, + DialogPortal, + useForwardPropsEmits, +} from "reka-ui" +import { cn } from "@/lib/utils" +import SheetOverlay from "./SheetOverlay.vue" + +interface SheetContentProps extends DialogContentProps { + class?: HTMLAttributes["class"] + side?: "top" | "right" | "bottom" | "left" +} + +defineOptions({ + inheritAttrs: false, +}) + +const props = withDefaults(defineProps<SheetContentProps>(), { + side: "right", +}) +const emits = defineEmits<DialogContentEmits>() + +const delegatedProps = reactiveOmit(props, "class", "side") + +const forwarded = useForwardPropsEmits(delegatedProps, emits) +</script> + +<template> + <DialogPortal> + <SheetOverlay /> + <DialogContent + data-slot="sheet-content" + :class="cn( + 'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500', + side === 'right' + && 'data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm', + side === 'left' + && 'data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm', + side === 'top' + && 'data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b', + side === 'bottom' + && 'data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t', + props.class)" + v-bind="{ ...$attrs, ...forwarded }" + > + <slot /> + + <DialogClose + class="ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none" + > + <PhX class="size-4" /> + <span class="sr-only">Close</span> + </DialogClose> + </DialogContent> + </DialogPortal> +</template> diff --git a/apps/frontend-vike/src/components/ui/sheet/SheetDescription.vue b/apps/frontend-vike/src/components/ui/sheet/SheetDescription.vue new file mode 100644 index 0000000..6c8ba0a --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sheet/SheetDescription.vue @@ -0,0 +1,21 @@ +<script setup lang="ts"> +import type { DialogDescriptionProps } from "reka-ui" +import type { HTMLAttributes } from "vue" +import { reactiveOmit } from "@vueuse/core" +import { DialogDescription } from "reka-ui" +import { cn } from "@/lib/utils" + +const props = defineProps<DialogDescriptionProps & { class?: HTMLAttributes["class"] }>() + +const delegatedProps = reactiveOmit(props, "class") +</script> + +<template> + <DialogDescription + data-slot="sheet-description" + :class="cn('text-muted-foreground text-sm', props.class)" + v-bind="delegatedProps" + > + <slot /> + </DialogDescription> +</template> diff --git a/apps/frontend-vike/src/components/ui/sheet/SheetFooter.vue b/apps/frontend-vike/src/components/ui/sheet/SheetFooter.vue new file mode 100644 index 0000000..5fcf751 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sheet/SheetFooter.vue @@ -0,0 +1,16 @@ +<script setup lang="ts"> +import type { HTMLAttributes } from "vue" +import { cn } from "@/lib/utils" + +const props = defineProps<{ class?: HTMLAttributes["class"] }>() +</script> + +<template> + <div + data-slot="sheet-footer" + :class="cn('mt-auto flex flex-col gap-2 p-4', props.class) + " + > + <slot /> + </div> +</template> diff --git a/apps/frontend-vike/src/components/ui/sheet/SheetHeader.vue b/apps/frontend-vike/src/components/ui/sheet/SheetHeader.vue new file mode 100644 index 0000000..b6305ab --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sheet/SheetHeader.vue @@ -0,0 +1,15 @@ +<script setup lang="ts"> +import type { HTMLAttributes } from "vue" +import { cn } from "@/lib/utils" + +const props = defineProps<{ class?: HTMLAttributes["class"] }>() +</script> + +<template> + <div + data-slot="sheet-header" + :class="cn('flex flex-col gap-1.5 p-4', props.class)" + > + <slot /> + </div> +</template> diff --git a/apps/frontend-vike/src/components/ui/sheet/SheetOverlay.vue b/apps/frontend-vike/src/components/ui/sheet/SheetOverlay.vue new file mode 100644 index 0000000..220452a --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sheet/SheetOverlay.vue @@ -0,0 +1,21 @@ +<script setup lang="ts"> +import type { DialogOverlayProps } from "reka-ui" +import type { HTMLAttributes } from "vue" +import { reactiveOmit } from "@vueuse/core" +import { DialogOverlay } from "reka-ui" +import { cn } from "@/lib/utils" + +const props = defineProps<DialogOverlayProps & { class?: HTMLAttributes["class"] }>() + +const delegatedProps = reactiveOmit(props, "class") +</script> + +<template> + <DialogOverlay + data-slot="sheet-overlay" + :class="cn('data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/80', props.class)" + v-bind="delegatedProps" + > + <slot /> + </DialogOverlay> +</template> diff --git a/apps/frontend-vike/src/components/ui/sheet/SheetTitle.vue b/apps/frontend-vike/src/components/ui/sheet/SheetTitle.vue new file mode 100644 index 0000000..889ae54 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sheet/SheetTitle.vue @@ -0,0 +1,21 @@ +<script setup lang="ts"> +import type { DialogTitleProps } from "reka-ui" +import type { HTMLAttributes } from "vue" +import { reactiveOmit } from "@vueuse/core" +import { DialogTitle } from "reka-ui" +import { cn } from "@/lib/utils" + +const props = defineProps<DialogTitleProps & { class?: HTMLAttributes["class"] }>() + +const delegatedProps = reactiveOmit(props, "class") +</script> + +<template> + <DialogTitle + data-slot="sheet-title" + :class="cn('text-foreground font-semibold', props.class)" + v-bind="delegatedProps" + > + <slot /> + </DialogTitle> +</template> diff --git a/apps/frontend-vike/src/components/ui/sheet/SheetTrigger.vue b/apps/frontend-vike/src/components/ui/sheet/SheetTrigger.vue new file mode 100644 index 0000000..41b121d --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sheet/SheetTrigger.vue @@ -0,0 +1,15 @@ +<script setup lang="ts"> +import type { DialogTriggerProps } from "reka-ui" +import { DialogTrigger } from "reka-ui" + +const props = defineProps<DialogTriggerProps>() +</script> + +<template> + <DialogTrigger + data-slot="sheet-trigger" + v-bind="props" + > + <slot /> + </DialogTrigger> +</template> diff --git a/apps/frontend-vike/src/components/ui/sheet/index.ts b/apps/frontend-vike/src/components/ui/sheet/index.ts new file mode 100644 index 0000000..7c70e5d --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sheet/index.ts @@ -0,0 +1,8 @@ +export { default as Sheet } from "./Sheet.vue" +export { default as SheetClose } from "./SheetClose.vue" +export { default as SheetContent } from "./SheetContent.vue" +export { default as SheetDescription } from "./SheetDescription.vue" +export { default as SheetFooter } from "./SheetFooter.vue" +export { default as SheetHeader } from "./SheetHeader.vue" +export { default as SheetTitle } from "./SheetTitle.vue" +export { default as SheetTrigger } from "./SheetTrigger.vue" diff --git a/apps/frontend-vike/src/components/ui/sidebar/Sidebar.vue b/apps/frontend-vike/src/components/ui/sidebar/Sidebar.vue new file mode 100644 index 0000000..b4699f8 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sidebar/Sidebar.vue @@ -0,0 +1,96 @@ +<script setup lang="ts"> +import type { SidebarProps } from "." +import { cn } from "@/lib/utils" +import { Sheet, SheetContent } from '@/components/ui/sheet' +import SheetDescription from '@/components/ui/sheet/SheetDescription.vue' +import SheetHeader from '@/components/ui/sheet/SheetHeader.vue' +import SheetTitle from '@/components/ui/sheet/SheetTitle.vue' +import { SIDEBAR_WIDTH_MOBILE, useSidebar } from "./utils" + +defineOptions({ + inheritAttrs: false, +}) + +const props = withDefaults(defineProps<SidebarProps>(), { + side: "left", + variant: "sidebar", + collapsible: "offcanvas", +}) + +const { isMobile, state, openMobile, setOpenMobile } = useSidebar() +</script> + +<template> + <div + v-if="collapsible === 'none'" + data-slot="sidebar" + :class="cn('bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col', props.class)" + v-bind="$attrs" + > + <slot /> + </div> + + <Sheet v-else-if="isMobile" :open="openMobile" v-bind="$attrs" @update:open="setOpenMobile"> + <SheetContent + data-sidebar="sidebar" + data-slot="sidebar" + data-mobile="true" + :side="side" + class="bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden" + :style="{ + '--sidebar-width': SIDEBAR_WIDTH_MOBILE, + }" + > + <SheetHeader class="sr-only"> + <SheetTitle>Sidebar</SheetTitle> + <SheetDescription>Displays the mobile sidebar.</SheetDescription> + </SheetHeader> + <div class="flex h-full w-full flex-col"> + <slot /> + </div> + </SheetContent> + </Sheet> + + <div + v-else + class="group peer text-sidebar-foreground hidden md:block" + data-slot="sidebar" + :data-state="state" + :data-collapsible="state === 'collapsed' ? collapsible : ''" + :data-variant="variant" + :data-side="side" + > + <!-- This is what handles the sidebar gap on desktop --> + <div + :class="cn( + 'relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear', + 'group-data-[collapsible=offcanvas]:w-0', + 'group-data-[side=right]:rotate-180', + variant === 'floating' || variant === 'inset' + ? 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]' + : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon)', + )" + /> + <div + :class="cn( + 'fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex', + side === 'left' + ? 'left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]' + : 'right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]', + // Adjust the padding for floating and inset variants. + variant === 'floating' || variant === 'inset' + ? 'p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]' + : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l', + props.class, + )" + v-bind="$attrs" + > + <div + data-sidebar="sidebar" + class="bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm" + > + <slot /> + </div> + </div> + </div> +</template> diff --git a/apps/frontend-vike/src/components/ui/sidebar/SidebarContent.vue b/apps/frontend-vike/src/components/ui/sidebar/SidebarContent.vue new file mode 100644 index 0000000..bb6d9f1 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sidebar/SidebarContent.vue @@ -0,0 +1,18 @@ +<script setup lang="ts"> +import type { HTMLAttributes } from "vue" +import { cn } from "@/lib/utils" + +const props = defineProps<{ + class?: HTMLAttributes["class"] +}>() +</script> + +<template> + <div + data-slot="sidebar-content" + data-sidebar="content" + :class="cn('flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden', props.class)" + > + <slot /> + </div> +</template> diff --git a/apps/frontend-vike/src/components/ui/sidebar/SidebarFooter.vue b/apps/frontend-vike/src/components/ui/sidebar/SidebarFooter.vue new file mode 100644 index 0000000..20dd72f --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sidebar/SidebarFooter.vue @@ -0,0 +1,18 @@ +<script setup lang="ts"> +import type { HTMLAttributes } from "vue" +import { cn } from "@/lib/utils" + +const props = defineProps<{ + class?: HTMLAttributes["class"] +}>() +</script> + +<template> + <div + data-slot="sidebar-footer" + data-sidebar="footer" + :class="cn('flex flex-col gap-2 p-2', props.class)" + > + <slot /> + </div> +</template> diff --git a/apps/frontend-vike/src/components/ui/sidebar/SidebarGroup.vue b/apps/frontend-vike/src/components/ui/sidebar/SidebarGroup.vue new file mode 100644 index 0000000..fbb4887 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sidebar/SidebarGroup.vue @@ -0,0 +1,18 @@ +<script setup lang="ts"> +import type { HTMLAttributes } from "vue" +import { cn } from "@/lib/utils" + +const props = defineProps<{ + class?: HTMLAttributes["class"] +}>() +</script> + +<template> + <div + data-slot="sidebar-group" + data-sidebar="group" + :class="cn('relative flex w-full min-w-0 flex-col p-2', props.class)" + > + <slot /> + </div> +</template> diff --git a/apps/frontend-vike/src/components/ui/sidebar/SidebarGroupAction.vue b/apps/frontend-vike/src/components/ui/sidebar/SidebarGroupAction.vue new file mode 100644 index 0000000..f5fa5eb --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sidebar/SidebarGroupAction.vue @@ -0,0 +1,27 @@ +<script setup lang="ts"> +import type { PrimitiveProps } from "reka-ui" +import type { HTMLAttributes } from "vue" +import { Primitive } from "reka-ui" +import { cn } from "@/lib/utils" + +const props = defineProps<PrimitiveProps & { + class?: HTMLAttributes["class"] +}>() +</script> + +<template> + <Primitive + data-slot="sidebar-group-action" + data-sidebar="group-action" + :as="as" + :as-child="asChild" + :class="cn( + 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0', + 'after:absolute after:-inset-2 md:after:hidden', + 'group-data-[collapsible=icon]:hidden', + props.class, + )" + > + <slot /> + </Primitive> +</template> diff --git a/apps/frontend-vike/src/components/ui/sidebar/SidebarGroupContent.vue b/apps/frontend-vike/src/components/ui/sidebar/SidebarGroupContent.vue new file mode 100644 index 0000000..06e1a92 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sidebar/SidebarGroupContent.vue @@ -0,0 +1,18 @@ +<script setup lang="ts"> +import type { HTMLAttributes } from "vue" +import { cn } from "@/lib/utils" + +const props = defineProps<{ + class?: HTMLAttributes["class"] +}>() +</script> + +<template> + <div + data-slot="sidebar-group-content" + data-sidebar="group-content" + :class="cn('w-full text-sm', props.class)" + > + <slot /> + </div> +</template> diff --git a/apps/frontend-vike/src/components/ui/sidebar/SidebarGroupLabel.vue b/apps/frontend-vike/src/components/ui/sidebar/SidebarGroupLabel.vue new file mode 100644 index 0000000..f5da130 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sidebar/SidebarGroupLabel.vue @@ -0,0 +1,25 @@ +<script setup lang="ts"> +import type { PrimitiveProps } from "reka-ui" +import type { HTMLAttributes } from "vue" +import { Primitive } from "reka-ui" +import { cn } from "@/lib/utils" + +const props = defineProps<PrimitiveProps & { + class?: HTMLAttributes["class"] +}>() +</script> + +<template> + <Primitive + data-slot="sidebar-group-label" + data-sidebar="group-label" + :as="as" + :as-child="asChild" + :class="cn( + 'text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0', + 'group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0', + props.class)" + > + <slot /> + </Primitive> +</template> diff --git a/apps/frontend-vike/src/components/ui/sidebar/SidebarHeader.vue b/apps/frontend-vike/src/components/ui/sidebar/SidebarHeader.vue new file mode 100644 index 0000000..79cf883 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sidebar/SidebarHeader.vue @@ -0,0 +1,18 @@ +<script setup lang="ts"> +import type { HTMLAttributes } from "vue" +import { cn } from "@/lib/utils" + +const props = defineProps<{ + class?: HTMLAttributes["class"] +}>() +</script> + +<template> + <div + data-slot="sidebar-header" + data-sidebar="header" + :class="cn('flex flex-col gap-2 p-2', props.class)" + > + <slot /> + </div> +</template> diff --git a/apps/frontend-vike/src/components/ui/sidebar/SidebarInput.vue b/apps/frontend-vike/src/components/ui/sidebar/SidebarInput.vue new file mode 100644 index 0000000..3afc5da --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sidebar/SidebarInput.vue @@ -0,0 +1,22 @@ +<script setup lang="ts"> +import type { HTMLAttributes } from "vue" +import { cn } from "@/lib/utils" +import { Input } from '@/components/ui/input' + +const props = defineProps<{ + class?: HTMLAttributes["class"] +}>() +</script> + +<template> + <Input + data-slot="sidebar-input" + data-sidebar="input" + :class="cn( + 'bg-background h-8 w-full shadow-none', + props.class, + )" + > + <slot /> + </Input> +</template> diff --git a/apps/frontend-vike/src/components/ui/sidebar/SidebarInset.vue b/apps/frontend-vike/src/components/ui/sidebar/SidebarInset.vue new file mode 100644 index 0000000..f46b43a --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sidebar/SidebarInset.vue @@ -0,0 +1,21 @@ +<script setup lang="ts"> +import type { HTMLAttributes } from "vue" +import { cn } from "@/lib/utils" + +const props = defineProps<{ + class?: HTMLAttributes["class"] +}>() +</script> + +<template> + <main + data-slot="sidebar-inset" + :class="cn( + 'bg-background relative flex w-full flex-1 flex-col', + 'md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2', + props.class, + )" + > + <slot /> + </main> +</template> diff --git a/apps/frontend-vike/src/components/ui/sidebar/SidebarMenu.vue b/apps/frontend-vike/src/components/ui/sidebar/SidebarMenu.vue new file mode 100644 index 0000000..e1dd39e --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sidebar/SidebarMenu.vue @@ -0,0 +1,18 @@ +<script setup lang="ts"> +import type { HTMLAttributes } from "vue" +import { cn } from "@/lib/utils" + +const props = defineProps<{ + class?: HTMLAttributes["class"] +}>() +</script> + +<template> + <ul + data-slot="sidebar-menu" + data-sidebar="menu" + :class="cn('flex w-full min-w-0 flex-col gap-1', props.class)" + > + <slot /> + </ul> +</template> diff --git a/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuAction.vue b/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuAction.vue new file mode 100644 index 0000000..bdffdb7 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuAction.vue @@ -0,0 +1,35 @@ +<script setup lang="ts"> +import type { PrimitiveProps } from "reka-ui" +import type { HTMLAttributes } from "vue" +import { Primitive } from "reka-ui" +import { cn } from "@/lib/utils" + +const props = withDefaults(defineProps<PrimitiveProps & { + showOnHover?: boolean + class?: HTMLAttributes["class"] +}>(), { + as: "button", +}) +</script> + +<template> + <Primitive + data-slot="sidebar-menu-action" + data-sidebar="menu-action" + :class="cn( + 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0', + 'after:absolute after:-inset-2 md:after:hidden', + 'peer-data-[size=sm]/menu-button:top-1', + 'peer-data-[size=default]/menu-button:top-1.5', + 'peer-data-[size=lg]/menu-button:top-2.5', + 'group-data-[collapsible=icon]:hidden', + showOnHover + && 'peer-data-[active=true]/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0', + props.class, + )" + :as="as" + :as-child="asChild" + > + <slot /> + </Primitive> +</template> diff --git a/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuBadge.vue b/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuBadge.vue new file mode 100644 index 0000000..4321618 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuBadge.vue @@ -0,0 +1,26 @@ +<script setup lang="ts"> +import type { HTMLAttributes } from "vue" +import { cn } from "@/lib/utils" + +const props = defineProps<{ + class?: HTMLAttributes["class"] +}>() +</script> + +<template> + <div + data-slot="sidebar-menu-badge" + data-sidebar="menu-badge" + :class="cn( + 'text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none', + 'peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground', + 'peer-data-[size=sm]/menu-button:top-1', + 'peer-data-[size=default]/menu-button:top-1.5', + 'peer-data-[size=lg]/menu-button:top-2.5', + 'group-data-[collapsible=icon]:hidden', + props.class, + )" + > + <slot /> + </div> +</template> diff --git a/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuButton.vue b/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuButton.vue new file mode 100644 index 0000000..502d395 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuButton.vue @@ -0,0 +1,48 @@ +<script setup lang="ts"> +import type { Component } from "vue" +import type { SidebarMenuButtonProps } from "./SidebarMenuButtonChild.vue" +import { reactiveOmit } from "@vueuse/core" +import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip' +import SidebarMenuButtonChild from "./SidebarMenuButtonChild.vue" +import { useSidebar } from "./utils" + +defineOptions({ + inheritAttrs: false, +}) + +const props = withDefaults(defineProps<SidebarMenuButtonProps & { + tooltip?: string | Component +}>(), { + as: "button", + variant: "default", + size: "default", +}) + +const { isMobile, state } = useSidebar() + +const delegatedProps = reactiveOmit(props, "tooltip") +</script> + +<template> + <SidebarMenuButtonChild v-if="!tooltip" v-bind="{ ...delegatedProps, ...$attrs }"> + <slot /> + </SidebarMenuButtonChild> + + <Tooltip v-else> + <TooltipTrigger as-child> + <SidebarMenuButtonChild v-bind="{ ...delegatedProps, ...$attrs }"> + <slot /> + </SidebarMenuButtonChild> + </TooltipTrigger> + <TooltipContent + side="right" + align="center" + :hidden="state !== 'collapsed' || isMobile" + > + <template v-if="typeof tooltip === 'string'"> + {{ tooltip }} + </template> + <component :is="tooltip" v-else /> + </TooltipContent> + </Tooltip> +</template> diff --git a/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuButtonChild.vue b/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuButtonChild.vue new file mode 100644 index 0000000..4b4ca3b --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuButtonChild.vue @@ -0,0 +1,36 @@ +<script setup lang="ts"> +import type { PrimitiveProps } from "reka-ui" +import type { HTMLAttributes } from "vue" +import type { SidebarMenuButtonVariants } from "." +import { Primitive } from "reka-ui" +import { cn } from "@/lib/utils" +import { sidebarMenuButtonVariants } from "." + +export interface SidebarMenuButtonProps extends PrimitiveProps { + variant?: SidebarMenuButtonVariants["variant"] + size?: SidebarMenuButtonVariants["size"] + isActive?: boolean + class?: HTMLAttributes["class"] +} + +const props = withDefaults(defineProps<SidebarMenuButtonProps>(), { + as: "button", + variant: "default", + size: "default", +}) +</script> + +<template> + <Primitive + data-slot="sidebar-menu-button" + data-sidebar="menu-button" + :data-size="size" + :data-active="isActive" + :class="cn(sidebarMenuButtonVariants({ variant, size }), props.class)" + :as="as" + :as-child="asChild" + v-bind="$attrs" + > + <slot /> + </Primitive> +</template> diff --git a/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuItem.vue b/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuItem.vue new file mode 100644 index 0000000..e2fda5b --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuItem.vue @@ -0,0 +1,18 @@ +<script setup lang="ts"> +import type { HTMLAttributes } from "vue" +import { cn } from "@/lib/utils" + +const props = defineProps<{ + class?: HTMLAttributes["class"] +}>() +</script> + +<template> + <li + data-slot="sidebar-menu-item" + data-sidebar="menu-item" + :class="cn('group/menu-item relative', props.class)" + > + <slot /> + </li> +</template> diff --git a/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuSkeleton.vue b/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuSkeleton.vue new file mode 100644 index 0000000..b33812c --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuSkeleton.vue @@ -0,0 +1,35 @@ +<script setup lang="ts"> +import type { HTMLAttributes } from "vue" +import { computed } from "vue" +import { cn } from "@/lib/utils" +import { Skeleton } from '@/components/ui/skeleton' + +const props = defineProps<{ + showIcon?: boolean + class?: HTMLAttributes["class"] +}>() + +const width = computed(() => { + return `${Math.floor(Math.random() * 40) + 50}%` +}) +</script> + +<template> + <div + data-slot="sidebar-menu-skeleton" + data-sidebar="menu-skeleton" + :class="cn('flex h-8 items-center gap-2 rounded-md px-2', props.class)" + > + <Skeleton + v-if="showIcon" + class="size-4 rounded-md" + data-sidebar="menu-skeleton-icon" + /> + + <Skeleton + class="h-4 max-w-(--skeleton-width) flex-1" + data-sidebar="menu-skeleton-text" + :style="{ '--skeleton-width': width }" + /> + </div> +</template> diff --git a/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuSub.vue b/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuSub.vue new file mode 100644 index 0000000..81c2dab --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuSub.vue @@ -0,0 +1,22 @@ +<script setup lang="ts"> +import type { HTMLAttributes } from "vue" +import { cn } from "@/lib/utils" + +const props = defineProps<{ + class?: HTMLAttributes["class"] +}>() +</script> + +<template> + <ul + data-slot="sidebar-menu-sub" + data-sidebar="menu-badge" + :class="cn( + 'border-sidebar-border mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l px-2.5 py-0.5', + 'group-data-[collapsible=icon]:hidden', + props.class, + )" + > + <slot /> + </ul> +</template> diff --git a/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuSubButton.vue b/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuSubButton.vue new file mode 100644 index 0000000..d00a38e --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuSubButton.vue @@ -0,0 +1,36 @@ +<script setup lang="ts"> +import type { PrimitiveProps } from "reka-ui" +import type { HTMLAttributes } from "vue" +import { Primitive } from "reka-ui" +import { cn } from "@/lib/utils" + +const props = withDefaults(defineProps<PrimitiveProps & { + size?: "sm" | "md" + isActive?: boolean + class?: HTMLAttributes["class"] +}>(), { + as: "a", + size: "md", +}) +</script> + +<template> + <Primitive + data-slot="sidebar-menu-sub-button" + data-sidebar="menu-sub-button" + :as="as" + :as-child="asChild" + :data-size="size" + :data-active="isActive ? '' : undefined" + :class="cn( + 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0', + 'data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground', + size === 'sm' && 'text-xs', + size === 'md' && 'text-sm', + 'group-data-[collapsible=icon]:hidden', + props.class, + )" + > + <slot /> + </Primitive> +</template> diff --git a/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuSubItem.vue b/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuSubItem.vue new file mode 100644 index 0000000..d4374f6 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sidebar/SidebarMenuSubItem.vue @@ -0,0 +1,18 @@ +<script setup lang="ts"> +import type { HTMLAttributes } from "vue" +import { cn } from "@/lib/utils" + +const props = defineProps<{ + class?: HTMLAttributes["class"] +}>() +</script> + +<template> + <li + data-slot="sidebar-menu-sub-item" + data-sidebar="menu-sub-item" + :class="cn('group/menu-sub-item relative', props.class)" + > + <slot /> + </li> +</template> diff --git a/apps/frontend-vike/src/components/ui/sidebar/SidebarProvider.vue b/apps/frontend-vike/src/components/ui/sidebar/SidebarProvider.vue new file mode 100644 index 0000000..04ed975 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sidebar/SidebarProvider.vue @@ -0,0 +1,82 @@ +<script setup lang="ts"> +import type { HTMLAttributes, Ref } from "vue" +import { defaultDocument, useEventListener, useMediaQuery, useVModel } from "@vueuse/core" +import { TooltipProvider } from "reka-ui" +import { computed, ref } from "vue" +import { cn } from "@/lib/utils" +import { provideSidebarContext, SIDEBAR_COOKIE_MAX_AGE, SIDEBAR_COOKIE_NAME, SIDEBAR_KEYBOARD_SHORTCUT, SIDEBAR_WIDTH, SIDEBAR_WIDTH_ICON } from "./utils" + +const props = withDefaults(defineProps<{ + defaultOpen?: boolean + open?: boolean + class?: HTMLAttributes["class"] +}>(), { + defaultOpen: !defaultDocument?.cookie.includes(`${SIDEBAR_COOKIE_NAME}=false`), + open: undefined, +}) + +const emits = defineEmits<{ + "update:open": [open: boolean] +}>() + +const isMobile = useMediaQuery("(max-width: 768px)") +const openMobile = ref(false) + +const open = useVModel(props, "open", emits, { + defaultValue: props.defaultOpen ?? false, + passive: (props.open === undefined) as false, +}) as Ref<boolean> + +function setOpen(value: boolean) { + open.value = value // emits('update:open', value) + + // This sets the cookie to keep the sidebar state. + document.cookie = `${SIDEBAR_COOKIE_NAME}=${open.value}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}` +} + +function setOpenMobile(value: boolean) { + openMobile.value = value +} + +// Helper to toggle the sidebar. +function toggleSidebar() { + return isMobile.value ? setOpenMobile(!openMobile.value) : setOpen(!open.value) +} + +useEventListener("keydown", (event: KeyboardEvent) => { + if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) { + event.preventDefault() + toggleSidebar() + } +}) + +// We add a state so that we can do data-state="expanded" or "collapsed". +// This makes it easier to style the sidebar with Tailwind classes. +const state = computed(() => open.value ? "expanded" : "collapsed") + +provideSidebarContext({ + state, + open, + setOpen, + isMobile, + openMobile, + setOpenMobile, + toggleSidebar, +}) +</script> + +<template> + <TooltipProvider :delay-duration="0"> + <div + data-slot="sidebar-wrapper" + :style="{ + '--sidebar-width': SIDEBAR_WIDTH, + '--sidebar-width-icon': SIDEBAR_WIDTH_ICON, + }" + :class="cn('group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full', props.class)" + v-bind="$attrs" + > + <slot /> + </div> + </TooltipProvider> +</template> diff --git a/apps/frontend-vike/src/components/ui/sidebar/SidebarRail.vue b/apps/frontend-vike/src/components/ui/sidebar/SidebarRail.vue new file mode 100644 index 0000000..1045a55 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sidebar/SidebarRail.vue @@ -0,0 +1,33 @@ +<script setup lang="ts"> +import type { HTMLAttributes } from "vue" +import { cn } from "@/lib/utils" +import { useSidebar } from "./utils" + +const props = defineProps<{ + class?: HTMLAttributes["class"] +}>() + +const { toggleSidebar } = useSidebar() +</script> + +<template> + <button + data-sidebar="rail" + data-slot="sidebar-rail" + aria-label="Toggle Sidebar" + :tabindex="-1" + title="Toggle Sidebar" + :class="cn( + 'hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex', + 'in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize', + '[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize', + 'hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full', + '[[data-side=left][data-collapsible=offcanvas]_&]:-right-2', + '[[data-side=right][data-collapsible=offcanvas]_&]:-left-2', + props.class, + )" + @click="toggleSidebar" + > + <slot /> + </button> +</template> diff --git a/apps/frontend-vike/src/components/ui/sidebar/SidebarSeparator.vue b/apps/frontend-vike/src/components/ui/sidebar/SidebarSeparator.vue new file mode 100644 index 0000000..91170bc --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sidebar/SidebarSeparator.vue @@ -0,0 +1,19 @@ +<script setup lang="ts"> +import type { HTMLAttributes } from "vue" +import { cn } from "@/lib/utils" +import { Separator } from '@/components/ui/separator' + +const props = defineProps<{ + class?: HTMLAttributes["class"] +}>() +</script> + +<template> + <Separator + data-slot="sidebar-separator" + data-sidebar="separator" + :class="cn('bg-sidebar-border mx-2 w-auto', props.class)" + > + <slot /> + </Separator> +</template> diff --git a/apps/frontend-vike/src/components/ui/sidebar/SidebarTrigger.vue b/apps/frontend-vike/src/components/ui/sidebar/SidebarTrigger.vue new file mode 100644 index 0000000..304d912 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sidebar/SidebarTrigger.vue @@ -0,0 +1,27 @@ +<script setup lang="ts"> +import type { HTMLAttributes } from "vue" +import { PhSidebarSimple } from '@phosphor-icons/vue' +import { cn } from "@/lib/utils" +import { Button } from '@/components/ui/button' +import { useSidebar } from "./utils" + +const props = defineProps<{ + class?: HTMLAttributes["class"] +}>() + +const { toggleSidebar } = useSidebar() +</script> + +<template> + <Button + data-sidebar="trigger" + data-slot="sidebar-trigger" + variant="ghost" + size="icon" + :class="cn('h-7 w-7', props.class)" + @click="toggleSidebar" + > + <PhSidebarSimple /> + <span class="sr-only">Toggle Sidebar</span> + </Button> +</template> diff --git a/apps/frontend-vike/src/components/ui/sidebar/index.ts b/apps/frontend-vike/src/components/ui/sidebar/index.ts new file mode 100644 index 0000000..ef718a9 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sidebar/index.ts @@ -0,0 +1,60 @@ +import type { VariantProps } from "class-variance-authority" +import type { HTMLAttributes } from "vue" +import { cva } from "class-variance-authority" + +export interface SidebarProps { + side?: "left" | "right" + variant?: "sidebar" | "floating" | "inset" + collapsible?: "offcanvas" | "icon" | "none" + class?: HTMLAttributes["class"] +} + +export { default as Sidebar } from "./Sidebar.vue" +export { default as SidebarContent } from "./SidebarContent.vue" +export { default as SidebarFooter } from "./SidebarFooter.vue" +export { default as SidebarGroup } from "./SidebarGroup.vue" +export { default as SidebarGroupAction } from "./SidebarGroupAction.vue" +export { default as SidebarGroupContent } from "./SidebarGroupContent.vue" +export { default as SidebarGroupLabel } from "./SidebarGroupLabel.vue" +export { default as SidebarHeader } from "./SidebarHeader.vue" +export { default as SidebarInput } from "./SidebarInput.vue" +export { default as SidebarInset } from "./SidebarInset.vue" +export { default as SidebarMenu } from "./SidebarMenu.vue" +export { default as SidebarMenuAction } from "./SidebarMenuAction.vue" +export { default as SidebarMenuBadge } from "./SidebarMenuBadge.vue" +export { default as SidebarMenuButton } from "./SidebarMenuButton.vue" +export { default as SidebarMenuItem } from "./SidebarMenuItem.vue" +export { default as SidebarMenuSkeleton } from "./SidebarMenuSkeleton.vue" +export { default as SidebarMenuSub } from "./SidebarMenuSub.vue" +export { default as SidebarMenuSubButton } from "./SidebarMenuSubButton.vue" +export { default as SidebarMenuSubItem } from "./SidebarMenuSubItem.vue" +export { default as SidebarProvider } from "./SidebarProvider.vue" +export { default as SidebarRail } from "./SidebarRail.vue" +export { default as SidebarSeparator } from "./SidebarSeparator.vue" +export { default as SidebarTrigger } from "./SidebarTrigger.vue" + +export { useSidebar } from "./utils" + +export const sidebarMenuButtonVariants = cva( + "peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0", + { + variants: { + variant: { + default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground", + outline: + "bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]", + }, + size: { + default: "h-8 text-sm", + sm: "h-7 text-xs", + lg: "h-12 text-sm group-data-[collapsible=icon]:p-0!", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + }, +) + +export type SidebarMenuButtonVariants = VariantProps<typeof sidebarMenuButtonVariants> diff --git a/apps/frontend-vike/src/components/ui/sidebar/utils.ts b/apps/frontend-vike/src/components/ui/sidebar/utils.ts new file mode 100644 index 0000000..6e57eeb --- /dev/null +++ b/apps/frontend-vike/src/components/ui/sidebar/utils.ts @@ -0,0 +1,19 @@ +import type { ComputedRef, Ref } from "vue" +import { createContext } from "reka-ui" + +export const SIDEBAR_COOKIE_NAME = "sidebar_state" +export const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7 +export const SIDEBAR_WIDTH = "16rem" +export const SIDEBAR_WIDTH_MOBILE = "18rem" +export const SIDEBAR_WIDTH_ICON = "3rem" +export const SIDEBAR_KEYBOARD_SHORTCUT = "b" + +export const [useSidebar, provideSidebarContext] = createContext<{ + state: ComputedRef<"expanded" | "collapsed"> + open: Ref<boolean> + setOpen: (value: boolean) => void + isMobile: Ref<boolean> + openMobile: Ref<boolean> + setOpenMobile: (value: boolean) => void + toggleSidebar: () => void +}>("Sidebar") diff --git a/apps/frontend-vike/src/components/ui/skeleton/Skeleton.vue b/apps/frontend-vike/src/components/ui/skeleton/Skeleton.vue new file mode 100644 index 0000000..0dadcef --- /dev/null +++ b/apps/frontend-vike/src/components/ui/skeleton/Skeleton.vue @@ -0,0 +1,17 @@ +<script setup lang="ts"> +import type { HTMLAttributes } from "vue" +import { cn } from "@/lib/utils" + +interface SkeletonProps { + class?: HTMLAttributes["class"] +} + +const props = defineProps<SkeletonProps>() +</script> + +<template> + <div + data-slot="skeleton" + :class="cn('animate-pulse rounded-md bg-primary/10', props.class)" + /> +</template> diff --git a/apps/frontend-vike/src/components/ui/skeleton/index.ts b/apps/frontend-vike/src/components/ui/skeleton/index.ts new file mode 100644 index 0000000..e5ce72c --- /dev/null +++ b/apps/frontend-vike/src/components/ui/skeleton/index.ts @@ -0,0 +1 @@ +export { default as Skeleton } from "./Skeleton.vue" diff --git a/apps/frontend-vike/src/components/ui/tooltip/Tooltip.vue b/apps/frontend-vike/src/components/ui/tooltip/Tooltip.vue new file mode 100644 index 0000000..2a393d6 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/tooltip/Tooltip.vue @@ -0,0 +1,19 @@ +<script setup lang="ts"> +import type { TooltipRootEmits, TooltipRootProps } from "reka-ui" +import { TooltipRoot, useForwardPropsEmits } from "reka-ui" + +const props = defineProps<TooltipRootProps>() +const emits = defineEmits<TooltipRootEmits>() + +const forwarded = useForwardPropsEmits(props, emits) +</script> + +<template> + <TooltipRoot + v-slot="slotProps" + data-slot="tooltip" + v-bind="forwarded" + > + <slot v-bind="slotProps" /> + </TooltipRoot> +</template> diff --git a/apps/frontend-vike/src/components/ui/tooltip/TooltipContent.vue b/apps/frontend-vike/src/components/ui/tooltip/TooltipContent.vue new file mode 100644 index 0000000..c5d2df9 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/tooltip/TooltipContent.vue @@ -0,0 +1,34 @@ +<script setup lang="ts"> +import type { TooltipContentEmits, TooltipContentProps } from "reka-ui" +import type { HTMLAttributes } from "vue" +import { reactiveOmit } from "@vueuse/core" +import { TooltipArrow, TooltipContent, TooltipPortal, useForwardPropsEmits } from "reka-ui" +import { cn } from "@/lib/utils" + +defineOptions({ + inheritAttrs: false, +}) + +const props = withDefaults(defineProps<TooltipContentProps & { class?: HTMLAttributes["class"] }>(), { + sideOffset: 4, +}) + +const emits = defineEmits<TooltipContentEmits>() + +const delegatedProps = reactiveOmit(props, "class") +const forwarded = useForwardPropsEmits(delegatedProps, emits) +</script> + +<template> + <TooltipPortal> + <TooltipContent + data-slot="tooltip-content" + v-bind="{ ...forwarded, ...$attrs }" + :class="cn('bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit rounded-md px-3 py-1.5 text-xs text-balance', props.class)" + > + <slot /> + + <TooltipArrow class="bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]" /> + </TooltipContent> + </TooltipPortal> +</template> diff --git a/apps/frontend-vike/src/components/ui/tooltip/TooltipProvider.vue b/apps/frontend-vike/src/components/ui/tooltip/TooltipProvider.vue new file mode 100644 index 0000000..395927d --- /dev/null +++ b/apps/frontend-vike/src/components/ui/tooltip/TooltipProvider.vue @@ -0,0 +1,14 @@ +<script setup lang="ts"> +import type { TooltipProviderProps } from "reka-ui" +import { TooltipProvider } from "reka-ui" + +const props = withDefaults(defineProps<TooltipProviderProps>(), { + delayDuration: 0, +}) +</script> + +<template> + <TooltipProvider v-bind="props"> + <slot /> + </TooltipProvider> +</template> diff --git a/apps/frontend-vike/src/components/ui/tooltip/TooltipTrigger.vue b/apps/frontend-vike/src/components/ui/tooltip/TooltipTrigger.vue new file mode 100644 index 0000000..3332950 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/tooltip/TooltipTrigger.vue @@ -0,0 +1,15 @@ +<script setup lang="ts"> +import type { TooltipTriggerProps } from "reka-ui" +import { TooltipTrigger } from "reka-ui" + +const props = defineProps<TooltipTriggerProps>() +</script> + +<template> + <TooltipTrigger + data-slot="tooltip-trigger" + v-bind="props" + > + <slot /> + </TooltipTrigger> +</template> diff --git a/apps/frontend-vike/src/components/ui/tooltip/index.ts b/apps/frontend-vike/src/components/ui/tooltip/index.ts new file mode 100644 index 0000000..8f8d514 --- /dev/null +++ b/apps/frontend-vike/src/components/ui/tooltip/index.ts @@ -0,0 +1,4 @@ +export { default as Tooltip } from "./Tooltip.vue" +export { default as TooltipContent } from "./TooltipContent.vue" +export { default as TooltipProvider } from "./TooltipProvider.vue" +export { default as TooltipTrigger } from "./TooltipTrigger.vue" diff --git a/apps/frontend-vike/src/lib/utils.ts b/apps/frontend-vike/src/lib/utils.ts new file mode 100644 index 0000000..abba253 --- /dev/null +++ b/apps/frontend-vike/src/lib/utils.ts @@ -0,0 +1,7 @@ +import type { ClassValue } from 'clsx' +import { clsx } from 'clsx' +import { twMerge } from 'tailwind-merge' + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/apps/frontend-vike/src/pages/+Head.vue b/apps/frontend-vike/src/pages/+Head.vue new file mode 100644 index 0000000..bd38745 --- /dev/null +++ b/apps/frontend-vike/src/pages/+Head.vue @@ -0,0 +1,46 @@ +<!-- https://vike.dev/Head --> + +<template> + <link rel="icon" :href="logoUrl" /> +</template> + +<script setup lang="ts"> +import '@/assets/css/tailwind.css'; +import logoUrl from "../assets/logo.svg"; +import { useHead } from "@unhead/vue"; +import { usePageContext } from "vike-vue/usePageContext"; + +type PageContextWithSettings = ReturnType<typeof usePageContext> & { + settings: { + env: { + UMAMI_HOST?: string; + UMAMI_WEBSITE_ID?: string; + }; + }; +}; + +const { UMAMI_HOST, UMAMI_WEBSITE_ID } = (usePageContext() as PageContextWithSettings).settings.env; +const umamiHost = UMAMI_HOST?.replace(/\/$/, ""); +const umamiScripts = + umamiHost && UMAMI_WEBSITE_ID + ? [ + { + defer: true, + src: `${umamiHost}/script.js`, + "data-website-id": UMAMI_WEBSITE_ID, + }, + { + defer: true, + src: `${umamiHost}/recorder.js`, + "data-website-id": UMAMI_WEBSITE_ID, + "data-sample-rate": "0.15", + "data-mask-level": "moderate", + "data-max-duration": "300000", + }, + ] + : []; + +useHead({ + script: [...umamiScripts], +}); +</script> diff --git a/apps/frontend-vike/src/pages/+Layout.vue b/apps/frontend-vike/src/pages/+Layout.vue new file mode 100644 index 0000000..e8ada9d --- /dev/null +++ b/apps/frontend-vike/src/pages/+Layout.vue @@ -0,0 +1,55 @@ +<!-- https://vike.dev/Layout --> + +<script setup lang="ts"> +import AppSidebarSkeleton from '@/components/sidebar/AppSidebarSkeleton.vue'; +import { + Breadcrumb, + BreadcrumbItem, + BreadcrumbLink, + BreadcrumbList, + BreadcrumbPage, + BreadcrumbSeparator, +} from '@/components/ui/breadcrumb'; +import { Separator } from '@/components/ui/separator'; +import { SidebarInset, SidebarProvider, SidebarTrigger } from '@/components/ui/sidebar'; +import { defineAsyncComponent } from 'vue'; + +const AppSidebar = defineAsyncComponent( + () => import('@/components/sidebar/AppSidebar.vue'), +); +</script> + +<template> + <SidebarProvider> + <Suspense> + <AppSidebar /> + <template #fallback> + <AppSidebarSkeleton /> + </template> + </Suspense> + <SidebarInset> + <header + class="flex h-16 shrink-0 items-center gap-2 transition-[width,height] ease-linear group-has-data-[collapsible=icon]/sidebar-wrapper:h-12" + > + <div class="flex items-center gap-2 px-4"> + <SidebarTrigger class="-ml-1" /> + <Separator orientation="vertical" class="mr-2 data-[orientation=vertical]:h-4" /> + <Breadcrumb> + <BreadcrumbList> + <BreadcrumbItem class="hidden md:block"> + <BreadcrumbLink href="#"> ToDo </BreadcrumbLink> + </BreadcrumbItem> + <BreadcrumbSeparator class="hidden md:block" /> + <BreadcrumbItem> + <BreadcrumbPage>いい感じにする</BreadcrumbPage> + </BreadcrumbItem> + </BreadcrumbList> + </Breadcrumb> + </div> + </header> + <div class="flex flex-1 flex-col gap-4 p-4 pt-0"> + <slot /> + </div> + </SidebarInset> + </SidebarProvider> +</template> diff --git a/apps/frontend-vike/src/pages/+config.ts b/apps/frontend-vike/src/pages/+config.ts new file mode 100644 index 0000000..4cde6c4 --- /dev/null +++ b/apps/frontend-vike/src/pages/+config.ts @@ -0,0 +1,16 @@ +import type { Config } from "vike/types"; +import vikeVue from "vike-vue/config"; + +// Default config (can be overridden by pages) +// https://vike.dev/config + +const config: Config = { + // https://vike.dev/head-tags + extends: [vikeVue], + title: "My Vike App", + description: "Demo showcasing Vike", + lang: "ja", + +}; + +export default config; diff --git a/apps/frontend-vike/src/pages/+headHtmlEnd.ts b/apps/frontend-vike/src/pages/+headHtmlEnd.ts new file mode 100644 index 0000000..8667cd3 --- /dev/null +++ b/apps/frontend-vike/src/pages/+headHtmlEnd.ts @@ -0,0 +1,16 @@ +export { headHtmlEnd }; + +import type { UseHeadInput, VueHeadClient } from "@unhead/vue"; +import type { SSRHeadPayload } from "@unhead/vue/server"; +import type { PageContextServer } from "vike/types"; + +type PageContextWithUnhead = PageContextServer & { + _unhead?: VueHeadClient<UseHeadInput, SSRHeadPayload>; +}; + +function headHtmlEnd(pageContext: PageContextServer) { + const head = (pageContext as PageContextWithUnhead)._unhead; + if (!head) return ""; + + return head.render().headTags; +} diff --git a/apps/frontend-vike/src/pages/+onCreateApp.ts b/apps/frontend-vike/src/pages/+onCreateApp.ts new file mode 100644 index 0000000..8bfc985 --- /dev/null +++ b/apps/frontend-vike/src/pages/+onCreateApp.ts @@ -0,0 +1,29 @@ +// https://vike.dev/onCreateApp +export { onCreateApp }; + +import type { PageContext } from "vike/types"; +import type { VueHeadClient } from "@unhead/vue"; + +type PageContextWithUnhead = PageContext & { + _unhead?: VueHeadClient; +}; + +async function onCreateApp(pageContext: PageContext) { + const pageContextWithUnhead = pageContext as PageContextWithUnhead; + const app = pageContextWithUnhead.app!; //pageContext.app! + + pageContextWithUnhead._unhead ??= await createUnhead(); + app.use(pageContextWithUnhead._unhead); +} + +async function createUnhead(): Promise<VueHeadClient> { + if (import.meta.env.SSR) { + const { createHead } = await import("@unhead/vue/server"); + + // Vike already renders the default charset, viewport, and lang tags. + return createHead({ disableDefaults: true }); + } + + const { createHead } = await import("@unhead/vue/client"); + return createHead(); +} diff --git a/apps/frontend-vike/src/pages/+onPageTransitionEnd.ts b/apps/frontend-vike/src/pages/+onPageTransitionEnd.ts new file mode 100644 index 0000000..b27ef43 --- /dev/null +++ b/apps/frontend-vike/src/pages/+onPageTransitionEnd.ts @@ -0,0 +1,4 @@ +export async function onPageTransitionEnd() { + console.log("Page transition end"); + document.body.classList.remove("page-transition"); +} diff --git a/apps/frontend-vike/src/pages/+onPageTransitionStart.ts b/apps/frontend-vike/src/pages/+onPageTransitionStart.ts new file mode 100644 index 0000000..a2a4817 --- /dev/null +++ b/apps/frontend-vike/src/pages/+onPageTransitionStart.ts @@ -0,0 +1,9 @@ +// https://vike.dev/onPageTransitionStart + +import type { PageContextClient } from "vike/types"; + +export async function onPageTransitionStart(pageContext: Partial<PageContextClient>) { + console.log("Page transition start"); + console.log("pageContext.isBackwardNavigation", pageContext.isBackwardNavigation); + document.body.classList.add("page-transition"); +} diff --git a/apps/frontend-vike/src/pages/_error/+Page.vue b/apps/frontend-vike/src/pages/_error/+Page.vue new file mode 100644 index 0000000..46c3363 --- /dev/null +++ b/apps/frontend-vike/src/pages/_error/+Page.vue @@ -0,0 +1,15 @@ +<template> + <h1>{{ heading }}</h1> + <p>{{ abortReason }}</p> +</template> + +<script lang="ts" setup> +import { usePageContext } from "vike-vue/usePageContext"; + +const pageContext = usePageContext(); +let { is404, abortReason } = pageContext; +if (!abortReason) { + abortReason = is404 ? "This page could not be found." : "Something went wrong."; +} +const heading = is404 ? "Page Not Found" : "Internal Error"; +</script> diff --git a/apps/frontend-vike/src/pages/index/+Page.vue b/apps/frontend-vike/src/pages/index/+Page.vue new file mode 100644 index 0000000..289f30e --- /dev/null +++ b/apps/frontend-vike/src/pages/index/+Page.vue @@ -0,0 +1,12 @@ +<template> + <h1>My Vike app</h1> + <p>This page is:</p> + <ul> + <li>Rendered to HTML.</li> + <li>Interactive. <Counter /></li> + </ul> +</template> + +<script setup lang="ts"> +import Counter from "../../components/Counter.vue"; +</script> diff --git a/apps/frontend-vike/src/pages/sentry/+Page.vue b/apps/frontend-vike/src/pages/sentry/+Page.vue new file mode 100644 index 0000000..8f50655 --- /dev/null +++ b/apps/frontend-vike/src/pages/sentry/+Page.vue @@ -0,0 +1,33 @@ +<template> + <div> + <h1>Sentry Test Page</h1> + <div v-if="!isSentryClientInitialized" style="color: red"> + Sentry Client is not initialized! Vite Mode: {{ isProdMode ? "PROD" : "DEV" }} + </div> + + <div> + <button @click="throwError">Throw Javascript Error</button> + </div> + </div> +</template> + +<script> +import * as Sentry from "@sentry/vue"; +export default { + data() { + return { + isSentryClientInitialized: false, + isProdMode: import.meta.env.PROD, + }; + }, + mounted() { + this.isSentryClientInitialized = !!Sentry.getClient(); + }, + methods: { + throwError() { + const mode = import.meta.env.DEV ? "DEV Mode" : "PROD Mode"; + throw new Error(`This is a Vue SENTRY Browser Vue Test! [${mode}]`); + }, + }, +}; +</script> diff --git a/apps/frontend-vike/src/pages/star-wars/@id/+Page.vue b/apps/frontend-vike/src/pages/star-wars/@id/+Page.vue new file mode 100644 index 0000000..3981ae0 --- /dev/null +++ b/apps/frontend-vike/src/pages/star-wars/@id/+Page.vue @@ -0,0 +1,15 @@ +<template> + <h1>{{ movie.title }}</h1> + Release Date: {{ movie.release_date }} + <br /> + Director: {{ movie.director }} + <br /> + Producer: {{ movie.producer }} +</template> + +<script lang="ts" setup> +import { useData } from "vike-vue/useData"; +import type { Data } from "./+data.js"; + +const { movie } = useData<Data>(); +</script> diff --git a/apps/frontend-vike/src/pages/star-wars/@id/+data.ts b/apps/frontend-vike/src/pages/star-wars/@id/+data.ts new file mode 100644 index 0000000..43cef71 --- /dev/null +++ b/apps/frontend-vike/src/pages/star-wars/@id/+data.ts @@ -0,0 +1,31 @@ +// https://vike.dev/data + +import type { PageContextServer } from "vike/types"; +import { useConfig } from "vike-vue/useConfig"; +import type { MovieDetails } from "../types.js"; + +export type Data = Awaited<ReturnType<typeof data>>; + +export async function data(pageContext: PageContextServer) { + // https://vike.dev/useConfig + const config = useConfig(); + + const response = await fetch(`https://brillout.github.io/star-wars/api/films/${pageContext.routeParams.id}.json`); + let movie = (await response.json()) as MovieDetails; + + config({ + // Set <title> + title: movie.title, + }); + + // We remove data we don't need because the data is passed to + // the client; we should minimize what is sent over the network. + movie = minimize(movie); + + return { movie }; +} + +function minimize(movie: MovieDetails): MovieDetails { + const { id, title, release_date, director, producer } = movie; + return { id, title, release_date, director, producer }; +} diff --git a/apps/frontend-vike/src/pages/star-wars/index/+Page.vue b/apps/frontend-vike/src/pages/star-wars/index/+Page.vue new file mode 100644 index 0000000..22977c1 --- /dev/null +++ b/apps/frontend-vike/src/pages/star-wars/index/+Page.vue @@ -0,0 +1,16 @@ +<template> + <h1>Star Wars Movies</h1> + <ol> + <li v-for="item in movies" :key="item.id"> + <a :href="'/star-wars/' + item.id">{{ item.title }}</a> ({{ item.release_date }}) + </li> + </ol> + <p>Source: <a href="https://brillout.github.io/star-wars">brillout.github.io/star-wars</a>.</p> +</template> + +<script lang="ts" setup> +import { useData } from "vike-vue/useData"; +import type { Data } from "./+data.js"; + +const { movies } = useData<Data>(); +</script> diff --git a/apps/frontend-vike/src/pages/star-wars/index/+data.ts b/apps/frontend-vike/src/pages/star-wars/index/+data.ts new file mode 100644 index 0000000..1ee8727 --- /dev/null +++ b/apps/frontend-vike/src/pages/star-wars/index/+data.ts @@ -0,0 +1,32 @@ +// https://vike.dev/data + +import { useConfig } from "vike-vue/useConfig"; +import type { Movie, MovieDetails } from "../types.js"; + +export type Data = Awaited<ReturnType<typeof data>>; + +export async function data() { + // https://vike.dev/useConfig + const config = useConfig(); + + const response = await fetch("https://brillout.github.io/star-wars/api/films.json"); + const moviesData = (await response.json()) as MovieDetails[]; + + config({ + // Set <title> + title: `${moviesData.length} Star Wars Movies`, + }); + + // We remove data we don't need because the data is passed to the client; we should + // minimize what is sent over the network. + const movies = minimize(moviesData); + + return { movies }; +} + +function minimize(movies: MovieDetails[]): Movie[] { + return movies.map((movie) => { + const { title, release_date, id } = movie; + return { title, release_date, id }; + }); +} diff --git a/apps/frontend-vike/src/pages/star-wars/types.ts b/apps/frontend-vike/src/pages/star-wars/types.ts new file mode 100644 index 0000000..ffccdf5 --- /dev/null +++ b/apps/frontend-vike/src/pages/star-wars/types.ts @@ -0,0 +1,10 @@ +export type Movie = { + id: string; + title: string; + release_date: string; +}; + +export type MovieDetails = Movie & { + director: string; + producer: string; +}; diff --git a/apps/frontend-vike/src/pages/todo/+Page.vue b/apps/frontend-vike/src/pages/todo/+Page.vue new file mode 100644 index 0000000..8ba7cbb --- /dev/null +++ b/apps/frontend-vike/src/pages/todo/+Page.vue @@ -0,0 +1,10 @@ +<template> + <div> + <h1>To-do List</h1> + <TodoList /> + </div> +</template> + +<script lang="ts" setup> +import TodoList from "./TodoList.vue"; +</script> diff --git a/apps/frontend-vike/src/pages/todo/+data.ts b/apps/frontend-vike/src/pages/todo/+data.ts new file mode 100644 index 0000000..67ce907 --- /dev/null +++ b/apps/frontend-vike/src/pages/todo/+data.ts @@ -0,0 +1,12 @@ +// https://vike.dev/data + +import type { PageContextServer } from "vike/types"; + +export type Data = Awaited<ReturnType<typeof data>>; + +export async function data(_pageContext: PageContextServer) { + // NOTE: This +data hook is only for demonstration — it doesn't actually retrieve data from a database. + // Go to https://vike.dev/new and select a database to scaffold an app with a persisted to-do list. + const todoItemsInitial = [{ text: "Buy milk" }, { text: "Buy strawberries" }]; + return { todoItemsInitial }; +} diff --git a/apps/frontend-vike/src/pages/todo/TodoList.vue b/apps/frontend-vike/src/pages/todo/TodoList.vue new file mode 100644 index 0000000..4caf192 --- /dev/null +++ b/apps/frontend-vike/src/pages/todo/TodoList.vue @@ -0,0 +1,48 @@ +<template> + <ul> + <li v-for="(item, index) in todoItems" :key="index"> + {{ item.text }} + </li> + <li> + <form @submit.prevent="submitNewTodo()"> + <input + v-model="newTodo" + type="text" + class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 w-full sm:w-auto p-2 mr-1 mb-1" + /> + + <button + type="submit" + class="text-white bg-blue-700 hover:bg-blue-800 focus:ring-2 focus:outline-hidden focus:ring-blue-300 font-medium rounded-lg text-sm w-full sm:w-auto p-2" + > + Add to-do + </button> + </form> + </li> + </ul> +</template> + +<script lang="ts" setup> +import type { Data } from "./+data"; +import { useData } from "vike-vue/useData"; +import { ref } from "vue"; + +const { todoItemsInitial } = useData<Data>(); +const todoItems = ref<{ text: string }[]>(todoItemsInitial); +const newTodo = ref(""); + +const submitNewTodo = async () => { + const text = newTodo.value; + todoItems.value.push({ text }); + newTodo.value = ""; + + const response = await fetch("/api/todo/create", { + method: "POST", + body: JSON.stringify({ text }), + headers: { + "Content-Type": "application/json", + }, + }); + await response.blob(); +}; +</script> diff --git a/apps/frontend-vike/stories/Button.stories.ts b/apps/frontend-vike/stories/Button.stories.ts new file mode 100644 index 0000000..4737d97 --- /dev/null +++ b/apps/frontend-vike/stories/Button.stories.ts @@ -0,0 +1,53 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite'; + +import { fn } from 'storybook/test'; + +import Button from './Button.vue'; + +// More on how to set up stories at: https://storybook.js.org/docs/writing-stories +const meta = { + title: 'Example/Button', + component: Button, + // This component will have an automatically generated docsPage entry: https://storybook.js.org/docs/writing-docs/autodocs + tags: ['autodocs'], + argTypes: { + size: { control: 'select', options: ['small', 'medium', 'large'] }, + backgroundColor: { control: 'color' }, + }, + args: { + primary: false, + // Use `fn` to spy on the onClick arg, which will appear in the actions panel once invoked: https://storybook.js.org/docs/essentials/actions#story-args + onClick: fn(), + }, +} satisfies Meta<typeof Button>; + +export default meta; +type Story = StoryObj<typeof meta>; + +export const Primary: Story = { + args: { + primary: true, + label: 'Button', + }, +}; + +export const Secondary: Story = { + args: { + primary: false, + label: 'Button', + }, +}; + +export const Large: Story = { + args: { + label: 'Button', + size: 'large', + }, +}; + +export const Small: Story = { + args: { + label: 'Button', + size: 'small', + }, +}; diff --git a/apps/frontend-vike/stories/Button.vue b/apps/frontend-vike/stories/Button.vue new file mode 100644 index 0000000..338b97c --- /dev/null +++ b/apps/frontend-vike/stories/Button.vue @@ -0,0 +1,50 @@ +<template> + <button type="button" :class="classes" @click="onClick" :style="style">{{ label }}</button> +</template> + +<script lang="ts" setup> +import { computed } from 'vue'; + +import './button.css'; + +const props = withDefaults( + defineProps<{ + /** + * The label of the button + */ + label: string; + /** + * primary or secondary button + */ + primary?: boolean; + /** + * size of the button + */ + size?: 'small' | 'medium' | 'large'; + /** + * background color of the button + */ + backgroundColor?: string; + }>(), + { primary: false } +); + +const emit = defineEmits<{ + (e: 'click', id: number): void; +}>(); + +const classes = computed(() => ({ + 'storybook-button': true, + 'storybook-button--primary': props.primary, + 'storybook-button--secondary': !props.primary, + [`storybook-button--${props.size || 'medium'}`]: true, +})); + +const style = computed(() => ({ + backgroundColor: props.backgroundColor, +})); + +const onClick = () => { + emit('click', 1); +}; +</script> diff --git a/apps/frontend-vike/stories/Configure.mdx b/apps/frontend-vike/stories/Configure.mdx new file mode 100644 index 0000000..27e2d10 --- /dev/null +++ b/apps/frontend-vike/stories/Configure.mdx @@ -0,0 +1,388 @@ +import { Meta } from "@storybook/addon-docs/blocks"; + +import Github from "./assets/github.svg"; +import Discord from "./assets/discord.svg"; +import Youtube from "./assets/youtube.svg"; +import Tutorials from "./assets/tutorials.svg"; +import Styling from "./assets/styling.png"; +import Context from "./assets/context.png"; +import Assets from "./assets/assets.png"; +import Docs from "./assets/docs.png"; +import Share from "./assets/share.png"; +import FigmaPlugin from "./assets/figma-plugin.png"; +import Testing from "./assets/testing.png"; +import Accessibility from "./assets/accessibility.png"; +import Theming from "./assets/theming.png"; +import AddonLibrary from "./assets/addon-library.png"; + +export const RightArrow = () => <svg + viewBox="0 0 14 14" + width="8px" + height="14px" + style={{ + marginLeft: '4px', + display: 'inline-block', + shapeRendering: 'inherit', + verticalAlign: 'middle', + fill: 'currentColor', + 'path fill': 'currentColor' + }} +> + <path d="m11.1 7.35-5.5 5.5a.5.5 0 0 1-.7-.7L10.04 7 4.9 1.85a.5.5 0 1 1 .7-.7l5.5 5.5c.2.2.2.5 0 .7Z" /> +</svg> + +<Meta title="Configure your project" /> + +<div className="sb-container"> + <div className='sb-section-title'> + # Configure your project + + Because Storybook works separately from your app, you'll need to configure it for your specific stack and setup. Below, explore guides for configuring Storybook with popular frameworks and tools. If you get stuck, learn how you can ask for help from our community. + </div> + <div className="sb-section"> + <div className="sb-section-item"> + <img + src={Styling} + alt="A wall of logos representing different styling technologies" + /> + <h4 className="sb-section-item-heading">Add styling and CSS</h4> + <p className="sb-section-item-paragraph">Like with web applications, there are many ways to include CSS within Storybook. Learn more about setting up styling within Storybook.</p> + <a + className="sb-action-link" + href="https://storybook.js.org/docs/configure/styling-and-css/?renderer=vue3&ref=configure" + target="_blank" + >Learn more<RightArrow /></a> + </div> + <div className="sb-section-item"> + <img + src={Context} + alt="An abstraction representing the composition of data for a component" + /> + <h4 className="sb-section-item-heading">Provide context and mocking</h4> + <p className="sb-section-item-paragraph">Often when a story doesn't render, it's because your component is expecting a specific environment or context (like a theme provider) to be available.</p> + <a + className="sb-action-link" + href="https://storybook.js.org/docs/writing-stories/decorators/?renderer=vue3&ref=configure#context-for-mocking" + target="_blank" + >Learn more<RightArrow /></a> + </div> + <div className="sb-section-item"> + <img src={Assets} alt="A representation of typography and image assets" /> + <div> + <h4 className="sb-section-item-heading">Load assets and resources</h4> + <p className="sb-section-item-paragraph">To link static files (like fonts) to your projects and stories, use the + `staticDirs` configuration option to specify folders to load when + starting Storybook.</p> + <a + className="sb-action-link" + href="https://storybook.js.org/docs/configure/images-and-assets/?renderer=vue3&ref=configure" + target="_blank" + >Learn more<RightArrow /></a> + </div> + </div> + </div> +</div> +<div className="sb-container"> + <div className='sb-section-title'> + # Do more with Storybook + + Now that you know the basics, let's explore other parts of Storybook that will improve your experience. This list is just to get you started. You can customise Storybook in many ways to fit your needs. + </div> + + <div className="sb-section"> + <div className="sb-features-grid"> + <div className="sb-grid-item"> + <img src={Docs} alt="A screenshot showing the autodocs tag being set, pointing a docs page being generated" /> + <h4 className="sb-section-item-heading">Autodocs</h4> + <p className="sb-section-item-paragraph">Auto-generate living, + interactive reference documentation from your components and stories.</p> + <a + className="sb-action-link" + href="https://storybook.js.org/docs/writing-docs/autodocs/?renderer=vue3&ref=configure" + target="_blank" + >Learn more<RightArrow /></a> + </div> + <div className="sb-grid-item"> + <img src={Share} alt="A browser window showing a Storybook being published to a chromatic.com URL" /> + <h4 className="sb-section-item-heading">Publish to Chromatic</h4> + <p className="sb-section-item-paragraph">Publish your Storybook to review and collaborate with your entire team.</p> + <a + className="sb-action-link" + href="https://storybook.js.org/docs/sharing/publish-storybook/?renderer=vue3&ref=configure#publish-storybook-with-chromatic" + target="_blank" + >Learn more<RightArrow /></a> + </div> + <div className="sb-grid-item"> + <img src={FigmaPlugin} alt="Windows showing the Storybook plugin in Figma" /> + <h4 className="sb-section-item-heading">Figma Plugin</h4> + <p className="sb-section-item-paragraph">Embed your stories into Figma to cross-reference the design and live + implementation in one place.</p> + <a + className="sb-action-link" + href="https://storybook.js.org/docs/sharing/design-integrations/?renderer=vue3&ref=configure#embed-storybook-in-figma-with-the-plugin" + target="_blank" + >Learn more<RightArrow /></a> + </div> + <div className="sb-grid-item"> + <img src={Testing} alt="Screenshot of tests passing and failing" /> + <h4 className="sb-section-item-heading">Testing</h4> + <p className="sb-section-item-paragraph">Use stories to test a component in all its variations, no matter how + complex.</p> + <a + className="sb-action-link" + href="https://storybook.js.org/docs/writing-tests/?renderer=vue3&ref=configure" + target="_blank" + >Learn more<RightArrow /></a> + </div> + <div className="sb-grid-item"> + <img src={Accessibility} alt="Screenshot of accessibility tests passing and failing" /> + <h4 className="sb-section-item-heading">Accessibility</h4> + <p className="sb-section-item-paragraph">Automatically test your components for a11y issues as you develop.</p> + <a + className="sb-action-link" + href="https://storybook.js.org/docs/writing-tests/accessibility-testing/?renderer=vue3&ref=configure" + target="_blank" + >Learn more<RightArrow /></a> + </div> + <div className="sb-grid-item"> + <img src={Theming} alt="Screenshot of Storybook in light and dark mode" /> + <h4 className="sb-section-item-heading">Theming</h4> + <p className="sb-section-item-paragraph">Theme Storybook's UI to personalize it to your project.</p> + <a + className="sb-action-link" + href="https://storybook.js.org/docs/configure/theming/?renderer=vue3&ref=configure" + target="_blank" + >Learn more<RightArrow /></a> + </div> + </div> + </div> +</div> +<div className='sb-addon'> + <div className='sb-addon-text'> + <h4>Addons</h4> + <p className="sb-section-item-paragraph">Integrate your tools with Storybook to connect workflows.</p> + <a + className="sb-action-link" + href="https://storybook.js.org/addons/?ref=configure" + target="_blank" + >Discover all addons<RightArrow /></a> + </div> + <div className='sb-addon-img'> + <img src={AddonLibrary} alt="Integrate your tools with Storybook to connect workflows." /> + </div> +</div> + +<div className="sb-section sb-socials"> + <div className="sb-section-item"> + <img src={Github} alt="Github logo" className="sb-explore-image"/> + Join our contributors building the future of UI development. + + <a + className="sb-action-link" + href="https://github.com/storybookjs/storybook" + target="_blank" + >Star on GitHub<RightArrow /></a> + </div> + <div className="sb-section-item"> + <img src={Discord} alt="Discord logo" className="sb-explore-image"/> + <div> + Get support and chat with frontend developers. + + <a + className="sb-action-link" + href="https://discord.gg/storybook" + target="_blank" + >Join Discord server<RightArrow /></a> + </div> + </div> + <div className="sb-section-item"> + <img src={Youtube} alt="Youtube logo" className="sb-explore-image"/> + <div> + Watch tutorials, feature previews and interviews. + + <a + className="sb-action-link" + href="https://www.youtube.com/@chromaticui" + target="_blank" + >Watch on YouTube<RightArrow /></a> + </div> + </div> + <div className="sb-section-item"> + <img src={Tutorials} alt="A book" className="sb-explore-image"/> + <p>Follow guided walkthroughs on for key workflows.</p> + + <a + className="sb-action-link" + href="https://storybook.js.org/tutorials/?ref=configure" + target="_blank" + >Discover tutorials<RightArrow /></a> + </div> +</div> + +<style> + {` + .sb-container { + margin-bottom: 48px; + } + + .sb-section { + width: 100%; + display: flex; + flex-direction: row; + gap: 20px; + } + + img { + object-fit: cover; + } + + .sb-section-title { + margin-bottom: 32px; + } + + .sb-section a:not(h1 a, h2 a, h3 a) { + font-size: 14px; + } + + .sb-section-item, .sb-grid-item { + flex: 1; + display: flex; + flex-direction: column; + } + + .sb-section-item-heading { + padding-top: 20px !important; + padding-bottom: 5px !important; + margin: 0 !important; + } + .sb-section-item-paragraph { + margin: 0; + padding-bottom: 10px; + } + + .sb-action-link { + text-decoration: none; + } + + .sb-action-link:hover, .sb-action-link:focus { + text-decoration: underline; + text-decoration-thickness: 0.03125rem; + text-underline-offset: 0.11em; + } + + .sb-chevron { + margin-left: 5px; + } + + .sb-features-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + grid-gap: 32px 20px; + } + + .sb-socials { + display: grid; + grid-template-columns: repeat(4, 1fr); + } + + .sb-socials p { + margin-bottom: 10px; + } + + .sb-explore-image { + max-height: 32px; + align-self: flex-start; + } + + .sb-addon { + width: 100%; + display: flex; + align-items: center; + position: relative; + background-color: #EEF3F8; + border-radius: 5px; + border: 1px solid rgba(0, 0, 0, 0.05); + background: #EEF3F8; + height: 180px; + margin-bottom: 48px; + overflow: hidden; + } + + .sb-addon-text { + padding-left: 48px; + max-width: 240px; + } + + .sb-addon-text h4 { + padding-top: 0px; + } + + .sb-addon-img { + position: absolute; + left: 345px; + top: 0; + height: 100%; + width: 200%; + overflow: hidden; + } + + .sb-addon-img img { + width: 650px; + transform: rotate(-15deg); + margin-left: 40px; + margin-top: -72px; + box-shadow: 0 0 1px rgba(255, 255, 255, 0); + backface-visibility: hidden; + } + + @media screen and (max-width: 800px) { + .sb-addon-img { + left: 300px; + } + } + + @media screen and (max-width: 600px) { + .sb-section { + flex-direction: column; + } + + .sb-features-grid { + grid-template-columns: repeat(1, 1fr); + } + + .sb-socials { + grid-template-columns: repeat(2, 1fr); + } + + .sb-addon { + height: 280px; + align-items: flex-start; + padding-top: 32px; + overflow: hidden; + } + + .sb-addon-text { + padding-left: 24px; + } + + .sb-addon-img { + right: 0; + left: 0; + top: 130px; + bottom: 0; + overflow: hidden; + height: auto; + width: 124%; + } + + .sb-addon-img img { + width: 1200px; + transform: rotate(-12deg); + margin-left: 0; + margin-top: 48px; + margin-bottom: -40px; + margin-left: -24px; + } + } + `} +</style> diff --git a/apps/frontend-vike/stories/Header.stories.ts b/apps/frontend-vike/stories/Header.stories.ts new file mode 100644 index 0000000..47caa29 --- /dev/null +++ b/apps/frontend-vike/stories/Header.stories.ts @@ -0,0 +1,49 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite'; + +import { fn } from 'storybook/test'; + +import MyHeader from './Header.vue'; + +const meta = { + /* 👇 The title prop is optional. + * See https://storybook.js.org/docs/configure/#configure-story-loading + * to learn how to generate automatic titles + */ + title: 'Example/Header', + component: MyHeader, + render: (args: any) => ({ + components: { MyHeader }, + setup() { + return { args }; + }, + template: '<my-header :user="args.user" />', + }), + parameters: { + // More on how to position stories at: https://storybook.js.org/docs/configure/story-layout + layout: 'fullscreen', + }, + args: { + onLogin: fn(), + onLogout: fn(), + onCreateAccount: fn(), + }, + // This component will have an automatically generated docsPage entry: https://storybook.js.org/docs/writing-docs/autodocs + tags: ['autodocs'], +} satisfies Meta<typeof MyHeader>; + +export default meta; +type Story = StoryObj<typeof meta>; + +export const LoggedIn: Story = { + args: { + user: { + name: 'Jane Doe', + }, + }, +}; + +export const LoggedOut: Story = { + args: { + user: null, + }, +}; diff --git a/apps/frontend-vike/stories/Header.vue b/apps/frontend-vike/stories/Header.vue new file mode 100644 index 0000000..bade22d --- /dev/null +++ b/apps/frontend-vike/stories/Header.vue @@ -0,0 +1,53 @@ +<template> + <header> + <div class="storybook-header"> + <div> + <svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"> + <g fill="none" fill-rule="evenodd"> + <path + d="M10 0h12a10 10 0 0110 10v12a10 10 0 01-10 10H10A10 10 0 010 22V10A10 10 0 0110 0z" + fill="#FFF" + /> + <path + d="M5.3 10.6l10.4 6v11.1l-10.4-6v-11zm11.4-6.2l9.7 5.5-9.7 5.6V4.4z" + fill="#555AB9" + /> + <path + d="M27.2 10.6v11.2l-10.5 6V16.5l10.5-6zM15.7 4.4v11L6 10l9.7-5.5z" + fill="#91BAF8" + /> + </g> + </svg> + <h1>Acme</h1> + </div> + <div> + <span class="welcome" v-if="user" + >Welcome, <b>{{ user.name }}</b + >!</span + > + <my-button size="small" @click="$emit('logout')" label="Log out" v-if="user" /> + <my-button size="small" @click="$emit('login')" label="Log in" v-if="!user" /> + <my-button + primary + size="small" + @click="$emit('createAccount')" + label="Sign up" + v-if="!user" + /> + </div> + </div> + </header> +</template> + +<script lang="ts" setup> +import MyButton from './Button.vue'; +import './header.css'; + +defineProps<{ user: { name: string } | null }>(); + +defineEmits<{ + (event: 'createAccount'): void; + (event: 'login'): void; + (event: 'logout'): void; +}>(); +</script> diff --git a/apps/frontend-vike/stories/Page.stories.ts b/apps/frontend-vike/stories/Page.stories.ts new file mode 100644 index 0000000..ec3d248 --- /dev/null +++ b/apps/frontend-vike/stories/Page.stories.ts @@ -0,0 +1,39 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite'; + +import { expect, userEvent, within } from 'storybook/test'; + +import MyPage from './Page.vue'; + +const meta = { + title: 'Example/Page', + component: MyPage, + render: () => ({ + components: { MyPage }, + template: '<my-page />', + }), + parameters: { + // More on how to position stories at: https://storybook.js.org/docs/configure/story-layout + layout: 'fullscreen', + }, + // This component will have an automatically generated docsPage entry: https://storybook.js.org/docs/writing-docs/autodocs + tags: ['autodocs'], +} satisfies Meta<typeof MyPage>; + +export default meta; +type Story = StoryObj<typeof meta>; + +// More on component testing: https://storybook.js.org/docs/writing-tests/interaction-testing +export const LoggedIn: Story = { + play: async ({ canvasElement }: any) => { + const canvas = within(canvasElement); + const loginButton = canvas.getByRole('button', { name: /Log in/i }); + await expect(loginButton).toBeInTheDocument(); + await userEvent.click(loginButton); + await expect(loginButton).not.toBeInTheDocument(); + + const logoutButton = canvas.getByRole('button', { name: /Log out/i }); + await expect(logoutButton).toBeInTheDocument(); + }, +}; + +export const LoggedOut: Story = {}; diff --git a/apps/frontend-vike/stories/Page.vue b/apps/frontend-vike/stories/Page.vue new file mode 100644 index 0000000..85701a3 --- /dev/null +++ b/apps/frontend-vike/stories/Page.vue @@ -0,0 +1,73 @@ +<template> + <article> + <my-header :user="user" @login="onLogin" @logout="onLogout" @create-account="onCreateAccount" /> + + <section class="storybook-page"> + <h2>Pages in Storybook</h2> + <p> + We recommend building UIs with a + <a href="https://componentdriven.org" target="_blank" rel="noopener noreferrer"> + <strong>component-driven</strong> + </a> + process starting with atomic components and ending with pages. + </p> + <p> + Render pages with mock data. This makes it easy to build and review page states without + needing to navigate to them in your app. Here are some handy patterns for managing page data + in Storybook: + </p> + <ul> + <li> + Use a higher-level connected component. Storybook helps you compose such data from the + "args" of child component stories + </li> + <li> + Assemble data in the page component from your services. You can mock these services out + using Storybook. + </li> + </ul> + <p> + Get a guided tutorial on component-driven development at + <a href="https://storybook.js.org/tutorials/" target="_blank" rel="noopener noreferrer" + >Storybook tutorials</a + > + . Read more in the + <a href="https://storybook.js.org/docs" target="_blank" rel="noopener noreferrer">docs</a> + . + </p> + <div class="tip-wrapper"> + <span class="tip">Tip</span> + Adjust the width of the canvas with the + <svg width="10" height="10" viewBox="0 0 12 12" xmlns="http://www.w3.org/2000/svg"> + <g fill="none" fill-rule="evenodd"> + <path + d="M1.5 5.2h4.8c.3 0 .5.2.5.4v5.1c-.1.2-.3.3-.4.3H1.4a.5.5 0 01-.5-.4V5.7c0-.3.2-.5.5-.5zm0-2.1h6.9c.3 0 .5.2.5.4v7a.5.5 0 01-1 0V4H1.5a.5.5 0 010-1zm0-2.1h9c.3 0 .5.2.5.4v9.1a.5.5 0 01-1 0V2H1.5a.5.5 0 010-1zm4.3 5.2H2V10h3.8V6.2z" + id="a" + fill="#999" + /> + </g> + </svg> + Viewports addon in the toolbar + </div> + </section> + </article> +</template> + +<script lang="ts" setup> +import { ref } from 'vue'; + +import MyHeader from './Header.vue'; +import './page.css'; + +const user = ref<{ name: string } | null>(null); + +const onLogin = () => { + user.value = { name: 'Jane Doe' }; +}; +const onLogout = () => { + user.value = null; +}; +const onCreateAccount = () => { + user.value = { name: 'Jane Doe' }; +}; +</script> diff --git a/apps/frontend-vike/stories/assets/accessibility.png b/apps/frontend-vike/stories/assets/accessibility.png new file mode 100644 index 0000000..6ffe6fe Binary files /dev/null and b/apps/frontend-vike/stories/assets/accessibility.png differ diff --git a/apps/frontend-vike/stories/assets/accessibility.svg b/apps/frontend-vike/stories/assets/accessibility.svg new file mode 100644 index 0000000..107e93f --- /dev/null +++ b/apps/frontend-vike/stories/assets/accessibility.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="none" viewBox="0 0 48 48"><title>Accessibility \ No newline at end of file diff --git a/apps/frontend-vike/stories/assets/addon-library.png b/apps/frontend-vike/stories/assets/addon-library.png new file mode 100644 index 0000000..95deb38 Binary files /dev/null and b/apps/frontend-vike/stories/assets/addon-library.png differ diff --git a/apps/frontend-vike/stories/assets/assets.png b/apps/frontend-vike/stories/assets/assets.png new file mode 100644 index 0000000..cfba681 Binary files /dev/null and b/apps/frontend-vike/stories/assets/assets.png differ diff --git a/apps/frontend-vike/stories/assets/avif-test-image.avif b/apps/frontend-vike/stories/assets/avif-test-image.avif new file mode 100644 index 0000000..530709b Binary files /dev/null and b/apps/frontend-vike/stories/assets/avif-test-image.avif differ diff --git a/apps/frontend-vike/stories/assets/context.png b/apps/frontend-vike/stories/assets/context.png new file mode 100644 index 0000000..e5cd249 Binary files /dev/null and b/apps/frontend-vike/stories/assets/context.png differ diff --git a/apps/frontend-vike/stories/assets/discord.svg b/apps/frontend-vike/stories/assets/discord.svg new file mode 100644 index 0000000..d638958 --- /dev/null +++ b/apps/frontend-vike/stories/assets/discord.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/frontend-vike/stories/assets/docs.png b/apps/frontend-vike/stories/assets/docs.png new file mode 100644 index 0000000..a749629 Binary files /dev/null and b/apps/frontend-vike/stories/assets/docs.png differ diff --git a/apps/frontend-vike/stories/assets/figma-plugin.png b/apps/frontend-vike/stories/assets/figma-plugin.png new file mode 100644 index 0000000..8f79b08 Binary files /dev/null and b/apps/frontend-vike/stories/assets/figma-plugin.png differ diff --git a/apps/frontend-vike/stories/assets/github.svg b/apps/frontend-vike/stories/assets/github.svg new file mode 100644 index 0000000..dc51352 --- /dev/null +++ b/apps/frontend-vike/stories/assets/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/frontend-vike/stories/assets/share.png b/apps/frontend-vike/stories/assets/share.png new file mode 100644 index 0000000..8097a37 Binary files /dev/null and b/apps/frontend-vike/stories/assets/share.png differ diff --git a/apps/frontend-vike/stories/assets/styling.png b/apps/frontend-vike/stories/assets/styling.png new file mode 100644 index 0000000..d341e82 Binary files /dev/null and b/apps/frontend-vike/stories/assets/styling.png differ diff --git a/apps/frontend-vike/stories/assets/testing.png b/apps/frontend-vike/stories/assets/testing.png new file mode 100644 index 0000000..d4ac39a Binary files /dev/null and b/apps/frontend-vike/stories/assets/testing.png differ diff --git a/apps/frontend-vike/stories/assets/theming.png b/apps/frontend-vike/stories/assets/theming.png new file mode 100644 index 0000000..1535eb9 Binary files /dev/null and b/apps/frontend-vike/stories/assets/theming.png differ diff --git a/apps/frontend-vike/stories/assets/tutorials.svg b/apps/frontend-vike/stories/assets/tutorials.svg new file mode 100644 index 0000000..b492a9c --- /dev/null +++ b/apps/frontend-vike/stories/assets/tutorials.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/frontend-vike/stories/assets/youtube.svg b/apps/frontend-vike/stories/assets/youtube.svg new file mode 100644 index 0000000..a7515d7 --- /dev/null +++ b/apps/frontend-vike/stories/assets/youtube.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/frontend-vike/stories/button.css b/apps/frontend-vike/stories/button.css new file mode 100644 index 0000000..4e3620b --- /dev/null +++ b/apps/frontend-vike/stories/button.css @@ -0,0 +1,30 @@ +.storybook-button { + display: inline-block; + cursor: pointer; + border: 0; + border-radius: 3em; + font-weight: 700; + line-height: 1; + font-family: 'Nunito Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; +} +.storybook-button--primary { + background-color: #555ab9; + color: white; +} +.storybook-button--secondary { + box-shadow: rgba(0, 0, 0, 0.15) 0px 0px 0px 1px inset; + background-color: transparent; + color: #333; +} +.storybook-button--small { + padding: 10px 16px; + font-size: 12px; +} +.storybook-button--medium { + padding: 11px 20px; + font-size: 14px; +} +.storybook-button--large { + padding: 12px 24px; + font-size: 16px; +} diff --git a/apps/frontend-vike/stories/header.css b/apps/frontend-vike/stories/header.css new file mode 100644 index 0000000..5efd46c --- /dev/null +++ b/apps/frontend-vike/stories/header.css @@ -0,0 +1,32 @@ +.storybook-header { + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: 1px solid rgba(0, 0, 0, 0.1); + padding: 15px 20px; + font-family: 'Nunito Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; +} + +.storybook-header svg { + display: inline-block; + vertical-align: top; +} + +.storybook-header h1 { + display: inline-block; + vertical-align: top; + margin: 6px 0 6px 10px; + font-weight: 700; + font-size: 20px; + line-height: 1; +} + +.storybook-header button + button { + margin-left: 10px; +} + +.storybook-header .welcome { + margin-right: 10px; + color: #333; + font-size: 14px; +} diff --git a/apps/frontend-vike/stories/page.css b/apps/frontend-vike/stories/page.css new file mode 100644 index 0000000..77c81d2 --- /dev/null +++ b/apps/frontend-vike/stories/page.css @@ -0,0 +1,68 @@ +.storybook-page { + margin: 0 auto; + padding: 48px 20px; + max-width: 600px; + color: #333; + font-size: 14px; + line-height: 24px; + font-family: 'Nunito Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; +} + +.storybook-page h2 { + display: inline-block; + vertical-align: top; + margin: 0 0 4px; + font-weight: 700; + font-size: 32px; + line-height: 1; +} + +.storybook-page p { + margin: 1em 0; +} + +.storybook-page a { + color: inherit; +} + +.storybook-page ul { + margin: 1em 0; + padding-left: 30px; +} + +.storybook-page li { + margin-bottom: 8px; +} + +.storybook-page .tip { + display: inline-block; + vertical-align: top; + margin-right: 10px; + border-radius: 1em; + background: #e7fdd8; + padding: 4px 12px; + color: #357a14; + font-weight: 700; + font-size: 11px; + line-height: 12px; +} + +.storybook-page .tip-wrapper { + margin-top: 40px; + margin-bottom: 40px; + font-size: 13px; + line-height: 20px; +} + +.storybook-page .tip-wrapper svg { + display: inline-block; + vertical-align: top; + margin-top: 3px; + margin-right: 4px; + width: 12px; + height: 12px; +} + +.storybook-page .tip-wrapper svg path { + fill: #1ea7fd; +} diff --git a/apps/frontend-vike/tsconfig.json b/apps/frontend-vike/tsconfig.json new file mode 100644 index 0000000..84b628d --- /dev/null +++ b/apps/frontend-vike/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "strict": true, + "target": "ES2022", + "module": "ES2022", + "moduleResolution": "Bundler", + "lib": [ + "DOM", + "DOM.Iterable", + "ESNext" + ], + "types": [ + "vite/client" + ], + "noEmit": true, + "skipLibCheck": true, + "esModuleInterop": true, + "paths": { + "#/*": ["./server/*"], + "@/*": ["./src/*"], + "@/sentry.browser.config": ["./sentry.browser.config.ts"] + } + }, + "exclude": [ + "dist" + ] +} \ No newline at end of file diff --git a/apps/frontend-vike/vite.config.ts b/apps/frontend-vike/vite.config.ts new file mode 100644 index 0000000..9d5eea8 --- /dev/null +++ b/apps/frontend-vike/vite.config.ts @@ -0,0 +1,102 @@ +/// +import dotenv from 'dotenv'; +import vue from '@vitejs/plugin-vue'; +import tailwindcss from '@tailwindcss/vite'; +import { sentryVitePlugin } from '@sentry/vite-plugin'; +import { analyzer, unstableRolldownAdapter } from 'vite-bundle-analyzer' +/// + +import vike from 'vike/plugin'; +import { defineConfig } from 'vite-plus'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { storybookTest } from '@storybook/addon-vitest/vitest-plugin'; +import { playwright } from '@vitest/browser-playwright'; +const dirname = + typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)); + +dotenv.config({ path: path.resolve(dirname, '.env') }); + +const sentryEnabled = + process.env.NODE_ENV?.includes('prod') || + process.env.FORCE_ENABLE_IN_DEV === 'true'; + +// console.log('FORCE_ENABLE_IN_DEV: ', process.env.FORCE_ENABLE_IN_DEV === 'true'); +// console.log('sentryEnabled: ', sentryEnabled); +const sentryPlugin = sentryEnabled + ? sentryVitePlugin({ + sourcemaps: { + disable: false, + }, + }) + : undefined; + +// More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon + +export default defineConfig({ + // Standalone build UI (vite build). Embedded client uses +onCreateApp inject. + plugins: [ + unstableRolldownAdapter(analyzer()), + vike(), + ...(sentryPlugin ? [sentryPlugin] : []), + tailwindcss(), + vue(), + ], + resolve: { + alias: { + '@/sentry.browser.config': path.resolve(dirname, 'sentry.browser.config.ts'), + '#': path.resolve(dirname, 'server'), + '@': path.resolve(dirname, 'src'), + }, + }, + optimizeDeps: { + include: ['vue', 'reka-ui', 'lucide-vue-next', '@phosphor-icons/vue'], + }, + server: { + warmup: { + clientFiles: [ + './src/pages/+Layout.vue', + // './src/pages/index/+Page.vue' + ], + }, + }, + build: { + sourcemap: true, + rolldownOptions: { + }, + }, + test: { + maxWorkers: 4, + projects: [ + { + extends: true, + plugins: [ + // The plugin will run tests for the stories defined in your Storybook config + // See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest + storybookTest({ + configDir: path.join(dirname, '.storybook'), + }), + ], + test: { + name: 'storybook', + browser: { + enabled: true, + headless: true, + provider: playwright({}), + instances: [ + { + browser: 'chromium', + }, + ], + }, + }, + }, + ], + }, + fmt: { + singleQuote: true, + trailingComma: 'all', + ignorePatterns: ['content/**/*.md'], + }, + lint: { options: { typeAware: true, typeCheck: true } }, +}); diff --git a/apps/frontend-vike/vitest.shims.d.ts b/apps/frontend-vike/vitest.shims.d.ts new file mode 100644 index 0000000..7782f28 --- /dev/null +++ b/apps/frontend-vike/vitest.shims.d.ts @@ -0,0 +1 @@ +/// \ No newline at end of file