diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ce9982f4b6..2912ebd87f 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -3,15 +3,13 @@ updates: - package-ecosystem: "github-actions" directory: "/" schedule: - interval: "weekly" - day: "friday" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "npm" directory: "/" schedule: - interval: "weekly" - day: "friday" + interval: "monthly" open-pull-requests-limit: 10 groups: npm-packages: @@ -21,8 +19,7 @@ updates: - package-ecosystem: "pip" directory: "/" schedule: - interval: "weekly" - day: "friday" + interval: "monthly" open-pull-requests-limit: 10 groups: python-packages: diff --git a/CHANGELOG.md b/CHANGELOG.md index 1588c546c0..e5ae4cb262 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog for Fontra +## 2025-01-14 + +- Fixed a regression with the Font menu [Issue 1941](https://github.com/googlefonts/fontra/issues/1941), [PR 1942](https://github.com/googlefonts/fontra/pull/1942) +- Fixed a regression with messages from server [PR 1939](https://github.com/googlefonts/fontra/pull/1939) + ## 2025-01-06 - Fixed bug related to deleting points [Issue 1910](https://github.com/googlefonts/fontra/issues/1910), [PR 1916](https://github.com/googlefonts/fontra/pull/1916) diff --git a/package-lock.json b/package-lock.json index 6f5d8975af..087fa6344c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,8 +16,8 @@ "chai-almost": "^1.0.1", "mocha": "^11.0.1", "prettier-plugin-organize-imports": "^4.1.0", - "prettier-plugin-sort-json": "^4.0.0", - "rollup": "^4.29.1" + "prettier-plugin-sort-json": "^4.1.1", + "rollup": "^4.30.1" } }, "node_modules/@isaacs/cliui": { @@ -217,9 +217,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.29.1.tgz", - "integrity": "sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz", + "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==", "cpu": [ "arm" ], @@ -230,9 +230,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.29.1.tgz", - "integrity": "sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz", + "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==", "cpu": [ "arm64" ], @@ -243,9 +243,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.29.1.tgz", - "integrity": "sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz", + "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==", "cpu": [ "arm64" ], @@ -256,9 +256,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.29.1.tgz", - "integrity": "sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz", + "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==", "cpu": [ "x64" ], @@ -269,9 +269,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.29.1.tgz", - "integrity": "sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz", + "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==", "cpu": [ "arm64" ], @@ -282,9 +282,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.29.1.tgz", - "integrity": "sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz", + "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==", "cpu": [ "x64" ], @@ -295,9 +295,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.29.1.tgz", - "integrity": "sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz", + "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==", "cpu": [ "arm" ], @@ -308,9 +308,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.29.1.tgz", - "integrity": "sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz", + "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==", "cpu": [ "arm" ], @@ -321,9 +321,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.29.1.tgz", - "integrity": "sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz", + "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==", "cpu": [ "arm64" ], @@ -334,9 +334,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.29.1.tgz", - "integrity": "sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz", + "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==", "cpu": [ "arm64" ], @@ -347,9 +347,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.29.1.tgz", - "integrity": "sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz", + "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==", "cpu": [ "loong64" ], @@ -360,9 +360,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.29.1.tgz", - "integrity": "sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz", + "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==", "cpu": [ "ppc64" ], @@ -373,9 +373,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.29.1.tgz", - "integrity": "sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz", + "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==", "cpu": [ "riscv64" ], @@ -386,9 +386,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.29.1.tgz", - "integrity": "sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz", + "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==", "cpu": [ "s390x" ], @@ -399,9 +399,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.29.1.tgz", - "integrity": "sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz", + "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==", "cpu": [ "x64" ], @@ -412,9 +412,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.29.1.tgz", - "integrity": "sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz", + "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==", "cpu": [ "x64" ], @@ -425,9 +425,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.29.1.tgz", - "integrity": "sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz", + "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==", "cpu": [ "arm64" ], @@ -438,9 +438,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.29.1.tgz", - "integrity": "sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz", + "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==", "cpu": [ "ia32" ], @@ -451,9 +451,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.29.1.tgz", - "integrity": "sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz", + "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==", "cpu": [ "x64" ], @@ -1455,9 +1455,9 @@ } }, "node_modules/prettier-plugin-sort-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-sort-json/-/prettier-plugin-sort-json-4.0.0.tgz", - "integrity": "sha512-zV5g+bWFD2zAqyQ8gCkwUTC49o9FxslaUdirwivt5GZHcf57hCocavykuyYqbExoEsuBOg8IU36OY7zmVEMOWA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/prettier-plugin-sort-json/-/prettier-plugin-sort-json-4.1.1.tgz", + "integrity": "sha512-uJ49wCzwJ/foKKV4tIPxqi4jFFvwUzw4oACMRG2dcmDhBKrxBv0L2wSKkAqHCmxKCvj0xcCZS4jO2kSJO/tRJw==", "dev": true, "engines": { "node": ">=18.0.0" @@ -1526,9 +1526,9 @@ } }, "node_modules/rollup": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.29.1.tgz", - "integrity": "sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz", + "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==", "dev": true, "dependencies": { "@types/estree": "1.0.6" @@ -1541,25 +1541,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.29.1", - "@rollup/rollup-android-arm64": "4.29.1", - "@rollup/rollup-darwin-arm64": "4.29.1", - "@rollup/rollup-darwin-x64": "4.29.1", - "@rollup/rollup-freebsd-arm64": "4.29.1", - "@rollup/rollup-freebsd-x64": "4.29.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.29.1", - "@rollup/rollup-linux-arm-musleabihf": "4.29.1", - "@rollup/rollup-linux-arm64-gnu": "4.29.1", - "@rollup/rollup-linux-arm64-musl": "4.29.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.29.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.29.1", - "@rollup/rollup-linux-riscv64-gnu": "4.29.1", - "@rollup/rollup-linux-s390x-gnu": "4.29.1", - "@rollup/rollup-linux-x64-gnu": "4.29.1", - "@rollup/rollup-linux-x64-musl": "4.29.1", - "@rollup/rollup-win32-arm64-msvc": "4.29.1", - "@rollup/rollup-win32-ia32-msvc": "4.29.1", - "@rollup/rollup-win32-x64-msvc": "4.29.1", + "@rollup/rollup-android-arm-eabi": "4.30.1", + "@rollup/rollup-android-arm64": "4.30.1", + "@rollup/rollup-darwin-arm64": "4.30.1", + "@rollup/rollup-darwin-x64": "4.30.1", + "@rollup/rollup-freebsd-arm64": "4.30.1", + "@rollup/rollup-freebsd-x64": "4.30.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.30.1", + "@rollup/rollup-linux-arm-musleabihf": "4.30.1", + "@rollup/rollup-linux-arm64-gnu": "4.30.1", + "@rollup/rollup-linux-arm64-musl": "4.30.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.30.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1", + "@rollup/rollup-linux-riscv64-gnu": "4.30.1", + "@rollup/rollup-linux-s390x-gnu": "4.30.1", + "@rollup/rollup-linux-x64-gnu": "4.30.1", + "@rollup/rollup-linux-x64-musl": "4.30.1", + "@rollup/rollup-win32-arm64-msvc": "4.30.1", + "@rollup/rollup-win32-ia32-msvc": "4.30.1", + "@rollup/rollup-win32-x64-msvc": "4.30.1", "fsevents": "~2.3.2" } }, @@ -2000,135 +2000,135 @@ } }, "@rollup/rollup-android-arm-eabi": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.29.1.tgz", - "integrity": "sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz", + "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==", "dev": true, "optional": true }, "@rollup/rollup-android-arm64": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.29.1.tgz", - "integrity": "sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz", + "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==", "dev": true, "optional": true }, "@rollup/rollup-darwin-arm64": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.29.1.tgz", - "integrity": "sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz", + "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==", "dev": true, "optional": true }, "@rollup/rollup-darwin-x64": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.29.1.tgz", - "integrity": "sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz", + "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==", "dev": true, "optional": true }, "@rollup/rollup-freebsd-arm64": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.29.1.tgz", - "integrity": "sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz", + "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==", "dev": true, "optional": true }, "@rollup/rollup-freebsd-x64": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.29.1.tgz", - "integrity": "sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz", + "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.29.1.tgz", - "integrity": "sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz", + "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm-musleabihf": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.29.1.tgz", - "integrity": "sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz", + "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm64-gnu": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.29.1.tgz", - "integrity": "sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz", + "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm64-musl": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.29.1.tgz", - "integrity": "sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz", + "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==", "dev": true, "optional": true }, "@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.29.1.tgz", - "integrity": "sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz", + "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==", "dev": true, "optional": true }, "@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.29.1.tgz", - "integrity": "sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz", + "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==", "dev": true, "optional": true }, "@rollup/rollup-linux-riscv64-gnu": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.29.1.tgz", - "integrity": "sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz", + "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==", "dev": true, "optional": true }, "@rollup/rollup-linux-s390x-gnu": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.29.1.tgz", - "integrity": "sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz", + "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==", "dev": true, "optional": true }, "@rollup/rollup-linux-x64-gnu": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.29.1.tgz", - "integrity": "sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz", + "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==", "dev": true, "optional": true }, "@rollup/rollup-linux-x64-musl": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.29.1.tgz", - "integrity": "sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz", + "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==", "dev": true, "optional": true }, "@rollup/rollup-win32-arm64-msvc": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.29.1.tgz", - "integrity": "sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz", + "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==", "dev": true, "optional": true }, "@rollup/rollup-win32-ia32-msvc": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.29.1.tgz", - "integrity": "sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz", + "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==", "dev": true, "optional": true }, "@rollup/rollup-win32-x64-msvc": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.29.1.tgz", - "integrity": "sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz", + "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==", "dev": true, "optional": true }, @@ -2847,9 +2847,9 @@ "requires": {} }, "prettier-plugin-sort-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-sort-json/-/prettier-plugin-sort-json-4.0.0.tgz", - "integrity": "sha512-zV5g+bWFD2zAqyQ8gCkwUTC49o9FxslaUdirwivt5GZHcf57hCocavykuyYqbExoEsuBOg8IU36OY7zmVEMOWA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/prettier-plugin-sort-json/-/prettier-plugin-sort-json-4.1.1.tgz", + "integrity": "sha512-uJ49wCzwJ/foKKV4tIPxqi4jFFvwUzw4oACMRG2dcmDhBKrxBv0L2wSKkAqHCmxKCvj0xcCZS4jO2kSJO/tRJw==", "dev": true, "requires": {} }, @@ -2897,30 +2897,30 @@ } }, "rollup": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.29.1.tgz", - "integrity": "sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==", + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz", + "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==", "dev": true, "requires": { - "@rollup/rollup-android-arm-eabi": "4.29.1", - "@rollup/rollup-android-arm64": "4.29.1", - "@rollup/rollup-darwin-arm64": "4.29.1", - "@rollup/rollup-darwin-x64": "4.29.1", - "@rollup/rollup-freebsd-arm64": "4.29.1", - "@rollup/rollup-freebsd-x64": "4.29.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.29.1", - "@rollup/rollup-linux-arm-musleabihf": "4.29.1", - "@rollup/rollup-linux-arm64-gnu": "4.29.1", - "@rollup/rollup-linux-arm64-musl": "4.29.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.29.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.29.1", - "@rollup/rollup-linux-riscv64-gnu": "4.29.1", - "@rollup/rollup-linux-s390x-gnu": "4.29.1", - "@rollup/rollup-linux-x64-gnu": "4.29.1", - "@rollup/rollup-linux-x64-musl": "4.29.1", - "@rollup/rollup-win32-arm64-msvc": "4.29.1", - "@rollup/rollup-win32-ia32-msvc": "4.29.1", - "@rollup/rollup-win32-x64-msvc": "4.29.1", + "@rollup/rollup-android-arm-eabi": "4.30.1", + "@rollup/rollup-android-arm64": "4.30.1", + "@rollup/rollup-darwin-arm64": "4.30.1", + "@rollup/rollup-darwin-x64": "4.30.1", + "@rollup/rollup-freebsd-arm64": "4.30.1", + "@rollup/rollup-freebsd-x64": "4.30.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.30.1", + "@rollup/rollup-linux-arm-musleabihf": "4.30.1", + "@rollup/rollup-linux-arm64-gnu": "4.30.1", + "@rollup/rollup-linux-arm64-musl": "4.30.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.30.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1", + "@rollup/rollup-linux-riscv64-gnu": "4.30.1", + "@rollup/rollup-linux-s390x-gnu": "4.30.1", + "@rollup/rollup-linux-x64-gnu": "4.30.1", + "@rollup/rollup-linux-x64-musl": "4.30.1", + "@rollup/rollup-win32-arm64-msvc": "4.30.1", + "@rollup/rollup-win32-ia32-msvc": "4.30.1", + "@rollup/rollup-win32-x64-msvc": "4.30.1", "@types/estree": "1.0.6", "fsevents": "~2.3.2" } diff --git a/package.json b/package.json index 37b3550265..f6fc6b7bbe 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,8 @@ "chai-almost": "^1.0.1", "mocha": "^11.0.1", "prettier-plugin-organize-imports": "^4.1.0", - "prettier-plugin-sort-json": "^4.0.0", - "rollup": "^4.29.1" + "prettier-plugin-sort-json": "^4.1.1", + "rollup": "^4.30.1" }, "dependencies": { "bezier-js": "^6.1.4", diff --git a/requirements-dev.txt b/requirements-dev.txt index a86d9ecf15..24a5a289c8 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,5 +1,5 @@ mypy==1.14.1 pre-commit==4.0.1 pytest==8.3.4 -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 types-PyYAML==6.0.12.20241230 diff --git a/requirements.txt b/requirements.txt index f09235ede8..512a060e1c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,5 +6,5 @@ pillow==11.1.0 pyyaml==6.0.2 ufomerge==1.8.2 unicodedata2==15.1.0 -watchfiles==1.0.3 +watchfiles==1.0.4 skia-pathops==0.8.0.post2 diff --git a/src/fontra/client/core/font-controller.js b/src/fontra/client/core/font-controller.js index a26e0ca765..3f1e9da547 100644 --- a/src/fontra/client/core/font-controller.js +++ b/src/fontra/client/core/font-controller.js @@ -1,4 +1,4 @@ -import { getClassSchema } from "../core/classes.js"; +import { recordChanges } from "./change-recorder.js"; import { applyChange, collectChangePaths, @@ -6,6 +6,7 @@ import { filterChangePattern, matchChangePattern, } from "./changes.js"; +import { getClassSchema } from "./classes.js"; import { getGlyphMapProxy, makeCharacterMapFromGlyphMap } from "./cmap.js"; import { CrossAxisMapping } from "./cross-axis-mapping.js"; import { FontSourcesInstancer } from "./font-sources-instancer.js"; @@ -681,6 +682,20 @@ export class FontController { return editContext; } + async performEdit(editLabel, rootKey, editFunc, senderID) { + // This is a convenience for non-continuous non-glyph changes + const root = { [rootKey]: await this.getData(rootKey) }; + const changes = recordChanges(root, editFunc); + await this.postChange(changes.change, changes.rollbackChange, editLabel, senderID); + return changes; + } + + async postChange(change, rollbackChange, editLabel, senderID) { + const error = await this.editFinal(change, rollbackChange, editLabel, true); + // TODO handle error + this.notifyEditListeners("editFinal", senderID); + } + async applyChange(change, isExternalChange) { if (!isExternalChange && this.readOnly) { console.log("can't edit font in read-only mode"); diff --git a/src/fontra/client/core/fontra-menus.js b/src/fontra/client/core/fontra-menus.js index 1670718518..b0b83cf831 100644 --- a/src/fontra/client/core/fontra-menus.js +++ b/src/fontra/client/core/fontra-menus.js @@ -1,6 +1,7 @@ import { registerActionInfo } from "./actions.js"; import * as html from "./html-utils.js"; import { translate } from "./localization.js"; +import { assert } from "./utils.js"; import { MenuBar } from "/web-components/menu-bar.js"; import { MenuItemDivider } from "/web-components/menu-panel.js"; @@ -166,7 +167,7 @@ function getFontMenuItems() { enabled: () => enabled, callback: () => { const url = new URL(window.location); - url.pathname = `/fontinfo/-/${url.pathname.split("/").slice(-1)[0]}`; + url.pathname = rerouteViewPath(url.pathname, "fontinfo"); url.hash = panelID; window.open(url.toString()); }, @@ -184,7 +185,7 @@ function getWindowMenuItems() { enabled: () => true, callback: () => { const url = new URL(window.location); - url.pathname = `/fontoverview/-/${url.pathname.split("/").slice(-1)[0]}`; + url.pathname = rerouteViewPath(url.pathname, "fontoverview"); url.hash = ""; // remove any hash window.open(url.toString()); }, @@ -194,7 +195,7 @@ function getWindowMenuItems() { enabled: () => true, callback: () => { const url = new URL(window.location); - url.pathname = `/editor/-/${url.pathname.split("/").slice(-1)[0]}`; + url.pathname = rerouteViewPath(url.pathname, "editor"); url.hash = ""; // remove any hash window.open(url.toString()); }, @@ -202,6 +203,15 @@ function getWindowMenuItems() { ]; } +function rerouteViewPath(path, targetView) { + assert(path[0] === "/"); + const parts = path.split("/"); + assert(parts.length >= 3); + assert(parts[1].length > 0); + parts[1] = targetView; + return parts.join("/"); +} + // Default action infos { diff --git a/src/fontra/client/core/glyph-data.js b/src/fontra/client/core/glyph-data.js index bcea487a29..c5e680d2c5 100644 --- a/src/fontra/client/core/glyph-data.js +++ b/src/fontra/client/core/glyph-data.js @@ -77,6 +77,8 @@ export function getSuggestedGlyphName(codePoint) { } export function getCodePointFromGlyphName(glyphName) { + parseGlyphDataCSV(); + const glyphInfo = glyphDataByName.get(glyphName); let codePoint = null; diff --git a/src/fontra/client/core/parse-glyph-set.js b/src/fontra/client/core/parse-glyph-set.js new file mode 100644 index 0000000000..0c69664fdb --- /dev/null +++ b/src/fontra/client/core/parse-glyph-set.js @@ -0,0 +1,33 @@ +import { getCodePointFromGlyphName } from "./glyph-data.js"; + +export const glyphSetDataFormats = [ + { value: "auto-detect", label: "auto-detect" }, + { value: "glyph-names", label: "Glyph names (whitespace-separated)" }, + { value: "csv", label: "CSV (comma- or semicolon-separated)" }, + { value: "tsv", label: "TSV (tab-separated)" }, +]; + +export function parseGlyphSet(sourceData, dataFormat) { + sourceData = sourceData.replaceAll("\r\n", "\n"); // normalize line endings + + // TODO: TSV/CSV, etc. + + const glyphSet = []; + for (let line of sourceData.split("\n")) { + const commentIndex = line.indexOf("#"); + if (commentIndex >= 0) { + line = line.slice(0, commentIndex); + } + line = line.trim(); + if (!line) { + continue; + } + + for (const glyphName of line.split(/\s+/)) { + const codePoint = getCodePointFromGlyphName(glyphName); + glyphSet.push({ glyphName, codePoints: codePoint ? [codePoint] : [] }); + } + } + + return glyphSet; +} diff --git a/src/fontra/client/core/ui-utils.js b/src/fontra/client/core/ui-utils.js index 986667cf7a..b4b559bbba 100644 --- a/src/fontra/client/core/ui-utils.js +++ b/src/fontra/client/core/ui-utils.js @@ -1,5 +1,6 @@ import * as html from "./html-utils.js"; import { uniqueID, zip } from "./utils.js"; +import { PopupMenu } from "/web-components/popup-menu.js"; const containerClassName = "fontra-ui-sortable-list-container"; const draggingClassName = "fontra-ui-sortable-list-dragging"; @@ -101,6 +102,13 @@ export function labeledCheckbox(label, controller, key, options) { inputElement.checked = controller.model[key]; inputWrapper.appendChild(inputElement); if (label) { + inputWrapper.style = ` + display: grid; + grid-template-columns: auto auto; + justify-content: left; + gap: 0.1em; + align-items: center; + `; inputWrapper.appendChild(html.label({ for: checkboxID }, [label])); } @@ -171,37 +179,32 @@ export function labeledTextInput(label, controller, key, options) { return items; } -export function popUpMenu(controller, key, menuItems, options) { - const popUpID = options?.id || `pop-up-${uniqueID()}-${key}`; - - const selectElement = html.select( - { - id: popUpID, - onchange: (event) => { - controller.model[key] = event.target.value; - }, - }, - menuItems.map((menuItem) => - html.option({ value: menuItem.identifier }, [menuItem.value]) - ) - ); - selectElement.value = controller.model[key]; +export function popupSelect(controller, key, popupItems) { + function findLabel() { + const option = popupItems.find(({ value }) => value === controller.model[key]); + return option?.label || ""; + } controller.addKeyListener(key, (event) => { - selectElement.value = event.newValue; + menu.valueLabel = findLabel(); }); - if (options?.class) { - selectElement.className = options.class; - } - - return selectElement; + const menu = new PopupMenu(findLabel(), () => + popupItems.map(({ value, label }) => ({ + title: label, + checked: value === controller.model[key], + callback: () => { + controller.model[key] = value; + menu.valueLabel = label; + }, + })) + ); + return menu; } -export function labeledPopUpMenu(label, controller, key, menuItems, options) { - const popUpMenuElement = popUpMenu(controller, key, menuItems, options); - const items = [labelForElement(label, popUpMenuElement), popUpMenuElement]; - return items; +export function labeledPopupSelect(label, controller, key, popupItems) { + const inputElement = popupSelect(controller, key, popupItems); + return [labelForElement(label, inputElement), inputElement]; } export const DefaultFormatter = { diff --git a/src/fontra/client/css/core.css b/src/fontra/client/css/core.css index 91cf060fb0..2f5fbe1edf 100644 --- a/src/fontra/client/css/core.css +++ b/src/fontra/client/css/core.css @@ -152,28 +152,6 @@ icon-button { width: 1.25em; } -input[type="button"] { - cursor: pointer; - background-color: #ddd; - - border-radius: 1em; - padding: 0.35em 2em 0.35em 2em; - - border: none; - font-family: fontra-ui-regular, sans-serif; - font-size: 1em; - text-align: center; - transition: 100ms; -} - -input[type="button"]:hover { - background-color: #ccc; -} - -input[type="button"]:active { - background-color: #bbb; -} - .top-bar-container { position: relative; /* for z-index */ z-index: 200; diff --git a/src/fontra/client/css/shared.css b/src/fontra/client/css/shared.css index 0e2948b08a..543d684d15 100644 --- a/src/fontra/client/css/shared.css +++ b/src/fontra/client/css/shared.css @@ -3,3 +3,36 @@ *::after { box-sizing: border-box; } + +.fontra-button { + cursor: pointer; + background-color: #ddd; + + border-radius: 1em; + padding: 0.35em 2em 0.35em 2em; + + border: none; + font-family: fontra-ui-regular, sans-serif; + font-size: 1em; + text-align: center; + transition: 100ms; +} + +.fontra-button:hover { + background-color: #ccc; +} + +.fontra-button:active { + background-color: #bbb; +} + +/* +This is a workaround. We don't necessarily want to suppress the focus ring, +but we're running into a (Chrome) bug where a button gets focus when it +shouldn't: when a dialog gets dismissed with a key event, the button that +caused the dialog to *open* wrongly gets the focus. +*/ +button, +input[type="button"]:focus { + outline: none; +} diff --git a/src/fontra/client/lang/de.js b/src/fontra/client/lang/de.js index 26f2d462c8..ffe982baa2 100644 --- a/src/fontra/client/lang/de.js +++ b/src/fontra/client/lang/de.js @@ -29,6 +29,7 @@ export const strings = { "action.edit-guideline": "Hilfslinie bearbeiten", "action.export-as.designspace": "Designspace + UFO (*.designspace)", "action.export-as.fontra": "Fontra (*.fontra)", + "action.export-as.glyphs": "Glyphs (*.glyphs)", "action.export-as.otf": "OpenType (*.otf)", "action.export-as.rcjk": "RCJK (*.rcjk)", "action.export-as.ttf": "TrueType (*.ttf)", diff --git a/src/fontra/client/lang/en.js b/src/fontra/client/lang/en.js index d0eb1bc6d4..099afe5891 100644 --- a/src/fontra/client/lang/en.js +++ b/src/fontra/client/lang/en.js @@ -29,6 +29,7 @@ export const strings = { "action.edit-guideline": "Edit Guideline", "action.export-as.designspace": "Designspace + UFO (*.designspace)", "action.export-as.fontra": "Fontra (*.fontra)", + "action.export-as.glyphs": "Glyphs (*.glyphs)", "action.export-as.otf": "OpenType (*.otf)", "action.export-as.rcjk": "RCJK (*.rcjk)", "action.export-as.ttf": "TrueType (*.ttf)", diff --git a/src/fontra/client/lang/fr.js b/src/fontra/client/lang/fr.js index 2912253f1b..df68ca1079 100644 --- a/src/fontra/client/lang/fr.js +++ b/src/fontra/client/lang/fr.js @@ -29,6 +29,7 @@ export const strings = { "action.edit-guideline": "Éditer le guide", "action.export-as.designspace": "Designspace + UFO (*.designspace)", "action.export-as.fontra": "Fontra (*.fontra)", + "action.export-as.glyphs": "Glyphs (*.glyphs)", "action.export-as.otf": "OpenType (*.otf)", "action.export-as.rcjk": "RCJK (*.rcjk)", "action.export-as.ttf": "TrueType (*.ttf)", diff --git a/src/fontra/client/lang/ja.js b/src/fontra/client/lang/ja.js index 7f2d687d46..c54c5f7c92 100644 --- a/src/fontra/client/lang/ja.js +++ b/src/fontra/client/lang/ja.js @@ -29,6 +29,7 @@ export const strings = { "action.edit-guideline": "ガイドラインを編集", "action.export-as.designspace": "Designspace + UFO (*.designspace)", "action.export-as.fontra": "Fontra (*.fontra)", + "action.export-as.glyphs": "Glyphs (*.glyphs)", "action.export-as.otf": "OpenType (*.otf)", "action.export-as.rcjk": "RCJK (*.rcjk)", "action.export-as.ttf": "TrueType (*.ttf)", diff --git a/src/fontra/client/lang/nl.js b/src/fontra/client/lang/nl.js index fcb3bbeda8..dc97dcbc9a 100644 --- a/src/fontra/client/lang/nl.js +++ b/src/fontra/client/lang/nl.js @@ -29,6 +29,7 @@ export const strings = { "action.edit-guideline": "Edit Guideline", "action.export-as.designspace": "Designspace + UFO (*.designspace)", "action.export-as.fontra": "Fontra (*.fontra)", + "action.export-as.glyphs": "Glyphs (*.glyphs)", "action.export-as.otf": "OpenType (*.otf)", "action.export-as.rcjk": "RCJK (*.rcjk)", "action.export-as.ttf": "TrueType (*.ttf)", diff --git a/src/fontra/client/lang/zh-CN.js b/src/fontra/client/lang/zh-CN.js index e23a39f6ed..b357cc1510 100644 --- a/src/fontra/client/lang/zh-CN.js +++ b/src/fontra/client/lang/zh-CN.js @@ -29,6 +29,7 @@ export const strings = { "action.edit-guideline": "编辑参考线", "action.export-as.designspace": "Designspace + UFO (*.designspace)", "action.export-as.fontra": "Fontra (*.fontra)", + "action.export-as.glyphs": "Glyphs (*.glyphs)", "action.export-as.otf": "OpenType (*.otf)", "action.export-as.rcjk": "RCJK (*.rcjk)", "action.export-as.ttf": "TrueType (*.ttf)", diff --git a/src/fontra/client/web-components/add-remove-buttons.js b/src/fontra/client/web-components/add-remove-buttons.js index fb039d303c..c8de47035a 100644 --- a/src/fontra/client/web-components/add-remove-buttons.js +++ b/src/fontra/client/web-components/add-remove-buttons.js @@ -55,6 +55,10 @@ class AddRemoveButtons extends html.UnlitElement { background-color: var(--button-active-color); cursor: pointer; } + + button:focus { + outline: none; + } `; static properties = { diff --git a/src/fontra/client/web-components/glyph-cell-view.js b/src/fontra/client/web-components/glyph-cell-view.js index 9dbf06acfb..e3a3ebad69 100644 --- a/src/fontra/client/web-components/glyph-cell-view.js +++ b/src/fontra/client/web-components/glyph-cell-view.js @@ -96,6 +96,8 @@ export class GlyphCellView extends HTMLElement { this.accordion.appendStyle(` :host { display: ${this.displayMode}; + user-select: none; + -webkit-user-select: none; } .placeholder-label { diff --git a/src/fontra/client/web-components/glyph-cell.js b/src/fontra/client/web-components/glyph-cell.js index 41b29ea80b..4da507b735 100644 --- a/src/fontra/client/web-components/glyph-cell.js +++ b/src/fontra/client/web-components/glyph-cell.js @@ -86,6 +86,7 @@ export class GlyphCell extends UnlitElement { justify-items: center; gap: 0; user-select: none; + -webkit-user-select: none; } .glyph-shape-placeholder { diff --git a/src/fontra/client/web-components/icon-button.js b/src/fontra/client/web-components/icon-button.js index f5204527f5..d32c934f37 100644 --- a/src/fontra/client/web-components/icon-button.js +++ b/src/fontra/client/web-components/icon-button.js @@ -10,7 +10,6 @@ export class IconButton extends UnlitElement { border: none; padding: 0; margin: 0; - color: var(--foreground-color); width: 100%; height: 100%; cursor: pointer; @@ -78,6 +77,7 @@ export class IconButton extends UnlitElement { focus.restore(); }, disabled: this._buttonDisabled, + style: `color: undefined var(--foreground-color);`, // TODO: huh. }, [html.createDomElement("inline-svg", { src: this.src })] ); diff --git a/src/fontra/client/web-components/menu-bar.js b/src/fontra/client/web-components/menu-bar.js index f7969a7968..2f337676d3 100644 --- a/src/fontra/client/web-components/menu-bar.js +++ b/src/fontra/client/web-components/menu-bar.js @@ -24,6 +24,7 @@ export class MenuBar extends SimpleElement { padding: 0.4rem 0.6rem; cursor: default; user-select: none; + -webkit-user-select: none; } .menu-item.hovered, diff --git a/src/fontra/client/web-components/menu-panel.js b/src/fontra/client/web-components/menu-panel.js index b3c782d631..1205a914df 100644 --- a/src/fontra/client/web-components/menu-panel.js +++ b/src/fontra/client/web-components/menu-panel.js @@ -12,12 +12,13 @@ import { InlineSVG } from "/web-components/inline-svg.js"; export const MenuItemDivider = { title: "-" }; -export function showMenu(menuItems, position, positionContainer, container) { - if (!container) { - container = document.querySelector("#menu-panel-container"); - } - const menu = new MenuPanel(menuItems, { position, positionContainer }); +export function showMenu(menuItems, position, options) { + const container = getMenuContainer(); + const { left, top } = container.getBoundingClientRect(); + position = { x: position.x - left, y: position.y - top }; + const menu = new MenuPanel(menuItems, { position, ...options }); container.appendChild(menu); + return menu; } export class MenuPanel extends SimpleElement { @@ -25,7 +26,7 @@ export class MenuPanel extends SimpleElement { static closeAllMenus(event) { for (const element of MenuPanel.openMenuPanels) { - element.parentElement?.removeChild(element); + element.dismiss(); } MenuPanel.openMenuPanels.splice(0, MenuPanel.openMenuPanels.length); } @@ -58,6 +59,10 @@ export class MenuPanel extends SimpleElement { margin: 0.2em 0em 0.3em 0em; /* top, right, bottom, left */ } + .menu-container:focus { + outline: none; + } + .menu-item-divider { border: none; border-top: 1px solid #80808080; @@ -92,6 +97,7 @@ export class MenuPanel extends SimpleElement { display: flex; gap: 0.5em; justify-content: space-between; + text-wrap: nowrap; } .submenu-icon { @@ -195,6 +201,7 @@ export class MenuPanel extends SimpleElement { this.shadowRoot.appendChild(this.menuElement); this.tabIndex = 0; this.addEventListener("keydown", (event) => this.handleKeyDown(event)); + setTimeout(() => this.menuElement.focus(), 0); MenuPanel.openMenuPanels.push(this); } @@ -212,17 +219,18 @@ export class MenuPanel extends SimpleElement { this._savedActiveElement = document.activeElement; const position = { ...this.position }; this.style = `display: inherited; left: ${position.x}px; top: ${position.y}px;`; - if (this.positionContainer) { - const containerRect = this.positionContainer.getBoundingClientRect(); - const thisRect = this.getBoundingClientRect(); - if (thisRect.right > containerRect.right) { - position.x -= thisRect.width + 2; - } - if (thisRect.bottom > containerRect.bottom) { - position.y -= thisRect.bottom - containerRect.bottom + 2; - } - this.style = `display: inherited; left: ${position.x}px; top: ${position.y}px;`; + + // Ensure the whole menu is visible, and not cropped by the window + const containerRect = document.body.getBoundingClientRect(); + const thisRect = this.getBoundingClientRect(); + if (thisRect.right > containerRect.right) { + position.x -= thisRect.width + 2; } + if (thisRect.bottom > containerRect.bottom) { + position.y -= thisRect.bottom - containerRect.bottom + 2; + } + this.style = `display: inherited; left: ${position.x}px; top: ${position.y}px;`; + this.focus(); } @@ -281,6 +289,8 @@ export class MenuPanel extends SimpleElement { } handleKeyDown(event) { + event.preventDefault(); + event.stopImmediatePropagation(); this.searchMenuItems(event.key); switch (event.key) { case "Escape": @@ -381,3 +391,15 @@ customElements.define("menu-panel", MenuPanel); window.addEventListener("mousedown", (event) => MenuPanel.closeAllMenus(event)); window.addEventListener("blur", (event) => MenuPanel.closeAllMenus(event)); + +function getMenuContainer() { + // This is tightly coupled to modal-dialog.js + // We need to return a different container if the menu is opened from a dialog + const dialog = document.querySelector("modal-dialog"); + + const dialogContainer = dialog?.isActive() + ? dialog.shadowRoot.querySelector(".dialog-box") + : null; + + return dialogContainer || document.body; +} diff --git a/src/fontra/client/web-components/modal-dialog.js b/src/fontra/client/web-components/modal-dialog.js index af6fba7b76..db37a8612b 100644 --- a/src/fontra/client/web-components/modal-dialog.js +++ b/src/fontra/client/web-components/modal-dialog.js @@ -61,7 +61,7 @@ export class ModalDialog extends SimpleElement { gap: 1em; outline: none; /* to catch key events we need to focus, but we don't want a focus border */ - max-width: 32em; + max-width: 38em; max-height: 80vh; overflow-wrap: normal; font-size: 1.15em; @@ -162,6 +162,10 @@ export class ModalDialog extends SimpleElement { this.shadowRoot.append(this.dialogElement); } + focus() { + this.dialogBox?.focus(); + } + setupDialog(headline, message, buttonDefs, autoDismissTimeout) { buttonDefs = buttonDefs.map((bd) => { return { ...bd }; @@ -304,6 +308,10 @@ export class ModalDialog extends SimpleElement { this._resolveDialogResult(result); } + + isActive() { + return !!this.dialogContent; + } } customElements.define("modal-dialog", ModalDialog); diff --git a/src/fontra/client/web-components/popup-menu.js b/src/fontra/client/web-components/popup-menu.js new file mode 100644 index 0000000000..221457c9ff --- /dev/null +++ b/src/fontra/client/web-components/popup-menu.js @@ -0,0 +1,106 @@ +import { InlineSVG } from "./inline-svg.js"; +import { showMenu } from "./menu-panel.js"; +import { themeColorCSS } from "./theme-support.js"; +import * as html from "/core/html-utils.js"; +import { UnlitElement } from "/core/html-utils.js"; + +const colors = { + "border-color": ["#0004", "#FFF4"], + "hover-color": ["#ccc", "#444"], +}; + +export class PopupMenu extends UnlitElement { + static styles = ` + ${themeColorCSS(colors)} + + #popup-menu { + background-color: var(--text-input-background-color); + border-radius: 0.25em; + padding: 0.1em 0.4em; + display: grid; + grid-template-columns: auto max-content; + gap: 0.4em; + border: 1px solid var(--border-color); + } + + #popup-menu:hover { + background-color: var(--hover-color); + } + + inline-svg { + display: inline-block; + height: 1.25em; + width: 1.25em; + transform: rotate(180deg); + } + `; + + static properties = { + valueLabel: { type: String }, + }; + + constructor(valueLabel, getMenuItemsFunc) { + super(); + this.valueLabel = valueLabel; + this._getMenuItems = getMenuItemsFunc; + } + + render() { + return html.div( + { id: "popup-menu", onmousedown: (event) => this._handleClickEvent(event) }, + [ + html.span({}, [this.valueLabel]), + html.createDomElement("inline-svg", { + src: "/tabler-icons/chevron-up.svg", + }), + ] + ); + } + + _handleClickEvent(event) { + event.preventDefault(); + event.stopImmediatePropagation(); + if (this._menu) { + this._menu.dismiss(); + delete this._menu; + return; + } + + const dialogParent = null; //this._findDialogParent(); + const thisRect = this.getBoundingClientRect(); + let pos; + + if (dialogParent) { + const dialogRect = dialogParent.getBoundingClientRect(); + pos = { + x: thisRect.left - dialogRect.left, + y: thisRect.bottom - dialogRect.y, + }; + } else { + pos = { x: thisRect.left, y: thisRect.bottom }; + } + + this._menu = showMenu( + this._getMenuItems?.() || [{ title: "Oops, menu items were not provided" }], + pos, + { + onClose: () => { + delete this._menu; + }, + } + ); + } + + _findDialogParent() { + let parent = this; + while (parent) { + if (parent.classList.contains("dialog-box")) { + return parent; + } + parent = parent.parentElement; + } + return null; + } +} + +customElements.define("popup-menu", PopupMenu); diff --git a/src/fontra/core/remote.py b/src/fontra/core/remote.py index 95c5d901ab..7a12131115 100644 --- a/src/fontra/core/remote.py +++ b/src/fontra/core/remote.py @@ -137,8 +137,8 @@ class RemoteClientProxy: def __init__(self, connection): self._connection = connection - async def messageFromServer(self, text): - return await self._connection.callMethod("messageFromServer", text) + async def messageFromServer(self, headline, message): + return await self._connection.callMethod("messageFromServer", headline, message) async def externalChange(self, change, isLiveChange): return await self._connection.callMethod("externalChange", change, isLiveChange) diff --git a/src/fontra/views/applicationsettings/panel-shortcuts.js b/src/fontra/views/applicationsettings/panel-shortcuts.js index 3e1c1a530d..0b3e96bb07 100644 --- a/src/fontra/views/applicationsettings/panel-shortcuts.js +++ b/src/fontra/views/applicationsettings/panel-shortcuts.js @@ -72,6 +72,7 @@ export class ShortCutsPanel extends BaseInfoPanel { containerButtons.appendChild( html.input({ type: "button", + class: "fontra-button", style: `justify-self: start;`, value: translate("shortcuts.reset-all"), onclick: (event) => this.resetToDefault(), @@ -81,6 +82,7 @@ export class ShortCutsPanel extends BaseInfoPanel { containerButtons.appendChild( html.input({ type: "button", + class: "fontra-button", style: `justify-self: start;`, value: translate("shortcuts.export"), onclick: (event) => this.exportShortCuts(), @@ -90,6 +92,7 @@ export class ShortCutsPanel extends BaseInfoPanel { containerButtons.appendChild( html.input({ type: "button", + class: "fontra-button", style: `justify-self: start;`, value: translate("shortcuts.import"), onclick: (event) => this.importShortCuts(), diff --git a/src/fontra/views/editor/editor.css b/src/fontra/views/editor/editor.css index 5343b65fca..5011d7d6e8 100644 --- a/src/fontra/views/editor/editor.css +++ b/src/fontra/views/editor/editor.css @@ -302,13 +302,6 @@ body { /* sidebar content styling */ -#menu-panel-container { - position: absolute; - overflow: hidden; - width: 100%; - height: 100%; -} - .sidebar-resize-gutter { height: 100%; width: 4px; diff --git a/src/fontra/views/editor/editor.html b/src/fontra/views/editor/editor.html index 81e6a9dfc6..c4c3531962 100644 --- a/src/fontra/views/editor/editor.html +++ b/src/fontra/views/editor/editor.html @@ -26,8 +26,6 @@