diff --git a/electron/updateChannel.test.ts b/electron/updateChannel.test.ts index 149e9fba..646c65c3 100644 --- a/electron/updateChannel.test.ts +++ b/electron/updateChannel.test.ts @@ -1,8 +1,5 @@ import { describe, expect, it } from "vitest"; -import { - EXPERIMENTAL_UPDATE_DESCRIPTION, - getUpdateChannelConfiguration, -} from "./updateChannel"; +import { EXPERIMENTAL_UPDATE_DESCRIPTION, getUpdateChannelConfiguration } from "./updateChannel"; describe("getUpdateChannelConfiguration", () => { it("keeps regular clients on stable metadata", () => { diff --git a/electron/updateChannel.ts b/electron/updateChannel.ts index 0488db02..9ca9ce96 100644 --- a/electron/updateChannel.ts +++ b/electron/updateChannel.ts @@ -13,9 +13,7 @@ export function getUpdateChannelConfiguration( experimentalUpdatesEnabled: boolean, ): UpdateChannelConfiguration { return { - channel: experimentalUpdatesEnabled - ? EXPERIMENTAL_UPDATE_CHANNEL - : STABLE_UPDATE_CHANNEL, + channel: experimentalUpdatesEnabled ? EXPERIMENTAL_UPDATE_CHANNEL : STABLE_UPDATE_CHANNEL, allowPrerelease: experimentalUpdatesEnabled, allowDowngrade: false, }; diff --git a/electron/updater.ts b/electron/updater.ts index c887e634..8fb24177 100644 --- a/electron/updater.ts +++ b/electron/updater.ts @@ -5,10 +5,7 @@ import { app, BrowserWindow, dialog } from "electron"; import { autoUpdater } from "electron-updater"; import { USER_DATA_PATH } from "./appPaths"; import { readAppSetting, writeAppSetting } from "./appSettingsStore"; -import { - EXPERIMENTAL_UPDATE_DESCRIPTION, - getUpdateChannelConfiguration, -} from "./updateChannel"; +import { EXPERIMENTAL_UPDATE_DESCRIPTION, getUpdateChannelConfiguration } from "./updateChannel"; const UPDATE_CHECK_INTERVAL_MS = 6 * 60 * 60 * 1000; export const UPDATE_REMINDER_DELAY_MS = 3 * 60 * 60 * 1000; diff --git a/electron/windows.ts b/electron/windows.ts index f45a9d97..f9a25aa1 100644 --- a/electron/windows.ts +++ b/electron/windows.ts @@ -209,7 +209,9 @@ function getUpdateToastBounds() { const display = getScreen().getDisplayMatching(hudBounds); const { workArea } = display; const x = Math.round(workArea.x + (workArea.width - UPDATE_TOAST_WIDTH) / 2); - const y = Math.round(workArea.y + workArea.height - UPDATE_TOAST_HEIGHT - HUD_EDGE_MARGIN_DIP); + const y = Math.round( + workArea.y + workArea.height - UPDATE_TOAST_HEIGHT - HUD_EDGE_MARGIN_DIP, + ); return { x, @@ -460,7 +462,11 @@ export function createHudOverlayWindow(): BrowserWindow { if (hasShownHudWindow || win.isDestroyed()) { return; } - if (updateToastWindow && !updateToastWindow.isDestroyed() && updateToastWindow.isVisible()) { + if ( + updateToastWindow && + !updateToastWindow.isDestroyed() && + updateToastWindow.isVisible() + ) { hudWasVisibleBeforeUpdateToast = true; return; } diff --git a/src/assets/cursors/windows11/arrow__31-22.svg b/src/assets/cursors/windows11/arrow__31-22.svg new file mode 100644 index 00000000..f17b1589 --- /dev/null +++ b/src/assets/cursors/windows11/arrow__31-22.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/cursors/windows11/block__50-50.svg b/src/assets/cursors/windows11/block__50-50.svg new file mode 100644 index 00000000..7e49badc --- /dev/null +++ b/src/assets/cursors/windows11/block__50-50.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/cursors/windows11/busy__50-50.svg b/src/assets/cursors/windows11/busy__50-50.svg new file mode 100644 index 00000000..c47a7ae1 --- /dev/null +++ b/src/assets/cursors/windows11/busy__50-50.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/assets/cursors/windows11/cross__50-50.svg b/src/assets/cursors/windows11/cross__50-50.svg new file mode 100644 index 00000000..5e0d5e52 --- /dev/null +++ b/src/assets/cursors/windows11/cross__50-50.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/cursors/windows11/grab__50-50.svg b/src/assets/cursors/windows11/grab__50-50.svg new file mode 100644 index 00000000..7408fdfe --- /dev/null +++ b/src/assets/cursors/windows11/grab__50-50.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/cursors/windows11/grabbing__50-50.svg b/src/assets/cursors/windows11/grabbing__50-50.svg new file mode 100644 index 00000000..c338b955 --- /dev/null +++ b/src/assets/cursors/windows11/grabbing__50-50.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/cursors/windows11/help__31-22.svg b/src/assets/cursors/windows11/help__31-22.svg new file mode 100644 index 00000000..d7a4ebb5 --- /dev/null +++ b/src/assets/cursors/windows11/help__31-22.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/cursors/windows11/move__51-51.svg b/src/assets/cursors/windows11/move__51-51.svg new file mode 100644 index 00000000..459ebcb9 --- /dev/null +++ b/src/assets/cursors/windows11/move__51-51.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/cursors/windows11/pen__19-19.svg b/src/assets/cursors/windows11/pen__19-19.svg new file mode 100644 index 00000000..bc05a6a3 --- /dev/null +++ b/src/assets/cursors/windows11/pen__19-19.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/cursors/windows11/person__50-50.svg b/src/assets/cursors/windows11/person__50-50.svg new file mode 100644 index 00000000..f4fded61 --- /dev/null +++ b/src/assets/cursors/windows11/person__50-50.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/cursors/windows11/pin__75-97.svg b/src/assets/cursors/windows11/pin__75-97.svg new file mode 100644 index 00000000..f7242aec --- /dev/null +++ b/src/assets/cursors/windows11/pin__75-97.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/cursors/windows11/pointer__54-35.svg b/src/assets/cursors/windows11/pointer__54-35.svg new file mode 100644 index 00000000..42e241f7 --- /dev/null +++ b/src/assets/cursors/windows11/pointer__54-35.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/cursors/windows11/resize-diagonal-backslash__50-50.svg b/src/assets/cursors/windows11/resize-diagonal-backslash__50-50.svg new file mode 100644 index 00000000..2119d5fa --- /dev/null +++ b/src/assets/cursors/windows11/resize-diagonal-backslash__50-50.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/cursors/windows11/resize-diagonal-slash__50-50.svg b/src/assets/cursors/windows11/resize-diagonal-slash__50-50.svg new file mode 100644 index 00000000..ebd706fc --- /dev/null +++ b/src/assets/cursors/windows11/resize-diagonal-slash__50-50.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/cursors/windows11/resize-horizontal__51-49.svg b/src/assets/cursors/windows11/resize-horizontal__51-49.svg new file mode 100644 index 00000000..25cde2ee --- /dev/null +++ b/src/assets/cursors/windows11/resize-horizontal__51-49.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/cursors/windows11/resize-vertical__48-50.svg b/src/assets/cursors/windows11/resize-vertical__48-50.svg new file mode 100644 index 00000000..73149d2e --- /dev/null +++ b/src/assets/cursors/windows11/resize-vertical__48-50.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/cursors/windows11/text__50-50.svg b/src/assets/cursors/windows11/text__50-50.svg new file mode 100644 index 00000000..bf38ba24 --- /dev/null +++ b/src/assets/cursors/windows11/text__50-50.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/cursors/windows11/up__49-21.svg b/src/assets/cursors/windows11/up__49-21.svg new file mode 100644 index 00000000..f87afc9d --- /dev/null +++ b/src/assets/cursors/windows11/up__49-21.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/cursors/windows11/wait__50-50.svg b/src/assets/cursors/windows11/wait__50-50.svg new file mode 100644 index 00000000..cb00c79e --- /dev/null +++ b/src/assets/cursors/windows11/wait__50-50.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/cursors/windows11/zoom-in__44-44.svg b/src/assets/cursors/windows11/zoom-in__44-44.svg new file mode 100644 index 00000000..b0535098 --- /dev/null +++ b/src/assets/cursors/windows11/zoom-in__44-44.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/cursors/windows11/zoom-out__44-44.svg b/src/assets/cursors/windows11/zoom-out__44-44.svg new file mode 100644 index 00000000..5bfec5cb --- /dev/null +++ b/src/assets/cursors/windows11/zoom-out__44-44.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/components/launch/UpdateToastWindow.tsx b/src/components/launch/UpdateToastWindow.tsx index 13e96478..9716ed30 100644 --- a/src/components/launch/UpdateToastWindow.tsx +++ b/src/components/launch/UpdateToastWindow.tsx @@ -151,7 +151,9 @@ export function UpdateToastWindow() { return (
-
+
@@ -175,7 +177,10 @@ export function UpdateToastWindow() { {payload.phase === "downloading" ? (
-
+
{progress}% @@ -184,10 +189,18 @@ export function UpdateToastWindow() {
) : (
- -
diff --git a/src/components/video-editor/SettingsPanel.tsx b/src/components/video-editor/SettingsPanel.tsx index de5255e3..1f998e98 100644 --- a/src/components/video-editor/SettingsPanel.tsx +++ b/src/components/video-editor/SettingsPanel.tsx @@ -688,6 +688,7 @@ const BUILTIN_CURSOR_STYLE_OPTIONS: CursorStyleOption[] = [ { value: "macos", label: "macOS" }, { value: "tahoe", label: "Tahoe" }, { value: "tahoe-inverted", label: "Tahoe Inverted" }, + { value: "windows11", label: "Windows 11" }, { value: "dot", label: "Dot" }, { value: "figma", label: "Minimal" }, ]; @@ -871,13 +872,20 @@ function CursorStylePreview({ ? (previewUrls.macos ?? tahoeCursorUrl) : style === "tahoe" ? (previewUrls.tahoe ?? tahoeCursorUrl) - : style === "figma" - ? (previewUrls.figma ?? minimalCursorUrl) - : style === "tahoe-inverted" - ? (previewUrls["tahoe-inverted"] ?? tahoeCursorUrl) - : previewUrls[style]; + : style === "windows11" + ? (previewUrls.windows11 ?? tahoeCursorUrl) + : style === "figma" + ? (previewUrls.figma ?? minimalCursorUrl) + : style === "tahoe-inverted" + ? (previewUrls["tahoe-inverted"] ?? tahoeCursorUrl) + : previewUrls[style]; - if (style === "macos" || style === "tahoe" || style === "tahoe-inverted") { + if ( + style === "macos" || + style === "tahoe" || + style === "tahoe-inverted" || + style === "windows11" + ) { const resolvedPreviewSize = (previewSize ?? BUILTIN_CURSOR_PREVIEW_SIZE) * getCursorStyleSizeMultiplier(style); return ( @@ -1238,6 +1246,7 @@ export function SettingsPanel({ try { const macosPreview = cursorSetAssets.macos.arrow.url; const tahoePreview = cursorSetAssets.tahoe.arrow.url; + const windows11Preview = cursorSetAssets.windows11.arrow.url; const minimalPreview = await createTrimmedSvgPreview(minimalCursorUrl, 512); const invertedPreview = await createInvertedPreview(tahoePreview); @@ -1245,6 +1254,7 @@ export function SettingsPanel({ setBuiltInCursorPreviewUrls({ macos: macosPreview, tahoe: tahoePreview, + windows11: windows11Preview, figma: minimalPreview, "tahoe-inverted": invertedPreview, }); @@ -1254,6 +1264,7 @@ export function SettingsPanel({ setBuiltInCursorPreviewUrls({ macos: tahoeCursorUrl, tahoe: tahoeCursorUrl, + windows11: tahoeCursorUrl, figma: minimalCursorUrl, "tahoe-inverted": tahoeCursorUrl, }); diff --git a/src/components/video-editor/cursorMotionPresets.ts b/src/components/video-editor/cursorMotionPresets.ts index 22f2dc67..57283c2a 100644 --- a/src/components/video-editor/cursorMotionPresets.ts +++ b/src/components/video-editor/cursorMotionPresets.ts @@ -33,7 +33,7 @@ const SHARED_CURSOR_PRESET_VALUES = { cursorSize: 2.5, cursorSmoothing: 0.67, cursorSpringMassMultiplier: 1.29, - cursorClickBounce: 3.5, + cursorClickBounce: 2, cursorClickBounceDuration: 350, } as const; diff --git a/src/components/video-editor/types.ts b/src/components/video-editor/types.ts index 253cf52f..0b75c0e4 100644 --- a/src/components/video-editor/types.ts +++ b/src/components/video-editor/types.ts @@ -55,7 +55,14 @@ export interface CursorVisualSettings { style: CursorStyle; } -export type CursorStyle = "macos" | "tahoe" | "tahoe-inverted" | "dot" | "figma" | (string & {}); +export type CursorStyle = + | "macos" + | "tahoe" + | "tahoe-inverted" + | "windows11" + | "dot" + | "figma" + | (string & {}); export const DEFAULT_CURSOR_STYLE: CursorStyle = "tahoe"; export type CursorClickEffectStyle = "none" | "spotlight" | "ripple" | "echo"; @@ -148,7 +155,7 @@ export interface WebcamOverlaySettings { export const DEFAULT_CURSOR_SIZE = 3.0; export const DEFAULT_CURSOR_SMOOTHING = 0.67; export const DEFAULT_CURSOR_MOTION_BLUR = 0.6; -export const DEFAULT_CURSOR_CLICK_BOUNCE = 2.5; +export const DEFAULT_CURSOR_CLICK_BOUNCE = 2; export const DEFAULT_CURSOR_CLICK_BOUNCE_DURATION = 350; export const DEFAULT_CURSOR_SWAY = 0.4; export const DEFAULT_ZOOM_SMOOTHNESS = 0.5; diff --git a/src/components/video-editor/videoPlayback/cursorRenderer.ts b/src/components/video-editor/videoPlayback/cursorRenderer.ts index def88661..7988c857 100644 --- a/src/components/video-editor/videoPlayback/cursorRenderer.ts +++ b/src/components/video-editor/videoPlayback/cursorRenderer.ts @@ -29,7 +29,7 @@ import { cursorSetAssets, getCursorStyleSizeMultiplier } from "./uploadedCursorA import { computeDirectionalMotionBlur } from "./zoomTransform"; type CursorAssetKey = NonNullable; -type StatefulCursorStyle = Extract; +type StatefulCursorStyle = Extract; type SingleCursorStyle = Extract; type CursorPackStyle = Exclude; type CursorPackVariant = "default" | "pointer"; @@ -125,6 +125,7 @@ const CURSOR_SHADOW_OFFSET_X = 0; const CURSOR_SHADOW_OFFSET_Y = 2; const CURSOR_SHADOW_BLUR = 3; const CURSOR_SHADOW_PADDING = 12; +const MIN_RASTERIZED_CURSOR_HEIGHT = 512; const NATIVE_CURSOR_ATLAS_DRAW_HEIGHT = 256; const NATIVE_CURSOR_ATLAS_PADDING = 2; @@ -191,7 +192,12 @@ function buildCursorPackSourcesSignature(sources: Record { const image = await loadImage(url); const sourceCanvas = document.createElement("canvas"); - sourceCanvas.width = image.naturalWidth; - sourceCanvas.height = image.naturalHeight; + const rasterScale = + image.naturalHeight > 0 + ? Math.max(1, MIN_RASTERIZED_CURSOR_HEIGHT / image.naturalHeight) + : 1; + sourceCanvas.width = Math.max(1, Math.round(image.naturalWidth * rasterScale)); + sourceCanvas.height = Math.max(1, Math.round(image.naturalHeight * rasterScale)); const sourceCtx = sourceCanvas.getContext("2d"); if (!sourceCtx) { await Assets.load(url); @@ -293,7 +304,21 @@ async function createRasterizedCursorAsset( } sourceCtx.clearRect(0, 0, sourceCanvas.width, sourceCanvas.height); - sourceCtx.drawImage(image, 0, 0); + sourceCtx.drawImage(image, 0, 0, sourceCanvas.width, sourceCanvas.height); + + if (options.preserveCanvas) { + const dataUrl = sourceCanvas.toDataURL("image/png"); + await Assets.load(dataUrl); + const rasterizedImage = await loadImage(dataUrl); + const texture = configureCursorTexture(Texture.from(dataUrl)); + return { + texture, + image: rasterizedImage, + aspectRatio: sourceCanvas.height > 0 ? sourceCanvas.width / sourceCanvas.height : 1, + anchorX: clamp(anchor.x, 0, 1), + anchorY: clamp(anchor.y, 0, 1), + }; + } const trimmed = trimCanvasToAlpha(sourceCanvas, { x: sourceCanvas.width * clamp(anchor.x, 0, 1), @@ -546,6 +571,7 @@ export async function preloadCursorAssets() { const asset = await createRasterizedCursorAsset( sourceAsset.url, sourceAsset.fallbackAnchor, + { preserveCanvas: sourceAsset.preserveCanvas }, ); return [key, asset] as const; @@ -564,9 +590,10 @@ export async function preloadCursorAssets() { ) as Partial>; } - const [macosAssets, tahoeAssets] = await Promise.all([ + const [macosAssets, tahoeAssets, windows11Assets] = await Promise.all([ loadCursorSet("macos"), loadCursorSet("tahoe"), + loadCursorSet("windows11"), ]); const invertedEntries = await Promise.all( @@ -578,6 +605,7 @@ export async function preloadCursorAssets() { loadedCursorSetAssets = { macos: macosAssets, tahoe: tahoeAssets, + windows11: windows11Assets, "tahoe-inverted": Object.fromEntries(invertedEntries) as Partial< Record >, diff --git a/src/components/video-editor/videoPlayback/uploadedCursorAssets.ts b/src/components/video-editor/videoPlayback/uploadedCursorAssets.ts index df2e55b0..b726301a 100644 --- a/src/components/video-editor/videoPlayback/uploadedCursorAssets.ts +++ b/src/components/video-editor/videoPlayback/uploadedCursorAssets.ts @@ -16,15 +16,26 @@ import tahoeArrowUrl from "../../../assets/cursors/tahoe/pointer-1__14-6.svg"; import tahoePointerUrl from "../../../assets/cursors/tahoe/pointinghand-1__40-10.svg"; import tahoeResizeEwUrl from "../../../assets/cursors/tahoe/resizeeastwest-1__50-50.svg"; import tahoeResizeNsUrl from "../../../assets/cursors/tahoe/resizenorthsouth-1__50-49.svg"; +import windows11ArrowUrl from "../../../assets/cursors/windows11/arrow__31-22.svg"; +import windows11ClosedHandUrl from "../../../assets/cursors/windows11/grabbing__50-50.svg"; +import windows11CrosshairUrl from "../../../assets/cursors/windows11/cross__50-50.svg"; +import windows11NotAllowedUrl from "../../../assets/cursors/windows11/block__50-50.svg"; +import windows11OpenHandUrl from "../../../assets/cursors/windows11/grab__50-50.svg"; +import windows11PointerUrl from "../../../assets/cursors/windows11/pointer__54-35.svg"; +import windows11ResizeEwUrl from "../../../assets/cursors/windows11/resize-horizontal__51-49.svg"; +import windows11ResizeNsUrl from "../../../assets/cursors/windows11/resize-vertical__48-50.svg"; +import windows11TextUrl from "../../../assets/cursors/windows11/text__50-50.svg"; import type { CursorStyle, CursorTelemetryPoint } from "../types"; type CursorAssetKey = NonNullable; -type CursorSetStyle = Extract; +type CursorSetStyle = Extract; const MACOS_POINTER_ASSET_HEIGHT = 746; const MACOS_POINTER_CONTENT_HEIGHT = 386; const TAHOE_POINTER_ASSET_HEIGHT = 958; const TAHOE_POINTER_CONTENT_HEIGHT = 851; +const WINDOWS11_CURSOR_VIEWBOX_HEIGHT = 32; +const WINDOWS11_ARROW_CONTENT_HEIGHT = 18; // Measured from the raw pointer assets using the non-shadow pixel bounds. const MACOS_CURSOR_STYLE_SIZE_MULTIPLIER = @@ -38,15 +49,22 @@ export type UploadedCursorAsset = { x: number; y: number; }; + preserveCanvas?: boolean; }; -function asset(url: string, hotspotX: number, hotspotY: number): UploadedCursorAsset { +function asset( + url: string, + hotspotX: number, + hotspotY: number, + options: Pick = {}, +): UploadedCursorAsset { return { url, fallbackAnchor: { x: hotspotX / 100, y: hotspotY / 100, }, + ...options, }; } @@ -76,12 +94,24 @@ export const cursorSetAssets: Record< "resize-ns": asset(tahoeResizeNsUrl, 50, 49), "not-allowed": asset(tahoeNotAllowedUrl, 23, 0), }, + windows11: { + arrow: asset(windows11ArrowUrl, 31, 22, { preserveCanvas: true }), + text: asset(windows11TextUrl, 50, 50, { preserveCanvas: true }), + pointer: asset(windows11PointerUrl, 54, 35, { preserveCanvas: true }), + crosshair: asset(windows11CrosshairUrl, 50, 50, { preserveCanvas: true }), + "open-hand": asset(windows11OpenHandUrl, 50, 50, { preserveCanvas: true }), + "closed-hand": asset(windows11ClosedHandUrl, 50, 50, { preserveCanvas: true }), + "resize-ew": asset(windows11ResizeEwUrl, 51, 49, { preserveCanvas: true }), + "resize-ns": asset(windows11ResizeNsUrl, 48, 50, { preserveCanvas: true }), + "not-allowed": asset(windows11NotAllowedUrl, 50, 50, { preserveCanvas: true }), + }, }; export const cursorStyleSizeMultipliers: Record = { macos: MACOS_CURSOR_STYLE_SIZE_MULTIPLIER, tahoe: 1, "tahoe-inverted": 1, + windows11: WINDOWS11_CURSOR_VIEWBOX_HEIGHT / WINDOWS11_ARROW_CONTENT_HEIGHT, }; export function getCursorStyleSizeMultiplier(style: CursorStyle) { diff --git a/src/i18n/locales/de/settings.json b/src/i18n/locales/de/settings.json index 485e7095..6d5bac29 100644 --- a/src/i18n/locales/de/settings.json +++ b/src/i18n/locales/de/settings.json @@ -35,6 +35,7 @@ "macos": "macOS", "tahoe": "Tahoe", "tahoe-inverted": "Tahoe invertiert", + "windows11": "Windows 11", "dot": "Punkt", "figma": "Minimal", "lavender": "Lavender", diff --git a/src/i18n/locales/en/settings.json b/src/i18n/locales/en/settings.json index 65cb98fb..31953838 100644 --- a/src/i18n/locales/en/settings.json +++ b/src/i18n/locales/en/settings.json @@ -41,6 +41,7 @@ "macos": "macOS", "tahoe": "Tahoe", "tahoe-inverted": "Tahoe Inverted", + "windows11": "Windows 11", "dot": "Dot", "figma": "Minimal", "lavender": "Lavender", diff --git a/src/i18n/locales/es/settings.json b/src/i18n/locales/es/settings.json index 2e346fc8..3690c13c 100644 --- a/src/i18n/locales/es/settings.json +++ b/src/i18n/locales/es/settings.json @@ -35,6 +35,7 @@ "macos": "macOS", "tahoe": "Tahoe", "tahoe-inverted": "Tahoe invertido", + "windows11": "Windows 11", "dot": "Punto", "figma": "Minimal", "lavender": "Lavender", diff --git a/src/i18n/locales/fr/settings.json b/src/i18n/locales/fr/settings.json index 5b957a0a..59b1e770 100644 --- a/src/i18n/locales/fr/settings.json +++ b/src/i18n/locales/fr/settings.json @@ -35,6 +35,7 @@ "macos": "macOS", "tahoe": "Tahoe", "tahoe-inverted": "Tahoe inversé", + "windows11": "Windows 11", "dot": "Point", "figma": "Minimal", "lavender": "Lavande", diff --git a/src/i18n/locales/it/settings.json b/src/i18n/locales/it/settings.json index e96a3725..4a00e1db 100644 --- a/src/i18n/locales/it/settings.json +++ b/src/i18n/locales/it/settings.json @@ -35,6 +35,7 @@ "macos": "macOS", "tahoe": "Tahoe", "tahoe-inverted": "Tahoe invertito", + "windows11": "Windows 11", "dot": "Punto", "figma": "Minimal", "lavender": "Lavanda", diff --git a/src/i18n/locales/ko/settings.json b/src/i18n/locales/ko/settings.json index ae22fe11..1c95bf2a 100644 --- a/src/i18n/locales/ko/settings.json +++ b/src/i18n/locales/ko/settings.json @@ -35,6 +35,7 @@ "macos": "macOS", "tahoe": "Tahoe", "tahoe-inverted": "Tahoe Inverted", + "windows11": "Windows 11", "dot": "Dot", "figma": "Minimal", "lavender": "Lavender", diff --git a/src/i18n/locales/nl/settings.json b/src/i18n/locales/nl/settings.json index 0dd527b4..31eeec7a 100644 --- a/src/i18n/locales/nl/settings.json +++ b/src/i18n/locales/nl/settings.json @@ -35,6 +35,7 @@ "macos": "macOS", "tahoe": "Tahoe", "tahoe-inverted": "Tahoe omgekeerd", + "windows11": "Windows 11", "dot": "Punt", "figma": "Minimaal", "lavender": "Lavendel", diff --git a/src/i18n/locales/pt-BR/settings.json b/src/i18n/locales/pt-BR/settings.json index 223c1e92..2e4bcf62 100644 --- a/src/i18n/locales/pt-BR/settings.json +++ b/src/i18n/locales/pt-BR/settings.json @@ -35,6 +35,7 @@ "macos": "macOS", "tahoe": "Tahoe", "tahoe-inverted": "Tahoe invertido", + "windows11": "Windows 11", "dot": "Dot", "figma": "Minimal", "lavender": "Lavender", diff --git a/src/i18n/locales/ru/settings.json b/src/i18n/locales/ru/settings.json index 8bb1161c..0d65dd89 100644 --- a/src/i18n/locales/ru/settings.json +++ b/src/i18n/locales/ru/settings.json @@ -35,6 +35,7 @@ "macos": "macOS", "tahoe": "Tahoe", "tahoe-inverted": "Tahoe (инверсия)", + "windows11": "Windows 11", "dot": "Точка", "figma": "Минималистичный", "lavender": "Лаванда", diff --git a/src/i18n/locales/zh-CN/settings.json b/src/i18n/locales/zh-CN/settings.json index 6282016c..e07f4cf9 100644 --- a/src/i18n/locales/zh-CN/settings.json +++ b/src/i18n/locales/zh-CN/settings.json @@ -35,6 +35,7 @@ "macos": "macOS", "tahoe": "Tahoe", "tahoe-inverted": "Tahoe 反相", + "windows11": "Windows 11", "dot": "圆点", "figma": "Minimal", "lavender": "Lavender", diff --git a/src/i18n/locales/zh-TW/settings.json b/src/i18n/locales/zh-TW/settings.json index f5028769..1e4d6e6d 100644 --- a/src/i18n/locales/zh-TW/settings.json +++ b/src/i18n/locales/zh-TW/settings.json @@ -35,6 +35,7 @@ "macos": "macOS", "tahoe": "Tahoe", "tahoe-inverted": "Tahoe 反相", + "windows11": "Windows 11", "dot": "圓點", "figma": "極簡", "lavender": "Lavender",