diff --git a/.cursor/rules/xlsx-js-style.mdc b/.cursor/rules/xlsx-js-style.mdc new file mode 100644 index 0000000..b93c988 --- /dev/null +++ b/.cursor/rules/xlsx-js-style.mdc @@ -0,0 +1,5 @@ +--- +description: +globs: +alwaysApply: false +--- diff --git a/package-lock.json b/package-lock.json index f1748cc..3d74f73 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,22 @@ "license": "MIT", "dependencies": { "@tailwindcss/postcss": "^4.1.10", + "@univerjs/core": "^0.8.2", + "@univerjs/design": "^0.8.2", + "@univerjs/docs": "^0.8.2", + "@univerjs/docs-ui": "^0.8.2", + "@univerjs/engine-formula": "^0.8.2", + "@univerjs/engine-numfmt": "^0.8.2", + "@univerjs/engine-render": "^0.8.2", + "@univerjs/facade": "^0.5.5", + "@univerjs/sheets": "^0.8.2", + "@univerjs/sheets-formula": "^0.8.2", + "@univerjs/sheets-formula-ui": "^0.8.2", + "@univerjs/sheets-numfmt": "^0.8.2", + "@univerjs/sheets-numfmt-ui": "^0.8.2", + "@univerjs/sheets-ui": "^0.8.2", + "@univerjs/ui": "^0.8.2", + "@univerjs/uniscript": "^0.8.2", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "file-saver": "^2.0.5", @@ -18,9 +34,7 @@ "luckysheet": "^2.1.13", "react": "^18.3.1", "react-dom": "^18.3.1", - "sheetjs-style": "^0.15.8", "tailwind-merge": "^2.5.4", - "xlsx": "^0.18.5", "zustand": "^5.0.2" }, "devDependencies": { @@ -37,6 +51,7 @@ "@vitejs/plugin-react": "^4.3.4", "@vitest/ui": "^3.2.4", "autoprefixer": "^10.4.20", + "buffer": "^6.0.3", "eslint": "^9.15.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-react-hooks": "^5.0.0", @@ -45,6 +60,7 @@ "jest-environment-jsdom": "^29.7.0", "postcss": "^8.5.1", "prettier": "^3.4.2", + "stream-browserify": "^3.0.0", "tailwindcss": "^3.4.17", "typescript": "~5.6.2", "vite": "^6.0.1", @@ -83,6 +99,18 @@ "node": ">=6.0.0" } }, + "node_modules/@ant-design/fast-color": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-2.0.6.tgz", + "integrity": "sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7" + }, + "engines": { + "node": ">=8.x" + } + }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -219,7 +247,7 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -229,7 +257,7 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -263,7 +291,7 @@ "version": "7.27.5", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/types": "^7.27.3" @@ -364,7 +392,7 @@ "version": "7.27.6", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -966,6 +994,83 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@flatten-js/interval-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@flatten-js/interval-tree/-/interval-tree-1.1.3.tgz", + "integrity": "sha512-xhFWUBoHJFF77cJO1D6REjdgJEMRf2Y2Z+eKEPav8evGKcLSnj1ud5pLXQSbGuxF3VSvT1rWhMfVpXEKJLTL+A==", + "license": "MIT" + }, + "node_modules/@floating-ui/core": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.1.tgz", + "integrity": "sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.1.tgz", + "integrity": "sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.1", + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.3.tgz", + "integrity": "sha512-huMBfiU9UnQ2oBwIhgzyIiSpVgvlDstU8CX0AF+wS+KzmYMs0J2a3GwuFHV1Lz+jlrQGeC1fF+Nv0QoumyV0bA==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", + "license": "MIT" + }, + "node_modules/@grpc/grpc-js": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.4.tgz", + "integrity": "sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", + "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -1376,6 +1481,17 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1432,6 +1548,864 @@ "dev": true, "license": "MIT" }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", + "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.14.tgz", + "integrity": "sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.10", + "@radix-ui/react-focus-guards": "1.1.2", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.10.tgz", + "integrity": "sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.15.tgz", + "integrity": "sha512-mIBnOjgwo9AH3FyKaSWoSu/dYj6VdhJ7frEPiGTeXCdUFHjl9h3mFh2wwhEtINOmYXWhdpf1rY2minFsmaNgVQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-menu": "2.1.15", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz", + "integrity": "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-hover-card": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.14.tgz", + "integrity": "sha512-CPYZ24Mhirm+g6D8jArmLzjYu4Eyg3TTUHswR26QgzXBHBe64BO/RHOJKzmF/Dxb4y4f9PKyJdwm/O/AhNkb+Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.10", + "@radix-ui/react-popper": "1.2.7", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.15.tgz", + "integrity": "sha512-tVlmA3Vb9n8SZSd+YSbuFR66l87Wiy4du+YE+0hzKQEANA+7cWKH1WgqcEX4pXqxUFQKrWQGHdvEfw00TjFiew==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.10", + "@radix-ui/react-focus-guards": "1.1.2", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.7", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.10", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.14.tgz", + "integrity": "sha512-ODz16+1iIbGUfFEfKx2HTPKizg2MN39uIOV8MXeHnmdd3i/N9Wt7vU46wbHsqA0xoaQyXVcs0KIlBdOA2Y95bw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.10", + "@radix-ui/react-focus-guards": "1.1.2", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.7", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.7.tgz", + "integrity": "sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz", + "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.10.tgz", + "integrity": "sha512-dT9aOXUen9JSsxnMPv/0VqySQf5eDQ6LCk5Sw28kamz8wSOW2bJdlX2Bg5VUIIcV+6XlHpWTIuTPCf/UNIyq8Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz", + "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.7.tgz", + "integrity": "sha512-Ap+fNYwKTYJ9pzqW+Xe2HtMRbQ/EeWkj2qykZ6SuEV4iS/o1bZI5ssJbk4D2r8XuDuOBVz/tIx2JObtuqU+5Zw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.10", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.7", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", + "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "license": "MIT" + }, + "node_modules/@rc-component/color-picker": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-2.0.1.tgz", + "integrity": "sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==", + "license": "MIT", + "dependencies": { + "@ant-design/fast-color": "^2.0.6", + "@babel/runtime": "^7.23.6", + "classnames": "^2.2.6", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/mini-decimal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", + "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@rc-component/portal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", + "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/trigger": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.2.7.tgz", + "integrity": "sha512-Qggj4Z0AA2i5dJhzlfFSmg1Qrziu8dsdHOihROL5Kl18seO2Eh/ZaTYt2c8a/CyGaTChnFry7BEYew1+/fhSbA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@rc-component/portal": "^1.1.0", + "classnames": "^2.3.2", + "rc-motion": "^2.0.0", + "rc-resize-observer": "^1.3.1", + "rc-util": "^5.44.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.11", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.11.tgz", @@ -2334,7 +3308,6 @@ "version": "24.0.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.3.tgz", "integrity": "sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==", - "dev": true, "license": "MIT", "dependencies": { "undici-types": "~7.8.0" @@ -2362,7 +3335,7 @@ "version": "18.3.7", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", - "dev": true, + "devOptional": true, "license": "MIT", "peerDependencies": { "@types/react": "^18.0.0" @@ -2669,6 +3642,2729 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@univerjs/core": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@univerjs/core/-/core-0.8.2.tgz", + "integrity": "sha512-upi1OJIK8Ghyd5zNxQMfsTFKfmbNarUEFn1cCWYutrhbs21nAao8M3D/bKJ0POX3NDBdG3RzMXnXM1vWKbbjnQ==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/protocol": "0.1.46", + "@univerjs/themes": "0.8.2", + "@wendellhu/redi": "0.18.3", + "async-lock": "^1.4.1", + "dayjs": "^1.11.13", + "fast-diff": "1.3.0", + "kdbush": "^4.0.2", + "lodash-es": "^4.17.21", + "nanoid": "5.1.5", + "numfmt": "^3.2.2", + "ot-json1": "^1.0.2", + "rbush": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "@wendellhu/redi": "0.18.3", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/core/node_modules/nanoid": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz", + "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/@univerjs/data-validation": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/data-validation/-/data-validation-0.5.5.tgz", + "integrity": "sha512-rddXbY8DNrahSMyOx8tzISdKjJ6U3w+1tjABw26exdQwPkUYFV28mGL7erIcSLgUVtRzkmEvviouSDrE/g2Fmw==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/data-validation/node_modules/@univerjs/core": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/core/-/core-0.5.5.tgz", + "integrity": "sha512-IweblkFyVg7+k3+/dV08mgwivPoRrV6IjTfWasXbxBq7cKnhUzuyb/UtsK+sf32kvNQZtLxq3Jpkm54QQRoUfA==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/protocol": "0.1.40", + "@wendellhu/redi": "0.17.0", + "dayjs": "^1.11.13", + "fast-diff": "1.3.0", + "kdbush": "^4.0.2", + "lodash-es": "^4.17.21", + "nanoid": "5.0.9", + "numeral": "^2.0.6", + "numfmt": "^2.5.2", + "ot-json1": "^1.0.2", + "rbush": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/data-validation/node_modules/@univerjs/protocol": { + "version": "0.1.40", + "resolved": "https://registry.npmjs.org/@univerjs/protocol/-/protocol-0.1.40.tgz", + "integrity": "sha512-+SxbIaLlQ3G1iPGtm7915R+iLtMFiiynk1M9j+40QxFPDD6Kynwi7XCjo4Y1NDSXDlDvU60iW1gYfuldybyk5w==", + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "peerDependencies": { + "@grpc/grpc-js": ">=1", + "rxjs": ">=7.8" + } + }, + "node_modules/@univerjs/data-validation/node_modules/@wendellhu/redi": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@wendellhu/redi/-/redi-0.17.0.tgz", + "integrity": "sha512-lWO5N4u24rYItkiP8Atu63ItHnakIX5XV+jhG6V4EAoGHdo74ssx4PlQa/Nklh9vl2/3odb65BmW4cOHrimhXA==", + "license": "MIT" + }, + "node_modules/@univerjs/data-validation/node_modules/nanoid": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz", + "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/@univerjs/data-validation/node_modules/numfmt": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/numfmt/-/numfmt-2.5.2.tgz", + "integrity": "sha512-VXrB2bpU9Xa0oCHq8IsqE2CcUx5OLupLC3oryFT4DB9e/xe+OnUzBndhXfNHUzxFE4DYI3Sx4OtzS1Sdaf7tEw==", + "license": "MIT" + }, + "node_modules/@univerjs/design": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@univerjs/design/-/design-0.8.2.tgz", + "integrity": "sha512-NemOtcQq9MY1Kf2hTfl3UOimRz7u4JmV8Ph2dswUgSXouBc6iUhhpr3fYf1ld+PSgtKLF/vzkg0CFgOpnyEgzA==", + "license": "Apache-2.0", + "dependencies": { + "@radix-ui/react-dialog": "^1.1.14", + "@radix-ui/react-dropdown-menu": "^2.1.15", + "@radix-ui/react-hover-card": "^1.1.14", + "@radix-ui/react-popover": "^1.1.14", + "@radix-ui/react-separator": "^1.1.7", + "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-tooltip": "^1.2.7", + "@rc-component/trigger": "^2.2.6", + "@univerjs/icons": "^0.4.4", + "@univerjs/themes": "0.8.2", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "dayjs": "^1.11.13", + "rc-dropdown": "^4.2.1", + "rc-menu": "^9.16.0", + "rc-picker": "^4.9.0", + "rc-virtual-list": "^3.16.1", + "react-grid-layout": "^1.5.1", + "react-transition-group": "^4.4.5", + "sonner": "^2.0.5", + "tailwind-merge": "^3.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/@univerjs/design/node_modules/tailwind-merge": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.1.tgz", + "integrity": "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/@univerjs/docs": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@univerjs/docs/-/docs-0.8.2.tgz", + "integrity": "sha512-YenS6XUOUhAKh1x0YYiUKcJX50RZLwsyinRM1hXfw2qOvWRZP9tEsma0s9mdrm3+ArqFM3OcovsDP8j0cSNqgw==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.8.2", + "@univerjs/engine-render": "0.8.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/docs-ui": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@univerjs/docs-ui/-/docs-ui-0.8.2.tgz", + "integrity": "sha512-uOJgubaLaXC0LqlZ0DH4OF6FFEPFIAieB+5JxhcA3W3UOQ/xMo7mzW40FwNswFsXbBxW7MeHflb+bo7imZ43Mw==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.8.2", + "@univerjs/design": "0.8.2", + "@univerjs/docs": "0.8.2", + "@univerjs/drawing": "0.8.2", + "@univerjs/engine-render": "0.8.2", + "@univerjs/icons": "^0.4.4", + "@univerjs/ui": "0.8.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/drawing": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@univerjs/drawing/-/drawing-0.8.2.tgz", + "integrity": "sha512-UQofJe7NS+B4osE9FwkrcXUxCGn4BR5VQf2si9iJ0KhFAchsDHkVWZLIS/1s0laNjFGc4tmzO4zH9hMyqmKCdA==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.8.2", + "ot-json1": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/engine-formula": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@univerjs/engine-formula/-/engine-formula-0.8.2.tgz", + "integrity": "sha512-Ss6SDb3dGoBqbGUI0MiKIlzcB5/Zi661kpN+0kh8JFNYhcoOeDTalgWXfhfWno4SCbgDOrO/cEAri/OWZIXqSQ==", + "license": "Apache-2.0", + "dependencies": { + "@flatten-js/interval-tree": "^1.1.3", + "@univerjs/core": "0.8.2", + "@univerjs/engine-numfmt": "0.8.2", + "@univerjs/rpc": "0.8.2", + "decimal.js": "^10.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/engine-numfmt": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@univerjs/engine-numfmt/-/engine-numfmt-0.8.2.tgz", + "integrity": "sha512-s2RkRQBxB7AjGUwwXk9J87sBt2M5HIgnLu0k3c0BN8i3X8KjtSJnuIviavCAdxJuOoHnqI01wuyX2dx57qn1TQ==", + "license": "Apache-2.0", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + } + }, + "node_modules/@univerjs/engine-render": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@univerjs/engine-render/-/engine-render-0.8.2.tgz", + "integrity": "sha512-IZUsx2qzQRYnPriE4RZXcsi7pFOU41LJr3k03ovhfAIosioDSwdNwCppz0Jf2wjb50ZZ5fSO5UqmZoMnlqhhOw==", + "license": "Apache-2.0", + "dependencies": { + "@floating-ui/dom": "^1.6.13", + "@floating-ui/utils": "^0.2.9", + "@univerjs/core": "0.8.2", + "cjk-regex": "^3.3.0", + "franc-min": "^6.2.0", + "opentype.js": "^1.3.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/facade": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/facade/-/facade-0.5.5.tgz", + "integrity": "sha512-TPO8HR1I7ro9NretADLYDzkRfsQeCGjMvQzT+PH4YlEHzm0fa7Cs82VPYUv0HV78pTrGha7hxdN5B9VdTHIVIA==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/docs-ui": "0.5.5", + "@univerjs/engine-formula": "0.5.5", + "@univerjs/network": "0.5.5", + "@univerjs/sheets": "0.5.5", + "@univerjs/sheets-conditional-formatting": "0.5.5", + "@univerjs/sheets-data-validation": "0.5.5", + "@univerjs/sheets-filter": "0.5.5", + "@univerjs/sheets-formula": "0.5.5", + "@univerjs/sheets-hyper-link": "0.5.5", + "@univerjs/sheets-hyper-link-ui": "0.5.5", + "@univerjs/sheets-numfmt": "0.5.5", + "@univerjs/sheets-thread-comment": "0.5.5", + "@univerjs/sheets-ui": "0.5.5", + "@univerjs/sheets-zen-editor": "0.5.5", + "@univerjs/ui": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/facade/node_modules/@univerjs/core": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/core/-/core-0.5.5.tgz", + "integrity": "sha512-IweblkFyVg7+k3+/dV08mgwivPoRrV6IjTfWasXbxBq7cKnhUzuyb/UtsK+sf32kvNQZtLxq3Jpkm54QQRoUfA==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/protocol": "0.1.40", + "@wendellhu/redi": "0.17.0", + "dayjs": "^1.11.13", + "fast-diff": "1.3.0", + "kdbush": "^4.0.2", + "lodash-es": "^4.17.21", + "nanoid": "5.0.9", + "numeral": "^2.0.6", + "numfmt": "^2.5.2", + "ot-json1": "^1.0.2", + "rbush": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/facade/node_modules/@univerjs/design": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/design/-/design-0.5.5.tgz", + "integrity": "sha512-bf3ZEPsIIUto6kGQDhpS4bs5IONmsKKIeiEKW7Tq9OTeLhpCcMH+COMRzIDPtImiaun9PS8bshoIH6PLbTGzCw==", + "license": "Apache-2.0", + "dependencies": { + "@rc-component/color-picker": "^2.0.1", + "@rc-component/trigger": "^2.2.5", + "@univerjs/icons": "^0.2.12", + "clsx": "^2.1.1", + "dayjs": "^1.11.13", + "rc-dialog": "^9.6.0", + "rc-dropdown": "^4.2.0", + "rc-input": "^1.6.3", + "rc-input-number": "^9.3.0", + "rc-menu": "^9.16.0", + "rc-picker": "^4.8.1", + "rc-segmented": "^2.5.0", + "rc-select": "^14.16.3", + "rc-textarea": "^1.8.2", + "rc-util": "^5.43.0", + "rc-virtual-list": "^3.15.0", + "react-draggable": "^4.4.6", + "react-grid-layout": "^1.5.0", + "react-transition-group": "^4.4.5", + "tailwind-merge": "^2.6.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@univerjs/facade/node_modules/@univerjs/docs": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/docs/-/docs-0.5.5.tgz", + "integrity": "sha512-doSwZwITsZefCqHNl7XGua4Rcduk8N6V/Mwd8wjUZXyuf7UiJSlgxYKUtzwMm6GSKcTfOoXEG1reBgsLWjNVaQ==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/engine-render": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/facade/node_modules/@univerjs/docs-ui": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/docs-ui/-/docs-ui-0.5.5.tgz", + "integrity": "sha512-pr7XlC5yECZHhkTVykR9qyO6f0bVZ9R8lXGb/njAuHx5su8E9Rc+51gw1cUd1lX2ke/nTB02290VB+aCJmxfMQ==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/design": "0.5.5", + "@univerjs/docs": "0.5.5", + "@univerjs/drawing": "0.5.5", + "@univerjs/engine-render": "0.5.5", + "@univerjs/icons": "^0.2.12", + "@univerjs/ui": "0.5.5", + "clsx": "^2.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/facade/node_modules/@univerjs/drawing": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/drawing/-/drawing-0.5.5.tgz", + "integrity": "sha512-xAl45E4izbbIx10bC1uQQNUNWRmdIqm0y1aShEuow81a9P6A7FKYG9v/6PKsBW9QQq4yLcCWkJ2awBfh6yw29Q==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "ot-json1": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/facade/node_modules/@univerjs/engine-formula": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/engine-formula/-/engine-formula-0.5.5.tgz", + "integrity": "sha512-19PlRTcrl9lhs9z6Ug0rRoR/i5oPuXcLK6M8SNP9egmVXlzDE04lir9cuN1blo+299YjqzfVs8W25tWlwno+Aw==", + "license": "Apache-2.0", + "dependencies": { + "@flatten-js/interval-tree": "^1.1.3", + "@univerjs/core": "0.5.5", + "@univerjs/rpc": "0.5.5", + "decimal.js": "^10.4.3", + "numfmt": "^2.5.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/facade/node_modules/@univerjs/engine-numfmt": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/engine-numfmt/-/engine-numfmt-0.5.5.tgz", + "integrity": "sha512-VQOvmMcw5V0jXup/w7+zSbku79p/WSS6p9l9rGksedXQSpWhd6j5lKka53dg240UTdx14LCVVL3ymfyFz7c8PQ==", + "license": "Apache-2.0", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + } + }, + "node_modules/@univerjs/facade/node_modules/@univerjs/engine-render": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/engine-render/-/engine-render-0.5.5.tgz", + "integrity": "sha512-FzGPRdgfD0F17DQEtBkeWrAQ8p8bS7JD/hWB42V+W87CYkOrvkZ33/7F4/7k5mXnK0CFrp0H+GQjh98aI8BRiw==", + "license": "Apache-2.0", + "dependencies": { + "@floating-ui/dom": "^1.6.11", + "@floating-ui/utils": "^0.2.8", + "@univerjs/core": "0.5.5", + "cjk-regex": "^3.1.0", + "franc-min": "^6.2.0", + "opentype.js": "^1.3.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/facade/node_modules/@univerjs/icons": { + "version": "0.2.35", + "resolved": "https://registry.npmjs.org/@univerjs/icons/-/icons-0.2.35.tgz", + "integrity": "sha512-FEY22AUd0KwL1NpHL4hS0STJC0Mw2sWzCUlI0PC2Nyq104KR3CfsGhSsuhPgHmz2yov9GoEospVqadMO9QPuaA==", + "license": "MIT", + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@univerjs/facade/node_modules/@univerjs/protocol": { + "version": "0.1.40", + "resolved": "https://registry.npmjs.org/@univerjs/protocol/-/protocol-0.1.40.tgz", + "integrity": "sha512-+SxbIaLlQ3G1iPGtm7915R+iLtMFiiynk1M9j+40QxFPDD6Kynwi7XCjo4Y1NDSXDlDvU60iW1gYfuldybyk5w==", + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "peerDependencies": { + "@grpc/grpc-js": ">=1", + "rxjs": ">=7.8" + } + }, + "node_modules/@univerjs/facade/node_modules/@univerjs/rpc": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/rpc/-/rpc-0.5.5.tgz", + "integrity": "sha512-UxhvcGx2aWZcyaNjAUAYmEkNeLbelq6aCxKHd3J1FEelxOYLi4pkBVF7s4x7yPo06s0Rb7tiQoM6H0DBfdyTpA==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/facade/node_modules/@univerjs/sheets": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/sheets/-/sheets-0.5.5.tgz", + "integrity": "sha512-x6L2VfVt9fu3YPgtnOAyTIfIcKxk4fgCadGO2TT/z19s3n0HqYobseHaZlPlWuwG3aqgPIyE41LB7qyKtRaASw==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/engine-formula": "0.5.5", + "@univerjs/engine-numfmt": "0.5.5", + "@univerjs/protocol": "0.1.40", + "@univerjs/rpc": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/facade/node_modules/@univerjs/sheets-formula": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/sheets-formula/-/sheets-formula-0.5.5.tgz", + "integrity": "sha512-EC0v3S346Hebj+KTJqOhygvzugNv4AmPnmGkhYX7yjiZqkwWoUQU5NnRMua3xJq9iY9itxTiUZ2wo86EFJ5b3A==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/engine-formula": "0.5.5", + "@univerjs/rpc": "0.5.5", + "@univerjs/sheets": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/facade/node_modules/@univerjs/sheets-numfmt": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/sheets-numfmt/-/sheets-numfmt-0.5.5.tgz", + "integrity": "sha512-J5BDLCxnpiG1u7WxTBDeQGr4JWHn/BIKT1jAaFOJ8rUvb/6LL3DogRt9KWjDkU1FjU5grhR/YmH2zWalVorwlw==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/engine-formula": "0.5.5", + "@univerjs/engine-numfmt": "0.5.5", + "@univerjs/sheets": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/facade/node_modules/@univerjs/sheets-ui": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/sheets-ui/-/sheets-ui-0.5.5.tgz", + "integrity": "sha512-ouuG+k+Y6YI0StI1s6YfzA+filhLj33iUTNQgJbTP0N+WJ1Le/ZezWFBnZ1isZtGRFXiFKv74vuAABc5WkVL2g==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/design": "0.5.5", + "@univerjs/docs": "0.5.5", + "@univerjs/docs-ui": "0.5.5", + "@univerjs/engine-formula": "0.5.5", + "@univerjs/engine-numfmt": "0.5.5", + "@univerjs/engine-render": "0.5.5", + "@univerjs/icons": "^0.2.12", + "@univerjs/protocol": "0.1.40", + "@univerjs/sheets": "0.5.5", + "@univerjs/telemetry": "0.5.5", + "@univerjs/ui": "0.5.5", + "clsx": "^2.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/facade/node_modules/@univerjs/telemetry": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/telemetry/-/telemetry-0.5.5.tgz", + "integrity": "sha512-q82fkhdXMd6VEIkkWJ1LnbcV01r/+AgApfJbFcZ/827IKHVuSUPzobbFC1tLFJfM+VDWLxiTBPBM5UmphAgTPQ==", + "dependencies": { + "@univerjs/core": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + } + }, + "node_modules/@univerjs/facade/node_modules/@univerjs/ui": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/ui/-/ui-0.5.5.tgz", + "integrity": "sha512-c455sy91IVOSaphc9ISZtkznLxIZL306N1JnOoGhvvzlFl0fgFQSIrobnQE2mhcpHysQguDp2GfnXFlb0vfoog==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/design": "0.5.5", + "@univerjs/engine-render": "0.5.5", + "@univerjs/icons": "^0.2.12", + "clsx": "^2.1.1", + "localforage": "^1.10.0", + "rc-notification": "^5.6.2", + "rc-util": "^5.43.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "optionalDependencies": { + "vue": ">=3.0.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/facade/node_modules/@wendellhu/redi": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@wendellhu/redi/-/redi-0.17.0.tgz", + "integrity": "sha512-lWO5N4u24rYItkiP8Atu63ItHnakIX5XV+jhG6V4EAoGHdo74ssx4PlQa/Nklh9vl2/3odb65BmW4cOHrimhXA==", + "license": "MIT" + }, + "node_modules/@univerjs/facade/node_modules/nanoid": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz", + "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/@univerjs/facade/node_modules/numfmt": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/numfmt/-/numfmt-2.5.2.tgz", + "integrity": "sha512-VXrB2bpU9Xa0oCHq8IsqE2CcUx5OLupLC3oryFT4DB9e/xe+OnUzBndhXfNHUzxFE4DYI3Sx4OtzS1Sdaf7tEw==", + "license": "MIT" + }, + "node_modules/@univerjs/icons": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@univerjs/icons/-/icons-0.4.4.tgz", + "integrity": "sha512-l3UpCm5GU8shuw+p81CmatxZm7+PP0gqso2tTx5JEParzM63fMtyXCRPIbkotDZ6fIL9opdIuHhDrAsa3SkSKg==", + "license": "MIT", + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@univerjs/network": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/network/-/network-0.5.5.tgz", + "integrity": "sha512-XX6KPurV0JAFD6wSELG+6A1Gcry4yRuRs9anATYSyi9AYMOzh9DlmG48daP+R60P+RANpP0qKMoB0/zEnEFEDg==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/network/node_modules/@univerjs/core": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/core/-/core-0.5.5.tgz", + "integrity": "sha512-IweblkFyVg7+k3+/dV08mgwivPoRrV6IjTfWasXbxBq7cKnhUzuyb/UtsK+sf32kvNQZtLxq3Jpkm54QQRoUfA==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/protocol": "0.1.40", + "@wendellhu/redi": "0.17.0", + "dayjs": "^1.11.13", + "fast-diff": "1.3.0", + "kdbush": "^4.0.2", + "lodash-es": "^4.17.21", + "nanoid": "5.0.9", + "numeral": "^2.0.6", + "numfmt": "^2.5.2", + "ot-json1": "^1.0.2", + "rbush": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/network/node_modules/@univerjs/protocol": { + "version": "0.1.40", + "resolved": "https://registry.npmjs.org/@univerjs/protocol/-/protocol-0.1.40.tgz", + "integrity": "sha512-+SxbIaLlQ3G1iPGtm7915R+iLtMFiiynk1M9j+40QxFPDD6Kynwi7XCjo4Y1NDSXDlDvU60iW1gYfuldybyk5w==", + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "peerDependencies": { + "@grpc/grpc-js": ">=1", + "rxjs": ">=7.8" + } + }, + "node_modules/@univerjs/network/node_modules/@wendellhu/redi": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@wendellhu/redi/-/redi-0.17.0.tgz", + "integrity": "sha512-lWO5N4u24rYItkiP8Atu63ItHnakIX5XV+jhG6V4EAoGHdo74ssx4PlQa/Nklh9vl2/3odb65BmW4cOHrimhXA==", + "license": "MIT" + }, + "node_modules/@univerjs/network/node_modules/nanoid": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz", + "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/@univerjs/network/node_modules/numfmt": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/numfmt/-/numfmt-2.5.2.tgz", + "integrity": "sha512-VXrB2bpU9Xa0oCHq8IsqE2CcUx5OLupLC3oryFT4DB9e/xe+OnUzBndhXfNHUzxFE4DYI3Sx4OtzS1Sdaf7tEw==", + "license": "MIT" + }, + "node_modules/@univerjs/protocol": { + "version": "0.1.46", + "resolved": "https://registry.npmjs.org/@univerjs/protocol/-/protocol-0.1.46.tgz", + "integrity": "sha512-nTkNocMt1XItBierjz7J4bz0Ye+SlUz7SDOyfqJB4FPpvDnBVGQH9NXbZbTrKrvskUzOayb7hGOkKNZyHaSQOw==", + "engines": { + "node": ">=18.0.0", + "pnpm": ">=10.0.0" + }, + "peerDependencies": { + "@grpc/grpc-js": ">=1", + "rxjs": ">=7.8" + } + }, + "node_modules/@univerjs/rpc": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@univerjs/rpc/-/rpc-0.8.2.tgz", + "integrity": "sha512-GLgdME+0LRNdB2Wi2I52oSqq3A6qpgqr7OeBw//XOv9XCyBiJh9ls5ErBpo0Dus9vlP+r7gCJdvNYvozL2XfBw==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.8.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@univerjs/sheets/-/sheets-0.8.2.tgz", + "integrity": "sha512-iaTNvhFucwEMYCCNnsafmQAbsPIxbfmcnFPXdQfT77dHBYq3CztnGz1VA/86sUONE6RFfdVGxwmMWB+7JD+ypw==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.8.2", + "@univerjs/engine-formula": "0.8.2", + "@univerjs/engine-numfmt": "0.8.2", + "@univerjs/protocol": "0.1.46", + "@univerjs/rpc": "0.8.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-conditional-formatting": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/sheets-conditional-formatting/-/sheets-conditional-formatting-0.5.5.tgz", + "integrity": "sha512-ecBWHe3NAXJ3odlXVmlT5BFSc+KYH6ksAUQi3FxWpzcfEQHnGs84RcgYE4lWnGslTxglYlt1d9n87tPndXsN0A==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/engine-formula": "0.5.5", + "@univerjs/engine-render": "0.5.5", + "@univerjs/sheets": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-conditional-formatting/node_modules/@univerjs/core": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/core/-/core-0.5.5.tgz", + "integrity": "sha512-IweblkFyVg7+k3+/dV08mgwivPoRrV6IjTfWasXbxBq7cKnhUzuyb/UtsK+sf32kvNQZtLxq3Jpkm54QQRoUfA==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/protocol": "0.1.40", + "@wendellhu/redi": "0.17.0", + "dayjs": "^1.11.13", + "fast-diff": "1.3.0", + "kdbush": "^4.0.2", + "lodash-es": "^4.17.21", + "nanoid": "5.0.9", + "numeral": "^2.0.6", + "numfmt": "^2.5.2", + "ot-json1": "^1.0.2", + "rbush": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-conditional-formatting/node_modules/@univerjs/engine-formula": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/engine-formula/-/engine-formula-0.5.5.tgz", + "integrity": "sha512-19PlRTcrl9lhs9z6Ug0rRoR/i5oPuXcLK6M8SNP9egmVXlzDE04lir9cuN1blo+299YjqzfVs8W25tWlwno+Aw==", + "license": "Apache-2.0", + "dependencies": { + "@flatten-js/interval-tree": "^1.1.3", + "@univerjs/core": "0.5.5", + "@univerjs/rpc": "0.5.5", + "decimal.js": "^10.4.3", + "numfmt": "^2.5.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-conditional-formatting/node_modules/@univerjs/engine-numfmt": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/engine-numfmt/-/engine-numfmt-0.5.5.tgz", + "integrity": "sha512-VQOvmMcw5V0jXup/w7+zSbku79p/WSS6p9l9rGksedXQSpWhd6j5lKka53dg240UTdx14LCVVL3ymfyFz7c8PQ==", + "license": "Apache-2.0", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + } + }, + "node_modules/@univerjs/sheets-conditional-formatting/node_modules/@univerjs/engine-render": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/engine-render/-/engine-render-0.5.5.tgz", + "integrity": "sha512-FzGPRdgfD0F17DQEtBkeWrAQ8p8bS7JD/hWB42V+W87CYkOrvkZ33/7F4/7k5mXnK0CFrp0H+GQjh98aI8BRiw==", + "license": "Apache-2.0", + "dependencies": { + "@floating-ui/dom": "^1.6.11", + "@floating-ui/utils": "^0.2.8", + "@univerjs/core": "0.5.5", + "cjk-regex": "^3.1.0", + "franc-min": "^6.2.0", + "opentype.js": "^1.3.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-conditional-formatting/node_modules/@univerjs/protocol": { + "version": "0.1.40", + "resolved": "https://registry.npmjs.org/@univerjs/protocol/-/protocol-0.1.40.tgz", + "integrity": "sha512-+SxbIaLlQ3G1iPGtm7915R+iLtMFiiynk1M9j+40QxFPDD6Kynwi7XCjo4Y1NDSXDlDvU60iW1gYfuldybyk5w==", + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "peerDependencies": { + "@grpc/grpc-js": ">=1", + "rxjs": ">=7.8" + } + }, + "node_modules/@univerjs/sheets-conditional-formatting/node_modules/@univerjs/rpc": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/rpc/-/rpc-0.5.5.tgz", + "integrity": "sha512-UxhvcGx2aWZcyaNjAUAYmEkNeLbelq6aCxKHd3J1FEelxOYLi4pkBVF7s4x7yPo06s0Rb7tiQoM6H0DBfdyTpA==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-conditional-formatting/node_modules/@univerjs/sheets": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/sheets/-/sheets-0.5.5.tgz", + "integrity": "sha512-x6L2VfVt9fu3YPgtnOAyTIfIcKxk4fgCadGO2TT/z19s3n0HqYobseHaZlPlWuwG3aqgPIyE41LB7qyKtRaASw==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/engine-formula": "0.5.5", + "@univerjs/engine-numfmt": "0.5.5", + "@univerjs/protocol": "0.1.40", + "@univerjs/rpc": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-conditional-formatting/node_modules/@wendellhu/redi": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@wendellhu/redi/-/redi-0.17.0.tgz", + "integrity": "sha512-lWO5N4u24rYItkiP8Atu63ItHnakIX5XV+jhG6V4EAoGHdo74ssx4PlQa/Nklh9vl2/3odb65BmW4cOHrimhXA==", + "license": "MIT" + }, + "node_modules/@univerjs/sheets-conditional-formatting/node_modules/nanoid": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz", + "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/@univerjs/sheets-conditional-formatting/node_modules/numfmt": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/numfmt/-/numfmt-2.5.2.tgz", + "integrity": "sha512-VXrB2bpU9Xa0oCHq8IsqE2CcUx5OLupLC3oryFT4DB9e/xe+OnUzBndhXfNHUzxFE4DYI3Sx4OtzS1Sdaf7tEw==", + "license": "MIT" + }, + "node_modules/@univerjs/sheets-data-validation": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/sheets-data-validation/-/sheets-data-validation-0.5.5.tgz", + "integrity": "sha512-80JQh66sPW4fmcZOjechKx9bVeDbxTx+7YE4X1mLP+KoylVxzEup9kgjzjq7LCw/zePpdiZNuqFzPNwl+YFxLw==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/data-validation": "0.5.5", + "@univerjs/engine-formula": "0.5.5", + "@univerjs/protocol": "0.1.40", + "@univerjs/sheets": "0.5.5", + "@univerjs/sheets-formula": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-data-validation/node_modules/@univerjs/core": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/core/-/core-0.5.5.tgz", + "integrity": "sha512-IweblkFyVg7+k3+/dV08mgwivPoRrV6IjTfWasXbxBq7cKnhUzuyb/UtsK+sf32kvNQZtLxq3Jpkm54QQRoUfA==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/protocol": "0.1.40", + "@wendellhu/redi": "0.17.0", + "dayjs": "^1.11.13", + "fast-diff": "1.3.0", + "kdbush": "^4.0.2", + "lodash-es": "^4.17.21", + "nanoid": "5.0.9", + "numeral": "^2.0.6", + "numfmt": "^2.5.2", + "ot-json1": "^1.0.2", + "rbush": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-data-validation/node_modules/@univerjs/engine-formula": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/engine-formula/-/engine-formula-0.5.5.tgz", + "integrity": "sha512-19PlRTcrl9lhs9z6Ug0rRoR/i5oPuXcLK6M8SNP9egmVXlzDE04lir9cuN1blo+299YjqzfVs8W25tWlwno+Aw==", + "license": "Apache-2.0", + "dependencies": { + "@flatten-js/interval-tree": "^1.1.3", + "@univerjs/core": "0.5.5", + "@univerjs/rpc": "0.5.5", + "decimal.js": "^10.4.3", + "numfmt": "^2.5.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-data-validation/node_modules/@univerjs/engine-numfmt": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/engine-numfmt/-/engine-numfmt-0.5.5.tgz", + "integrity": "sha512-VQOvmMcw5V0jXup/w7+zSbku79p/WSS6p9l9rGksedXQSpWhd6j5lKka53dg240UTdx14LCVVL3ymfyFz7c8PQ==", + "license": "Apache-2.0", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + } + }, + "node_modules/@univerjs/sheets-data-validation/node_modules/@univerjs/protocol": { + "version": "0.1.40", + "resolved": "https://registry.npmjs.org/@univerjs/protocol/-/protocol-0.1.40.tgz", + "integrity": "sha512-+SxbIaLlQ3G1iPGtm7915R+iLtMFiiynk1M9j+40QxFPDD6Kynwi7XCjo4Y1NDSXDlDvU60iW1gYfuldybyk5w==", + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "peerDependencies": { + "@grpc/grpc-js": ">=1", + "rxjs": ">=7.8" + } + }, + "node_modules/@univerjs/sheets-data-validation/node_modules/@univerjs/rpc": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/rpc/-/rpc-0.5.5.tgz", + "integrity": "sha512-UxhvcGx2aWZcyaNjAUAYmEkNeLbelq6aCxKHd3J1FEelxOYLi4pkBVF7s4x7yPo06s0Rb7tiQoM6H0DBfdyTpA==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-data-validation/node_modules/@univerjs/sheets": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/sheets/-/sheets-0.5.5.tgz", + "integrity": "sha512-x6L2VfVt9fu3YPgtnOAyTIfIcKxk4fgCadGO2TT/z19s3n0HqYobseHaZlPlWuwG3aqgPIyE41LB7qyKtRaASw==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/engine-formula": "0.5.5", + "@univerjs/engine-numfmt": "0.5.5", + "@univerjs/protocol": "0.1.40", + "@univerjs/rpc": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-data-validation/node_modules/@univerjs/sheets-formula": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/sheets-formula/-/sheets-formula-0.5.5.tgz", + "integrity": "sha512-EC0v3S346Hebj+KTJqOhygvzugNv4AmPnmGkhYX7yjiZqkwWoUQU5NnRMua3xJq9iY9itxTiUZ2wo86EFJ5b3A==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/engine-formula": "0.5.5", + "@univerjs/rpc": "0.5.5", + "@univerjs/sheets": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-data-validation/node_modules/@wendellhu/redi": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@wendellhu/redi/-/redi-0.17.0.tgz", + "integrity": "sha512-lWO5N4u24rYItkiP8Atu63ItHnakIX5XV+jhG6V4EAoGHdo74ssx4PlQa/Nklh9vl2/3odb65BmW4cOHrimhXA==", + "license": "MIT" + }, + "node_modules/@univerjs/sheets-data-validation/node_modules/nanoid": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz", + "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/@univerjs/sheets-data-validation/node_modules/numfmt": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/numfmt/-/numfmt-2.5.2.tgz", + "integrity": "sha512-VXrB2bpU9Xa0oCHq8IsqE2CcUx5OLupLC3oryFT4DB9e/xe+OnUzBndhXfNHUzxFE4DYI3Sx4OtzS1Sdaf7tEw==", + "license": "MIT" + }, + "node_modules/@univerjs/sheets-filter": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/sheets-filter/-/sheets-filter-0.5.5.tgz", + "integrity": "sha512-laLkEgtp2VoO2//DuVbK+eEaz/nvyqsZbZ+lcIQCjZ48NE7T4JZPodLl1q8pfj9N7MlIgOBxo2NxnWiQdU7IEw==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/sheets": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-filter/node_modules/@univerjs/core": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/core/-/core-0.5.5.tgz", + "integrity": "sha512-IweblkFyVg7+k3+/dV08mgwivPoRrV6IjTfWasXbxBq7cKnhUzuyb/UtsK+sf32kvNQZtLxq3Jpkm54QQRoUfA==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/protocol": "0.1.40", + "@wendellhu/redi": "0.17.0", + "dayjs": "^1.11.13", + "fast-diff": "1.3.0", + "kdbush": "^4.0.2", + "lodash-es": "^4.17.21", + "nanoid": "5.0.9", + "numeral": "^2.0.6", + "numfmt": "^2.5.2", + "ot-json1": "^1.0.2", + "rbush": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-filter/node_modules/@univerjs/engine-formula": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/engine-formula/-/engine-formula-0.5.5.tgz", + "integrity": "sha512-19PlRTcrl9lhs9z6Ug0rRoR/i5oPuXcLK6M8SNP9egmVXlzDE04lir9cuN1blo+299YjqzfVs8W25tWlwno+Aw==", + "license": "Apache-2.0", + "dependencies": { + "@flatten-js/interval-tree": "^1.1.3", + "@univerjs/core": "0.5.5", + "@univerjs/rpc": "0.5.5", + "decimal.js": "^10.4.3", + "numfmt": "^2.5.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-filter/node_modules/@univerjs/engine-numfmt": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/engine-numfmt/-/engine-numfmt-0.5.5.tgz", + "integrity": "sha512-VQOvmMcw5V0jXup/w7+zSbku79p/WSS6p9l9rGksedXQSpWhd6j5lKka53dg240UTdx14LCVVL3ymfyFz7c8PQ==", + "license": "Apache-2.0", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + } + }, + "node_modules/@univerjs/sheets-filter/node_modules/@univerjs/protocol": { + "version": "0.1.40", + "resolved": "https://registry.npmjs.org/@univerjs/protocol/-/protocol-0.1.40.tgz", + "integrity": "sha512-+SxbIaLlQ3G1iPGtm7915R+iLtMFiiynk1M9j+40QxFPDD6Kynwi7XCjo4Y1NDSXDlDvU60iW1gYfuldybyk5w==", + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "peerDependencies": { + "@grpc/grpc-js": ">=1", + "rxjs": ">=7.8" + } + }, + "node_modules/@univerjs/sheets-filter/node_modules/@univerjs/rpc": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/rpc/-/rpc-0.5.5.tgz", + "integrity": "sha512-UxhvcGx2aWZcyaNjAUAYmEkNeLbelq6aCxKHd3J1FEelxOYLi4pkBVF7s4x7yPo06s0Rb7tiQoM6H0DBfdyTpA==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-filter/node_modules/@univerjs/sheets": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/sheets/-/sheets-0.5.5.tgz", + "integrity": "sha512-x6L2VfVt9fu3YPgtnOAyTIfIcKxk4fgCadGO2TT/z19s3n0HqYobseHaZlPlWuwG3aqgPIyE41LB7qyKtRaASw==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/engine-formula": "0.5.5", + "@univerjs/engine-numfmt": "0.5.5", + "@univerjs/protocol": "0.1.40", + "@univerjs/rpc": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-filter/node_modules/@wendellhu/redi": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@wendellhu/redi/-/redi-0.17.0.tgz", + "integrity": "sha512-lWO5N4u24rYItkiP8Atu63ItHnakIX5XV+jhG6V4EAoGHdo74ssx4PlQa/Nklh9vl2/3odb65BmW4cOHrimhXA==", + "license": "MIT" + }, + "node_modules/@univerjs/sheets-filter/node_modules/nanoid": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz", + "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/@univerjs/sheets-filter/node_modules/numfmt": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/numfmt/-/numfmt-2.5.2.tgz", + "integrity": "sha512-VXrB2bpU9Xa0oCHq8IsqE2CcUx5OLupLC3oryFT4DB9e/xe+OnUzBndhXfNHUzxFE4DYI3Sx4OtzS1Sdaf7tEw==", + "license": "MIT" + }, + "node_modules/@univerjs/sheets-formula": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@univerjs/sheets-formula/-/sheets-formula-0.8.2.tgz", + "integrity": "sha512-mw3oHAu+wBQkH88QEZsld8tGVB2D3d06wi7Yfy6VwmiAwHt4AurwXEF21L7epgULpYGvCfflEmuv/tF3pKrG6g==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.8.2", + "@univerjs/engine-formula": "0.8.2", + "@univerjs/rpc": "0.8.2", + "@univerjs/sheets": "0.8.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-formula-ui": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@univerjs/sheets-formula-ui/-/sheets-formula-ui-0.8.2.tgz", + "integrity": "sha512-QD+2/nSeBJMLMvAByoVviiavUHrVedwR0YW3qU2X2e6PwrSLChv5TA/DVXrAPvsmbW/m3q4m/zIqblWuMAqDrg==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.8.2", + "@univerjs/design": "0.8.2", + "@univerjs/docs": "0.8.2", + "@univerjs/docs-ui": "0.8.2", + "@univerjs/engine-formula": "0.8.2", + "@univerjs/engine-render": "0.8.2", + "@univerjs/icons": "^0.4.4", + "@univerjs/sheets": "0.8.2", + "@univerjs/sheets-formula": "0.8.2", + "@univerjs/sheets-ui": "0.8.2", + "@univerjs/ui": "0.8.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-hyper-link": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/sheets-hyper-link/-/sheets-hyper-link-0.5.5.tgz", + "integrity": "sha512-RKLCSbfZdexcx6YscOwP5VH8c0FAfQhd3lC/xaamDGIA2ibJWMPmLhW2XAEvEUvRE72FZN4+Tbsc8HHrOxTmSQ==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/docs": "0.5.5", + "@univerjs/engine-formula": "0.5.5", + "@univerjs/protocol": "0.1.40", + "@univerjs/sheets": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-hyper-link-ui": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/sheets-hyper-link-ui/-/sheets-hyper-link-ui-0.5.5.tgz", + "integrity": "sha512-SBDR4SANwfKL7aF1j1DRlzxO6FsExD84l2NgQ2uPpDE6TGZfsF6gX6TZbxu4uKdY8/SgtT0miB81Aipg4/JqzA==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/design": "0.5.5", + "@univerjs/docs": "0.5.5", + "@univerjs/docs-ui": "0.5.5", + "@univerjs/engine-formula": "0.5.5", + "@univerjs/engine-render": "0.5.5", + "@univerjs/icons": "^0.2.12", + "@univerjs/sheets": "0.5.5", + "@univerjs/sheets-data-validation": "0.5.5", + "@univerjs/sheets-formula-ui": "0.5.5", + "@univerjs/sheets-hyper-link": "0.5.5", + "@univerjs/sheets-ui": "0.5.5", + "@univerjs/ui": "0.5.5", + "clsx": "^2.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-hyper-link-ui/node_modules/@univerjs/core": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/core/-/core-0.5.5.tgz", + "integrity": "sha512-IweblkFyVg7+k3+/dV08mgwivPoRrV6IjTfWasXbxBq7cKnhUzuyb/UtsK+sf32kvNQZtLxq3Jpkm54QQRoUfA==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/protocol": "0.1.40", + "@wendellhu/redi": "0.17.0", + "dayjs": "^1.11.13", + "fast-diff": "1.3.0", + "kdbush": "^4.0.2", + "lodash-es": "^4.17.21", + "nanoid": "5.0.9", + "numeral": "^2.0.6", + "numfmt": "^2.5.2", + "ot-json1": "^1.0.2", + "rbush": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-hyper-link-ui/node_modules/@univerjs/design": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/design/-/design-0.5.5.tgz", + "integrity": "sha512-bf3ZEPsIIUto6kGQDhpS4bs5IONmsKKIeiEKW7Tq9OTeLhpCcMH+COMRzIDPtImiaun9PS8bshoIH6PLbTGzCw==", + "license": "Apache-2.0", + "dependencies": { + "@rc-component/color-picker": "^2.0.1", + "@rc-component/trigger": "^2.2.5", + "@univerjs/icons": "^0.2.12", + "clsx": "^2.1.1", + "dayjs": "^1.11.13", + "rc-dialog": "^9.6.0", + "rc-dropdown": "^4.2.0", + "rc-input": "^1.6.3", + "rc-input-number": "^9.3.0", + "rc-menu": "^9.16.0", + "rc-picker": "^4.8.1", + "rc-segmented": "^2.5.0", + "rc-select": "^14.16.3", + "rc-textarea": "^1.8.2", + "rc-util": "^5.43.0", + "rc-virtual-list": "^3.15.0", + "react-draggable": "^4.4.6", + "react-grid-layout": "^1.5.0", + "react-transition-group": "^4.4.5", + "tailwind-merge": "^2.6.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@univerjs/sheets-hyper-link-ui/node_modules/@univerjs/docs": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/docs/-/docs-0.5.5.tgz", + "integrity": "sha512-doSwZwITsZefCqHNl7XGua4Rcduk8N6V/Mwd8wjUZXyuf7UiJSlgxYKUtzwMm6GSKcTfOoXEG1reBgsLWjNVaQ==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/engine-render": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-hyper-link-ui/node_modules/@univerjs/docs-ui": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/docs-ui/-/docs-ui-0.5.5.tgz", + "integrity": "sha512-pr7XlC5yECZHhkTVykR9qyO6f0bVZ9R8lXGb/njAuHx5su8E9Rc+51gw1cUd1lX2ke/nTB02290VB+aCJmxfMQ==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/design": "0.5.5", + "@univerjs/docs": "0.5.5", + "@univerjs/drawing": "0.5.5", + "@univerjs/engine-render": "0.5.5", + "@univerjs/icons": "^0.2.12", + "@univerjs/ui": "0.5.5", + "clsx": "^2.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-hyper-link-ui/node_modules/@univerjs/drawing": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/drawing/-/drawing-0.5.5.tgz", + "integrity": "sha512-xAl45E4izbbIx10bC1uQQNUNWRmdIqm0y1aShEuow81a9P6A7FKYG9v/6PKsBW9QQq4yLcCWkJ2awBfh6yw29Q==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "ot-json1": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-hyper-link-ui/node_modules/@univerjs/engine-formula": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/engine-formula/-/engine-formula-0.5.5.tgz", + "integrity": "sha512-19PlRTcrl9lhs9z6Ug0rRoR/i5oPuXcLK6M8SNP9egmVXlzDE04lir9cuN1blo+299YjqzfVs8W25tWlwno+Aw==", + "license": "Apache-2.0", + "dependencies": { + "@flatten-js/interval-tree": "^1.1.3", + "@univerjs/core": "0.5.5", + "@univerjs/rpc": "0.5.5", + "decimal.js": "^10.4.3", + "numfmt": "^2.5.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-hyper-link-ui/node_modules/@univerjs/engine-numfmt": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/engine-numfmt/-/engine-numfmt-0.5.5.tgz", + "integrity": "sha512-VQOvmMcw5V0jXup/w7+zSbku79p/WSS6p9l9rGksedXQSpWhd6j5lKka53dg240UTdx14LCVVL3ymfyFz7c8PQ==", + "license": "Apache-2.0", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + } + }, + "node_modules/@univerjs/sheets-hyper-link-ui/node_modules/@univerjs/engine-render": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/engine-render/-/engine-render-0.5.5.tgz", + "integrity": "sha512-FzGPRdgfD0F17DQEtBkeWrAQ8p8bS7JD/hWB42V+W87CYkOrvkZ33/7F4/7k5mXnK0CFrp0H+GQjh98aI8BRiw==", + "license": "Apache-2.0", + "dependencies": { + "@floating-ui/dom": "^1.6.11", + "@floating-ui/utils": "^0.2.8", + "@univerjs/core": "0.5.5", + "cjk-regex": "^3.1.0", + "franc-min": "^6.2.0", + "opentype.js": "^1.3.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-hyper-link-ui/node_modules/@univerjs/icons": { + "version": "0.2.35", + "resolved": "https://registry.npmjs.org/@univerjs/icons/-/icons-0.2.35.tgz", + "integrity": "sha512-FEY22AUd0KwL1NpHL4hS0STJC0Mw2sWzCUlI0PC2Nyq104KR3CfsGhSsuhPgHmz2yov9GoEospVqadMO9QPuaA==", + "license": "MIT", + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@univerjs/sheets-hyper-link-ui/node_modules/@univerjs/protocol": { + "version": "0.1.40", + "resolved": "https://registry.npmjs.org/@univerjs/protocol/-/protocol-0.1.40.tgz", + "integrity": "sha512-+SxbIaLlQ3G1iPGtm7915R+iLtMFiiynk1M9j+40QxFPDD6Kynwi7XCjo4Y1NDSXDlDvU60iW1gYfuldybyk5w==", + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "peerDependencies": { + "@grpc/grpc-js": ">=1", + "rxjs": ">=7.8" + } + }, + "node_modules/@univerjs/sheets-hyper-link-ui/node_modules/@univerjs/rpc": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/rpc/-/rpc-0.5.5.tgz", + "integrity": "sha512-UxhvcGx2aWZcyaNjAUAYmEkNeLbelq6aCxKHd3J1FEelxOYLi4pkBVF7s4x7yPo06s0Rb7tiQoM6H0DBfdyTpA==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-hyper-link-ui/node_modules/@univerjs/sheets": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/sheets/-/sheets-0.5.5.tgz", + "integrity": "sha512-x6L2VfVt9fu3YPgtnOAyTIfIcKxk4fgCadGO2TT/z19s3n0HqYobseHaZlPlWuwG3aqgPIyE41LB7qyKtRaASw==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/engine-formula": "0.5.5", + "@univerjs/engine-numfmt": "0.5.5", + "@univerjs/protocol": "0.1.40", + "@univerjs/rpc": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-hyper-link-ui/node_modules/@univerjs/sheets-formula": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/sheets-formula/-/sheets-formula-0.5.5.tgz", + "integrity": "sha512-EC0v3S346Hebj+KTJqOhygvzugNv4AmPnmGkhYX7yjiZqkwWoUQU5NnRMua3xJq9iY9itxTiUZ2wo86EFJ5b3A==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/engine-formula": "0.5.5", + "@univerjs/rpc": "0.5.5", + "@univerjs/sheets": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-hyper-link-ui/node_modules/@univerjs/sheets-formula-ui": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/sheets-formula-ui/-/sheets-formula-ui-0.5.5.tgz", + "integrity": "sha512-Pi6GUCPT6rDovvn/+9Lub7CU9EEy3KA7YMykMPyii0Bujm16W92iyGmyx7aUqHvKWEjdrR+MUQCCzZQNnrcrsA==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/design": "0.5.5", + "@univerjs/docs": "0.5.5", + "@univerjs/docs-ui": "0.5.5", + "@univerjs/engine-formula": "0.5.5", + "@univerjs/engine-render": "0.5.5", + "@univerjs/icons": "^0.2.12", + "@univerjs/sheets": "0.5.5", + "@univerjs/sheets-formula": "0.5.5", + "@univerjs/sheets-ui": "0.5.5", + "@univerjs/ui": "0.5.5", + "clsx": "^2.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-hyper-link-ui/node_modules/@univerjs/sheets-ui": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/sheets-ui/-/sheets-ui-0.5.5.tgz", + "integrity": "sha512-ouuG+k+Y6YI0StI1s6YfzA+filhLj33iUTNQgJbTP0N+WJ1Le/ZezWFBnZ1isZtGRFXiFKv74vuAABc5WkVL2g==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/design": "0.5.5", + "@univerjs/docs": "0.5.5", + "@univerjs/docs-ui": "0.5.5", + "@univerjs/engine-formula": "0.5.5", + "@univerjs/engine-numfmt": "0.5.5", + "@univerjs/engine-render": "0.5.5", + "@univerjs/icons": "^0.2.12", + "@univerjs/protocol": "0.1.40", + "@univerjs/sheets": "0.5.5", + "@univerjs/telemetry": "0.5.5", + "@univerjs/ui": "0.5.5", + "clsx": "^2.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-hyper-link-ui/node_modules/@univerjs/telemetry": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/telemetry/-/telemetry-0.5.5.tgz", + "integrity": "sha512-q82fkhdXMd6VEIkkWJ1LnbcV01r/+AgApfJbFcZ/827IKHVuSUPzobbFC1tLFJfM+VDWLxiTBPBM5UmphAgTPQ==", + "dependencies": { + "@univerjs/core": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + } + }, + "node_modules/@univerjs/sheets-hyper-link-ui/node_modules/@univerjs/ui": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/ui/-/ui-0.5.5.tgz", + "integrity": "sha512-c455sy91IVOSaphc9ISZtkznLxIZL306N1JnOoGhvvzlFl0fgFQSIrobnQE2mhcpHysQguDp2GfnXFlb0vfoog==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/design": "0.5.5", + "@univerjs/engine-render": "0.5.5", + "@univerjs/icons": "^0.2.12", + "clsx": "^2.1.1", + "localforage": "^1.10.0", + "rc-notification": "^5.6.2", + "rc-util": "^5.43.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "optionalDependencies": { + "vue": ">=3.0.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-hyper-link-ui/node_modules/@wendellhu/redi": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@wendellhu/redi/-/redi-0.17.0.tgz", + "integrity": "sha512-lWO5N4u24rYItkiP8Atu63ItHnakIX5XV+jhG6V4EAoGHdo74ssx4PlQa/Nklh9vl2/3odb65BmW4cOHrimhXA==", + "license": "MIT" + }, + "node_modules/@univerjs/sheets-hyper-link-ui/node_modules/nanoid": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz", + "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/@univerjs/sheets-hyper-link-ui/node_modules/numfmt": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/numfmt/-/numfmt-2.5.2.tgz", + "integrity": "sha512-VXrB2bpU9Xa0oCHq8IsqE2CcUx5OLupLC3oryFT4DB9e/xe+OnUzBndhXfNHUzxFE4DYI3Sx4OtzS1Sdaf7tEw==", + "license": "MIT" + }, + "node_modules/@univerjs/sheets-hyper-link/node_modules/@univerjs/core": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/core/-/core-0.5.5.tgz", + "integrity": "sha512-IweblkFyVg7+k3+/dV08mgwivPoRrV6IjTfWasXbxBq7cKnhUzuyb/UtsK+sf32kvNQZtLxq3Jpkm54QQRoUfA==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/protocol": "0.1.40", + "@wendellhu/redi": "0.17.0", + "dayjs": "^1.11.13", + "fast-diff": "1.3.0", + "kdbush": "^4.0.2", + "lodash-es": "^4.17.21", + "nanoid": "5.0.9", + "numeral": "^2.0.6", + "numfmt": "^2.5.2", + "ot-json1": "^1.0.2", + "rbush": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-hyper-link/node_modules/@univerjs/docs": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/docs/-/docs-0.5.5.tgz", + "integrity": "sha512-doSwZwITsZefCqHNl7XGua4Rcduk8N6V/Mwd8wjUZXyuf7UiJSlgxYKUtzwMm6GSKcTfOoXEG1reBgsLWjNVaQ==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/engine-render": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-hyper-link/node_modules/@univerjs/engine-formula": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/engine-formula/-/engine-formula-0.5.5.tgz", + "integrity": "sha512-19PlRTcrl9lhs9z6Ug0rRoR/i5oPuXcLK6M8SNP9egmVXlzDE04lir9cuN1blo+299YjqzfVs8W25tWlwno+Aw==", + "license": "Apache-2.0", + "dependencies": { + "@flatten-js/interval-tree": "^1.1.3", + "@univerjs/core": "0.5.5", + "@univerjs/rpc": "0.5.5", + "decimal.js": "^10.4.3", + "numfmt": "^2.5.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-hyper-link/node_modules/@univerjs/engine-numfmt": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/engine-numfmt/-/engine-numfmt-0.5.5.tgz", + "integrity": "sha512-VQOvmMcw5V0jXup/w7+zSbku79p/WSS6p9l9rGksedXQSpWhd6j5lKka53dg240UTdx14LCVVL3ymfyFz7c8PQ==", + "license": "Apache-2.0", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + } + }, + "node_modules/@univerjs/sheets-hyper-link/node_modules/@univerjs/engine-render": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/engine-render/-/engine-render-0.5.5.tgz", + "integrity": "sha512-FzGPRdgfD0F17DQEtBkeWrAQ8p8bS7JD/hWB42V+W87CYkOrvkZ33/7F4/7k5mXnK0CFrp0H+GQjh98aI8BRiw==", + "license": "Apache-2.0", + "dependencies": { + "@floating-ui/dom": "^1.6.11", + "@floating-ui/utils": "^0.2.8", + "@univerjs/core": "0.5.5", + "cjk-regex": "^3.1.0", + "franc-min": "^6.2.0", + "opentype.js": "^1.3.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-hyper-link/node_modules/@univerjs/protocol": { + "version": "0.1.40", + "resolved": "https://registry.npmjs.org/@univerjs/protocol/-/protocol-0.1.40.tgz", + "integrity": "sha512-+SxbIaLlQ3G1iPGtm7915R+iLtMFiiynk1M9j+40QxFPDD6Kynwi7XCjo4Y1NDSXDlDvU60iW1gYfuldybyk5w==", + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "peerDependencies": { + "@grpc/grpc-js": ">=1", + "rxjs": ">=7.8" + } + }, + "node_modules/@univerjs/sheets-hyper-link/node_modules/@univerjs/rpc": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/rpc/-/rpc-0.5.5.tgz", + "integrity": "sha512-UxhvcGx2aWZcyaNjAUAYmEkNeLbelq6aCxKHd3J1FEelxOYLi4pkBVF7s4x7yPo06s0Rb7tiQoM6H0DBfdyTpA==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-hyper-link/node_modules/@univerjs/sheets": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/sheets/-/sheets-0.5.5.tgz", + "integrity": "sha512-x6L2VfVt9fu3YPgtnOAyTIfIcKxk4fgCadGO2TT/z19s3n0HqYobseHaZlPlWuwG3aqgPIyE41LB7qyKtRaASw==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/engine-formula": "0.5.5", + "@univerjs/engine-numfmt": "0.5.5", + "@univerjs/protocol": "0.1.40", + "@univerjs/rpc": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-hyper-link/node_modules/@wendellhu/redi": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@wendellhu/redi/-/redi-0.17.0.tgz", + "integrity": "sha512-lWO5N4u24rYItkiP8Atu63ItHnakIX5XV+jhG6V4EAoGHdo74ssx4PlQa/Nklh9vl2/3odb65BmW4cOHrimhXA==", + "license": "MIT" + }, + "node_modules/@univerjs/sheets-hyper-link/node_modules/nanoid": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz", + "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/@univerjs/sheets-hyper-link/node_modules/numfmt": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/numfmt/-/numfmt-2.5.2.tgz", + "integrity": "sha512-VXrB2bpU9Xa0oCHq8IsqE2CcUx5OLupLC3oryFT4DB9e/xe+OnUzBndhXfNHUzxFE4DYI3Sx4OtzS1Sdaf7tEw==", + "license": "MIT" + }, + "node_modules/@univerjs/sheets-numfmt": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@univerjs/sheets-numfmt/-/sheets-numfmt-0.8.2.tgz", + "integrity": "sha512-BQdqu7F/LEiClogIPqQokOgNEgDFa/T/KD8qowcnVVEKNzKct1Ao0Qqh8V8ds2o+BHCMh1tvSMa1PhJ/cysGpw==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.8.2", + "@univerjs/engine-formula": "0.8.2", + "@univerjs/engine-numfmt": "0.8.2", + "@univerjs/sheets": "0.8.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-numfmt-ui": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@univerjs/sheets-numfmt-ui/-/sheets-numfmt-ui-0.8.2.tgz", + "integrity": "sha512-KtfLVvv1bv4qRmzVHdhAgcpExtYufcXjAWVf73UymW8b0ZSGjgsy4VcwJOJrWmoYKdZYC9FgnIcsI+OP483IPQ==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.8.2", + "@univerjs/design": "0.8.2", + "@univerjs/engine-numfmt": "0.8.2", + "@univerjs/engine-render": "0.8.2", + "@univerjs/icons": "^0.4.4", + "@univerjs/sheets": "0.8.2", + "@univerjs/sheets-numfmt": "0.8.2", + "@univerjs/sheets-ui": "0.8.2", + "@univerjs/ui": "0.8.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-thread-comment": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/sheets-thread-comment/-/sheets-thread-comment-0.5.5.tgz", + "integrity": "sha512-SKFgs7J2v+/zi4ZEe0GvdmQdmxG8OAmtf++2hMjHBaNuD0uBX7jdee4BAf3VelzxqCJuv7v8E0z3/a9xZAtVCg==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/engine-formula": "0.5.5", + "@univerjs/sheets": "0.5.5", + "@univerjs/thread-comment": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-thread-comment/node_modules/@univerjs/core": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/core/-/core-0.5.5.tgz", + "integrity": "sha512-IweblkFyVg7+k3+/dV08mgwivPoRrV6IjTfWasXbxBq7cKnhUzuyb/UtsK+sf32kvNQZtLxq3Jpkm54QQRoUfA==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/protocol": "0.1.40", + "@wendellhu/redi": "0.17.0", + "dayjs": "^1.11.13", + "fast-diff": "1.3.0", + "kdbush": "^4.0.2", + "lodash-es": "^4.17.21", + "nanoid": "5.0.9", + "numeral": "^2.0.6", + "numfmt": "^2.5.2", + "ot-json1": "^1.0.2", + "rbush": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-thread-comment/node_modules/@univerjs/engine-formula": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/engine-formula/-/engine-formula-0.5.5.tgz", + "integrity": "sha512-19PlRTcrl9lhs9z6Ug0rRoR/i5oPuXcLK6M8SNP9egmVXlzDE04lir9cuN1blo+299YjqzfVs8W25tWlwno+Aw==", + "license": "Apache-2.0", + "dependencies": { + "@flatten-js/interval-tree": "^1.1.3", + "@univerjs/core": "0.5.5", + "@univerjs/rpc": "0.5.5", + "decimal.js": "^10.4.3", + "numfmt": "^2.5.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-thread-comment/node_modules/@univerjs/engine-numfmt": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/engine-numfmt/-/engine-numfmt-0.5.5.tgz", + "integrity": "sha512-VQOvmMcw5V0jXup/w7+zSbku79p/WSS6p9l9rGksedXQSpWhd6j5lKka53dg240UTdx14LCVVL3ymfyFz7c8PQ==", + "license": "Apache-2.0", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + } + }, + "node_modules/@univerjs/sheets-thread-comment/node_modules/@univerjs/protocol": { + "version": "0.1.40", + "resolved": "https://registry.npmjs.org/@univerjs/protocol/-/protocol-0.1.40.tgz", + "integrity": "sha512-+SxbIaLlQ3G1iPGtm7915R+iLtMFiiynk1M9j+40QxFPDD6Kynwi7XCjo4Y1NDSXDlDvU60iW1gYfuldybyk5w==", + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "peerDependencies": { + "@grpc/grpc-js": ">=1", + "rxjs": ">=7.8" + } + }, + "node_modules/@univerjs/sheets-thread-comment/node_modules/@univerjs/rpc": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/rpc/-/rpc-0.5.5.tgz", + "integrity": "sha512-UxhvcGx2aWZcyaNjAUAYmEkNeLbelq6aCxKHd3J1FEelxOYLi4pkBVF7s4x7yPo06s0Rb7tiQoM6H0DBfdyTpA==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-thread-comment/node_modules/@univerjs/sheets": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/sheets/-/sheets-0.5.5.tgz", + "integrity": "sha512-x6L2VfVt9fu3YPgtnOAyTIfIcKxk4fgCadGO2TT/z19s3n0HqYobseHaZlPlWuwG3aqgPIyE41LB7qyKtRaASw==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/engine-formula": "0.5.5", + "@univerjs/engine-numfmt": "0.5.5", + "@univerjs/protocol": "0.1.40", + "@univerjs/rpc": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-thread-comment/node_modules/@wendellhu/redi": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@wendellhu/redi/-/redi-0.17.0.tgz", + "integrity": "sha512-lWO5N4u24rYItkiP8Atu63ItHnakIX5XV+jhG6V4EAoGHdo74ssx4PlQa/Nklh9vl2/3odb65BmW4cOHrimhXA==", + "license": "MIT" + }, + "node_modules/@univerjs/sheets-thread-comment/node_modules/nanoid": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz", + "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/@univerjs/sheets-thread-comment/node_modules/numfmt": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/numfmt/-/numfmt-2.5.2.tgz", + "integrity": "sha512-VXrB2bpU9Xa0oCHq8IsqE2CcUx5OLupLC3oryFT4DB9e/xe+OnUzBndhXfNHUzxFE4DYI3Sx4OtzS1Sdaf7tEw==", + "license": "MIT" + }, + "node_modules/@univerjs/sheets-ui": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@univerjs/sheets-ui/-/sheets-ui-0.8.2.tgz", + "integrity": "sha512-yXjIfJd9mtInbR2vd8aI4BXDvpax99NWwp2Epj2tUi9CneDTM5BEhTSRxVRqOEAyvi0FudvNa1Juk40d3LXs+A==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.8.2", + "@univerjs/design": "0.8.2", + "@univerjs/docs": "0.8.2", + "@univerjs/docs-ui": "0.8.2", + "@univerjs/engine-formula": "0.8.2", + "@univerjs/engine-numfmt": "0.8.2", + "@univerjs/engine-render": "0.8.2", + "@univerjs/icons": "^0.4.4", + "@univerjs/protocol": "0.1.46", + "@univerjs/sheets": "0.8.2", + "@univerjs/telemetry": "0.8.2", + "@univerjs/ui": "0.8.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-zen-editor": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/sheets-zen-editor/-/sheets-zen-editor-0.5.5.tgz", + "integrity": "sha512-sbcs8NX/on6sQRV7U2zEXiJnmBAco70V3/8Dlt/LrdyVixV9XuTAX0hSzAT3RelYKhvrQyu2Dicr5V4nktcLNg==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/docs": "0.5.5", + "@univerjs/docs-ui": "0.5.5", + "@univerjs/engine-render": "0.5.5", + "@univerjs/icons": "^0.2.12", + "@univerjs/sheets": "0.5.5", + "@univerjs/sheets-ui": "0.5.5", + "@univerjs/ui": "0.5.5", + "clsx": "^2.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-zen-editor/node_modules/@univerjs/core": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/core/-/core-0.5.5.tgz", + "integrity": "sha512-IweblkFyVg7+k3+/dV08mgwivPoRrV6IjTfWasXbxBq7cKnhUzuyb/UtsK+sf32kvNQZtLxq3Jpkm54QQRoUfA==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/protocol": "0.1.40", + "@wendellhu/redi": "0.17.0", + "dayjs": "^1.11.13", + "fast-diff": "1.3.0", + "kdbush": "^4.0.2", + "lodash-es": "^4.17.21", + "nanoid": "5.0.9", + "numeral": "^2.0.6", + "numfmt": "^2.5.2", + "ot-json1": "^1.0.2", + "rbush": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-zen-editor/node_modules/@univerjs/design": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/design/-/design-0.5.5.tgz", + "integrity": "sha512-bf3ZEPsIIUto6kGQDhpS4bs5IONmsKKIeiEKW7Tq9OTeLhpCcMH+COMRzIDPtImiaun9PS8bshoIH6PLbTGzCw==", + "license": "Apache-2.0", + "dependencies": { + "@rc-component/color-picker": "^2.0.1", + "@rc-component/trigger": "^2.2.5", + "@univerjs/icons": "^0.2.12", + "clsx": "^2.1.1", + "dayjs": "^1.11.13", + "rc-dialog": "^9.6.0", + "rc-dropdown": "^4.2.0", + "rc-input": "^1.6.3", + "rc-input-number": "^9.3.0", + "rc-menu": "^9.16.0", + "rc-picker": "^4.8.1", + "rc-segmented": "^2.5.0", + "rc-select": "^14.16.3", + "rc-textarea": "^1.8.2", + "rc-util": "^5.43.0", + "rc-virtual-list": "^3.15.0", + "react-draggable": "^4.4.6", + "react-grid-layout": "^1.5.0", + "react-transition-group": "^4.4.5", + "tailwind-merge": "^2.6.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@univerjs/sheets-zen-editor/node_modules/@univerjs/docs": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/docs/-/docs-0.5.5.tgz", + "integrity": "sha512-doSwZwITsZefCqHNl7XGua4Rcduk8N6V/Mwd8wjUZXyuf7UiJSlgxYKUtzwMm6GSKcTfOoXEG1reBgsLWjNVaQ==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/engine-render": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-zen-editor/node_modules/@univerjs/docs-ui": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/docs-ui/-/docs-ui-0.5.5.tgz", + "integrity": "sha512-pr7XlC5yECZHhkTVykR9qyO6f0bVZ9R8lXGb/njAuHx5su8E9Rc+51gw1cUd1lX2ke/nTB02290VB+aCJmxfMQ==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/design": "0.5.5", + "@univerjs/docs": "0.5.5", + "@univerjs/drawing": "0.5.5", + "@univerjs/engine-render": "0.5.5", + "@univerjs/icons": "^0.2.12", + "@univerjs/ui": "0.5.5", + "clsx": "^2.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-zen-editor/node_modules/@univerjs/drawing": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/drawing/-/drawing-0.5.5.tgz", + "integrity": "sha512-xAl45E4izbbIx10bC1uQQNUNWRmdIqm0y1aShEuow81a9P6A7FKYG9v/6PKsBW9QQq4yLcCWkJ2awBfh6yw29Q==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "ot-json1": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-zen-editor/node_modules/@univerjs/engine-formula": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/engine-formula/-/engine-formula-0.5.5.tgz", + "integrity": "sha512-19PlRTcrl9lhs9z6Ug0rRoR/i5oPuXcLK6M8SNP9egmVXlzDE04lir9cuN1blo+299YjqzfVs8W25tWlwno+Aw==", + "license": "Apache-2.0", + "dependencies": { + "@flatten-js/interval-tree": "^1.1.3", + "@univerjs/core": "0.5.5", + "@univerjs/rpc": "0.5.5", + "decimal.js": "^10.4.3", + "numfmt": "^2.5.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-zen-editor/node_modules/@univerjs/engine-numfmt": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/engine-numfmt/-/engine-numfmt-0.5.5.tgz", + "integrity": "sha512-VQOvmMcw5V0jXup/w7+zSbku79p/WSS6p9l9rGksedXQSpWhd6j5lKka53dg240UTdx14LCVVL3ymfyFz7c8PQ==", + "license": "Apache-2.0", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + } + }, + "node_modules/@univerjs/sheets-zen-editor/node_modules/@univerjs/engine-render": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/engine-render/-/engine-render-0.5.5.tgz", + "integrity": "sha512-FzGPRdgfD0F17DQEtBkeWrAQ8p8bS7JD/hWB42V+W87CYkOrvkZ33/7F4/7k5mXnK0CFrp0H+GQjh98aI8BRiw==", + "license": "Apache-2.0", + "dependencies": { + "@floating-ui/dom": "^1.6.11", + "@floating-ui/utils": "^0.2.8", + "@univerjs/core": "0.5.5", + "cjk-regex": "^3.1.0", + "franc-min": "^6.2.0", + "opentype.js": "^1.3.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-zen-editor/node_modules/@univerjs/icons": { + "version": "0.2.35", + "resolved": "https://registry.npmjs.org/@univerjs/icons/-/icons-0.2.35.tgz", + "integrity": "sha512-FEY22AUd0KwL1NpHL4hS0STJC0Mw2sWzCUlI0PC2Nyq104KR3CfsGhSsuhPgHmz2yov9GoEospVqadMO9QPuaA==", + "license": "MIT", + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@univerjs/sheets-zen-editor/node_modules/@univerjs/protocol": { + "version": "0.1.40", + "resolved": "https://registry.npmjs.org/@univerjs/protocol/-/protocol-0.1.40.tgz", + "integrity": "sha512-+SxbIaLlQ3G1iPGtm7915R+iLtMFiiynk1M9j+40QxFPDD6Kynwi7XCjo4Y1NDSXDlDvU60iW1gYfuldybyk5w==", + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "peerDependencies": { + "@grpc/grpc-js": ">=1", + "rxjs": ">=7.8" + } + }, + "node_modules/@univerjs/sheets-zen-editor/node_modules/@univerjs/rpc": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/rpc/-/rpc-0.5.5.tgz", + "integrity": "sha512-UxhvcGx2aWZcyaNjAUAYmEkNeLbelq6aCxKHd3J1FEelxOYLi4pkBVF7s4x7yPo06s0Rb7tiQoM6H0DBfdyTpA==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-zen-editor/node_modules/@univerjs/sheets": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/sheets/-/sheets-0.5.5.tgz", + "integrity": "sha512-x6L2VfVt9fu3YPgtnOAyTIfIcKxk4fgCadGO2TT/z19s3n0HqYobseHaZlPlWuwG3aqgPIyE41LB7qyKtRaASw==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/engine-formula": "0.5.5", + "@univerjs/engine-numfmt": "0.5.5", + "@univerjs/protocol": "0.1.40", + "@univerjs/rpc": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-zen-editor/node_modules/@univerjs/sheets-ui": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/sheets-ui/-/sheets-ui-0.5.5.tgz", + "integrity": "sha512-ouuG+k+Y6YI0StI1s6YfzA+filhLj33iUTNQgJbTP0N+WJ1Le/ZezWFBnZ1isZtGRFXiFKv74vuAABc5WkVL2g==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/design": "0.5.5", + "@univerjs/docs": "0.5.5", + "@univerjs/docs-ui": "0.5.5", + "@univerjs/engine-formula": "0.5.5", + "@univerjs/engine-numfmt": "0.5.5", + "@univerjs/engine-render": "0.5.5", + "@univerjs/icons": "^0.2.12", + "@univerjs/protocol": "0.1.40", + "@univerjs/sheets": "0.5.5", + "@univerjs/telemetry": "0.5.5", + "@univerjs/ui": "0.5.5", + "clsx": "^2.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-zen-editor/node_modules/@univerjs/telemetry": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/telemetry/-/telemetry-0.5.5.tgz", + "integrity": "sha512-q82fkhdXMd6VEIkkWJ1LnbcV01r/+AgApfJbFcZ/827IKHVuSUPzobbFC1tLFJfM+VDWLxiTBPBM5UmphAgTPQ==", + "dependencies": { + "@univerjs/core": "0.5.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + } + }, + "node_modules/@univerjs/sheets-zen-editor/node_modules/@univerjs/ui": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/ui/-/ui-0.5.5.tgz", + "integrity": "sha512-c455sy91IVOSaphc9ISZtkznLxIZL306N1JnOoGhvvzlFl0fgFQSIrobnQE2mhcpHysQguDp2GfnXFlb0vfoog==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/design": "0.5.5", + "@univerjs/engine-render": "0.5.5", + "@univerjs/icons": "^0.2.12", + "clsx": "^2.1.1", + "localforage": "^1.10.0", + "rc-notification": "^5.6.2", + "rc-util": "^5.43.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "optionalDependencies": { + "vue": ">=3.0.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/sheets-zen-editor/node_modules/@wendellhu/redi": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@wendellhu/redi/-/redi-0.17.0.tgz", + "integrity": "sha512-lWO5N4u24rYItkiP8Atu63ItHnakIX5XV+jhG6V4EAoGHdo74ssx4PlQa/Nklh9vl2/3odb65BmW4cOHrimhXA==", + "license": "MIT" + }, + "node_modules/@univerjs/sheets-zen-editor/node_modules/nanoid": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz", + "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/@univerjs/sheets-zen-editor/node_modules/numfmt": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/numfmt/-/numfmt-2.5.2.tgz", + "integrity": "sha512-VXrB2bpU9Xa0oCHq8IsqE2CcUx5OLupLC3oryFT4DB9e/xe+OnUzBndhXfNHUzxFE4DYI3Sx4OtzS1Sdaf7tEw==", + "license": "MIT" + }, + "node_modules/@univerjs/telemetry": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@univerjs/telemetry/-/telemetry-0.8.2.tgz", + "integrity": "sha512-P8y18yAk6qg0Um5Gdl9G4D+S/A+k63cA3wn1+/dbD+ZymKXkz/s2Z/yTLLd4uIWAVNXuwrGEBDCPzydY2owtpg==", + "dependencies": { + "@univerjs/core": "0.8.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + } + }, + "node_modules/@univerjs/themes": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@univerjs/themes/-/themes-0.8.2.tgz", + "integrity": "sha512-VFU/YnanI+T51/eMn/O2HFnITxs7ToJiePPSUe54rnYhQOsH4b3GbAOztpfKBLqHKu8+IDnwLGEplL5+SNlP3w==", + "license": "Apache-2.0", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + } + }, + "node_modules/@univerjs/thread-comment": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/thread-comment/-/thread-comment-0.5.5.tgz", + "integrity": "sha512-uwD7MUaeJkDX64FhiMegT5OzI+XOkR7GkWTA96ZnjKcDZ1NzuQyqkNQXIie7xl2IWpanGBDFbsY4IBwNeM3s9w==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.5.5", + "@univerjs/protocol": "0.1.40" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/thread-comment/node_modules/@univerjs/core": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@univerjs/core/-/core-0.5.5.tgz", + "integrity": "sha512-IweblkFyVg7+k3+/dV08mgwivPoRrV6IjTfWasXbxBq7cKnhUzuyb/UtsK+sf32kvNQZtLxq3Jpkm54QQRoUfA==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/protocol": "0.1.40", + "@wendellhu/redi": "0.17.0", + "dayjs": "^1.11.13", + "fast-diff": "1.3.0", + "kdbush": "^4.0.2", + "lodash-es": "^4.17.21", + "nanoid": "5.0.9", + "numeral": "^2.0.6", + "numfmt": "^2.5.2", + "ot-json1": "^1.0.2", + "rbush": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/thread-comment/node_modules/@univerjs/protocol": { + "version": "0.1.40", + "resolved": "https://registry.npmjs.org/@univerjs/protocol/-/protocol-0.1.40.tgz", + "integrity": "sha512-+SxbIaLlQ3G1iPGtm7915R+iLtMFiiynk1M9j+40QxFPDD6Kynwi7XCjo4Y1NDSXDlDvU60iW1gYfuldybyk5w==", + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "peerDependencies": { + "@grpc/grpc-js": ">=1", + "rxjs": ">=7.8" + } + }, + "node_modules/@univerjs/thread-comment/node_modules/@wendellhu/redi": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@wendellhu/redi/-/redi-0.17.0.tgz", + "integrity": "sha512-lWO5N4u24rYItkiP8Atu63ItHnakIX5XV+jhG6V4EAoGHdo74ssx4PlQa/Nklh9vl2/3odb65BmW4cOHrimhXA==", + "license": "MIT" + }, + "node_modules/@univerjs/thread-comment/node_modules/nanoid": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz", + "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/@univerjs/thread-comment/node_modules/numfmt": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/numfmt/-/numfmt-2.5.2.tgz", + "integrity": "sha512-VXrB2bpU9Xa0oCHq8IsqE2CcUx5OLupLC3oryFT4DB9e/xe+OnUzBndhXfNHUzxFE4DYI3Sx4OtzS1Sdaf7tEw==", + "license": "MIT" + }, + "node_modules/@univerjs/ui": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@univerjs/ui/-/ui-0.8.2.tgz", + "integrity": "sha512-4FAo9W7aFFQDx+qcLYioYj5NI67e2nSsAINbfHu6FNk6Bj4iunQ+0JudP0VX7EwkhFG571RJwNyC/IMRlT4i+w==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.8.2", + "@univerjs/design": "0.8.2", + "@univerjs/engine-render": "0.8.2", + "@univerjs/icons": "^0.4.4", + "@wendellhu/redi": "0.18.3", + "localforage": "^1.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "optionalDependencies": { + "vue": ">=3.0.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "rxjs": ">=7.0.0" + } + }, + "node_modules/@univerjs/uniscript": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@univerjs/uniscript/-/uniscript-0.8.2.tgz", + "integrity": "sha512-DRib78G+HtuA99QUrf2vudDMvdx5OmG6E/ThH8/CX4onJJduzjJqxz63G6KOVkhlXbMqy8qJSIq87LeOfO8fdQ==", + "license": "Apache-2.0", + "dependencies": { + "@univerjs/core": "0.8.2", + "@univerjs/design": "0.8.2", + "@univerjs/sheets": "0.8.2", + "@univerjs/sheets-ui": "0.8.2", + "@univerjs/ui": "0.8.2", + "monaco-editor": "0.52.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/univer" + }, + "peerDependencies": { + "monaco-editor": ">=0.50.0", + "react": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "rxjs": ">=7.0.0" + } + }, "node_modules/@vitejs/plugin-react": { "version": "4.5.2", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.5.2.tgz", @@ -2827,6 +6523,148 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@vue/compiler-core": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.17.tgz", + "integrity": "sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==", + "license": "MIT", + "optional": true, + "dependencies": { + "@babel/parser": "^7.27.5", + "@vue/shared": "3.5.17", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-core/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "optional": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@vue/compiler-core/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT", + "optional": true + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.17.tgz", + "integrity": "sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@vue/compiler-core": "3.5.17", + "@vue/shared": "3.5.17" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.17.tgz", + "integrity": "sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==", + "license": "MIT", + "optional": true, + "dependencies": { + "@babel/parser": "^7.27.5", + "@vue/compiler-core": "3.5.17", + "@vue/compiler-dom": "3.5.17", + "@vue/compiler-ssr": "3.5.17", + "@vue/shared": "3.5.17", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.17", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT", + "optional": true + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.17.tgz", + "integrity": "sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@vue/compiler-dom": "3.5.17", + "@vue/shared": "3.5.17" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.17.tgz", + "integrity": "sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==", + "license": "MIT", + "optional": true, + "dependencies": { + "@vue/shared": "3.5.17" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.17.tgz", + "integrity": "sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "@vue/reactivity": "3.5.17", + "@vue/shared": "3.5.17" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.17.tgz", + "integrity": "sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==", + "license": "MIT", + "optional": true, + "dependencies": { + "@vue/reactivity": "3.5.17", + "@vue/runtime-core": "3.5.17", + "@vue/shared": "3.5.17", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.17.tgz", + "integrity": "sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==", + "license": "MIT", + "optional": true, + "dependencies": { + "@vue/compiler-ssr": "3.5.17", + "@vue/shared": "3.5.17" + }, + "peerDependencies": { + "vue": "3.5.17" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.17.tgz", + "integrity": "sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==", + "license": "MIT", + "optional": true + }, + "node_modules/@wendellhu/redi": { + "version": "0.18.3", + "resolved": "https://registry.npmjs.org/@wendellhu/redi/-/redi-0.18.3.tgz", + "integrity": "sha512-0o57fGpzid62p4UsXv/vAWnkKW+vqkUjsjFDkFt68yZrIVCFPmcR2761YIfrzUqmUjkrySURd8Qu1CQ2NPDkBw==", + "license": "MIT" + }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -2882,22 +6720,6 @@ "node": ">=0.4.0" } }, - "node_modules/adler-32": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz", - "integrity": "sha512-/vUqU/UY4MVeFsg+SsK6c+/05RZXIHZMGJA+PX5JyWI0ZRcBpupnRuPLU/NXXoFwMYCPCoxIfElM2eS+DUXCqQ==", - "license": "Apache-2.0", - "dependencies": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.1.0" - }, - "bin": { - "adler32": "bin/adler32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -2945,7 +6767,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -2992,6 +6813,18 @@ "dev": true, "license": "Python-2.0" }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/aria-query": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", @@ -3012,6 +6845,12 @@ "node": ">=12" } }, + "node_modules/async-lock": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", + "license": "MIT" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -3064,6 +6903,27 @@ "dev": true, "license": "MIT" }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -3134,6 +6994,31 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -3199,28 +7084,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/cfb": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz", - "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", - "license": "Apache-2.0", - "dependencies": { - "adler-32": "~1.3.0", - "crc-32": "~1.2.0" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/cfb/node_modules/adler-32": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", - "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, "node_modules/chai": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", @@ -3328,6 +7191,19 @@ "node": ">=8" } }, + "node_modules/cjk-regex": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/cjk-regex/-/cjk-regex-3.3.0.tgz", + "integrity": "sha512-o9QeA4DIiljRGO3mXzkQXBttzE6XRGZG99V9F8uqrdqKo5RHTFe8w+pk1aOMB/wxQ7qQ8J7WoTagabTabPgl8A==", + "license": "MIT", + "dependencies": { + "regexp-util": "^2.0.1", + "unicode-regex": "^4.1.0" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/class-variance-authority": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", @@ -3340,6 +7216,90 @@ "url": "https://polar.sh/cva" } }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "peer": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT", + "peer": true + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -3349,33 +7309,20 @@ "node": ">=6" } }, - "node_modules/codepage": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.14.0.tgz", - "integrity": "sha512-iz3zJLhlrg37/gYRWgEPkaFTtzmnEv1h+r7NgZum2lFElYQPi0/5bnmuDfODHxfp0INEfnRqyfyeIJDbb7ahRw==", - "license": "Apache-2.0", - "dependencies": { - "commander": "~2.14.1", - "exit-on-epipe": "~1.0.1" - }, - "bin": { - "codepage": "bin/codepage.njs" - }, - "engines": { - "node": ">=0.8" + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/codepage/node_modules/commander": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", - "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==", - "license": "MIT" - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -3388,7 +7335,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, "license": "MIT" }, "node_modules/combined-stream": { @@ -3404,12 +7350,6 @@ "node": ">= 0.8" } }, - "node_modules/commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "license": "MIT" - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -3430,18 +7370,6 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "license": "MIT" }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -3508,7 +7436,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "devOptional": true, "license": "MIT" }, "node_modules/data-urls": { @@ -3554,7 +7481,6 @@ "version": "10.5.0", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", - "dev": true, "license": "MIT" }, "node_modules/deep-eql": { @@ -3603,6 +7529,12 @@ "node": ">=8" } }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -3625,6 +7557,16 @@ "license": "MIT", "peer": true }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/domexception": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", @@ -3802,7 +7744,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -4058,15 +7999,6 @@ "node": ">=0.10.0" } }, - "node_modules/exit-on-epipe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", - "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, "node_modules/expect": { "version": "30.0.1", "resolved": "https://registry.npmjs.org/expect/-/expect-30.0.1.tgz", @@ -4102,6 +8034,18 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "license": "Apache-2.0" + }, + "node_modules/fast-equals": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", + "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==", + "license": "MIT" + }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", @@ -4273,15 +8217,6 @@ "node": ">= 6" } }, - "node_modules/frac": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", - "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, "node_modules/fraction.js": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", @@ -4296,6 +8231,19 @@ "url": "https://github.com/sponsors/rawify" } }, + "node_modules/franc-min": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/franc-min/-/franc-min-6.2.0.tgz", + "integrity": "sha512-1uDIEUSlUZgvJa2AKYR/dmJC66v/PvGQ9mWfI9nOr/kPpMFyvswK0gPXOwpYJYiYD008PpHLkGfG58SPjQJFxw==", + "license": "MIT", + "dependencies": { + "trigram-utils": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -4331,6 +8279,16 @@ "node": ">=6.9.0" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "peer": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -4356,6 +8314,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/get-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", @@ -4576,6 +8543,27 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -4678,7 +8666,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -5331,6 +9318,12 @@ "setimmediate": "^1.0.5" } }, + "node_modules/kdbush": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz", + "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==", + "license": "ISC" + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -5612,6 +9605,24 @@ "dev": true, "license": "MIT" }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "license": "Apache-2.0", + "dependencies": { + "lie": "3.1.1" + } + }, + "node_modules/localforage/node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -5635,6 +9646,19 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT", + "peer": true + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -5642,6 +9666,13 @@ "dev": true, "license": "MIT" }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0", + "peer": true + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -5838,6 +9869,12 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/monaco-editor": { + "version": "0.52.2", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", + "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", + "license": "MIT" + }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", @@ -5867,6 +9904,16 @@ "thenify-all": "^1.0.0" } }, + "node_modules/n-gram": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/n-gram/-/n-gram-2.0.2.tgz", + "integrity": "sha512-S24aGsn+HLBxUGVAUFOwGpKs7LBcG4RudKU//eWzt/mQ97/NMKQxDWHyHx63UNWk/OOdihgmzoETn1tf5nQDzQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -5928,6 +9975,12 @@ "node": "*" } }, + "node_modules/numfmt": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/numfmt/-/numfmt-3.2.2.tgz", + "integrity": "sha512-vAdkKhb+8D1ebZcPx5TdUmPnzNYhzKGA+oVy+BoENFydDWljaZDci0wWWjNfvOUcXCdgKhwS08ErdTe+VzuQ+w==", + "license": "MIT" + }, "node_modules/nwsapi": { "version": "2.2.20", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", @@ -5939,7 +9992,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -5955,6 +10007,22 @@ "node": ">= 6" } }, + "node_modules/opentype.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/opentype.js/-/opentype.js-1.3.4.tgz", + "integrity": "sha512-d2JE9RP/6uagpQAVtJoF0pJJA/fgai89Cc50Yp0EJHk+eLp6QQ7gBoblsnubRULNY132I0J1QKMJ+JTbMqz4sw==", + "license": "MIT", + "dependencies": { + "string.prototype.codepointat": "^0.2.1", + "tiny-inflate": "^1.0.3" + }, + "bin": { + "ot": "bin/ot" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -5973,6 +10041,24 @@ "node": ">= 0.8.0" } }, + "node_modules/ot-json1": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ot-json1/-/ot-json1-1.0.2.tgz", + "integrity": "sha512-IhxkqVWQqlkWULoi/Q2AdzKk0N5vQRbUMUwubFXFCPcY4TsOZjmp2YKrk0/z1TeiECPadWEK060sdFdQ3Grokg==", + "license": "ISC", + "dependencies": { + "ot-text-unicode": "4" + } + }, + "node_modules/ot-text-unicode": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ot-text-unicode/-/ot-text-unicode-4.0.0.tgz", + "integrity": "sha512-W7ZLU8QXesY2wagYFv47zErXud3E93FGImmSGJsQnBzE+idcPPyo2u2KMilIrTwBh4pbCizy71qRjmmV6aDhcQ==", + "license": "ISC", + "dependencies": { + "unicount": "1.1" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -6367,24 +10453,54 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/printj": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", - "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", - "license": "Apache-2.0", - "bin": { - "printj": "bin/printj.njs" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "license": "MIT" }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/protobufjs": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.3.tgz", + "integrity": "sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/psl": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", @@ -6436,6 +10552,303 @@ ], "license": "MIT" }, + "node_modules/quickselect": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz", + "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==", + "license": "ISC" + }, + "node_modules/rbush": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/rbush/-/rbush-4.0.1.tgz", + "integrity": "sha512-IP0UpfeWQujYC8Jg162rMNc01Rf0gWMMAb2Uxus/Q0qOFw4lCcq6ZnQEZwUoJqWyUGJ9th7JjwI4yIWo+uvoAQ==", + "license": "MIT", + "dependencies": { + "quickselect": "^3.0.0" + } + }, + "node_modules/rc-dialog": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.6.0.tgz", + "integrity": "sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dropdown": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.2.1.tgz", + "integrity": "sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.6", + "rc-util": "^5.44.1" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" + } + }, + "node_modules/rc-input": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.8.0.tgz", + "integrity": "sha512-KXvaTbX+7ha8a/k+eg6SYRVERK0NddX8QX7a7AnRvUa/rEH0CNMlpcBzBkhI0wp2C8C4HlMoYl8TImSN+fuHKA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-input-number": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-9.5.0.tgz", + "integrity": "sha512-bKaEvB5tHebUURAEXw35LDcnRZLq3x1k7GxfAqBMzmpHkDGzjAtnUL8y4y5N15rIFIg5IJgwr211jInl3cipag==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/mini-decimal": "^1.0.1", + "classnames": "^2.2.5", + "rc-input": "~1.8.0", + "rc-util": "^5.40.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-menu": { + "version": "9.16.1", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.16.1.tgz", + "integrity": "sha512-ghHx6/6Dvp+fw8CJhDUHFHDJ84hJE3BXNCzSgLdmNiFErWSOaZNsihDAsKq9ByTALo/xkNIwtDFGIl6r+RPXBg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.0.0", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.3.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-motion": { + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.5.tgz", + "integrity": "sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.44.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-notification": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.6.4.tgz", + "integrity": "sha512-KcS4O6B4qzM3KH7lkwOB7ooLPZ4b6J+VMmQgT51VZCeEcmghdeR4IrMcFq0LG+RPdnbe/ArT086tGM8Snimgiw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.9.0", + "rc-util": "^5.20.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-overflow": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.4.1.tgz", + "integrity": "sha512-3MoPQQPV1uKyOMVNd6SZfONi+f3st0r8PksexIdBTeIYbMX0Jr+k7pHEDvsXtR4BpCv90/Pv2MovVNhktKrwvw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.37.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-picker": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.11.3.tgz", + "integrity": "sha512-MJ5teb7FlNE0NFHTncxXQ62Y5lytq6sh5nUw0iH8OkHL/TjARSEvSHpr940pWgjGANpjCwyMdvsEV55l5tYNSg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.1", + "rc-overflow": "^1.3.2", + "rc-resize-observer": "^1.4.0", + "rc-util": "^5.43.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "date-fns": ">= 2.x", + "dayjs": ">= 1.x", + "luxon": ">= 3.x", + "moment": ">= 2.x", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + }, + "peerDependenciesMeta": { + "date-fns": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + } + } + }, + "node_modules/rc-resize-observer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.3.tgz", + "integrity": "sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.44.1", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-segmented": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.7.0.tgz", + "integrity": "sha512-liijAjXz+KnTRVnxxXG2sYDGd6iLL7VpGGdR8gwoxAXy2KglviKCxLWZdjKYJzYzGSUwKDSTdYk8brj54Bn5BA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-motion": "^2.4.4", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-select": { + "version": "14.16.8", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.16.8.tgz", + "integrity": "sha512-NOV5BZa1wZrsdkKaiK7LHRuo5ZjZYMDxPP6/1+09+FB4KoNi8jcG1ZqLE3AVCxEsYMBe65OBx71wFoHRTP3LRg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.1.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.3.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-textarea": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.10.0.tgz", + "integrity": "sha512-ai9IkanNuyBS4x6sOL8qu/Ld40e6cEs6pgk93R+XLYg0mDSjNBGey6/ZpDs5+gNLD7urQ14po3V6Ck2dJLt9SA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-input": "~1.8.0", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util": { + "version": "5.44.4", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.44.4.tgz", + "integrity": "sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^18.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/rc-virtual-list": { + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.19.1.tgz", + "integrity": "sha512-DCapO2oyPqmooGhxBuXHM4lFuX+sshQwWqqkuyFA+4rShLe//+GEPVwiDgO+jKtKHtbeYwZoNvetwfHdOf+iUQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -6461,6 +10874,47 @@ "react": "^18.3.1" } }, + "node_modules/react-draggable": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.6.tgz", + "integrity": "sha512-LtY5Xw1zTPqHkVmtM3X8MUOxNDOUhv/khTgBgrUvwaS064bwVvxT+q5El0uUFNx5IEPKXuRejr7UqLwBIg5pdw==", + "license": "MIT", + "dependencies": { + "clsx": "^1.1.1", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" + } + }, + "node_modules/react-draggable/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react-grid-layout": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/react-grid-layout/-/react-grid-layout-1.5.1.tgz", + "integrity": "sha512-4Fr+kKMk0+m1HL/BWfHxi/lRuaOmDNNKQDcu7m12+NEYcen20wIuZFo789u3qWCyvUsNUxCiyf0eKq4WiJSNYw==", + "license": "MIT", + "dependencies": { + "clsx": "^2.0.0", + "fast-equals": "^4.0.3", + "prop-types": "^15.8.1", + "react-draggable": "^4.4.5", + "react-resizable": "^3.0.5", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" + } + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -6479,6 +10933,104 @@ "node": ">=0.10.0" } }, + "node_modules/react-remove-scroll": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz", + "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-resizable": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/react-resizable/-/react-resizable-3.0.5.tgz", + "integrity": "sha512-vKpeHhI5OZvYn82kXOs1bC8aOXktGU5AmKAgaZS4F5JPburCtbmDPqE7Pzp+1kN4+Wb81LlF33VpGwWwtXem+w==", + "license": "MIT", + "dependencies": { + "prop-types": "15.x", + "react-draggable": "^4.0.3" + }, + "peerDependencies": { + "react": ">= 16.3" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -6531,6 +11083,25 @@ "node": ">=8" } }, + "node_modules/regexp-util": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/regexp-util/-/regexp-util-2.0.3.tgz", + "integrity": "sha512-GP6h9OgJmhAZpb3dbNbXTfRWVnGcoMhWRZv/HxgM4/qCVqs1P9ukQdYxaUhjWBSAs9oJ/uPXUUvGT1VMe0Bs0Q==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -6538,6 +11109,12 @@ "dev": true, "license": "MIT" }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "license": "MIT" + }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", @@ -6644,6 +11221,16 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -6718,28 +11305,6 @@ "node": ">=8" } }, - "node_modules/sheetjs-style": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/sheetjs-style/-/sheetjs-style-0.15.8.tgz", - "integrity": "sha512-/wRiwnq5ck7aO+zLBs+u5JqQK4agUTIGCS0nxgaMjFl6XdlVaaB/RNJcP6S6Efj3+RYbSZuAoyqmSnbzxfT7Kg==", - "license": "Apache-2.0", - "dependencies": { - "adler-32": "~1.2.0", - "cfb": "^1.1.4", - "codepage": "~1.14.0", - "commander": "~2.17.1", - "crc-32": "~1.2.0", - "exit-on-epipe": "~1.0.1", - "ssf": "~0.10.3", - "wmf": "~1.0.1" - }, - "bin": { - "xlsx": "bin/xlsx.njs" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", @@ -6785,6 +11350,16 @@ "node": ">=8" } }, + "node_modules/sonner": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.5.tgz", + "integrity": "sha512-YwbHQO6cSso3HBXlbCkgrgzDNIhws14r4MO87Ofy+cV2X7ES4pOoAK3+veSmVTvqNx1BWUxlhPmZzP00Crk2aQ==", + "license": "MIT", + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -6805,21 +11380,6 @@ "node": ">=0.10.0" } }, - "node_modules/ssf": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.10.3.tgz", - "integrity": "sha512-pRuUdW0WwyB2doSqqjWyzwCD6PkfxpHAHdZp39K3dp/Hq7f+xfMwNAWIi16DyrRg4gg9c/RvLYkJTSawTPTm1w==", - "license": "Apache-2.0", - "dependencies": { - "frac": "~1.1.2" - }, - "bin": { - "ssf": "bin/ssf.njs" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -6857,6 +11417,32 @@ "dev": true, "license": "MIT" }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/stream-browserify/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -6930,6 +11516,12 @@ "node": ">=8" } }, + "node_modules/string.prototype.codepointat": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz", + "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==", + "license": "MIT" + }, "node_modules/strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", @@ -7198,6 +11790,12 @@ "node": ">=0.8" } }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "license": "MIT" + }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -7339,6 +11937,20 @@ "node": ">=12" } }, + "node_modules/trigram-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/trigram-utils/-/trigram-utils-2.0.1.tgz", + "integrity": "sha512-nfWIXHEaB+HdyslAfMxSqWKDdmqY9I32jS7GnqpdWQnLH89r6A5sdk3fDVYqGAZ0CrT8ovAFSAo6HRiWcWNIGQ==", + "license": "MIT", + "dependencies": { + "collapse-white-space": "^2.0.0", + "n-gram": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/ts-api-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", @@ -7359,6 +11971,12 @@ "dev": true, "license": "Apache-2.0" }, + "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" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7386,7 +12004,7 @@ "version": "5.6.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -7400,9 +12018,26 @@ "version": "7.8.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", - "dev": true, "license": "MIT" }, + "node_modules/unicode-regex": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unicode-regex/-/unicode-regex-4.1.2.tgz", + "integrity": "sha512-30Y3tQ8OUxceQjsEJHzNh20lLYZX6ZwQyUOHBUdN1UPKQWH3AvH20aUADWa1gEz2lQPTSQ/l2ZqdM4FjFNMJsQ==", + "license": "MIT", + "dependencies": { + "regexp-util": "^2.0.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/unicount": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicount/-/unicount-1.1.0.tgz", + "integrity": "sha512-RlwWt1ywVW4WErPGAVHw/rIuJ2+MxvTME0siJ6lk9zBhpDfExDbspe6SRlWT3qU6AucNjotPl9qAJRVjP7guCQ==", + "license": "ISC" + }, "node_modules/universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", @@ -7465,6 +12100,49 @@ "requires-port": "^1.0.0" } }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -7683,6 +12361,28 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/vue": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.17.tgz", + "integrity": "sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==", + "license": "MIT", + "optional": true, + "dependencies": { + "@vue/compiler-dom": "3.5.17", + "@vue/compiler-sfc": "3.5.17", + "@vue/runtime-dom": "3.5.17", + "@vue/server-renderer": "3.5.17", + "@vue/shared": "3.5.17" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", @@ -7776,24 +12476,6 @@ "node": ">=8" } }, - "node_modules/wmf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", - "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/word": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", - "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -7921,57 +12603,6 @@ } } }, - "node_modules/xlsx": { - "version": "0.18.5", - "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz", - "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", - "license": "Apache-2.0", - "dependencies": { - "adler-32": "~1.3.0", - "cfb": "~1.2.1", - "codepage": "~1.15.0", - "crc-32": "~1.2.1", - "ssf": "~0.11.2", - "wmf": "~1.0.1", - "word": "~0.3.0" - }, - "bin": { - "xlsx": "bin/xlsx.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/xlsx/node_modules/adler-32": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", - "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/xlsx/node_modules/codepage": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", - "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/xlsx/node_modules/ssf": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", - "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", - "license": "Apache-2.0", - "dependencies": { - "frac": "~1.1.2" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/xml-name-validator": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", @@ -7989,6 +12620,16 @@ "dev": true, "license": "MIT" }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -8009,6 +12650,80 @@ "node": ">= 14.6" } }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "peer": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT", + "peer": true + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index efad1c5..76d76e1 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,22 @@ }, "dependencies": { "@tailwindcss/postcss": "^4.1.10", + "@univerjs/core": "^0.8.2", + "@univerjs/design": "^0.8.2", + "@univerjs/docs": "^0.8.2", + "@univerjs/docs-ui": "^0.8.2", + "@univerjs/engine-formula": "^0.8.2", + "@univerjs/engine-numfmt": "^0.8.2", + "@univerjs/engine-render": "^0.8.2", + "@univerjs/facade": "^0.5.5", + "@univerjs/sheets": "^0.8.2", + "@univerjs/sheets-formula": "^0.8.2", + "@univerjs/sheets-formula-ui": "^0.8.2", + "@univerjs/sheets-numfmt": "^0.8.2", + "@univerjs/sheets-numfmt-ui": "^0.8.2", + "@univerjs/sheets-ui": "^0.8.2", + "@univerjs/ui": "^0.8.2", + "@univerjs/uniscript": "^0.8.2", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "file-saver": "^2.0.5", @@ -27,9 +43,7 @@ "luckysheet": "^2.1.13", "react": "^18.3.1", "react-dom": "^18.3.1", - "sheetjs-style": "^0.15.8", "tailwind-merge": "^2.5.4", - "xlsx": "^0.18.5", "zustand": "^5.0.2" }, "devDependencies": { @@ -46,6 +60,7 @@ "@vitejs/plugin-react": "^4.3.4", "@vitest/ui": "^3.2.4", "autoprefixer": "^10.4.20", + "buffer": "^6.0.3", "eslint": "^9.15.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-react-hooks": "^5.0.0", @@ -54,6 +69,7 @@ "jest-environment-jsdom": "^29.7.0", "postcss": "^8.5.1", "prettier": "^3.4.2", + "stream-browserify": "^3.0.0", "tailwindcss": "^3.4.17", "typescript": "~5.6.2", "vite": "^6.0.1", diff --git a/src/App.tsx b/src/App.tsx index 77ca87d..77056bc 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,14 +1,9 @@ -import { useAppStore } from "./stores/useAppStore"; -import { Card, CardContent } from "./components/ui/card"; +import { useState } from "react"; import { Button } from "./components/ui/button"; -import { FileUpload } from "./components/sheet/FileUpload"; -import { SheetViewer } from "./components/sheet/SheetViewer"; +import TestSheetViewer from "./components/sheet/TestSheetViewer"; function App() { - const { currentFile, sheets, resetApp } = useAppStore(); - - // 파일이 업로드되어 시트 데이터가 있는 경우와 없는 경우 구분 - const hasSheetData = currentFile && sheets && sheets.length > 0; + const [showTestViewer, setShowTestViewer] = useState(false); return (
@@ -20,24 +15,19 @@ function App() {

sheetEasy AI

- {hasSheetData && ( - <> - - {currentFile.name} - - - - )} - {!hasSheetData && ( + {/* 테스트 뷰어 토글 버튼 */} + + + {!showTestViewer && ( - Excel 파일 AI 처리 도구 + Univer CE 테스트 모드 )}
@@ -47,15 +37,29 @@ function App() { {/* 메인 콘텐츠 */}
- {hasSheetData ? ( - // 파일이 업로드된 경우: SheetViewer 표시 (전체화면) + {showTestViewer ? ( + // 테스트 뷰어 표시
- +
) : ( - // 파일이 업로드되지 않은 경우: FileUpload 표시 (중앙 정렬) + // 메인 페이지
- +
+

+ 🧪 Univer CE 테스트 모드 +

+

+ 현재 Univer CE 전용 테스트 뷰어를 사용해보세요 +

+ +
)}
diff --git a/src/components/sheet/FileUpload.tsx b/src/components/sheet/FileUpload.tsx.bak similarity index 100% rename from src/components/sheet/FileUpload.tsx rename to src/components/sheet/FileUpload.tsx.bak diff --git a/src/components/sheet/SheetViewer.tsx b/src/components/sheet/SheetViewer.tsx deleted file mode 100644 index 8680237..0000000 --- a/src/components/sheet/SheetViewer.tsx +++ /dev/null @@ -1,504 +0,0 @@ -import React, { - useEffect, - useLayoutEffect, - useRef, - useCallback, - useState, -} from "react"; -import { useAppStore } from "../../stores/useAppStore"; -import type { SheetData } from "../../types/sheet"; - -// Window 타입 확장 -declare global { - interface Window { - luckysheet: any; - LuckyExcel: any; - $: any; // jQuery - Store: any; // Luckysheet Store - luckysheet_function: any; // Luckysheet function list - functionlist: any[]; // 글로벌 functionlist - luckysheetConfigsetting: any; // Luckysheet 설정 객체 - luckysheetPostil: any; // Luckysheet 포스틸 객체 - } -} - -interface SheetViewerProps { - className?: string; -} - -/** - * Luckysheet 시트 뷰어 컴포넌트 - * - 메모리 정보 기반: LuckyExcel 변환 결과를 직접 사용 - * - 커스텀 검증이나 데이터 구조 변경 금지 - * - luckysheet.create({ data: exportJson.sheets })로 직접 사용 - */ -export function SheetViewer({ className }: SheetViewerProps) { - const containerRef = useRef(null); - const luckysheetRef = useRef(null); - const [isInitialized, setIsInitialized] = useState(false); - const [isConverting, setIsConverting] = useState(false); - const [error, setError] = useState(null); - const [isContainerReady, setIsContainerReady] = useState(false); - const [librariesLoaded, setLibrariesLoaded] = useState(false); - - // 스토어에서 현재 파일 정보만 가져오기 (시트 데이터는 LuckyExcel로 직접 변환) - const { currentFile, setSelectedRange } = useAppStore(); - - /** - * CDN 배포판 라이브러리 로딩 - */ - const loadLuckysheetLibrary = useCallback((): Promise => { - return new Promise((resolve, reject) => { - // 이미 로드된 경우 - if ( - window.luckysheet && - window.LuckyExcel && - window.$ && - librariesLoaded - ) { - console.log("📦 모든 라이브러리가 이미 로드됨"); - resolve(); - return; - } - - const loadResource = ( - type: "css" | "js", - src: string, - id: string, - ): Promise => { - return new Promise((resourceResolve, resourceReject) => { - // 이미 로드된 리소스 체크 - if (document.querySelector(`[data-luckysheet-id="${id}"]`)) { - resourceResolve(); - return; - } - - if (type === "css") { - const link = document.createElement("link"); - link.rel = "stylesheet"; - link.href = src; - link.setAttribute("data-luckysheet-id", id); - link.onload = () => resourceResolve(); - link.onerror = (error) => - resourceReject(new Error(`${id} CSS 로드 실패`)); - document.head.appendChild(link); - } else { - const script = document.createElement("script"); - script.src = src; - script.setAttribute("data-luckysheet-id", id); - script.onload = () => resourceResolve(); - script.onerror = (error) => - resourceReject(new Error(`${id} JS 로드 실패`)); - document.head.appendChild(script); - } - }); - }; - - const loadSequence = async () => { - try { - // 1. jQuery (Luckysheet 의존성) - if (!window.$) { - await loadResource( - "js", - "https://code.jquery.com/jquery-3.6.0.min.js", - "jquery", - ); - } - - // 2. CSS 로드 (공식 문서 순서 준수) - await loadResource( - "css", - "https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/css/pluginsCss.css", - "plugins-css", - ); - await loadResource( - "css", - "https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/plugins.css", - "plugins-main-css", - ); - await loadResource( - "css", - "https://cdn.jsdelivr.net/npm/luckysheet/dist/css/luckysheet.css", - "luckysheet-css", - ); - await loadResource( - "css", - "https://cdn.jsdelivr.net/npm/luckysheet/dist/assets/iconfont/iconfont.css", - "iconfont-css", - ); - - // 3. Plugin JS 먼저 로드 (functionlist 초기화) - await loadResource( - "js", - "https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/js/plugin.js", - "plugin-js", - ); - - // 4. Luckysheet 메인 - if (!window.luckysheet) { - await loadResource( - "js", - "https://cdn.jsdelivr.net/npm/luckysheet/dist/luckysheet.umd.js", - "luckysheet", - ); - } - - // 5. LuckyExcel (Excel 파일 처리용) - if (!window.LuckyExcel) { - await loadResource( - "js", - "https://cdn.jsdelivr.net/npm/luckyexcel/dist/luckyexcel.umd.js", - "luckyexcel", - ); - } - - // 라이브러리 검증 - const validationResults = { - jquery: !!window.$, - luckyExcel: !!window.LuckyExcel, - luckysheet: !!window.luckysheet, - luckysheetCreate: !!( - window.luckysheet && - typeof window.luckysheet.create === "function" - ), - luckysheetDestroy: !!( - window.luckysheet && - typeof window.luckysheet.destroy === "function" - ), - }; - - if ( - !validationResults.luckysheet || - !validationResults.luckysheetCreate - ) { - throw new Error( - "Luckysheet 객체가 올바르게 초기화되지 않았습니다.", - ); - } - - setLibrariesLoaded(true); - console.log("✅ 라이브러리 로드 완료"); - resolve(); - } catch (error) { - console.error("❌ 라이브러리 로딩 실패:", error); - reject(error); - } - }; - - loadSequence(); - }); - }, [librariesLoaded]); - - /** - * 메모리 정보 기반: LuckyExcel 변환 결과를 직접 사용하는 방식 - * - LuckyExcel.transformExcelToLucky()에서 반환된 exportJson.sheets를 그대로 사용 - * - 커스텀 검증이나 데이터 구조 변경 금지 - */ - const convertXLSXWithLuckyExcel = useCallback( - async (xlsxBuffer: ArrayBuffer, fileName: string) => { - if (!containerRef.current) { - console.warn("⚠️ 컨테이너가 없습니다."); - return; - } - - try { - setIsConverting(true); - setError(null); - - console.log("🍀 메모리 정보 기반: LuckyExcel 직접 변환 시작..."); - - // 라이브러리 로드 확인 - await loadLuckysheetLibrary(); - - // 기존 인스턴스 정리 - try { - if ( - window.luckysheet && - typeof window.luckysheet.destroy === "function" - ) { - window.luckysheet.destroy(); - console.log("✅ 기존 인스턴스 destroy 완료"); - } - } catch (destroyError) { - console.warn("⚠️ destroy 중 오류 (무시됨):", destroyError); - } - - // 컨테이너 초기화 - if (containerRef.current) { - containerRef.current.innerHTML = ""; - console.log("✅ 컨테이너 초기화 완료"); - } - - luckysheetRef.current = null; - - console.log("🍀 LuckyExcel.transformExcelToLucky 호출..."); - - // ArrayBuffer를 File 객체로 변환 (LuckyExcel은 File 객체 필요) - const file = new File([xlsxBuffer], fileName, { - type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - }); - - // LuckyExcel의 직접 변환 사용 (Promise 방식) - const luckyExcelResult = await new Promise((resolve, reject) => { - try { - // 🚨 수정: 첫 번째 매개변수는 File 객체여야 함 - (window.LuckyExcel as any).transformExcelToLucky( - file, // ArrayBuffer 대신 File 객체 사용 - // 성공 콜백 - (exportJson: any, luckysheetfile: any) => { - console.log("🍀 LuckyExcel 변환 성공!"); - console.log("🍀 exportJson:", exportJson); - console.log("🍀 luckysheetfile:", luckysheetfile); - resolve(exportJson); - }, - // 에러 콜백 - (error: any) => { - console.error("❌ LuckyExcel 변환 실패:", error); - reject(new Error(`LuckyExcel 변환 실패: ${error}`)); - }, - ); - } catch (callError) { - console.error("❌ LuckyExcel 호출 중 오류:", callError); - reject(callError); - } - }); - - // 결과 검증 - if ( - !luckyExcelResult || - !luckyExcelResult.sheets || - !Array.isArray(luckyExcelResult.sheets) - ) { - throw new Error("LuckyExcel 변환 결과가 유효하지 않습니다."); - } - - console.log("🎉 LuckyExcel 변환 완료, Luckysheet 생성 중..."); - - // 메모리 정보 기반: exportJson.sheets를 그대로 사용 - // luckysheet.create({ data: exportJson.sheets }) - window.luckysheet.create({ - container: containerRef.current?.id || "luckysheet-container", - showinfobar: false, - showtoolbar: false, - showsheetbar: true, - showstatisticBar: false, - allowCopy: true, - allowEdit: true, - // 🚨 핵심: LuckyExcel의 원본 변환 결과를 직접 사용 - data: luckyExcelResult.sheets, // 가공하지 않고 그대로 전달 - title: luckyExcelResult.info?.name || fileName, - // 🚨 수정: userInfo 경로 수정 - userInfo: luckyExcelResult.info?.creator || false, - }); - - console.log("🎉 Luckysheet 생성 완료! (원본 데이터 직접 사용)"); - setIsInitialized(true); - setIsConverting(false); - setError(null); - luckysheetRef.current = window.luckysheet; - } catch (conversionError) { - console.error("❌ 변환 프로세스 실패:", conversionError); - setError( - `변환 프로세스에 실패했습니다: ${ - conversionError instanceof Error - ? conversionError.message - : String(conversionError) - }`, - ); - setIsConverting(false); - setIsInitialized(false); - } - }, - [loadLuckysheetLibrary, setSelectedRange], - ); - - /** - * DOM 컨테이너 준비 상태 체크 - useLayoutEffect로 동기적 체크 - */ - useLayoutEffect(() => { - if (containerRef.current) { - console.log("✅ DOM 컨테이너 준비 완료:", containerRef.current.id); - setIsContainerReady(true); - } - }, []); - - /** - * DOM 컨테이너 준비 상태 재체크 (fallback) - */ - useEffect(() => { - if (!isContainerReady) { - const timer = setTimeout(() => { - if (containerRef.current && !isContainerReady) { - console.log("✅ useEffect: DOM 컨테이너 지연 준비 완료"); - setIsContainerReady(true); - } - }, 100); - return () => clearTimeout(timer); - } - }, [isContainerReady]); - - /** - * 컴포넌트 마운트 시 초기화 - */ - useEffect(() => { - if ( - currentFile?.xlsxBuffer && - isContainerReady && - containerRef.current && - !isInitialized && - !isConverting - ) { - console.log("🔄 XLSX 버퍼 감지, LuckyExcel 직접 변환 시작...", { - fileName: currentFile.name, - bufferSize: currentFile.xlsxBuffer.byteLength, - containerId: containerRef.current.id, - }); - - // 중복 실행 방지 - setIsConverting(true); - - // LuckyExcel로 직접 변환 - convertXLSXWithLuckyExcel(currentFile.xlsxBuffer, currentFile.name); - } else if (currentFile && !currentFile.xlsxBuffer) { - setError("파일 변환 데이터가 없습니다. 파일을 다시 업로드해주세요."); - } - }, [ - currentFile?.xlsxBuffer, - currentFile?.name, - isContainerReady, - isInitialized, - isConverting, - convertXLSXWithLuckyExcel, - ]); - - /** - * 컴포넌트 언마운트 시 정리 - */ - useEffect(() => { - return () => { - if (luckysheetRef.current && window.luckysheet) { - try { - window.luckysheet.destroy(); - } catch (error) { - console.warn("⚠️ Luckysheet 정리 중 오류:", error); - } - } - }; - }, []); - - /** - * 윈도우 리사이즈 처리 - */ - useEffect(() => { - const handleResize = () => { - if (luckysheetRef.current && window.luckysheet) { - try { - window.luckysheet.resize(); - } catch (error) { - console.warn("⚠️ Luckysheet 리사이즈 중 오류:", error); - } - } - }; - - window.addEventListener("resize", handleResize); - return () => window.removeEventListener("resize", handleResize); - }, []); - - return ( -
- {/* Luckysheet 컨테이너 - 항상 렌더링 */} -
- - {/* 에러 상태 오버레이 */} - {error && ( -
-
-
- 시트 로드 오류 -
-
{error}
- -
-
- )} - - {/* 로딩 상태 오버레이 */} - {!error && - (isConverting || !isInitialized) && - currentFile?.xlsxBuffer && ( -
-
-
-
- {isConverting ? "LuckyExcel 변환 중..." : "시트 초기화 중..."} -
-
- {isConverting - ? "원본 Excel 데이터를 완전한 스타일로 변환하고 있습니다." - : "잠시만 기다려주세요."} -
-
-
- )} - - {/* 데이터 없음 상태 오버레이 */} - {!error && !currentFile?.xlsxBuffer && ( -
-
-
- 표시할 시트가 없습니다 -
-
- Excel 파일을 업로드해주세요. -
-
-
- )} - - {/* 시트 정보 표시 (개발용) */} - {process.env.NODE_ENV === "development" && ( -
-
파일: {currentFile?.name}
-
- XLSX 버퍼:{" "} - {currentFile?.xlsxBuffer - ? `${currentFile.xlsxBuffer.byteLength} bytes` - : "없음"} -
-
변환 중: {isConverting ? "예" : "아니오"}
-
초기화: {isInitialized ? "완료" : "대기"}
-
컨테이너 준비: {isContainerReady ? "완료" : "대기"}
-
방식: LuckyExcel 직접 변환
-
- )} -
- ); -} diff --git a/src/components/sheet/SheetViewer.tsx.bak b/src/components/sheet/SheetViewer.tsx.bak index 8dfe67c..e02fa53 100644 --- a/src/components/sheet/SheetViewer.tsx.bak +++ b/src/components/sheet/SheetViewer.tsx.bak @@ -1,4 +1,4 @@ -import React, { +import { useEffect, useLayoutEffect, useRef, @@ -6,21 +6,6 @@ import React, { useState, } from "react"; import { useAppStore } from "../../stores/useAppStore"; -import type { SheetData } from "../../types/sheet"; - -// Window 타입 확장 -declare global { - interface Window { - luckysheet: any; - LuckyExcel: any; - $: any; // jQuery - Store: any; // Luckysheet Store - luckysheet_function: any; // Luckysheet function list - functionlist: any[]; // 글로벌 functionlist - luckysheetConfigsetting: any; // Luckysheet 설정 객체 - luckysheetPostil: any; // Luckysheet 포스틸 객체 - } -} interface SheetViewerProps { className?: string; @@ -28,9 +13,9 @@ interface SheetViewerProps { /** * Luckysheet 시트 뷰어 컴포넌트 - * - 참고 내용 기반: 완전한 라이브러리 로딩 순서 적용 - * - functionlist 오류 방지를 위한 완전한 초기화 - * - 필수 플러그인과 CSS 포함 + * - 메모리 정보 기반: LuckyExcel 변환 결과를 직접 사용 + * - 커스텀 검증이나 데이터 구조 변경 금지 + * - luckysheet.create({ data: exportJson.sheets })로 직접 사용 */ export function SheetViewer({ className }: SheetViewerProps) { const containerRef = useRef(null); @@ -41,12 +26,11 @@ export function SheetViewer({ className }: SheetViewerProps) { const [isContainerReady, setIsContainerReady] = useState(false); const [librariesLoaded, setLibrariesLoaded] = useState(false); - // 스토어에서 시트 데이터 가져오기 - const { sheets, activeSheetId, currentFile, setSelectedRange } = - useAppStore(); + // 스토어에서 현재 파일 정보만 가져오기 (시트 데이터는 LuckyExcel로 직접 변환) + const { currentFile, setSelectedRange } = useAppStore(); /** - * CDN 배포판 + functionlist 직접 초기화 방식 + * CDN 배포판 라이브러리 로딩 */ const loadLuckysheetLibrary = useCallback((): Promise => { return new Promise((resolve, reject) => { @@ -62,8 +46,6 @@ export function SheetViewer({ className }: SheetViewerProps) { return; } - // console.log("📦 CDN 배포판 + functionlist 직접 초기화 방식..."); - const loadResource = ( type: "css" | "js", src: string, @@ -72,7 +54,6 @@ export function SheetViewer({ className }: SheetViewerProps) { return new Promise((resourceResolve, resourceReject) => { // 이미 로드된 리소스 체크 if (document.querySelector(`[data-luckysheet-id="${id}"]`)) { - // console.log(`📦 ${id} 이미 로드됨`); resourceResolve(); return; } @@ -82,33 +63,22 @@ export function SheetViewer({ className }: SheetViewerProps) { link.rel = "stylesheet"; link.href = src; link.setAttribute("data-luckysheet-id", id); - link.onload = () => { - // console.log(`✅ ${id} CSS 로드 완료`); - resourceResolve(); - }; - link.onerror = (error) => { - // console.error(`❌ ${id} CSS 로드 실패:`, error); + link.onload = () => resourceResolve(); + link.onerror = () => resourceReject(new Error(`${id} CSS 로드 실패`)); - }; document.head.appendChild(link); } else { const script = document.createElement("script"); script.src = src; script.setAttribute("data-luckysheet-id", id); - script.onload = () => { - // console.log(`✅ ${id} JS 로드 완료`); - resourceResolve(); - }; - script.onerror = (error) => { - // console.error(`❌ ${id} JS 로드 실패:`, error); + script.onload = () => resourceResolve(); + script.onerror = () => resourceReject(new Error(`${id} JS 로드 실패`)); - }; document.head.appendChild(script); } }); }; - // CDN 배포판 로딩 + functionlist 직접 초기화 const loadSequence = async () => { try { // 1. jQuery (Luckysheet 의존성) @@ -120,79 +90,54 @@ export function SheetViewer({ className }: SheetViewerProps) { ); } - // 2. CSS 로드 (빌드된 파일들) + // 2. CSS 로드 (공식 문서 순서 준수) await loadResource( "css", - "/luckysheet/dist/plugins/css/pluginsCss.css", + "https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/css/pluginsCss.css", "plugins-css", ); await loadResource( "css", - "/luckysheet/dist/plugins/plugins.css", + "https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/plugins.css", "plugins-main-css", ); await loadResource( "css", - "/luckysheet/dist/css/luckysheet.css", + "https://cdn.jsdelivr.net/npm/luckysheet/dist/css/luckysheet.css", "luckysheet-css", ); await loadResource( "css", - "/luckysheet/dist/assets/iconfont/iconfont.css", + "https://cdn.jsdelivr.net/npm/luckysheet/dist/assets/iconfont/iconfont.css", "iconfont-css", ); - // 3. Plugin JS 먼저 로드 (functionlist 초기화 우선) + // 3. Plugin JS 먼저 로드 (functionlist 초기화) await loadResource( "js", - "/luckysheet/dist/plugins/js/plugin.js", + "https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/js/plugin.js", "plugin-js", ); - // 👉 plugin.js 로드 후 실제 functionlist 가 채워졌는지 polling 으로 확인 (최대 3초) - const waitForFunctionlistReady = ( - timeout = 3000, - interval = 50, - ): Promise => { - return new Promise((res, rej) => { - let waited = 0; - const timer = setInterval(() => { - if (window.Store?.functionlist?.length) { - clearInterval(timer); - res(); - } else if ((waited += interval) >= timeout) { - clearInterval(timer); - rej(new Error("functionlist 초기화 시간 초과")); - } - }, interval); - }); - }; - - await waitForFunctionlistReady(); - - // 4. LuckyExcel (Excel 파일 처리용) - if (!window.LuckyExcel) { - await loadResource( - "js", - "/luckysheet/dist/luckyexcel.umd.js", - "luckyexcel", - ); - } - - // 5. Luckysheet 메인 (functionlist 준비 후) + // 4. Luckysheet 메인 if (!window.luckysheet) { await loadResource( "js", - "/luckysheet/dist/luckysheet.umd.js", + "https://cdn.jsdelivr.net/npm/luckysheet/dist/luckysheet.umd.js", "luckysheet", ); } - // 라이브러리 로드 후 검증 - // console.log("🔍 라이브러리 로드 후 검증 중..."); + // 5. LuckyExcel (Excel 파일 처리용) + if (!window.LuckyExcel) { + await loadResource( + "js", + "https://cdn.jsdelivr.net/npm/luckyexcel/dist/luckyexcel.umd.js", + "luckyexcel", + ); + } - // NOTE: plugin.js 가 실제 functionlist 를 채웠으므로 별도 지연 대기 불필요 - // 필수 객체 검증 + // 라이브러리 검증 const validationResults = { jquery: !!window.$, luckyExcel: !!window.LuckyExcel, @@ -207,8 +152,6 @@ export function SheetViewer({ className }: SheetViewerProps) { ), }; - // console.log("🔍 라이브러리 검증 결과:", validationResults); - if ( !validationResults.luckysheet || !validationResults.luckysheetCreate @@ -218,75 +161,11 @@ export function SheetViewer({ className }: SheetViewerProps) { ); } - // 🔧 강력한 functionlist 초기화 (메모리 해결책 적용) - // console.log("🔧 강력한 functionlist 및 모든 필수 객체 초기화 중..."); - try { - // 1. Store 객체 강제 생성 - if (!window.Store) { - window.Store = {}; - } - - // 2. functionlist 다중 레벨 초기화 - if (!window.Store.functionlist) { - window.Store.functionlist = []; - } - - // 3. luckysheet_function 다중 레벨 초기화 - if (!window.luckysheet_function) { - window.luckysheet_function = {}; - } - if (!window.Store.luckysheet_function) { - window.Store.luckysheet_function = {}; - } - - // 4. Luckysheet 내부에서 사용하는 추가 functionlist 객체들 초기화 - if (window.luckysheet && !window.luckysheet.functionlist) { - window.luckysheet.functionlist = []; - } - - // 5. 글로벌 functionlist 초기화 (다양한 참조 경로 대응) - if (!window.functionlist) { - window.functionlist = []; - } - - // 6. Store 내부 구조 완전 초기화 - if (!window.Store.config) { - window.Store.config = {}; - } - if (!window.Store.luckysheetfile) { - window.Store.luckysheetfile = []; - } - if (!window.Store.currentSheetIndex) { - window.Store.currentSheetIndex = 0; - } - - // 7. Luckysheet 모듈별 초기화 확인 - if (window.luckysheet) { - // 함수 관련 모듈 초기화 - if (!window.luckysheet.formula) { - window.luckysheet.formula = {}; - } - if (!window.luckysheet.formulaCache) { - window.luckysheet.formulaCache = {}; - } - if (!window.luckysheet.formulaObjects) { - window.luckysheet.formulaObjects = {}; - } - } - - // console.log("✅ 강력한 functionlist 및 모든 필수 객체 초기화 완료"); - } catch (functionError) { - // console.warn( - // "⚠️ 강력한 functionlist 초기화 중 오류 (무시됨):", - // functionError, - // ); - } - setLibrariesLoaded(true); - // console.log("✅ CDN 배포판 + functionlist 초기화 완료"); + console.log("✅ 라이브러리 로드 완료"); resolve(); } catch (error) { - // console.error("❌ 라이브러리 로딩 실패:", error); + console.error("❌ 라이브러리 로딩 실패:", error); reject(error); } }; @@ -296,9 +175,11 @@ export function SheetViewer({ className }: SheetViewerProps) { }, [librariesLoaded]); /** - * 참고 내용 기반: 올바른 데이터 구조로 Luckysheet 초기화 + * 메모리 정보 기반: LuckyExcel 변환 결과를 직접 사용하는 방식 + * - LuckyExcel.transformExcelToLucky()에서 반환된 exportJson.sheets를 그대로 사용 + * - 커스텀 검증이나 데이터 구조 변경 금지 */ - const convertXLSXToLuckysheet = useCallback( + const convertXLSXWithLuckyExcel = useCallback( async (xlsxBuffer: ArrayBuffer, fileName: string) => { if (!containerRef.current) { console.warn("⚠️ 컨테이너가 없습니다."); @@ -309,317 +190,97 @@ export function SheetViewer({ className }: SheetViewerProps) { setIsConverting(true); setError(null); - // console.log( - // "🔄 참고 내용 기반: XLSX → LuckyExcel → Luckysheet 변환 시작...", - // ); + console.log("🍀 메모리 정보 기반: LuckyExcel 직접 변환 시작..."); // 라이브러리 로드 확인 await loadLuckysheetLibrary(); - // 기존 인스턴스 정리 (참고 내용 권장사항) - // console.log("🧹 기존 Luckysheet 인스턴스 정리..."); + // 기존 인스턴스 정리 try { if ( window.luckysheet && typeof window.luckysheet.destroy === "function" ) { window.luckysheet.destroy(); - // console.log("✅ 기존 인스턴스 destroy 완료"); + console.log("✅ 기존 인스턴스 destroy 완료"); } } catch (destroyError) { - // console.warn("⚠️ destroy 중 오류 (무시됨):", destroyError); + console.warn("⚠️ destroy 중 오류 (무시됨):", destroyError); } // 컨테이너 초기화 if (containerRef.current) { containerRef.current.innerHTML = ""; - // console.log("✅ 컨테이너 초기화 완료"); + console.log("✅ 컨테이너 초기화 완료"); } luckysheetRef.current = null; - // console.log("🍀 LuckyExcel.transformExcelToLucky 호출..."); + console.log("🍀 LuckyExcel.transformExcelToLucky 호출..."); - // LuckyExcel 변환 (참고 내용의 블로그 포스트 방식) - window.LuckyExcel.transformExcelToLucky( - xlsxBuffer, - // 성공 콜백 - 변환 완료 후에만 Luckysheet 초기화 - (exportJson: any, luckysheetfile: any) => { - try { - // console.log("✅ LuckyExcel 변환 완료:", { - // hasExportJson: !!exportJson, - // hasSheets: !!exportJson?.sheets, - // sheetsCount: exportJson?.sheets?.length || 0, - // sheetsStructure: - // exportJson?.sheets?.map((sheet: any, index: number) => ({ - // index, - // name: sheet?.name, - // hasData: !!sheet?.data, - // dataLength: Array.isArray(sheet?.data) - // ? sheet.data.length - // : 0, - // })) || [], - // }); + // ArrayBuffer를 File 객체로 변환 (LuckyExcel은 File 객체 필요) + const file = new File([xlsxBuffer], fileName, { + type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + }); - // 공식 LuckyExcel 방식: 기본 검증만 수행 (과도한 변환 방지) - if ( - !exportJson || - !exportJson.sheets || - !Array.isArray(exportJson.sheets) - ) { - throw new Error( - "LuckyExcel 변환 결과가 유효하지 않습니다: sheets 배열이 없음", - ); - } - - if (exportJson.sheets.length === 0) { - throw new Error("변환된 시트가 없습니다."); - } - - // console.log("✅ LuckyExcel 변환 결과 검증 완료:", { - // sheetsCount: exportJson.sheets.length, - // hasInfo: !!exportJson.info, - // infoName: exportJson.info?.name, - // infoCreator: exportJson.info?.creator, - // }); - - // console.log( - // "🎯 functionlist 초기화 완료: Luckysheet 초기화 시작...", - // ); - - // 메모리 해결책: 최종 완전한 functionlist 및 모든 Luckysheet 내부 객체 초기화 - try { - // Level 1: Store 객체 완전 초기화 - if (!window.Store) window.Store = {}; - if (!window.Store.functionlist) window.Store.functionlist = []; - if (!window.Store.luckysheet_function) - window.Store.luckysheet_function = {}; - if (!window.Store.config) window.Store.config = {}; - if (!window.Store.luckysheetfile) - window.Store.luckysheetfile = []; - - // Level 2: 글로벌 function 객체들 완전 초기화 - if (!window.luckysheet_function) - window.luckysheet_function = {}; - if (!window.functionlist) window.functionlist = []; - - // Level 3: Luckysheet 내부 깊은 레벨 초기화 - if (window.luckysheet) { - // 함수 관련 깊은 객체들 - if (!window.luckysheet.functionlist) - window.luckysheet.functionlist = []; - if (!window.luckysheet.formula) - window.luckysheet.formula = {}; - if (!window.luckysheet.formulaCache) - window.luckysheet.formulaCache = {}; - if (!window.luckysheet.formulaObjects) - window.luckysheet.formulaObjects = {}; - - // Store 레퍼런스 초기화 - if (!window.luckysheet.Store) - window.luckysheet.Store = window.Store; - if (!window.luckysheet.luckysheetfile) - window.luckysheet.luckysheetfile = []; - - // 내부 모듈들 초기화 - if (!window.luckysheet.menuButton) - window.luckysheet.menuButton = {}; - if (!window.luckysheet.server) window.luckysheet.server = {}; - if (!window.luckysheet.selection) - window.luckysheet.selection = {}; - } - - // Level 4: 추가적인 깊은 레벨 객체들 (Luckysheet 내부에서 사용할 수 있는) - if (!window.luckysheetConfigsetting) - window.luckysheetConfigsetting = {}; - if (!window.luckysheetPostil) window.luckysheetPostil = {}; - if (!window.Store.visibledatarow) - window.Store.visibledatarow = []; - if (!window.Store.visibledatacolumn) - window.Store.visibledatacolumn = []; - if (!window.Store.defaultcollen) - window.Store.defaultcollen = 73; - if (!window.Store.defaultrowlen) - window.Store.defaultrowlen = 19; - - console.log("✅ 완전한 Luckysheet 내부 객체 초기화 완료"); - - // 극한의 방법: Luckysheet 내부 코드 직접 패치 (임시) - if ( - window.luckysheet && - typeof window.luckysheet.create === "function" - ) { - // Luckysheet 내부에서 사용하는 모든 가능한 functionlist 경로 강제 생성 - const originalCreate = window.luckysheet.create; - window.luckysheet.create = function (options: any) { - try { - // 생성 직전 모든 functionlist 경로 재검증 - if (!window.Store) window.Store = {}; - if (!window.Store.functionlist) - window.Store.functionlist = []; - if (!this.functionlist) this.functionlist = []; - if (!this.Store) this.Store = window.Store; - if (!this.Store.functionlist) - this.Store.functionlist = []; - - // 원본 함수 호출 - return originalCreate.call(this, options); - } catch (error) { - console.error( - "Luckysheet create 패치된 함수에서 오류:", - error, - ); - throw error; - } - }; - console.log("🔧 Luckysheet.create 함수 패치 완료"); - } - } catch (finalInitError) { - console.warn( - "⚠️ 완전한 functionlist 초기화 중 오류:", - finalInitError, - ); - } - - // 공식 LuckyExcel 방식: exportJson.sheets를 직접 사용 - const luckysheetOptions = { - container: containerRef.current?.id || "luckysheet-container", - title: exportJson.info?.name || fileName || "Sheet Easy AI", - lang: "ko", - data: exportJson.sheets, // 공식 방식: LuckyExcel 결과를 직접 사용 - - // userInfo도 공식 예시대로 설정 - userInfo: exportJson.info?.creator || "Sheet Easy AI User", - - // UI 설정 (모든 기능 활성화) - showinfobar: false, - showtoolbar: true, // 툴바 활성화 - showsheetbar: true, - showstatisticBar: false, - showConfigWindowResize: true, - - // 편집 기능 활성화 - allowCopy: true, - allowEdit: true, - enableAddRow: true, // 행/열 추가 활성화 - enableAddCol: true, - - // 함수 기능 활성화 - allowUpdate: true, - enableAddBackTop: true, - showFormulaBar: true, // 수식바 활성화 - - // 이벤트 핸들러 (모든 기능) - hook: { - cellClick: (cell: any, position: any, sheetFile: any) => { - // console.log("🖱️ 셀 클릭:", { cell, position, sheetFile }); - if ( - position && - typeof position.r === "number" && - typeof position.c === "number" - ) { - setSelectedRange({ - range: { - startRow: position.r, - startCol: position.c, - endRow: position.r, - endCol: position.c, - }, - sheetId: sheetFile?.index || "0", - }); - } - }, - sheetActivate: ( - index: number, - isPivotInitial: boolean, - isInitialLoad: boolean, - ) => { - // console.log("📋 시트 활성화:", { - // index, - // isPivotInitial, - // isInitialLoad, - // }); - if (exportJson.sheets[index]) { - useAppStore.getState().setActiveSheetId(`sheet_${index}`); - } - }, - updated: (operate: any) => { - // console.log("🔄 시트 업데이트:", operate); - }, - }, - }; - - // === 상세 디버깅 정보 === - console.log("=== LuckyExcel → Luckysheet 디버깅 정보 ==="); - console.log("📋 exportJson 구조:", { - hasExportJson: !!exportJson, - hasInfo: !!exportJson?.info, - hasSheets: !!exportJson?.sheets, - sheetsCount: exportJson?.sheets?.length, - infoKeys: Object.keys(exportJson?.info || {}), - firstSheetKeys: Object.keys(exportJson?.sheets?.[0] || {}), - }); - console.log("🔧 Functionlist 상태 상세 검사:", { - windowStore: !!window.Store, - storeFunctionlist: !!window.Store?.functionlist, - storeFunctionlistLength: window.Store?.functionlist?.length, - luckysheetFunction: !!window.luckysheet_function, - globalFunctionlist: !!window.functionlist, - globalFunctionlistLength: window.functionlist?.length, - luckysheetStoreFunctionlist: - !!window.luckysheet?.Store?.functionlist, - luckysheetOwnFunctionlist: !!window.luckysheet?.functionlist, - allWindowKeys: Object.keys(window).filter((key) => - key.includes("function"), - ), - allStoreKeys: Object.keys(window.Store || {}), - allLuckysheetKeys: Object.keys(window.luckysheet || {}).slice( - 0, - 10, - ), - }); - console.log("🎯 Luckysheet 객체:", { - hasLuckysheet: !!window.luckysheet, - hasCreate: typeof window.luckysheet?.create === "function", - methodsCount: Object.keys(window.luckysheet || {}).length, - }); - console.log("=== 디버깅 정보 끝 ==="); - - // Luckysheet 생성 - window.luckysheet.create(luckysheetOptions); - - luckysheetRef.current = window.luckysheet; - setIsInitialized(true); - setIsConverting(false); - - // console.log( - // "✅ functionlist 초기화 완료: Luckysheet 초기화 완료!", - // ); - } catch (initError) { - console.error("❌ Luckysheet 초기화 실패:", initError); - setError( - `시트 초기화에 실패했습니다: ${ - initError instanceof Error - ? initError.message - : String(initError) - }`, - ); - setIsInitialized(false); - setIsConverting(false); - } - }, - // 오류 콜백 - (error: any) => { - console.error("❌ LuckyExcel 변환 실패:", error); - setError( - `XLSX 변환에 실패했습니다: ${ - error instanceof Error ? error.message : String(error) - }`, + // LuckyExcel의 직접 변환 사용 (Promise 방식) + const luckyExcelResult = await new Promise((resolve, reject) => { + try { + // 🚨 수정: 첫 번째 매개변수는 File 객체여야 함 + (window.LuckyExcel as any).transformExcelToLucky( + file, // ArrayBuffer 대신 File 객체 사용 + // 성공 콜백 + (exportJson: any, luckysheetfile: any) => { + console.log("🍀 LuckyExcel 변환 성공!"); + console.log("🍀 exportJson:", exportJson); + console.log("🍀 luckysheetfile:", luckysheetfile); + resolve(exportJson); + }, + // 에러 콜백 + (error: any) => { + console.error("❌ LuckyExcel 변환 실패:", error); + reject(new Error(`LuckyExcel 변환 실패: ${error}`)); + }, ); - setIsConverting(false); - setIsInitialized(false); - }, - ); + } catch (callError) { + console.error("❌ LuckyExcel 호출 중 오류:", callError); + reject(callError); + } + }); + + // 결과 검증 + if ( + !luckyExcelResult || + !luckyExcelResult.sheets || + !Array.isArray(luckyExcelResult.sheets) + ) { + throw new Error("LuckyExcel 변환 결과가 유효하지 않습니다."); + } + + console.log("🎉 LuckyExcel 변환 완료, Luckysheet 생성 중..."); + + // 메모리 정보 기반: exportJson.sheets를 그대로 사용 + // luckysheet.create({ data: exportJson.sheets }) + window.luckysheet.create({ + container: containerRef.current?.id || "luckysheet-container", + showinfobar: true, + showtoolbar: true, + showsheetbar: true, + showstatisticBar: true, + allowCopy: true, + allowEdit: true, + // 🚨 핵심: LuckyExcel의 원본 변환 결과를 직접 사용 + data: luckyExcelResult.sheets, // 가공하지 않고 그대로 전달 + title: luckyExcelResult.info?.name || fileName, + // 🚨 수정: userInfo 경로 수정 + userInfo: luckyExcelResult.info?.creator || false, + }); + + console.log("🎉 Luckysheet 생성 완료! (원본 데이터 직접 사용)"); + setIsInitialized(true); + setIsConverting(false); + setError(null); + luckysheetRef.current = window.luckysheet; } catch (conversionError) { console.error("❌ 변환 프로세스 실패:", conversionError); setError( @@ -640,12 +301,9 @@ export function SheetViewer({ className }: SheetViewerProps) { * DOM 컨테이너 준비 상태 체크 - useLayoutEffect로 동기적 체크 */ useLayoutEffect(() => { - // console.log("🔍 useLayoutEffect: DOM 컨테이너 체크 시작..."); if (containerRef.current) { - // console.log("✅ DOM 컨테이너 준비 완료:", containerRef.current.id); + console.log("✅ DOM 컨테이너 준비 완료:", containerRef.current.id); setIsContainerReady(true); - } else { - // console.warn("⚠️ useLayoutEffect: DOM 컨테이너가 아직 준비되지 않음"); } }, []); @@ -654,10 +312,9 @@ export function SheetViewer({ className }: SheetViewerProps) { */ useEffect(() => { if (!isContainerReady) { - // console.log("🔄 useEffect: DOM 컨테이너 재체크..."); const timer = setTimeout(() => { if (containerRef.current && !isContainerReady) { - // console.log("✅ useEffect: DOM 컨테이너 지연 준비 완료"); + console.log("✅ useEffect: DOM 컨테이너 지연 준비 완료"); setIsContainerReady(true); } }, 100); @@ -666,43 +323,37 @@ export function SheetViewer({ className }: SheetViewerProps) { }, [isContainerReady]); /** - * 컴포넌트 마운트 시 초기화 - 블로그 포스트 방식 적용 + * 컴포넌트 마운트 시 초기화 */ useEffect(() => { - // console.log("🔍 useEffect 실행 조건 체크:", { - // hasCurrentFile: !!currentFile, - // hasXlsxBuffer: !!currentFile?.xlsxBuffer, - // hasContainer: !!containerRef.current, - // isContainerReady, - // currentFileName: currentFile?.name, - // bufferSize: currentFile?.xlsxBuffer?.byteLength, - // }); + if ( + currentFile?.xlsxBuffer && + isContainerReady && + containerRef.current && + !isInitialized && + !isConverting + ) { + console.log("🔄 XLSX 버퍼 감지, LuckyExcel 직접 변환 시작...", { + fileName: currentFile.name, + bufferSize: currentFile.xlsxBuffer.byteLength, + containerId: containerRef.current.id, + }); - if (currentFile?.xlsxBuffer && isContainerReady && containerRef.current) { - // console.log("🔄 변환된 XLSX 감지, LuckyExcel → Luckysheet 시작...", { - // fileName: currentFile.name, - // bufferSize: currentFile.xlsxBuffer.byteLength, - // containerId: containerRef.current.id, - // }); + // 중복 실행 방지 + setIsConverting(true); - // 변환된 XLSX ArrayBuffer를 사용하여 직접 변환 (블로그 포스트 방식) - convertXLSXToLuckysheet(currentFile.xlsxBuffer, currentFile.name); + // LuckyExcel로 직접 변환 + convertXLSXWithLuckyExcel(currentFile.xlsxBuffer, currentFile.name); } else if (currentFile && !currentFile.xlsxBuffer) { - // console.warn( - // "⚠️ currentFile은 있지만 xlsxBuffer가 없습니다:", - // currentFile, - // ); setError("파일 변환 데이터가 없습니다. 파일을 다시 업로드해주세요."); - } else if (!currentFile) { - // console.log("ℹ️ currentFile이 없습니다. 파일을 업로드해주세요."); - } else if (currentFile?.xlsxBuffer && !isContainerReady) { - // console.log("⏳ DOM 컨테이너 준비 대기 중..."); } }, [ currentFile?.xlsxBuffer, currentFile?.name, isContainerReady, - convertXLSXToLuckysheet, + isInitialized, + isConverting, + convertXLSXWithLuckyExcel, ]); /** @@ -711,11 +362,10 @@ export function SheetViewer({ className }: SheetViewerProps) { useEffect(() => { return () => { if (luckysheetRef.current && window.luckysheet) { - // console.log("🧹 컴포넌트 언마운트: Luckysheet 정리 중..."); try { window.luckysheet.destroy(); } catch (error) { - // console.warn("⚠️ Luckysheet 정리 중 오류:", error); + console.warn("⚠️ Luckysheet 정리 중 오류:", error); } } }; @@ -728,9 +378,11 @@ export function SheetViewer({ className }: SheetViewerProps) { const handleResize = () => { if (luckysheetRef.current && window.luckysheet) { try { - window.luckysheet.resize(); + if (window.luckysheet.resize) { + window.luckysheet.resize(); + } } catch (error) { - // console.warn("⚠️ Luckysheet 리사이즈 중 오류:", error); + console.warn("⚠️ Luckysheet 리사이즈 중 오류:", error); } } }; @@ -771,7 +423,7 @@ export function SheetViewer({ className }: SheetViewerProps) { setIsInitialized(false); setIsConverting(false); if (currentFile?.xlsxBuffer) { - convertXLSXToLuckysheet( + convertXLSXWithLuckyExcel( currentFile.xlsxBuffer, currentFile.name, ); @@ -793,11 +445,11 @@ export function SheetViewer({ className }: SheetViewerProps) {
- {isConverting ? "XLSX 변환 중..." : "시트 초기화 중..."} + {isConverting ? "LuckyExcel 변환 중..." : "시트 초기화 중..."}
{isConverting - ? "변환된 XLSX를 Luckysheet로 처리하고 있습니다." + ? "원본 Excel 데이터를 완전한 스타일로 변환하고 있습니다." : "잠시만 기다려주세요."}
@@ -831,6 +483,7 @@ export function SheetViewer({ className }: SheetViewerProps) {
변환 중: {isConverting ? "예" : "아니오"}
초기화: {isInitialized ? "완료" : "대기"}
컨테이너 준비: {isContainerReady ? "완료" : "대기"}
+
방식: LuckyExcel 직접 변환
)} diff --git a/src/components/sheet/TestSheetViewer.tsx b/src/components/sheet/TestSheetViewer.tsx new file mode 100644 index 0000000..6daf009 --- /dev/null +++ b/src/components/sheet/TestSheetViewer.tsx @@ -0,0 +1,174 @@ +import React, { useRef, useEffect, useState } from "react"; +import { Univer, UniverInstanceType, LocaleType } from "@univerjs/core"; +import { defaultTheme } from "@univerjs/design"; +import { UniverDocsPlugin } from "@univerjs/docs"; +import { UniverDocsUIPlugin } from "@univerjs/docs-ui"; +import { UniverFormulaEnginePlugin } from "@univerjs/engine-formula"; +import { UniverRenderEnginePlugin } from "@univerjs/engine-render"; +import { UniverSheetsPlugin } from "@univerjs/sheets"; +import { UniverSheetsFormulaPlugin } from "@univerjs/sheets-formula"; +import { UniverSheetsFormulaUIPlugin } from "@univerjs/sheets-formula-ui"; +import { UniverSheetsUIPlugin } from "@univerjs/sheets-ui"; +import { UniverSheetsNumfmtPlugin } from "@univerjs/sheets-numfmt"; +import { UniverSheetsNumfmtUIPlugin } from "@univerjs/sheets-numfmt-ui"; +import { UniverUIPlugin } from "@univerjs/ui"; + +// 언어팩 import +import DesignEnUS from "@univerjs/design/locale/en-US"; +import UIEnUS from "@univerjs/ui/locale/en-US"; +import DocsUIEnUS from "@univerjs/docs-ui/locale/en-US"; +import SheetsEnUS from "@univerjs/sheets/locale/en-US"; +import SheetsUIEnUS from "@univerjs/sheets-ui/locale/en-US"; +import SheetsFormulaUIEnUS from "@univerjs/sheets-formula-ui/locale/en-US"; +import SheetsNumfmtUIEnUS from "@univerjs/sheets-numfmt-ui/locale/en-US"; + +// CSS 스타일 import +import "@univerjs/design/lib/index.css"; +import "@univerjs/ui/lib/index.css"; +import "@univerjs/docs-ui/lib/index.css"; +import "@univerjs/sheets-ui/lib/index.css"; +import "@univerjs/sheets-formula-ui/lib/index.css"; +import "@univerjs/sheets-numfmt-ui/lib/index.css"; + +/** + * Univer CE 최소 구현 - 공식 문서 기반 + * 파일 업로드 없이 기본 스프레드시트만 표시 + */ +const TestSheetViewer: React.FC = () => { + const containerRef = useRef(null); + const univerRef = useRef(null); + const initializingRef = useRef(false); + const [isInitialized, setIsInitialized] = useState(false); + + // Univer 초기화 - 공식 문서 패턴 따라서 + useEffect(() => { + if ( + !containerRef.current || + isInitialized || + univerRef.current || + initializingRef.current + ) + return; + + const initializeUniver = async () => { + try { + initializingRef.current = true; + console.log("🚀 Univer CE 초기화 시작"); + + // 1. Univer 인스턴스 생성 + const univer = new Univer({ + theme: defaultTheme, + locale: LocaleType.EN_US, + locales: { + [LocaleType.EN_US]: { + ...DesignEnUS, + ...UIEnUS, + ...DocsUIEnUS, + ...SheetsEnUS, + ...SheetsUIEnUS, + ...SheetsFormulaUIEnUS, + ...SheetsNumfmtUIEnUS, + }, + }, + }); + + // 2. 필수 플러그인 등록 (공식 문서 순서) + univer.registerPlugin(UniverRenderEnginePlugin); + univer.registerPlugin(UniverFormulaEnginePlugin); + + univer.registerPlugin(UniverUIPlugin, { + container: containerRef.current!, + }); + + univer.registerPlugin(UniverDocsPlugin); + univer.registerPlugin(UniverDocsUIPlugin); + + univer.registerPlugin(UniverSheetsPlugin); + univer.registerPlugin(UniverSheetsUIPlugin); + univer.registerPlugin(UniverSheetsFormulaPlugin); + univer.registerPlugin(UniverSheetsFormulaUIPlugin); + univer.registerPlugin(UniverSheetsNumfmtPlugin); + univer.registerPlugin(UniverSheetsNumfmtUIPlugin); + + // 3. 기본 워크북 생성 + univer.createUnit(UniverInstanceType.UNIVER_SHEET, { + id: "test-workbook", + name: "Test Workbook", + sheetOrder: ["sheet1"], + sheets: { + sheet1: { + id: "sheet1", + name: "Sheet1", + cellData: { + 0: { + 0: { v: "Hello Univer CE!" }, + 1: { v: "환영합니다!" }, + }, + 1: { + 0: { v: "Status" }, + 1: { v: "Ready" }, + }, + }, + rowCount: 100, + columnCount: 26, + }, + }, + }); + + univerRef.current = univer; + setIsInitialized(true); + + console.log("✅ Univer CE 초기화 완료"); + } catch (error) { + console.error("❌ Univer CE 초기화 실패:", error); + initializingRef.current = false; + } + }; + + initializeUniver(); + }, [isInitialized]); + + // 컴포넌트 언마운트 시 정리 + useEffect(() => { + return () => { + try { + if (univerRef.current) { + univerRef.current.dispose(); + univerRef.current = null; + } + initializingRef.current = false; + } catch (error) { + console.error("❌ Univer dispose 오류:", error); + } + }; + }, []); + + return ( +
+ {/* 간단한 헤더 */} +
+

🧪 Univer CE 최소 테스트

+
+ + {isInitialized ? "✅ 초기화 완료" : "⏳ 초기화 중..."} + +
+
+ + {/* Univer 컨테이너 */} +
+
+ ); +}; + +export default TestSheetViewer; diff --git a/src/components/sheet/__tests__/FileUpload.test.tsx b/src/components/sheet/__tests__/FileUpload.test.tsx index 42d08c3..9f9d573 100644 --- a/src/components/sheet/__tests__/FileUpload.test.tsx +++ b/src/components/sheet/__tests__/FileUpload.test.tsx @@ -1,4 +1,4 @@ -import React from "react"; +// import React from "react"; import { render, screen, fireEvent, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import "@testing-library/jest-dom"; @@ -29,7 +29,7 @@ class MockDragEvent extends Event { // @ts-ignore global.DragEvent = MockDragEvent; -const mockUseAppStore = useAppStore as vi.MockedFunction; +const mockUseAppStore = useAppStore as any; describe("FileUpload", () => { const mockSetLoading = vi.fn(); diff --git a/src/components/sheet/__tests__/SheetViewer.test.tsx b/src/components/sheet/__tests__/SheetViewer.test.tsx index e58719c..adf926d 100644 --- a/src/components/sheet/__tests__/SheetViewer.test.tsx +++ b/src/components/sheet/__tests__/SheetViewer.test.tsx @@ -1,4 +1,4 @@ -import React from "react"; +// import React from "react"; import { render, screen, waitFor } from "@testing-library/react"; import "@testing-library/jest-dom"; import { vi } from "vitest"; diff --git a/src/index.css b/src/index.css index f27bd7f..b585006 100644 --- a/src/index.css +++ b/src/index.css @@ -1,3 +1,12 @@ +/* Univer CE 공식 스타일 - @import는 맨 위에 */ +@import '@univerjs/design/lib/index.css'; +@import '@univerjs/ui/lib/index.css'; +@import '@univerjs/docs-ui/lib/index.css'; +@import '@univerjs/sheets-ui/lib/index.css'; +@import '@univerjs/sheets-formula-ui/lib/index.css'; +@import '@univerjs/sheets-numfmt-ui/lib/index.css'; + +/* Tailwind CSS */ @tailwind base; @tailwind components; @tailwind utilities; @@ -105,25 +114,29 @@ .lg\:px-8 { padding-left: 2rem; padding-right: 2rem; } } -/* 커스텀 스타일 */ -body { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - color-scheme: light; - color: #1f2937; /* 검은색 계열로 변경 */ - background-color: #ffffff; - - font-synthesis: none; - text-rendering: optimizeLegibility; +/* 전역 스타일 */ +html, body, #root { + height: 100%; + margin: 0; + padding: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } -/* 스크롤바 스타일링 */ +/* Univer 컨테이너 스타일 */ +.univer-container { + width: 100%; + height: 100%; + position: relative; +} + +/* 커스텀 스크롤바 (Univer와 일치) */ ::-webkit-scrollbar { - width: 6px; - height: 6px; + width: 8px; + height: 8px; } ::-webkit-scrollbar-track { @@ -132,20 +145,132 @@ body { ::-webkit-scrollbar-thumb { background: #c1c1c1; - border-radius: 3px; + border-radius: 4px; } ::-webkit-scrollbar-thumb:hover { - background: #a1a1a1; + background: #a8a8a8; +} + +/* 파일 업로드 영역 스타일 */ +.file-upload-area { + border: 2px dashed #e2e8f0; + border-radius: 8px; + padding: 20px; + text-align: center; + transition: all 0.3s ease; +} + +.file-upload-area:hover { + border-color: #3b82f6; + background-color: #f8fafc; +} + +.file-upload-area.dragover { + border-color: #3b82f6; + background-color: #dbeafe; } /* 로딩 애니메이션 */ +.loading-spinner { + border: 2px solid #f3f3f3; + border-top: 2px solid #3b82f6; + border-radius: 50%; + width: 20px; + height: 20px; + animation: spin 1s linear infinite; +} + @keyframes spin { - to { - transform: rotate(360deg); + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +/* 상태 표시 점 애니메이션 */ +.status-dot { + width: 8px; + height: 8px; + border-radius: 50%; + display: inline-block; +} + +.status-dot.pulse { + animation: pulse 2s infinite; +} + +@keyframes pulse { + 0% { + transform: scale(1); + opacity: 1; + } + 50% { + transform: scale(1.2); + opacity: 0.7; + } + 100% { + transform: scale(1); + opacity: 1; } } -.animate-spin { - animation: spin 1s linear infinite; +/* 에러 메시지 스타일 */ +.error-message { + background-color: #fef2f2; + border: 1px solid #fecaca; + color: #dc2626; + padding: 12px; + border-radius: 6px; + font-size: 14px; + line-height: 1.4; +} + +/* 성공 메시지 스타일 */ +.success-message { + background-color: #f0fdf4; + border: 1px solid #bbf7d0; + color: #16a34a; + padding: 12px; + border-radius: 6px; + font-size: 14px; + line-height: 1.4; +} + +/* 정보 메시지 스타일 */ +.info-message { + background-color: #eff6ff; + border: 1px solid #bfdbfe; + color: #2563eb; + padding: 12px; + border-radius: 6px; + font-size: 14px; + line-height: 1.4; +} + +/* 반응형 디자인 */ +@media (max-width: 768px) { + .file-upload-area { + padding: 15px; + } + + .univer-container { + min-height: 400px; + } +} + +/* 다크 모드 지원 */ +@media (prefers-color-scheme: dark) { + .file-upload-area { + border-color: #374151; + background-color: #1f2937; + } + + .file-upload-area:hover { + border-color: #60a5fa; + background-color: #111827; + } + + .file-upload-area.dragover { + border-color: #60a5fa; + background-color: #1e3a8a; + } } diff --git a/src/main.tsx b/src/main.tsx index bef5202..c983b84 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,10 +1,5 @@ -import { StrictMode } from 'react' -import { createRoot } from 'react-dom/client' -import './index.css' -import App from './App.tsx' +import { createRoot } from "react-dom/client"; +import "./index.css"; +import App from "./App.tsx"; -createRoot(document.getElementById('root')!).render( - - - , -) +createRoot(document.getElementById("root")!).render(); diff --git a/src/utils/__tests__/fileProcessor.test.ts b/src/utils/__tests__/fileProcessor.test.ts index 1736a3a..80065b8 100644 --- a/src/utils/__tests__/fileProcessor.test.ts +++ b/src/utils/__tests__/fileProcessor.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect, vi, beforeEach } from "vitest"; -import * as XLSX from "xlsx"; +import * as XLSX from "xlsx-js-style"; import { validateFileType, validateFileSize, @@ -11,8 +11,8 @@ import { SUPPORTED_EXTENSIONS, } from "../fileProcessor"; -// SheetJS 모킹 (통합 처리) -vi.mock("xlsx", () => ({ +// xlsx-js-style 모킹 (통합 처리) +vi.mock("xlsx-js-style", () => ({ read: vi.fn(() => ({ SheetNames: ["Sheet1"], Sheets: { @@ -30,61 +30,80 @@ vi.mock("xlsx", () => ({ ["테스트", "한글", "데이터"], ["값1", "값2", "값3"], ]), + decode_range: vi.fn((_ref) => ({ + s: { r: 0, c: 0 }, + e: { r: 1, c: 2 }, + })), + encode_cell: vi.fn( + (cell) => `${String.fromCharCode(65 + cell.c)}${cell.r + 1}`, + ), + aoa_to_sheet: vi.fn(() => ({ + A1: { v: "테스트" }, + B1: { v: "한글" }, + C1: { v: "데이터" }, + "!ref": "A1:C1", + })), + book_new: vi.fn(() => ({ SheetNames: [], Sheets: {} })), + book_append_sheet: vi.fn(), }, })); // LuckyExcel 모킹 vi.mock("luckyexcel", () => ({ - transformExcelToLucky: vi.fn((arrayBuffer, fileName, callback) => { - // 성공적인 변환 결과 모킹 - const mockResult = { - sheets: [ - { - name: "Sheet1", - index: "0", - status: 1, - order: 0, - row: 2, - column: 3, - celldata: [ - { - r: 0, - c: 0, - v: { v: "테스트", m: "테스트", ct: { fa: "General", t: "g" } }, - }, - { - r: 0, - c: 1, - v: { v: "한글", m: "한글", ct: { fa: "General", t: "g" } }, - }, - { - r: 0, - c: 2, - v: { v: "데이터", m: "데이터", ct: { fa: "General", t: "g" } }, - }, - { - r: 1, - c: 0, - v: { v: "값1", m: "값1", ct: { fa: "General", t: "g" } }, - }, - { - r: 1, - c: 1, - v: { v: "값2", m: "값2", ct: { fa: "General", t: "g" } }, - }, - { - r: 1, - c: 2, - v: { v: "값3", m: "값3", ct: { fa: "General", t: "g" } }, - }, - ], - }, - ], - }; + transformExcelToLucky: vi.fn( + (_arrayBuffer, successCallback, _errorCallback) => { + // 성공적인 변환 결과 모킹 + const mockResult = { + sheets: [ + { + name: "Sheet1", + index: "0", + status: 1, + order: 0, + row: 2, + column: 3, + celldata: [ + { + r: 0, + c: 0, + v: { v: "테스트", m: "테스트", ct: { fa: "General", t: "g" } }, + }, + { + r: 0, + c: 1, + v: { v: "한글", m: "한글", ct: { fa: "General", t: "g" } }, + }, + { + r: 0, + c: 2, + v: { v: "데이터", m: "데이터", ct: { fa: "General", t: "g" } }, + }, + { + r: 1, + c: 0, + v: { v: "값1", m: "값1", ct: { fa: "General", t: "g" } }, + }, + { + r: 1, + c: 1, + v: { v: "값2", m: "값2", ct: { fa: "General", t: "g" } }, + }, + { + r: 1, + c: 2, + v: { v: "값3", m: "값3", ct: { fa: "General", t: "g" } }, + }, + ], + }, + ], + }; - // 비동기 콜백 호출 - setTimeout(() => callback(mockResult, null), 0); - }), + // 성공 콜백 비동기 호출 (ArrayBuffer 매개변수 대응) + if (typeof successCallback === "function") { + setTimeout(() => successCallback(mockResult, null), 0); + } + }, + ), })); // 파일 생성 도우미 함수 diff --git a/src/utils/fileProcessor.ts b/src/utils/fileProcessor.ts.bak similarity index 58% rename from src/utils/fileProcessor.ts rename to src/utils/fileProcessor.ts.bak index 4b5a060..877680b 100644 --- a/src/utils/fileProcessor.ts +++ b/src/utils/fileProcessor.ts.bak @@ -1,12 +1,12 @@ -import * as XLSX from "xlsx"; -import * as LuckyExcel from "luckyexcel"; +import * as XLSX from "xlsx-js-style"; import type { SheetData, FileUploadResult } from "../types/sheet"; +import { analyzeSheetStyles } from "./styleTest"; /** - * 파일 처리 관련 유틸리티 - 개선된 버전 + * 파일 처리 관련 유틸리티 - xlsx-js-style 공식 API 활용 버전 * - 모든 파일 형식을 SheetJS를 통해 읽은 후 XLSX로 변환 * - 변환된 XLSX 파일을 LuckyExcel로 전달 - * - 안정적인 한글 지원 및 에러 처리 + * - xlsx-js-style의 공식 스타일 구조를 그대로 활용 */ // 지원되는 파일 타입 @@ -21,6 +21,294 @@ export const SUPPORTED_EXTENSIONS = [".xlsx", ".xls", ".csv"] as const; // 최대 파일 크기 (50MB) export const MAX_FILE_SIZE = 50 * 1024 * 1024; +/** + * xlsx-js-style 색상 객체를 Luckysheet 색상 문자열로 변환 + * 공식 xlsx-js-style COLOR_STYLE 형식을 지원: rgb, theme, indexed + */ +function convertXlsxColorToLuckysheet(colorObj: any): string { + if (!colorObj) return ""; + + // RGB 형태 - 공식 문서: {rgb: "FFCC00"} + if (colorObj.rgb) { + const rgb = colorObj.rgb.toUpperCase(); + // ARGB 형태 (8자리) - 앞의 2자리(Alpha) 제거 + if (rgb.length === 8) { + const r = parseInt(rgb.substring(2, 4), 16); + const g = parseInt(rgb.substring(4, 6), 16); + const b = parseInt(rgb.substring(6, 8), 16); + return `rgb(${r},${g},${b})`; + } + // RGB 형태 (6자리) + else if (rgb.length === 6) { + const r = parseInt(rgb.substring(0, 2), 16); + const g = parseInt(rgb.substring(2, 4), 16); + const b = parseInt(rgb.substring(4, 6), 16); + return `rgb(${r},${g},${b})`; + } + } + + // Theme 색상 - 공식 문서: {theme: 4} 또는 {theme: 1, tint: 0.4} + if (typeof colorObj.theme === "number") { + // Excel 테마 색상 매핑 (공식 문서 예시 기반) + const themeColors: { [key: number]: string } = { + 0: "rgb(255,255,255)", // 배경 1 (흰색) + 1: "rgb(0,0,0)", // 텍스트 1 (검정) + 2: "rgb(238,236,225)", // 배경 2 (연회색) + 3: "rgb(31,73,125)", // 텍스트 2 (어두운 파랑) + 4: "rgb(79,129,189)", // 강조 1 (파랑) - 공식 문서 예시 + 5: "rgb(192,80,77)", // 강조 2 (빨강) + 6: "rgb(155,187,89)", // 강조 3 (초록) + 7: "rgb(128,100,162)", // 강조 4 (보라) + 8: "rgb(75,172,198)", // 강조 5 (하늘색) + 9: "rgb(247,150,70)", // 강조 6 (주황) + }; + + let baseColor = themeColors[colorObj.theme] || "rgb(0,0,0)"; + + // Tint 적용 - 공식 문서: {theme: 1, tint: 0.4} ("Blue, Accent 1, Lighter 40%") + if (typeof colorObj.tint === "number") { + baseColor = applyTintToRgbColor(baseColor, colorObj.tint); + } + + return baseColor; + } + + // Indexed 색상 (Excel 기본 색상표) + if (typeof colorObj.indexed === "number") { + const indexedColors: { [key: number]: string } = { + 0: "rgb(0,0,0)", // 검정 + 1: "rgb(255,255,255)", // 흰색 + 2: "rgb(255,0,0)", // 빨강 + 3: "rgb(0,255,0)", // 초록 + 4: "rgb(0,0,255)", // 파랑 + 5: "rgb(255,255,0)", // 노랑 + 6: "rgb(255,0,255)", // 마젠타 + 7: "rgb(0,255,255)", // 시안 + 8: "rgb(128,0,0)", // 어두운 빨강 + 9: "rgb(0,128,0)", // 어두운 초록 + 10: "rgb(0,0,128)", // 어두운 파랑 + 17: "rgb(128,128,128)", // 회색 + }; + + return indexedColors[colorObj.indexed] || "rgb(0,0,0)"; + } + + return ""; +} + +/** + * RGB 색상에 Excel tint 적용 + */ +function applyTintToRgbColor(rgbColor: string, tint: number): string { + const match = rgbColor.match(/rgb\((\d+),(\d+),(\d+)\)/); + if (!match) return rgbColor; + + const r = parseInt(match[1]); + const g = parseInt(match[2]); + const b = parseInt(match[3]); + + // Excel tint 공식 적용 + const applyTint = (color: number, tint: number): number => { + if (tint < 0) { + return Math.round(color * (1 + tint)); + } else { + return Math.round(color * (1 - tint) + (255 - 255 * (1 - tint))); + } + }; + + const newR = Math.max(0, Math.min(255, applyTint(r, tint))); + const newG = Math.max(0, Math.min(255, applyTint(g, tint))); + const newB = Math.max(0, Math.min(255, applyTint(b, tint))); + + return `rgb(${newR},${newG},${newB})`; +} + +/** + * xlsx-js-style 테두리 스타일을 Luckysheet 번호로 변환 + * 공식 문서의 BORDER_STYLE 값들을 지원 + */ +function convertBorderStyleToLuckysheet(borderStyle: string): number { + const styleMap: { [key: string]: number } = { + thin: 1, + medium: 2, + thick: 3, + dotted: 4, + dashed: 5, + dashDot: 6, + dashDotDot: 7, + double: 8, + hair: 1, + mediumDashed: 5, + mediumDashDot: 6, + mediumDashDotDot: 7, + slantDashDot: 6, + }; + + return styleMap[borderStyle] || 1; +} + +/** + * xlsx-js-style 스타일 객체를 Luckysheet 스타일로 변환 + * 공식 xlsx-js-style API 구조를 완전히 활용 + */ +function convertXlsxStyleToLuckysheet(xlsxStyle: any): any { + if (!xlsxStyle) return {}; + + const luckyStyle: any = {}; + + // 🎨 폰트 스타일 변환 - 공식 문서 font 속성 + if (xlsxStyle.font) { + const font = xlsxStyle.font; + + // 폰트명 - 공식 문서: {name: "Courier"} + if (font.name) { + luckyStyle.ff = font.name; + } + + // 폰트 크기 - 공식 문서: {sz: 24} + if (font.sz) { + luckyStyle.fs = font.sz; + } + + // 굵게 - 공식 문서: {bold: true} + if (font.bold) { + luckyStyle.bl = 1; + } + + // 기울임 - 공식 문서: {italic: true} + if (font.italic) { + luckyStyle.it = 1; + } + + // 밑줄 - 공식 문서: {underline: true} + if (font.underline) { + luckyStyle.un = 1; + } + + // 취소선 - 공식 문서: {strike: true} + if (font.strike) { + luckyStyle.st = 1; + } + + // 폰트 색상 - 공식 문서: {color: {rgb: "FF0000"}} + if (font.color) { + const fontColor = convertXlsxColorToLuckysheet(font.color); + if (fontColor) { + luckyStyle.fc = fontColor; + } + } + } + + // 🎨 배경 스타일 변환 - 공식 문서 fill 속성 + if (xlsxStyle.fill) { + const fill = xlsxStyle.fill; + + // 배경색 - 공식 문서: {fgColor: {rgb: "E9E9E9"}} + if (fill.fgColor) { + const bgColor = convertXlsxColorToLuckysheet(fill.fgColor); + if (bgColor) { + luckyStyle.bg = bgColor; + } + } + // bgColor도 확인 (패턴 배경의 경우) + else if (fill.bgColor) { + const bgColor = convertXlsxColorToLuckysheet(fill.bgColor); + if (bgColor) { + luckyStyle.bg = bgColor; + } + } + } + + // 🎨 정렬 스타일 변환 - 공식 문서 alignment 속성 + if (xlsxStyle.alignment) { + const alignment = xlsxStyle.alignment; + + // 수평 정렬 - 공식 문서: {horizontal: "center"} + if (alignment.horizontal) { + luckyStyle.ht = + alignment.horizontal === "left" + ? 1 + : alignment.horizontal === "center" + ? 2 + : alignment.horizontal === "right" + ? 3 + : 1; + } + + // 수직 정렬 - 공식 문서: {vertical: "center"} + if (alignment.vertical) { + luckyStyle.vt = + alignment.vertical === "top" + ? 1 + : alignment.vertical === "center" + ? 2 + : alignment.vertical === "bottom" + ? 3 + : 2; + } + + // 텍스트 줄바꿈 - 공식 문서: {wrapText: true} + if (alignment.wrapText) { + luckyStyle.tb = 1; + } + + // 텍스트 회전 - 공식 문서: {textRotation: 90} + if (alignment.textRotation) { + luckyStyle.tr = alignment.textRotation; + } + } + + // 🎨 테두리 스타일 변환 - 공식 문서 border 속성 + if (xlsxStyle.border) { + const border = xlsxStyle.border; + luckyStyle.bd = {}; + + // 상단 테두리 - 공식 문서: {top: {style: "thin", color: {rgb: "000000"}}} + if (border.top) { + luckyStyle.bd.t = { + style: convertBorderStyleToLuckysheet(border.top.style || "thin"), + color: convertXlsxColorToLuckysheet(border.top.color) || "rgb(0,0,0)", + }; + } + + // 하단 테두리 + if (border.bottom) { + luckyStyle.bd.b = { + style: convertBorderStyleToLuckysheet(border.bottom.style || "thin"), + color: + convertXlsxColorToLuckysheet(border.bottom.color) || "rgb(0,0,0)", + }; + } + + // 좌측 테두리 + if (border.left) { + luckyStyle.bd.l = { + style: convertBorderStyleToLuckysheet(border.left.style || "thin"), + color: convertXlsxColorToLuckysheet(border.left.color) || "rgb(0,0,0)", + }; + } + + // 우측 테두리 + if (border.right) { + luckyStyle.bd.r = { + style: convertBorderStyleToLuckysheet(border.right.style || "thin"), + color: convertXlsxColorToLuckysheet(border.right.color) || "rgb(0,0,0)", + }; + } + } + + // 🎨 숫자 포맷 변환 - 공식 문서 numFmt 속성 + if (xlsxStyle.numFmt) { + // numFmt는 문자열 또는 숫자일 수 있음 + luckyStyle.ct = { + fa: xlsxStyle.numFmt, + t: "n", // 숫자 타입 + }; + } + + return luckyStyle; +} + /** * 파일 타입 검증 */ @@ -99,7 +387,7 @@ function sanitizeSheetName(sheetName: string): string { sanitized = sanitized.replace(/[\\\/\*\?\[\]]/g, "_"); - return sanitized || "Sheet1"; + return sanitized || "Sheet"; } /** @@ -176,9 +464,9 @@ function convertSheetJSToLuckyExcel(workbook: any): SheetData[] { ], options: { showtoolbar: true, - showinfobar: false, + showinfobar: true, showsheetbar: true, - showstatisticBar: false, + showstatisticBar: true, allowCopy: true, allowEdit: true, enableAddRow: true, @@ -218,9 +506,9 @@ function convertSheetJSToLuckyExcel(workbook: any): SheetData[] { ], options: { showtoolbar: true, - showinfobar: false, + showinfobar: true, showsheetbar: true, - showstatisticBar: false, + showstatisticBar: true, allowCopy: true, allowEdit: true, enableAddRow: true, @@ -276,22 +564,45 @@ function convertSheetJSToLuckyExcel(workbook: any): SheetData[] { c: col, v: { v: cellValue, - m: String(cellValue), + m: cell.w || String(cellValue), // 포맷팅된 텍스트 우선 사용 ct: { fa: "General", t: "g" }, }, }; + // 🎨 xlsx-js-style 스타일 정보 처리 + if (cell.s) { + console.log( + `🎨 셀 ${cellAddress}에 스타일 정보 발견:`, + JSON.stringify(cell.s, null, 2), + ); + const convertedStyle = convertXlsxStyleToLuckysheet(cell.s); + console.log( + `🎨 변환된 Luckysheet 스타일:`, + JSON.stringify(convertedStyle, null, 2), + ); + luckyCell.v.s = convertedStyle; + } + // 셀 타입에 따른 추가 처리 if (cell.t === "s") { luckyCell.v.ct.t = "s"; } else if (cell.t === "n") { luckyCell.v.ct.t = "n"; + // 숫자 포맷 처리 + if (cell.z) { + luckyCell.v.ct.fa = cell.z; + } } else if (cell.t === "d") { luckyCell.v.ct.t = "d"; + // 날짜 포맷 처리 + if (cell.z) { + luckyCell.v.ct.fa = cell.z; + } } else if (cell.t === "b") { luckyCell.v.ct.t = "b"; } + // 수식 처리 if (cell.f) { luckyCell.v.f = cell.f; } @@ -301,6 +612,48 @@ function convertSheetJSToLuckyExcel(workbook: any): SheetData[] { } } + // 🔗 병합 셀 정보 처리 + const mergeData: any[] = []; + if (worksheet["!merges"]) { + worksheet["!merges"].forEach((merge: any) => { + mergeData.push({ + r: merge.s.r, // 시작 행 + c: merge.s.c, // 시작 열 + rs: merge.e.r - merge.s.r + 1, // 행 병합 수 + cs: merge.e.c - merge.s.c + 1, // 열 병합 수 + }); + }); + console.log( + `🔗 시트 "${sheetName}"에서 ${mergeData.length}개 병합 셀 발견`, + ); + } + + // 📏 열 너비 정보 처리 + const colhidden: { [key: number]: number } = {}; + if (worksheet["!cols"]) { + worksheet["!cols"].forEach((col: any, colIndex: number) => { + if (col && col.hidden) { + colhidden[colIndex] = 0; // 숨겨진 열 + } else if (col && col.wpx) { + // 픽셀 단위 너비가 있으면 기록 (Luckysheet에서 활용 가능) + console.log(`📏 열 ${colIndex}: ${col.wpx}px`); + } + }); + } + + // 📐 행 높이 정보 처리 + const rowhidden: { [key: number]: number } = {}; + if (worksheet["!rows"]) { + worksheet["!rows"].forEach((row: any, rowIndex: number) => { + if (row && row.hidden) { + rowhidden[rowIndex] = 0; // 숨겨진 행 + } else if (row && row.hpx) { + // 픽셀 단위 높이가 있으면 기록 + console.log(`📐 행 ${rowIndex}: ${row.hpx}px`); + } + }); + } + // SheetData 객체 생성 const sheetData: SheetData = { id: `sheet_${index}`, @@ -319,13 +672,17 @@ function convertSheetJSToLuckyExcel(workbook: any): SheetData[] { order: index, row: maxRow, column: maxCol, + // 🎨 xlsx-js-style로부터 추가된 스타일 정보들 + ...(mergeData.length > 0 && { merge: mergeData }), // 병합 셀 + ...(Object.keys(colhidden).length > 0 && { colhidden }), // 숨겨진 열 + ...(Object.keys(rowhidden).length > 0 && { rowhidden }), // 숨겨진 행 }, ], options: { showtoolbar: true, - showinfobar: false, + showinfobar: true, showsheetbar: true, - showstatisticBar: false, + showstatisticBar: true, allowCopy: true, allowEdit: true, enableAddRow: true, @@ -361,9 +718,9 @@ function convertSheetJSToLuckyExcel(workbook: any): SheetData[] { ], options: { showtoolbar: true, - showinfobar: false, + showinfobar: true, showsheetbar: true, - showstatisticBar: false, + showstatisticBar: true, allowCopy: true, allowEdit: true, enableAddRow: true, @@ -428,7 +785,7 @@ async function processFileWithSheetJSToXLSX( const fileName = file.name.toLowerCase(); const isCSV = fileName.endsWith(".csv"); const isXLS = fileName.endsWith(".xls"); - const isXLSX = fileName.endsWith(".xlsx"); + // const isXLSX = fileName.endsWith(".xlsx"); // 1단계: SheetJS로 파일 읽기 let workbook: any; @@ -444,11 +801,14 @@ async function processFileWithSheetJSToXLSX( raw: false, }); } else { - // XLS/XLSX 파일 처리 - 관대한 옵션으로 읽기 + // XLS/XLSX 파일 처리 - 스타일 정보 강제 추출 옵션 console.log(`📊 ${isXLS ? "XLS" : "XLSX"} 파일을 SheetJS로 읽는 중...`); - workbook = XLSX.read(arrayBuffer); - - // Sheets가 없고 SheetNames만 있는 경우 재시도 + workbook = XLSX.read(arrayBuffer, { + cellStyles: true, // 스타일 정보 보존 + cellNF: true, // 숫자 형식 보존 (스타일의 일부) + bookProps: true, // 문서 속성 보존 (스타일 정보 포함 가능) + WTF: true, // 더 관대한 파싱 + }); } } catch (readError) { console.error("❌ SheetJS 파일 읽기 실패:", readError); @@ -467,14 +827,14 @@ async function processFileWithSheetJSToXLSX( throw new Error("워크북을 생성할 수 없습니다."); } - // workbook.Sheets 존재 및 타입 검증 - if (!workbook.Sheets || typeof workbook.Sheets !== "object") { - throw new Error("유효한 시트가 없습니다."); + // 기본 검증만 수행 + if (!workbook.SheetNames || workbook.SheetNames.length === 0) { + throw new Error("시트 이름 정보가 없습니다."); } - // workbook.SheetNames 배열 검증 - if (!Array.isArray(workbook.SheetNames) || workbook.SheetNames.length === 0) { - throw new Error("시트 이름 정보가 없습니다."); + // Sheets 객체가 없으면 빈 객체로 초기화 + if (!workbook.Sheets) { + workbook.Sheets = {}; } console.log("✅ SheetJS 워크북 읽기 성공:", { @@ -482,6 +842,11 @@ async function processFileWithSheetJSToXLSX( sheetCount: workbook.SheetNames.length, }); + // 🎨 스타일 정보 상세 분석 (개발 모드에서만) + if (import.meta.env.DEV) { + analyzeSheetStyles(workbook); + } + // 2단계: 워크북을 XLSX ArrayBuffer로 변환 let xlsxArrayBuffer: ArrayBuffer; try { @@ -489,83 +854,10 @@ async function processFileWithSheetJSToXLSX( const xlsxData = XLSX.write(workbook, { type: "array", bookType: "xlsx", - compression: true, - - // 🎨 스타일 정보 완전 보존 - cellStyles: true, // 셀 스타일, 색상, 폰트, 테두리 등 - cellDates: true, // 날짜 포맷 정보 - bookSST: true, // 문자열 테이블 (호환성) - - // 📊 워크북 정보 보존 - Props: workbook.Props || {}, - - // 🎭 테마 정보 보존 (존재하는 경우) - ...(workbook.themeXLSX && { themeXLSX: workbook.themeXLSX }), + cellStyles: true, // 스타일 정보 보존 }); - // 📋 XLSX.write 완료 후 workbook 상세 정보 로깅 - console.log("📋 ================================="); - console.log("📋 XLSX.write 완료 후 Workbook 분석:"); - console.log("📋 ================================="); - console.log("📋 Workbook 타입:", typeof workbook); - console.log("📋 Workbook 생성자:", workbook.constructor.name); - console.log("📋 시트 이름들:", workbook.SheetNames); - console.log("📋 시트 개수:", workbook.SheetNames?.length || 0); - - // Props 정보 - console.log("📋 Props 존재:", !!workbook.Props); - if (workbook.Props) { - console.log("📋 Props 내용:", workbook.Props); - } - - // 테마 정보 - console.log("📋 themeXLSX 존재:", !!workbook.themeXLSX); - - // 각 시트별 상세 정보 - if (workbook.Sheets && workbook.SheetNames) { - workbook.SheetNames.forEach((sheetName: string, index: number) => { - const sheet = workbook.Sheets[sheetName]; - console.log(`📋 시트 ${index + 1} "${sheetName}" 분석:`); - console.log(`📋 - 시트 객체 존재:`, !!sheet); - - if (sheet) { - console.log(`📋 - 데이터 범위 (!ref):`, sheet["!ref"]); - console.log( - `📋 - 병합 셀 (!merges):`, - sheet["!merges"]?.length || 0, - "개", - ); - console.log( - `📋 - 열 설정 (!cols):`, - sheet["!cols"]?.length || 0, - "개", - ); - console.log( - `📋 - 행 설정 (!rows):`, - sheet["!rows"]?.length || 0, - "개", - ); - - // 셀 샘플 확인 (첫 몇 개 셀) - const cellKeys = Object.keys(sheet) - .filter((key) => !key.startsWith("!")) - .slice(0, 5); - console.log(`📋 - 셀 샘플 (첫 5개):`, cellKeys); - - cellKeys.forEach((cellAddr) => { - const cell = sheet[cellAddr]; - console.log(`📋 ${cellAddr}:`, { - 값: cell.v, - 타입: cell.t, - 스타일: !!cell.s, - 수식: cell.f || "없음", - 포맷된텍스트: cell.w || "없음", - }); - }); - } - }); - } - console.log("📋 ================================="); + console.log(`✅ XLSX 변환 완료: ${xlsxData.length} bytes`); // xlsxData는 Uint8Array이므로 ArrayBuffer로 변환 if (xlsxData instanceof Uint8Array) { @@ -585,30 +877,6 @@ async function processFileWithSheetJSToXLSX( } console.log(`✅ XLSX 변환 완료: ${xlsxArrayBuffer.byteLength} bytes`); - - // ⏱️ ArrayBuffer 변환 완료 확인 및 검증 - console.log("⏱️ ArrayBuffer 변환 검증 중..."); - - // ArrayBuffer 무결성 검증 - if (!xlsxArrayBuffer || xlsxArrayBuffer.byteLength === 0) { - throw new Error("ArrayBuffer 변환 실패: 빈 버퍼"); - } - - // XLSX 파일 시그니처 사전 검증 - const uint8Check = new Uint8Array(xlsxArrayBuffer); - const signatureCheck = Array.from(uint8Check.slice(0, 4)) - .map((byte) => byte.toString(16).padStart(2, "0")) - .join(" "); - - if (signatureCheck !== "50 4b 03 04") { - console.warn( - `⚠️ 잘못된 XLSX 시그니처: ${signatureCheck} (예상: 50 4b 03 04)`, - ); - } - - console.log( - `✅ ArrayBuffer 검증 완료: ${xlsxArrayBuffer.byteLength} bytes, 시그니처: ${signatureCheck}`, - ); } catch (writeError) { console.error("❌ XLSX 변환 실패:", writeError); throw new Error( @@ -629,53 +897,8 @@ async function processFileWithSheetJSToXLSX( } // 원본 파일명에서 확장자를 .xlsx로 변경 - const xlsxFileName = file.name.replace(/\.(csv|xls|xlsx)$/i, ".xlsx"); - - // 🔍 LuckyExcel로 전달되는 파일 정보 출력 - console.log("📋 ================================="); - console.log("📋 LuckyExcel로 전달되는 파일 정보:"); - console.log("📋 ================================="); - console.log("📋 타이밍:", new Date().toISOString()); - console.log("📋 원본 파일명:", file.name); - console.log("📋 변환된 파일명:", xlsxFileName); - console.log("📋 ArrayBuffer 크기:", xlsxArrayBuffer.byteLength, "bytes"); - console.log("📋 ArrayBuffer 타입:", xlsxArrayBuffer.constructor.name); - - // ArrayBuffer의 처음 100바이트를 16진수로 출력 (헥스 덤프) - const uint8View = new Uint8Array(xlsxArrayBuffer); - const firstBytes = Array.from( - uint8View.slice(0, Math.min(100, uint8View.length)), - ) - .map((byte) => byte.toString(16).padStart(2, "0")) - .join(" "); - console.log("📋 ArrayBuffer 처음 100바이트 (hex):", firstBytes); - - // XLSX 파일 시그니처 확인 (PK\x03\x04 또는 50 4B 03 04) - const signature = Array.from(uint8View.slice(0, 4)) - .map((byte) => byte.toString(16).padStart(2, "0")) - .join(" "); - console.log( - "📋 파일 시그니처:", - signature, - signature === "50 4b 03 04" ? "(✅ 유효한 XLSX)" : "(❌ 잘못된 시그니처)", - ); - console.log("📋 ================================="); - - // 🚀 LuckyExcel 호출 직전 최종 검증 - console.log("🚀 LuckyExcel 호출 직전 최종 검증:"); - console.log("🚀 ArrayBuffer 타입:", typeof xlsxArrayBuffer); - console.log("🚀 ArrayBuffer 생성자 확인:", xlsxArrayBuffer.constructor.name); - console.log("🚀 ArrayBuffer 크기:", xlsxArrayBuffer.byteLength); - console.log("🚀 ArrayBuffer.isView:", ArrayBuffer.isView(xlsxArrayBuffer)); - console.log("🚀 fileName:", xlsxFileName, "타입:", typeof xlsxFileName); - - console.log("🚀 LuckyExcel 객체:", typeof LuckyExcel); - console.log( - "🚀 transformExcelToLucky 함수:", - typeof (LuckyExcel as any).transformExcelToLucky, - ); - - console.log("🚀 LuckyExcel 호출 시작..."); + // const xlsxFileName = file.name.replace(/\.(csv|xls|xlsx)$/i, ".xlsx"); + console.log("🍀 LuckyExcel 처리 시작..."); // Promise를 사용한 LuckyExcel 처리 return new Promise<{ sheets: SheetData[]; xlsxBuffer: ArrayBuffer }>( @@ -683,56 +906,16 @@ async function processFileWithSheetJSToXLSX( try { // LuckyExcel API는 (arrayBuffer, successCallback, errorCallback) 형태로 호출 // 공식 문서: LuckyExcel.transformExcelToLucky(file, successCallback, errorCallback) - (LuckyExcel as any).transformExcelToLucky( + (window.LuckyExcel as any).transformExcelToLucky( xlsxArrayBuffer, // 성공 콜백 함수 (두 번째 매개변수) - (exportJson: any, luckysheetfile: any) => { + (exportJson: any, _luckysheetfile: any) => { try { - console.log("🍀 ================================="); - console.log("🍀 LuckyExcel 변환 결과 상세 정보:"); - console.log("🍀 ================================="); - console.log("🍀 원본 파일명:", xlsxFileName); - console.log("🍀 exportJson 존재:", !!exportJson); - console.log("🍀 exportJson 타입:", typeof exportJson); - - if (exportJson) { - console.log("🍀 exportJson 전체 구조:", exportJson); - console.log("🍀 exportJson.sheets 존재:", !!exportJson.sheets); - console.log( - "🍀 exportJson.sheets 타입:", - typeof exportJson.sheets, - ); - console.log( - "🍀 exportJson.sheets 배열 여부:", - Array.isArray(exportJson.sheets), - ); - console.log("🍀 시트 개수:", exportJson?.sheets?.length || 0); - - if (exportJson.sheets && Array.isArray(exportJson.sheets)) { - exportJson.sheets.forEach((sheet: any, index: number) => { - console.log(`🍀 시트 ${index + 1}:`, { - name: sheet.name, - row: sheet.row, - column: sheet.column, - celldata길이: sheet.celldata?.length || 0, - 키목록: Object.keys(sheet), - }); - }); - } - } - - console.log("🍀 luckysheetfile 존재:", !!luckysheetfile); - console.log("🍀 luckysheetfile 타입:", typeof luckysheetfile); - if (luckysheetfile) { - console.log("🍀 luckysheetfile 구조:", luckysheetfile); - } - console.log("🍀 ================================="); - - console.log("🔍 LuckyExcel 변환 결과:", { - hasExportJson: !!exportJson, - hasSheets: !!exportJson?.sheets, - sheetsCount: exportJson?.sheets?.length || 0, - }); + console.log( + "🍀 LuckyExcel 변환 성공:", + exportJson?.sheets?.length || 0, + "개 시트", + ); // 데이터 유효성 검사 if ( @@ -818,7 +1001,7 @@ async function processFileWithSheetJSToXLSX( showtoolbar: true, showinfobar: false, showsheetbar: true, - showstatisticBar: false, + showstatisticBar: true, allowCopy: true, allowEdit: true, enableAddRow: true, @@ -881,10 +1064,92 @@ async function processFileWithSheetJSToXLSX( } /** - * 엑셀 파일을 SheetData 배열로 변환 (개선된 버전) - * - 모든 파일을 SheetJS로 읽은 후 XLSX로 변환 - * - 변환된 XLSX를 LuckyExcel로 처리 - * - 실패 시 SheetJS 직접 변환으로 Fallback + * XLSX 파일을 바로 LuckyExcel로 처리 (공식 예제 순서 준수) + * - 공식 문서 예제를 그대로 따름: LuckyExcel.transformExcelToLucky → luckysheet.create + */ +async function processXLSXWithLuckyExcel( + file: File, +): Promise<{ sheets: SheetData[]; xlsxBuffer: ArrayBuffer }> { + console.log("🍀 XLSX 파일을 LuckyExcel로 직접 처리 시작..."); + console.log(`📊 XLSX 파일: ${file.name}, 크기: ${file.size} bytes`); + + // Promise를 사용한 LuckyExcel 처리 (공식 예제 순서) + return new Promise<{ sheets: SheetData[]; xlsxBuffer: ArrayBuffer }>( + (resolve, reject) => { + // Make sure to get the xlsx file first, and then use the global method window.LuckyExcel to convert + (window.LuckyExcel as any).transformExcelToLucky( + file, + // After obtaining the converted table data, use luckysheet to initialize or update the existing luckysheet workbook + function (exportJson: any, _luckysheetfile: any) { + console.log( + "🍀 LuckyExcel 변환 성공:", + exportJson?.sheets?.length || 0, + "개 시트", + ); + + // ArrayBuffer는 성공 시에만 생성 + file + .arrayBuffer() + .then((arrayBuffer) => { + // exportJson.sheets를 SheetData 형식으로 단순 변환 + const sheets: SheetData[] = exportJson.sheets.map( + (sheet: any, index: number) => ({ + id: `sheet_${index}`, + name: sheet.name || `Sheet${index + 1}`, + data: [[""]], // 실제 데이터는 luckysheet에서 처리 + xlsxBuffer: arrayBuffer, + config: { + container: `luckysheet_${index}`, + title: exportJson.info?.name || file.name, + lang: "ko", + // Note: Luckysheet needs to introduce a dependency package and initialize the table container before it can be used + data: exportJson.sheets, // exportJson.sheets를 그대로 전달 + // 공식 예제에 따른 설정 + ...(exportJson.info?.name && { + title: exportJson.info.name, + }), + ...(exportJson.info?.creator && { + userInfo: exportJson.info.creator, + }), + options: { + showtoolbar: true, + showinfobar: false, + showsheetbar: true, + showstatisticBar: true, + allowCopy: true, + allowEdit: true, + enableAddRow: true, + enableAddCol: true, + }, + }, + }), + ); + + console.log( + "✅ XLSX 파일 LuckyExcel 처리 완료:", + sheets.length, + "개 시트", + ); + resolve({ sheets, xlsxBuffer: arrayBuffer }); + }) + .catch((bufferError) => { + reject(new Error(`ArrayBuffer 생성 실패: ${bufferError}`)); + }); + }, + // Import failed. Is your file a valid xlsx? + function (err: any) { + console.error("❌ LuckyExcel 변환 실패:", err); + reject(new Error(`XLSX 파일 변환 실패: ${err}`)); + }, + ); + }, + ); +} + +/** + * 엑셀 파일을 SheetData 배열로 변환 (파일 형식별 최적화 버전) + * - XLSX: LuckyExcel 직접 처리 (스타일 정보 완전 보존) + * - CSV/XLS: SheetJS → XLSX → LuckyExcel 파이프라인 */ export async function processExcelFile(file: File): Promise { try { @@ -920,8 +1185,22 @@ export async function processExcelFile(file: File): Promise { `📁 파일 처리 시작: ${file.name} (${isCSV ? "CSV" : isXLS ? "XLS" : "XLSX"})`, ); - // 통합된 처리 방식: SheetJS → XLSX → LuckyExcel - const { sheets, xlsxBuffer } = await processFileWithSheetJSToXLSX(file); + let sheets: SheetData[]; + let xlsxBuffer: ArrayBuffer; + + if (isXLSX) { + // 🍀 XLSX 파일: LuckyExcel 직접 처리 (스타일 정보 완전 보존) + console.log("🍀 XLSX 파일 - LuckyExcel 직접 처리 방식 사용"); + const result = await processXLSXWithLuckyExcel(file); + sheets = result.sheets; + xlsxBuffer = result.xlsxBuffer; + } else { + // 📊 CSV/XLS 파일: SheetJS → XLSX → LuckyExcel 파이프라인 + console.log(`📊 ${isCSV ? "CSV" : "XLS"} 파일 - SheetJS 파이프라인 사용`); + const result = await processFileWithSheetJSToXLSX(file); + sheets = result.sheets; + xlsxBuffer = result.xlsxBuffer; + } if (!sheets || sheets.length === 0) { return { @@ -959,7 +1238,9 @@ export async function processExcelFile(file: File): Promise { error.message.includes("워크북을 생성할 수 없습니다") || error.message.includes("유효한 시트가 없습니다") || error.message.includes("시트 이름 정보가 없습니다") || - error.message.includes("파일을 읽을 수 없습니다") + error.message.includes("파일을 읽을 수 없습니다") || + error.message.includes("XLSX 파일 처리 실패") || + error.message.includes("XLSX 파일 변환 실패") ) { errorMessage = error.message; } else if (error.message.includes("transformExcelToLucky")) { diff --git a/src/utils/styleTest.ts.bak b/src/utils/styleTest.ts.bak new file mode 100644 index 0000000..4175bda --- /dev/null +++ b/src/utils/styleTest.ts.bak @@ -0,0 +1,417 @@ +/** + * xlsx-js-style 스타일 보존 테스트 유틸리티 + * - 다양한 스타일이 적용된 Excel 파일 생성 + * - 스타일 정보 확인 도구 + */ + +import * as XLSX from "xlsx-js-style"; + +/** + * 스타일이 적용된 테스트 Excel 파일 생성 + */ +export function createStyledTestExcel(): ArrayBuffer { + // 새 워크북 생성 + const wb = XLSX.utils.book_new(); + + // 테스트 데이터 생성 - xlsx-js-style 공식 API 완전 활용 + const testData = [ + // 첫 번째 행 - 폰트 스타일 테스트 + [ + { + v: "굵은 글씨", + t: "s", + s: { + font: { + name: "Courier", // 공식 문서 예시 + sz: 24, // 공식 문서 예시 + bold: true, + color: { rgb: "000000" }, + }, + }, + }, + { + v: "빨간 글씨", + t: "s", + s: { + font: { + bold: true, + color: { rgb: "FF0000" }, // 공식 문서: {color: {rgb: "FF0000"}} + sz: 12, + }, + }, + }, + { + v: "테마 색상", + t: "s", + s: { + font: { + color: { theme: 4 }, // 공식 문서: {theme: 4} (Blue, Accent 1) + sz: 14, + italic: true, + }, + }, + }, + ], + // 두 번째 행 - 배경색 테스트 + [ + { + v: "노란 배경", + t: "s", + s: { + fill: { + patternType: "solid", + fgColor: { rgb: "FFFF00" }, // 공식 문서: {fgColor: {rgb: "E9E9E9"}} + }, + }, + }, + { + v: "테마 배경", + t: "s", + s: { + fill: { + patternType: "solid", + fgColor: { theme: 1, tint: 0.4 }, // 공식 문서: {theme: 1, tint: 0.4} ("Blue, Accent 1, Lighter 40%") + }, + font: { color: { rgb: "000000" } }, + }, + }, + { + v: "인덱스 색상", + t: "s", + s: { + fill: { + patternType: "solid", + fgColor: { indexed: 5 }, // Excel 기본 색상표 - 노랑 + }, + }, + }, + ], + // 세 번째 행 - 테두리 테스트 + [ + { + v: "얇은 테두리", + t: "s", + s: { + border: { + top: { style: "thin", color: { rgb: "000000" } }, + bottom: { style: "thin", color: { rgb: "000000" } }, + left: { style: "thin", color: { rgb: "000000" } }, + right: { style: "thin", color: { rgb: "000000" } }, + }, + }, + }, + { + v: "두꺼운 테두리", + t: "s", + s: { + border: { + top: { style: "thick", color: { theme: 2 } }, // 테마 색상 사용 + bottom: { style: "thick", color: { theme: 2 } }, + left: { style: "thick", color: { theme: 2 } }, + right: { style: "thick", color: { theme: 2 } }, + }, + }, + }, + { + v: "다양한 테두리", + t: "s", + s: { + border: { + top: { style: "dotted", color: { indexed: 4 } }, // 인덱스 색상 - 파랑 + bottom: { style: "dashed", color: { indexed: 4 } }, + left: { style: "dashDot", color: { indexed: 4 } }, + right: { style: "double", color: { indexed: 4 } }, + }, + }, + }, + ], + // 네 번째 행 - 복합 스타일 테스트 + [ + { + v: "복합 스타일", + t: "s", + s: { + font: { + bold: true, + italic: true, + underline: true, + sz: 16, + color: { rgb: "FFFFFF" }, + name: "Courier", // 공식 문서 예시 + }, + fill: { + patternType: "solid", + fgColor: { theme: 7, tint: -0.2 }, // 어두운 보라색 + }, + border: { + top: { style: "medium", color: { rgb: "FFD700" } }, + bottom: { style: "medium", color: { rgb: "FFD700" } }, + left: { style: "medium", color: { rgb: "FFD700" } }, + right: { style: "medium", color: { rgb: "FFD700" } }, + }, + alignment: { + horizontal: "center", + vertical: "middle", + wrapText: true, // 공식 문서: {wrapText: true} + }, + }, + }, + { + v: 1234.567, + t: "n", + s: { + numFmt: "0.00%", // 공식 문서: numFmt 예시 + alignment: { horizontal: "right" }, + font: { bold: true }, + }, + }, + { + v: "줄바꿈\n테스트", + t: "s", + s: { + alignment: { + wrapText: true, + vertical: "top", + textRotation: 0, // 공식 문서: textRotation + }, + font: { sz: 10 }, + }, + }, + ], + // 다섯 번째 행 - 고급 스타일 테스트 + [ + { + v: "취소선 텍스트", + t: "s", + s: { + font: { + strike: true, // 공식 문서: {strike: true} + sz: 12, + color: { theme: 5, tint: 0.6 }, // 밝은 빨강 + }, + }, + }, + { + v: "회전 텍스트", + t: "s", + s: { + alignment: { + textRotation: 45, // 공식 문서: textRotation + horizontal: "center", + vertical: "middle", + }, + font: { sz: 14, bold: true }, + }, + }, + { + v: new Date(), + t: "d", + s: { + numFmt: "m/dd/yy", // 공식 문서: 날짜 포맷 예시 + font: { name: "Arial", sz: 10 }, + alignment: { horizontal: "center" }, + }, + }, + ], + ]; + + // 워크시트 생성 + const ws = XLSX.utils.aoa_to_sheet(testData); + + // 병합 셀 추가 + if (!ws["!merges"]) ws["!merges"] = []; + ws["!merges"].push( + { s: { r: 0, c: 0 }, e: { r: 0, c: 1 } }, // A1:B1 병합 + { s: { r: 2, c: 2 }, e: { r: 3, c: 2 } }, // C3:C4 병합 + ); + + // 열 너비 설정 + ws["!cols"] = [ + { wpx: 120 }, // A열 너비 + { wpx: 100 }, // B열 너비 + { wpx: 80 }, // C열 너비 + ]; + + // 행 높이 설정 + ws["!rows"] = [ + { hpx: 30 }, // 1행 높이 + { hpx: 25 }, // 2행 높이 + { hpx: 40 }, // 3행 높이 + ]; + + // 워크시트를 워크북에 추가 + XLSX.utils.book_append_sheet(wb, ws, "스타일테스트"); + + // 추가 시트 생성 (간단한 데이터) + const simpleData = [ + ["이름", "나이", "직업"], + ["홍길동", 30, "개발자"], + ["김철수", 25, "디자이너"], + ["이영희", 35, "기획자"], + ]; + + const ws2 = XLSX.utils.aoa_to_sheet(simpleData); + + // 헤더 스타일 적용 + ["A1", "B1", "C1"].forEach((cellAddr) => { + if (ws2[cellAddr]) { + ws2[cellAddr].s = { + font: { bold: true, color: { rgb: "FFFFFF" } }, + fill: { patternType: "solid", fgColor: { rgb: "5B9BD5" } }, + alignment: { horizontal: "center" }, + }; + } + }); + + XLSX.utils.book_append_sheet(wb, ws2, "간단한데이터"); + + // Excel 파일로 변환 + const excelBuffer = XLSX.write(wb, { + type: "array", + bookType: "xlsx", + cellStyles: true, + cellDates: true, + bookSST: true, + }); + + // ArrayBuffer로 변환 + if (excelBuffer instanceof Uint8Array) { + return excelBuffer.buffer.slice( + excelBuffer.byteOffset, + excelBuffer.byteOffset + excelBuffer.byteLength, + ); + } + + return excelBuffer; +} + +/** + * 셀 스타일 정보 분석 + */ +export function analyzeSheetStyles(workbook: any): void { + console.log("🎨 ================================="); + console.log("🎨 Excel 파일 스타일 정보 분석"); + console.log("🎨 ================================="); + + // 🔍 워크북 전체 스타일 정보 확인 + console.log("🔍 워크북 메타데이터:", { + Props: workbook.Props ? "있음" : "없음", + Custprops: workbook.Custprops ? "있음" : "없음", + Workbook: workbook.Workbook ? "있음" : "없음", + SSF: workbook.SSF ? "있음" : "없음", + SheetNames: workbook.SheetNames + ? workbook.SheetNames.length + "개" + : "없음", + Sheets: workbook.Sheets + ? Object.keys(workbook.Sheets).length + "개" + : "없음", + }); + + // 🔍 워크북 스타일 정보 상세 분석 + if (workbook.SSF) { + console.log("🔍 워크북 SSF 스타일 정보:", workbook.SSF); + } + + if (workbook.Workbook && workbook.Workbook.Styles) { + console.log("🔍 워크북 Styles:", workbook.Workbook.Styles); + } + + // 워크북의 모든 키 확인 + console.log("🔍 워크북 전체 키들:", Object.keys(workbook)); + + if (!workbook.SheetNames || workbook.SheetNames.length === 0) { + console.log("🎨 ❌ 시트가 없습니다."); + console.log("🎨 ❌ 워크북 전체 구조:", Object.keys(workbook)); + return; + } + + workbook.SheetNames.forEach((sheetName: string, sheetIndex: number) => { + const sheet = workbook.Sheets[sheetName]; + if (!sheet) return; + + console.log(`🎨 시트 ${sheetIndex + 1}: "${sheetName}"`); + + // 시트 메타데이터 + console.log(`🎨 - 데이터 범위: ${sheet["!ref"] || "없음"}`); + console.log(`🎨 - 병합 셀: ${sheet["!merges"]?.length || 0}개`); + console.log(`🎨 - 열 설정: ${sheet["!cols"]?.length || 0}개`); + console.log(`🎨 - 행 설정: ${sheet["!rows"]?.length || 0}개`); + + // 병합 셀 상세 정보 + if (sheet["!merges"]) { + sheet["!merges"].forEach((merge: any, index: number) => { + console.log( + `🎨 - 병합 ${index + 1}: ${XLSX.utils.encode_cell(merge.s)}:${XLSX.utils.encode_cell(merge.e)}`, + ); + }); + } + + // 스타일이 적용된 셀 찾기 + const styledCells: string[] = []; + const cellAddresses = Object.keys(sheet).filter( + (key) => !key.startsWith("!"), + ); + + // 🔍 시트 데이터 존재 여부 확인 + console.log(`🔍 ${sheetName} 기본 정보: ${cellAddresses.length}개 셀 발견`); + + cellAddresses.forEach((cellAddr) => { + const cell = sheet[cellAddr]; + if (cell && cell.s) { + styledCells.push(cellAddr); + + // 🔍 첫 3개 셀의 실제 스타일 구조 확인 + if (styledCells.length <= 3) { + console.log(`🔍 셀 ${cellAddr} cell.s 원시값:`, cell.s); + console.log(`🔍 cell.s 타입:`, typeof cell.s); + console.log(`🔍 cell.s 키들:`, Object.keys(cell.s || {})); + } + + // 스타일 정보 간단 확인 + const hasStyles = { + font: !!cell.s.font, + fill: !!cell.s.fill, + border: !!cell.s.border, + alignment: !!cell.s.alignment, + }; + + if (Object.values(hasStyles).some((v) => v)) { + console.log(`🎨 셀 ${cellAddr} 스타일:`, hasStyles); + } else if (styledCells.length <= 3) { + console.log(`❌ 셀 ${cellAddr} 스타일 없음:`, hasStyles); + } + } + }); + + console.log( + `🎨 - 스타일 적용된 셀: ${styledCells.length}개 (${styledCells.join(", ")})`, + ); + }); + + console.log("🎨 ================================="); +} + +/** + * 브라우저에서 테스트 파일 다운로드 + */ +export function downloadTestFile(): void { + try { + const buffer = createStyledTestExcel(); + const blob = new Blob([buffer], { + type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + }); + + const url = URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = "스타일테스트.xlsx"; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + + console.log("🎨 스타일 테스트 파일 다운로드 완료!"); + } catch (error) { + console.error("🎨 테스트 파일 생성 실패:", error); + } +} diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts index 93b140e..7fd64d3 100644 --- a/src/vite-env.d.ts +++ b/src/vite-env.d.ts @@ -178,6 +178,33 @@ declare module "luckysheet" { */ declare global { interface Window { - luckysheet: any; + luckysheet: { + create: (options: { + container: string; + data: any[]; + title?: string; + userInfo?: string; + [key: string]: any; + }) => void; + destroy: () => void; + resize?: () => void; + [key: string]: any; + }; + LuckyExcel: { + transformExcelToLucky: ( + file: File | ArrayBuffer, + successCallback: (exportJson: any, luckysheetfile: any) => void, + errorCallback: (error: any) => void, + ) => void; + [key: string]: any; + }; + $: any; // jQuery + Store?: any; // Luckysheet Store + luckysheet_function?: any; // Luckysheet function list + functionlist?: any[]; // 글로벌 functionlist + luckysheetConfigsetting?: any; // Luckysheet 설정 객체 + luckysheetPostil?: any; // Luckysheet 포스틸 객체 } } + +export {}; diff --git a/tsconfig.app.json b/tsconfig.app.json index 9c8a3c4..c5cfaa0 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -22,5 +22,6 @@ "noFallthroughCasesInSwitch": true, "noUncheckedSideEffectImports": true }, - "include": ["src"] + "include": ["src"], + "exclude": ["**/__tests__/**", "**/*.test.ts", "**/*.test.tsx"] } diff --git a/tsconfig.json b/tsconfig.json index 1ffef60..5342477 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,16 @@ { "files": [], "references": [ - { "path": "./tsconfig.app.json" }, - { "path": "./tsconfig.node.json" } - ] + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.node.json" + } + ], + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.tsbuildinfo" + }, + "exclude": ["**/__tests__/**", "**/*.test.ts", "**/*.test.tsx"] } diff --git a/vite.config.ts b/vite.config.ts index 8dafce2..3ae7db6 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -4,6 +4,77 @@ import react from "@vitejs/plugin-react"; // https://vite.dev/config/ export default defineConfig({ plugins: [react()], + + // Node.js 호환성 문제 해결 + define: { + global: "globalThis", + }, + + // Node.js 모듈 호환성 설정 + resolve: { + alias: { + stream: "stream-browserify", + buffer: "buffer", + }, + }, + + // 의존성 최적화 설정 + optimizeDeps: { + exclude: [ + // 중복 로딩 방지를 위해 redi와 univer 관련 제외 + "@wendellhu/redi", + "@univerjs/core", + "@univerjs/design", + "@univerjs/ui", + "@univerjs/sheets", + "@univerjs/sheets-ui", + "@univerjs/docs", + "@univerjs/docs-ui", + "@univerjs/engine-render", + "@univerjs/engine-formula", + "@univerjs/sheets-formula", + "@univerjs/sheets-formula-ui", + "@univerjs/sheets-numfmt", + "@univerjs/sheets-numfmt-ui", + "@univerjs/facade", + ], + }, + + // 빌드 설정 + build: { + rollupOptions: { + external: [], + output: { + manualChunks: { + // Univer 관련 라이브러리를 별도 청크로 분리 + "univer-core": [ + "@univerjs/core", + "@univerjs/design", + "@univerjs/engine-render", + "@univerjs/engine-formula", + ], + "univer-sheets": [ + "@univerjs/sheets", + "@univerjs/sheets-ui", + "@univerjs/sheets-formula", + "@univerjs/sheets-formula-ui", + "@univerjs/sheets-numfmt", + "@univerjs/sheets-numfmt-ui", + ], + "univer-docs": ["@univerjs/docs", "@univerjs/docs-ui"], + "univer-ui": ["@univerjs/ui", "@univerjs/facade"], + }, + }, + }, + }, + + // 서버 설정 + server: { + fs: { + strict: false, + }, + }, + // @ts-ignore - vitest config test: { globals: true,