AdmSysV2【公共组件库】@前端(For Git Submodule)
Tevin
1 days ago c4daf8262b09c988bcbfd3161427094a86e455b8
config: 更新项目配置和格式规范

- 更新 Claude Code 本地设置
- 添加 .prettierrc 统一代码格式化配置
- 更新 pnpm-lock.yaml 依赖锁定
- 优化 tsconfig.app.json TypeScript 配置

Co-Authored-By: ClaudeCode
5 files modified
1 files added
554 ■■■■■ changed files
.claude/settings.json 18 ●●●● patch | view | raw | blame | history
.gitignore 1 ●●●● patch | view | raw | blame | history
.prettierrc 18 ●●●●● patch | view | raw | blame | history
package.json 1 ●●●● patch | view | raw | blame | history
pnpm-lock.yaml 468 ●●●●● patch | view | raw | blame | history
tsconfig.app.json 48 ●●●● patch | view | raw | blame | history
.claude/settings.json
@@ -1,20 +1,34 @@
{
    "permissions": {
        "allow": [
            "Read(openspec/**)",
            "Edit(openspec/**)",
            "Read(src/**)",
            "Edit(src/**)",
            "Read(public/**)",
            "Edit(public/**)",
            "Bash(npx tsc:*)",
            "Read(example/**)",
            "Edit(example/**)",
            "Read(test/**)",
            "Edit(test/**)",
            "Bash(pnpm run *)",
            "Bash(pnpm eslint *)",
            "Bash(pnpm dev:*)",
            "Bash(pnpm test:run:*)",
            "Bash(pnpm build:*)",
            "Bash(pnpm test:*)",
            "Bash(pnpm exec playwright open:*)",
            "Bash(pnpm exec playwright test:*)",
            "Bash(openspec *)",
            "Bash(openspec new change *)",
            "Bash(openspec status *)",
            "Bash(openspec instructions *)",
            "Bash(cmd //c \"openspec new change *\")",
            "Bash(cmd //c \"openspec status *\")",
            "Bash(cmd //c \"openspec instructions *\")"
        ]
        ],
        "deny": ["Edit(openspec/docs/old-refactors/**)"]
    }
}
.gitignore
@@ -23,3 +23,4 @@
*.njsproj
*.sln
*.sw?
test-results/
.prettierrc
New file
@@ -0,0 +1,18 @@
{
    "printWidth": 90,
    "useTabs": false,
    "tabWidth": 4,
    "trailingComma": "all",
    "bracketSpacing": true,
    "singleQuote": true,
    "arrowParens": "avoid",
    "semi": true,
    "overrides": [
        {
            "files": "*.js",
            "options": {
                "printWidth": 100
            }
        }
    ]
}
package.json
@@ -35,6 +35,7 @@
    "globals": "^17.4.0",
    "jsdom": "^29.0.2",
    "playwright": "^1.59.1",
    "sass-embedded": "^1.99.0",
    "typescript": "~5.9.3",
    "typescript-eslint": "^8.57.0",
    "vite": "^8.0.1",
pnpm-lock.yaml
@@ -47,7 +47,7 @@
        version: 19.2.3(@types/react@19.2.14)
      '@vitejs/plugin-react':
        specifier: ^6.0.1
        version: 6.0.1(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0))
        version: 6.0.1(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0)(sass-embedded@1.99.0)(sass@1.99.0))
      eslint:
        specifier: ^9.39.4
        version: 9.39.4
@@ -72,6 +72,9 @@
      playwright:
        specifier: ^1.59.1
        version: 1.59.1
      sass-embedded:
        specifier: ^1.99.0
        version: 1.99.0
      typescript:
        specifier: ~5.9.3
        version: 5.9.3
@@ -80,10 +83,10 @@
        version: 8.58.0(eslint@9.39.4)(typescript@5.9.3)
      vite:
        specifier: ^8.0.1
        version: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0)
        version: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0)(sass-embedded@1.99.0)(sass@1.99.0)
      vitest:
        specifier: ^4.1.2
        version: 4.1.2(@types/node@24.12.0)(jsdom@29.0.2)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0))
        version: 4.1.2(@types/node@24.12.0)(jsdom@29.0.2)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0)(sass-embedded@1.99.0)(sass@1.99.0))
packages:
@@ -210,6 +213,9 @@
  '@bramus/specificity@2.4.2':
    resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==}
    hasBin: true
  '@bufbuild/protobuf@2.11.0':
    resolution: {integrity: sha512-sBXGT13cpmPR5BMgHE6UEEfEaShh5Ror6rfN3yEK5si7QVrtZg8LEPQb0VVhiLRUslD2yLnXtnRzG035J/mZXQ==}
  '@csstools/color-helpers@6.0.2':
    resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==}
@@ -384,6 +390,94 @@
  '@oxc-project/types@0.122.0':
    resolution: {integrity: sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==}
  '@parcel/watcher-android-arm64@2.5.6':
    resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==}
    engines: {node: '>= 10.0.0'}
    cpu: [arm64]
    os: [android]
  '@parcel/watcher-darwin-arm64@2.5.6':
    resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==}
    engines: {node: '>= 10.0.0'}
    cpu: [arm64]
    os: [darwin]
  '@parcel/watcher-darwin-x64@2.5.6':
    resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==}
    engines: {node: '>= 10.0.0'}
    cpu: [x64]
    os: [darwin]
  '@parcel/watcher-freebsd-x64@2.5.6':
    resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==}
    engines: {node: '>= 10.0.0'}
    cpu: [x64]
    os: [freebsd]
  '@parcel/watcher-linux-arm-glibc@2.5.6':
    resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==}
    engines: {node: '>= 10.0.0'}
    cpu: [arm]
    os: [linux]
    libc: [glibc]
  '@parcel/watcher-linux-arm-musl@2.5.6':
    resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==}
    engines: {node: '>= 10.0.0'}
    cpu: [arm]
    os: [linux]
    libc: [musl]
  '@parcel/watcher-linux-arm64-glibc@2.5.6':
    resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==}
    engines: {node: '>= 10.0.0'}
    cpu: [arm64]
    os: [linux]
    libc: [glibc]
  '@parcel/watcher-linux-arm64-musl@2.5.6':
    resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==}
    engines: {node: '>= 10.0.0'}
    cpu: [arm64]
    os: [linux]
    libc: [musl]
  '@parcel/watcher-linux-x64-glibc@2.5.6':
    resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==}
    engines: {node: '>= 10.0.0'}
    cpu: [x64]
    os: [linux]
    libc: [glibc]
  '@parcel/watcher-linux-x64-musl@2.5.6':
    resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==}
    engines: {node: '>= 10.0.0'}
    cpu: [x64]
    os: [linux]
    libc: [musl]
  '@parcel/watcher-win32-arm64@2.5.6':
    resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==}
    engines: {node: '>= 10.0.0'}
    cpu: [arm64]
    os: [win32]
  '@parcel/watcher-win32-ia32@2.5.6':
    resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==}
    engines: {node: '>= 10.0.0'}
    cpu: [ia32]
    os: [win32]
  '@parcel/watcher-win32-x64@2.5.6':
    resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==}
    engines: {node: '>= 10.0.0'}
    cpu: [x64]
    os: [win32]
  '@parcel/watcher@2.5.6':
    resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==}
    engines: {node: '>= 10.0.0'}
  '@playwright/mcp@0.0.70':
    resolution: {integrity: sha512-Kl0a6l9VL8rvT1oBou3hS5yArjwWV9UlwAkq+0skfK1YVg8XfmmNaAmwZhMeNx/ZhGiWXfCllo6rD/jvZz+WuA==}
@@ -1022,6 +1116,10 @@
    resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
    engines: {node: '>=10'}
  chokidar@4.0.3:
    resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
    engines: {node: '>= 14.16.0'}
  clsx@2.1.1:
    resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
    engines: {node: '>=6'}
@@ -1032,6 +1130,9 @@
  color-name@1.1.4:
    resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
  colorjs.io@0.5.2:
    resolution: {integrity: sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==}
  compare-versions@6.1.1:
    resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==}
@@ -1272,6 +1373,9 @@
    resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==}
    engines: {node: '>= 4'}
  immutable@5.1.5:
    resolution: {integrity: sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==}
  import-fresh@3.3.1:
    resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
    engines: {node: '>=6'}
@@ -1466,6 +1570,9 @@
  natural-compare@1.4.0:
    resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
  node-addon-api@7.1.1:
    resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
  node-releases@2.0.36:
    resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==}
@@ -1560,6 +1667,10 @@
    resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==}
    engines: {node: '>=0.10.0'}
  readdirp@4.1.2:
    resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
    engines: {node: '>= 14.18.0'}
  redent@3.0.0:
    resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
    engines: {node: '>=8'}
@@ -1575,6 +1686,131 @@
  rolldown@1.0.0-rc.12:
    resolution: {integrity: sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==}
    engines: {node: ^20.19.0 || >=22.12.0}
    hasBin: true
  rxjs@7.8.2:
    resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==}
  sass-embedded-all-unknown@1.99.0:
    resolution: {integrity: sha512-qPIRG8Uhjo6/OKyAKixTnwMliTz+t9K6Duk0mx5z+K7n0Ts38NSJz2sjDnc7cA/8V9Lb3q09H38dZ1CLwD+ssw==}
    cpu: ['!arm', '!arm64', '!riscv64', '!x64']
  sass-embedded-android-arm64@1.99.0:
    resolution: {integrity: sha512-fNHhdnP23yqqieCbAdym4N47AleSwjbNt6OYIYx4DdACGdtERjQB4iOX/TaKsW034MupfF7SjnAAK8w7Ptldtg==}
    engines: {node: '>=14.0.0'}
    cpu: [arm64]
    os: [android]
  sass-embedded-android-arm@1.99.0:
    resolution: {integrity: sha512-EHvJ0C7/VuP78Qr6f8gIUVUmCqIorEQpw2yp3cs3SMg02ZuumlhjXvkTcFBxHmFdFR23vTNk1WnhY6QSeV1nFQ==}
    engines: {node: '>=14.0.0'}
    cpu: [arm]
    os: [android]
  sass-embedded-android-riscv64@1.99.0:
    resolution: {integrity: sha512-4zqDFRvgGDTL5vTHuIhRxUpXFoh0Cy7Gm5Ywk19ASd8Settmd14YdPRZPmMxfgS1GH292PofV1fq1ifiSEJWBw==}
    engines: {node: '>=14.0.0'}
    cpu: [riscv64]
    os: [android]
  sass-embedded-android-x64@1.99.0:
    resolution: {integrity: sha512-Uk53k/dGYt04RjOL4gFjZ0Z9DH9DKh8IA8WsXUkNqsxerAygoy3zqRBS2zngfE9K2jiOM87q+1R1p87ory9oQQ==}
    engines: {node: '>=14.0.0'}
    cpu: [x64]
    os: [android]
  sass-embedded-darwin-arm64@1.99.0:
    resolution: {integrity: sha512-u61/7U3IGLqoO6gL+AHeiAtlTPFwJK1+964U8gp45ZN0hzh1yrARf5O1mivXv8NnNgJvbG2wWJbiNZP0lG/lTg==}
    engines: {node: '>=14.0.0'}
    cpu: [arm64]
    os: [darwin]
  sass-embedded-darwin-x64@1.99.0:
    resolution: {integrity: sha512-j/kkk/NcXdIameLezSfXjgCiBkVcA+G60AXrX768/3g0miK1g7M9dj7xOhCb1i7/wQeiEI3rw2LLuO63xRIn4A==}
    engines: {node: '>=14.0.0'}
    cpu: [x64]
    os: [darwin]
  sass-embedded-linux-arm64@1.99.0:
    resolution: {integrity: sha512-btNcFpItcB56L40n8hDeL7sRSMLDXQ56nB5h2deddJx1n60rpKSElJmkaDGHtpkrY+CTtDRV0FZDjHeTJddYew==}
    engines: {node: '>=14.0.0'}
    cpu: [arm64]
    os: [linux]
    libc: glibc
  sass-embedded-linux-arm@1.99.0:
    resolution: {integrity: sha512-d4IjJZrX2+AwB2YCy1JySwdptJECNP/WfAQLUl8txI3ka8/d3TUI155GtelnoZUkio211PwIeFvvAeZ9RXPQnw==}
    engines: {node: '>=14.0.0'}
    cpu: [arm]
    os: [linux]
    libc: glibc
  sass-embedded-linux-musl-arm64@1.99.0:
    resolution: {integrity: sha512-Hi2bt/IrM5P4FBKz6EcHAlniwfpoz9mnTdvSd58y+avA3SANM76upIkAdSayA8ZGwyL3gZokru1AKDPF9lJDNw==}
    engines: {node: '>=14.0.0'}
    cpu: [arm64]
    os: [linux]
    libc: musl
  sass-embedded-linux-musl-arm@1.99.0:
    resolution: {integrity: sha512-2gvHOupgIw3ytatXT4nFUow71LFbuOZPEwG+HUzcNQDH8ue4Ez8cr03vsv5MDv3lIjOKcXwDvWD980t18MwkoQ==}
    engines: {node: '>=14.0.0'}
    cpu: [arm]
    os: [linux]
    libc: musl
  sass-embedded-linux-musl-riscv64@1.99.0:
    resolution: {integrity: sha512-mKqGvVaJ9rHMqyZsF0kikQe4NO0f4osb67+X6nLhBiVDKvyazQHJ3zJQreNefIE36yL2sjHIclSB//MprzaQDg==}
    engines: {node: '>=14.0.0'}
    cpu: [riscv64]
    os: [linux]
    libc: musl
  sass-embedded-linux-musl-x64@1.99.0:
    resolution: {integrity: sha512-huhgOMmOc30r7CH7qbRbT9LerSEGSnWuS4CYNOskr9BvNeQp4dIneFufNRGZ7hkOAxUM8DglxIZJN/cyAT95Ew==}
    engines: {node: '>=14.0.0'}
    cpu: [x64]
    os: [linux]
    libc: musl
  sass-embedded-linux-riscv64@1.99.0:
    resolution: {integrity: sha512-mevFPIFAVhrH90THifxLfOntFmHtcEKOcdWnep2gJ0X4DVva4AiVIRlQe/7w9JFx5+gnDRE1oaJJkzuFUuYZsA==}
    engines: {node: '>=14.0.0'}
    cpu: [riscv64]
    os: [linux]
    libc: glibc
  sass-embedded-linux-x64@1.99.0:
    resolution: {integrity: sha512-9k7IkULqIZdCIVt4Mboryt6vN8Mjmm3EhI1P3mClU5y5i3wLK5ExC3cbVWk047KsID/fvB1RLslqghXJx5BoxA==}
    engines: {node: '>=14.0.0'}
    cpu: [x64]
    os: [linux]
    libc: glibc
  sass-embedded-unknown-all@1.99.0:
    resolution: {integrity: sha512-P7MxiUtL/XzGo3PX0CaB8lNNEFLQWKikPA8pbKytx9ZCLZSDkt2NJcdAbblB/sqMs4AV3EK2NadV8rI/diq3xg==}
    os: ['!android', '!darwin', '!linux', '!win32']
  sass-embedded-win32-arm64@1.99.0:
    resolution: {integrity: sha512-8whpsW7S+uO8QApKfQuc36m3P9EISzbVZOgC79goob4qGy09u8Gz/rYvw8h1prJDSjltpHGhOzBE6LDz7WvzVw==}
    engines: {node: '>=14.0.0'}
    cpu: [arm64]
    os: [win32]
  sass-embedded-win32-x64@1.99.0:
    resolution: {integrity: sha512-ipuOv1R2K4MHeuCEAZGpuUbAgma4gb0sdacyrTjJtMOy/OY9UvWfVlwErdB09KIkp4fPDpQJDJfvYN6bC8jeNg==}
    engines: {node: '>=14.0.0'}
    cpu: [x64]
    os: [win32]
  sass-embedded@1.99.0:
    resolution: {integrity: sha512-gF/juR1aX02lZHkvwxdF80SapkQeg2fetoDF6gIQkNbSw5YEUFspMkyGTjPjgZSgIHuZpy+Wz4PlebKnLXMjdg==}
    engines: {node: '>=16.0.0'}
    hasBin: true
  sass@1.99.0:
    resolution: {integrity: sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q==}
    engines: {node: '>=14.0.0'}
    hasBin: true
  saxes@6.0.0:
@@ -1638,8 +1874,20 @@
    resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
    engines: {node: '>=8'}
  supports-color@8.1.1:
    resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
    engines: {node: '>=10'}
  symbol-tree@3.2.4:
    resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
  sync-child-process@1.0.2:
    resolution: {integrity: sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==}
    engines: {node: '>=16.0.0'}
  sync-message-port@1.2.0:
    resolution: {integrity: sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==}
    engines: {node: '>=16.0.0'}
  throttle-debounce@5.0.2:
    resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==}
@@ -1718,6 +1966,9 @@
  uri-js@4.4.1:
    resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
  varint@6.0.0:
    resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==}
  vite@8.0.3:
    resolution: {integrity: sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==}
@@ -2022,6 +2273,8 @@
    dependencies:
      css-tree: 3.2.1
  '@bufbuild/protobuf@2.11.0': {}
  '@csstools/color-helpers@6.0.2': {}
  '@csstools/css-calc@3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)':
@@ -2214,6 +2467,67 @@
    optional: true
  '@oxc-project/types@0.122.0': {}
  '@parcel/watcher-android-arm64@2.5.6':
    optional: true
  '@parcel/watcher-darwin-arm64@2.5.6':
    optional: true
  '@parcel/watcher-darwin-x64@2.5.6':
    optional: true
  '@parcel/watcher-freebsd-x64@2.5.6':
    optional: true
  '@parcel/watcher-linux-arm-glibc@2.5.6':
    optional: true
  '@parcel/watcher-linux-arm-musl@2.5.6':
    optional: true
  '@parcel/watcher-linux-arm64-glibc@2.5.6':
    optional: true
  '@parcel/watcher-linux-arm64-musl@2.5.6':
    optional: true
  '@parcel/watcher-linux-x64-glibc@2.5.6':
    optional: true
  '@parcel/watcher-linux-x64-musl@2.5.6':
    optional: true
  '@parcel/watcher-win32-arm64@2.5.6':
    optional: true
  '@parcel/watcher-win32-ia32@2.5.6':
    optional: true
  '@parcel/watcher-win32-x64@2.5.6':
    optional: true
  '@parcel/watcher@2.5.6':
    dependencies:
      detect-libc: 2.1.2
      is-glob: 4.0.3
      node-addon-api: 7.1.1
      picomatch: 4.0.4
    optionalDependencies:
      '@parcel/watcher-android-arm64': 2.5.6
      '@parcel/watcher-darwin-arm64': 2.5.6
      '@parcel/watcher-darwin-x64': 2.5.6
      '@parcel/watcher-freebsd-x64': 2.5.6
      '@parcel/watcher-linux-arm-glibc': 2.5.6
      '@parcel/watcher-linux-arm-musl': 2.5.6
      '@parcel/watcher-linux-arm64-glibc': 2.5.6
      '@parcel/watcher-linux-arm64-musl': 2.5.6
      '@parcel/watcher-linux-x64-glibc': 2.5.6
      '@parcel/watcher-linux-x64-musl': 2.5.6
      '@parcel/watcher-win32-arm64': 2.5.6
      '@parcel/watcher-win32-ia32': 2.5.6
      '@parcel/watcher-win32-x64': 2.5.6
    optional: true
  '@playwright/mcp@0.0.70':
    dependencies:
@@ -2777,10 +3091,10 @@
      '@typescript-eslint/types': 8.58.0
      eslint-visitor-keys: 5.0.1
  '@vitejs/plugin-react@6.0.1(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0))':
  '@vitejs/plugin-react@6.0.1(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0)(sass-embedded@1.99.0)(sass@1.99.0))':
    dependencies:
      '@rolldown/pluginutils': 1.0.0-rc.7
      vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0)
      vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0)(sass-embedded@1.99.0)(sass@1.99.0)
  '@vitest/expect@4.1.2':
    dependencies:
@@ -2791,13 +3105,13 @@
      chai: 6.2.2
      tinyrainbow: 3.1.0
  '@vitest/mocker@4.1.2(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0))':
  '@vitest/mocker@4.1.2(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0)(sass-embedded@1.99.0)(sass@1.99.0))':
    dependencies:
      '@vitest/spy': 4.1.2
      estree-walker: 3.0.3
      magic-string: 0.30.21
    optionalDependencies:
      vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0)
      vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0)(sass-embedded@1.99.0)(sass@1.99.0)
  '@vitest/pretty-format@4.1.2':
    dependencies:
@@ -2949,6 +3263,11 @@
      ansi-styles: 4.3.0
      supports-color: 7.2.0
  chokidar@4.0.3:
    dependencies:
      readdirp: 4.1.2
    optional: true
  clsx@2.1.1: {}
  color-convert@2.0.1:
@@ -2956,6 +3275,8 @@
      color-name: 1.1.4
  color-name@1.1.4: {}
  colorjs.io@0.5.2: {}
  compare-versions@6.1.1: {}
@@ -3201,6 +3522,8 @@
  ignore@7.0.5: {}
  immutable@5.1.5: {}
  import-fresh@3.3.1:
    dependencies:
      parent-module: 1.0.1
@@ -3362,6 +3685,9 @@
  natural-compare@1.4.0: {}
  node-addon-api@7.1.1:
    optional: true
  node-releases@2.0.36: {}
  obug@2.1.1: {}
@@ -3444,6 +3770,9 @@
  react@19.2.4: {}
  readdirp@4.1.2:
    optional: true
  redent@3.0.0:
    dependencies:
      indent-string: 4.0.0
@@ -3476,6 +3805,106 @@
    transitivePeerDependencies:
      - '@emnapi/core'
      - '@emnapi/runtime'
  rxjs@7.8.2:
    dependencies:
      tslib: 2.8.1
  sass-embedded-all-unknown@1.99.0:
    dependencies:
      sass: 1.99.0
    optional: true
  sass-embedded-android-arm64@1.99.0:
    optional: true
  sass-embedded-android-arm@1.99.0:
    optional: true
  sass-embedded-android-riscv64@1.99.0:
    optional: true
  sass-embedded-android-x64@1.99.0:
    optional: true
  sass-embedded-darwin-arm64@1.99.0:
    optional: true
  sass-embedded-darwin-x64@1.99.0:
    optional: true
  sass-embedded-linux-arm64@1.99.0:
    optional: true
  sass-embedded-linux-arm@1.99.0:
    optional: true
  sass-embedded-linux-musl-arm64@1.99.0:
    optional: true
  sass-embedded-linux-musl-arm@1.99.0:
    optional: true
  sass-embedded-linux-musl-riscv64@1.99.0:
    optional: true
  sass-embedded-linux-musl-x64@1.99.0:
    optional: true
  sass-embedded-linux-riscv64@1.99.0:
    optional: true
  sass-embedded-linux-x64@1.99.0:
    optional: true
  sass-embedded-unknown-all@1.99.0:
    dependencies:
      sass: 1.99.0
    optional: true
  sass-embedded-win32-arm64@1.99.0:
    optional: true
  sass-embedded-win32-x64@1.99.0:
    optional: true
  sass-embedded@1.99.0:
    dependencies:
      '@bufbuild/protobuf': 2.11.0
      colorjs.io: 0.5.2
      immutable: 5.1.5
      rxjs: 7.8.2
      supports-color: 8.1.1
      sync-child-process: 1.0.2
      varint: 6.0.0
    optionalDependencies:
      sass-embedded-all-unknown: 1.99.0
      sass-embedded-android-arm: 1.99.0
      sass-embedded-android-arm64: 1.99.0
      sass-embedded-android-riscv64: 1.99.0
      sass-embedded-android-x64: 1.99.0
      sass-embedded-darwin-arm64: 1.99.0
      sass-embedded-darwin-x64: 1.99.0
      sass-embedded-linux-arm: 1.99.0
      sass-embedded-linux-arm64: 1.99.0
      sass-embedded-linux-musl-arm: 1.99.0
      sass-embedded-linux-musl-arm64: 1.99.0
      sass-embedded-linux-musl-riscv64: 1.99.0
      sass-embedded-linux-musl-x64: 1.99.0
      sass-embedded-linux-riscv64: 1.99.0
      sass-embedded-linux-x64: 1.99.0
      sass-embedded-unknown-all: 1.99.0
      sass-embedded-win32-arm64: 1.99.0
      sass-embedded-win32-x64: 1.99.0
  sass@1.99.0:
    dependencies:
      chokidar: 4.0.3
      immutable: 5.1.5
      source-map-js: 1.2.1
    optionalDependencies:
      '@parcel/watcher': 2.5.6
    optional: true
  saxes@6.0.0:
    dependencies:
@@ -3521,7 +3950,17 @@
    dependencies:
      has-flag: 4.0.0
  supports-color@8.1.1:
    dependencies:
      has-flag: 4.0.0
  symbol-tree@3.2.4: {}
  sync-child-process@1.0.2:
    dependencies:
      sync-message-port: 1.2.0
  sync-message-port@1.2.0: {}
  throttle-debounce@5.0.2: {}
@@ -3556,8 +3995,7 @@
  ts-pattern@5.9.0: {}
  tslib@2.8.1:
    optional: true
  tslib@2.8.1: {}
  type-check@0.4.0:
    dependencies:
@@ -3590,7 +4028,9 @@
    dependencies:
      punycode: 2.3.1
  vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0):
  varint@6.0.0: {}
  vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0)(sass-embedded@1.99.0)(sass@1.99.0):
    dependencies:
      lightningcss: 1.32.0
      picomatch: 4.0.4
@@ -3600,14 +4040,16 @@
    optionalDependencies:
      '@types/node': 24.12.0
      fsevents: 2.3.3
      sass: 1.99.0
      sass-embedded: 1.99.0
    transitivePeerDependencies:
      - '@emnapi/core'
      - '@emnapi/runtime'
  vitest@4.1.2(@types/node@24.12.0)(jsdom@29.0.2)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0)):
  vitest@4.1.2(@types/node@24.12.0)(jsdom@29.0.2)(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0)(sass-embedded@1.99.0)(sass@1.99.0)):
    dependencies:
      '@vitest/expect': 4.1.2
      '@vitest/mocker': 4.1.2(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0))
      '@vitest/mocker': 4.1.2(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0)(sass-embedded@1.99.0)(sass@1.99.0))
      '@vitest/pretty-format': 4.1.2
      '@vitest/runner': 4.1.2
      '@vitest/snapshot': 4.1.2
@@ -3624,7 +4066,7 @@
      tinyexec: 1.0.4
      tinyglobby: 0.2.15
      tinyrainbow: 3.1.0
      vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0)
      vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@24.12.0)(sass-embedded@1.99.0)(sass@1.99.0)
      why-is-node-running: 2.3.0
    optionalDependencies:
      '@types/node': 24.12.0
tsconfig.app.json
@@ -1,28 +1,28 @@
{
  "compilerOptions": {
    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
    "target": "ES2023",
    "useDefineForClassFields": true,
    "lib": ["ES2023", "DOM", "DOM.Iterable"],
    "module": "ESNext",
    "types": ["vite/client"],
    "skipLibCheck": true,
    "compilerOptions": {
        "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
        "target": "ES2023",
        "useDefineForClassFields": true,
        "lib": ["ES2023", "DOM", "DOM.Iterable"],
        "module": "ESNext",
        "types": ["vite/client"],
        "skipLibCheck": true,
    /* Bundler mode */
    "moduleResolution": "bundler",
    "allowImportingTsExtensions": true,
    "verbatimModuleSyntax": true,
    "moduleDetection": "force",
    "noEmit": true,
    "jsx": "react-jsx",
        /* Bundler mode */
        "moduleResolution": "bundler",
        "allowImportingTsExtensions": true,
        "verbatimModuleSyntax": true,
        "moduleDetection": "force",
        "noEmit": true,
        "jsx": "react-jsx",
    /* Linting */
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "erasableSyntaxOnly": true,
    "noFallthroughCasesInSwitch": true,
    "noUncheckedSideEffectImports": true
  },
  "include": ["src"]
        /* Linting */
        "strict": true,
        "noUnusedLocals": true,
        "noUnusedParameters": true,
        "erasableSyntaxOnly": true,
        "noFallthroughCasesInSwitch": true,
        "noUncheckedSideEffectImports": true
    },
    "include": ["src", "example", "test"]
}