diff --git a/package-lock.json b/package-lock.json index ba40beb4..998f8f3c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4993,474 +4993,6 @@ } } }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/aix-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", - "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/android-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", - "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/android-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", - "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/android-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", - "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/darwin-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", - "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/darwin-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", - "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", - "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/freebsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", - "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", - "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", - "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", - "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-loong64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", - "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-mips64el": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", - "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", - "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-riscv64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", - "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-s390x": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", - "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/linux-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", - "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", - "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/netbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", - "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", - "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/openbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", - "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", - "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/sunos-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", - "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/win32-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", - "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/win32-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", - "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/@esbuild/win32-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", - "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, "node_modules/@vitest/browser-playwright/node_modules/@vitest/mocker": { "version": "4.0.16", "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.16.tgz", @@ -5487,630 +5019,6 @@ } } }, - "node_modules/@vitest/browser-playwright/node_modules/esbuild": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", - "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.7", - "@esbuild/android-arm": "0.27.7", - "@esbuild/android-arm64": "0.27.7", - "@esbuild/android-x64": "0.27.7", - "@esbuild/darwin-arm64": "0.27.7", - "@esbuild/darwin-x64": "0.27.7", - "@esbuild/freebsd-arm64": "0.27.7", - "@esbuild/freebsd-x64": "0.27.7", - "@esbuild/linux-arm": "0.27.7", - "@esbuild/linux-arm64": "0.27.7", - "@esbuild/linux-ia32": "0.27.7", - "@esbuild/linux-loong64": "0.27.7", - "@esbuild/linux-mips64el": "0.27.7", - "@esbuild/linux-ppc64": "0.27.7", - "@esbuild/linux-riscv64": "0.27.7", - "@esbuild/linux-s390x": "0.27.7", - "@esbuild/linux-x64": "0.27.7", - "@esbuild/netbsd-arm64": "0.27.7", - "@esbuild/netbsd-x64": "0.27.7", - "@esbuild/openbsd-arm64": "0.27.7", - "@esbuild/openbsd-x64": "0.27.7", - "@esbuild/openharmony-arm64": "0.27.7", - "@esbuild/sunos-x64": "0.27.7", - "@esbuild/win32-arm64": "0.27.7", - "@esbuild/win32-ia32": "0.27.7", - "@esbuild/win32-x64": "0.27.7" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/@vitest/browser-playwright/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@vitest/browser-playwright/node_modules/vite": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz", - "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "esbuild": "^0.27.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "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" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/aix-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", - "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/android-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", - "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/android-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", - "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/android-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", - "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/darwin-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", - "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/darwin-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", - "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", - "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/freebsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", - "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/linux-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", - "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/linux-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", - "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/linux-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", - "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/linux-loong64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", - "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/linux-mips64el": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", - "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/linux-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", - "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/linux-riscv64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", - "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/linux-s390x": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", - "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/linux-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", - "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", - "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/netbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", - "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", - "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/openbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", - "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", - "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/sunos-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", - "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/win32-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", - "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/win32-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", - "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/browser/node_modules/@esbuild/win32-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", - "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, "node_modules/@vitest/browser/node_modules/@vitest/mocker": { "version": "4.0.16", "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.16.tgz", @@ -6137,85 +5045,6 @@ } } }, - "node_modules/@vitest/browser/node_modules/esbuild": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", - "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.7", - "@esbuild/android-arm": "0.27.7", - "@esbuild/android-arm64": "0.27.7", - "@esbuild/android-x64": "0.27.7", - "@esbuild/darwin-arm64": "0.27.7", - "@esbuild/darwin-x64": "0.27.7", - "@esbuild/freebsd-arm64": "0.27.7", - "@esbuild/freebsd-x64": "0.27.7", - "@esbuild/linux-arm": "0.27.7", - "@esbuild/linux-arm64": "0.27.7", - "@esbuild/linux-ia32": "0.27.7", - "@esbuild/linux-loong64": "0.27.7", - "@esbuild/linux-mips64el": "0.27.7", - "@esbuild/linux-ppc64": "0.27.7", - "@esbuild/linux-riscv64": "0.27.7", - "@esbuild/linux-s390x": "0.27.7", - "@esbuild/linux-x64": "0.27.7", - "@esbuild/netbsd-arm64": "0.27.7", - "@esbuild/netbsd-x64": "0.27.7", - "@esbuild/openbsd-arm64": "0.27.7", - "@esbuild/openbsd-x64": "0.27.7", - "@esbuild/openharmony-arm64": "0.27.7", - "@esbuild/sunos-x64": "0.27.7", - "@esbuild/win32-arm64": "0.27.7", - "@esbuild/win32-ia32": "0.27.7", - "@esbuild/win32-x64": "0.27.7" - } - }, - "node_modules/@vitest/browser/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/@vitest/browser/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/@vitest/browser/node_modules/pixelmatch": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-7.1.0.tgz", @@ -6237,83 +5066,6 @@ "node": ">=14.19.0" } }, - "node_modules/@vitest/browser/node_modules/vite": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz", - "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "esbuild": "^0.27.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "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" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, "node_modules/@vitest/expect": { "version": "4.0.16", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.16.tgz", diff --git a/src/components/video-editor/VideoEditor.tsx b/src/components/video-editor/VideoEditor.tsx index 8b4658e8..74cf6c56 100644 --- a/src/components/video-editor/VideoEditor.tsx +++ b/src/components/video-editor/VideoEditor.tsx @@ -13,6 +13,7 @@ import { } from "@/components/ui/dialog"; import { useI18n, useScopedT } from "@/contexts/I18nContext"; import { useShortcuts } from "@/contexts/ShortcutsContext"; +import { useClipboardFeedback } from "@/hooks/useClipboardFeedback"; import { INITIAL_EDITOR_STATE, useEditorHistory } from "@/hooks/useEditorHistory"; import { type Locale } from "@/i18n/config"; import { getAvailableLocales, getLocaleName } from "@/i18n/loader"; @@ -166,6 +167,7 @@ export default function VideoEditor() { const nextSpeedIdRef = useRef(1); const { shortcuts, isMac } = useShortcuts(); + const { notifyCopied, notifyPasted } = useClipboardFeedback(); const t = useScopedT("editor"); const ts = useScopedT("settings"); const tt = useScopedT("timeline"); @@ -1032,6 +1034,7 @@ export default function VideoEditor() { const region = annotationOnlyRegions.find((item) => item.id === selectedAnnotationId); if (region) { setTimelineClipboard({ kind: "annotation", region: cloneAnnotationRegion(region) }); + notifyCopied(); } return; } @@ -1040,6 +1043,7 @@ export default function VideoEditor() { const region = blurRegions.find((item) => item.id === selectedBlurId); if (region) { setTimelineClipboard({ kind: "blur", region: cloneAnnotationRegion(region) }); + notifyCopied(); } return; } @@ -1048,6 +1052,7 @@ export default function VideoEditor() { const region = zoomRegions.find((item) => item.id === selectedZoomId); if (region) { setTimelineClipboard({ kind: "zoom", region: { ...region, focus: { ...region.focus } } }); + notifyCopied(); } return; } @@ -1056,6 +1061,7 @@ export default function VideoEditor() { const region = trimRegions.find((item) => item.id === selectedTrimId); if (region) { setTimelineClipboard({ kind: "trim", region: { ...region } }); + notifyCopied(); } return; } @@ -1064,6 +1070,7 @@ export default function VideoEditor() { const region = speedRegions.find((item) => item.id === selectedSpeedId); if (region) { setTimelineClipboard({ kind: "speed", region: { ...region } }); + notifyCopied(); } } }, [ @@ -1077,6 +1084,7 @@ export default function VideoEditor() { zoomRegions, trimRegions, speedRegions, + notifyCopied, ]); const handlePasteTimelineItem = useCallback(() => { @@ -1125,6 +1133,7 @@ export default function VideoEditor() { config.pushRegion(config.createRegion(id)); clearTimelineSelection(); config.selectRegion(id); + notifyPasted(); return true; } @@ -1155,6 +1164,7 @@ export default function VideoEditor() { setSelectedZoomId(null); setSelectedTrimId(null); setSelectedSpeedId(null); + notifyPasted(); return; } @@ -1230,6 +1240,7 @@ export default function VideoEditor() { trimRegions, speedRegions, tt, + notifyPasted, ]); const handleAnnotationDelete = useCallback( diff --git a/src/hooks/useClipboardFeedback.ts b/src/hooks/useClipboardFeedback.ts new file mode 100644 index 00000000..9fcde509 --- /dev/null +++ b/src/hooks/useClipboardFeedback.ts @@ -0,0 +1,30 @@ +import { useCallback } from "react"; +import { toast } from "sonner"; +import { useScopedT } from "@/contexts/I18nContext"; + +export type ClipboardAction = "copy" | "paste"; + +export function useClipboardFeedback() { + const t = useScopedT("timeline"); + + const notifyClipboardAction = useCallback( + (action: ClipboardAction) => { + toast.success(action === "copy" ? t("feedback.copied") : t("feedback.pasted")); + }, + [t], + ); + + const notifyCopied = useCallback(() => { + notifyClipboardAction("copy"); + }, [notifyClipboardAction]); + + const notifyPasted = useCallback(() => { + notifyClipboardAction("paste"); + }, [notifyClipboardAction]); + + return { + notifyClipboardAction, + notifyCopied, + notifyPasted, + }; +} diff --git a/src/i18n/locales/en/timeline.json b/src/i18n/locales/en/timeline.json index b4d5bd8f..4320869f 100644 --- a/src/i18n/locales/en/timeline.json +++ b/src/i18n/locales/en/timeline.json @@ -49,5 +49,9 @@ "success": { "addedZoomSuggestions": "Added {{count}} cursor-based zoom suggestion", "addedZoomSuggestionsPlural": "Added {{count}} cursor-based zoom suggestions" + }, + "feedback": { + "copied": "Copied!", + "pasted": "Pasted!" } } diff --git a/src/i18n/locales/es/timeline.json b/src/i18n/locales/es/timeline.json index 12a83b04..cbc4408d 100644 --- a/src/i18n/locales/es/timeline.json +++ b/src/i18n/locales/es/timeline.json @@ -3,16 +3,16 @@ "addZoom": "Agregar zoom (Z)", "suggestZooms": "Sugerir zooms desde el cursor", "addTrim": "Agregar recorte (T)", - "addAnnotation": "Agregar anotación (A)", + "addAnnotation": "Agregar anotación (A)", "addSpeed": "Agregar velocidad (S)", "addBlur": "Agregar desenfoque (B)" }, "hints": { "pressZoom": "Presiona Z para agregar zoom", "pressTrim": "Presiona T para agregar recorte", - "pressAnnotation": "Presiona A para agregar anotación", + "pressAnnotation": "Presiona A para agregar anotación", "pressSpeed": "Presiona S para agregar velocidad", - "pressBlur": "Presiona B para agregar una región de desenfoque" + "pressBlur": "Presiona B para agregar una región de desenfoque" }, "labels": { "pan": "Desplazar", @@ -20,9 +20,9 @@ "zoomItem": "Zoom {{index}}", "trimItem": "Recorte {{index}}", "speedItem": "Velocidad {{index}}", - "annotationItem": "Anotación", + "annotationItem": "Anotación", "imageItem": "Imagen", - "emptyText": "Texto vacío", + "emptyText": "Texto vacío", "blurItem": "Desenfoque {{index}}" }, "emptyState": { @@ -30,24 +30,28 @@ "dragAndDrop": "Arrastra y suelta un video para comenzar a editar" }, "errors": { - "cannotPlaceZoom": "No se puede colocar el zoom aquí", - "zoomExistsAtLocation": "Ya existe un zoom en esta ubicación o no hay suficiente espacio disponible.", - "zoomSuggestionUnavailable": "El controlador de sugerencias de zoom no está disponible", - "noCursorTelemetry": "No hay telemetría de cursor disponible", + "cannotPlaceZoom": "No se puede colocar el zoom aquí", + "zoomExistsAtLocation": "Ya existe un zoom en esta ubicación o no hay suficiente espacio disponible.", + "zoomSuggestionUnavailable": "El controlador de sugerencias de zoom no está disponible", + "noCursorTelemetry": "No hay telemetría de cursor disponible", "noCursorTelemetryDescription": "Graba una captura de pantalla primero para generar sugerencias basadas en el cursor.", - "noUsableTelemetry": "No hay telemetría de cursor utilizable", - "noUsableTelemetryDescription": "La grabación no incluye suficientes datos de movimiento del cursor.", + "noUsableTelemetry": "No hay telemetría de cursor utilizable", + "noUsableTelemetryDescription": "La grabación no incluye suficientes datos de movimiento del cursor.", "noDwellMoments": "No se encontraron momentos claros de pausa del cursor", - "noDwellMomentsDescription": "Intenta una grabación con pausas más lentas del cursor en acciones importantes.", + "noDwellMomentsDescription": "Intenta una grabación con pausas más lentas del cursor en acciones importantes.", "noAutoZoomSlots": "No hay espacios de auto-zoom disponibles", "noAutoZoomSlotsDescription": "Los puntos de pausa detectados se superponen con regiones de zoom existentes.", - "cannotPlaceTrim": "No se puede colocar el recorte aquí", - "trimExistsAtLocation": "Ya existe un recorte en esta ubicación o no hay suficiente espacio disponible.", - "cannotPlaceSpeed": "No se puede colocar la velocidad aquí", - "speedExistsAtLocation": "Ya existe una región de velocidad en esta ubicación o no hay suficiente espacio disponible." + "cannotPlaceTrim": "No se puede colocar el recorte aquí", + "trimExistsAtLocation": "Ya existe un recorte en esta ubicación o no hay suficiente espacio disponible.", + "cannotPlaceSpeed": "No se puede colocar la velocidad aquí", + "speedExistsAtLocation": "Ya existe una región de velocidad en esta ubicación o no hay suficiente espacio disponible." }, "success": { - "addedZoomSuggestions": "Se agregó {{count}} sugerencia de zoom basada en el cursor", + "addedZoomSuggestions": "Se agregó {{count}} sugerencia de zoom basada en el cursor", "addedZoomSuggestionsPlural": "Se agregaron {{count}} sugerencias de zoom basadas en el cursor" + }, + "feedback": { + "copied": "Copied!", + "pasted": "Pasted!" } } diff --git a/src/i18n/locales/fr/timeline.json b/src/i18n/locales/fr/timeline.json index 5985ea67..294f340f 100644 --- a/src/i18n/locales/fr/timeline.json +++ b/src/i18n/locales/fr/timeline.json @@ -1,7 +1,7 @@ { "buttons": { "addZoom": "Ajouter un zoom (Z)", - "suggestZooms": "Suggérer des zooms depuis le curseur", + "suggestZooms": "Suggérer des zooms depuis le curseur", "addTrim": "Ajouter une coupe (T)", "addAnnotation": "Ajouter une annotation (A)", "addSpeed": "Ajouter une vitesse (S)", @@ -26,28 +26,32 @@ "blurItem": "Flou {{index}}" }, "emptyState": { - "noVideo": "Aucune vidéo chargée", - "dragAndDrop": "Glissez-déposez une vidéo pour commencer à éditer" + "noVideo": "Aucune vidéo chargée", + "dragAndDrop": "Glissez-déposez une vidéo pour commencer à éditer" }, "errors": { "cannotPlaceZoom": "Impossible de placer le zoom ici", - "zoomExistsAtLocation": "Un zoom existe déjà à cet emplacement ou l\u0027espace disponible est insuffisant.", + "zoomExistsAtLocation": "Un zoom existe déjà à cet emplacement ou l\u0027espace disponible est insuffisant.", "zoomSuggestionUnavailable": "Gestionnaire de suggestions de zoom non disponible", - "noCursorTelemetry": "Aucune télémétrie de curseur disponible", - "noCursorTelemetryDescription": "Enregistrez d\u0027abord un screencast pour générer des suggestions basées sur le curseur.", - "noUsableTelemetry": "Aucune télémétrie de curseur utilisable", - "noUsableTelemetryDescription": "L\u0027enregistrement ne contient pas suffisamment de données de mouvement du curseur.", - "noDwellMoments": "Aucun moment de pause du curseur trouvé", + "noCursorTelemetry": "Aucune télémétrie de curseur disponible", + "noCursorTelemetryDescription": "Enregistrez d\u0027abord un screencast pour générer des suggestions basées sur le curseur.", + "noUsableTelemetry": "Aucune télémétrie de curseur utilisable", + "noUsableTelemetryDescription": "L\u0027enregistrement ne contient pas suffisamment de données de mouvement du curseur.", + "noDwellMoments": "Aucun moment de pause du curseur trouvé", "noDwellMomentsDescription": "Essayez un enregistrement avec des pauses plus lentes du curseur sur les actions importantes.", "noAutoZoomSlots": "Aucun emplacement de zoom automatique disponible", - "noAutoZoomSlotsDescription": "Les points de pause détectés chevauchent des régions de zoom existantes.", + "noAutoZoomSlotsDescription": "Les points de pause détectés chevauchent des régions de zoom existantes.", "cannotPlaceTrim": "Impossible de placer la coupe ici", - "trimExistsAtLocation": "Une coupe existe déjà à cet emplacement ou l\u0027espace disponible est insuffisant.", + "trimExistsAtLocation": "Une coupe existe déjà à cet emplacement ou l\u0027espace disponible est insuffisant.", "cannotPlaceSpeed": "Impossible de placer la vitesse ici", - "speedExistsAtLocation": "Une région de vitesse existe déjà à cet emplacement ou l\u0027espace disponible est insuffisant." + "speedExistsAtLocation": "Une région de vitesse existe déjà à cet emplacement ou l\u0027espace disponible est insuffisant." }, "success": { - "addedZoomSuggestions": "{{count}} suggestion de zoom basée sur le curseur ajoutée", - "addedZoomSuggestionsPlural": "{{count}} suggestions de zoom basées sur le curseur ajoutées" + "addedZoomSuggestions": "{{count}} suggestion de zoom basée sur le curseur ajoutée", + "addedZoomSuggestionsPlural": "{{count}} suggestions de zoom basées sur le curseur ajoutées" + }, + "feedback": { + "copied": "Copied!", + "pasted": "Pasted!" } } diff --git a/src/i18n/locales/ko-KR/timeline.json b/src/i18n/locales/ko-KR/timeline.json index 167c26ff..ee67a9fc 100644 --- a/src/i18n/locales/ko-KR/timeline.json +++ b/src/i18n/locales/ko-KR/timeline.json @@ -1,50 +1,54 @@ { "buttons": { - "addZoom": "줌 추가 (Z)", - "suggestZooms": "커서 기반 줌 제안", - "addTrim": "트림 추가 (T)", - "addAnnotation": "주석 추가 (A)", - "addSpeed": "속도 추가 (S)" + "addZoom": "줌 추가 (Z)", + "suggestZooms": "커서 기반 줌 제안", + "addTrim": "트림 추가 (T)", + "addAnnotation": "주석 추가 (A)", + "addSpeed": "속도 추가 (S)" }, "hints": { - "pressZoom": "Z를 눌러 줌 추가", - "pressTrim": "T를 눌러 트림 추가", - "pressAnnotation": "A를 눌러 주석 추가", - "pressSpeed": "S를 눌러 속도 추가" + "pressZoom": "Z를 눌러 줌 추가", + "pressTrim": "T를 눌러 트림 추가", + "pressAnnotation": "A를 눌러 주석 추가", + "pressSpeed": "S를 눌러 속도 추가" }, "labels": { - "pan": "이동", - "zoom": "줌", - "zoomItem": "줌 {{index}}", - "trimItem": "트림 {{index}}", - "speedItem": "속도 {{index}}", - "annotationItem": "주석", - "imageItem": "이미지", - "emptyText": "빈 텍스트" + "pan": "이동", + "zoom": "줌", + "zoomItem": "줌 {{index}}", + "trimItem": "트림 {{index}}", + "speedItem": "속도 {{index}}", + "annotationItem": "주석", + "imageItem": "이미지", + "emptyText": "빈 텍스트" }, "emptyState": { - "noVideo": "불러온 비디오 없음", - "dragAndDrop": "비디오를 드래그 앤 드롭해서 편집을 시작하세요" + "noVideo": "불러온 비디오 없음", + "dragAndDrop": "비디오를 드래그 앤 드롭해서 편집을 시작하세요" }, "errors": { - "cannotPlaceZoom": "이 위치에 줌을 추가할 수 없습니다", - "zoomExistsAtLocation": "이 위치에 이미 줌이 있거나 공간이 부족합니다.", - "zoomSuggestionUnavailable": "줌 제안 기능을 사용할 수 없습니다", - "noCursorTelemetry": "커서 데이터가 없습니다", - "noCursorTelemetryDescription": "커서 기반 제안을 생성하려면 먼저 화면을 녹화해 주세요.", - "noUsableTelemetry": "사용 가능한 커서 데이터가 없습니다", - "noUsableTelemetryDescription": "녹화에 충분한 커서 이동 데이터가 포함되어 있지 않습니다.", - "noDwellMoments": "명확한 커서 정지 구간을 찾을 수 없습니다", - "noDwellMomentsDescription": "중요한 동작에서 커서를 천천히 멈추며 녹화해 보세요.", - "noAutoZoomSlots": "자동 줌 슬롯이 없습니다", - "noAutoZoomSlotsDescription": "감지된 정지 지점이 기존 줌 구간과 겹칩니다.", - "cannotPlaceTrim": "이 위치에 트림을 추가할 수 없습니다", - "trimExistsAtLocation": "이 위치에 이미 트림이 있거나 공간이 부족합니다.", - "cannotPlaceSpeed": "이 위치에 속도를 추가할 수 없습니다", - "speedExistsAtLocation": "이 위치에 이미 속도 구간이 있거나 공간이 부족합니다." + "cannotPlaceZoom": "이 위치에 줌을 추가할 수 없습니다", + "zoomExistsAtLocation": "이 위치에 이미 줌이 있거나 공간이 부족합니다.", + "zoomSuggestionUnavailable": "줌 제안 기능을 사용할 수 없습니다", + "noCursorTelemetry": "커서 데이터가 없습니다", + "noCursorTelemetryDescription": "커서 기반 제안을 생성하려면 먼저 화면을 녹화해 주세요.", + "noUsableTelemetry": "사용 가능한 커서 데이터가 없습니다", + "noUsableTelemetryDescription": "녹화에 충분한 커서 이동 데이터가 포함되어 있지 않습니다.", + "noDwellMoments": "명확한 커서 ì •ì§€ 구간을 찾을 수 없습니다", + "noDwellMomentsDescription": "중요한 동작에서 커서를 천천히 멈추며 녹화해 보세요.", + "noAutoZoomSlots": "자동 줌 슬롯이 없습니다", + "noAutoZoomSlotsDescription": "감지된 ì •ì§€ 지점이 기존 줌 구간과 겹칩니다.", + "cannotPlaceTrim": "이 위치에 트림을 추가할 수 없습니다", + "trimExistsAtLocation": "이 위치에 이미 트림이 있거나 공간이 부족합니다.", + "cannotPlaceSpeed": "이 위치에 속도를 추가할 수 없습니다", + "speedExistsAtLocation": "이 위치에 이미 속도 구간이 있거나 공간이 부족합니다." }, "success": { - "addedZoomSuggestions": "커서 기반 줌 제안 {{count}}개가 추가되었습니다", - "addedZoomSuggestionsPlural": "커서 기반 줌 제안 {{count}}개가 추가되었습니다" + "addedZoomSuggestions": "커서 기반 줌 제안 {{count}}개가 추가되었습니다", + "addedZoomSuggestionsPlural": "커서 기반 줌 제안 {{count}}개가 추가되었습니다" + }, + "feedback": { + "copied": "Copied!", + "pasted": "Pasted!" } } diff --git a/src/i18n/locales/tr/timeline.json b/src/i18n/locales/tr/timeline.json index 294640bf..761d82ff 100644 --- a/src/i18n/locales/tr/timeline.json +++ b/src/i18n/locales/tr/timeline.json @@ -1,53 +1,57 @@ { "buttons": { - "addZoom": "Yakınlaştırma Ekle (Z)", - "suggestZooms": "İmleçten Yakınlaştırma Öner", - "addTrim": "Kırpma Ekle (T)", - "addAnnotation": "Açıklama Ekle (A)", - "addSpeed": "Hız Ekle (S)", - "addBlur": "Bulanık ekle (B)" + "addZoom": "YakınlaÅŸtırma Ekle (Z)", + "suggestZooms": "İmleçten YakınlaÅŸtırma Öner", + "addTrim": "Kırpma Ekle (T)", + "addAnnotation": "Açıklama Ekle (A)", + "addSpeed": "Hız Ekle (S)", + "addBlur": "Bulanık ekle (B)" }, "hints": { - "pressZoom": "Yakınlaştırma eklemek için Z tuşuna basın", - "pressTrim": "Kırpma eklemek için T tuşuna basın", - "pressAnnotation": "Açıklama eklemek için A tuşuna basın", - "pressSpeed": "Hız eklemek için S tuşuna basın", - "pressBlur": "Bulanık bölge eklemek için B tuşuna basın" + "pressZoom": "YakınlaÅŸtırma eklemek için Z tuÅŸuna basın", + "pressTrim": "Kırpma eklemek için T tuÅŸuna basın", + "pressAnnotation": "Açıklama eklemek için A tuÅŸuna basın", + "pressSpeed": "Hız eklemek için S tuÅŸuna basın", + "pressBlur": "Bulanık bölge eklemek için B tuÅŸuna basın" }, "labels": { - "pan": "Kaydır", - "zoom": "Yakınlaştır", - "zoomItem": "Yakınlaştırma {{index}}", - "trimItem": "Kırpma {{index}}", - "speedItem": "Hız {{index}}", - "annotationItem": "Açıklama", - "imageItem": "Görüntü", - "emptyText": "Boş metin", - "blurItem": "Bulanık {{index}}" + "pan": "Kaydır", + "zoom": "YakınlaÅŸtır", + "zoomItem": "YakınlaÅŸtırma {{index}}", + "trimItem": "Kırpma {{index}}", + "speedItem": "Hız {{index}}", + "annotationItem": "Açıklama", + "imageItem": "Görüntü", + "emptyText": "BoÅŸ metin", + "blurItem": "Bulanık {{index}}" }, "emptyState": { - "noVideo": "Video Yüklenmedi", - "dragAndDrop": "Düzenlemeye başlamak için bir video sürükleyip bırakın" + "noVideo": "Video Yüklenmedi", + "dragAndDrop": "Düzenlemeye baÅŸlamak için bir video sürükleyip bırakın" }, "errors": { - "cannotPlaceZoom": "Buraya yakınlaştırma yerleştirilemiyor", - "zoomExistsAtLocation": "Bu konumda zaten bir yakınlaştırma var veya yeterli alan yok.", - "zoomSuggestionUnavailable": "Yakınlaştırma öneri işleyicisi kullanılamıyor", - "noCursorTelemetry": "İmleç telemetrisi mevcut değil", - "noCursorTelemetryDescription": "İmleç tabanlı öneriler oluşturmak için önce bir ekran kaydı yapın.", - "noUsableTelemetry": "Kullanılabilir imleç telemetrisi yok", - "noUsableTelemetryDescription": "Kayıt yeterli imleç hareketi verisi içermiyor.", - "noDwellMoments": "Belirgin imleç bekleme anları bulunamadı", - "noDwellMomentsDescription": "Önemli işlemlerde daha yavaş imleç duraklamaları olan bir kayıt deneyin.", - "noAutoZoomSlots": "Otomatik yakınlaştırma alanı yok", - "noAutoZoomSlotsDescription": "Algılanan bekleme noktaları mevcut yakınlaştırma bölgeleriyle çakışıyor.", - "cannotPlaceTrim": "Buraya kırpma yerleştirilemiyor", - "trimExistsAtLocation": "Bu konumda zaten bir kırpma var veya yeterli alan yok.", - "cannotPlaceSpeed": "Buraya hız yerleştirilemiyor", - "speedExistsAtLocation": "Bu konumda zaten bir hız bölgesi var veya yeterli alan yok." + "cannotPlaceZoom": "Buraya yakınlaÅŸtırma yerleÅŸtirilemiyor", + "zoomExistsAtLocation": "Bu konumda zaten bir yakınlaÅŸtırma var veya yeterli alan yok.", + "zoomSuggestionUnavailable": "YakınlaÅŸtırma öneri iÅŸleyicisi kullanılamıyor", + "noCursorTelemetry": "İmleç telemetrisi mevcut deÄŸil", + "noCursorTelemetryDescription": "İmleç tabanlı öneriler oluÅŸturmak için önce bir ekran kaydı yapın.", + "noUsableTelemetry": "Kullanılabilir imleç telemetrisi yok", + "noUsableTelemetryDescription": "Kayıt yeterli imleç hareketi verisi içermiyor.", + "noDwellMoments": "Belirgin imleç bekleme anları bulunamadı", + "noDwellMomentsDescription": "Önemli iÅŸlemlerde daha yavaÅŸ imleç duraklamaları olan bir kayıt deneyin.", + "noAutoZoomSlots": "Otomatik yakınlaÅŸtırma alanı yok", + "noAutoZoomSlotsDescription": "Algılanan bekleme noktaları mevcut yakınlaÅŸtırma bölgeleriyle çakışıyor.", + "cannotPlaceTrim": "Buraya kırpma yerleÅŸtirilemiyor", + "trimExistsAtLocation": "Bu konumda zaten bir kırpma var veya yeterli alan yok.", + "cannotPlaceSpeed": "Buraya hız yerleÅŸtirilemiyor", + "speedExistsAtLocation": "Bu konumda zaten bir hız bölgesi var veya yeterli alan yok." }, "success": { - "addedZoomSuggestions": "{{count}} imleç tabanlı yakınlaştırma önerisi eklendi", - "addedZoomSuggestionsPlural": "{{count}} imleç tabanlı yakınlaştırma önerisi eklendi" + "addedZoomSuggestions": "{{count}} imleç tabanlı yakınlaÅŸtırma önerisi eklendi", + "addedZoomSuggestionsPlural": "{{count}} imleç tabanlı yakınlaÅŸtırma önerisi eklendi" + }, + "feedback": { + "copied": "Copied!", + "pasted": "Pasted!" } } diff --git a/src/i18n/locales/zh-CN/timeline.json b/src/i18n/locales/zh-CN/timeline.json index 7841dcb5..def3d87d 100644 --- a/src/i18n/locales/zh-CN/timeline.json +++ b/src/i18n/locales/zh-CN/timeline.json @@ -1,53 +1,57 @@ { "buttons": { - "addZoom": "添加缩放 (Z)", - "suggestZooms": "根据光标建议缩放", - "addTrim": "添加剪辑 (T)", - "addAnnotation": "添加标注 (A)", - "addSpeed": "添加速度 (S)", - "addBlur": "添加模糊 (B)" + "addZoom": "添加缩放 (Z)", + "suggestZooms": "根据光标建议缩放", + "addTrim": "添加剪辑 (T)", + "addAnnotation": "添加标注 (A)", + "addSpeed": "添加速度 (S)", + "addBlur": "添加模糊 (B)" }, "hints": { - "pressZoom": "按 Z 添加缩放", - "pressTrim": "按 T 添加剪辑", - "pressAnnotation": "按 A 添加标注", - "pressSpeed": "按 S 添加速度", - "pressBlur": "按 B 添加模糊区域" + "pressZoom": "按 Z 添加缩放", + "pressTrim": "按 T 添加剪辑", + "pressAnnotation": "按 A 添加标注", + "pressSpeed": "按 S 添加速度", + "pressBlur": "按 B 添加模糊区域" }, "labels": { - "pan": "平移", - "zoom": "缩放", - "zoomItem": "缩放 {{index}}", - "trimItem": "剪辑 {{index}}", - "speedItem": "速度 {{index}}", - "annotationItem": "标注", - "imageItem": "图片", - "emptyText": "空文本", - "blurItem": "模糊 {{index}}" + "pan": "平移", + "zoom": "缩放", + "zoomItem": "缩放 {{index}}", + "trimItem": "剪辑 {{index}}", + "speedItem": "速度 {{index}}", + "annotationItem": "标注", + "imageItem": "图片", + "emptyText": "空文本", + "blurItem": "模糊 {{index}}" }, "emptyState": { - "noVideo": "未加载视频", - "dragAndDrop": "拖放视频以开始编辑" + "noVideo": "未加载视频", + "dragAndDrop": "拖放视频以开始编辑" }, "errors": { - "cannotPlaceZoom": "无法在此处放置缩放", - "zoomExistsAtLocation": "此位置已存在缩放或没有足够的空间。", - "zoomSuggestionUnavailable": "缩放建议处理器不可用", - "noCursorTelemetry": "无可用的光标遥测数据", - "noCursorTelemetryDescription": "请先录制一段屏幕录像以生成基于光标的建议。", - "noUsableTelemetry": "无可用的光标遥测数据", - "noUsableTelemetryDescription": "录制内容没有包含足够的光标移动数据。", - "noDwellMoments": "未找到明确的光标停留时刻", - "noDwellMomentsDescription": "请尝试在重要操作上进行较慢光标停留的录制。", - "noAutoZoomSlots": "无可用的自动缩放位置", - "noAutoZoomSlotsDescription": "检测到的停留点与现有缩放区域重叠。", - "cannotPlaceTrim": "无法在此处放置剪辑", - "trimExistsAtLocation": "此位置已存在剪辑或没有足够的空间。", - "cannotPlaceSpeed": "无法在此处放置速度", - "speedExistsAtLocation": "此位置已存在速度区域或没有足够的空间。" + "cannotPlaceZoom": "无法在此处放置缩放", + "zoomExistsAtLocation": "此位置已存在缩放或没有足够的空间。", + "zoomSuggestionUnavailable": "缩放建议处理器不可用", + "noCursorTelemetry": "无可用的光标遥测数据", + "noCursorTelemetryDescription": "请先录制一段屏幕录像以生成基于光标的建议。", + "noUsableTelemetry": "无可用的光标遥测数据", + "noUsableTelemetryDescription": "录制内容没有包含足够的光标移动数据。", + "noDwellMoments": "未找到明确的光标停留时刻", + "noDwellMomentsDescription": "请尝试在重要操作上进行较慢光标停留的录制。", + "noAutoZoomSlots": "无可用的自动缩放位置", + "noAutoZoomSlotsDescription": "检测到的停留点与现有缩放区域重叠。", + "cannotPlaceTrim": "无法在此处放置剪辑", + "trimExistsAtLocation": "此位置已存在剪辑或没有足够的空间。", + "cannotPlaceSpeed": "无法在此处放置速度", + "speedExistsAtLocation": "此位置已存在速度区域或没有足够的空间。" }, "success": { - "addedZoomSuggestions": "已添加 {{count}} 个基于光标的缩放建议", - "addedZoomSuggestionsPlural": "已添加 {{count}} 个基于光标的缩放建议" + "addedZoomSuggestions": "已添加 {{count}} 个基于光标的缩放建议", + "addedZoomSuggestionsPlural": "已添加 {{count}} 个基于光标的缩放建议" + }, + "feedback": { + "copied": "Copied!", + "pasted": "Pasted!" } } diff --git a/src/i18n/locales/zh-TW/timeline.json b/src/i18n/locales/zh-TW/timeline.json index 52457d61..783f6548 100644 --- a/src/i18n/locales/zh-TW/timeline.json +++ b/src/i18n/locales/zh-TW/timeline.json @@ -1,53 +1,57 @@ { "buttons": { - "addZoom": "新增縮放 (Z)", - "suggestZooms": "根據游標建議縮放", - "addTrim": "新增剪輯 (T)", - "addAnnotation": "新增標註 (A)", - "addSpeed": "新增速度 (S)", - "addBlur": "新增模糊 (B)" + "addZoom": "新增縮放 (Z)", + "suggestZooms": "根據游標建議縮放", + "addTrim": "新增剪輯 (T)", + "addAnnotation": "新增標註 (A)", + "addSpeed": "新增速度 (S)", + "addBlur": "新增模糊 (B)" }, "hints": { - "pressZoom": "按 Z 新增縮放", - "pressTrim": "按 T 新增剪輯", - "pressAnnotation": "按 A 新增標註", - "pressSpeed": "按 S 新增速度", - "pressBlur": "按 B 新增模糊區域" + "pressZoom": "按 Z 新增縮放", + "pressTrim": "按 T 新增剪輯", + "pressAnnotation": "按 A 新增標註", + "pressSpeed": "按 S 新增速度", + "pressBlur": "按 B 新增模糊區域" }, "labels": { - "pan": "平移", - "zoom": "縮放", - "zoomItem": "縮放 {{index}}", - "trimItem": "剪輯 {{index}}", - "speedItem": "速度 {{index}}", - "annotationItem": "標註", - "imageItem": "圖片", - "emptyText": "空文字", - "blurItem": "模糊 {{index}}" + "pan": "平移", + "zoom": "縮放", + "zoomItem": "縮放 {{index}}", + "trimItem": "剪輯 {{index}}", + "speedItem": "速度 {{index}}", + "annotationItem": "標註", + "imageItem": "圖片", + "emptyText": "空文字", + "blurItem": "模糊 {{index}}" }, "emptyState": { - "noVideo": "未載入影片", - "dragAndDrop": "拖放影片以開始編輯" + "noVideo": "未載入影片", + "dragAndDrop": "拖放影片以開始編輯" }, "errors": { - "cannotPlaceZoom": "無法在此處放置縮放", - "zoomExistsAtLocation": "此位置已存在縮放或沒有足夠的空間。", - "zoomSuggestionUnavailable": "縮放建議處理器不可用", - "noCursorTelemetry": "無可用的游標遙測資料", - "noCursorTelemetryDescription": "請先錄製一段螢幕錄影以產生基於游標的建議。", - "noUsableTelemetry": "無可用的游標遙測資料", - "noUsableTelemetryDescription": "錄製內容沒有包含足夠的游標移動資料。", - "noDwellMoments": "未找到明確的游標停留時刻", - "noDwellMomentsDescription": "請嘗試在重要操作上進行較慢游標停留的錄製。", - "noAutoZoomSlots": "無可用的自動縮放位置", - "noAutoZoomSlotsDescription": "偵測到的停留點與現有縮放區域重疊。", - "cannotPlaceTrim": "無法在此處放置剪輯", - "trimExistsAtLocation": "此位置已存在剪輯或沒有足夠的空間。", - "cannotPlaceSpeed": "無法在此處放置速度", - "speedExistsAtLocation": "此位置已存在速度區域或沒有足夠的空間。" + "cannotPlaceZoom": "無法在此處放置縮放", + "zoomExistsAtLocation": "此位置已存在縮放或沒有足夠的空間。", + "zoomSuggestionUnavailable": "縮放建議處理器不可用", + "noCursorTelemetry": "無可用的游標遙測資料", + "noCursorTelemetryDescription": "請先錄製一段螢幕錄影以產生基於游標的建議。", + "noUsableTelemetry": "無可用的游標遙測資料", + "noUsableTelemetryDescription": "錄製內容沒有包含足夠的游標移動資料。", + "noDwellMoments": "未找到明確的游標停留時刻", + "noDwellMomentsDescription": "請嘗試在重要操作上進行較慢游標停留的錄製。", + "noAutoZoomSlots": "無可用的自動縮放位置", + "noAutoZoomSlotsDescription": "偵測到的停留點與現有縮放區域重疊。", + "cannotPlaceTrim": "無法在此處放置剪輯", + "trimExistsAtLocation": "此位置已存在剪輯或沒有足夠的空間。", + "cannotPlaceSpeed": "無法在此處放置速度", + "speedExistsAtLocation": "此位置已存在速度區域或沒有足夠的空間。" }, "success": { - "addedZoomSuggestions": "已新增 {{count}} 個基於游標的縮放建議", - "addedZoomSuggestionsPlural": "已新增 {{count}} 個基於游標的縮放建議" + "addedZoomSuggestions": "已新增 {{count}} 個基於游標的縮放建議", + "addedZoomSuggestionsPlural": "已新增 {{count}} 個基於游標的縮放建議" + }, + "feedback": { + "copied": "Copied!", + "pasted": "Pasted!" } }