7.11 morning
This commit is contained in:
parent
9d5870b37b
commit
075fb02263
231
bun.lock
231
bun.lock
@ -19,6 +19,7 @@
|
|||||||
"tailwindcss": "^4.1.11",
|
"tailwindcss": "^4.1.11",
|
||||||
"typescript": "~5.8.3",
|
"typescript": "~5.8.3",
|
||||||
"vite": "^7.0.0",
|
"vite": "^7.0.0",
|
||||||
|
"vite-plugin-minipic": "^1.3.0",
|
||||||
"vue-tsc": "^2.2.10",
|
"vue-tsc": "^2.2.10",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -86,6 +87,8 @@
|
|||||||
|
|
||||||
"@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.5", "", { "os": "win32", "cpu": "x64" }, "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g=="],
|
"@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.5", "", { "os": "win32", "cpu": "x64" }, "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g=="],
|
||||||
|
|
||||||
|
"@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="],
|
||||||
|
|
||||||
"@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="],
|
"@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="],
|
||||||
|
|
||||||
"@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.12", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg=="],
|
"@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.12", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg=="],
|
||||||
@ -96,8 +99,12 @@
|
|||||||
|
|
||||||
"@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.29", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ=="],
|
"@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.29", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ=="],
|
||||||
|
|
||||||
|
"@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="],
|
||||||
|
|
||||||
"@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.19", "", {}, "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA=="],
|
"@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.19", "", {}, "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA=="],
|
||||||
|
|
||||||
|
"@rollup/pluginutils": ["@rollup/pluginutils@5.2.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw=="],
|
||||||
|
|
||||||
"@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.44.2", "", { "os": "android", "cpu": "arm" }, "sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q=="],
|
"@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.44.2", "", { "os": "android", "cpu": "arm" }, "sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q=="],
|
||||||
|
|
||||||
"@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.44.2", "", { "os": "android", "cpu": "arm64" }, "sha512-Yt5MKrOosSbSaAK5Y4J+vSiID57sOvpBNBR6K7xAaQvk3MkcNVV0f9fE20T+41WYN8hDn6SGFlFrKudtx4EoxA=="],
|
"@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.44.2", "", { "os": "android", "cpu": "arm64" }, "sha512-Yt5MKrOosSbSaAK5Y4J+vSiID57sOvpBNBR6K7xAaQvk3MkcNVV0f9fE20T+41WYN8hDn6SGFlFrKudtx4EoxA=="],
|
||||||
@ -204,32 +211,88 @@
|
|||||||
|
|
||||||
"alien-signals": ["alien-signals@1.0.13", "", {}, "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg=="],
|
"alien-signals": ["alien-signals@1.0.13", "", {}, "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg=="],
|
||||||
|
|
||||||
|
"ansi-align": ["ansi-align@3.0.1", "", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="],
|
||||||
|
|
||||||
|
"ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="],
|
||||||
|
|
||||||
|
"ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="],
|
||||||
|
|
||||||
"autoprefixer": ["autoprefixer@10.4.21", "", { "dependencies": { "browserslist": "^4.24.4", "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ=="],
|
"autoprefixer": ["autoprefixer@10.4.21", "", { "dependencies": { "browserslist": "^4.24.4", "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ=="],
|
||||||
|
|
||||||
|
"b4a": ["b4a@1.6.7", "", {}, "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg=="],
|
||||||
|
|
||||||
"balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
|
"balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
|
||||||
|
|
||||||
|
"bare-events": ["bare-events@2.6.0", "", {}, "sha512-EKZ5BTXYExaNqi3I3f9RtEsaI/xBSGjE0XZCZilPzFAV/goswFHuPd9jEZlPIZ/iNZJwDSao9qRiScySz7MbQg=="],
|
||||||
|
|
||||||
|
"bare-fs": ["bare-fs@4.1.6", "", { "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", "bare-stream": "^2.6.4" }, "peerDependencies": { "bare-buffer": "*" }, "optionalPeers": ["bare-buffer"] }, "sha512-25RsLF33BqooOEFNdMcEhMpJy8EoR88zSMrnOQOaM3USnOK2VmaJ1uaQEwPA6AQjrv1lXChScosN6CzbwbO9OQ=="],
|
||||||
|
|
||||||
|
"bare-os": ["bare-os@3.6.1", "", {}, "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g=="],
|
||||||
|
|
||||||
|
"bare-path": ["bare-path@3.0.0", "", { "dependencies": { "bare-os": "^3.0.1" } }, "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw=="],
|
||||||
|
|
||||||
|
"bare-stream": ["bare-stream@2.6.5", "", { "dependencies": { "streamx": "^2.21.0" }, "peerDependencies": { "bare-buffer": "*", "bare-events": "*" }, "optionalPeers": ["bare-buffer", "bare-events"] }, "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA=="],
|
||||||
|
|
||||||
|
"base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
|
||||||
|
|
||||||
|
"bl": ["bl@5.1.0", "", { "dependencies": { "buffer": "^6.0.3", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ=="],
|
||||||
|
|
||||||
|
"boxen": ["boxen@7.1.1", "", { "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^7.0.1", "chalk": "^5.2.0", "cli-boxes": "^3.0.0", "string-width": "^5.1.2", "type-fest": "^2.13.0", "widest-line": "^4.0.1", "wrap-ansi": "^8.1.0" } }, "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog=="],
|
||||||
|
|
||||||
"brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
"brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
|
||||||
|
|
||||||
"browserslist": ["browserslist@4.25.1", "", { "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw=="],
|
"browserslist": ["browserslist@4.25.1", "", { "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw=="],
|
||||||
|
|
||||||
|
"buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="],
|
||||||
|
|
||||||
"buffer-builder": ["buffer-builder@0.2.0", "", {}, "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg=="],
|
"buffer-builder": ["buffer-builder@0.2.0", "", {}, "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg=="],
|
||||||
|
|
||||||
|
"camelcase": ["camelcase@7.0.1", "", {}, "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw=="],
|
||||||
|
|
||||||
"caniuse-lite": ["caniuse-lite@1.0.30001726", "", {}, "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw=="],
|
"caniuse-lite": ["caniuse-lite@1.0.30001726", "", {}, "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw=="],
|
||||||
|
|
||||||
|
"chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="],
|
||||||
|
|
||||||
"chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="],
|
"chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="],
|
||||||
|
|
||||||
|
"cli-boxes": ["cli-boxes@3.0.0", "", {}, "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="],
|
||||||
|
|
||||||
|
"cli-cursor": ["cli-cursor@4.0.0", "", { "dependencies": { "restore-cursor": "^4.0.0" } }, "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg=="],
|
||||||
|
|
||||||
|
"cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="],
|
||||||
|
|
||||||
|
"color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="],
|
||||||
|
|
||||||
|
"color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
|
||||||
|
|
||||||
|
"color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
|
||||||
|
|
||||||
|
"color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="],
|
||||||
|
|
||||||
"colorjs.io": ["colorjs.io@0.5.2", "", {}, "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw=="],
|
"colorjs.io": ["colorjs.io@0.5.2", "", {}, "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw=="],
|
||||||
|
|
||||||
"core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="],
|
"core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="],
|
||||||
|
|
||||||
|
"cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
|
||||||
|
|
||||||
"csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="],
|
"csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="],
|
||||||
|
|
||||||
"de-indent": ["de-indent@1.0.2", "", {}, "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg=="],
|
"de-indent": ["de-indent@1.0.2", "", {}, "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg=="],
|
||||||
|
|
||||||
|
"decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="],
|
||||||
|
|
||||||
|
"deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="],
|
||||||
|
|
||||||
"detect-libc": ["detect-libc@2.0.4", "", {}, "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="],
|
"detect-libc": ["detect-libc@2.0.4", "", {}, "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="],
|
||||||
|
|
||||||
|
"eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="],
|
||||||
|
|
||||||
"electron-to-chromium": ["electron-to-chromium@1.5.179", "", {}, "sha512-UWKi/EbBopgfFsc5k61wFpV7WrnnSlSzW/e2XcBmS6qKYTivZlLtoll5/rdqRTxGglGHkmkW0j0pFNJG10EUIQ=="],
|
"electron-to-chromium": ["electron-to-chromium@1.5.179", "", {}, "sha512-UWKi/EbBopgfFsc5k61wFpV7WrnnSlSzW/e2XcBmS6qKYTivZlLtoll5/rdqRTxGglGHkmkW0j0pFNJG10EUIQ=="],
|
||||||
|
|
||||||
|
"emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="],
|
||||||
|
|
||||||
|
"end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="],
|
||||||
|
|
||||||
"enhanced-resolve": ["enhanced-resolve@5.18.2", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ=="],
|
"enhanced-resolve": ["enhanced-resolve@5.18.2", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ=="],
|
||||||
|
|
||||||
"entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
|
"entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
|
||||||
@ -240,12 +303,26 @@
|
|||||||
|
|
||||||
"estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
|
"estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
|
||||||
|
|
||||||
|
"expand-template": ["expand-template@2.0.3", "", {}, "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="],
|
||||||
|
|
||||||
|
"fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="],
|
||||||
|
|
||||||
"fdir": ["fdir@6.4.6", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w=="],
|
"fdir": ["fdir@6.4.6", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w=="],
|
||||||
|
|
||||||
|
"filesize": ["filesize@10.1.6", "", {}, "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w=="],
|
||||||
|
|
||||||
|
"foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="],
|
||||||
|
|
||||||
"fraction.js": ["fraction.js@4.3.7", "", {}, "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew=="],
|
"fraction.js": ["fraction.js@4.3.7", "", {}, "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew=="],
|
||||||
|
|
||||||
|
"fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="],
|
||||||
|
|
||||||
"fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
|
"fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
|
||||||
|
|
||||||
|
"github-from-package": ["github-from-package@0.0.0", "", {}, "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="],
|
||||||
|
|
||||||
|
"glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="],
|
||||||
|
|
||||||
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
|
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
|
||||||
|
|
||||||
"gsap": ["gsap@3.13.0", "", {}, "sha512-QL7MJ2WMjm1PHWsoFrAQH/J8wUeqZvMtHO58qdekHpCfhvhSL4gSiz6vJf5EeMP0LOn3ZCprL2ki/gjED8ghVw=="],
|
"gsap": ["gsap@3.13.0", "", {}, "sha512-QL7MJ2WMjm1PHWsoFrAQH/J8wUeqZvMtHO58qdekHpCfhvhSL4gSiz6vJf5EeMP0LOn3ZCprL2ki/gjED8ghVw=="],
|
||||||
@ -254,14 +331,30 @@
|
|||||||
|
|
||||||
"he": ["he@1.2.0", "", { "bin": { "he": "bin/he" } }, "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="],
|
"he": ["he@1.2.0", "", { "bin": { "he": "bin/he" } }, "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="],
|
||||||
|
|
||||||
|
"ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
|
||||||
|
|
||||||
"immediate": ["immediate@3.0.6", "", {}, "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="],
|
"immediate": ["immediate@3.0.6", "", {}, "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="],
|
||||||
|
|
||||||
"immutable": ["immutable@5.1.3", "", {}, "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg=="],
|
"immutable": ["immutable@5.1.3", "", {}, "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg=="],
|
||||||
|
|
||||||
"inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
|
"inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
|
||||||
|
|
||||||
|
"ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="],
|
||||||
|
|
||||||
|
"is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="],
|
||||||
|
|
||||||
|
"is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
|
||||||
|
|
||||||
|
"is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="],
|
||||||
|
|
||||||
|
"is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="],
|
||||||
|
|
||||||
"isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="],
|
"isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="],
|
||||||
|
|
||||||
|
"isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
|
||||||
|
|
||||||
|
"jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="],
|
||||||
|
|
||||||
"jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="],
|
"jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="],
|
||||||
|
|
||||||
"jszip": ["jszip@3.10.1", "", { "dependencies": { "lie": "~3.3.0", "pako": "~1.0.2", "readable-stream": "~2.3.6", "setimmediate": "^1.0.5" } }, "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g=="],
|
"jszip": ["jszip@3.10.1", "", { "dependencies": { "lie": "~3.3.0", "pako": "~1.0.2", "readable-stream": "~2.3.6", "setimmediate": "^1.0.5" } }, "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g=="],
|
||||||
@ -290,30 +383,62 @@
|
|||||||
|
|
||||||
"lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.1", "", { "os": "win32", "cpu": "x64" }, "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg=="],
|
"lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.1", "", { "os": "win32", "cpu": "x64" }, "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg=="],
|
||||||
|
|
||||||
|
"lodash-es": ["lodash-es@4.17.21", "", {}, "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="],
|
||||||
|
|
||||||
|
"log-symbols": ["log-symbols@5.1.0", "", { "dependencies": { "chalk": "^5.0.0", "is-unicode-supported": "^1.1.0" } }, "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA=="],
|
||||||
|
|
||||||
|
"lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
|
||||||
|
|
||||||
"magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="],
|
"magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="],
|
||||||
|
|
||||||
|
"mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="],
|
||||||
|
|
||||||
|
"mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="],
|
||||||
|
|
||||||
"minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
|
"minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
|
||||||
|
|
||||||
|
"minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
|
||||||
|
|
||||||
"minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
|
"minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
|
||||||
|
|
||||||
"minizlib": ["minizlib@3.0.2", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA=="],
|
"minizlib": ["minizlib@3.0.2", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA=="],
|
||||||
|
|
||||||
"mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="],
|
"mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="],
|
||||||
|
|
||||||
|
"mkdirp-classic": ["mkdirp-classic@0.5.3", "", {}, "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="],
|
||||||
|
|
||||||
"muggle-string": ["muggle-string@0.4.1", "", {}, "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ=="],
|
"muggle-string": ["muggle-string@0.4.1", "", {}, "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ=="],
|
||||||
|
|
||||||
"nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
|
"nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
|
||||||
|
|
||||||
|
"napi-build-utils": ["napi-build-utils@2.0.0", "", {}, "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA=="],
|
||||||
|
|
||||||
|
"node-abi": ["node-abi@3.75.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg=="],
|
||||||
|
|
||||||
|
"node-addon-api": ["node-addon-api@6.1.0", "", {}, "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA=="],
|
||||||
|
|
||||||
"node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="],
|
"node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="],
|
||||||
|
|
||||||
"normalize-range": ["normalize-range@0.1.2", "", {}, "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA=="],
|
"normalize-range": ["normalize-range@0.1.2", "", {}, "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA=="],
|
||||||
|
|
||||||
"normalize.css": ["normalize.css@8.0.1", "", {}, "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg=="],
|
"normalize.css": ["normalize.css@8.0.1", "", {}, "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg=="],
|
||||||
|
|
||||||
|
"once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="],
|
||||||
|
|
||||||
|
"onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="],
|
||||||
|
|
||||||
|
"ora": ["ora@7.0.1", "", { "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^4.0.0", "cli-spinners": "^2.9.0", "is-interactive": "^2.0.0", "is-unicode-supported": "^1.3.0", "log-symbols": "^5.1.0", "stdin-discarder": "^0.1.0", "string-width": "^6.1.0", "strip-ansi": "^7.1.0" } }, "sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw=="],
|
||||||
|
|
||||||
|
"package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="],
|
||||||
|
|
||||||
"pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="],
|
"pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="],
|
||||||
|
|
||||||
"path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="],
|
"path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="],
|
||||||
|
|
||||||
|
"path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
|
||||||
|
|
||||||
|
"path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="],
|
||||||
|
|
||||||
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
|
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
|
||||||
|
|
||||||
"picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="],
|
"picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="],
|
||||||
@ -322,10 +447,18 @@
|
|||||||
|
|
||||||
"postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="],
|
"postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="],
|
||||||
|
|
||||||
|
"prebuild-install": ["prebuild-install@7.1.3", "", { "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", "simple-get": "^4.0.0", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, "bin": { "prebuild-install": "bin.js" } }, "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug=="],
|
||||||
|
|
||||||
"process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="],
|
"process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="],
|
||||||
|
|
||||||
|
"pump": ["pump@3.0.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA=="],
|
||||||
|
|
||||||
|
"rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="],
|
||||||
|
|
||||||
"readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="],
|
"readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="],
|
||||||
|
|
||||||
|
"restore-cursor": ["restore-cursor@4.0.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg=="],
|
||||||
|
|
||||||
"rollup": ["rollup@4.44.2", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.44.2", "@rollup/rollup-android-arm64": "4.44.2", "@rollup/rollup-darwin-arm64": "4.44.2", "@rollup/rollup-darwin-x64": "4.44.2", "@rollup/rollup-freebsd-arm64": "4.44.2", "@rollup/rollup-freebsd-x64": "4.44.2", "@rollup/rollup-linux-arm-gnueabihf": "4.44.2", "@rollup/rollup-linux-arm-musleabihf": "4.44.2", "@rollup/rollup-linux-arm64-gnu": "4.44.2", "@rollup/rollup-linux-arm64-musl": "4.44.2", "@rollup/rollup-linux-loongarch64-gnu": "4.44.2", "@rollup/rollup-linux-powerpc64le-gnu": "4.44.2", "@rollup/rollup-linux-riscv64-gnu": "4.44.2", "@rollup/rollup-linux-riscv64-musl": "4.44.2", "@rollup/rollup-linux-s390x-gnu": "4.44.2", "@rollup/rollup-linux-x64-gnu": "4.44.2", "@rollup/rollup-linux-x64-musl": "4.44.2", "@rollup/rollup-win32-arm64-msvc": "4.44.2", "@rollup/rollup-win32-ia32-msvc": "4.44.2", "@rollup/rollup-win32-x64-msvc": "4.44.2", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-PVoapzTwSEcelaWGth3uR66u7ZRo6qhPHc0f2uRO9fX6XDVNrIiGYS0Pj9+R8yIIYSD/mCx2b16Ws9itljKSPg=="],
|
"rollup": ["rollup@4.44.2", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.44.2", "@rollup/rollup-android-arm64": "4.44.2", "@rollup/rollup-darwin-arm64": "4.44.2", "@rollup/rollup-darwin-x64": "4.44.2", "@rollup/rollup-freebsd-arm64": "4.44.2", "@rollup/rollup-freebsd-x64": "4.44.2", "@rollup/rollup-linux-arm-gnueabihf": "4.44.2", "@rollup/rollup-linux-arm-musleabihf": "4.44.2", "@rollup/rollup-linux-arm64-gnu": "4.44.2", "@rollup/rollup-linux-arm64-musl": "4.44.2", "@rollup/rollup-linux-loongarch64-gnu": "4.44.2", "@rollup/rollup-linux-powerpc64le-gnu": "4.44.2", "@rollup/rollup-linux-riscv64-gnu": "4.44.2", "@rollup/rollup-linux-riscv64-musl": "4.44.2", "@rollup/rollup-linux-s390x-gnu": "4.44.2", "@rollup/rollup-linux-x64-gnu": "4.44.2", "@rollup/rollup-linux-x64-musl": "4.44.2", "@rollup/rollup-win32-arm64-msvc": "4.44.2", "@rollup/rollup-win32-ia32-msvc": "4.44.2", "@rollup/rollup-win32-x64-msvc": "4.44.2", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-PVoapzTwSEcelaWGth3uR66u7ZRo6qhPHc0f2uRO9fX6XDVNrIiGYS0Pj9+R8yIIYSD/mCx2b16Ws9itljKSPg=="],
|
||||||
|
|
||||||
"rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="],
|
"rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="],
|
||||||
@ -366,12 +499,42 @@
|
|||||||
|
|
||||||
"sass-embedded-win32-x64": ["sass-embedded-win32-x64@1.89.2", "", { "os": "win32", "cpu": "x64" }, "sha512-cS2j5ljdkQsb4PaORiClaVYynE9OAPZG/XjbOMxpQmjRIf7UroY4PEIH+Waf+y47PfXFX9SyxhYuw2NIKGbEng=="],
|
"sass-embedded-win32-x64": ["sass-embedded-win32-x64@1.89.2", "", { "os": "win32", "cpu": "x64" }, "sha512-cS2j5ljdkQsb4PaORiClaVYynE9OAPZG/XjbOMxpQmjRIf7UroY4PEIH+Waf+y47PfXFX9SyxhYuw2NIKGbEng=="],
|
||||||
|
|
||||||
|
"semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
|
||||||
|
|
||||||
"setimmediate": ["setimmediate@1.0.5", "", {}, "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="],
|
"setimmediate": ["setimmediate@1.0.5", "", {}, "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="],
|
||||||
|
|
||||||
|
"sharp": ["sharp@0.32.6", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.2", "node-addon-api": "^6.1.0", "prebuild-install": "^7.1.1", "semver": "^7.5.4", "simple-get": "^4.0.1", "tar-fs": "^3.0.4", "tunnel-agent": "^0.6.0" } }, "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w=="],
|
||||||
|
|
||||||
|
"shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
|
||||||
|
|
||||||
|
"shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
|
||||||
|
|
||||||
|
"signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
|
||||||
|
|
||||||
|
"simple-concat": ["simple-concat@1.0.1", "", {}, "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="],
|
||||||
|
|
||||||
|
"simple-get": ["simple-get@4.0.1", "", { "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA=="],
|
||||||
|
|
||||||
|
"simple-swizzle": ["simple-swizzle@0.2.2", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="],
|
||||||
|
|
||||||
"source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
|
"source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
|
||||||
|
|
||||||
|
"stdin-discarder": ["stdin-discarder@0.1.0", "", { "dependencies": { "bl": "^5.0.0" } }, "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ=="],
|
||||||
|
|
||||||
|
"streamx": ["streamx@2.22.1", "", { "dependencies": { "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" }, "optionalDependencies": { "bare-events": "^2.2.0" } }, "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA=="],
|
||||||
|
|
||||||
|
"string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="],
|
||||||
|
|
||||||
|
"string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
|
||||||
|
|
||||||
"string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="],
|
"string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="],
|
||||||
|
|
||||||
|
"strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="],
|
||||||
|
|
||||||
|
"strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
||||||
|
|
||||||
|
"strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="],
|
||||||
|
|
||||||
"supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="],
|
"supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="],
|
||||||
|
|
||||||
"sync-child-process": ["sync-child-process@1.0.2", "", { "dependencies": { "sync-message-port": "^1.0.0" } }, "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA=="],
|
"sync-child-process": ["sync-child-process@1.0.2", "", { "dependencies": { "sync-message-port": "^1.0.0" } }, "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA=="],
|
||||||
@ -384,10 +547,20 @@
|
|||||||
|
|
||||||
"tar": ["tar@7.4.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="],
|
"tar": ["tar@7.4.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="],
|
||||||
|
|
||||||
|
"tar-fs": ["tar-fs@3.1.0", "", { "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" }, "optionalDependencies": { "bare-fs": "^4.0.1", "bare-path": "^3.0.0" } }, "sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w=="],
|
||||||
|
|
||||||
|
"tar-stream": ["tar-stream@3.1.7", "", { "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ=="],
|
||||||
|
|
||||||
|
"text-decoder": ["text-decoder@1.2.3", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA=="],
|
||||||
|
|
||||||
"tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="],
|
"tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="],
|
||||||
|
|
||||||
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
|
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
|
||||||
|
|
||||||
|
"tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="],
|
||||||
|
|
||||||
|
"type-fest": ["type-fest@2.19.0", "", {}, "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="],
|
||||||
|
|
||||||
"typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="],
|
"typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="],
|
||||||
|
|
||||||
"update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="],
|
"update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="],
|
||||||
@ -398,12 +571,24 @@
|
|||||||
|
|
||||||
"vite": ["vite@7.0.2", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.6", "picomatch": "^4.0.2", "postcss": "^8.5.6", "rollup": "^4.40.0", "tinyglobby": "^0.2.14" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-hxdyZDY1CM6SNpKI4w4lcUc3Mtkd9ej4ECWVHSMrOdSinVc2zYOAppHeGc/hzmRo3pxM5blMzkuWHOJA/3NiFw=="],
|
"vite": ["vite@7.0.2", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.6", "picomatch": "^4.0.2", "postcss": "^8.5.6", "rollup": "^4.40.0", "tinyglobby": "^0.2.14" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-hxdyZDY1CM6SNpKI4w4lcUc3Mtkd9ej4ECWVHSMrOdSinVc2zYOAppHeGc/hzmRo3pxM5blMzkuWHOJA/3NiFw=="],
|
||||||
|
|
||||||
|
"vite-plugin-minipic": ["vite-plugin-minipic@1.3.0", "", { "dependencies": { "@rollup/pluginutils": "^5.0.3", "boxen": "^7.1.1", "chalk": "^5.3.0", "filesize": "^10.0.12", "glob": "^10.3.10", "lodash-es": "^4.17.21", "ora": "^7.0.1", "rollup": "^4.40.0", "sharp": "^0.32.4" } }, "sha512-iSfqsXqxDg0NZW+3UrSG9PkLjL2DbleDoXeI5jd48kze770bOuJa4WhH4/OYhaDvy8jaCTSVeV5jmDksIcXh+w=="],
|
||||||
|
|
||||||
"vscode-uri": ["vscode-uri@3.1.0", "", {}, "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ=="],
|
"vscode-uri": ["vscode-uri@3.1.0", "", {}, "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ=="],
|
||||||
|
|
||||||
"vue": ["vue@3.5.17", "", { "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": "*" }, "optionalPeers": ["typescript"] }, "sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g=="],
|
"vue": ["vue@3.5.17", "", { "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": "*" }, "optionalPeers": ["typescript"] }, "sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g=="],
|
||||||
|
|
||||||
"vue-tsc": ["vue-tsc@2.2.12", "", { "dependencies": { "@volar/typescript": "2.4.15", "@vue/language-core": "2.2.12" }, "peerDependencies": { "typescript": ">=5.0.0" }, "bin": { "vue-tsc": "./bin/vue-tsc.js" } }, "sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw=="],
|
"vue-tsc": ["vue-tsc@2.2.12", "", { "dependencies": { "@volar/typescript": "2.4.15", "@vue/language-core": "2.2.12" }, "peerDependencies": { "typescript": ">=5.0.0" }, "bin": { "vue-tsc": "./bin/vue-tsc.js" } }, "sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw=="],
|
||||||
|
|
||||||
|
"which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
|
||||||
|
|
||||||
|
"widest-line": ["widest-line@4.0.1", "", { "dependencies": { "string-width": "^5.0.1" } }, "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig=="],
|
||||||
|
|
||||||
|
"wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="],
|
||||||
|
|
||||||
|
"wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
|
||||||
|
|
||||||
|
"wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
|
||||||
|
|
||||||
"yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="],
|
"yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="],
|
||||||
|
|
||||||
"@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="],
|
"@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="],
|
||||||
@ -417,5 +602,51 @@
|
|||||||
"@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="],
|
"@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="],
|
||||||
|
|
||||||
"@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
|
"@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
|
||||||
|
|
||||||
|
"ansi-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
|
||||||
|
|
||||||
|
"bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="],
|
||||||
|
|
||||||
|
"ora/string-width": ["string-width@6.1.0", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^10.2.1", "strip-ansi": "^7.0.1" } }, "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ=="],
|
||||||
|
|
||||||
|
"prebuild-install/tar-fs": ["tar-fs@2.1.3", "", { "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg=="],
|
||||||
|
|
||||||
|
"restore-cursor/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
|
||||||
|
|
||||||
|
"string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
|
||||||
|
|
||||||
|
"string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
||||||
|
|
||||||
|
"strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
||||||
|
|
||||||
|
"wrap-ansi-cjs/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||||
|
|
||||||
|
"wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
|
||||||
|
|
||||||
|
"wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
||||||
|
|
||||||
|
"ansi-align/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
|
||||||
|
|
||||||
|
"ansi-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
||||||
|
|
||||||
|
"ora/string-width/emoji-regex": ["emoji-regex@10.4.0", "", {}, "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw=="],
|
||||||
|
|
||||||
|
"prebuild-install/tar-fs/chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="],
|
||||||
|
|
||||||
|
"prebuild-install/tar-fs/tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="],
|
||||||
|
|
||||||
|
"string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
||||||
|
|
||||||
|
"wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
|
||||||
|
|
||||||
|
"wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
||||||
|
|
||||||
|
"ansi-align/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
||||||
|
|
||||||
|
"prebuild-install/tar-fs/tar-stream/bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="],
|
||||||
|
|
||||||
|
"prebuild-install/tar-fs/tar-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="],
|
||||||
|
|
||||||
|
"prebuild-install/tar-fs/tar-stream/bl/buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,9 +4,9 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
|
||||||
<link rel="stylesheet" href="https://registry.npmmirror.com/@fontsource-variable/noto-sans-sc/5.2.5/files/index.css">
|
<link rel="stylesheet" href="https://registry.npmmirror.com/@fontsource-variable/noto-sans-sc/5.2.5/files/index.css">
|
||||||
<title>Vite + Vue + TS</title>
|
<title>弹性福利平台</title>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@ -24,6 +24,7 @@
|
|||||||
"tailwindcss": "^4.1.11",
|
"tailwindcss": "^4.1.11",
|
||||||
"typescript": "~5.8.3",
|
"typescript": "~5.8.3",
|
||||||
"vite": "^7.0.0",
|
"vite": "^7.0.0",
|
||||||
|
"vite-plugin-minipic": "^1.3.0",
|
||||||
"vue-tsc": "^2.2.10"
|
"vue-tsc": "^2.2.10"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,8 +2,9 @@
|
|||||||
import { ref } from 'vue';
|
import { ref } from 'vue';
|
||||||
import Game from './pages/Game.vue';
|
import Game from './pages/Game.vue';
|
||||||
import Page1 from './pages/Page1.vue';
|
import Page1 from './pages/Page1.vue';
|
||||||
|
import assets from './assets';
|
||||||
|
|
||||||
const stage = ref(1);
|
const stage = ref(0);
|
||||||
|
|
||||||
const userData = ref({
|
const userData = ref({
|
||||||
region: '奥莱',
|
region: '奥莱',
|
||||||
@ -18,6 +19,7 @@ function startExploration(payload: { region: string; store: string; username: st
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
<link v-for="ani in Object.values(assets.ani)" rel="preload" :href="ani" as="fetch">
|
||||||
<main>
|
<main>
|
||||||
<Page1 class="page" v-if="stage == 0" @start-exploration="startExploration"/>
|
<Page1 class="page" v-if="stage == 0" @start-exploration="startExploration"/>
|
||||||
<Game class="page" v-if="stage == 1" :userdata="userData"/>
|
<Game class="page" v-if="stage == 1" :userdata="userData"/>
|
||||||
|
|||||||
BIN
src/assets/ani/P1太阳总.zip
Normal file
BIN
src/assets/ani/P1太阳总.zip
Normal file
Binary file not shown.
BIN
src/assets/ani/开始探索.zip
Normal file
BIN
src/assets/ani/开始探索.zip
Normal file
Binary file not shown.
BIN
src/assets/ani/点击选择阵营.zip
Normal file
BIN
src/assets/ani/点击选择阵营.zip
Normal file
Binary file not shown.
Binary file not shown.
@ -23,6 +23,10 @@ export default {
|
|||||||
后端效果: new URL('./ani/后段效果.zip', import.meta.url).href,
|
后端效果: new URL('./ani/后段效果.zip', import.meta.url).href,
|
||||||
主标出现: new URL('./ani/主标出现.zip', import.meta.url).href,
|
主标出现: new URL('./ani/主标出现.zip', import.meta.url).href,
|
||||||
结尾: new URL('./ani/结尾.zip', import.meta.url).href,
|
结尾: new URL('./ani/结尾.zip', import.meta.url).href,
|
||||||
|
P1太阳总: new URL('./ani/P1太阳总.zip', import.meta.url).href,
|
||||||
|
点击选择阵营: new URL('./ani/点击选择阵营.zip', import.meta.url).href,
|
||||||
|
//x, y = (484, 782) -> (786, 908)
|
||||||
|
开始探索: new URL('./ani/开始探索.zip', import.meta.url).href,
|
||||||
},
|
},
|
||||||
icons: [
|
icons: [
|
||||||
[new URL('./icons/icon1.png', import.meta.url).href, new URL('./icons/bigicon1.png', import.meta.url).href],
|
[new URL('./icons/icon1.png', import.meta.url).href, new URL('./icons/bigicon1.png', import.meta.url).href],
|
||||||
|
|||||||
@ -35,13 +35,12 @@ const props = withDefaults(defineProps<Props>(), {
|
|||||||
autoPlay: true
|
autoPlay: true
|
||||||
})
|
})
|
||||||
|
|
||||||
// 响应式状态
|
// 响应式状态 (不变)
|
||||||
const loading = ref(false)
|
const loading = ref(false)
|
||||||
const error = ref('')
|
const error = ref('')
|
||||||
const progress = ref(0)
|
const progress = ref(0)
|
||||||
const images = ref<string[]>([]) // 仍然用于临时存储Blob URL
|
const images = ref<string[]>([])
|
||||||
// 【优化】: 存储 ImageData 而不是 HTMLImageElement
|
const loadedImages = ref<HTMLImageElement[]>([])
|
||||||
const loadedImages = ref<ImageData[]>([])
|
|
||||||
const canvasRef = ref<HTMLCanvasElement>()
|
const canvasRef = ref<HTMLCanvasElement>()
|
||||||
const canvasWidth = ref(props.width)
|
const canvasWidth = ref(props.width)
|
||||||
const canvasHeight = ref(props.height)
|
const canvasHeight = ref(props.height)
|
||||||
@ -63,17 +62,20 @@ const loadImageSequence = async (zipUrl: string) => {
|
|||||||
progress.value = 0
|
progress.value = 0
|
||||||
images.value = []
|
images.value = []
|
||||||
loadedImages.value = []
|
loadedImages.value = []
|
||||||
|
console.log(`开始加载图片序列: ${zipUrl}`);
|
||||||
|
|
||||||
const response = await fetch(zipUrl)
|
const response = await fetch(zipUrl)
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new Error(`HTTP error! status: ${response.status}`)
|
throw new Error(`HTTP error! status: ${response.status}`)
|
||||||
}
|
}
|
||||||
|
111
|
||||||
const zipBlob = await response.blob()
|
const zipBlob = await response.blob()
|
||||||
progress.value = 30
|
progress.value = 30
|
||||||
|
console.log(`加载压缩包: ${zipUrl}, 大小: ${(zipBlob.size / 1024).toFixed(2)} KB`);
|
||||||
const zip = new JSZip()
|
const zip = new JSZip()
|
||||||
const zipData = await zip.loadAsync(zipBlob)
|
const zipData = await zip.loadAsync(zipBlob)
|
||||||
progress.value = 50
|
progress.value = 50
|
||||||
|
console.log(`压缩包加载完成,包含文件: ${Object.keys(zipData.files).length} 个文件`);
|
||||||
|
|
||||||
const webpFiles = Object.keys(zipData.files)
|
const webpFiles = Object.keys(zipData.files)
|
||||||
.filter(name => !zipData.files[name].dir && (name.endsWith('.webp') || name.endsWith('.png') || name.endsWith('.jpg')))
|
.filter(name => !zipData.files[name].dir && (name.endsWith('.webp') || name.endsWith('.png') || name.endsWith('.jpg')))
|
||||||
@ -100,7 +102,7 @@ const loadImageSequence = async (zipUrl: string) => {
|
|||||||
images.value = imageUrls
|
images.value = imageUrls
|
||||||
await loadAllImages()
|
await loadAllImages()
|
||||||
loading.value = false
|
loading.value = false
|
||||||
if (props.log) console.log(`成功加载并转换 ${loadedImages.value.length} 帧 ImageData`)
|
if (props.log) console.log(`成功加载 ${imageUrls.length} 张图片`)
|
||||||
|
|
||||||
if (props.autoPlay) {
|
if (props.autoPlay) {
|
||||||
startAnimation()
|
startAnimation()
|
||||||
@ -113,87 +115,53 @@ const loadImageSequence = async (zipUrl: string) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// =================================================================
|
// loadAllImages 函数 (不变)
|
||||||
// 核心优化区域 1: loadAllImages 函数
|
|
||||||
// 将图片转换为 ImageData
|
|
||||||
// =================================================================
|
|
||||||
const loadAllImages = async () => {
|
const loadAllImages = async () => {
|
||||||
const imageDataArray: ImageData[] = [];
|
const imageElements: HTMLImageElement[] = []
|
||||||
// 创建一个离屏Canvas用于转换
|
|
||||||
const offscreenCanvas = document.createElement('canvas');
|
|
||||||
const offscreenCtx = offscreenCanvas.getContext('2d', { willReadFrequently: true });
|
|
||||||
|
|
||||||
if (!offscreenCtx) {
|
|
||||||
throw new Error("无法创建离屏Canvas上下文用于图片转换");
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let i = 0; i < images.value.length; i++) {
|
for (let i = 0; i < images.value.length; i++) {
|
||||||
const img = new Image();
|
const img = new Image()
|
||||||
img.src = images.value[i];
|
img.src = images.value[i]
|
||||||
|
|
||||||
await new Promise<void>((resolve, reject) => {
|
await new Promise<void>((resolve, reject) => {
|
||||||
img.onload = () => {
|
img.onload = () => {
|
||||||
// 第一张图片决定了Canvas的尺寸
|
|
||||||
if (i === 0) {
|
if (i === 0) {
|
||||||
canvasWidth.value = props.width || img.width;
|
canvasWidth.value = props.width || img.width
|
||||||
canvasHeight.value = props.height || img.height;
|
canvasHeight.value = props.height || img.height
|
||||||
// 设置离屏Canvas的尺寸
|
|
||||||
offscreenCanvas.width = canvasWidth.value;
|
|
||||||
offscreenCanvas.height = canvasHeight.value;
|
|
||||||
}
|
}
|
||||||
|
resolve()
|
||||||
|
}
|
||||||
|
img.onerror = reject
|
||||||
|
})
|
||||||
|
|
||||||
// 将图片绘制到离屏Canvas上
|
imageElements.push(img)
|
||||||
offscreenCtx.clearRect(0, 0, offscreenCanvas.width, offscreenCanvas.height);
|
progress.value = 80 + (i + 1) / images.value.length * 20
|
||||||
offscreenCtx.drawImage(img, 0, 0, offscreenCanvas.width, offscreenCanvas.height);
|
|
||||||
|
|
||||||
// 从离屏Canvas中提取ImageData
|
|
||||||
const imageData = offscreenCtx.getImageData(0, 0, offscreenCanvas.width, offscreenCanvas.height);
|
|
||||||
imageDataArray.push(imageData);
|
|
||||||
|
|
||||||
// 【内存优化】: 转换完成后,立即释放Blob URL,因为它不再需要
|
|
||||||
URL.revokeObjectURL(img.src);
|
|
||||||
|
|
||||||
resolve();
|
|
||||||
};
|
|
||||||
img.onerror = reject;
|
|
||||||
});
|
|
||||||
|
|
||||||
progress.value = 80 + (i + 1) / images.value.length * 20;
|
|
||||||
}
|
}
|
||||||
|
loadedImages.value = imageElements
|
||||||
|
}
|
||||||
|
|
||||||
loadedImages.value = imageDataArray;
|
// drawFrame 函数 (不变)
|
||||||
// 【内存优化】: 清空临时的URL数组
|
|
||||||
images.value = [];
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// =================================================================
|
|
||||||
// 核心优化区域 2: drawFrame 函数
|
|
||||||
// 使用 putImageData 进行绘制
|
|
||||||
// =================================================================
|
|
||||||
const drawFrame = (frameIndex: number) => {
|
const drawFrame = (frameIndex: number) => {
|
||||||
if (!canvasRef.value || !loadedImages.value.length) return;
|
if (!canvasRef.value || !loadedImages.value.length) return
|
||||||
const safeIndex = Math.max(0, Math.min(frameIndex, loadedImages.value.length - 1));
|
const safeIndex = Math.max(0, Math.min(frameIndex, loadedImages.value.length - 1))
|
||||||
|
|
||||||
// if (props.log) {
|
if (props.log) {
|
||||||
// console.log(`绘制帧: ${safeIndex}`);
|
// console.log(`绘制帧: ${safeIndex}, 总帧数: ${loadedImages.value.length}`);
|
||||||
// }
|
|
||||||
|
|
||||||
const canvas = canvasRef.value;
|
|
||||||
const ctx = canvas.getContext('2d');
|
|
||||||
if (!ctx) return;
|
|
||||||
|
|
||||||
// 清空画布
|
|
||||||
// ctx.clearRect(0, 0, canvas.width, canvas.height); // putImageData会完全覆盖,所以clearRect可以省略
|
|
||||||
|
|
||||||
const imageData = loadedImages.value[safeIndex];
|
|
||||||
if (imageData) {
|
|
||||||
// 使用putImageData直接绘制像素数据,性能更高
|
|
||||||
ctx.putImageData(imageData, 0, 0);
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
// jumpToRule 函数 (不变)
|
const canvas = canvasRef.value
|
||||||
|
const ctx = canvas.getContext('2d')
|
||||||
|
if (!ctx) return
|
||||||
|
|
||||||
|
ctx.clearRect(0, 0, canvas.width, canvas.height)
|
||||||
|
const img = loadedImages.value[safeIndex]
|
||||||
|
if (img) {
|
||||||
|
ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// =================================================================
|
||||||
|
// 核心修复区域 1: jumpToRule 函数
|
||||||
|
// =================================================================
|
||||||
const jumpToRule = (ruleName: string) => {
|
const jumpToRule = (ruleName: string) => {
|
||||||
const ruleIndex = findRuleIndex(ruleName)
|
const ruleIndex = findRuleIndex(ruleName)
|
||||||
if (ruleIndex === -1) {
|
if (ruleIndex === -1) {
|
||||||
@ -217,6 +185,7 @@ const jumpToRule = (ruleName: string) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 【修复】: 如果规则是反向的,则从结束帧开始播放
|
||||||
const endFrame = targetRule.endFrame ?? (startFrame + targetRule.frame - 1);
|
const endFrame = targetRule.endFrame ?? (startFrame + targetRule.frame - 1);
|
||||||
currentFrame.value = targetRule.reverse ? endFrame : startFrame;
|
currentFrame.value = targetRule.reverse ? endFrame : startFrame;
|
||||||
|
|
||||||
@ -235,7 +204,9 @@ const jumpToRule = (ruleName: string) => {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// startAnimation 函数 (不变)
|
// =================================================================
|
||||||
|
// 核心修复区域 2: startAnimation 函数
|
||||||
|
// =================================================================
|
||||||
const startAnimation = () => {
|
const startAnimation = () => {
|
||||||
if (!props.rules.length || !loadedImages.value.length || isPlaying.value) return
|
if (!props.rules.length || !loadedImages.value.length || isPlaying.value) return
|
||||||
|
|
||||||
@ -254,6 +225,7 @@ const startAnimation = () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 【修复】: 如果规则是反向的,则从结束帧开始播放
|
||||||
const endFrame = currentRule.endFrame ?? (startFrame + currentRule.frame - 1);
|
const endFrame = currentRule.endFrame ?? (startFrame + currentRule.frame - 1);
|
||||||
currentFrame.value = currentRule.reverse ? endFrame : startFrame;
|
currentFrame.value = currentRule.reverse ? endFrame : startFrame;
|
||||||
|
|
||||||
@ -263,7 +235,9 @@ const startAnimation = () => {
|
|||||||
animate()
|
animate()
|
||||||
}
|
}
|
||||||
|
|
||||||
// animate 函数 (不变)
|
// =================================================================
|
||||||
|
// 核心修复区域 3: animate 函数
|
||||||
|
// =================================================================
|
||||||
const animate = () => {
|
const animate = () => {
|
||||||
if (!isPlaying.value || currentRuleIndex.value >= props.rules.length) {
|
if (!isPlaying.value || currentRuleIndex.value >= props.rules.length) {
|
||||||
animationId.value = undefined;
|
animationId.value = undefined;
|
||||||
@ -274,11 +248,12 @@ const animate = () => {
|
|||||||
|
|
||||||
const now = performance.now();
|
const now = performance.now();
|
||||||
const currentRule = props.rules[currentRuleIndex.value];
|
const currentRule = props.rules[currentRuleIndex.value];
|
||||||
const frameDuration = currentRule.duration ?? 33;
|
const frameDuration = currentRule.duration ?? 33; // 默认约30fps
|
||||||
|
|
||||||
if (now - lastFrameTime.value >= frameDuration) {
|
if (now - lastFrameTime.value >= frameDuration) {
|
||||||
lastFrameTime.value = now - (now - lastFrameTime.value) % frameDuration;
|
lastFrameTime.value = now - (now - lastFrameTime.value) % frameDuration;
|
||||||
|
|
||||||
|
// 1. 计算当前规则的帧范围
|
||||||
let startFrame = currentRule.startFrame ?? 0;
|
let startFrame = currentRule.startFrame ?? 0;
|
||||||
if (currentRule.startFrame === undefined) {
|
if (currentRule.startFrame === undefined) {
|
||||||
for (let i = 0; i < currentRuleIndex.value; i++) {
|
for (let i = 0; i < currentRuleIndex.value; i++) {
|
||||||
@ -286,53 +261,79 @@ const animate = () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
const endFrame = currentRule.endFrame ?? (startFrame + currentRule.frame - 1);
|
const endFrame = currentRule.endFrame ?? (startFrame + currentRule.frame - 1);
|
||||||
|
|
||||||
|
// 2. 计算下一帧
|
||||||
let nextFrame = currentFrame.value + (currentRule.reverse ? -1 : 1);
|
let nextFrame = currentFrame.value + (currentRule.reverse ? -1 : 1);
|
||||||
|
|
||||||
|
// 3. 检查是否超出当前规则的边界
|
||||||
const isEndOfRuleSegment = currentRule.reverse ? (nextFrame < startFrame) : (nextFrame > endFrame);
|
const isEndOfRuleSegment = currentRule.reverse ? (nextFrame < startFrame) : (nextFrame > endFrame);
|
||||||
|
|
||||||
if (isEndOfRuleSegment) {
|
if (isEndOfRuleSegment) {
|
||||||
|
// 到达边界,完成了一轮循环
|
||||||
currentLoopCount.value++;
|
currentLoopCount.value++;
|
||||||
|
|
||||||
const isRuleFinished = currentRule.loop > 0 && currentLoopCount.value >= currentRule.loop;
|
const isRuleFinished = currentRule.loop > 0 && currentLoopCount.value >= currentRule.loop;
|
||||||
|
|
||||||
if (isRuleFinished) {
|
if (isRuleFinished) {
|
||||||
|
// 规则已完成,准备过渡到下一条
|
||||||
if (pendingJumpTo.value) {
|
if (pendingJumpTo.value) {
|
||||||
const targetRule = pendingJumpTo.value;
|
const targetRule = pendingJumpTo.value;
|
||||||
pendingJumpTo.value = undefined;
|
pendingJumpTo.value = undefined;
|
||||||
jumpToRule(targetRule);
|
jumpToRule(targetRule);
|
||||||
return;
|
return; // jumpToRule会启动新的animate, 故此处直接返回
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currentRule.pauseAfter) {
|
if (currentRule.pauseAfter) {
|
||||||
isPaused.value = true;
|
isPaused.value = true;
|
||||||
isPlaying.value = false;
|
isPlaying.value = false;
|
||||||
if(props.log) console.log(`规则 "${currentRule.name}" 完成,暂停等待跳转指令`);
|
if(props.log) console.log(`规则 "${currentRule.name}" 完成,暂停等待跳转指令`);
|
||||||
|
// 定格在当前规则的最后一帧
|
||||||
drawFrame(currentRule.reverse ? startFrame : endFrame);
|
drawFrame(currentRule.reverse ? startFrame : endFrame);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 自动进入下一个规则
|
||||||
currentRuleIndex.value++;
|
currentRuleIndex.value++;
|
||||||
currentLoopCount.value = 0;
|
currentLoopCount.value = 0;
|
||||||
|
|
||||||
if (currentRuleIndex.value >= props.rules.length) {
|
if (currentRuleIndex.value >= props.rules.length) {
|
||||||
|
// 所有规则播放完毕
|
||||||
isPlaying.value = false;
|
isPlaying.value = false;
|
||||||
if(props.log) console.log('所有规则播放完毕');
|
if(props.log) console.log('所有规则播放完毕');
|
||||||
|
// 定格在最后一个规则的最后一帧
|
||||||
drawFrame(currentRule.reverse ? startFrame : endFrame);
|
drawFrame(currentRule.reverse ? startFrame : endFrame);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 【修复】: 为下一个规则设置正确的起始帧
|
||||||
const nextRule = props.rules[currentRuleIndex.value];
|
const nextRule = props.rules[currentRuleIndex.value];
|
||||||
let nextRuleStartFrame = nextRule.startFrame ?? 0;
|
let nextRuleStartFrame = nextRule.startFrame ?? 0;
|
||||||
if (nextRule.startFrame === undefined) {
|
if (nextRule.startFrame === undefined) {
|
||||||
|
// 使用刚结束的规则的结束帧的下一帧作为起点
|
||||||
nextRuleStartFrame = endFrame + 1;
|
nextRuleStartFrame = endFrame + 1;
|
||||||
}
|
}
|
||||||
const nextRuleEndFrame = nextRule.endFrame ?? (nextRuleStartFrame + nextRule.frame - 1);
|
const nextRuleEndFrame = nextRule.endFrame ?? (nextRuleStartFrame + nextRule.frame - 1);
|
||||||
|
|
||||||
|
// 根据新规则的 reverse 属性设置 currentFrame
|
||||||
currentFrame.value = nextRule.reverse ? nextRuleEndFrame : nextRuleStartFrame;
|
currentFrame.value = nextRule.reverse ? nextRuleEndFrame : nextRuleStartFrame;
|
||||||
if(props.log) console.log(`进入下一规则 "${nextRule.name}", 实际开始帧: ${currentFrame.value}`);
|
if(props.log) console.log(`进入下一规则 "${nextRule.name}", 实际开始帧: ${currentFrame.value}`);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
// 规则未完成(无限循环或循环次数未到),循环播放
|
||||||
|
// 【修复】: 重置循环时,也需要根据 reverse 属性设置正确的帧
|
||||||
currentFrame.value = currentRule.reverse ? endFrame : startFrame;
|
currentFrame.value = currentRule.reverse ? endFrame : startFrame;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// 仍在当前规则内,正常播放
|
||||||
currentFrame.value = nextFrame;
|
currentFrame.value = nextFrame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 4. 绘制计算出的最终帧
|
||||||
drawFrame(currentFrame.value);
|
drawFrame(currentFrame.value);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// stopAnimation, resetAnimation, etc. (不变)
|
// stopAnimation 函数 (不变)
|
||||||
const stopAnimation = () => {
|
const stopAnimation = () => {
|
||||||
isPlaying.value = false
|
isPlaying.value = false
|
||||||
isPaused.value = false
|
isPaused.value = false
|
||||||
@ -342,6 +343,7 @@ const stopAnimation = () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// resetAnimation 函数 (不变)
|
||||||
const resetAnimation = () => {
|
const resetAnimation = () => {
|
||||||
stopAnimation()
|
stopAnimation()
|
||||||
currentRuleIndex.value = 0
|
currentRuleIndex.value = 0
|
||||||
@ -353,6 +355,7 @@ const resetAnimation = () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// togglePlayback, setJumpTarget, jumpToRuleImmediately, resumeFromPause (不变)
|
||||||
const togglePlayback = () => {
|
const togglePlayback = () => {
|
||||||
if (isPlaying.value) {
|
if (isPlaying.value) {
|
||||||
stopAnimation()
|
stopAnimation()
|
||||||
@ -382,12 +385,13 @@ const resumeFromPause = () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// watch 和 onMounted (清理逻辑现在更加健壮)
|
|
||||||
|
// watch 和 onMounted (微调清理逻辑)
|
||||||
watch(() => props.url, (newUrl) => {
|
watch(() => props.url, (newUrl) => {
|
||||||
if (newUrl) {
|
if (newUrl) {
|
||||||
stopAnimation()
|
stopAnimation()
|
||||||
// 由于Blob URL在加载时已释放,这里主要是清空状态
|
// 清理旧的图片数据
|
||||||
images.value.forEach(url => URL.revokeObjectURL(url)); // 以防加载中途切换URL
|
images.value.forEach(url => URL.revokeObjectURL(url));
|
||||||
images.value = [];
|
images.value = [];
|
||||||
loadedImages.value = [];
|
loadedImages.value = [];
|
||||||
loadImageSequence(newUrl)
|
loadImageSequence(newUrl)
|
||||||
@ -405,7 +409,7 @@ watch(() => props.rules, () => {
|
|||||||
|
|
||||||
onBeforeUnmount(() => {
|
onBeforeUnmount(() => {
|
||||||
stopAnimation();
|
stopAnimation();
|
||||||
// 由于images数组在加载成功后会被清空,此处的forEach可能为空操作,但作为安全保障是好的。
|
// 组件卸载时,确保释放所有Blob URL
|
||||||
images.value.forEach(url => URL.revokeObjectURL(url));
|
images.value.forEach(url => URL.revokeObjectURL(url));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
168
src/composables/AniLoader.vue
Normal file
168
src/composables/AniLoader.vue
Normal file
@ -0,0 +1,168 @@
|
|||||||
|
|
||||||
|
<!-- AniLoader.vue -->
|
||||||
|
<template>
|
||||||
|
<!-- This component is renderless; it just provides context -->
|
||||||
|
<slot :is-all-loaded="isAllLoaded" :progress="overallProgress"></slot>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref, provide, onMounted, computed, watch } from 'vue'
|
||||||
|
import JSZip from 'jszip'
|
||||||
|
import { animationStore, AnimationStoreKey, type AnimationData } from './animation-store'
|
||||||
|
|
||||||
|
interface Asset {
|
||||||
|
id: string; // A unique identifier for the animation, e.g., 'character-jump'
|
||||||
|
url: string; // The URL to the .zip file
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
assets: Asset[];
|
||||||
|
autoLoad?: boolean; // Start loading immediately on mount
|
||||||
|
}
|
||||||
|
|
||||||
|
const props = withDefaults(defineProps<Props>(), {
|
||||||
|
autoLoad: true,
|
||||||
|
})
|
||||||
|
|
||||||
|
const totalAssets = ref(props.assets.length);
|
||||||
|
const loadedAssetsCount = ref(0);
|
||||||
|
|
||||||
|
// Provide the reactive store to all descendant components
|
||||||
|
provide(AnimationStoreKey, animationStore)
|
||||||
|
|
||||||
|
const isAllLoaded = computed(() => {
|
||||||
|
if (totalAssets.value === 0) return true;
|
||||||
|
// Check if every asset in the store that should be loaded is actually loaded.
|
||||||
|
return props.assets.every(asset => animationStore.get(asset.id)?.status === 'loaded');
|
||||||
|
});
|
||||||
|
|
||||||
|
const overallProgress = computed(() => {
|
||||||
|
if (totalAssets.value === 0) return 100;
|
||||||
|
let totalProgress = 0;
|
||||||
|
for (const asset of props.assets) {
|
||||||
|
totalProgress += animationStore.get(asset.id)?.progress ?? 0;
|
||||||
|
}
|
||||||
|
return totalProgress / totalAssets.value;
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
const loadAndProcessAnimation = async (id: string, url: string) => {
|
||||||
|
// Prevent re-loading if already loaded or loading
|
||||||
|
if (animationStore.has(id) && animationStore.get(id)?.status !== 'error') {
|
||||||
|
if(animationStore.get(id)?.status === 'loaded') {
|
||||||
|
loadedAssetsCount.value++;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set initial state in the store
|
||||||
|
animationStore.set(id, {
|
||||||
|
status: 'loading',
|
||||||
|
frames: [],
|
||||||
|
width: 0,
|
||||||
|
height: 0,
|
||||||
|
totalFrames: 0,
|
||||||
|
progress: 0,
|
||||||
|
});
|
||||||
|
|
||||||
|
const updateProgress = (p: number) => {
|
||||||
|
const data = animationStore.get(id);
|
||||||
|
if (data) data.progress = p;
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await fetch(url)
|
||||||
|
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`)
|
||||||
|
updateProgress(15);
|
||||||
|
|
||||||
|
const zipBlob = await response.blob()
|
||||||
|
const zip = new JSZip()
|
||||||
|
const zipData = await zip.loadAsync(zipBlob)
|
||||||
|
updateProgress(30);
|
||||||
|
|
||||||
|
const imageFiles = Object.keys(zipData.files)
|
||||||
|
.filter(name => !zipData.files[name].dir && /\.(webp|png|jpg)$/i.test(name))
|
||||||
|
.sort((a, b) => {
|
||||||
|
const numA = parseInt(a.match(/(\d+)\.\w+$/)?.[1] || '0')
|
||||||
|
const numB = parseInt(b.match(/(\d+)\.\w+$/)?.[1] || '0')
|
||||||
|
return numA - numB
|
||||||
|
})
|
||||||
|
|
||||||
|
if (imageFiles.length === 0) throw new Error('No supported image files found in ZIP.')
|
||||||
|
|
||||||
|
const blobUrls = await Promise.all(
|
||||||
|
imageFiles.map(name => zipData.files[name].async('blob').then(URL.createObjectURL))
|
||||||
|
);
|
||||||
|
updateProgress(50);
|
||||||
|
|
||||||
|
const imageDataArray: ImageData[] = [];
|
||||||
|
const offscreenCanvas = document.createElement('canvas');
|
||||||
|
const offscreenCtx = offscreenCanvas.getContext('2d', { willReadFrequently: true });
|
||||||
|
if (!offscreenCtx) throw new Error("Failed to create offscreen canvas context.");
|
||||||
|
|
||||||
|
let canvasWidth = 0, canvasHeight = 0;
|
||||||
|
|
||||||
|
for (let i = 0; i < blobUrls.length; i++) {
|
||||||
|
const img = new Image();
|
||||||
|
img.src = blobUrls[i];
|
||||||
|
await new Promise<void>((resolve, reject) => {
|
||||||
|
img.onload = () => {
|
||||||
|
if (i === 0) {
|
||||||
|
canvasWidth = img.width;
|
||||||
|
canvasHeight = img.height;
|
||||||
|
offscreenCanvas.width = canvasWidth;
|
||||||
|
offscreenCanvas.height = canvasHeight;
|
||||||
|
}
|
||||||
|
offscreenCtx.clearRect(0, 0, canvasWidth, canvasHeight);
|
||||||
|
offscreenCtx.drawImage(img, 0, 0, canvasWidth, canvasHeight);
|
||||||
|
imageDataArray.push(offscreenCtx.getImageData(0, 0, canvasWidth, canvasHeight));
|
||||||
|
URL.revokeObjectURL(img.src);
|
||||||
|
resolve();
|
||||||
|
};
|
||||||
|
img.onerror = reject;
|
||||||
|
});
|
||||||
|
updateProgress(50 + (i + 1) / blobUrls.length * 50);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update store with final data
|
||||||
|
animationStore.set(id, {
|
||||||
|
status: 'loaded',
|
||||||
|
frames: imageDataArray,
|
||||||
|
width: canvasWidth,
|
||||||
|
height: canvasHeight,
|
||||||
|
totalFrames: imageDataArray.length,
|
||||||
|
progress: 100
|
||||||
|
});
|
||||||
|
loadedAssetsCount.value++;
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
const message = err instanceof Error ? err.message : 'Unknown loading error';
|
||||||
|
console.error(`Failed to load animation "${id}":`, err);
|
||||||
|
animationStore.set(id, {
|
||||||
|
status: 'error',
|
||||||
|
error: message,
|
||||||
|
frames: [], width: 0, height: 0, totalFrames: 0, progress: 0
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const loadAll = () => {
|
||||||
|
props.assets.forEach(asset => loadAndProcessAnimation(asset.id, asset.url));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Watch for changes in assets prop to dynamically load new ones
|
||||||
|
watch(() => props.assets, (newAssets) => {
|
||||||
|
totalAssets.value = newAssets.length;
|
||||||
|
if (props.autoLoad) {
|
||||||
|
loadAll();
|
||||||
|
}
|
||||||
|
}, { deep: true, immediate: true });
|
||||||
|
|
||||||
|
|
||||||
|
// Expose the loader function for manual triggering
|
||||||
|
defineExpose({
|
||||||
|
loadAll,
|
||||||
|
isAllLoaded,
|
||||||
|
animationStore
|
||||||
|
});
|
||||||
|
</script>
|
||||||
302
src/composables/AniPlayer.vue
Normal file
302
src/composables/AniPlayer.vue
Normal file
@ -0,0 +1,302 @@
|
|||||||
|
<!-- AniPlayer.vue -->
|
||||||
|
<template>
|
||||||
|
<div class="ani-ele">
|
||||||
|
<div v-if="loading">Loading Animation...</div>
|
||||||
|
<div v-else-if="error">{{ error }}</div>
|
||||||
|
<canvas v-else ref="canvasRef" :width="canvasWidth" :height="canvasHeight"></canvas>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref, watch, onBeforeUnmount, inject, computed, nextTick } from 'vue'
|
||||||
|
import { AnimationStoreKey } from './animation-store'
|
||||||
|
|
||||||
|
// Rules interface remains the same
|
||||||
|
interface AnimationRule {
|
||||||
|
name: string; frame: number; duration?: number; loop: number;
|
||||||
|
startFrame?: number; endFrame?: number; reverse?: boolean;
|
||||||
|
pauseAfter?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
animationId: string; // The ID to look up in the store
|
||||||
|
rules: AnimationRule[];
|
||||||
|
width?: number; // Optional override for width
|
||||||
|
height?: number; // Optional override for height
|
||||||
|
autoPlay?: boolean;
|
||||||
|
log?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
const props = withDefaults(defineProps<Props>(), {
|
||||||
|
autoPlay: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Inject the central store
|
||||||
|
const animationStore = inject(AnimationStoreKey);
|
||||||
|
if (!animationStore) {
|
||||||
|
throw new Error("AniPlayer must be used within an AniLoader provider.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- Reactive state derived from the store ---
|
||||||
|
const animationData = computed(() => animationStore.get(props.animationId));
|
||||||
|
|
||||||
|
const loading = computed(() => !animationData.value || animationData.value.status === 'loading');
|
||||||
|
const error = computed(() => animationData.value?.status === 'error' ? animationData.value.error : '');
|
||||||
|
const loadedImages = computed(() => animationData.value?.frames ?? []);
|
||||||
|
|
||||||
|
// Canvas dimensions are derived from loaded data but can be overridden by props
|
||||||
|
const canvasWidth = computed(() => props.width ?? animationData.value?.width ?? 300);
|
||||||
|
const canvasHeight = computed(() => props.height ?? animationData.value?.height ?? 150);
|
||||||
|
|
||||||
|
|
||||||
|
// --- Playback State (mostly unchanged) ---
|
||||||
|
const canvasRef = ref<HTMLCanvasElement>()
|
||||||
|
const isPlaying = ref(false)
|
||||||
|
const isPaused = ref(false)
|
||||||
|
const currentRuleIndex = ref(0)
|
||||||
|
const currentFrame = ref(0)
|
||||||
|
const currentLoopCount = ref(0)
|
||||||
|
const animationId = ref<number>()
|
||||||
|
const lastFrameTime = ref(0)
|
||||||
|
const pendingJumpTo = ref<string>()
|
||||||
|
|
||||||
|
// --- Core Logic (unchanged, but now operates on computed refs) ---
|
||||||
|
|
||||||
|
const drawFrame = (frameIndex: number) => {
|
||||||
|
if (!canvasRef.value || loadedImages.value.length === 0) return;
|
||||||
|
const safeIndex = Math.max(0, Math.min(frameIndex, loadedImages.value.length - 1));
|
||||||
|
const ctx = canvasRef.value.getContext('2d');
|
||||||
|
if (!ctx) return;
|
||||||
|
const imageData = loadedImages.value[safeIndex];
|
||||||
|
if (imageData) {
|
||||||
|
ctx.putImageData(imageData, 0, 0);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const jumpToRule = (ruleName: string) => { /* ... (code is identical to previous version) ... */
|
||||||
|
const ruleIndex = findRuleIndex(ruleName)
|
||||||
|
if (ruleIndex === -1) {
|
||||||
|
console.warn(`未找到名为 "${ruleName}" 的规则`)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if (props.log) console.log(`跳转到规则 "${ruleName}" (索引: ${ruleIndex})`);
|
||||||
|
|
||||||
|
if (isPlaying.value) {
|
||||||
|
stopAnimation()
|
||||||
|
}
|
||||||
|
|
||||||
|
currentRuleIndex.value = ruleIndex
|
||||||
|
currentLoopCount.value = 0
|
||||||
|
const targetRule = props.rules[ruleIndex]
|
||||||
|
|
||||||
|
let startFrame = targetRule.startFrame ?? 0
|
||||||
|
if (targetRule.startFrame === undefined) {
|
||||||
|
for (let i = 0; i < ruleIndex; i++) {
|
||||||
|
startFrame += props.rules[i].frame
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const endFrame = targetRule.endFrame ?? (startFrame + targetRule.frame - 1);
|
||||||
|
currentFrame.value = targetRule.reverse ? endFrame : startFrame;
|
||||||
|
|
||||||
|
if (props.log) {
|
||||||
|
console.log(`跳转到规则 "${ruleName}", 实际开始帧: ${currentFrame.value}, 规则帧范围: ${startFrame} - ${endFrame}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
drawFrame(currentFrame.value)
|
||||||
|
isPaused.value = false
|
||||||
|
pendingJumpTo.value = undefined
|
||||||
|
|
||||||
|
isPlaying.value = true
|
||||||
|
lastFrameTime.value = performance.now()
|
||||||
|
animate()
|
||||||
|
|
||||||
|
return true
|
||||||
|
};
|
||||||
|
|
||||||
|
const startAnimation = () => { /* ... (code is identical to previous version) ... */
|
||||||
|
if (!props.rules.length || loadedImages.value.length === 0 || isPlaying.value) return
|
||||||
|
|
||||||
|
isPlaying.value = true
|
||||||
|
isPaused.value = false
|
||||||
|
|
||||||
|
if (currentRuleIndex.value >= props.rules.length) {
|
||||||
|
resetAnimation()
|
||||||
|
}
|
||||||
|
|
||||||
|
const currentRule = props.rules[currentRuleIndex.value]
|
||||||
|
let startFrame = currentRule.startFrame ?? 0
|
||||||
|
if (currentRule.startFrame === undefined) {
|
||||||
|
for (let i = 0; i < currentRuleIndex.value; i++) {
|
||||||
|
startFrame += props.rules[i].frame
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const endFrame = currentRule.endFrame ?? (startFrame + currentRule.frame - 1);
|
||||||
|
currentFrame.value = currentRule.reverse ? endFrame : startFrame;
|
||||||
|
|
||||||
|
if (props.log) console.log(`开始播放规则 "${currentRule.name}", 实际开始帧: ${currentFrame.value}`);
|
||||||
|
|
||||||
|
lastFrameTime.value = performance.now()
|
||||||
|
animate()
|
||||||
|
};
|
||||||
|
|
||||||
|
const animate = () => { /* ... (code is identical to previous version) ... */
|
||||||
|
if (!isPlaying.value || currentRuleIndex.value >= props.rules.length) {
|
||||||
|
animationId.value = undefined;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
animationId.value = requestAnimationFrame(animate);
|
||||||
|
|
||||||
|
const now = performance.now();
|
||||||
|
const currentRule = props.rules[currentRuleIndex.value];
|
||||||
|
const frameDuration = currentRule.duration ?? 33;
|
||||||
|
|
||||||
|
if (now - lastFrameTime.value >= frameDuration) {
|
||||||
|
lastFrameTime.value = now - (now - lastFrameTime.value) % frameDuration;
|
||||||
|
|
||||||
|
let startFrame = currentRule.startFrame ?? 0;
|
||||||
|
if (currentRule.startFrame === undefined) {
|
||||||
|
for (let i = 0; i < currentRuleIndex.value; i++) {
|
||||||
|
startFrame += props.rules[i].frame;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const endFrame = currentRule.endFrame ?? (startFrame + currentRule.frame - 1);
|
||||||
|
let nextFrame = currentFrame.value + (currentRule.reverse ? -1 : 1);
|
||||||
|
const isEndOfRuleSegment = currentRule.reverse ? (nextFrame < startFrame) : (nextFrame > endFrame);
|
||||||
|
|
||||||
|
if (isEndOfRuleSegment) {
|
||||||
|
currentLoopCount.value++;
|
||||||
|
const isRuleFinished = currentRule.loop > 0 && currentLoopCount.value >= currentRule.loop;
|
||||||
|
if (isRuleFinished) {
|
||||||
|
if (pendingJumpTo.value) {
|
||||||
|
const targetRule = pendingJumpTo.value;
|
||||||
|
pendingJumpTo.value = undefined;
|
||||||
|
jumpToRule(targetRule);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (currentRule.pauseAfter) {
|
||||||
|
isPaused.value = true;
|
||||||
|
isPlaying.value = false;
|
||||||
|
if (props.log) console.log(`规则 "${currentRule.name}" 完成,暂停等待跳转指令`);
|
||||||
|
drawFrame(currentRule.reverse ? startFrame : endFrame);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
currentRuleIndex.value++;
|
||||||
|
currentLoopCount.value = 0;
|
||||||
|
if (currentRuleIndex.value >= props.rules.length) {
|
||||||
|
isPlaying.value = false;
|
||||||
|
if (props.log) console.log('所有规则播放完毕');
|
||||||
|
drawFrame(currentRule.reverse ? startFrame : endFrame);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const nextRule = props.rules[currentRuleIndex.value];
|
||||||
|
let nextRuleStartFrame = nextRule.startFrame ?? 0;
|
||||||
|
if (nextRule.startFrame === undefined) {
|
||||||
|
nextRuleStartFrame = endFrame + 1;
|
||||||
|
}
|
||||||
|
const nextRuleEndFrame = nextRule.endFrame ?? (nextRuleStartFrame + nextRule.frame - 1);
|
||||||
|
currentFrame.value = nextRule.reverse ? nextRuleEndFrame : nextRuleStartFrame;
|
||||||
|
if (props.log) console.log(`进入下一规则 "${nextRule.name}", 实际开始帧: ${currentFrame.value}`);
|
||||||
|
} else {
|
||||||
|
currentFrame.value = currentRule.reverse ? endFrame : startFrame;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
currentFrame.value = nextFrame;
|
||||||
|
}
|
||||||
|
drawFrame(currentFrame.value);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const stopAnimation = () => { /* ... (code is identical) ... */
|
||||||
|
isPlaying.value = false
|
||||||
|
isPaused.value = false
|
||||||
|
if (animationId.value) {
|
||||||
|
cancelAnimationFrame(animationId.value)
|
||||||
|
animationId.value = undefined
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const resetAnimation = () => { /* ... (code is identical) ... */
|
||||||
|
stopAnimation()
|
||||||
|
currentRuleIndex.value = 0
|
||||||
|
currentFrame.value = 0
|
||||||
|
currentLoopCount.value = 0
|
||||||
|
pendingJumpTo.value = undefined
|
||||||
|
if (loadedImages.value.length > 0) {
|
||||||
|
drawFrame(0)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const findRuleIndex = (ruleName: string): number => { /* ... (code is identical) ... */
|
||||||
|
return props.rules.findIndex(rule => rule.name === ruleName)
|
||||||
|
};
|
||||||
|
// Other exposed methods...
|
||||||
|
const togglePlayback = () => { if (isPlaying.value) { stopAnimation() } else { startAnimation() } };
|
||||||
|
const setJumpTarget = (ruleName: string) => { if (isPaused.value) { jumpToRule(ruleName) } else { pendingJumpTo.value = ruleName } };
|
||||||
|
const jumpToRuleImmediately = (ruleName: string) => { return jumpToRule(ruleName) };
|
||||||
|
const resumeFromPause = () => { if (isPaused.value) { isPaused.value = false; isPlaying.value = true; lastFrameTime.value = performance.now(); animate() } };
|
||||||
|
|
||||||
|
|
||||||
|
// Watch for the data to become available to start the animation
|
||||||
|
watch(loadedImages, (newFrames, oldFrames) => {
|
||||||
|
// Only trigger if we're transitioning from 'no frames' to 'having frames'
|
||||||
|
if (newFrames.length > 0 && oldFrames.length === 0) {
|
||||||
|
resetAnimation();
|
||||||
|
// Use nextTick to ensure canvas is rendered before drawing
|
||||||
|
nextTick(() => {
|
||||||
|
drawFrame(0); // Draw the first frame immediately
|
||||||
|
if (props.autoPlay) {
|
||||||
|
startAnimation();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Watch for rules changing
|
||||||
|
watch(() => props.rules, () => {
|
||||||
|
if (loadedImages.value.length > 0) {
|
||||||
|
resetAnimation();
|
||||||
|
if (props.autoPlay) {
|
||||||
|
startAnimation();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, { deep: true });
|
||||||
|
|
||||||
|
onBeforeUnmount(() => {
|
||||||
|
stopAnimation();
|
||||||
|
});
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
// Expose control methods
|
||||||
|
play: startAnimation,
|
||||||
|
pause: stopAnimation,
|
||||||
|
reset: resetAnimation,
|
||||||
|
toggle: togglePlayback,
|
||||||
|
resume: resumeFromPause,
|
||||||
|
jumpTo: jumpToRuleImmediately,
|
||||||
|
setJumpTarget,
|
||||||
|
drawFrame,
|
||||||
|
// Expose state
|
||||||
|
isPlaying,
|
||||||
|
isPaused,
|
||||||
|
currentFrame,
|
||||||
|
getCurrentRule: () => props.rules[currentRuleIndex.value],
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.ani-ele {
|
||||||
|
/* Add styling for loading/error states if desired */
|
||||||
|
min-height: 100px;
|
||||||
|
/* Example */
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
canvas {
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
object-fit: contain;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
23
src/composables/animation-store.ts
Normal file
23
src/composables/animation-store.ts
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
// src/composables/animation-store.ts (or wherever you prefer)
|
||||||
|
import { reactive } from 'vue'
|
||||||
|
import type { InjectionKey } from 'vue'
|
||||||
|
|
||||||
|
// Defines the data structure for a single loaded animation
|
||||||
|
export interface AnimationData {
|
||||||
|
status: 'idle' | 'loading' | 'loaded' | 'error';
|
||||||
|
frames: ImageData[];
|
||||||
|
width: number;
|
||||||
|
height: number;
|
||||||
|
totalFrames: number;
|
||||||
|
error?: string;
|
||||||
|
progress: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Defines the store, which is a map from a unique animation ID to its data
|
||||||
|
export type AnimationStore = Map<string, AnimationData>
|
||||||
|
|
||||||
|
// Create a reactive store instance
|
||||||
|
export const animationStore = reactive<AnimationStore>(new Map())
|
||||||
|
|
||||||
|
// Create a unique Symbol as the injection key. This is best practice.
|
||||||
|
export const AnimationStoreKey: InjectionKey<AnimationStore> = Symbol('AnimationStore')
|
||||||
@ -17,6 +17,7 @@ const sunEndEle = useTemplateRef('sun-ani-end');
|
|||||||
|
|
||||||
const wait = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));
|
const wait = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));
|
||||||
|
|
||||||
|
|
||||||
async function shoot() {
|
async function shoot() {
|
||||||
//sunEle.value?.jumpTo('天上飞')
|
//sunEle.value?.jumpTo('天上飞')
|
||||||
sunEle.value?.jumpTo('蓄力飞')
|
sunEle.value?.jumpTo('蓄力飞')
|
||||||
@ -126,9 +127,9 @@ function gameLoop(currentTime = 0) {
|
|||||||
giftPos.value = [null, null];
|
giftPos.value = [null, null];
|
||||||
giftShow.value = false;
|
giftShow.value = false;
|
||||||
lastTime = currentTime;
|
lastTime = currentTime;
|
||||||
if (giftProgress.value >= giftList.length || 1) {
|
if (giftProgress.value >= giftList.length ) {
|
||||||
// 游戏结束逻辑
|
// 游戏结束逻辑
|
||||||
console.log('游戏结束!');
|
console.log('游戏结束!耗时:', timeSpent.value / 1000, '秒');
|
||||||
gameEnd()
|
gameEnd()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -546,6 +547,7 @@ const leaderBoard = ref([
|
|||||||
])
|
])
|
||||||
|
|
||||||
const fmtTime = (time: number) => {
|
const fmtTime = (time: number) => {
|
||||||
|
time = Math.round(time);
|
||||||
// 将时间格式化为 mm:ss
|
// 将时间格式化为 mm:ss
|
||||||
const minutes = Math.floor(time / 60);
|
const minutes = Math.floor(time / 60);
|
||||||
const seconds = time % 60;
|
const seconds = time % 60;
|
||||||
@ -609,7 +611,7 @@ async function finishCollect() {
|
|||||||
|
|
||||||
<AniEle :url="assets.ani.下拉蓄力提示" ref="aniEle" :height="334" :width="337" :rules="[
|
<AniEle :url="assets.ani.下拉蓄力提示" ref="aniEle" :height="334" :width="337" :rules="[
|
||||||
{ name: '蓄力', frame: 241, loop: 2 },
|
{ name: '蓄力', frame: 241, loop: 2 },
|
||||||
]" class="abs arrow" style="bottom: 7%;width: 30vw;left: 35%;" @pointerdown="shoot" />
|
]" class="abs arrow" style="bottom: 7%;width: 30vw;left: 35%;" @pointerdown.once="shoot" />
|
||||||
|
|
||||||
|
|
||||||
<img class="cloud" src="../assets/game/云.png" v-for="c in [
|
<img class="cloud" src="../assets/game/云.png" v-for="c in [
|
||||||
@ -712,7 +714,7 @@ async function finishCollect() {
|
|||||||
]" style="width: 100%; height: auto;" />
|
]" style="width: 100%; height: auto;" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<img src="../assets/game/完成收集.png" alt="" v-if="showScore" class="finish-collect abs" @click="finishCollect"
|
<img src="../assets/game/完成收集.png" alt="" v-if="showScore" class="finish-collect abs" @click.once="finishCollect"
|
||||||
style="bottom: 8%;left: 33%;width: 34vw;animation: scale-in 0.3s ease-out;">
|
style="bottom: 8%;left: 33%;width: 34vw;animation: scale-in 0.3s ease-out;">
|
||||||
|
|
||||||
|
|
||||||
@ -736,6 +738,27 @@ async function finishCollect() {
|
|||||||
<img src="../assets/game/再玩一次.png" alt="" class="abs"
|
<img src="../assets/game/再玩一次.png" alt="" class="abs"
|
||||||
style="width: 34vw;bottom: -19%;left: 51%;animation: last-btn-in 0.3s ease-out forwards; animation-delay: 200ms;">
|
style="width: 34vw;bottom: -19%;left: 51%;animation: last-btn-in 0.3s ease-out forwards; animation-delay: 200ms;">
|
||||||
|
|
||||||
|
<div class="time-spent abs" style="left: 10%; top:44%;width: 24%; display: flex;
|
||||||
|
align-items: center; flex-direction: column;">
|
||||||
|
<div class="line-1"
|
||||||
|
style="display: flex; align-items: center; gap: 1vw; animation: line-in 0.5s ease-out 0.6s forwards;transform: translateX(-210%);;">
|
||||||
|
<div class="username" style="font-size: 2.9vw;">{{ userdata.username }}</div>
|
||||||
|
<div class="cost-info"
|
||||||
|
style="font-size: 2.9vw; color: white; display: flex;align-items: center;justify-content: center;background-color: black;padding: 0 1.2vw; height: 4.5vw; border-radius: 4vw;">
|
||||||
|
用时</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="time"
|
||||||
|
style="font-size: 9vw;animation: line-in 0.5s ease-out 0.8s forwards;transform: translateX(-210%);">
|
||||||
|
{{ fmtTime(timeSpent/1000) }}</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="region-area abs" style="left: 10%; top:30%;width: 24%;height: 10%;gap:2vw; display: flex;animation: line-in 0.5s ease-out 0.4s forwards;transform: translateX(-210%);
|
||||||
|
align-items: center; flex-direction: column;justify-content: center;">
|
||||||
|
<div class="region" style="width: 20vw; background-color: white;font-size: 3vw;text-align: center;height: 4.5vw;line-height: 4.5vw; border-radius: 4.5vw;">{{ userdata.region }}</div>
|
||||||
|
<div class="store" style="font-size: 2.8vw; color: gray;">{{ userdata.store }}</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
@ -812,7 +835,7 @@ async function finishCollect() {
|
|||||||
|
|
||||||
@keyframes line-in {
|
@keyframes line-in {
|
||||||
from {
|
from {
|
||||||
transform: translateX(-150%);
|
transform: translateX(-210%);
|
||||||
}
|
}
|
||||||
|
|
||||||
to {
|
to {
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import { regions, type RegionData, type Store } from '../data';
|
|||||||
import AniEle from '../components/AniEle.vue';
|
import AniEle from '../components/AniEle.vue';
|
||||||
|
|
||||||
const regionsPos = [
|
const regionsPos = [
|
||||||
{ w: 68.8, h: 68.8, l: -1, t: -4, src: assets.p1.大北区, tt: '大北区', trt: -13, ad: 6, key: '大北区' },
|
{ w: 68.8, h: 68.8, l: -1, t: 0, src: assets.p1.大北区, tt: '大北区', trt: -13, ad: 6, key: '大北区' },
|
||||||
{ w: 73.3, h: 73.3, l: 44, t: 20, src: assets.p1.大东区, tt: '大东区', ad: 3, key: '大东区' },
|
{ w: 73.3, h: 73.3, l: 44, t: 20, src: assets.p1.大东区, tt: '大东区', ad: 3, key: '大东区' },
|
||||||
{ w: 62.3, h: 63.7, l: -32, t: 72, src: assets.p1['大南区&免税'], tt: '大南区&免税', trt: 5, ad: 3, key: '大南区&免税' },
|
{ w: 62.3, h: 63.7, l: -32, t: 72, src: assets.p1['大南区&免税'], tt: '大南区&免税', trt: 5, ad: 3, key: '大南区&免税' },
|
||||||
{ w: 59.6, h: 59.6, l: -37, t: 15, src: assets.p1.大西区, tt: '大西区', ad: 5, key: '大西区' },
|
{ w: 59.6, h: 59.6, l: -37, t: 15, src: assets.p1.大西区, tt: '大西区', ad: 5, key: '大西区' },
|
||||||
@ -112,6 +112,7 @@ function startExploration() {
|
|||||||
alert('请输入你的名字!');
|
alert('请输入你的名字!');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
startExplorationRules.value[0].reverse = true;
|
||||||
emit('startExploration', {
|
emit('startExploration', {
|
||||||
region: selectedRegion.value,
|
region: selectedRegion.value,
|
||||||
store: selectedStores.value[selectedStoreIndex.value].店铺,
|
store: selectedStores.value[selectedStoreIndex.value].店铺,
|
||||||
@ -122,7 +123,6 @@ function startExploration() {
|
|||||||
// 动画管理
|
// 动画管理
|
||||||
let fadeInAnimations: Animation[] = [];
|
let fadeInAnimations: Animation[] = [];
|
||||||
let swapInAnimations: Animation[] = [];
|
let swapInAnimations: Animation[] = [];
|
||||||
let scaleInAnimations: Animation[] = [];
|
|
||||||
let bubbleDropAnimations: Animation[] = [];
|
let bubbleDropAnimations: Animation[] = [];
|
||||||
|
|
||||||
// 保存所有动画的数组
|
// 保存所有动画的数组
|
||||||
@ -160,38 +160,6 @@ function createSwapInAnimation(element: Element, delay: number = 0) {
|
|||||||
return animation;
|
return animation;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Scale in 动画(容器)
|
|
||||||
function createScaleInContainerAnimation(element: Element, delay: number = 0) {
|
|
||||||
const animation = element.animate([
|
|
||||||
{ transform: 'scale(0)' },
|
|
||||||
{ transform: 'scale(1)' }
|
|
||||||
], {
|
|
||||||
duration: 500,
|
|
||||||
easing: 'cubic-bezier(0.5, 0, 0.71, 1.85)',
|
|
||||||
delay: (delay + 0.2) * 1000,
|
|
||||||
fill: 'forwards'
|
|
||||||
});
|
|
||||||
scaleInAnimations.push(animation);
|
|
||||||
allAnimations.push(animation);
|
|
||||||
return animation;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Scale in 动画(文本)
|
|
||||||
function createScaleInTextAnimation(element: Element, delay: number = 0) {
|
|
||||||
const animation = element.animate([
|
|
||||||
{ transform: 'scale(0)' },
|
|
||||||
{ transform: 'scale(1)' }
|
|
||||||
], {
|
|
||||||
duration: 500,
|
|
||||||
easing: 'cubic-bezier(0.5, 0, 0.71, 1.5)',
|
|
||||||
delay: (delay + 0.2 + 0.1) * 1000,
|
|
||||||
fill: 'forwards'
|
|
||||||
});
|
|
||||||
scaleInAnimations.push(animation);
|
|
||||||
allAnimations.push(animation);
|
|
||||||
return animation;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 气泡下降动画
|
// 气泡下降动画
|
||||||
function createBubbleDropAnimation(element: Element, startTop: string, startLeft: string, endTop: string, endLeft: string, delay: number = 0, duration: number = 600) {
|
function createBubbleDropAnimation(element: Element, startTop: string, startLeft: string, endTop: string, endLeft: string, delay: number = 0, duration: number = 600) {
|
||||||
const animation = element.animate([
|
const animation = element.animate([
|
||||||
@ -216,14 +184,17 @@ function createBubbleDropAnimation(element: Element, startTop: string, startLeft
|
|||||||
return animation;
|
return animation;
|
||||||
}
|
}
|
||||||
|
|
||||||
const mainLogo = useTemplateRef('main-logo');
|
|
||||||
|
|
||||||
const mainLogoRules = ref([
|
const mainLogoRules = ref([
|
||||||
{ name: 'main', frame: 41, loop: 1, pauseAfter: true, duration: 33, reverse: false }
|
{ name: 'main', frame: 41, loop: 1, pauseAfter: true, duration: 33, reverse: false }
|
||||||
]);
|
]);
|
||||||
|
const selectInfoRules = ref([{ name: 'main', frame: 26, loop: 1, duration: 33, reverse: false }]);
|
||||||
|
const startExplorationRules = ref([{ name: 'start', frame: 19, loop: 1, duration: 33, reverse: false }]);
|
||||||
|
|
||||||
|
|
||||||
// 反向播放所有动画来淡出
|
// 反向播放所有动画来淡出
|
||||||
function reverseAllAnimations() {
|
function reverseAllAnimations() {
|
||||||
mainLogoRules.value[0].reverse = true;
|
mainLogoRules.value[0].reverse = true;
|
||||||
|
selectInfoRules.value[0].reverse = true;
|
||||||
|
|
||||||
allAnimations.forEach(animation => {
|
allAnimations.forEach(animation => {
|
||||||
// 确保动画已经完成
|
// 确保动画已经完成
|
||||||
@ -252,9 +223,13 @@ function fadeOutAllAnimations() {
|
|||||||
(window as any).reverseAllAnimations = reverseAllAnimations;
|
(window as any).reverseAllAnimations = reverseAllAnimations;
|
||||||
(window as any).fadeOutAllAnimations = fadeOutAllAnimations;
|
(window as any).fadeOutAllAnimations = fadeOutAllAnimations;
|
||||||
|
|
||||||
|
|
||||||
|
const showSelectInfo = ref(false);
|
||||||
|
const showSun = ref(false);
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
|
const wait = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));
|
||||||
// 等待一帧确保所有元素都已渲染
|
// 等待一帧确保所有元素都已渲染
|
||||||
requestAnimationFrame(() => {
|
requestAnimationFrame(async () => {
|
||||||
// 初始化logo淡入动画
|
// 初始化logo淡入动画
|
||||||
const logo = document.querySelector('.logo');
|
const logo = document.querySelector('.logo');
|
||||||
if (logo) {
|
if (logo) {
|
||||||
@ -269,21 +244,6 @@ onMounted(() => {
|
|||||||
createSwapInAnimation(element, delay);
|
createSwapInAnimation(element, delay);
|
||||||
});
|
});
|
||||||
|
|
||||||
// 初始化scale-in动画
|
|
||||||
const scaleInContainers = document.querySelectorAll('.scale-in-ctn');
|
|
||||||
scaleInContainers.forEach((element) => {
|
|
||||||
const htmlElement = element as HTMLElement;
|
|
||||||
const delay = parseFloat(htmlElement.style.getPropertyValue('--base-delay')?.replace('s', '') || '0');
|
|
||||||
createScaleInContainerAnimation(element, delay);
|
|
||||||
});
|
|
||||||
|
|
||||||
const scaleInTexts = document.querySelectorAll('.scale-in-txt');
|
|
||||||
scaleInTexts.forEach((element) => {
|
|
||||||
const htmlElement = element as HTMLElement;
|
|
||||||
const delay = parseFloat(htmlElement.style.getPropertyValue('--base-delay')?.replace('s', '') || '0');
|
|
||||||
createScaleInTextAnimation(element, delay);
|
|
||||||
});
|
|
||||||
|
|
||||||
// 初始化气泡动画
|
// 初始化气泡动画
|
||||||
const regionBubbles = document.querySelectorAll('.region-bubble');
|
const regionBubbles = document.querySelectorAll('.region-bubble');
|
||||||
regionBubbles.forEach((bubble, index) => {
|
regionBubbles.forEach((bubble, index) => {
|
||||||
@ -365,6 +325,11 @@ onMounted(() => {
|
|||||||
bubble.addEventListener('pointerdown', pDown);
|
bubble.addEventListener('pointerdown', pDown);
|
||||||
bubble.addEventListener('pointerup', pUp, { once: true });
|
bubble.addEventListener('pointerup', pUp, { once: true });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
await wait(1300);
|
||||||
|
showSelectInfo.value = true;
|
||||||
|
await wait(300);
|
||||||
|
showSun.value = true;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -381,7 +346,12 @@ onUnmounted(() => {
|
|||||||
<img :src="assets.p1.蓝天" alt="" class="bg">
|
<img :src="assets.p1.蓝天" alt="" class="bg">
|
||||||
|
|
||||||
<AniEle :url="assets.ani.主标出现" :width="1015" :height="336" :rules="mainLogoRules"
|
<AniEle :url="assets.ani.主标出现" :width="1015" :height="336" :rules="mainLogoRules"
|
||||||
style="top: 10%;width: 84%;left: 8%;" ref="main-logo" />
|
style="top: 10%;width: 84%;left: 8%;" />
|
||||||
|
|
||||||
|
<div class="sun-warp" v-if="showSun">
|
||||||
|
<AniEle :url="assets.ani.P1太阳总" :width="1000" :height="1000"
|
||||||
|
:rules="[{ name: '下落', frame: 69, loop: 1, duration: 33 }, { name: '循环', frame: 75, loop: 0, duration: 33, reverse: false }]" />
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- <img :src="assets.p1.太阳" alt="" style="top: 30%;left: 5%;width: 26%;"> -->
|
<!-- <img :src="assets.p1.太阳" alt="" style="top: 30%;left: 5%;width: 26%;"> -->
|
||||||
<div style="width: 86vw;height: 86vw;top: 47%; left: 50%;transform: translate3d(-50%, -50%, 0); z-index: -1;">
|
<div style="width: 86vw;height: 86vw;top: 47%; left: 50%;transform: translate3d(-50%, -50%, 0); z-index: -1;">
|
||||||
@ -400,31 +370,10 @@ onUnmounted(() => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style="color: white; bottom: 16%;left: 50%;transform: translateX(-50%); font-size: 4.5vw;">
|
<div style="inset: 0;width: 100%;top: 52%;pointer-events: none;" v-if="showSelectInfo">
|
||||||
<span class="block tag scale-in-ctn"
|
<AniEle :url="assets.ani.点击选择阵营" :width="1179" :height="2462" ref="click-select-ani"
|
||||||
style="background-color: #000;top: -1vw;left: -12vw;color: transparent;transform: scale(0);--base-delay:1s;">
|
:rules="selectInfoRules" />
|
||||||
<span>点击</span>
|
|
||||||
</span>
|
|
||||||
<span class="block tag scale-in-ctn"
|
|
||||||
style="background-color: #304A7B;top: 4vw;left: -6vw;color: transparent;transform: scale(0);--base-delay:1.1s;">
|
|
||||||
<span>选择</span>
|
|
||||||
</span>
|
|
||||||
<span class="block tag scale-in-ctn"
|
|
||||||
style="background-color: #8FBE56;top: .8vw;left: 4.5vw;color: transparent;transform: scale(0);--base-delay:1.1s;">
|
|
||||||
<span>阵营</span>
|
|
||||||
</span>
|
|
||||||
<span class="block tag scale-in-txt"
|
|
||||||
style="background-color: transparent;top: -1vw;left: -12vw;transform: scale(0);--base-delay:1.2s;">
|
|
||||||
<span>点击</span>
|
|
||||||
</span>
|
|
||||||
<span class="block tag scale-in-txt"
|
|
||||||
style="background-color: transparent;top: 4vw;left: -6vw;transform: scale(0);--base-delay:1.2s;">
|
|
||||||
<span>选择</span>
|
|
||||||
</span>
|
|
||||||
<span class="block tag scale-in-txt"
|
|
||||||
style="background-color: transparent;top: .8vw;left: 4.5vw;transform: scale(0);--base-delay:1.3s;">
|
|
||||||
<span>阵营</span>
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 店铺选择界面 -->
|
<!-- 店铺选择界面 -->
|
||||||
@ -454,16 +403,34 @@ onUnmounted(() => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="action-buttons relative">
|
<AniEle :url="assets.ani.开始探索" :width="548" :height="143" :rules="startExplorationRules" class="start-button relative"
|
||||||
<div class="start-button relative" @click="startExploration">
|
@click="startExploration">
|
||||||
</div>
|
</AniEle>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
|
@keyframes sun-drop {
|
||||||
|
0% {
|
||||||
|
transform: translateY(-90vw);
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
transform: translateY(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.sun-warp {
|
||||||
|
top: 32%;
|
||||||
|
width: 24%;
|
||||||
|
left: 4.5%;
|
||||||
|
z-index: -1;
|
||||||
|
transform: translateY(-90vw);
|
||||||
|
animation: sun-drop 1s cubic-bezier(0.54, 0.46, 0.44, 1.28) forwards;
|
||||||
|
}
|
||||||
|
|
||||||
@mixin center {
|
@mixin center {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
@ -535,7 +502,7 @@ img {
|
|||||||
|
|
||||||
.bg {
|
.bg {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
z-index: -1;
|
z-index: -11;
|
||||||
inset: 0;
|
inset: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
@ -675,13 +642,9 @@ img {
|
|||||||
|
|
||||||
.start-button {
|
.start-button {
|
||||||
width: 40vw;
|
width: 40vw;
|
||||||
height: 15vw;
|
left: 30%;
|
||||||
background-size: contain;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-position: center;
|
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
background-image: url('../assets/p1/开始探索.png');
|
transition: all 0.1s ease;
|
||||||
transition: all 0.3s ease;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.start-button:hover {
|
.start-button:hover {
|
||||||
|
|||||||
@ -1,64 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="zh-CN">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>AniEle 组件测试</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="app">
|
|
||||||
<h1>AniEle 组件测试</h1>
|
|
||||||
<div>
|
|
||||||
<label>ZIP文件URL:</label>
|
|
||||||
<input v-model="zipUrl" type="text" placeholder="输入包含图片序列的ZIP文件URL" style="width: 400px;">
|
|
||||||
<button @click="loadImages">加载</button>
|
|
||||||
</div>
|
|
||||||
<br>
|
|
||||||
<AniEle :url="currentUrl" ref="aniEleRef" />
|
|
||||||
<div v-if="aniEleRef?.images.length > 0">
|
|
||||||
<h3>加载的图片预览:</h3>
|
|
||||||
<div style="display: flex; flex-wrap: wrap; gap: 10px;">
|
|
||||||
<img
|
|
||||||
v-for="(imgUrl, index) in aniEleRef.images.slice(0, 5)"
|
|
||||||
:key="index"
|
|
||||||
:src="imgUrl"
|
|
||||||
:alt="`Frame ${index}`"
|
|
||||||
style="width: 100px; height: 100px; object-fit: cover; border: 1px solid #ccc;"
|
|
||||||
/>
|
|
||||||
<div v-if="aniEleRef.images.length > 5" style="display: flex; align-items: center; padding: 10px;">
|
|
||||||
...还有 {{ aniEleRef.images.length - 5 }} 张图片
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script type="module">
|
|
||||||
import { createApp, ref } from 'vue'
|
|
||||||
import AniEle from './src/components/AniEle.vue'
|
|
||||||
|
|
||||||
const app = createApp({
|
|
||||||
components: {
|
|
||||||
AniEle
|
|
||||||
},
|
|
||||||
setup() {
|
|
||||||
const zipUrl = ref('')
|
|
||||||
const currentUrl = ref('')
|
|
||||||
const aniEleRef = ref(null)
|
|
||||||
|
|
||||||
const loadImages = () => {
|
|
||||||
currentUrl.value = zipUrl.value
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
zipUrl,
|
|
||||||
currentUrl,
|
|
||||||
aniEleRef,
|
|
||||||
loadImages
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
app.mount('#app')
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
21
todo.md
Normal file
21
todo.md
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
反馈
|
||||||
|
|
||||||
|
游戏开始:
|
||||||
|
1. 开始页面左上角没看到小太阳,等了一会也没有;
|
||||||
|
2. 请增加“音乐开关按钮”,一直显示。音乐用我接下来这个文件;
|
||||||
|
|
||||||
|
弹射演出:
|
||||||
|
小太阳的弹射应该是先向上飞,到达高点回落一点,随后开伞,随后下落速度减缓(甚至停一下),现在没有下落速度减缓这个步骤,这个得麻烦你仔细看一下我们的动画参考,找一下这个演出的感觉。
|
||||||
|
|
||||||
|
在游戏过程:
|
||||||
|
1. 太阳还要小1倍,是长按播放弹出演出,上飞的过程中变小的。
|
||||||
|
2. 小太阳整体自然下落速度加快1倍,试一下效果;
|
||||||
|
3. 屏幕上方、左右方似乎没有设置空气墙,我可以无限线上弹,也可以一直按左右飞出画面,然后就找不到太阳了(即使从上方重新下落也是在屏幕外部),我希望做到太阳和降落伞不出画面上、左、右框;
|
||||||
|
4. icon设置随机两点间来回移动,两点可以远一点,icon移动速度加快2倍;
|
||||||
|
5. 鼓风机的层级应该在太阳后面;
|
||||||
|
6. 太阳一旦低于鼓风机,就不受控制,快速下落,快速从屏幕上方正中落回,伞到达wecare下方再重新受控制,快速完成这个演出;
|
||||||
|
|
||||||
|
游戏结算:
|
||||||
|
1. 动画卡轴不正确,小太阳收脚的那一下应该是落在蹦床上的时间点,收脚是落地缓冲,现在节奏点不对;
|
||||||
|
2. 在没有点击收集完成的时候,小太阳应该是在排行榜上来回跳,循环,现在是一个循环后直接跳回下部;
|
||||||
|
3. 排行榜后台是不是还没完成?
|
||||||
@ -5,8 +5,6 @@
|
|||||||
|
|
||||||
/* Linting */
|
/* Linting */
|
||||||
"strict": true,
|
"strict": true,
|
||||||
"noUnusedLocals": true,
|
|
||||||
"noUnusedParameters": true,
|
|
||||||
"erasableSyntaxOnly": true,
|
"erasableSyntaxOnly": true,
|
||||||
"noFallthroughCasesInSwitch": true,
|
"noFallthroughCasesInSwitch": true,
|
||||||
"noUncheckedSideEffectImports": true
|
"noUncheckedSideEffectImports": true
|
||||||
|
|||||||
@ -1,13 +1,12 @@
|
|||||||
import { defineConfig } from 'vite'
|
import { defineConfig } from 'vite'
|
||||||
import vue from '@vitejs/plugin-vue'
|
import vue from '@vitejs/plugin-vue'
|
||||||
|
import minipic from 'vite-plugin-minipic'
|
||||||
import tailwindcss from '@tailwindcss/vite'
|
|
||||||
|
|
||||||
// https://vite.dev/config/
|
// https://vite.dev/config/
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
plugins: [
|
plugins: [
|
||||||
vue(),
|
vue(),
|
||||||
tailwindcss(),
|
minipic()
|
||||||
],
|
],
|
||||||
server: {
|
server: {
|
||||||
host: '0.0.0.0'
|
host: '0.0.0.0'
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user