diff --git a/.claude/agents/typescript-quality/AGENT.md b/.claude/agents/typescript-quality/AGENT.md new file mode 100644 index 0000000..4f581b9 --- /dev/null +++ b/.claude/agents/typescript-quality/AGENT.md @@ -0,0 +1,19 @@ +--- +name: typescript-quality +description: | + Fixes lint and tests, and is only allowed to use read and write commands. Hooks run the tests +isolation: none +tools: Edit, Write, Read +model: glm-4.5-air +hooks: + SessionStart: + - hooks: + - type: command + command: $CLAUDE_PROJECT_DIR/.claude/hooks/dispatch typescript quality common + Stop: + - hooks: + - type: command + command: $CLAUDE_PROJECT_DIR/.claude/hooks/dispatch typescript quality common +--- + +Fix the listed lint and test errors. When you fix them, quit. Do not look for more errors. \ No newline at end of file diff --git a/.claude/hooks/dispatch b/.claude/hooks/dispatch new file mode 100755 index 0000000..0620e12 --- /dev/null +++ b/.claude/hooks/dispatch @@ -0,0 +1,56 @@ +#!/bin/bash + +set -e + +INPUT=$(cat) + +escape_json() { + JSON=$(echo -n "$1" | jq -Rca . | tail -c +2 | head -c -2) + + echo "$JSON" +} + +get_field() { + local field="$1" + local json="${2:-$INPUT}" + echo "$json" | jq -r ".$field // empty" 2>/dev/null || echo "" +} + +deny() { + JSON=$(escape_json "$1") + echo '{"hookSpecificOutput":{"hookEventName":"'$(get_field hook_event_name)'","permissionDecision":"deny","permissionDecisionReason":"'$JSON'"}}' + + exit 2 +} + +block() { + JSON=$(escape_json "$1") + echo -e '{"hookSpecificOutput":{"hookEventName":"'$(get_field hook_event_name)'","decision":"block","reason":"'$JSON'"}}' >&2 + + exit 2 +} + +additionalContext() { + JSON=$(escape_json "$1") + echo -e '{"hookSpecificOutput":{"hookEventName":"'$(get_field hook_event_name)'","additionalContext":"'$JSON'"}}' + + exit 0 +} + +sentinel() { + SESSION_ID=$(get_field "session_id") + + mkdir -p /tmp/.claude + + echo "/tmp/.claude/$SESSION_ID.$1.sentinel" +} + +export -f get_field +export -f deny +export -f block +export -f sentinel +export -f additionalContext +export -f escape_json +export INPUT + +$CLAUDE_PROJECT_DIR/.claude/skills/$1/hooks/${3:-$(get_field hook_event_name)}.d/$2 \ No newline at end of file diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 0000000..ab10312 --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,47 @@ +{ + "hooks": { + "PreToolUse": [ + { + "matcher": "Bash", + "hooks": [ + { + "type": "command", + "if": "Bash(npx *)", + "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/dispatch node ban-npx" + } + ] + } + ], + "Stop": [ + { + "matcher": "*", + "hooks": [ + { + "type": "command", + "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/dispatch typescript lint-oxlint" + } + ] + } + ], + "PostToolUse": [ + { + "matcher": "Edit|Write", + "hooks": [ + { + "type": "command", + "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/dispatch typescript format" + } + ] + }, + { + "matcher": "Edit|Write", + "hooks": [ + { + "type": "command", + "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/dispatch typescript lint-capture" + } + ] + } + ] + } +} diff --git a/.claude/skills/node/SKILL.md b/.claude/skills/node/SKILL.md new file mode 100644 index 0000000..60b6489 --- /dev/null +++ b/.claude/skills/node/SKILL.md @@ -0,0 +1,53 @@ +--- +name: node +description: | + Use when working with Node.js, npm, package.json, or npx. Alternative package managers + like Yarn and pnpm as well as monorepo tools like nx, yarn, or turborepo should also use this skill +--- + +# Node.js + +## Invoking scripts + +Prefer explicit `scripts` entries over `npx`. Write scripts to package.json: + +```json +"scripts": { + "test": "vitest run", + "dev": "vitest --watch", + "build": "vite build" +} +``` + +Reason: Enforces consistent flags, prevents drift, works better in monorepos. + +## Monorepos + +Use native npm workspaces unless user explicitly chose otherwise (turborepo, nx, pnpm). + +**Workspace pattern** ([examples/workspace-setup](examples/workspace-setup.md)): +- Root `workspaces: ["packages/**"]` in package.json +- Workspace scripts: `npm run build -ws`, `npm run test -ws` +- Local deps use workspace names: `@bifrost-ai/core` + +**TypeScript project references** ([examples/tsconfig-references](examples/tsconfig-references.md)): +- Base config with `composite: true` +- Package configs extend base, declare `references` +- Enables cross-package type checking, faster builds + +**Build** ([examples/vite-build](examples/vite-build.md)): +- Vite for fast builds +- `vite-plugin-dts` for .d.ts generation +- `external:` workspace deps in rollupOptions + +**Testing** ([examples/vitest-setup](examples/vitest-setup.md)): +- Vitest config per workspace or root +- `*.spec.ts` naming, exclude from builds +- Root script runs all: `"test": "vitest run"` + +## See also + +- [TypeScript config](examples/tsconfig-references.md) - Project references pattern +- [Vite build](examples/vite-build.md) - Library build with deps +- [Vitest setup](examples/vitest-setup.md) - Test config for monorepos +- [Workspace setup](examples/workspace-setup.md) - Complete monorepo structure diff --git a/.claude/skills/node/examples/tsconfig-references.md b/.claude/skills/node/examples/tsconfig-references.md new file mode 100644 index 0000000..8782b35 --- /dev/null +++ b/.claude/skills/node/examples/tsconfig-references.md @@ -0,0 +1,44 @@ +# TypeScript Project References + +Enables cross-package type checking, faster incremental builds. + +Root tsconfig.base.json: + +```json +{ + "compilerOptions": { + "target": "ES2022", + "module": "nodenext", + "lib": ["ESNext"], + "types": ["node"], + "moduleResolution": "bundler", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "composite": true + }, + "exclude": ["node_modules", "dist"] +} +``` + +Package tsconfig.json (packages/core/tsconfig.json): + +```json +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "references": [ + { "path": "../another-monorepo-package" } + ], + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "**/*.spec.ts", "**/*.test.ts"] +} +``` diff --git a/.claude/skills/node/examples/vite-build.md b/.claude/skills/node/examples/vite-build.md new file mode 100644 index 0000000..f4664f8 --- /dev/null +++ b/.claude/skills/node/examples/vite-build.md @@ -0,0 +1,46 @@ +# Vite Build for Libraries + +Fast builds, TypeScript declarations, workspace deps. + +vite.config.ts: + +```ts +import { defineConfig } from 'vite' +import dts from 'vite-plugin-dts' +import pkg from './package.json' + +export default defineConfig({ + plugins: [ + dts({ + tsconfigPath: './tsconfig.json', + rollupTypes: true, + }), + ], + build: { + lib: { + entry: './src/index.ts', + formats: ['es'], + fileName: 'index', + }, + rollupOptions: { + external: [ + '@my-monorepo/utils', + ...Object.keys(pkg.dependencies || {}), + ...Object.keys(pkg.peerDependencies || {}), + ], + output: { + globals: { + '@my-monorepo/utils': 'Utils', + }, + }, + }, + target: 'esnext', + emptyOutDir: true, + }, +}) +``` + +**Key points:** +- `external:` workspace deps + all deps +- `rollupTypes: true` bundles .d.ts files +- `formats: ['es']` for ESM-only packages diff --git a/.claude/skills/node/examples/vitest-setup.md b/.claude/skills/node/examples/vitest-setup.md new file mode 100644 index 0000000..b1ea6a7 --- /dev/null +++ b/.claude/skills/node/examples/vitest-setup.md @@ -0,0 +1,26 @@ +# Vitest Testing Setup + +Root vitest.config.ts: + +```ts +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + globals: true, + environment: 'node', + }, +}) +``` + +Test file naming: +- `*.spec.ts` for unit tests +- Exclude from tsconfig `exclude` array + +Usage: + +```bash +npm run test # run all tests once +npm run dev # watch mode +npm run test -- -ui # vitest ui (if installed) +``` diff --git a/.claude/skills/node/examples/workspace-setup.md b/.claude/skills/node/examples/workspace-setup.md new file mode 100644 index 0000000..e716d8c --- /dev/null +++ b/.claude/skills/node/examples/workspace-setup.md @@ -0,0 +1,44 @@ +# Npm Workspace Monorepo Setup + +Root package.json: + +```json +{ + "name": "my-monorepo", + "private": true, + "type": "module", + "workspaces": ["packages/**"], + "scripts": { + "build": "npm run build -ws", + "test": "vitest run", + "dev": "vitest --watch" + }, + "devDependencies": { + "typescript": "^6.0.3", + "vite": "^8.0.11", + "vite-plugin-dts": "^5.0.0", + "vitest": "^4.1.5" + } +} +``` + +Package (packages/core/package.json): + +```json +{ + "name": "@my-monorepo/core", + "version": "1.0.0", + "type": "module", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, + "scripts": { + "build": "vite build" + } +} +``` diff --git a/.claude/skills/node/hooks/PreToolUse.d/ban-npx b/.claude/skills/node/hooks/PreToolUse.d/ban-npx new file mode 100755 index 0000000..4498922 --- /dev/null +++ b/.claude/skills/node/hooks/PreToolUse.d/ban-npx @@ -0,0 +1,5 @@ +#!/bin/bash +# if: Bash(npx *) +### + +deny 'npx is forbidden. use a script defined in package.json and `npm run ` instead.'; \ No newline at end of file diff --git a/.claude/skills/node/wanted-skills/package.json.md b/.claude/skills/node/wanted-skills/package.json.md new file mode 100644 index 0000000..4b91304 --- /dev/null +++ b/.claude/skills/node/wanted-skills/package.json.md @@ -0,0 +1,6 @@ +# Package.json + +1. npm monorepos should ban edits that include 'workspace:*' +2. monorepo'd projects should ban devDependencies in the workspace packages. put them in the root +3. you should not have multiple versions of dependencies across a monorepo. share them +4. must run ncu and use latest versions \ No newline at end of file diff --git a/.claude/skills/react/SKILL.md b/.claude/skills/react/SKILL.md new file mode 100644 index 0000000..b4c3ab9 --- /dev/null +++ b/.claude/skills/react/SKILL.md @@ -0,0 +1,55 @@ +--- +name: react +description: | + Use this skill when writing any React code. This skill details best practices, + component design, composition, and hook gotchas. +--- + +# React + +## useRef + +The ONLY acceptable use for a useRef is to capture a native component using +`ref={myRef}`. In order to track state between calls, a useState, useMemo, and +useEffect ensures proper rerenders happen. useRef is too brittle for state +management. + +## JSX + +JSX should be SIMPLE. At most, conditional rendering is allowed with a single +variable comparison. Complex conditionals should be stored in a well-named +variable before the JSX renders and referenced. Ternaries in JSX are allowed, +but they must render only two paths. Nested Ternaries are too complex, and +should instead be broken out into a separate component in the components +directory. + +## One Component per File + +Only ONE component definition is allowed per file. Components should be reusable +and have their own FOLDER in the `src/components/` folder with a +barrel file. + +Sometimes, you have a tightly coupled component that the Component needs. Instead +of polluting the `src/components` folder with a bunch of really small tightly +coupled components (think: like a row definition component for a specific +table), you can make a "private" component file in the +`src/components//_MyPrivateComponent.tsx`. This honors the +One Component per File rule while also keeping the main component file clean and +easy to manage. + +## useMemo + +ANY new array or object definition that is used in JSX MUST be wrapped in a +useMemo with ALL dependencies in the dependency array. + +This ensures there are no rerender loops or stale data references. React has a +very good state management and rerender system. Use it and let React be smart +about ensuring good render performance. + +## useCallback + +ALL functions used in JSX MUST be wrapped in a useCallback with ALL dependencies +in the dependency array. + +This ensures that there are no stale references in the callback (a very difficult +to debug error) \ No newline at end of file diff --git a/.claude/skills/typescript/SKILL.md b/.claude/skills/typescript/SKILL.md new file mode 100644 index 0000000..21de3a7 --- /dev/null +++ b/.claude/skills/typescript/SKILL.md @@ -0,0 +1,49 @@ +--- +name: typescript +description: | + Use this skill when writing any TypeScript or JavaScript. This + specifies explicit code style, language features, and guidance + that WILL be validated after editing files and WILL fail your + edits if you do not follow this skill precisely +--- + +# Types + +Explicit types are necessary. Always use explicitly defined types and avoid +anonymous types when possible. Only use interfaces when for module augmentation. +Otherwise, use `type` definitions since they can be composed via discriminated +unions. DO NOT write classes, ever. Instead of a class, write a type and export +functions that take an instance of that type as the _last_ argument (fp style). + +```typescript +// GOOD +export type MyTypeName = { + prop: string; + value: int; + + nestedThings: NestedType[]; +}; + +export type NestedType = { + id: string; +}; +``` + +```typescript +// BAD +export interface MyTypeName { // interface instead of type + prop: string; + value: int; + + nestedThings Array<{ // anonymous type + id: string; + }>; +}; +``` + +# Functions + +Always use `const fn = () => {}` definitions over `function fn() {}` +definitions unless you use `this` within the function. Always prefer +"fp style" function declarations; args first data last. This is more +composable. \ No newline at end of file diff --git a/.claude/skills/typescript/hooks/PostToolUse.d/format b/.claude/skills/typescript/hooks/PostToolUse.d/format new file mode 100755 index 0000000..c8fb783 --- /dev/null +++ b/.claude/skills/typescript/hooks/PostToolUse.d/format @@ -0,0 +1,9 @@ +#!/bin/bash +# matcher: Edit|Write +### + +FILE_NAME=$(get_field "tool_input.file_path") + +if [[ "$FILE_NAME" =~ \.(ts|tsx|js|jsx|mjs|cjs|json|css|html|md)$ ]]; then + npm run format $FILE_NAME +fi \ No newline at end of file diff --git a/.claude/skills/typescript/hooks/PostToolUse.d/lint-capture b/.claude/skills/typescript/hooks/PostToolUse.d/lint-capture new file mode 100755 index 0000000..2162ac4 --- /dev/null +++ b/.claude/skills/typescript/hooks/PostToolUse.d/lint-capture @@ -0,0 +1,11 @@ +#!/bin/bash +# matcher: Edit|Write +### + +FILE_NAME=$(get_field "tool_input.file_path") + +if [[ "$FILE_NAME" =~ \.(ts|tsx|js|jsx|mjs|cjs)$ ]]; then + SENTINEL=$(sentinel lint-ts) + echo "$FILE_NAME" >> $SENTINEL + sort -u $SENTINEL -o $SENTINEL +fi \ No newline at end of file diff --git a/.claude/skills/typescript/hooks/Stop.d/lint-oxlint b/.claude/skills/typescript/hooks/Stop.d/lint-oxlint new file mode 100755 index 0000000..c3ca6e0 --- /dev/null +++ b/.claude/skills/typescript/hooks/Stop.d/lint-oxlint @@ -0,0 +1,14 @@ +#!/bin/bash +### + +SENTINEL=$(sentinel lint-ts) + +TS_FILES=$(grep -E '\.(ts|tsx)$' "$SENTINEL" || true) + +if [[ -n "$TS_FILES" ]]; then + OUTPUT=$(echo "$TS_FILES" | xargs npm run lint) || { + block "You MUST fix the following lint errors, even if you think they are unrelated to your changes:\n$OUTPUT" + } +fi + +rm -f $SENTINEL \ No newline at end of file diff --git a/.claude/skills/typescript/hooks/common.d/quality b/.claude/skills/typescript/hooks/common.d/quality new file mode 100755 index 0000000..4077306 --- /dev/null +++ b/.claude/skills/typescript/hooks/common.d/quality @@ -0,0 +1,50 @@ +#!/bin/bash + +set -ex + +HOOK=$(get_field hook_event_name) + +lint() { + cd $CLAUDE_PROJECT_DIR + OUTPUT=$(npm run lint:$1 -s -- --format=json) || { + FIRST_FILE=$(echo "$OUTPUT" | jq -r '.diagnostics[0].filename') + FILE_ERRORS=$(echo "$OUTPUT" | jq -rc "[.diagnostics[] | select(.filename == \"$FIRST_FILE\")]") + + if [[ "$HOOK" == "SessionStart" ]]; then + additionalContext "$FILE_ERRORS" + else + block "$FILE_ERRORS" + fi + } +} + +build() { + cd $CLAUDE_PROJECT_DIR + OUTPUT=$(npm run build:$1 -s) || { + if [[ "$HOOK" == "SessionStart" ]]; then + additionalContext "$OUTPUT" + else + block "$OUTPUT" + fi + } +} + +test() { + cd $CLAUDE_PROJECT_DIR + OUTPUT=$(npm run test:$1 -s) || { + if [[ "$HOOK" == "SessionStart" ]]; then + additionalContext "$OUTPUT" + else + block "$OUTPUT" + fi + } +} + +lint orchestrator +lint ui + +build orchestrator +build ui + +test orchestrator +test ui \ No newline at end of file diff --git a/.claude/skills/typescript/wanted-skills/tsconfig.json.md b/.claude/skills/typescript/wanted-skills/tsconfig.json.md new file mode 100644 index 0000000..3700391 --- /dev/null +++ b/.claude/skills/typescript/wanted-skills/tsconfig.json.md @@ -0,0 +1,3 @@ +# tsconfig.json + +1. adding excludes to avoid fixing type errors diff --git a/.gitignore b/.gitignore index e03afab..15f1ecf 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,7 @@ devzeebo-orchestrator/ **/__pycache__/** bin/ +node_modules/ +.wireit/ + +**/tsconfig.tsbuildinfo \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json index fe8b8a2..21eaff7 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,5 +1,3 @@ { - "recommendations": [ - "jimmy-yeung.uv-workspace-paths" - ] -} \ No newline at end of file + "recommendations": ["jimmy-yeung.uv-workspace-paths"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 3bd35d0..8d913ec 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,17 +1,17 @@ { - "go.goflags": [ - "-work" - ], + "go.goflags": ["-work"], "gopls": { "build.env": { "GOWORK": "${workspaceFolder}/go.work" } }, - "oxc.path.oxlint": "bifrost/ui/node_modules/.bin/oxlint", "files.exclude": { "**/node_modules": true, "**/__pycache__": true, - "**/.venv": true + "**/.venv": true, + "**/dist": true, + "*/**/.claude": true, + "**/tsconfig.tsbuildinfo": true }, "python.analysis.extraPaths": [ "orchestrator/packages/engine-claude-code/src", @@ -19,5 +19,11 @@ "orchestrator/packages/interface-tasks/src", "orchestrator/packages/orchestrator/src", "orchestrator/packages/tasks-bifrost/src" - ] + ], + "[javascript][javascriptreact][typescript][typescriptreact][json][jsonc]": { + "editor.codeActionsOnSave": { + "source.fixAll.oxc": "explicit", + "source.fixAll.prettier": "always" + } + } } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index a37d539..13d400a 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -7,7 +7,7 @@ "command": "${workspaceFolder}/.vscode/scripts/pythonExtraPaths/update.sh", "isBackground": true, "runOptions": { - "runOn": "folderOpen", + "runOn": "folderOpen" }, "problemMatcher": [] } diff --git a/bifrost/.github/workflows/build.yml b/bifrost/.github/workflows/build.yml index 05712de..45ca35a 100644 --- a/bifrost/.github/workflows/build.yml +++ b/bifrost/.github/workflows/build.yml @@ -4,16 +4,16 @@ on: workflow_call: inputs: upload-artifacts: - description: 'Upload build artifacts' + description: "Upload build artifacts" required: false default: false type: boolean outputs: artifact-x86_64: - description: 'x86_64 artifact name' + description: "x86_64 artifact name" value: binaries-x86_64 artifact-aarch64: - description: 'aarch64 artifact name' + description: "aarch64 artifact name" value: binaries-aarch64 jobs: @@ -37,13 +37,13 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version-file: 'go.work' + go-version-file: "go.work" - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: '24' - cache: 'npm' + node-version: "24" + cache: "npm" cache-dependency-path: ui/package-lock.json - name: Install dependencies diff --git a/bifrost/.github/workflows/release.yml b/bifrost/.github/workflows/release.yml index 59f4051..4ea4776 100644 --- a/bifrost/.github/workflows/release.yml +++ b/bifrost/.github/workflows/release.yml @@ -3,7 +3,7 @@ name: Release on: push: tags: - - 'v*' + - "v*" jobs: build: diff --git a/bifrost/docker-compose.yml b/bifrost/docker-compose.yml index 4d261b2..aa44c1b 100644 --- a/bifrost/docker-compose.yml +++ b/bifrost/docker-compose.yml @@ -36,4 +36,4 @@ services: volumes: postgres_data: - driver: local \ No newline at end of file + driver: local diff --git a/bifrost/pkg/arch/server.yaml b/bifrost/pkg/arch/server.yaml index 81aeaf7..8bfa023 100644 --- a/bifrost/pkg/arch/server.yaml +++ b/bifrost/pkg/arch/server.yaml @@ -19,7 +19,7 @@ catchup_interval: 1s # Set this to a base64-encoded 256-bit (32-byte) key for JWT signing # Generate a secure key with: openssl rand -base64 32 # Example: jwt_signing_key: your_base64_encoded_key_here -# jwt_signing_key: +# jwt_signing_key: # For development: you can omit this and set ADMIN_JWT_SIGNING_KEY environment variable # or let the server generate a temporary key (sessions will invalidate on restart) diff --git a/bifrost/ui/.devserver-debug.log b/bifrost/ui/.devserver-debug.log deleted file mode 100644 index 7f42489..0000000 --- a/bifrost/ui/.devserver-debug.log +++ /dev/null @@ -1,798 +0,0 @@ - -> bifrost-ui@0.0.0 dev -> vite --host 0.0.0.0 --port 5173 - -2026-03-01T00:59:41.879Z vite:config config file loaded in 158.91ms -2026-03-01T00:59:41.885Z vite:config config file loaded in 7.12ms -2026-03-01T00:59:41.929Z vite:env loading env files: [ - '/home/blake/Documents/software/bifrost/ui/.env', - '/home/blake/Documents/software/bifrost/ui/.env.local', - '/home/blake/Documents/software/bifrost/ui/.env.development', - '/home/blake/Documents/software/bifrost/ui/.env.development.local' -] -2026-03-01T00:59:41.929Z vite:env env files loaded in 0.22ms -2026-03-01T00:59:41.930Z vite:env using resolved env: { BASE_SERVER: '/ui', BASE_ASSETS: '/ui' } -2026-03-01T00:59:41.933Z vite:env loading env files: [ - '/home/blake/Documents/software/bifrost/ui/.env', - '/home/blake/Documents/software/bifrost/ui/.env.local', - '/home/blake/Documents/software/bifrost/ui/.env.development', - '/home/blake/Documents/software/bifrost/ui/.env.development.local' -] -2026-03-01T00:59:41.933Z vite:env env files loaded in 0.09ms -2026-03-01T00:59:41.933Z vite:env using resolved env: { - SHELL: '/usr/bin/zsh', - npm_command: 'run-script', - LSCOLORS: 'Gxfxcxdxbxegedabagacad', - SESSION_MANAGER: 'local/Willem-Dafoe:@/tmp/.ICE-unix/1606,unix/Willem-Dafoe:/tmp/.ICE-unix/1606', - WINDOWID: '94830981185616', - npm_config_userconfig: '/home/blake/.npmrc', - COLORTERM: 'truecolor', - XDG_CONFIG_DIRS: '/home/blake/.config/kdedefaults:/etc/xdg', - npm_config_cache: '/home/blake/.npm', - LESS: '-R', - XDG_SESSION_PATH: '/org/freedesktop/DisplayManager/Session1', - NVM_INC: '/home/blake/.nvm/versions/node/v22.20.0/include/node', - HISTCONTROL: 'ignoreboth', - XDG_MENU_PREFIX: 'plasma-', - ICEAUTHORITY: '/run/user/1000/iceauth_fWBvlR', - LANGUAGE: '', - _P9K_TTY: '/dev/pts/0', - NODE: '/usr/bin/node', - LC_ADDRESS: 'en_US.UTF-8', - LC_NAME: 'en_US.UTF-8', - P9K_TTY: 'old', - SHELL_SESSION_ID: '472ffbea299e4a588019d4b346f0f7cb', - AGENT: '1', - MEMORY_PRESSURE_WRITE: 'c29tZSAyMDAwMDAgMjAwMDAwMAA=', - COLOR: '0', - npm_config_local_prefix: '/home/blake/Documents/software/bifrost/ui', - LIBVA_DRIVER_NAME: 'nvidia', - DESKTOP_SESSION: 'plasma', - LC_MONETARY: 'en_US.UTF-8', - OSH: '/home/blake/.oh-my-bash', - GTK_RC_FILES: '/etc/gtk/gtkrc:/home/blake/.gtkrc:/home/blake/.config/gtkrc', - npm_config_globalconfig: '/home/blake/.npm-global/etc/npmrc', - EDITOR: 'vi', - PUPPETEER_EXECUTABLE_PATH: '/usr/bin/chromium', - XDG_SEAT: 'seat0', - PWD: '/home/blake/Documents/software/bifrost/ui', - XDG_SESSION_DESKTOP: 'KDE', - LOGNAME: 'blake', - XDG_SESSION_TYPE: 'wayland', - PNPM_HOME: '/home/blake/.local/share/pnpm', - npm_config_init_module: '/home/blake/.npm-init.js', - SYSTEMD_EXEC_PID: '9610', - _: '/home/blake/Documents/software/bifrost/ui/node_modules/.bin/vite', - XAUTHORITY: '/run/user/1000/xauth_XHTaGY', - FZF_DEFAULT_COMMAND: 'fd --type f --hidden --exclude .git', - MOTD_SHOWN: 'pam', - GTK2_RC_FILES: '/etc/gtk-2.0/gtkrc:/home/blake/.gtkrc-2.0:/home/blake/.config/gtkrc-2.0', - HOME: '/home/blake', - OPENCODE: '1', - LANG: 'en_US.UTF-8', - LC_PAPER: 'en_US.UTF-8', - _JAVA_AWT_WM_NONREPARENTING: '1', - LS_COLORS: 'rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=00:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.7z=01;31:*.ace=01;31:*.alz=01;31:*.apk=01;31:*.arc=01;31:*.arj=01;31:*.bz=01;31:*.bz2=01;31:*.cab=01;31:*.cpio=01;31:*.crate=01;31:*.deb=01;31:*.drpm=01;31:*.dwm=01;31:*.dz=01;31:*.ear=01;31:*.egg=01;31:*.esd=01;31:*.gz=01;31:*.jar=01;31:*.lha=01;31:*.lrz=01;31:*.lz=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.lzo=01;31:*.pyz=01;31:*.rar=01;31:*.rpm=01;31:*.rz=01;31:*.sar=01;31:*.swm=01;31:*.t7z=01;31:*.tar=01;31:*.taz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tgz=01;31:*.tlz=01;31:*.txz=01;31:*.tz=01;31:*.tzo=01;31:*.tzst=01;31:*.udeb=01;31:*.war=01;31:*.whl=01;31:*.wim=01;31:*.xz=01;31:*.z=01;31:*.zip=01;31:*.zoo=01;31:*.zst=01;31:*.avif=01;35:*.jpg=01;35:*.jpeg=01;35:*.jxl=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:*~=00;90:*#=00;90:*.bak=00;90:*.crdownload=00;90:*.dpkg-dist=00;90:*.dpkg-new=00;90:*.dpkg-old=00;90:*.dpkg-tmp=00;90:*.old=00;90:*.orig=00;90:*.part=00;90:*.rej=00;90:*.rpmnew=00;90:*.rpmorig=00;90:*.rpmsave=00;90:*.swp=00;90:*.tmp=00;90:*.ucf-dist=00;90:*.ucf-new=00;90:*.ucf-old=00;90:', - XDG_CURRENT_DESKTOP: 'KDE', - KONSOLE_DBUS_SERVICE: ':1.104', - npm_package_version: '0.0.0', - MEMORY_PRESSURE_WATCH: '/sys/fs/cgroup/user.slice/user-1000.slice/user@1000.service/app.slice/app-dbus\\x2d:1.2\\x2dorg.kde.yakuake.slice/dbus-:1.2-org.kde.yakuake@0.service/memory.pressure', - WAYLAND_DISPLAY: 'wayland-0', - KONSOLE_DBUS_SESSION: '/Sessions/1', - PROFILEHOME: '', - XDG_SEAT_PATH: '/org/freedesktop/DisplayManager/Seat0', - INVOCATION_ID: 'f89085e3616b41838ca8977516082290', - KONSOLE_VERSION: '251202', - MANAGERPID: '1325', - INIT_CWD: '/home/blake/Documents/software/bifrost/ui', - KDE_SESSION_UID: '1000', - npm_lifecycle_script: 'vite', - NVM_DIR: '/home/blake/.nvm', - XKB_DEFAULT_LAYOUT: 'us', - npm_config_npm_version: '10.9.3', - XDG_SESSION_CLASS: 'user', - LC_IDENTIFICATION: 'en_US.UTF-8', - TERM: 'xterm-256color', - npm_package_name: 'bifrost-ui', - ZSH: '/usr/share/oh-my-zsh', - LESS_TERMCAP_me: '\x1B(B\x1B[m', - LESS_TERMCAP_md: '\x1B[1m\x1B[32m', - KONSOLE_DBUS_ACTIVATION_COOKIE: 'oIeW252prHVFb+l6QluDiTk7Zj/twKkkxuLoefH5Ql0=', - npm_config_prefix: '/home/blake/.npm-global', - USER: 'blake', - CUDA_PATH: '/opt/cuda', - COLORFGBG: '15;0', - QT_WAYLAND_RECONNECT: '1', - KDE_SESSION_VERSION: '6', - PAM_KWALLET5_LOGIN: '/run/user/1000/kwallet5.socket', - DISPLAY: ':0', - npm_lifecycle_event: 'dev', - SHLVL: '1', - NVM_CD_FLAGS: '-q', - PAGER: 'less', - LC_TELEPHONE: 'en_US.UTF-8', - _P9K_SSH_TTY: '/dev/pts/0', - LC_MEASUREMENT: 'en_US.UTF-8', - XDG_VTNR: '2', - XDG_SESSION_ID: '2', - MANAGERPIDFDID: '1326', - npm_config_user_agent: 'npm/10.9.3 node/v25.6.1 linux x64 workspaces/false', - CUDA_DISABLE_PERF_BOOST: '1', - npm_execpath: '/home/blake/.nvm/versions/node/v22.20.0/lib/node_modules/npm/bin/npm-cli.js', - XDG_RUNTIME_DIR: '/run/user/1000', - FZF_BASE: '/usr/share/fzf', - DEBUGINFOD_URLS: 'https://debuginfod.archlinux.org https://debuginfod.cachyos.org ', - NVCC_CCBIN: '/usr/bin/g++', - npm_package_json: '/home/blake/Documents/software/bifrost/ui/package.json', - DOCKER_HOST: 'unix:///run/user/1000/podman/podman.sock', - LC_TIME: 'en_US.UTF-8', - BUN_INSTALL: '/home/blake/.bun', - HISTORY_IGNORE: '(\\&|[bf]g|c|clear|history|exit|q|pwd|* --help)', - P9K_SSH: '0', - JOURNAL_STREAM: '9:142005', - XDG_DATA_DIRS: '/home/blake/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share:/var/lib/snapd/desktop', - KDE_FULL_SESSION: 'true', - npm_config_noproxy: '', - PATH: '/home/blake/Documents/software/bifrost/ui/node_modules/.bin:/home/blake/Documents/software/bifrost/node_modules/.bin:/home/blake/Documents/software/node_modules/.bin:/home/blake/Documents/node_modules/.bin:/home/blake/node_modules/.bin:/home/node_modules/.bin:/node_modules/.bin:/home/blake/.nvm/versions/node/v22.20.0/lib/node_modules/npm/node_modules/@npmcli/run-script/lib/node-gyp-bin:/home/blake/.bun/bin:/home/blake/.npm-global/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/home/blake/.nvm/versions/node/*/bin:/home/blake/.opencode/bin:/home/blake/.opperator/bin:/home/blake/.local/bin:/home/blake/.nvm/versions/node/v22.20.0/bin:/home/blake/.npm-global/bin:/home/blake/miniconda3/bin:/home/blake/.nvm/versions/node/v22.20.0/bin:/home/blake/.bun/bin:/home/blake/.npm-global/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/home/blake/.nvm/versions/node/*/bin:/home/blake/.opencode/bin:/home/blake/.opperator/bin:/home/blake/.local/share/pnpm:/home/blake/.local/bin:/home/blake/.nvm/versions/node/v22.20.0/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/opt/cuda/bin:/home/blake/.local/share/flatpak/exports/bin:/var/lib/flatpak/exports/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/var/lib/snapd/snap/bin:/home/blake/.lmstudio/bin:/home/blake/.lmstudio/bin:/home/blake/.lmstudio/bin:/home/blake/.lmstudio/bin', - npm_config_node_gyp: '/home/blake/.nvm/versions/node/v22.20.0/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js', - DBUS_SESSION_BUS_ADDRESS: 'unix:path=/run/user/1000/bus', - npm_config_global_prefix: '/home/blake/.npm-global', - KDE_APPLICATIONS_AS_SCOPE: '1', - NVM_BIN: '/home/blake/.nvm/versions/node/v22.20.0/bin', - MAIL: '/var/spool/mail/blake', - DEBUG: 'vite:*', - npm_node_execpath: '/usr/bin/node', - LC_NUMERIC: 'en_US.UTF-8', - OLDPWD: '/home/blake/Documents/software/bifrost/ui', - TERM_PROGRAM: 'Cursor', - NODE_ENV: 'development', - BASE_SERVER: '/ui', - BASE_ASSETS: '/ui' -} -2026-03-01T00:59:41.944Z vite:config using resolved config: { - base: '/ui/', - plugins: [ - 'vite:optimized-deps', - 'vite:watch-package-data', - 'vite:pre-alias', - 'alias', - 'vite:react-babel', - 'vite:react-refresh', - 'vike:pluginCommon:pre', - 'vike:pluginSetGlobalContext:pre', - '@tailwindcss/vite:scan', - '@tailwindcss/vite:generate:serve', - 'vite:modulepreload-polyfill', - 'vite:resolve', - 'vite:html-inline-proxy', - 'vite:css', - 'vite:esbuild', - 'vite:json', - 'vite:wasm-helper', - 'vite:worker', - 'vite:asset', - 'vike:pluginCommon', - 'vike:pluginVirtualFiles', - 'vike:pluginDev', - 'vike:pluginExtractAssets-4', - 'vike:pluginAssertFileEnv:dev', - 'vike:pluginWorkaroundCssModuleHmr', - 'vike:pluginReplaceConstantsGlobalThis:define', - 'vike:pluginReplaceConstantsGlobalThis:virtual-file', - 'vike:pluginViteRPC:1', - 'vike:pluginReplaceConstantsNonRunnableDev:IS_NON_RUNNABLE_DEV', - 'vike:pluginReplaceConstantsNonRunnableDev:DYNAMIC_IMPORT', - 'vike:pluginStripPointerImportAttribute', - 'vite:wasm-fallback', - 'vite:css-post', - 'vite:worker-import-meta-url', - 'vite:asset-import-meta-url', - 'vite:dynamic-import-vars', - 'vite:import-glob', - 'vike:pluginCommon:post', - 'vike:pluginDev:post', - 'vike:pluginExtractExportNames', - 'vike:pluginSetGlobalContext:post', - 'vike:pluginBaseUrls', - 'vike:pluginReplaceConstantsEnvVars', - 'vike:pluginWorkaroundVite6HmrRegression', - 'vike:pluginStaticReplace', - 'vite:client-inject', - 'vite:css-analysis', - 'vite:import-analysis', - 'vite:define' - ], - resolve: { - externalConditions: [ 'node' ], - extensions: [ - '.mjs', '.js', - '.mts', '.ts', - '.jsx', '.tsx', - '.json' - ], - dedupe: [ 'react', 'react-dom' ], - noExternal: [], - external: [], - preserveSymlinks: false, - alias: [ - { find: '@', replacement: '/src' }, - { - find: /^\/?@vite\/env/, - replacement: '/@fs/home/blake/Documents/software/bifrost/ui/node_modules/vite/dist/client/env.mjs' - }, - { - find: /^\/?@vite\/client/, - replacement: '/@fs/home/blake/Documents/software/bifrost/ui/node_modules/vite/dist/client/client.mjs' - } - ], - mainFields: [ 'browser', 'module', 'jsnext:main', 'jsnext' ], - conditions: [ 'module', 'browser', 'development|production' ], - builtins: [] - }, - server: { - port: 5173, - strictPort: false, - host: '0.0.0.0', - allowedHosts: [], - https: undefined, - open: false, - proxy: { '/api': { target: 'http://localhost:8080', changeOrigin: true } }, - cors: { - origin: /^https?:\/\/(?:(?:[^:]+\.)?localhost|127\.0\.0\.1|\[::1\])(?::\d+)?$/ - }, - headers: {}, - warmup: { clientFiles: [], ssrFiles: [] }, - middlewareMode: false, - fs: { - strict: true, - deny: [ '.env', '.env.*', '*.{crt,pem}', '**/.git/**' ], - allow: [ - '/home/blake/Documents/software/bifrost/ui', - '/home/blake/Documents/software/bifrost/ui', - '/home/blake/Documents/software/bifrost/ui', - '/home/blake/Documents/software/bifrost/ui/node_modules/vike/' - ] - }, - preTransformRequests: true, - perEnvironmentStartEndDuringDev: false, - sourcemapIgnoreList: [Function: isInNodeModules$1] - }, - _isDev: true, - _viteVersionResolved: '6.3.0', - _rootResolvedEarly: '/home/blake/Documents/software/bifrost/ui', - configVikePromise: Promise { { prerender: false } }, - esbuild: { jsxDev: true, jsx: 'automatic', jsxImportSource: undefined }, - optimizeDeps: { - include: [ - 'react', - 'react-dom', - 'react/jsx-dev-runtime', - 'react/jsx-runtime', - 'vike > @brillout/json-serializer/parse', - 'vike > @brillout/json-serializer/stringify', - 'vike > @brillout/picocolors', - 'vike-react/__internal/integration/onRenderClient', - 'vike-react/__internal/integration/Loading' - ], - exclude: [ 'vike/client', 'vike/client/router' ], - needsInterop: [], - extensions: [], - disabled: undefined, - holdUntilCrawlEnd: true, - force: false, - noDiscovery: false, - esbuildOptions: { preserveSymlinks: false, jsx: 'automatic' }, - entries: [ - '/home/blake/Documents/software/bifrost/ui/src/pages/_error/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/+Layout.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/+Wrapper.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/account/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/accounts/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/accounts/[id]/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/accounts/new/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/dashboard/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/index/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/login/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/onboarding/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/realms/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/realms/[id]/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/realms/new/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/runes/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/runes/[id]/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/runes/new/+Page.tsx', - 'virtual:vike:page-entry:client:/src/pages/_error', - 'virtual:vike:page-entry:client:/src/pages/account', - 'virtual:vike:page-entry:client:/src/pages/accounts', - 'virtual:vike:page-entry:client:/src/pages/accounts/[id]', - 'virtual:vike:page-entry:client:/src/pages/accounts/new', - 'virtual:vike:page-entry:client:/src/pages/dashboard', - 'virtual:vike:page-entry:client:/src/pages/index', - 'virtual:vike:page-entry:client:/src/pages/login', - 'virtual:vike:page-entry:client:/src/pages/onboarding', - 'virtual:vike:page-entry:client:/src/pages/realms', - 'virtual:vike:page-entry:client:/src/pages/realms/[id]', - 'virtual:vike:page-entry:client:/src/pages/realms/new', - 'virtual:vike:page-entry:client:/src/pages/runes', - 'virtual:vike:page-entry:client:/src/pages/runes/[id]', - 'virtual:vike:page-entry:client:/src/pages/runes/new', - 'virtual:vike:global-entry:client:client-routing' - ] - }, - build: { - target: [ 'es2020', 'edge88', 'firefox78', 'chrome87', 'safari14' ], - polyfillModulePreload: true, - modulePreload: { polyfill: true }, - outDir: 'dist', - assetsDir: 'assets', - assetsInlineLimit: 4096, - sourcemap: false, - terserOptions: {}, - rollupOptions: { onwarn: [Function: onwarn] }, - commonjsOptions: { include: [ /node_modules/ ], extensions: [ '.js', '.cjs' ] }, - dynamicImportVarsOptions: { warnOnError: true, exclude: [ /node_modules/ ] }, - write: true, - emptyOutDir: null, - copyPublicDir: true, - manifest: false, - lib: false, - ssrManifest: false, - ssrEmitAssets: false, - reportCompressedSize: true, - chunkSizeWarningLimit: 500, - watch: null, - cssCodeSplit: true, - minify: 'esbuild', - ssr: false, - emitAssets: false, - createEnvironment: [Function: createEnvironment], - cssTarget: [ 'es2020', 'edge88', 'firefox78', 'chrome87', 'safari14' ], - cssMinify: true - }, - appType: 'custom', - ssr: { - target: 'node', - optimizeDeps: { - esbuildOptions: { preserveSymlinks: false }, - include: [], - exclude: [ - '@brillout/import', - '@brillout/json-serializer', - '@brillout/picocolors', - '@brillout/vite-plugin-server-entry', - 'vike' - ], - needsInterop: [], - extensions: [], - holdUntilCrawlEnd: true, - force: false, - noDiscovery: true - }, - external: [], - noExternal: [], - resolve: { - conditions: [ 'module', 'node', 'development|production' ], - externalConditions: [ 'node' ] - } - }, - define: { - 'globalThis.__VIKE__IS_DEV': 'true', - 'globalThis.__VIKE__IS_DEBUG': 'false', - 'globalThis.__VIKE__NO_EXTERNAL': 'true' - }, - envPrefix: [ 'VITE_', 'BASE_SERVER', 'BASE_ASSETS' ], - _baseViteOriginal: '/ui', - preview: { - port: 3000, - strictPort: false, - host: '0.0.0.0', - allowedHosts: [], - https: undefined, - open: false, - proxy: { '/api': { target: 'http://localhost:8080', changeOrigin: true } }, - cors: { - origin: /^https?:\/\/(?:(?:[^:]+\.)?localhost|127\.0\.0\.1|\[::1\])(?::\d+)?$/ - }, - headers: {} - }, - environments: { - client: { - define: { - 'globalThis.__VIKE__IS_DEV': 'true', - 'globalThis.__VIKE__IS_DEBUG': 'false', - 'globalThis.__VIKE__NO_EXTERNAL': 'true', - 'globalThis.__VIKE__IS_CLIENT': 'true' - }, - resolve: { - externalConditions: [ 'node' ], - extensions: [ - '.mjs', '.js', - '.mts', '.ts', - '.jsx', '.tsx', - '.json' - ], - dedupe: [ 'react', 'react-dom' ], - noExternal: [], - external: [], - preserveSymlinks: false, - alias: [ - { find: '@', replacement: '/src' }, - { - find: /^\/?@vite\/env/, - replacement: '/@fs/home/blake/Documents/software/bifrost/ui/node_modules/vite/dist/client/env.mjs' - }, - { - find: /^\/?@vite\/client/, - replacement: '/@fs/home/blake/Documents/software/bifrost/ui/node_modules/vite/dist/client/client.mjs' - } - ], - mainFields: [ 'browser', 'module', 'jsnext:main', 'jsnext' ], - conditions: [ 'module', 'browser', 'development|production' ], - builtins: [] - }, - keepProcessEnv: false, - consumer: 'client', - optimizeDeps: { - include: [ - 'react', - 'react-dom', - 'react/jsx-dev-runtime', - 'react/jsx-runtime', - 'vike > @brillout/json-serializer/parse', - 'vike > @brillout/json-serializer/stringify', - 'vike > @brillout/picocolors', - 'vike-react/__internal/integration/onRenderClient', - 'vike-react/__internal/integration/Loading' - ], - exclude: [ 'vike/client', 'vike/client/router' ], - needsInterop: [], - extensions: [], - disabled: undefined, - holdUntilCrawlEnd: true, - force: false, - noDiscovery: false, - esbuildOptions: { preserveSymlinks: false, jsx: 'automatic' }, - entries: [ - '/home/blake/Documents/software/bifrost/ui/src/pages/_error/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/+Layout.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/+Wrapper.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/account/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/accounts/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/accounts/[id]/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/accounts/new/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/dashboard/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/index/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/login/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/onboarding/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/realms/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/realms/[id]/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/realms/new/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/runes/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/runes/[id]/+Page.tsx', - '/home/blake/Documents/software/bifrost/ui/src/pages/runes/new/+Page.tsx', - 'virtual:vike:page-entry:client:/src/pages/_error', - 'virtual:vike:page-entry:client:/src/pages/account', - 'virtual:vike:page-entry:client:/src/pages/accounts', - 'virtual:vike:page-entry:client:/src/pages/accounts/[id]', - 'virtual:vike:page-entry:client:/src/pages/accounts/new', - 'virtual:vike:page-entry:client:/src/pages/dashboard', - 'virtual:vike:page-entry:client:/src/pages/index', - 'virtual:vike:page-entry:client:/src/pages/login', - 'virtual:vike:page-entry:client:/src/pages/onboarding', - 'virtual:vike:page-entry:client:/src/pages/realms', - 'virtual:vike:page-entry:client:/src/pages/realms/[id]', - 'virtual:vike:page-entry:client:/src/pages/realms/new', - 'virtual:vike:page-entry:client:/src/pages/runes', - 'virtual:vike:page-entry:client:/src/pages/runes/[id]', - 'virtual:vike:page-entry:client:/src/pages/runes/new', - 'virtual:vike:global-entry:client:client-routing' - ] - }, - dev: { - warmup: [], - sourcemap: { js: true }, - sourcemapIgnoreList: [Function: isInNodeModules$1], - preTransformRequests: true, - createEnvironment: [Function: defaultCreateClientDevEnvironment], - recoverable: true, - moduleRunnerTransform: false - }, - build: { - target: [ 'es2020', 'edge88', 'firefox78', 'chrome87', 'safari14' ], - polyfillModulePreload: true, - modulePreload: { polyfill: true }, - outDir: 'dist', - assetsDir: 'assets', - assetsInlineLimit: 4096, - sourcemap: false, - terserOptions: {}, - rollupOptions: { onwarn: [Function: onwarn] }, - commonjsOptions: { include: [ /node_modules/ ], extensions: [ '.js', '.cjs' ] }, - dynamicImportVarsOptions: { warnOnError: true, exclude: [ /node_modules/ ] }, - write: true, - emptyOutDir: null, - copyPublicDir: true, - manifest: false, - lib: false, - ssrManifest: false, - ssrEmitAssets: false, - reportCompressedSize: true, - chunkSizeWarningLimit: 500, - watch: null, - cssCodeSplit: true, - minify: 'esbuild', - ssr: false, - emitAssets: true, - createEnvironment: [Function: createEnvironment], - cssTarget: [ 'es2020', 'edge88', 'firefox78', 'chrome87', 'safari14' ], - cssMinify: true - } - }, - ssr: { - define: { - 'globalThis.__VIKE__IS_DEV': 'true', - 'globalThis.__VIKE__IS_DEBUG': 'false', - 'globalThis.__VIKE__NO_EXTERNAL': 'true', - 'globalThis.__VIKE__IS_CLIENT': 'false' - }, - resolve: { - externalConditions: [ 'node' ], - extensions: [ - '.mjs', '.js', - '.mts', '.ts', - '.jsx', '.tsx', - '.json' - ], - dedupe: [ 'react', 'react-dom' ], - noExternal: [], - external: [], - preserveSymlinks: false, - alias: [ - { find: '@', replacement: '/src' }, - { - find: /^\/?@vite\/env/, - replacement: '/@fs/home/blake/Documents/software/bifrost/ui/node_modules/vite/dist/client/env.mjs' - }, - { - find: /^\/?@vite\/client/, - replacement: '/@fs/home/blake/Documents/software/bifrost/ui/node_modules/vite/dist/client/client.mjs' - } - ], - mainFields: [ 'module', 'jsnext:main', 'jsnext' ], - conditions: [ 'module', 'node', 'development|production' ], - builtins: [ - '_http_agent', '_http_client', '_http_common', - '_http_incoming', '_http_outgoing', '_http_server', - '_stream_duplex', '_stream_passthrough', '_stream_readable', - '_stream_transform', '_stream_wrap', '_stream_writable', - '_tls_common', '_tls_wrap', 'assert', - 'assert/strict', 'async_hooks', 'buffer', - 'child_process', 'cluster', 'console', - 'constants', 'crypto', 'dgram', - 'diagnostics_channel', 'dns', 'dns/promises', - 'domain', 'events', 'fs', - 'fs/promises', 'http', 'http2', - 'https', 'inspector', 'inspector/promises', - 'module', 'net', 'os', - 'path', 'path/posix', 'path/win32', - 'perf_hooks', 'process', 'punycode', - 'querystring', 'readline', 'readline/promises', - 'repl', 'stream', 'stream/consumers', - 'stream/promises', 'stream/web', 'string_decoder', - 'sys', 'timers', 'timers/promises', - 'tls', 'trace_events', 'tty', - 'url', 'util', 'util/types', - 'v8', 'vm', 'wasi', - 'worker_threads', 'zlib', /^node:/, - /^npm:/, /^bun:/ - ] - }, - keepProcessEnv: true, - consumer: 'server', - optimizeDeps: { - include: [], - exclude: [ - '@brillout/import', - '@brillout/json-serializer', - '@brillout/picocolors', - '@brillout/vite-plugin-server-entry', - 'vike' - ], - needsInterop: [], - extensions: [], - disabled: undefined, - holdUntilCrawlEnd: true, - force: false, - noDiscovery: true, - esbuildOptions: { preserveSymlinks: false }, - entries: [] - }, - dev: { - warmup: [], - sourcemap: { js: true }, - sourcemapIgnoreList: [Function: isInNodeModules$1], - preTransformRequests: false, - createEnvironment: [Function: defaultCreateDevEnvironment], - recoverable: false, - moduleRunnerTransform: true - }, - build: { - target: [ 'es2020', 'edge88', 'firefox78', 'chrome87', 'safari14' ], - polyfillModulePreload: true, - modulePreload: { polyfill: true }, - outDir: 'dist', - assetsDir: 'assets', - assetsInlineLimit: 4096, - sourcemap: false, - terserOptions: {}, - rollupOptions: { onwarn: [Function: onwarn] }, - commonjsOptions: { include: [ /node_modules/ ], extensions: [ '.js', '.cjs' ] }, - dynamicImportVarsOptions: { warnOnError: true, exclude: [ /node_modules/ ] }, - write: true, - emptyOutDir: null, - copyPublicDir: true, - manifest: false, - lib: false, - ssrManifest: false, - ssrEmitAssets: false, - reportCompressedSize: true, - chunkSizeWarningLimit: 500, - watch: null, - cssCodeSplit: true, - minify: false, - ssr: true, - emitAssets: false, - createEnvironment: [Function: createEnvironment], - cssTarget: [ 'es2020', 'edge88', 'firefox78', 'chrome87', 'safari14' ], - cssMinify: 'esbuild' - } - } - }, - configFile: '/home/blake/Documents/software/bifrost/ui/vite.config.ts', - configFileDependencies: [ '/home/blake/Documents/software/bifrost/ui/vite.config.ts' ], - inlineConfig: { - root: undefined, - base: undefined, - mode: undefined, - configFile: undefined, - configLoader: undefined, - logLevel: undefined, - clearScreen: undefined, - server: { host: '0.0.0.0', port: 5173 }, - forceOptimizeDeps: undefined - }, - root: '/home/blake/Documents/software/bifrost/ui', - decodedBase: '/ui/', - rawBase: '/ui', - publicDir: '/home/blake/Documents/software/bifrost/ui/public', - cacheDir: '/home/blake/Documents/software/bifrost/ui/node_modules/.vite', - command: 'serve', - mode: 'development', - isWorker: false, - mainConfig: null, - bundleChain: [], - isProduction: false, - css: { - transformer: 'postcss', - preprocessorMaxWorkers: 0, - devSourcemap: false, - lightningcss: undefined - }, - json: { namedExports: true, stringify: 'auto' }, - builder: undefined, - envDir: '/home/blake/Documents/software/bifrost/ui', - env: { - BASE_SERVER: '/ui', - BASE_ASSETS: '/ui', - BASE_URL: '/ui', - MODE: 'development', - DEV: true, - PROD: false - }, - assetsInclude: [Function: assetsInclude], - logger: { - hasWarned: false, - info: [Function (anonymous)], - warn: [Function (anonymous)], - warnOnce: [Function: warnOnce], - error: [Function (anonymous)], - clearScreen: [Function: clearScreen], - hasErrorLogged: [Function: hasErrorLogged] - }, - packageCache: Map(1) { - 'fnpd_/home/blake/Documents/software/bifrost/ui' => { - dir: '/home/blake/Documents/software/bifrost/ui', - data: { - name: 'bifrost-ui', - private: true, - version: '0.0.0', - type: 'module', - scripts: { - dev: 'vite', - build: 'tsc && vite build', - test: 'vitest', - lint: 'oxlint', - format: 'prettier --write .' - }, - dependencies: { - '@base-ui/react': '^1.0.0-beta.2', - react: '^18.3.1', - 'react-dom': '^18.3.1', - tailwindcss: '^4.0.0', - vike: '^0.4.160', - 'vike-react': '^0.6.0' - }, - devDependencies: { - '@playwright/test': '^1.58.2', - '@tailwindcss/vite': '^4.0.0', - '@testing-library/dom': '^10.4.1', - '@testing-library/jest-dom': '^6.9.1', - '@testing-library/react': '^16.3.2', - '@types/react': '^18.3.18', - '@types/react-dom': '^18.3.5', - '@vitejs/plugin-react': '^4.3.4', - jsdom: '^28.1.0', - oxlint: '^0.15.13', - prettier: '^3.4.2', - typescript: '^5.7.2', - vite: '6.3.0', - 'vite-tsconfig-paths': '^5.1.4', - vitest: '^2.1.8' - } - }, - hasSideEffects: [Function: hasSideEffects], - setResolvedCache: [Function: setResolvedCache], - getResolvedCache: [Function: getResolvedCache] - }, - set: [Function (anonymous)] - }, - worker: { format: 'iife', plugins: '() => plugins', rollupOptions: {} }, - experimental: { importGlobRestoreExtension: false, hmrPartialAccept: false }, - future: undefined, - dev: { - warmup: [], - sourcemap: { js: true }, - sourcemapIgnoreList: [Function: isInNodeModules$1], - preTransformRequests: false, - createEnvironment: [Function: defaultCreateDevEnvironment], - recoverable: false, - moduleRunnerTransform: false - }, - webSocketToken: 'IkLbtGCeV7Hy', - getSortedPlugins: [Function: getSortedPlugins], - getSortedPluginHooks: [Function: getSortedPluginHooks], - createResolver: [Function: createResolver], - fsDenyGlob: [Function: arrayMatcher], - safeModulePaths: Set(0) {}, - additionalAllowedHosts: [ '0.0.0.0', '0.0.0.0' ] -} -2026-03-01T00:59:41.951Z vite:resolve 1.43ms virtual:vike:global-entry:server -> virtual:vike:global-entry:server -2026-03-01T00:59:41.953Z vite:load 1.80ms [plugin] virtual:vike:global-entry:server -2026-03-01T00:59:41.960Z vite:deps (client) Hash is consistent. Skipping. Use --force to override. -Port 5173 is in use, trying another one... - VITE v6.3.0 ready in 280 ms - ➜ Local: http://localhost:5174/ui - ➜ Network: http://10.97.1.177:5174/ui -2026-03-01T00:59:41.970Z vite:resolve 1.19ms virtual:vike:server:constantsGlobalThis -> virtual:vike:server:constantsGlobalThis -2026-03-01T00:59:41.970Z vite:resolve 1.20ms virtual:vike:page-entry:server:/src/pages/_error -> virtual:vike:page-entry:server:/src/pages/_error -2026-03-01T00:59:41.970Z vite:resolve 1.17ms virtual:vike:page-entry:server:/src/pages/account -> virtual:vike:page-entry:server:/src/pages/account -2026-03-01T00:59:41.970Z vite:resolve 1.09ms virtual:vike:page-entry:server:/src/pages/accounts -> virtual:vike:page-entry:server:/src/pages/accounts -2026-03-01T00:59:41.970Z vite:resolve 1.05ms virtual:vike:page-entry:server:/src/pages/accounts/[id] -> virtual:vike:page-entry:server:/src/pages/accounts/[id] -2026-03-01T00:59:41.970Z vite:resolve 1.00ms virtual:vike:page-entry:server:/src/pages/accounts/new -> virtual:vike:page-entry:server:/src/pages/accounts/new -2026-03-01T00:59:41.970Z vite:resolve 0.97ms virtual:vike:page-entry:server:/src/pages/dashboard -> virtual:vike:page-entry:server:/src/pages/dashboard -2026-03-01T00:59:41.970Z vite:resolve 0.93ms virtual:vike:page-entry:server:/src/pages/index -> virtual:vike:page-entry:server:/src/pages/index -2026-03-01T00:59:41.970Z vite:resolve 0.90ms virtual:vike:page-entry:server:/src/pages/login -> virtual:vike:page-entry:server:/src/pages/login -2026-03-01T00:59:41.970Z vite:resolve 0.88ms virtual:vike:page-entry:server:/src/pages/onboarding -> virtual:vike:page-entry:server:/src/pages/onboarding -2026-03-01T00:59:41.970Z vite:resolve 0.66ms virtual:vike:page-entry:server:/src/pages/realms -> virtual:vike:page-entry:server:/src/pages/realms -2026-03-01T00:59:41.970Z vite:resolve 0.62ms virtual:vike:page-entry:server:/src/pages/realms/[id] -> virtual:vike:page-entry:server:/src/pages/realms/[id] -2026-03-01T00:59:41.970Z vite:resolve 0.59ms virtual:vike:page-entry:server:/src/pages/realms/new -> virtual:vike:page-entry:server:/src/pages/realms/new -2026-03-01T00:59:41.970Z vite:resolve 0.56ms virtual:vike:page-entry:server:/src/pages/runes -> virtual:vike:page-entry:server:/src/pages/runes -2026-03-01T00:59:41.970Z vite:resolve 0.53ms virtual:vike:page-entry:server:/src/pages/runes/[id] -> virtual:vike:page-entry:server:/src/pages/runes/[id] -2026-03-01T00:59:41.970Z vite:resolve 0.50ms virtual:vike:page-entry:server:/src/pages/runes/new -> virtual:vike:page-entry:server:/src/pages/runes/new -2026-03-01T00:59:41.971Z vite:import-analysis 3.28ms [16 imports rewritten] virtual:vike:global-entry:server -2026-03-01T00:59:41.971Z vite:transform 17.34ms virtual:vike:global-entry:server -2026-03-01T00:59:41.979Z vite:load 0.25ms [plugin] virtual:vike:server:constantsGlobalThis -2026-03-01T00:59:41.979Z vite:import-analysis 0.02ms [no imports] virtual:vike:server:constantsGlobalThis -2026-03-01T00:59:41.981Z vite:hmr [file change] .devserver-debug.log -2026-03-01T00:59:41.982Z vite:hmr (client) [no modules matched] .devserver-debug.log -2026-03-01T00:59:41.982Z vite:hmr (ssr) [no modules matched] .devserver-debug.log -2026-03-01T00:59:41.982Z vite:transform 3.58ms virtual:vike:server:constantsGlobalThis diff --git a/bifrost/ui/.devserver.log b/bifrost/ui/.devserver.log deleted file mode 100644 index 70f1c91..0000000 --- a/bifrost/ui/.devserver.log +++ /dev/null @@ -1,11 +0,0 @@ - -> bifrost-ui@0.0.0 dev -> vite --host 0.0.0.0 --port 5173 - - VITE v6.3.0 ready in 276 ms - ➜ Local: http://localhost:5173/ui - ➜ Network: http://10.97.1.177:5173/ui -7:12:13 PM [vike][request-1] HTTP request → /ui -7:12:13 PM [vike][request-1] HTTP response ← /ui 200 -7:12:19 PM [vike][request-2] HTTP request → /ui -7:12:19 PM [vike][request-2] HTTP response ← /ui 200 diff --git a/bifrost/ui/.prettierignore b/bifrost/ui/.prettierignore new file mode 100644 index 0000000..884a232 --- /dev/null +++ b/bifrost/ui/.prettierignore @@ -0,0 +1 @@ +**/dist/** diff --git a/bifrost/ui/index.html b/bifrost/ui/index.html index 052662e..4334b8f 100644 --- a/bifrost/ui/index.html +++ b/bifrost/ui/index.html @@ -1,4 +1,4 @@ - + diff --git a/bifrost/ui/oxlint.config.ts b/bifrost/ui/oxlint.config.ts deleted file mode 100644 index b9f0ace..0000000 --- a/bifrost/ui/oxlint.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { defineConfig } from 'oxlint'; - -export default defineConfig({ - plugins: ['typescript', 'react'], - rules: { - 'no-console': 'warn', - 'no-unused-vars': 'error', - 'react-hooks/exhaustive-deps': 'error', - }, -}); diff --git a/bifrost/ui/package-lock.json b/bifrost/ui/package-lock.json index 125de68..abc81a2 100644 --- a/bifrost/ui/package-lock.json +++ b/bifrost/ui/package-lock.json @@ -8,37 +8,27 @@ "name": "bifrost-ui", "version": "0.0.0", "dependencies": { - "@base-ui/react": "^1.3.0", - "react": "^19.2.4", - "react-dom": "^19.2.4", - "tailwindcss": "^4.2.1", - "vike": "^0.4.255", + "@base-ui/react": "^1.4.1", + "react": "^19.2.6", + "react-dom": "^19.2.6", + "tailwindcss": "^4.3.0", + "vike": "^0.4.259", "vike-react": "^0.6.21" }, "devDependencies": { - "@playwright/test": "^1.58.2", - "@tailwindcss/vite": "^4.2.1", + "@playwright/test": "^1.59.1", + "@tailwindcss/vite": "^4.3.0", "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^5.2.0", - "jsdom": "^28.1.0", - "oxlint": "^1.55.0", - "prettier": "^3.8.1", - "typescript": "^5.9.3", - "vite": "^7.3.1", - "vite-tsconfig-paths": "^6.1.1", - "vitest": "^4.1.0" - } - }, - "node_modules/@acemir/cssom": { - "version": "0.9.31", - "resolved": "https://registry.npmjs.org/@acemir/cssom/-/cssom-0.9.31.tgz", - "integrity": "sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==", - "dev": true, - "license": "MIT" + "@vitejs/plugin-react": "^6.0.1", + "jsdom": "^29.1.1", + "typescript": "^6.0.3", + "vite": "^8.0.11", + "vitest": "^4.1.5" + } }, "node_modules/@adobe/css-tools": { "version": "4.4.4", @@ -48,54 +38,47 @@ "license": "MIT" }, "node_modules/@asamuzakjp/css-color": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.0.1.tgz", - "integrity": "sha512-2SZFvqMyvboVV1d15lMf7XiI3m7SDqXUuKaTymJYLN6dSGadqp+fVojqJlVoMlbZnlTmu3S0TLwLTJpvBMO1Aw==", + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.11.tgz", + "integrity": "sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==", "dev": true, "license": "MIT", "dependencies": { - "@csstools/css-calc": "^3.1.1", - "@csstools/css-color-parser": "^4.0.2", + "@asamuzakjp/generational-cache": "^1.0.1", + "@csstools/css-calc": "^3.2.0", + "@csstools/css-color-parser": "^4.1.0", "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0", - "lru-cache": "^11.2.6" + "@csstools/css-tokenizer": "^4.0.0" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, - "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, "node_modules/@asamuzakjp/dom-selector": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.8.1.tgz", - "integrity": "sha512-MvRz1nCqW0fsy8Qz4dnLIvhOlMzqDVBabZx6lH+YywFDdjXhMY37SmpV1XFX3JzG5GWHn63j6HX6QPr3lZXHvQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.1.1.tgz", + "integrity": "sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==", "dev": true, "license": "MIT", "dependencies": { + "@asamuzakjp/generational-cache": "^1.0.1", "@asamuzakjp/nwsapi": "^2.3.9", "bidi-js": "^1.0.3", - "css-tree": "^3.1.0", - "is-potential-custom-element-name": "^1.0.1", - "lru-cache": "^11.2.6" + "css-tree": "^3.2.1", + "is-potential-custom-element-name": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, - "node_modules/@asamuzakjp/dom-selector/node_modules/lru-cache": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "node_modules/@asamuzakjp/generational-cache": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/generational-cache/-/generational-cache-1.0.1.tgz", + "integrity": "sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "engines": { - "node": "20 || >=22" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, "node_modules/@asamuzakjp/nwsapi": { @@ -229,16 +212,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", @@ -294,42 +267,10 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/runtime": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", - "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -381,16 +322,15 @@ } }, "node_modules/@base-ui/react": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@base-ui/react/-/react-1.3.0.tgz", - "integrity": "sha512-FwpKqZbPz14AITp1CVgf4AjhKPe1OeeVKSBMdgD10zbFlj3QSWelmtCMLi2+/PFZZcIm3l87G7rwtCZJwHyXWA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@base-ui/react/-/react-1.4.1.tgz", + "integrity": "sha512-Ab5/LIhcmL8BQcsBUYiOfkSDRdLpvgUBzMK30cu684JPcLclYlztharvCZyNNgzJtbAiREzI9q0pI5erHCMgCw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.28.6", - "@base-ui/utils": "0.2.6", + "@babel/runtime": "^7.29.2", + "@base-ui/utils": "0.2.8", "@floating-ui/react-dom": "^2.1.8", "@floating-ui/utils": "^0.2.11", - "tabbable": "^6.4.0", "use-sync-external-store": "^1.6.0" }, "engines": { @@ -401,23 +341,31 @@ "url": "https://opencollective.com/mui-org" }, "peerDependencies": { + "@date-fns/tz": "^1.2.0", "@types/react": "^17 || ^18 || ^19", + "date-fns": "^4.0.0", "react": "^17 || ^18 || ^19", "react-dom": "^17 || ^18 || ^19" }, "peerDependenciesMeta": { + "@date-fns/tz": { + "optional": true + }, "@types/react": { "optional": true + }, + "date-fns": { + "optional": true } } }, "node_modules/@base-ui/utils": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@base-ui/utils/-/utils-0.2.6.tgz", - "integrity": "sha512-yQ+qeuqohwhsNpoYDqqXaLllYAkPCP4vYdDrVo8FQXaAPfHWm1pG/Vm+jmGTA5JFS0BAIjookyapuJFY8F9PIw==", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@base-ui/utils/-/utils-0.2.8.tgz", + "integrity": "sha512-jvOi+c+ftGlGotNcKnzPVg2IhCaDTB6/6R3JeqdjdXktuAJi3wKH9T7+svuaKh1mmfVU11UWzUZVH74JDfi/wQ==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.28.6", + "@babel/runtime": "^7.29.2", "@floating-ui/utils": "^0.2.11", "reselect": "^5.1.1", "use-sync-external-store": "^1.6.0" @@ -453,9 +401,9 @@ "license": "MIT" }, "node_modules/@brillout/json-serializer": { - "version": "0.5.22", - "resolved": "https://registry.npmjs.org/@brillout/json-serializer/-/json-serializer-0.5.22.tgz", - "integrity": "sha512-jzcOqcbysKICCeZNlwa755tffF+HfMj8G+ZSuvHe06aCpp4xQiU2D91RHFUeJpF0/RNyfa5uWZ0pRuvFoeoqow==", + "version": "0.5.23", + "resolved": "https://registry.npmjs.org/@brillout/json-serializer/-/json-serializer-0.5.23.tgz", + "integrity": "sha512-nM7okvu4UaoxYshKB+903s3/UpIBdkJl++iDT3gOLnHaSqY6HbhAXTsUTxrroAAcIt6RKQfShaKjCBlzR2A1Gg==", "license": "MIT" }, "node_modules/@brillout/picocolors": { @@ -495,9 +443,9 @@ } }, "node_modules/@csstools/css-calc": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.1.1.tgz", - "integrity": "sha512-HJ26Z/vmsZQqs/o3a6bgKslXGFAungXGbinULZO3eMsOyNJHeBBZfup5FiZInOghgoM4Hwnmw+OgbJCNg1wwUQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.0.tgz", + "integrity": "sha512-bR9e6o2BDB12jzN/gIbjHa5wLJ4UjD1CB9pM7ehlc0ddk6EBz+yYS1EV2MF55/HUxrHcB/hehAyt5vhsA3hx7w==", "dev": true, "funding": [ { @@ -519,9 +467,9 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.0.2.tgz", - "integrity": "sha512-0GEfbBLmTFf0dJlpsNU7zwxRIH0/BGEMuXLTCvFYxuL1tNhqzTbtnFICyJLTNK4a+RechKP75e7w42ClXSnJQw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.0.tgz", + "integrity": "sha512-U0KhLYmy2GVj6q4T3WaAe6NPuFYCPQoE3b0dRGxejWDgcPp8TP7S5rVdM5ZrFaqu4N67X8YaPBw14dQSYx3IyQ==", "dev": true, "funding": [ { @@ -536,7 +484,7 @@ "license": "MIT", "dependencies": { "@csstools/color-helpers": "^6.0.2", - "@csstools/css-calc": "^3.1.1" + "@csstools/css-calc": "^3.2.0" }, "engines": { "node": ">=20.19.0" @@ -570,9 +518,9 @@ } }, "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.0.tgz", - "integrity": "sha512-H4tuz2nhWgNKLt1inYpoVCfbJbMwX/lQKp3g69rrrIMIYlFD9+zTykOKhNR8uGrAmbS/kT9n6hTFkmDkxLgeTA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.3.tgz", + "integrity": "sha512-SH60bMfrRCJF3morcdk57WklujF4Jr/EsQUzqkarfHXEFcAR1gg7fS/chAE922Sehgzc1/+Tz5H3Ypa1HiEKrg==", "dev": true, "funding": [ { @@ -584,7 +532,15 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0" + "license": "MIT-0", + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } + } }, "node_modules/@csstools/css-tokenizer": { "version": "4.0.0", @@ -606,6 +562,37 @@ "node": ">=20.19.0" } }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.27.4", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", @@ -1123,31 +1110,62 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.55.0.tgz", - "integrity": "sha512-NhvgAhncTSOhRahQSCnkK/4YIGPjTmhPurQQ2dwt2IvwCMTvZRW5vF2K10UBOxFve4GZDMw6LtXZdC2qeuYIVQ==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", "license": "MIT", "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.128.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.128.0.tgz", + "integrity": "sha512-huv1Y/LzBJkBVHt3OlC7u0zHBW9qXf1FdD7sGmc1rXc2P1mTwHssYv7jyGx5KAACSCH+9B3Bhn6Z9luHRvf7pQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@playwright/test": { + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.59.1.tgz", + "integrity": "sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.59.1" + }, + "bin": { + "playwright": "cli.js" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=18" } }, - "node_modules/@oxlint/binding-android-arm64": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.55.0.tgz", - "integrity": "sha512-P9iWRh+Ugqhg+D7rkc7boHX8o3H2h7YPcZHQIgvVBgnua5tk4LR2L+IBlreZs58/95cd2x3/004p5VsQM9z4SA==", + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "license": "MIT" + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.18.tgz", + "integrity": "sha512-lIDyUAfD7U3+BWKzdxMbJcsYHuqXqmGz40aeRqvuAm3y5TkJSYTBW2RDrn65DJFPQqVjUAUqq5uz8urzQ8aBdQ==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1157,14 +1175,13 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-darwin-arm64": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.55.0.tgz", - "integrity": "sha512-esakkJIt7WFAhT30P/Qzn96ehFpzdZ1mNuzpOb8SCW7lI4oB8VsyQnkSHREM671jfpuBb/o2ppzBCx5l0jpgMA==", + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.18.tgz", + "integrity": "sha512-apJq2ktnGp27nSInMR5Vcj8kY6xJzDAvfdIFlpDcAK/w4cDO58qVoi1YQsES/SKiFNge/6e4CUzgjfHduYqWpQ==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1174,14 +1191,13 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-darwin-x64": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.55.0.tgz", - "integrity": "sha512-xDMFRCCAEK9fOH6As2z8ELsC+VDGSFRHwIKVSilw+xhgLwTDFu37rtmRbmUlx8rRGS6cWKQPTc47AVxAZEVVPQ==", + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.18.tgz", + "integrity": "sha512-5Ofot8xbs+pxRHJqm9/9N/4sTQOvdrwEsmPE9pdLEEoAbdZtG6F2LMDfO1sp6ZAtXJuJV/21ew2srq3W8NXB5g==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1191,14 +1207,13 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-freebsd-x64": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.55.0.tgz", - "integrity": "sha512-mYZqnwUD7ALCRxGenyLd1uuG+rHCL+OTT6S8FcAbVm/ZT2AZMGjvibp3F6k1SKOb2aeqFATmwRykrE41Q0GWVw==", + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.18.tgz", + "integrity": "sha512-7h8eeOTT1eyqJyx64BFCnWZpNm486hGWt2sqeLLgDxA0xI1oGZ9H7gK1S85uNGmBhkdPwa/6reTxfFFKvIsebw==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1208,31 +1223,13 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-linux-arm-gnueabihf": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.55.0.tgz", - "integrity": "sha512-LcX6RYcF9vL9ESGwJW3yyIZ/d/ouzdOKXxCdey1q0XJOW1asrHsIg5MmyKdEBR4plQx+shvYeQne7AzW5f3T1w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-arm-musleabihf": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.55.0.tgz", - "integrity": "sha512-C+8GS1rPtK+dI7mJFkqoRBkDuqbrNihnyYQsJPS9ez+8zF9JzfvU19lawqt4l/Y23o5uQswE/DORa8aiXUih3w==", + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.18.tgz", + "integrity": "sha512-eRcm/HVt9U/JFu5RKAEKwGQYtDCKWLiaH6wOnsSEp6NMBb/3Os8LgHZlNyzMpFVNmiiMFlfb2zEnebfzJrHFmg==", "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1242,14 +1239,16 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-linux-arm64-gnu": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.55.0.tgz", - "integrity": "sha512-ErLE4XbmcCopA4/CIDiH6J1IAaDOMnf/KSx/aFObs4/OjAAM3sFKWGZ57pNOMxhhyBdcmcXwYymph9GwcpcqgQ==", + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.18.tgz", + "integrity": "sha512-SOrT/cT4ukTmgnrEz/Hg3m7LBnuCLW9psDeMKrimRWY4I8DmnO7Lco8W2vtqPmMkbVu8iJ+g4GFLVLLOVjJ9DQ==", "cpu": [ "arm64" ], - "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1259,31 +1258,16 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-linux-arm64-musl": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.55.0.tgz", - "integrity": "sha512-/kp65avi6zZfqEng56TTuhiy3P/3pgklKIdf38yvYeJ9/PgEeRA2A2AqKAKbZBNAqUzrzHhz9jF6j/PZvhJzTQ==", + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.18.tgz", + "integrity": "sha512-QWjdxN1HJCpBTAcZ5N5F7wju3gVPzRzSpmGzx7na0c/1qpN9CFil+xt+l9lV/1M6/gqHSNXCiqPfwhVJPeLnug==", "cpu": [ "arm64" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" + "libc": [ + "musl" ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-ppc64-gnu": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.55.0.tgz", - "integrity": "sha512-A6pTdXwcEEwL/nmz0eUJ6WxmxcoIS+97GbH96gikAyre3s5deC7sts38ZVVowjS2QQFuSWkpA4ZmQC0jZSNvJQ==", - "cpu": [ - "ppc64" - ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1293,31 +1277,16 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-linux-riscv64-gnu": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.55.0.tgz", - "integrity": "sha512-clj0lnIN+V52G9tdtZl0LbdTSurnZ1NZj92Je5X4lC7gP5jiCSW+Y/oiDiSauBAD4wrHt2S7nN3pA0zfKYK/6Q==", + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.18.tgz", + "integrity": "sha512-ugCOyj7a4d9h3q9B+wXmf6g3a68UsjGh6dob5DHevHGMwDUbhsYNbSPxJsENcIttJZ9jv7qGM2UesLw5jqIhdg==", "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" + "ppc64" ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxlint/binding-linux-riscv64-musl": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.55.0.tgz", - "integrity": "sha512-NNu08pllN5x/O94/sgR3DA8lbrGBnTHsINZZR0hcav1sj79ksTiKKm1mRzvZvacwQ0hUnGinFo+JO75ok2PxYg==", - "cpu": [ - "riscv64" + "libc": [ + "glibc" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1327,14 +1296,16 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-linux-s390x-gnu": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.55.0.tgz", - "integrity": "sha512-BvfQz3PRlWZRoEZ17dZCqgQsMRdpzGZomJkVATwCIGhHVVeHJMQdmdXPSjcT1DCNUrOjXnVyj1RGDj5+/Je2+Q==", + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.18.tgz", + "integrity": "sha512-kKWRhbsotpXkGbcd5dllUWg5gEXcDAa8u5YnP9AV5DYNbvJHGzzuwv7dpmhc8NqKMJldl0a+x76IHbspEpEmdA==", "cpu": [ "s390x" ], - "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1344,14 +1315,16 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-linux-x64-gnu": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.55.0.tgz", - "integrity": "sha512-ngSOoFCSBMKVQd24H8zkbcBNc7EHhjnF1sv3mC9NNXQ/4rRjI/4Dj9+9XoDZeFEkF1SX1COSBXF1b2Pr9rqdEw==", + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.18.tgz", + "integrity": "sha512-uCo8ElcCIAMyYAZyuIZ81oFkhTSIllNvUCHCAlbhlN4ji3uC28h7IIdlXyIvGO7HsuqnV9p3rD/bpH7XhIyhRw==", "cpu": [ "x64" ], - "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1361,14 +1334,16 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-linux-x64-musl": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.55.0.tgz", - "integrity": "sha512-BDpP7W8GlaG7BR6QjGZAleYzxoyKc/D24spZIF2mB3XsfALQJJT/OBmP8YpeTb1rveFSBHzl8T7l0aqwkWNdGA==", + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.18.tgz", + "integrity": "sha512-XNOQZtuE6yUIvx4rwGemwh8kpL1xvU41FXy/s9K7T/3JVcqGzo3NfKM2HrbrGgfPYGFW42f07Wk++aOC6B9NWA==", "cpu": [ "x64" ], - "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -1378,14 +1353,13 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-openharmony-arm64": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.55.0.tgz", - "integrity": "sha512-PS6GFvmde/pc3fCA2Srt51glr8Lcxhpf6WIBFfLphndjRrD34NEcses4TSxQrEcxYo6qVywGfylM0ZhSCF2gGA==", + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.18.tgz", + "integrity": "sha512-tSn/kzrfa7tNOXr7sEacDBN4YsIqTyLqh45IO0nHDwtpKIDNDJr+VFojt+4klSpChxB29JLyduSsE0MKEwa65A==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1395,31 +1369,31 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-win32-arm64-msvc": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.55.0.tgz", - "integrity": "sha512-P6JcLJGs/q1UOvDLzN8otd9JsH4tsuuPDv+p7aHqHM3PrKmYdmUvkNj4K327PTd35AYcznOCN+l4ZOaq76QzSw==", + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.18.tgz", + "integrity": "sha512-+J9YGmc+czgqlhYmwun3S3O0FIZhsH8ep2456xwjAdIOmuJxM7xz4P4PtrxU+Bz17a/5bqPA8o3HAAoX0teUdg==", "cpu": [ - "arm64" + "wasm32" ], - "dev": true, "license": "MIT", "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-win32-ia32-msvc": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.55.0.tgz", - "integrity": "sha512-gzkk4zE2zsE+WmRxFOiAZHpCpUNDFytEakqNXoNHW+PnYEOTPKDdW6nrzgSeTbGKVPXNAKQnRnMgrh7+n3Xueg==", + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.18.tgz", + "integrity": "sha512-zsu47DgU0FQzSwi6sU9dZoEdUv7pc1AptSEz/Z8HBg54sV0Pbs3N0+CrIbTsgiu6EyoaNN9CHboqbLaz9lhOyQ==", "cpu": [ - "ia32" + "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1429,14 +1403,13 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@oxlint/binding-win32-x64-msvc": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.55.0.tgz", - "integrity": "sha512-ZFALNow2/og75gvYzNP7qe+rREQ5xunktwA+lgykoozHZ6hw9bqg4fn5j2UvG4gIn1FXqrZHkOAXuPf5+GOYTQ==", + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.18.tgz", + "integrity": "sha512-7H+3yqGgmnlDTRRhw/xpYY9J1kf4GC681nVc4GqKhExZTDrVVrV2tsOR9kso0fvgBdcTCcQShx4SLLoHgaLwhg==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1446,360 +1419,13 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@playwright/test": { - "version": "1.58.2", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.2.tgz", - "integrity": "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "playwright": "1.58.2" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "license": "MIT" - }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", - "integrity": "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==", + "version": "1.0.0-rc.7", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz", + "integrity": "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==", "dev": true, "license": "MIT" }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", - "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", - "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", - "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", - "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", - "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", - "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", - "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", - "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", - "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", - "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", - "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", - "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", - "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", - "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", - "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", - "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", - "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", - "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", - "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", - "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", - "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", - "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", - "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", - "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", - "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@standard-schema/spec": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", @@ -1808,49 +1434,49 @@ "license": "MIT" }, "node_modules/@tailwindcss/node": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.1.tgz", - "integrity": "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.0.tgz", + "integrity": "sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/remapping": "^2.3.5", - "enhanced-resolve": "^5.19.0", + "enhanced-resolve": "^5.21.0", "jiti": "^2.6.1", - "lightningcss": "1.31.1", + "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", - "tailwindcss": "4.2.1" + "tailwindcss": "4.3.0" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.1.tgz", - "integrity": "sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.0.tgz", + "integrity": "sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==", "dev": true, "license": "MIT", "engines": { "node": ">= 20" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.2.1", - "@tailwindcss/oxide-darwin-arm64": "4.2.1", - "@tailwindcss/oxide-darwin-x64": "4.2.1", - "@tailwindcss/oxide-freebsd-x64": "4.2.1", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.1", - "@tailwindcss/oxide-linux-arm64-gnu": "4.2.1", - "@tailwindcss/oxide-linux-arm64-musl": "4.2.1", - "@tailwindcss/oxide-linux-x64-gnu": "4.2.1", - "@tailwindcss/oxide-linux-x64-musl": "4.2.1", - "@tailwindcss/oxide-wasm32-wasi": "4.2.1", - "@tailwindcss/oxide-win32-arm64-msvc": "4.2.1", - "@tailwindcss/oxide-win32-x64-msvc": "4.2.1" + "@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" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.1.tgz", - "integrity": "sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.0.tgz", + "integrity": "sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==", "cpu": [ "arm64" ], @@ -1865,9 +1491,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.1.tgz", - "integrity": "sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.0.tgz", + "integrity": "sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==", "cpu": [ "arm64" ], @@ -1882,9 +1508,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.1.tgz", - "integrity": "sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.0.tgz", + "integrity": "sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==", "cpu": [ "x64" ], @@ -1899,9 +1525,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.1.tgz", - "integrity": "sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.0.tgz", + "integrity": "sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==", "cpu": [ "x64" ], @@ -1916,9 +1542,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.1.tgz", - "integrity": "sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.0.tgz", + "integrity": "sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==", "cpu": [ "arm" ], @@ -1933,13 +1559,16 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.1.tgz", - "integrity": "sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.0.tgz", + "integrity": "sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1950,13 +1579,16 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.1.tgz", - "integrity": "sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.0.tgz", + "integrity": "sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -1967,13 +1599,16 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.1.tgz", - "integrity": "sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.0.tgz", + "integrity": "sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1984,13 +1619,16 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.1.tgz", - "integrity": "sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.0.tgz", + "integrity": "sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2001,9 +1639,9 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.1.tgz", - "integrity": "sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.0.tgz", + "integrity": "sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==", "bundleDependencies": [ "@napi-rs/wasm-runtime", "@emnapi/core", @@ -2019,10 +1657,10 @@ "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "^1.8.1", - "@emnapi/runtime": "^1.8.1", - "@emnapi/wasi-threads": "^1.1.0", - "@napi-rs/wasm-runtime": "^1.1.1", + "@emnapi/core": "^1.10.0", + "@emnapi/runtime": "^1.10.0", + "@emnapi/wasi-threads": "^1.2.1", + "@napi-rs/wasm-runtime": "^1.1.4", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.8.1" }, @@ -2031,9 +1669,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.1.tgz", - "integrity": "sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.0.tgz", + "integrity": "sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==", "cpu": [ "arm64" ], @@ -2048,9 +1686,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.1.tgz", - "integrity": "sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.0.tgz", + "integrity": "sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==", "cpu": [ "x64" ], @@ -2065,18 +1703,18 @@ } }, "node_modules/@tailwindcss/vite": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.1.tgz", - "integrity": "sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.0.tgz", + "integrity": "sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw==", "dev": true, "license": "MIT", "dependencies": { - "@tailwindcss/node": "4.2.1", - "@tailwindcss/oxide": "4.2.1", - "tailwindcss": "4.2.1" + "@tailwindcss/node": "4.3.0", + "@tailwindcss/oxide": "4.3.0", + "tailwindcss": "4.3.0" }, "peerDependencies": { - "vite": "^5.2.0 || ^6 || ^7" + "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "node_modules/@testing-library/dom": { @@ -2143,68 +1781,33 @@ "@types/react": "^18.0.0 || ^19.0.0", "@types/react-dom": "^18.0.0 || ^19.0.0", "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", "license": "MIT", + "optional": true, "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "tslib": "^2.4.0" } }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } + "license": "MIT" }, "node_modules/@types/chai": { "version": "5.2.3", @@ -2225,9 +1828,10 @@ "license": "MIT" }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, "license": "MIT" }, "node_modules/@types/react": { @@ -2250,53 +1854,198 @@ "@types/react": "^19.2.0" } }, + "node_modules/@universal-deploy/netlify": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@universal-deploy/netlify/-/netlify-0.2.2.tgz", + "integrity": "sha512-10JY+1z0aun66IegHhVdOBTgXioI0+hgA0IVc0zgZvm2C7g2eQWpv48wtqCZZsXyUxajKcIlxiYxIuhuRIdfrQ==", + "license": "MIT", + "dependencies": { + "@universal-deploy/store": "^0.2.1" + }, + "peerDependencies": { + "vite": ">=7.1" + } + }, + "node_modules/@universal-deploy/node": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@universal-deploy/node/-/node-0.1.6.tgz", + "integrity": "sha512-VcYUNiE596Mbm0fCX1TWK6fAXgJgOz4Msa+PORxZCPZrTLw+qDABeE031XWSfQ8bAF9d/DXtGywIA/RAi8oCXg==", + "license": "MIT", + "dependencies": { + "@universal-deploy/store": "^0.2.1", + "magic-string": "^0.30.21", + "srvx": "^0.11.9" + }, + "peerDependencies": { + "vite": ">=7.1" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/@universal-deploy/store": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@universal-deploy/store/-/store-0.2.1.tgz", + "integrity": "sha512-9CYaStacvufXAaVmaf8dxEVptqpcX5m9+vz1PIlN4gjYKlXfOdbZTuhv2xLwp3mj4jBR2/8VYdF5Vviw9cBYEA==", + "license": "MIT", + "dependencies": { + "rou3": "^0.8.1", + "srvx": "*" + }, + "peerDependencies": { + "srvx": "*" + }, + "peerDependenciesMeta": { + "srvx": { + "optional": true + } + } + }, + "node_modules/@universal-deploy/vite": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@universal-deploy/vite/-/vite-0.1.9.tgz", + "integrity": "sha512-wKf9aP/3OJwr08JmWMa4ot69L+tA/61VzhqE1uh/YqXXl8HXugQPF11RcOIQRCgpRLvO2QDLLNNJ7K1LLxLu1A==", + "license": "MIT", + "dependencies": { + "@universal-deploy/netlify": "^0.2.2", + "@universal-deploy/node": "^0.1.6", + "@universal-deploy/store": "^0.2.1", + "@universal-middleware/express": "^0.4.26", + "magic-string": "^0.30.21", + "rou3": "^0.8.1" + }, + "peerDependencies": { + "vite": ">=7.1" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/@universal-middleware/core": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/@universal-middleware/core/-/core-0.4.17.tgz", + "integrity": "sha512-q+/nXW9DQ94RtmlghC57DhwEvjrqxX57EtU40iaM3U+eYTKc+FVnEdlpdrYX8kCAdEU7zVBLBlFgJre+VrXoUg==", + "license": "MIT", + "dependencies": { + "regexparam": "^3.0.0", + "tough-cookie": "^6.0.0" + }, + "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 + } + } + }, + "node_modules/@universal-middleware/express": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/@universal-middleware/express/-/express-0.4.26.tgz", + "integrity": "sha512-zPtCWn4/kObx+Rd7UMpqjb1VP9qDzJEeb/oeN96nZv2b+wHvF9KKck9tftziuzeUYazjYrQ+Ug+aKVC6C7ndUw==", + "license": "MIT", + "dependencies": { + "@universal-middleware/core": "^0.4.17", + "@universal-middleware/node": "^0.1.0" + } + }, + "node_modules/@universal-middleware/node": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@universal-middleware/node/-/node-0.1.0.tgz", + "integrity": "sha512-I03mkOhw0Ka28MtALkpoGJYE8YYSJxmq/iambaqKGXxlFXgLI/VXlw0LmX9iansUzbolNq4hWFMfHyNp2xb4jA==", + "license": "MIT", + "dependencies": { + "@universal-middleware/core": "^0.4.17" + } + }, "node_modules/@vitejs/plugin-react": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.2.0.tgz", - "integrity": "sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz", + "integrity": "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.29.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-rc.3", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.18.0" + "@rolldown/pluginutils": "1.0.0-rc.7" }, "engines": { "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } } }, "node_modules/@vitest/expect": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.0.tgz", - "integrity": "sha512-EIxG7k4wlWweuCLG9Y5InKFwpMEOyrMb6ZJ1ihYu02LVj/bzUwn2VMU+13PinsjRW75XnITeFrQBMH5+dLvCDA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.5.tgz", + "integrity": "sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==", "dev": true, "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.0", - "@vitest/utils": "4.1.0", + "@vitest/spy": "4.1.5", + "@vitest/utils": "4.1.5", "chai": "^6.2.2", - "tinyrainbow": "^3.0.3" + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/mocker": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.0.tgz", - "integrity": "sha512-evxREh+Hork43+Y4IOhTo+h5lGmVRyjqI739Rz4RlUPqwrkFFDF6EMvOOYjTx4E8Tl6gyCLRL8Mu7Ry12a13Tw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.5.tgz", + "integrity": "sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.1.0", + "@vitest/spy": "4.1.5", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -2305,7 +2054,7 @@ }, "peerDependencies": { "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "msw": { @@ -2317,26 +2066,26 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.0.tgz", - "integrity": "sha512-3RZLZlh88Ib0J7NQTRATfc/3ZPOnSUn2uDBUoGNn5T36+bALixmzphN26OUD3LRXWkJu4H0s5vvUeqBiw+kS0A==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.5.tgz", + "integrity": "sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==", "dev": true, "license": "MIT", "dependencies": { - "tinyrainbow": "^3.0.3" + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/runner": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.0.tgz", - "integrity": "sha512-Duvx2OzQ7d6OjchL+trw+aSrb9idh7pnNfxrklo14p3zmNL4qPCDeIJAK+eBKYjkIwG96Bc6vYuxhqDXQOWpoQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.5.tgz", + "integrity": "sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.1.0", + "@vitest/utils": "4.1.5", "pathe": "^2.0.3" }, "funding": { @@ -2344,14 +2093,14 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.0.tgz", - "integrity": "sha512-0Vy9euT1kgsnj1CHttwi9i9o+4rRLEaPRSOJ5gyv579GJkNpgJK+B4HSv/rAWixx2wdAFci1X4CEPjiu2bXIMg==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.5.tgz", + "integrity": "sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.0", - "@vitest/utils": "4.1.0", + "@vitest/pretty-format": "4.1.5", + "@vitest/utils": "4.1.5", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -2360,9 +2109,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.0.tgz", - "integrity": "sha512-pz77k+PgNpyMDv2FV6qmk5ZVau6c3R8HC8v342T2xlFxQKTrSeYw9waIJG8KgV9fFwAtTu4ceRzMivPTH6wSxw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.5.tgz", + "integrity": "sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==", "dev": true, "license": "MIT", "funding": { @@ -2370,30 +2119,20 @@ } }, "node_modules/@vitest/utils": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.0.tgz", - "integrity": "sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.5.tgz", + "integrity": "sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.0", + "@vitest/pretty-format": "4.1.5", "convert-source-map": "^2.0.0", - "tinyrainbow": "^3.0.3" + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -2537,6 +2276,12 @@ "node": ">=18" } }, + "node_modules/convert-route": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/convert-route/-/convert-route-1.1.1.tgz", + "integrity": "sha512-FENJ90K52uyE/qpbjy0i0gbglgKaL50BweqXx2OPaSG/pby2woRrnAdSVcGCdFFVvb/u/UTGqKybohiqcFWCMQ==", + "license": "MIT" + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -2564,32 +2309,6 @@ "dev": true, "license": "MIT" }, - "node_modules/cssstyle": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-6.2.0.tgz", - "integrity": "sha512-Fm5NvhYathRnXNVndkUsCCuR63DCLVVwGOOwQw782coXFi5HhkXdu289l59HlXZBawsyNccXfWRYvLzcDCdDig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@asamuzakjp/css-color": "^5.0.1", - "@csstools/css-syntax-patches-for-csstree": "^1.0.28", - "css-tree": "^3.1.0", - "lru-cache": "^11.2.6" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/cssstyle/node_modules/lru-cache": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", @@ -2649,7 +2368,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "devOptional": true, "license": "Apache-2.0", "engines": { "node": ">=8" @@ -2669,27 +2387,27 @@ "license": "ISC" }, "node_modules/enhanced-resolve": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz", - "integrity": "sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==", + "version": "5.21.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.2.tgz", + "integrity": "sha512-xe9vQb5kReirPUxgQrXA3ihgbCqssmTiM7cOZ+Gzu+VeGWgpV98lLZvp0dl4yriyAePcewxGUs9UpKD8PET9KQ==", "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.3.0" + "tapable": "^2.3.3" }, "engines": { "node": ">=10.13.0" } }, "node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", "dev": true, "license": "BSD-2-Clause", "engines": { - "node": ">=0.12" + "node": ">=20.19.0" }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" @@ -2792,6 +2510,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -2811,13 +2530,6 @@ "node": ">=6.9.0" } }, - "node_modules/globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true, - "license": "MIT" - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -2838,34 +2550,6 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -2909,36 +2593,36 @@ "license": "MIT" }, "node_modules/jsdom": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-28.1.0.tgz", - "integrity": "sha512-0+MoQNYyr2rBHqO1xilltfDjV9G7ymYGlAUazgcDLQaUf8JDHbuGwsxN6U9qWaElZ4w1B2r7yEGIL3GdeW3Rug==", + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.1.1.tgz", + "integrity": "sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==", "dev": true, "license": "MIT", "dependencies": { - "@acemir/cssom": "^0.9.31", - "@asamuzakjp/dom-selector": "^6.8.1", + "@asamuzakjp/css-color": "^5.1.11", + "@asamuzakjp/dom-selector": "^7.1.1", "@bramus/specificity": "^2.4.2", - "@exodus/bytes": "^1.11.0", - "cssstyle": "^6.0.1", + "@csstools/css-syntax-patches-for-csstree": "^1.1.3", + "@exodus/bytes": "^1.15.0", + "css-tree": "^3.2.1", "data-urls": "^7.0.0", "decimal.js": "^10.6.0", "html-encoding-sniffer": "^6.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.6", "is-potential-custom-element-name": "^1.0.1", - "parse5": "^8.0.0", + "lru-cache": "^11.3.5", + "parse5": "^8.0.1", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^6.0.0", - "undici": "^7.21.0", + "tough-cookie": "^6.0.1", + "undici": "^7.25.0", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^8.0.1", "whatwg-mimetype": "^5.0.0", - "whatwg-url": "^16.0.0", + "whatwg-url": "^16.0.1", "xml-name-validator": "^5.0.0" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" }, "peerDependencies": { "canvas": "^3.0.0" @@ -2949,6 +2633,16 @@ } } }, + "node_modules/jsdom/node_modules/lru-cache": { + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.6.tgz", + "integrity": "sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -2974,10 +2668,9 @@ } }, "node_modules/lightningcss": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", - "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", - "devOptional": true, + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", "license": "MPL-2.0", "dependencies": { "detect-libc": "^2.0.3" @@ -2990,23 +2683,23 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-android-arm64": "1.31.1", - "lightningcss-darwin-arm64": "1.31.1", - "lightningcss-darwin-x64": "1.31.1", - "lightningcss-freebsd-x64": "1.31.1", - "lightningcss-linux-arm-gnueabihf": "1.31.1", - "lightningcss-linux-arm64-gnu": "1.31.1", - "lightningcss-linux-arm64-musl": "1.31.1", - "lightningcss-linux-x64-gnu": "1.31.1", - "lightningcss-linux-x64-musl": "1.31.1", - "lightningcss-win32-arm64-msvc": "1.31.1", - "lightningcss-win32-x64-msvc": "1.31.1" + "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" } }, "node_modules/lightningcss-android-arm64": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", - "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", "cpu": [ "arm64" ], @@ -3024,9 +2717,9 @@ } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", - "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", "cpu": [ "arm64" ], @@ -3044,9 +2737,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", - "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", "cpu": [ "x64" ], @@ -3064,9 +2757,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", - "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", "cpu": [ "x64" ], @@ -3084,9 +2777,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", - "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", "cpu": [ "arm" ], @@ -3104,12 +2797,15 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", - "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", "cpu": [ "arm64" ], + "libc": [ + "glibc" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -3124,12 +2820,15 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", - "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", "cpu": [ "arm64" ], + "libc": [ + "musl" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -3144,12 +2843,15 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", - "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", "cpu": [ "x64" ], + "libc": [ + "glibc" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -3164,12 +2866,15 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", - "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", "cpu": [ "x64" ], + "libc": [ + "musl" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -3184,9 +2889,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", - "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", "cpu": [ "arm64" ], @@ -3204,9 +2909,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", - "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", "cpu": [ "x64" ], @@ -3284,9 +2989,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -3318,59 +3023,14 @@ ], "license": "MIT" }, - "node_modules/oxlint": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.55.0.tgz", - "integrity": "sha512-T+FjepiyWpaZMhekqRpH8Z3I4vNM610p6w+Vjfqgj5TZUxHXl7N8N5IPvmOU8U4XdTRxqtNNTh9Y4hLtr7yvFg==", - "dev": true, - "license": "MIT", - "bin": { - "oxlint": "bin/oxlint" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/Boshen" - }, - "optionalDependencies": { - "@oxlint/binding-android-arm-eabi": "1.55.0", - "@oxlint/binding-android-arm64": "1.55.0", - "@oxlint/binding-darwin-arm64": "1.55.0", - "@oxlint/binding-darwin-x64": "1.55.0", - "@oxlint/binding-freebsd-x64": "1.55.0", - "@oxlint/binding-linux-arm-gnueabihf": "1.55.0", - "@oxlint/binding-linux-arm-musleabihf": "1.55.0", - "@oxlint/binding-linux-arm64-gnu": "1.55.0", - "@oxlint/binding-linux-arm64-musl": "1.55.0", - "@oxlint/binding-linux-ppc64-gnu": "1.55.0", - "@oxlint/binding-linux-riscv64-gnu": "1.55.0", - "@oxlint/binding-linux-riscv64-musl": "1.55.0", - "@oxlint/binding-linux-s390x-gnu": "1.55.0", - "@oxlint/binding-linux-x64-gnu": "1.55.0", - "@oxlint/binding-linux-x64-musl": "1.55.0", - "@oxlint/binding-openharmony-arm64": "1.55.0", - "@oxlint/binding-win32-arm64-msvc": "1.55.0", - "@oxlint/binding-win32-ia32-msvc": "1.55.0", - "@oxlint/binding-win32-x64-msvc": "1.55.0" - }, - "peerDependencies": { - "oxlint-tsgolint": ">=0.15.0" - }, - "peerDependenciesMeta": { - "oxlint-tsgolint": { - "optional": true - } - } - }, "node_modules/parse5": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", - "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", "dev": true, "license": "MIT", "dependencies": { - "entities": "^6.0.0" + "entities": "^8.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -3390,9 +3050,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", "engines": { "node": ">=12" @@ -3402,13 +3062,13 @@ } }, "node_modules/playwright": { - "version": "1.58.2", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", - "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.1.tgz", + "integrity": "sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.2" + "playwright-core": "1.59.1" }, "bin": { "playwright": "cli.js" @@ -3421,9 +3081,9 @@ } }, "node_modules/playwright-core": { - "version": "1.58.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", - "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz", + "integrity": "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -3434,9 +3094,9 @@ } }, "node_modules/postcss": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", - "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", + "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", "funding": [ { "type": "opencollective", @@ -3461,22 +3121,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/prettier": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, "node_modules/pretty-format": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", @@ -3503,24 +3147,24 @@ } }, "node_modules/react": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", - "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz", + "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.6.tgz", + "integrity": "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.4" + "react": "^19.2.6" } }, "node_modules/react-is": { @@ -3530,16 +3174,6 @@ "dev": true, "license": "MIT" }, - "node_modules/react-refresh": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", - "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/react-streaming": { "version": "0.4.16", "resolved": "https://registry.npmjs.org/react-streaming/-/react-streaming-0.4.16.tgz", @@ -3570,6 +3204,15 @@ "node": ">=8" } }, + "node_modules/regexparam": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-3.0.0.tgz", + "integrity": "sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -3586,49 +3229,50 @@ "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", "license": "MIT" }, - "node_modules/rollup": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", - "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "node_modules/rolldown": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.18.tgz", + "integrity": "sha512-phmyKBpuBdRYDf4hgyynGAYn/rDDe+iZXKVJ7WX5b1zQzpLkP5oJRPGsfJuHdzPMlyyEO/4sPW6yfSx2gf7lVg==", "license": "MIT", "dependencies": { - "@types/estree": "1.0.8" + "@oxc-project/types": "=0.128.0", + "@rolldown/pluginutils": "1.0.0-rc.18" }, "bin": { - "rollup": "dist/bin/rollup" + "rolldown": "bin/cli.mjs" }, "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" + "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.59.0", - "@rollup/rollup-android-arm64": "4.59.0", - "@rollup/rollup-darwin-arm64": "4.59.0", - "@rollup/rollup-darwin-x64": "4.59.0", - "@rollup/rollup-freebsd-arm64": "4.59.0", - "@rollup/rollup-freebsd-x64": "4.59.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", - "@rollup/rollup-linux-arm-musleabihf": "4.59.0", - "@rollup/rollup-linux-arm64-gnu": "4.59.0", - "@rollup/rollup-linux-arm64-musl": "4.59.0", - "@rollup/rollup-linux-loong64-gnu": "4.59.0", - "@rollup/rollup-linux-loong64-musl": "4.59.0", - "@rollup/rollup-linux-ppc64-gnu": "4.59.0", - "@rollup/rollup-linux-ppc64-musl": "4.59.0", - "@rollup/rollup-linux-riscv64-gnu": "4.59.0", - "@rollup/rollup-linux-riscv64-musl": "4.59.0", - "@rollup/rollup-linux-s390x-gnu": "4.59.0", - "@rollup/rollup-linux-x64-gnu": "4.59.0", - "@rollup/rollup-linux-x64-musl": "4.59.0", - "@rollup/rollup-openbsd-x64": "4.59.0", - "@rollup/rollup-openharmony-arm64": "4.59.0", - "@rollup/rollup-win32-arm64-msvc": "4.59.0", - "@rollup/rollup-win32-ia32-msvc": "4.59.0", - "@rollup/rollup-win32-x64-gnu": "4.59.0", - "@rollup/rollup-win32-x64-msvc": "4.59.0", - "fsevents": "~2.3.2" - } + "@rolldown/binding-android-arm64": "1.0.0-rc.18", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.18", + "@rolldown/binding-darwin-x64": "1.0.0-rc.18", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.18", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.18", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.18", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.18", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.18", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.18", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.18", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.18", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.18", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.18", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.18", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.18" + } + }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.18.tgz", + "integrity": "sha512-CUY5Mnhe64xQBGZEEXQ5WyZwsc1JU3vAZLIxtrsBt3LO6UOb+C8GunVKqe9sT8NeWb4lqSaoJtp2xo6GxT1MNw==", + "license": "MIT" + }, + "node_modules/rou3": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/rou3/-/rou3-0.8.1.tgz", + "integrity": "sha512-ePa+XGk00/3HuCqrEnK3LxJW7I0SdNg6EFzKUJG73hMAdDcOUC/i/aSz7LSDwLrGr33kal/rqOGydzwl6U7zBA==", + "license": "MIT" }, "node_modules/saxes": { "version": "6.0.0", @@ -3707,6 +3351,18 @@ "source-map": "^0.6.0" } }, + "node_modules/srvx": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/srvx/-/srvx-0.11.15.tgz", + "integrity": "sha512-iXsux0UcOjdvs0LCMa2Ws3WwcDUozA3JN3BquNXkaFPP7TpRqgunKdEgoZ/uwb1J6xaYHfxtz9Twlh6yzwM6Tg==", + "license": "MIT", + "bin": { + "srvx": "bin/srvx.mjs" + }, + "engines": { + "node": ">=20.16.0" + } + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -3741,22 +3397,16 @@ "dev": true, "license": "MIT" }, - "node_modules/tabbable": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", - "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", - "license": "MIT" - }, "node_modules/tailwindcss": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.1.tgz", - "integrity": "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz", + "integrity": "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==", "license": "MIT" }, "node_modules/tapable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", "dev": true, "license": "MIT", "engines": { @@ -3785,13 +3435,13 @@ } }, "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", "license": "MIT", "dependencies": { "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "picomatch": "^4.0.4" }, "engines": { "node": ">=12.0.0" @@ -3814,7 +3464,6 @@ "version": "7.0.25", "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.25.tgz", "integrity": "sha512-keinCnPbwXEUG3ilrWQZU+CqcTTzHq9m2HhoUP2l7Xmi8l1LuijAXLpAJ5zRW+ifKTNscs4NdCkfkDCBYm352w==", - "dev": true, "license": "MIT", "dependencies": { "tldts-core": "^7.0.25" @@ -3827,7 +3476,6 @@ "version": "7.0.25", "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.25.tgz", "integrity": "sha512-ZjCZK0rppSBu7rjHYDYsEaMOIbbT+nWF57hKkv4IUmZWBNrBWBOjIElc0mKRgLM8bm7x/BBlof6t2gi/Oq/Asw==", - "dev": true, "license": "MIT" }, "node_modules/totalist": { @@ -3843,7 +3491,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", - "dev": true, "license": "BSD-3-Clause", "dependencies": { "tldts": "^7.0.5" @@ -3865,31 +3512,17 @@ "node": ">=20" } }, - "node_modules/tsconfck": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", - "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", - "dev": true, - "license": "MIT", - "bin": { - "tsconfck": "bin/tsconfck.js" - }, - "engines": { - "node": "^18 || >=20" - }, - "peerDependencies": { - "typescript": "^5.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true }, "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -3901,9 +3534,9 @@ } }, "node_modules/undici": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.1.tgz", - "integrity": "sha512-5xoBibbmnjlcR3jdqtY2Lnx7WbrD/tHlT01TmvqZUFVc9Q1w4+j5hbnapTqbcXITMH1ovjq/W7BkqBilHiVAaA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.25.0.tgz", + "integrity": "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==", "dev": true, "license": "MIT", "engines": { @@ -3950,28 +3583,34 @@ } }, "node_modules/vike": { - "version": "0.4.255", - "resolved": "https://registry.npmjs.org/vike/-/vike-0.4.255.tgz", - "integrity": "sha512-pVRovPzIcxPiSg1nkkHg0+PGDc+qMupHw/xgWCvmJHhHO0qfuQ6UgiMq+OdEKB9q64NJJ6uuDXDtpVgvmYUu3w==", + "version": "0.4.259", + "resolved": "https://registry.npmjs.org/vike/-/vike-0.4.259.tgz", + "integrity": "sha512-5S+rgfLYfozCqXTlyZzr6P4FXOIoPcsSbqYO32keBK2Jun4AKR5BI/sQiP3w09Zq/WZkywEu0ofHFAAxtaIdSg==", "license": "MIT", "dependencies": { "@babel/core": "^7.28.5", "@babel/types": "^7.28.5", "@brillout/import": "^0.2.6", - "@brillout/json-serializer": "^0.5.22", + "@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", + "@universal-deploy/vite": "^0.1.9", + "@universal-middleware/core": "^0.4.17", + "@universal-middleware/node": "^0.1.0", "cac": "^6.0.0", + "convert-route": "^1.1.1", "es-module-lexer": "^1.0.0", "esbuild": ">=0.19.0", "json5": "^2.0.0", "magic-string": "^0.30.17", - "picomatch": "^4.0.2", - "semver": "^7.0.0", - "sirv": "^3.0.1", + "picomatch": "^4.0.4", + "semver": "^7.7.4", + "sirv": "^3.0.2", "source-map-support": "^0.5.0", - "tinyglobby": "^0.2.10", - "vite": ">=6.3.0" + "tinyglobby": "^0.2.16", + "vite": ">=6.3.0", + "vite-plugin-wrapper": "^0.1.0" }, "bin": { "vike": "bin.js" @@ -4019,17 +3658,16 @@ } }, "node_modules/vite": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", - "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.11.tgz", + "integrity": "sha512-Jz1mxtUBR5xTT65VOdJZUUeoyLtqljmFkiUXhPTLZka3RDc9vpi/xXkyrnsdRcm2lIi3l3GPMnAidTsEGIj3Ow==", "license": "MIT", "dependencies": { - "esbuild": "^0.27.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.14", + "rolldown": "1.0.0-rc.18", + "tinyglobby": "^0.2.16" }, "bin": { "vite": "bin/vite.js" @@ -4045,9 +3683,10 @@ }, "peerDependencies": { "@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", - "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", @@ -4060,13 +3699,16 @@ "@types/node": { "optional": true }, - "jiti": { + "@vitejs/devtools": { "optional": true }, - "less": { + "esbuild": { "optional": true }, - "lightningcss": { + "jiti": { + "optional": true + }, + "less": { "optional": true }, "sass": { @@ -4092,19 +3734,13 @@ } } }, - "node_modules/vite-tsconfig-paths": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-6.1.1.tgz", - "integrity": "sha512-2cihq7zliibCCZ8P9cKJrQBkfgdvcFkOOc3Y02o3GWUDLgqjWsZudaoiuOwO/gzTzy17cS5F7ZPo4bsnS4DGkg==", - "dev": true, + "node_modules/vite-plugin-wrapper": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/vite-plugin-wrapper/-/vite-plugin-wrapper-0.1.0.tgz", + "integrity": "sha512-orELI9PzoYKFRsI8TP4pTt05rL0oS68u8kJSANpJLZWdYdkqEsjEPrTLG1U/7x5PlACxIebmkbiBPaCg/oPSsw==", "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "globrex": "^0.1.2", - "tsconfck": "^3.0.3" - }, "peerDependencies": { - "vite": "*" + "vite": ">=7" } }, "node_modules/vite/node_modules/fsevents": { @@ -4122,19 +3758,19 @@ } }, "node_modules/vitest": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.0.tgz", - "integrity": "sha512-YbDrMF9jM2Lqc++2530UourxZHmkKLxrs4+mYhEwqWS97WJ7wOYEkcr+QfRgJ3PW9wz3odRijLZjHEaRLTNbqw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.5.tgz", + "integrity": "sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "4.1.0", - "@vitest/mocker": "4.1.0", - "@vitest/pretty-format": "4.1.0", - "@vitest/runner": "4.1.0", - "@vitest/snapshot": "4.1.0", - "@vitest/spy": "4.1.0", - "@vitest/utils": "4.1.0", + "@vitest/expect": "4.1.5", + "@vitest/mocker": "4.1.5", + "@vitest/pretty-format": "4.1.5", + "@vitest/runner": "4.1.5", + "@vitest/snapshot": "4.1.5", + "@vitest/spy": "4.1.5", + "@vitest/utils": "4.1.5", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", @@ -4145,8 +3781,8 @@ "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "why-is-node-running": "^2.3.0" }, "bin": { @@ -4162,13 +3798,15 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.0", - "@vitest/browser-preview": "4.1.0", - "@vitest/browser-webdriverio": "4.1.0", - "@vitest/ui": "4.1.0", + "@vitest/browser-playwright": "4.1.5", + "@vitest/browser-preview": "4.1.5", + "@vitest/browser-webdriverio": "4.1.5", + "@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-0" + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "@edge-runtime/vm": { @@ -4189,6 +3827,12 @@ "@vitest/browser-webdriverio": { "optional": true }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, "@vitest/ui": { "optional": true }, diff --git a/bifrost/ui/package.json b/bifrost/ui/package.json index 00a1d20..fb992cb 100644 --- a/bifrost/ui/package.json +++ b/bifrost/ui/package.json @@ -6,33 +6,30 @@ "scripts": { "dev": "vite", "build": "tsc && vike build", - "test": "vitest", - "lint": "oxlint", + "test": "vitest run", + "lint": "oxlint -c ../../oxlint.config.ts", "format": "prettier --write ." }, "dependencies": { - "@base-ui/react": "^1.3.0", - "react": "^19.2.4", - "react-dom": "^19.2.4", - "tailwindcss": "^4.2.1", - "vike": "^0.4.255", + "@base-ui/react": "^1.4.1", + "react": "^19.2.6", + "react-dom": "^19.2.6", + "tailwindcss": "^4.3.0", + "vike": "^0.4.259", "vike-react": "^0.6.21" }, "devDependencies": { - "@playwright/test": "^1.58.2", - "@tailwindcss/vite": "^4.2.1", + "@playwright/test": "^1.59.1", + "@tailwindcss/vite": "^4.3.0", "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^5.2.0", - "jsdom": "^28.1.0", - "oxlint": "^1.55.0", - "prettier": "^3.8.1", - "typescript": "^5.9.3", - "vite": "^7.3.1", - "vite-tsconfig-paths": "^6.1.1", - "vitest": "^4.1.0" + "@vitejs/plugin-react": "^6.0.1", + "jsdom": "^29.1.1", + "typescript": "^6.0.3", + "vite": "^8.0.11", + "vitest": "^4.1.5" } } diff --git a/bifrost/ui/playwright.config.ts b/bifrost/ui/playwright.config.ts index c31b0f3..1c1d68f 100644 --- a/bifrost/ui/playwright.config.ts +++ b/bifrost/ui/playwright.config.ts @@ -1,17 +1,17 @@ -import { defineConfig } from '@playwright/test'; +import { defineConfig } from "@playwright/test"; export default defineConfig({ - testDir: './tests', + testDir: "./tests", fullyParallel: true, forbidOnly: true, retries: 0, use: { - baseURL: 'http://localhost:3002', - trace: 'on-first-retry', + baseURL: "http://localhost:3002", + trace: "on-first-retry", headless: true, launchOptions: { - executablePath: '/home/blake/.cache/ms-playwright/chromium-1208/chrome-linux64/chrome', + executablePath: "/home/blake/.cache/ms-playwright/chromium-1208/chrome-linux64/chrome", }, }, - projects: ['Bifrost UI'], + projects: ["Bifrost UI"], }); diff --git a/bifrost/ui/src/components/Dialog/Dialog.spec.tsx b/bifrost/ui/src/components/Dialog/Dialog.spec.tsx index 57ad63a..0f08e72 100644 --- a/bifrost/ui/src/components/Dialog/Dialog.spec.tsx +++ b/bifrost/ui/src/components/Dialog/Dialog.spec.tsx @@ -1,6 +1,7 @@ -import { describe, expect, vi, test } from "vitest"; -import { render, screen, fireEvent } from "@testing-library/react"; +import { describe, expect, test, vi } from "vitest"; +import { fireEvent, render, screen } from "@testing-library/react"; import { Dialog } from "./Dialog"; +import "@testing-library/jest-dom/vitest"; describe("Dialog", () => { const defaultProps = { diff --git a/bifrost/ui/src/components/Dialog/Dialog.tsx b/bifrost/ui/src/components/Dialog/Dialog.tsx index b2b86ab..40810f4 100644 --- a/bifrost/ui/src/components/Dialog/Dialog.tsx +++ b/bifrost/ui/src/components/Dialog/Dialog.tsx @@ -2,7 +2,7 @@ import { Dialog as BaseDialog } from "@base-ui/react/dialog"; -interface DialogProps { +type DialogProps = { open: boolean; onClose: () => void; title: string; @@ -11,36 +11,40 @@ interface DialogProps { cancelLabel?: string; onConfirm: () => void; color?: "blue" | "green" | "red" | "yellow"; -} +}; const colorStyles = { blue: { border: "border-blue-500", bg: "bg-white dark:bg-gray-800", confirm: "border-blue-500 bg-blue-500 text-white hover:bg-blue-600", - cancel: "border-gray-400 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 hover:bg-gray-50 dark:hover:bg-gray-700", + cancel: + "border-gray-400 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 hover:bg-gray-50 dark:hover:bg-gray-700", }, green: { border: "border-green-500", bg: "bg-white dark:bg-gray-800", confirm: "border-green-500 bg-green-500 text-white hover:bg-green-600", - cancel: "border-gray-400 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 hover:bg-gray-50 dark:hover:bg-gray-700", + cancel: + "border-gray-400 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 hover:bg-gray-50 dark:hover:bg-gray-700", }, red: { border: "border-red-500", bg: "bg-white dark:bg-gray-800", confirm: "border-red-500 bg-red-500 text-white hover:bg-red-600", - cancel: "border-gray-400 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 hover:bg-gray-50 dark:hover:bg-gray-700", + cancel: + "border-gray-400 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 hover:bg-gray-50 dark:hover:bg-gray-700", }, yellow: { border: "border-yellow-500", bg: "bg-white dark:bg-gray-800", confirm: "border-yellow-500 bg-yellow-500 text-white hover:bg-yellow-600", - cancel: "border-gray-400 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 hover:bg-gray-50 dark:hover:bg-gray-700", + cancel: + "border-gray-400 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 hover:bg-gray-50 dark:hover:bg-gray-700", }, }; -export function Dialog({ +export const Dialog = ({ open, onClose, title, @@ -49,7 +53,7 @@ export function Dialog({ cancelLabel = "Cancel", onConfirm, color = "blue", -}: DialogProps) { +}: DialogProps) => { const styles = colorStyles[color]; const handleConfirm = () => { @@ -105,4 +109,4 @@ export function Dialog({ ); -} +}; diff --git a/bifrost/ui/src/components/RealmSelector/RealmSelector.spec.tsx b/bifrost/ui/src/components/RealmSelector/RealmSelector.spec.tsx index 6f67c14..8a84ae0 100644 --- a/bifrost/ui/src/components/RealmSelector/RealmSelector.spec.tsx +++ b/bifrost/ui/src/components/RealmSelector/RealmSelector.spec.tsx @@ -1,13 +1,14 @@ -import { describe, expect, vi, beforeEach, test } from "vitest"; +import { beforeEach, describe, expect, test, vi } from "vitest"; import { fireEvent, render, screen, waitFor, within } from "@testing-library/react"; import { RealmSelector } from "./RealmSelector"; +import "@testing-library/jest-dom/vitest"; // Define types locally since they're not exported from lib files type RealmContextValue = { currentRealm: string | null; setCurrentRealm: (realm: string | null) => void; availableRealms: string[]; - realmOptions: Array<{ id: string; name: string }>; + realmOptions: { id: string; name: string }[]; isLoading: boolean; }; @@ -19,9 +20,7 @@ vi.mock("../../lib/realm", () => ({ import { useRealm } from "../../lib/realm"; // Helper function to create complete RealmContextValue mock -const createMockRealmValue = ( - overrides: Partial = {}, -): RealmContextValue => ({ +const createMockRealmValue = (overrides: Partial = {}): RealmContextValue => ({ currentRealm: "test-realm", setCurrentRealm: vi.fn(), availableRealms: ["test-realm", "other-realm"], @@ -40,13 +39,9 @@ describe("RealmSelector", () => { describe("Loading State", () => { test("shows loading message when isLoading is true", () => { - vi.mocked(useRealm).mockReturnValue( - createMockRealmValue({ isLoading: true }), - ); + vi.mocked(useRealm).mockReturnValue(createMockRealmValue({ isLoading: true })); render(); - expect( - screen.getByText("Loading realms..."), - ).toBeInTheDocument(); + expect(screen.getByText("Loading realms...")).toBeInTheDocument(); }); }); diff --git a/bifrost/ui/src/components/RealmSelector/RealmSelector.tsx b/bifrost/ui/src/components/RealmSelector/RealmSelector.tsx index 6e1f924..c4e6614 100644 --- a/bifrost/ui/src/components/RealmSelector/RealmSelector.tsx +++ b/bifrost/ui/src/components/RealmSelector/RealmSelector.tsx @@ -1,7 +1,7 @@ import { Select } from "@base-ui/react/select"; import { useRealm } from "../../lib/realm"; -export function RealmSelector() { +export const RealmSelector = () => { const { currentRealm, setCurrentRealm, availableRealms, realmOptions, isLoading } = useRealm(); const options = realmOptions.length > 0 @@ -10,7 +10,7 @@ export function RealmSelector() { const selectedRealm = currentRealm && availableRealms.includes(currentRealm) ? currentRealm - : availableRealms[0] ?? ""; + : (availableRealms[0] ?? ""); const items = Object.fromEntries(options.map((option) => [option.id, option.name])); if (isLoading) { @@ -107,4 +107,4 @@ export function RealmSelector() { ); -} +}; diff --git a/bifrost/ui/src/components/Toast/Toast.spec.tsx b/bifrost/ui/src/components/Toast/Toast.spec.tsx index d1c80b9..1548a6f 100644 --- a/bifrost/ui/src/components/Toast/Toast.spec.tsx +++ b/bifrost/ui/src/components/Toast/Toast.spec.tsx @@ -1,14 +1,13 @@ -import { describe, expect, vi, test } from "vitest"; -import { render, screen, fireEvent } from "@testing-library/react"; +import { beforeEach, describe, expect, test, vi } from "vitest"; +import { fireEvent, render, screen } from "@testing-library/react"; import { Toast } from "./Toast"; -import { type Toast as ToastType } from "@/lib/toast"; +import type { Toast as ToastType } from "@/lib/toast"; +import "@testing-library/jest-dom/vitest"; describe("Toast", () => { const mockOnRemove = vi.fn(); - const createMockToast = ( - overrides: Partial = {}, - ): ToastType => ({ + const createMockToast = (overrides: Partial = {}): ToastType => ({ id: "test-123", title: "Test Toast", description: "This is a test toast message", @@ -38,9 +37,7 @@ describe("Toast", () => { description: "Operation completed successfully", }); render(); - expect( - screen.getByText("Operation completed successfully"), - ).toBeInTheDocument(); + expect(screen.getByText("Operation completed successfully")).toBeInTheDocument(); }); test("does not render description when not provided", () => { diff --git a/bifrost/ui/src/components/Toast/Toast.tsx b/bifrost/ui/src/components/Toast/Toast.tsx index d24695f..4bd597d 100644 --- a/bifrost/ui/src/components/Toast/Toast.tsx +++ b/bifrost/ui/src/components/Toast/Toast.tsx @@ -1,11 +1,12 @@ "use client"; -import { type Toast, ToastType } from "@/lib/toast"; +import type { ToastType, Toast } from "@/lib/toast"; +import type { ReactNode } from "react"; -interface ToastItemProps { +type ToastItemProps = { toast: Toast; onRemove: (id: string) => void; -} +}; const toastStyles: Record = { success: "border-green-500 bg-green-50 dark:bg-green-900/20", @@ -21,30 +22,26 @@ const iconStyles: Record = { warning: "⚠", }; -export function Toast({ toast, onRemove }: ToastItemProps) { - return ( -
-
- {iconStyles[toast.type]} -
-
- {toast.title} -
- {toast.description && ( -
- {toast.description} -
- )} -
- +const Toast = ({ toast, onRemove }: ToastItemProps): ReactNode => ( +
+
+ {iconStyles[toast.type]} +
+
{toast.title}
+ {toast.description && ( +
{toast.description}
+ )}
+
- ); -} +
+); + +export { Toast }; diff --git a/bifrost/ui/src/components/TopNav/TopNav.spec.tsx b/bifrost/ui/src/components/TopNav/TopNav.spec.tsx index 8cb0e43..6922f7a 100644 --- a/bifrost/ui/src/components/TopNav/TopNav.spec.tsx +++ b/bifrost/ui/src/components/TopNav/TopNav.spec.tsx @@ -1,6 +1,7 @@ -import { describe, expect, vi, beforeEach, test } from "vitest"; +import { beforeEach, describe, expect, test, vi } from "vitest"; import { fireEvent, render, screen, waitFor } from "@testing-library/react"; import { TopNav } from "./TopNav"; +import "@testing-library/jest-dom/vitest"; // Define types locally since they're not exported from lib files type AuthContextValue = { @@ -44,9 +45,7 @@ import { useTheme } from "../../lib/theme"; import { useRealm } from "../../lib/realm"; // Helper function to create complete AuthContextValue mock -const createMockAuthValue = ( - overrides: Partial = {}, -): AuthContextValue => ({ +const createMockAuthValue = (overrides: Partial = {}): AuthContextValue => ({ isAuthenticated: true, accountId: "123", username: "testuser", @@ -54,16 +53,14 @@ const createMockAuthValue = ( realms: [], realmNames: {}, isSysadmin: false, - login: vi.fn().mockResolvedValue(undefined), - logout: vi.fn().mockResolvedValue(undefined), + login: vi.fn().mockResolvedValue(Promise.resolve()), + logout: vi.fn().mockResolvedValue(Promise.resolve()), loading: false, ...overrides, }); // Helper function to create complete ThemeContextValue mock -const createMockThemeValue = ( - overrides: Partial = {}, -): ThemeContextValue => ({ +const createMockThemeValue = (overrides: Partial = {}): ThemeContextValue => ({ isDark: false, toggleTheme: vi.fn(), ...overrides, @@ -83,9 +80,7 @@ describe("TopNav", () => { describe("Navigation Links", () => { beforeEach(() => { - vi.mocked(useAuth).mockReturnValue( - createMockAuthValue({ username: "testuser" }), - ); + vi.mocked(useAuth).mockReturnValue(createMockAuthValue({ username: "testuser" })); vi.mocked(useTheme).mockReturnValue(createMockThemeValue()); }); @@ -127,7 +122,9 @@ describe("TopNav", () => { rerender(); expect(screen.getByText("Realms").closest("button")).toHaveClass("top-nav__link--active"); - expect(screen.getByText("Accounts").closest("button")).not.toHaveClass("top-nav__link--active"); + expect(screen.getByText("Accounts").closest("button")).not.toHaveClass( + "top-nav__link--active", + ); }); test("matches sections when currentPath is missing the /ui prefix", () => { @@ -149,9 +146,7 @@ describe("TopNav", () => { describe("Theme Toggle", () => { beforeEach(() => { - vi.mocked(useAuth).mockReturnValue( - createMockAuthValue({ username: "testuser" }), - ); + vi.mocked(useAuth).mockReturnValue(createMockAuthValue({ username: "testuser" })); }); test("displays theme toggle button in light mode", () => { @@ -201,9 +196,7 @@ describe("TopNav", () => { }); test("displays account badge with username initial", () => { - vi.mocked(useAuth).mockReturnValue( - createMockAuthValue({ username: "John Doe" }), - ); + vi.mocked(useAuth).mockReturnValue(createMockAuthValue({ username: "John Doe" })); render(); expect(screen.getByText("J")).toBeInTheDocument(); expect(screen.getByText("John Doe")).toBeInTheDocument(); @@ -219,7 +212,7 @@ describe("TopNav", () => { }); test("opens user menu and triggers logout", async () => { - const logout = vi.fn().mockResolvedValue(undefined); + const logout = vi.fn().mockResolvedValue(Promise.resolve()); vi.mocked(useAuth).mockReturnValue(createMockAuthValue({ username: "John Doe", logout })); render(); @@ -237,9 +230,7 @@ describe("TopNav", () => { describe("Logo", () => { beforeEach(() => { - vi.mocked(useAuth).mockReturnValue( - createMockAuthValue({ username: "testuser" }), - ); + vi.mocked(useAuth).mockReturnValue(createMockAuthValue({ username: "testuser" })); vi.mocked(useTheme).mockReturnValue(createMockThemeValue()); }); @@ -253,9 +244,7 @@ describe("TopNav", () => { describe("Component Rendering", () => { beforeEach(() => { - vi.mocked(useAuth).mockReturnValue( - createMockAuthValue({ username: "testuser" }), - ); + vi.mocked(useAuth).mockReturnValue(createMockAuthValue({ username: "testuser" })); vi.mocked(useTheme).mockReturnValue(createMockThemeValue()); }); diff --git a/bifrost/ui/src/components/TopNav/TopNav.tsx b/bifrost/ui/src/components/TopNav/TopNav.tsx index 0958182..703f002 100644 --- a/bifrost/ui/src/components/TopNav/TopNav.tsx +++ b/bifrost/ui/src/components/TopNav/TopNav.tsx @@ -1,7 +1,6 @@ "use client"; -import type { CSSProperties } from "react"; -import { useEffect, useRef, useState } from "react"; +import { useEffect, useRef, useState, type CSSProperties } from "react"; import { Menu } from "@base-ui/react/menu"; import { Switch } from "@base-ui/react/switch"; import { navigate, toUIPath } from "@/lib/router"; @@ -47,7 +46,7 @@ const buildIndicatorGradient = (navWidth: number, labelRanges: LabelRange[]): st }; }); - const firstSegment = segments[0]; + const [firstSegment] = segments; if (!firstSegment) { return FALLBACK_INDICATOR_GRADIENT; } @@ -57,12 +56,10 @@ const buildIndicatorGradient = (navWidth: number, labelRanges: LabelRange[]): st colorStops.push(`${firstSegment.color} ${cursor}px`); - for (let index = 0; index < segments.length; index += 1) { - const current = segments[index]; - if (!current) { - continue; - } + const validSegments = segments.filter((segment) => segment !== null); + for (let index = 0; index < validSegments.length; index += 1) { + const current = validSegments[index]; const start = Math.max(current.start, cursor); if (start > cursor) { colorStops.push(`${current.color} ${start}px`); @@ -73,7 +70,7 @@ const buildIndicatorGradient = (navWidth: number, labelRanges: LabelRange[]): st colorStops.push(`${current.color} ${end}px`); cursor = end; - const next = segments[index + 1]; + const next = validSegments[index + 1]; if (next) { const blendEnd = Math.max(next.start, cursor); colorStops.push(`${next.color} ${blendEnd}px`); @@ -82,7 +79,8 @@ const buildIndicatorGradient = (navWidth: number, labelRanges: LabelRange[]): st } if (cursor < navWidth) { - const lastColor = segments[segments.length - 1]?.color ?? NAV_LINKS[NAV_LINKS.length - 1]?.color; + const lastColor = + segments[segments.length - 1]?.color ?? NAV_LINKS[NAV_LINKS.length - 1]?.color; if (lastColor) { colorStops.push(`${lastColor} ${navWidth}px`); } @@ -95,7 +93,7 @@ type TopNavProps = { currentPath?: string; }; -export function TopNav({ currentPath }: TopNavProps) { +const TopNav = ({ currentPath }: TopNavProps) => { const { username, accountId, logout } = useAuth(); const { isDark, toggleTheme } = useTheme(); const { availableRealms } = useRealm(); @@ -155,15 +153,10 @@ export function TopNav({ currentPath }: TopNavProps) { useEffect(() => { const rawPath = currentPath ?? window.location.pathname; const path = toUIPath(rawPath); - const index = NAV_LINKS.findIndex( - (link) => { - const uiHref = toUIPath(link.href); - return ( - uiHref === path || - (uiHref !== toUIPath("/") && path.startsWith(uiHref)) - ); - } - ); + const index = NAV_LINKS.findIndex((link) => { + const uiHref = toUIPath(link.href); + return uiHref === path || (uiHref !== toUIPath("/") && path.startsWith(uiHref)); + }); setActiveIndex(index >= 0 ? index : 0); }, [currentPath]); @@ -181,17 +174,21 @@ export function TopNav({ currentPath }: TopNavProps) { return ( ); -} +}; + +export { TopNav }; diff --git a/bifrost/ui/src/components/Wizard/Wizard.spec.tsx b/bifrost/ui/src/components/Wizard/Wizard.spec.tsx index 33afa3c..674d0e3 100644 --- a/bifrost/ui/src/components/Wizard/Wizard.spec.tsx +++ b/bifrost/ui/src/components/Wizard/Wizard.spec.tsx @@ -1,6 +1,7 @@ -import { describe, expect, vi, beforeEach, test } from "vitest"; -import { render, screen, fireEvent } from "@testing-library/react"; +import { beforeEach, describe, expect, test, vi } from "vitest"; +import { fireEvent, render, screen } from "@testing-library/react"; import { Wizard } from "./Wizard"; +import "@testing-library/jest-dom/vitest"; describe("Wizard", () => { const mockSteps = [ @@ -27,16 +28,16 @@ describe("Wizard", () => { describe("Component Rendering", () => { test("renders without crashing", () => { const { container } = render(); - const wizard = container.querySelector('.wizard'); + const wizard = container.querySelector(".wizard"); expect(wizard).toBeInTheDocument(); }); test("renders with custom colors", () => { const customColors = ["#ff0000", "#00ff00", "#0000ff"]; const { container } = render( - + , ); - const wizard = container.querySelector('.wizard'); + const wizard = container.querySelector(".wizard"); expect(wizard).toBeInTheDocument(); }); }); @@ -203,7 +204,7 @@ describe("Wizard", () => { ]; const { container } = render(); - const wizard = container.querySelector('.wizard'); + const wizard = container.querySelector(".wizard"); expect(wizard).toBeInTheDocument(); const stepContent = screen.getByTestId("single-step"); diff --git a/bifrost/ui/src/components/Wizard/Wizard.tsx b/bifrost/ui/src/components/Wizard/Wizard.tsx index 9d755be..3cec04f 100644 --- a/bifrost/ui/src/components/Wizard/Wizard.tsx +++ b/bifrost/ui/src/components/Wizard/Wizard.tsx @@ -1,23 +1,32 @@ -import React, { useState } from 'react'; +import React, { useState } from "react"; -export interface WizardStep { +export type WizardStep = { title: string; content: React.ReactNode; -} +}; -export interface WizardProps { +export type WizardProps = { steps: WizardStep[]; onComplete: () => void; colors?: string[]; -} +}; + +const DEFAULT_COLORS = ["#ef4444", "#3b82f6", "#22c55e", "#a855f7"]; -const DEFAULT_COLORS = ['#ef4444', '#3b82f6', '#22c55e', '#a855f7']; +const getStepColor = (stepIndex: number, colors: string[]) => + colors[stepIndex % colors.length] || colors[0]; + +const getStepTextColor = (isActive: boolean, isUpcoming: boolean, stepColor: string) => { + if (isActive) { + return stepColor; + } + if (isUpcoming) { + return "#999999"; + } + return "#000000"; +}; -export const Wizard: React.FC = ({ - steps, - onComplete, - colors = DEFAULT_COLORS -}) => { +export const Wizard: React.FC = ({ steps, onComplete, colors = DEFAULT_COLORS }) => { const [currentStep, setCurrentStep] = useState(0); const isLastStep = currentStep === steps.length - 1; @@ -37,10 +46,6 @@ export const Wizard: React.FC = ({ } }; - const getStepColor = (stepIndex: number) => { - return colors[stepIndex % colors.length] || colors[0]; - }; - return (
{/* Step Indicators */} @@ -50,63 +55,58 @@ export const Wizard: React.FC = ({ const isCompleted = index < currentStep; const isUpcoming = index > currentStep; + const stepColor = getStepColor(index, colors); + return (
- {isCompleted ? '✓' : index + 1} + {isCompleted ? "✓" : index + 1}
{step.title}
- {index < steps.length - 1 && ( -
- )} + {index < steps.length - 1 &&
}
); })}
{/* Step Content */} -
- {steps[currentStep].content} -
+
{steps[currentStep].content}
{/* Navigation Buttons */}
{!isFirstStep && ( - )}
-
); -} +}; // Step content components type StepContentProps = { @@ -476,30 +278,26 @@ type StepContentProps = { color: string; }; -function StepContent({ children }: StepContentProps) { - return
{children}
; -} +const StepContent = ({ children }: StepContentProps) => ( +
{children}
+); type StepHeaderProps = { children: string; color: string; }; -function StepHeader({ children, color }: StepHeaderProps) { - return ( -

- {children} -

- ); -} +const StepHeader = ({ children, color }: StepHeaderProps) => ( +

+ {children} +

+); -function StepDescription({ children }: { children: string }) { - return ( -

- {children} -

- ); -} +const StepDescription = ({ children }: { children: string }) => ( +

+ {children} +

+); type FormFieldProps = { label: string; @@ -509,8 +307,8 @@ type FormFieldProps = { disabled: boolean; }; -function FormField({ label, value, onChange, placeholder, disabled }: FormFieldProps) { - const fieldId = label.toLowerCase().replace(/\s+/g, '-'); +const FormField = ({ label, value, onChange, placeholder, disabled }: FormFieldProps) => { + const fieldId = label.toLowerCase().replace(/\s+/g, "-"); const inputRef = useRef(null); useEffect(() => { @@ -523,7 +321,7 @@ function FormField({ label, value, onChange, placeholder, disabled }: FormFieldP @@ -532,28 +330,28 @@ function FormField({ label, value, onChange, placeholder, disabled }: FormFieldP id={fieldId} type="text" value={value} - onChange={(e) => onChange(e.target.value)} + onChange={(event) => onChange(event.target.value)} placeholder={placeholder} disabled={disabled} className="w-full px-4 py-3 text-sm transition-all duration-150" style={{ - backgroundColor: 'var(--color-bg)', - border: '2px solid var(--color-border)', - color: 'var(--color-text)', - boxShadow: 'var(--shadow-soft)', + backgroundColor: "var(--color-bg)", + border: "2px solid var(--color-border)", + color: "var(--color-text)", + boxShadow: "var(--shadow-soft)", }} - onFocus={(e) => { - e.currentTarget.style.boxShadow = 'var(--shadow-soft-hover)'; - e.currentTarget.style.transform = 'translate(2px, 2px)'; + onFocus={(event) => { + event.currentTarget.style.boxShadow = "var(--shadow-soft-hover)"; + event.currentTarget.style.transform = "translate(2px, 2px)"; }} - onBlur={(e) => { - e.currentTarget.style.boxShadow = 'var(--shadow-soft)'; - e.currentTarget.style.transform = 'translate(0, 0)'; + onBlur={(event) => { + event.currentTarget.style.boxShadow = "var(--shadow-soft)"; + event.currentTarget.style.transform = "translate(0, 0)"; }} />
); -} +}; type PATDisplayProps = { pat: string; @@ -561,44 +359,250 @@ type PATDisplayProps = { onCopy: () => void; }; -function PATDisplay({ pat, copied, onCopy }: PATDisplayProps) { +const PATDisplay = ({ pat, copied, onCopy }: PATDisplayProps) => ( +
+
+ {pat} +
+ +

+ ⚠️ Store this token securely. It won't be shown again. +

+
+); + +const Page = () => { + const [username, setUsername] = useState(""); + const [realmName, setRealmName] = useState(""); + const [adminResponse, setAdminResponse] = useState(null); + const [isLoading, setIsLoading] = useState(false); + const [copied, setCopied] = useState(false); + const [isCompleting, setIsCompleting] = useState(false); + const { showToast } = useToast(); + const { login } = useAuth(); + + const handleCreateAdmin = useCallback(async () => { + if (!username.trim()) { + showToast("Error", "Username is required", "error"); + return false; + } + + if (!realmName.trim()) { + showToast("Error", "Realm name is required", "error"); + return false; + } + + setIsLoading(true); + try { + const response = await api.createAdmin({ + username: username.trim(), + realm_name: realmName.trim(), + create_sysadmin: true, + create_realm: true, + }); + setAdminResponse(response); + return true; + } catch { + showToast("Error", "Failed to create admin account", "error"); + return false; + } finally { + setIsLoading(false); + } + }, [username, realmName, showToast]); + + const handleCopyPAT = useCallback(async () => { + if (adminResponse?.pat) { + await navigator.clipboard.writeText(adminResponse.pat); + setCopied(true); + showToast("Copied!", "PAT copied to clipboard", "success"); + setTimeout(() => setCopied(false), 2000); + } + }, [adminResponse, showToast]); + + const handleComplete = useCallback(async () => { + if (!adminResponse?.pat) { + showToast("Error", "No access token available. Please sign in.", "error"); + navigate("/login"); + return; + } + + setIsCompleting(true); + try { + // Auto-login with the PAT that was generated during onboarding + await login(adminResponse.pat, true); + navigate("/dashboard"); + } catch { + showToast("Error", "Failed to auto-login. Please sign in manually.", "error"); + navigate("/login"); + } finally { + setIsCompleting(false); + } + }, [adminResponse, login, showToast]); + + const stepColors = [ + "var(--color-red)", + "var(--color-blue)", + "var(--color-green)", + "var(--color-purple)", + ]; + + const steps = [ + { + title: "Admin Account", + content: ( + + Create Your Admin Account + + This will be your primary administrator account for managing Bifrost. + + + + ), + }, + { + title: "Create Realm", + content: ( + + Create Your First Realm + + A realm is an isolated workspace for managing runes (issues, tasks, bugs). + + + + ), + }, + { + title: "Access Token", + content: ( + + Your Personal Access Token + + Save this token securely. You'll need it to authenticate with Bifrost. + + {adminResponse ? ( + + ) : ( +
+

Click Next to generate your token...

+
+ )} +
+ ), + }, + { + title: "Complete", + content: ( + + You're All Set! + + Your Bifrost instance is ready to use. Start creating and managing runes. + +
+
+

Setup Summary

+

+ Admin: {username} +

+

+ Realm: {realmName} +

+
+
+
+ ), + }, + ]; + + const handleWizardNext = useCallback( + async (currentStep: number) => { + // Step 2 (index 1) is Create Realm - generate PAT when advancing to step 3 + if (currentStep === 1 && !adminResponse) { + return handleCreateAdmin(); + } + return true; + }, + [adminResponse, handleCreateAdmin], + ); + return ( -
-
- {pat} +
+
+ {/* Header */} +
+

+ Bifrost +

+

+ First-Time Setup +

+
+ + {/* Wizard Card */} +
+ +
- -

- ⚠️ Store this token securely. It won't be shown again. -

); -} +}; + +export { Page }; diff --git a/bifrost/ui/src/pages/realms/+Page.tsx b/bifrost/ui/src/pages/realms/+Page.tsx index 5079ce4..1264ee9 100644 --- a/bifrost/ui/src/pages/realms/+Page.tsx +++ b/bifrost/ui/src/pages/realms/+Page.tsx @@ -1,37 +1,35 @@ -'use client'; +"use client"; -import { useCallback, useEffect, useState } from 'react'; -import { Button } from '@base-ui/react/button'; -import { Dialog as BaseDialog } from '@base-ui/react/dialog'; -import { Input } from '@base-ui/react/input'; -import { Toggle } from '@base-ui/react/toggle'; -import { ToggleGroup } from '@base-ui/react/toggle-group'; -import { navigate } from '@/lib/router'; -import { useAuth } from '../../lib/auth'; -import { useToast } from '../../lib/toast'; -import { api } from '../../lib/api'; -import type { RealmListEntry, RealmStatus } from '../../types/realm'; +import { useCallback, useEffect, useState } from "react"; +import { Button } from "@base-ui/react/button"; +import { Dialog as BaseDialog } from "@base-ui/react/dialog"; +import { Input } from "@base-ui/react/input"; +import { Toggle } from "@base-ui/react/toggle"; +import { ToggleGroup } from "@base-ui/react/toggle-group"; +import { navigate } from "@/lib/router"; +import { useAuth } from "../../lib/auth"; +import { useToast } from "../../lib/toast"; +import { api } from "../../lib/api"; +import type { RealmListEntry, RealmStatus } from "../../types/realm"; -export { Page }; - -function Page() { +const Page = () => { const [realms, setRealms] = useState([]); const [isLoading, setIsLoading] = useState(true); - const [statusFilter, setStatusFilter] = useState<'all' | 'active' | 'inactive'>('all'); + const [statusFilter, setStatusFilter] = useState<"all" | "active" | "inactive">("all"); const [showSuspended, setShowSuspended] = useState(false); const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false); - const [newRealmName, setNewRealmName] = useState(''); + const [newRealmName, setNewRealmName] = useState(""); const [isCreating, setIsCreating] = useState(false); const { isAuthenticated, realms: sessionRealmIds, realmNames, loading: authLoading } = useAuth(); const { showToast } = useToast(); const toFallbackRealms = useCallback((): RealmListEntry[] => { - const visibleRealmIds = sessionRealmIds.filter((realmId) => realmId !== '_admin'); + const visibleRealmIds = sessionRealmIds.filter((realmId) => realmId !== "_admin"); return visibleRealmIds.map((realmId) => ({ id: realmId, name: realmNames[realmId] ?? realmId, - status: 'active', + status: "active", created_at: new Date(0).toISOString(), })); }, [realmNames, sessionRealmIds]); @@ -44,7 +42,7 @@ function Page() { return rawData .map((entry) => { - if (!entry || typeof entry !== 'object') { + if (!entry || typeof entry !== "object") { return null; } @@ -61,7 +59,7 @@ function Page() { return null; } - const status: RealmStatus = rawEntry.status === 'suspended' ? 'inactive' : 'active'; + const status: RealmStatus = rawEntry.status === "suspended" ? "inactive" : "active"; return { id, @@ -72,14 +70,16 @@ function Page() { }) .filter((entry): entry is RealmListEntry => entry !== null); }, - [realmNames] + [realmNames], ); useEffect(() => { - if (authLoading) return; + if (authLoading) { + return; + } if (!isAuthenticated) { - navigate('/login'); + navigate("/login"); return; } @@ -92,7 +92,7 @@ function Page() { const fallbackRealms = toFallbackRealms(); setRealms(fallbackRealms); if (fallbackRealms.length === 0) { - showToast('Error', 'Failed to load realms', 'error'); + showToast("Error", "Failed to load realms", "error"); } } finally { setIsLoading(false); @@ -104,32 +104,32 @@ function Page() { const formatDate = (dateStr: string) => { const date = new Date(dateStr); - return date.toLocaleDateString('en-US', { - month: 'short', - day: 'numeric', - year: 'numeric', + return date.toLocaleDateString("en-US", { + month: "short", + day: "numeric", + year: "numeric", }); }; const getStatusColor = (status: RealmStatus) => { const colors: Record = { - active: 'var(--color-green)', - inactive: 'var(--color-border)', + active: "var(--color-green)", + inactive: "var(--color-border)", }; return colors[status]; }; const filteredRealms = realms.filter((realm) => { // Hide suspended realms unless explicitly shown - if (!showSuspended && realm.status === 'inactive') { + if (!showSuspended && realm.status === "inactive") { return false; } // Apply status filter - if (statusFilter === 'all') { + if (statusFilter === "all") { return true; } - return statusFilter === 'active' ? realm.status === 'active' : realm.status !== 'active'; + return statusFilter === "active" ? realm.status === "active" : realm.status !== "active"; }); const handleCreateRealm = async () => { @@ -142,11 +142,11 @@ function Page() { try { const created = await api.createRealm({ name: realmName }); setIsCreateDialogOpen(false); - setNewRealmName(''); - showToast('Success', `Realm ${realmName} created`, 'success'); + setNewRealmName(""); + showToast("Success", `Realm ${realmName} created`, "success"); navigate(`/realms/${created.id}`); } catch { - showToast('Error', 'Failed to create realm', 'error'); + showToast("Error", "Failed to create realm", "error"); } finally { setIsCreating(false); } @@ -158,9 +158,9 @@ function Page() {
Loading... @@ -175,13 +175,13 @@ function Page() {

No Realms Found

-

+

You don't have access to any realms yet. Contact your administrator.

@@ -194,18 +194,17 @@ function Page() {
{ - const nextFilter = values[0]; - if (nextFilter === 'all' || nextFilter === 'active' || nextFilter === 'inactive') { + onValueChange={([nextFilter]) => { + if (nextFilter === "all" || nextFilter === "active" || nextFilter === "inactive") { setStatusFilter(nextFilter); } }} className="flex flex-wrap gap-2" > {[ - { label: 'All', value: 'all' as const }, - { label: 'Active', value: 'active' as const }, - { label: 'Inactive', value: 'inactive' as const }, + { label: "All", value: "all" as const }, + { label: "Active", value: "active" as const }, + { label: "Inactive", value: "inactive" as const }, ].map((filter) => ( {filter.label} @@ -231,8 +230,8 @@ function Page() { onPressedChange={setShowSuspended} className="w-4 h-4" style={{ - backgroundColor: showSuspended ? 'var(--color-green)' : 'var(--color-bg)', - border: '2px solid var(--color-border)', + backgroundColor: showSuspended ? "var(--color-green)" : "var(--color-bg)", + border: "2px solid var(--color-border)", }} /> Show Suspended Realms @@ -242,20 +241,20 @@ function Page() { onClick={() => setIsCreateDialogOpen(true)} className="px-3 py-2 text-xs font-bold uppercase tracking-wider transition-all duration-150" style={{ - backgroundColor: 'var(--color-bg)', - border: '2px solid var(--color-border)', - color: 'var(--color-text)', - boxShadow: 'var(--shadow-soft)', + backgroundColor: "var(--color-bg)", + border: "2px solid var(--color-border)", + color: "var(--color-text)", + boxShadow: "var(--shadow-soft)", }} - onMouseEnter={(e) => { - e.currentTarget.style.backgroundColor = 'var(--color-green)'; - e.currentTarget.style.color = 'white'; - e.currentTarget.style.boxShadow = 'var(--shadow-soft-hover)'; + onMouseEnter={(event) => { + event.currentTarget.style.backgroundColor = "var(--color-green)"; + event.currentTarget.style.color = "white"; + event.currentTarget.style.boxShadow = "var(--shadow-soft-hover)"; }} - onMouseLeave={(e) => { - e.currentTarget.style.backgroundColor = 'var(--color-bg)'; - e.currentTarget.style.color = 'var(--color-text)'; - e.currentTarget.style.boxShadow = 'var(--shadow-soft)'; + onMouseLeave={(event) => { + event.currentTarget.style.backgroundColor = "var(--color-bg)"; + event.currentTarget.style.color = "var(--color-text)"; + event.currentTarget.style.boxShadow = "var(--shadow-soft)"; }} > + @@ -270,9 +269,9 @@ function Page() { Enter a realm name to create a new realm. @@ -304,13 +303,13 @@ function Page() { setNewRealmName(e.target.value)} + onChange={(event) => setNewRealmName(event.target.value)} placeholder="Engineering" className="w-full px-3 py-2 text-sm outline-none" style={{ - backgroundColor: 'var(--color-surface)', - border: '2px solid var(--color-border)', - color: 'var(--color-text)', + backgroundColor: "var(--color-surface)", + border: "2px solid var(--color-border)", + color: "var(--color-text)", }} />
@@ -319,9 +318,9 @@ function Page() { Cancel @@ -332,12 +331,12 @@ function Page() { disabled={newRealmName.trim().length === 0 || isCreating} className="px-4 py-2 text-xs font-bold uppercase tracking-wider disabled:opacity-50 disabled:cursor-not-allowed" style={{ - backgroundColor: 'var(--color-green)', - border: '2px solid var(--color-border)', - color: 'white', + backgroundColor: "var(--color-green)", + border: "2px solid var(--color-border)", + color: "white", }} > - {isCreating ? 'Creating...' : 'Create Realm'} + {isCreating ? "Creating..." : "Create Realm"}
@@ -349,17 +348,17 @@ function Page() { {/* Realms Table */}
{/* Table Header */}
ID
@@ -372,7 +371,7 @@ function Page() { {filteredRealms.length === 0 ? (
No realms match this filter.
@@ -384,25 +383,25 @@ function Page() { key={realm.id} className="grid grid-cols-12 gap-4 px-4 py-4 items-center cursor-pointer transition-all duration-150 hover:translate-x-[2px]" style={{ - borderBottom: '1px solid var(--color-border)', - backgroundColor: 'var(--color-bg)', - width: '100%', - textAlign: 'left', + borderBottom: "1px solid var(--color-border)", + backgroundColor: "var(--color-bg)", + width: "100%", + textAlign: "left", }} onClick={() => navigate(`/realms/${realm.id}`)} - onMouseEnter={(e) => { - e.currentTarget.style.backgroundColor = 'var(--color-surface)'; - e.currentTarget.style.borderLeftWidth = '4px'; - e.currentTarget.style.borderLeftColor = 'var(--color-green)'; - e.currentTarget.style.borderLeftStyle = 'solid'; + onMouseEnter={(event) => { + event.currentTarget.style.backgroundColor = "var(--color-surface)"; + event.currentTarget.style.borderLeftWidth = "4px"; + event.currentTarget.style.borderLeftColor = "var(--color-green)"; + event.currentTarget.style.borderLeftStyle = "solid"; }} - onMouseLeave={(e) => { - e.currentTarget.style.backgroundColor = 'var(--color-bg)'; - e.currentTarget.style.borderLeftWidth = '0px'; + onMouseLeave={(event) => { + event.currentTarget.style.backgroundColor = "var(--color-bg)"; + event.currentTarget.style.borderLeftWidth = "0px"; }} >
- + {realm.id.slice(0, 8)}
@@ -421,7 +420,7 @@ function Page() {
- + {formatDate(realm.created_at)}
@@ -432,4 +431,6 @@ function Page() {
); -} +}; + +export { Page }; diff --git a/bifrost/ui/src/pages/realms/@id/+Page.tsx b/bifrost/ui/src/pages/realms/@id/+Page.tsx index bc558e3..4c8b9a8 100644 --- a/bifrost/ui/src/pages/realms/@id/+Page.tsx +++ b/bifrost/ui/src/pages/realms/@id/+Page.tsx @@ -1,67 +1,65 @@ -'use client'; +"use client"; -import { useCallback, useEffect, useState } from 'react'; -import { Button } from '@base-ui/react/button'; -import { Combobox } from '@base-ui/react/combobox'; -import { Dialog as BaseDialog } from '@base-ui/react/dialog'; -import { Select } from '@base-ui/react/select'; -import { navigate } from '@/lib/router'; -import { usePageContext } from 'vike-react/usePageContext'; -import { useAuth } from '../../../lib/auth'; -import { useToast } from '../../../lib/toast'; -import { api } from '../../../lib/api'; -import { Dialog } from '../../../components/Dialog/Dialog'; -import type { RealmDetail, RealmStatus } from '../../../types/realm'; -import type { RuneListItem, RuneStatus } from '../../../types/rune'; -import type { AdminAccountEntry } from '../../../types/account'; - -export { Page }; +import { useCallback, useEffect, useState } from "react"; +import { Button } from "@base-ui/react/button"; +import { Combobox } from "@base-ui/react/combobox"; +import { Dialog as BaseDialog } from "@base-ui/react/dialog"; +import { Select } from "@base-ui/react/select"; +import { navigate } from "@/lib/router"; +import { usePageContext } from "vike-react/usePageContext"; +import { useAuth } from "../../../lib/auth"; +import { useToast } from "../../../lib/toast"; +import { api } from "../../../lib/api"; +import { Dialog } from "../../../components/Dialog/Dialog"; +import type { RealmDetail, RealmStatus } from "../../../types/realm"; +import type { RuneListItem, RuneStatus } from "../../../types/rune"; +import type { AdminAccountEntry } from "../../../types/account"; const realmStatusColors: Record = { active: { - bg: 'var(--color-green)', - border: 'var(--color-border)', - text: 'white', + bg: "var(--color-green)", + border: "var(--color-border)", + text: "white", }, inactive: { - bg: 'var(--color-border)', - border: 'var(--color-border)', - text: 'white', + bg: "var(--color-border)", + border: "var(--color-border)", + text: "white", }, }; const runeStatusColors: Record = { draft: { - bg: 'var(--color-bg)', - border: 'var(--color-border)', - text: 'var(--color-border)', + bg: "var(--color-bg)", + border: "var(--color-border)", + text: "var(--color-border)", }, open: { - bg: 'var(--color-blue)', - border: 'var(--color-border)', - text: 'white', + bg: "var(--color-blue)", + border: "var(--color-border)", + text: "white", }, in_progress: { - bg: 'var(--color-amber)', - border: 'var(--color-border)', - text: 'white', + bg: "var(--color-amber)", + border: "var(--color-border)", + text: "white", }, fulfilled: { - bg: 'var(--color-green)', - border: 'var(--color-border)', - text: 'white', + bg: "var(--color-green)", + border: "var(--color-border)", + text: "white", }, sealed: { - bg: 'var(--color-purple)', - border: 'var(--color-border)', - text: 'white', + bg: "var(--color-purple)", + border: "var(--color-border)", + text: "white", }, }; -function Page() { +const Page = () => { const pageContext = usePageContext(); const routeParams = pageContext.routeParams as Record; - const realmId = routeParams?.id ?? routeParams?.['@id'] ?? routeParams?.['-id'] ?? ''; + const realmId = routeParams?.id ?? routeParams?.["@id"] ?? routeParams?.["-id"] ?? ""; const { isAuthenticated, realms: sessionRealmIds, realmNames, loading: authLoading } = useAuth(); const { showToast } = useToast(); @@ -74,9 +72,9 @@ function Page() { const [isAssigning, setIsAssigning] = useState(false); const [availableAccounts, setAvailableAccounts] = useState([]); const [realmMemberIds, setRealmMemberIds] = useState([]); - const [accountFilter, setAccountFilter] = useState(''); - const [selectedAccountId, setSelectedAccountId] = useState(''); - const [selectedRole, setSelectedRole] = useState<'admin' | 'member' | 'viewer'>('member'); + const [accountFilter, setAccountFilter] = useState(""); + const [selectedAccountId, setSelectedAccountId] = useState(""); + const [selectedRole, setSelectedRole] = useState<"admin" | "member" | "viewer">("member"); const [memberToRemove, setMemberToRemove] = useState<{ account_id: string; username: string; @@ -85,7 +83,7 @@ function Page() { const normalizeRealmDetail = useCallback( (rawData: unknown): RealmDetail | null => { - if (!rawData || typeof rawData !== 'object') { + if (!rawData || typeof rawData !== "object") { return null; } @@ -106,24 +104,26 @@ function Page() { return null; } - const memberCount = - typeof rawRealm.member_count === 'number' - ? rawRealm.member_count - : Array.isArray(rawRealm.members) - ? rawRealm.members.length - : 0; + let memberCount = 0; + if (typeof rawRealm.member_count === "number") { + memberCount = rawRealm.member_count; + } else if (Array.isArray(rawRealm.members)) { + memberCount = rawRealm.members.length; + } else { + memberCount = 0; + } return { id, name: rawRealm.name ?? realmNames[id] ?? id, - status: rawRealm.status === 'suspended' ? 'inactive' : 'active', + status: rawRealm.status === "suspended" ? "inactive" : "active", created_at: rawRealm.created_at ?? new Date(0).toISOString(), - description: rawRealm.description ?? '', - owner_id: rawRealm.owner_id ?? '', + description: rawRealm.description ?? "", + owner_id: rawRealm.owner_id ?? "", member_count: memberCount, }; }, - [realmNames] + [realmNames], ); const toFallbackRealm = useCallback( @@ -135,18 +135,18 @@ function Page() { return { id: targetRealmId, name: realmNames[targetRealmId] ?? targetRealmId, - status: 'active', + status: "active", created_at: new Date(0).toISOString(), - description: '', - owner_id: '', + description: "", + owner_id: "", member_count: 0, }; }, - [realmNames, sessionRealmIds] + [realmNames, sessionRealmIds], ); const extractRealmMemberIds = useCallback((rawData: unknown): string[] => { - if (!rawData || typeof rawData !== 'object') { + if (!rawData || typeof rawData !== "object") { return []; } @@ -157,20 +157,22 @@ function Page() { return rawMembers .map((entry) => { - if (!entry || typeof entry !== 'object') { + if (!entry || typeof entry !== "object") { return null; } const accountId = (entry as { account_id?: unknown }).account_id; - return typeof accountId === 'string' ? accountId : null; + return typeof accountId === "string" ? accountId : null; }) .filter((accountId): accountId is string => accountId !== null); }, []); useEffect(() => { - if (authLoading) return; + if (authLoading) { + return; + } if (!isAuthenticated) { - navigate('/login'); + navigate("/login"); return; } @@ -197,7 +199,7 @@ function Page() { setRealmMemberIds([]); setAvailableAccounts([]); if (!fallbackRealm) { - showToast('Error', 'Failed to load realm', 'error'); + showToast("Error", "Failed to load realm", "error"); } } finally { setIsLoading(false); @@ -216,21 +218,23 @@ function Page() { ]); const handleSuspend = async () => { - if (!realm) return; + if (!realm) { + return; + } setIsSuspending(true); setIsLoading(true); try { await api.suspendRealm( - { realm_id: realm.id, reason: 'Suspended from realm details' }, - realm.id + { realm_id: realm.id, reason: "Suspended from realm details" }, + realm.id, ); - showToast('Realm Suspended', `${realm.name} is now suspended`, 'success'); + showToast("Realm Suspended", `${realm.name} is now suspended`, "success"); setShowSuspendDialog(false); const realmData = await api.getRealm(realm.id); setRealm(normalizeRealmDetail(realmData) ?? toFallbackRealm(realm.id)); } catch { - showToast('Error', 'Failed to suspend realm', 'error'); + showToast("Error", "Failed to suspend realm", "error"); } finally { setIsSuspending(false); setIsLoading(false); @@ -250,22 +254,22 @@ function Page() { realm_id: realm.id, role: selectedRole, }, - realm.id + realm.id, ); showToast( - 'Account Added', + "Account Added", `Assigned ${selectedRole} to ${selectedAccountId.trim()}`, - 'success' + "success", ); setShowAddAccountDialog(false); - setSelectedAccountId(''); - setAccountFilter(''); + setSelectedAccountId(""); + setAccountFilter(""); setIsLoading(true); const realmData = await api.getRealm(realm.id); setRealm(normalizeRealmDetail(realmData) ?? toFallbackRealm(realm.id)); setRealmMemberIds(extractRealmMemberIds(realmData)); } catch { - showToast('Error', 'Failed to add account to realm', 'error'); + showToast("Error", "Failed to add account to realm", "error"); } finally { setIsAssigning(false); } @@ -283,9 +287,9 @@ function Page() { account_id: memberToRemove.account_id, realm_id: realm.id, }, - realm.id + realm.id, ); - showToast('Member Removed', `${memberToRemove.username} removed from realm`, 'success'); + showToast("Member Removed", `${memberToRemove.username} removed from realm`, "success"); setMemberToRemove(null); setIsLoading(true); const [realmData, accountsData] = await Promise.all([ @@ -296,7 +300,7 @@ function Page() { setRealmMemberIds(extractRealmMemberIds(realmData)); setAvailableAccounts(Array.isArray(accountsData) ? accountsData : []); } catch { - showToast('Error', 'Failed to remove member', 'error'); + showToast("Error", "Failed to remove member", "error"); } finally { setIsRemovingMember(false); } @@ -304,21 +308,21 @@ function Page() { const formatDate = (dateStr: string) => { const date = new Date(dateStr); - return date.toLocaleDateString('en-US', { - year: 'numeric', - month: 'long', - day: 'numeric', - hour: '2-digit', - minute: '2-digit', + return date.toLocaleDateString("en-US", { + year: "numeric", + month: "long", + day: "numeric", + hour: "2-digit", + minute: "2-digit", }); }; const formatShortDate = (dateStr: string) => { const date = new Date(dateStr); - return date.toLocaleDateString('en-US', { - month: 'short', - day: 'numeric', - year: 'numeric', + return date.toLocaleDateString("en-US", { + month: "short", + day: "numeric", + year: "numeric", }); }; @@ -328,9 +332,9 @@ function Page() {
Loading... @@ -345,31 +349,31 @@ function Page() {

Realm Not Found

-

+

The realm you're looking for doesn't exist or you don't have access to it.

@@ -1021,4 +1025,6 @@ function Page() {
); -} +}; + +export { Page }; diff --git a/bifrost/ui/src/pages/realms/@id/+config.ts b/bifrost/ui/src/pages/realms/@id/+config.ts index e890c10..002027c 100644 --- a/bifrost/ui/src/pages/realms/@id/+config.ts +++ b/bifrost/ui/src/pages/realms/@id/+config.ts @@ -1,4 +1,4 @@ -import type { Config } from 'vike/types'; +import type { Config } from "vike/types"; // Opt out of pre-rendering for parameterized routes // These pages will be resolved client-side diff --git a/bifrost/ui/src/pages/realms/new/+Page.tsx b/bifrost/ui/src/pages/realms/new/+Page.tsx index a67139f..9adcc3d 100644 --- a/bifrost/ui/src/pages/realms/new/+Page.tsx +++ b/bifrost/ui/src/pages/realms/new/+Page.tsx @@ -1,14 +1,12 @@ -'use client'; +"use client"; -import { useState } from 'react'; -import { Button } from '@base-ui/react/button'; -import { Input } from '@base-ui/react/input'; -import { navigate } from '@/lib/router'; -import { useAuth } from '../../../lib/auth'; -import { useToast } from '../../../lib/toast'; -import { api } from '../../../lib/api'; - -export { Page }; +import { useState } from "react"; +import { Input } from "@base-ui/react/input"; +import { navigate } from "@/lib/router"; +import { useAuth } from "../../../lib/auth"; +import { useToast } from "../../../lib/toast"; +import { api } from "../../../lib/api"; +import { Wizard, type WizardStep } from "../../../components/Wizard/Wizard"; type FormData = { name: string; @@ -16,312 +14,132 @@ type FormData = { }; const INITIAL_FORM: FormData = { - name: '', - description: '', + name: "", + description: "", }; -const STEPS = [ - { id: 1, label: 'Name', field: 'name' as const }, - { id: 2, label: 'Description', field: 'description' as const }, -]; - -function Page() { +const Page = () => { const { isAuthenticated, loading: authLoading } = useAuth(); const { showToast } = useToast(); - - const [step, setStep] = useState(0); - const [form, setForm] = useState(INITIAL_FORM); + const [formData, setFormData] = useState(INITIAL_FORM); const [isSubmitting, setIsSubmitting] = useState(false); - if (authLoading) { - return ( -
-
- Loading... -
-
- ); - } - - if (!isAuthenticated) { - navigate('/login'); - return null; - } - - const updateForm = (field: K, value: FormData[K]) => { - setForm((prev) => ({ ...prev, [field]: value })); - }; - - const canProceed = () => { - switch (step) { - case 0: - return form.name.trim().length >= 2; - case 1: - return true; // Description is optional - default: - return false; - } + const handleInputChange = (field: keyof FormData) => (value: string) => { + setFormData((prev) => ({ ...prev, [field]: value })); }; const handleSubmit = async () => { setIsSubmitting(true); - try { - const realm = await api.createRealm({ - name: form.name.trim(), - description: form.description.trim() || '', - }); - showToast('Realm Created', `"${realm.name}" has been created`, 'success'); - navigate(`/realms/${realm.id}`); + await api.createRealm(formData); + showToast("Success", "Realm created successfully", "success"); + navigate("/realms"); } catch { - showToast('Error', 'Failed to create realm', 'error'); + showToast("Error", "Failed to create realm", "error"); + } finally { setIsSubmitting(false); } }; - const nextStep = () => { - if (step < STEPS.length - 1) { - setStep(step + 1); - } else { - handleSubmit(); - } - }; - - const prevStep = () => { - if (step > 0) { - setStep(step - 1); - } - }; + if (authLoading) { + return ( +
+
+
+

Loading...

+
+
+ ); + } - return ( -
- {/* Header */} -
- -

- New Realm -

-

- Create a new workspace for your project -

+ if (!isAuthenticated) { + return ( +
+
+

Authentication Required

+

Please log in to create a realm.

+
+ ); + } - {/* Progress Steps */} -
- {STEPS.map((s, idx) => ( -
+

What should we call this realm?

+

Choose a descriptive name for your realm.

+ handleInputChange("name")(event.target.value)} + placeholder="e.g., My Awesome Realm" + className="w-full" style={{ - backgroundColor: idx <= step ? 'var(--color-green)' : 'var(--color-surface)', - border: '1px solid var(--color-border)', + backgroundColor: "var(--color-bg)", + border: "2px solid var(--color-border)", + color: "var(--color-text)", + }} + onFocus={(event) => { + event.currentTarget.style.boxShadow = "var(--shadow-soft-hover)"; + }} + onBlur={(event) => { + event.currentTarget.style.boxShadow = "var(--shadow-soft)"; }} /> - ))} -
- - {/* Wizard Card */} -
- {/* Step Title */} -
-

- {STEPS[step].label} -

- + ), + }, + { + title: "Description", + content: ( +
+

Tell us about this realm

+

+ Provide a brief description to help others understand its purpose. +

+