Merge pull request #850 from webadderallorg/codex/windows-11-cursors

Add Windows 11 cursor styles
This commit is contained in:
webadderall
2026-09-01 16:41:19 +10:00
committed by GitHub
42 changed files with 257 additions and 34 deletions
+1 -4
View File
@@ -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", () => {
+1 -3
View File
@@ -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,
};
+1 -4
View File
@@ -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;
+8 -2
View File
@@ -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;
}
@@ -0,0 +1,3 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M10 7L10 22.8L13.38 19.51L15.61 24.16L18.57 22.66L16.54 18.55H21.5L10 7Z" fill="white" stroke="black" stroke-miterlimit="3.8637"/>
</svg>

After

Width:  |  Height:  |  Size: 243 B

@@ -0,0 +1,3 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M24 16C24 20.4111 20.4111 24 16 24C11.5889 24 8 20.4111 8 16C8 11.5889 11.5889 8 16 8C20.4111 8 24 11.5889 24 16ZM16 10C14.7546 10 13.5969 10.3818 12.637 11.0339L20.9662 19.3627C21.6182 18.4029 22 17.2454 22 16C22 12.6914 19.3086 10 16 10ZM16 22C17.3424 22 18.5788 21.5516 19.5794 20.8041L11.1957 12.4208C10.4484 13.4214 10 14.6578 10 16C10 19.3086 12.6914 22 16 22Z" fill="#FFFFFE" stroke="#000001" stroke-miterlimit="10"/>
</svg>

After

Width:  |  Height:  |  Size: 537 B

@@ -0,0 +1,7 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M27.7361 11H17.7361V9H27.7361V11Z" fill="#FFFFFE"/>
<path d="M27.7361 25H17.7361V23H27.7361V25Z" fill="#FFFFFE"/>
<path d="M20.7361 16L18.7361 14V11H26.7361V14L24.7361 16V18L26.7361 20V23H18.7361V20L20.7361 18V16Z" fill="#FFFFFE"/>
<path d="M15.4721 18.5341H10.5377L12.5642 22.6566L9.61947 24.1497L7.35907 19.5161L4 22.7919V7L15.4721 18.5341Z" fill="#FFFFFE"/>
<path d="M20.2361 13H21.2361M21.2361 14H22.2361M22.2361 15H23.2361M22.2361 17H23.2361M22.2361 20H23.2361M21.2361 21H22.2361M23.2361 21H24.2361M24.2361 22H25.2361M20.2361 22H21.2361M22.2361 22H23.2361M22.2361 13H23.2361M24.2361 13H25.2361M17.7361 11H27.7361V9H17.7361V11ZM17.7361 25H27.7361V23H17.7361V25ZM20.7361 16L18.7361 14V11H26.7361V14L24.7361 16V18L26.7361 20V23H18.7361V20L20.7361 18V16ZM15.4721 18.5341H10.5377L12.5642 22.6566L9.61947 24.1497L7.35907 19.5161L4 22.7919V7L15.4721 18.5341Z" stroke="#000001" stroke-miterlimit="10"/>
</svg>

After

Width:  |  Height:  |  Size: 1012 B

@@ -0,0 +1,3 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15 15V7H17V15H25V17H17V25H15V17H7V15H15Z" fill="#FFFFFE" stroke="#000001" stroke-miterlimit="10"/>
</svg>

After

Width:  |  Height:  |  Size: 212 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.1 KiB

@@ -0,0 +1,4 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13.3798 20.2398V21.7398H20.3798V20.2398V19.2398C20.3798 18.4455 21.1019 17.7045 21.2872 17.5192C21.6777 17.1287 22.7872 17.0192 22.7872 16.0192V14.0192C22.7872 14.0192 22.5718 12.5192 21.2872 12.5192C20.4231 12.5192 20.3798 13.2398 20.3798 13.2398V12.2398C20.3798 12.2398 20.2872 11.5192 19.3798 11.2398C18.6632 11.0192 17.3798 11.1751 17.3798 11.466V12.2398C17.3798 12.2398 16.8202 11.5192 16.4128 11.2398C15.9303 10.9089 14.8696 10.9315 14.5516 11.2398C14.2123 11.5689 14.459 12.2398 14.2872 12.2398C14.1153 12.2398 13.7872 11.5192 13.3798 11.2398C12.9724 10.9604 11.5977 11.1108 11.2872 11.5192C10.8546 12.0881 10.8432 12.7074 11.2263 13.2398C11.7872 14.0192 12.2872 13.962 12.3798 14.2398C12.4724 14.5177 12.3798 15.2398 12.3798 15.2398H11.3798C11.0159 15.2398 10.4775 15.2398 10.2872 15.5192C9.86835 16.2398 9.91479 16.6744 10.3798 17.2398C10.427 17.2971 11.3798 18.2398 11.3798 18.2398L12.3798 19.2398L13.3798 20.2398Z" fill="white"/>
<path d="M13.3798 21.7398V20.2398L12.3798 19.2398L11.3798 18.2398C11.3798 18.2398 10.427 17.2971 10.3798 17.2398C9.91479 16.6744 9.86835 16.2398 10.2872 15.5192C10.4775 15.2398 11.0159 15.2398 11.3798 15.2398C11.7872 15.2398 12.3798 15.2398 12.3798 15.2398C12.3798 15.2398 12.4724 14.5177 12.3798 14.2398C12.2872 13.962 11.7872 14.0192 11.2263 13.2398C10.8432 12.7074 10.8546 12.0881 11.2872 11.5192C11.5977 11.1108 12.9724 10.9604 13.3798 11.2398C13.7872 11.5192 14.1153 12.2398 14.2872 12.2398C14.459 12.2398 14.2123 11.5689 14.5516 11.2398C14.8696 10.9315 15.9303 10.9089 16.4128 11.2398C16.8202 11.5192 17.3798 12.2398 17.3798 12.2398V11.466C17.3798 11.1751 18.6632 11.0192 19.3798 11.2398C20.2872 11.5192 20.3798 12.2398 20.3798 12.2398V13.2398C20.3798 13.2398 20.4231 12.5192 21.2872 12.5192C22.7872 12.5192 22.7872 14.0192 22.7872 14.0192V16.0192C22.7872 17.0192 21.6777 17.1287 21.2872 17.5192C21.1019 17.7045 20.3798 18.4455 20.3798 19.2398V20.2398V21.7398" stroke="black" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 10 KiB

@@ -0,0 +1,3 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M10.2941 17.5735V20.8824H9.63235L5 16.25L9.63235 11.6177H10.2941V14.9265H14.9265V10.2941H11.6177V9.63235L16.25 5L20.8824 9.63235V10.2941H17.5735V14.9265H22.2059V11.6177H22.8676L27.5 16.25L22.8676 20.8824H22.2059V17.5735H17.5735V22.2059H20.8824V22.8676L16.25 27.5L11.6177 22.8676V22.2059H14.9265V17.5735H10.2941Z" fill="#FFFFFE" stroke="#000001" stroke-miterlimit="10"/>
</svg>

After

Width:  |  Height:  |  Size: 482 B

@@ -0,0 +1,4 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6 6C6.38276 10.4329 9.60454 13.246 9.60454 13.246L22.1665 25.8079C22.4226 26.064 22.8379 26.064 23.094 25.8079L24.4509 24.4509L25.8079 23.094C26.064 22.8379 26.064 22.4226 25.8079 22.1665L13.246 9.60454C13.246 9.60454 10.4329 6.38276 6 6Z" fill="#FFFFFE" stroke="#000001" stroke-width="1.018" stroke-miterlimit="10"/>
<path d="M14.5446 18.1861L18.1919 14.5389" stroke="black" stroke-width="1.018" stroke-miterlimit="10"/>
</svg>

After

Width:  |  Height:  |  Size: 535 B

@@ -0,0 +1,8 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M10.9536 11V6.98606C10.9536 6.98606 10.9536 5.64808 12.2915 5.64808C13.6295 5.64808 13.6295 6.98606 13.6295 6.98606V11" fill="#FFFFFE"/>
<path d="M13.6295 11L13.6295 7.65505C13.6295 7.65505 13.6295 6.31707 14.9675 6.31707C16.3055 6.31707 16.3055 7.65505 16.3055 7.65505V11" fill="#FFFFFE"/>
<path d="M16.3055 11L16.3055 8.32404C16.3055 8.32404 16.3055 6.98606 17.6434 6.98606C18.9814 6.98606 18.9814 8.32404 18.9814 8.32404V14.6794C18.9814 14.6794 19.6504 21.3693 12.9605 21.3693C12.9605 21.3693 10.5 21.5 8.27759 19.3624L3.59466 14.0104C3.59466 14.0104 2.25668 12.6725 3.59466 11.3345C3.59466 11.3345 4.59814 10.331 6.27062 12.0035L7.43223 13.1651C7.74419 13.477 8.27758 13.2561 8.27758 12.8149V1.96863C8.27758 1.96863 8.27758 0.630646 9.61556 0.630646C10.9535 0.630646 10.9535 1.96863 10.9535 1.96863L10.9536 11" fill="#FFFFFE"/>
<path d="M29.4742 30C29.4742 26.9767 27.0233 24.5258 24 24.5258C20.9767 24.5258 18.5258 26.9767 18.5258 30C18.5258 30 19.5 31 24 31C28.5 31 29.4742 30 29.4742 30Z" fill="#FFFFFE"/>
<path d="M24 17C26.0782 17 27.7629 18.6847 27.7629 20.7629C27.7629 22.8411 26.0782 24.5258 24 24.5258C21.9218 24.5258 20.2371 22.8411 20.2371 20.7629C20.2371 18.6847 21.9218 17 24 17Z" fill="#FFFFFE"/>
<path d="M24 24.5258C27.0233 24.5258 29.4742 26.9767 29.4742 30C29.4742 30 28.5 31 24 31C19.5 31 18.5258 30 18.5258 30C18.5258 26.9767 20.9767 24.5258 24 24.5258ZM24 24.5258C26.0782 24.5258 27.7629 22.8411 27.7629 20.7629C27.7629 18.6847 26.0782 17 24 17C21.9218 17 20.2371 18.6847 20.2371 20.7629C20.2371 22.8411 21.9218 24.5258 24 24.5258ZM10.9536 11V6.98606C10.9536 6.98606 10.9536 5.64808 12.2915 5.64808C13.6295 5.64808 13.6295 6.98606 13.6295 6.98606V11L13.6295 7.65505C13.6295 7.65505 13.6295 6.31707 14.9675 6.31707C16.3055 6.31707 16.3055 7.65505 16.3055 7.65505V11L16.3055 8.32404C16.3055 8.32404 16.3055 6.98606 17.6434 6.98606C18.9814 6.98606 18.9814 8.32404 18.9814 8.32404V14.6794C18.9814 14.6794 19.6504 21.3693 12.9605 21.3693C12.9605 21.3693 10.5 21.5 8.27759 19.3624L3.59466 14.0104C3.59466 14.0104 2.25668 12.6725 3.59466 11.3345C3.59466 11.3345 4.59814 10.331 6.27062 12.0035L7.43223 13.1651C7.74419 13.477 8.27758 13.2561 8.27758 12.8149V1.96863C8.27758 1.96863 8.27758 0.630646 9.61556 0.630646C10.9535 0.630646 10.9535 1.96863 10.9535 1.96863L10.9536 11Z" stroke="#000001" stroke-miterlimit="10"/>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

@@ -0,0 +1,8 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M28.4775 21.8065C28.4775 24.2793 24 31 24 31C24 31 19.5225 24.2793 19.5225 21.8065C19.5225 19.3336 21.5272 17.329 24 17.329C26.4728 17.329 28.4775 19.3336 28.4775 21.8065Z" fill="#FFFFFE"/>
<path d="M24.0218 19.7807C25.1373 19.7807 26.0415 20.685 26.0415 21.8004C26.0415 22.9159 25.1373 23.8201 24.0218 23.8201C22.9064 23.8201 22.0021 22.9159 22.0021 21.8004C22.0021 20.685 22.9064 19.7807 24.0218 19.7807Z" fill="black"/>
<path d="M10.9535 11.1645V7.15057C10.9535 7.15057 10.9535 5.81259 12.2915 5.81259C13.6295 5.81259 13.6295 7.15057 13.6295 7.15057V11.1645" fill="#FFFFFE"/>
<path d="M13.6295 11.1645L13.6295 7.81956C13.6295 7.81956 13.6295 6.48158 14.9675 6.48158C16.3055 6.48158 16.3055 7.81956 16.3055 7.81956V11.1645" fill="#FFFFFE"/>
<path d="M16.3055 11.1645L16.3055 8.48855C16.3055 8.48855 16.3055 7.15057 17.6434 7.15057C18.9814 7.15057 18.9814 8.48855 18.9814 8.48855V14.8439C18.9814 14.8439 19.5226 21.5338 12.9605 21.5338C12.9605 21.5338 10.5 21.6645 8.27759 19.5269L3.59466 14.175C3.59466 14.175 2.25668 12.837 3.59466 11.499C3.59466 11.499 4.59814 10.4955 6.27062 12.168L7.43223 13.3296C7.74419 13.6416 8.27758 13.4206 8.27758 12.9794V2.13315C8.27758 2.13315 8.27758 0.795166 9.61556 0.795166C10.9535 0.795166 10.9535 2.13315 10.9535 2.13315L10.9535 11.1645" fill="#FFFFFE"/>
<path d="M28.4775 21.8065C28.4775 24.2793 24 31 24 31C24 31 19.5225 24.2793 19.5225 21.8065C19.5225 19.3336 21.5272 17.329 24 17.329C26.4728 17.329 28.4775 19.3336 28.4775 21.8065ZM24.0218 19.7807C25.1373 19.7807 26.0415 20.685 26.0415 21.8004C26.0415 22.9159 25.1373 23.8201 24.0218 23.8201C22.9064 23.8201 22.0021 22.9159 22.0021 21.8004C22.0021 20.685 22.9064 19.7807 24.0218 19.7807ZM10.9535 11.1645V7.15057C10.9535 7.15057 10.9535 5.81259 12.2915 5.81259C13.6295 5.81259 13.6295 7.15057 13.6295 7.15057V11.1645L13.6295 7.81956C13.6295 7.81956 13.6295 6.48158 14.9675 6.48158C16.3055 6.48158 16.3055 7.81956 16.3055 7.81956V11.1645L16.3055 8.48855C16.3055 8.48855 16.3055 7.15057 17.6434 7.15057C18.9814 7.15057 18.9814 8.48855 18.9814 8.48855V14.8439C18.9814 14.8439 19.5226 21.5338 12.9605 21.5338C12.9605 21.5338 10.5 21.6645 8.27759 19.5269L3.59466 14.175C3.59466 14.175 2.25668 12.837 3.59466 11.499C3.59466 11.499 4.59814 10.4955 6.27062 12.168L7.43223 13.3296C7.74419 13.6416 8.27758 13.4206 8.27758 12.9794V2.13315C8.27758 2.13315 8.27758 0.795166 9.61556 0.795166C10.9535 0.795166 10.9535 2.13315 10.9535 2.13315L10.9535 11.1645Z" stroke="#000001" stroke-miterlimit="10"/>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

@@ -0,0 +1,6 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15.9535 16.6291V12.6152C15.9535 12.6152 15.9535 11.2772 17.2915 11.2772C18.6295 11.2772 18.6295 12.6152 18.6295 12.6152V16.6291" fill="#FFFFFE"/>
<path d="M18.6295 16.6291L18.6295 13.2842C18.6295 13.2842 18.6295 11.9462 19.9675 11.9462C21.3055 11.9462 21.3055 13.2842 21.3055 13.2842V16.6291" fill="#FFFFFE"/>
<path d="M21.3055 16.6291L21.3055 13.9531C21.3055 13.9531 21.3055 12.6152 22.6434 12.6152C23.9814 12.6152 23.9814 13.9531 23.9814 13.9531V20.3085C23.9814 20.3085 24.6504 26.9984 17.9605 26.9984C17.9605 26.9984 15.5 27.1291 13.2776 24.9915L8.59466 19.6396C8.59466 19.6396 7.25668 18.3016 8.59466 16.9636C8.59466 16.9636 9.59814 15.9601 11.2706 17.6326L12.4322 18.7942C12.7442 19.1062 13.2776 18.8852 13.2776 18.444V7.59775C13.2776 7.59775 13.2776 6.25977 14.6156 6.25977C15.9535 6.25977 15.9535 7.59775 15.9535 7.59775V16.6291" fill="#FFFFFE"/>
<path d="M15.9535 16.6291V12.6152C15.9535 12.6152 15.9535 11.2772 17.2915 11.2772C18.6295 11.2772 18.6295 12.6152 18.6295 12.6152V16.6291L18.6295 13.2842C18.6295 13.2842 18.6295 11.9462 19.9675 11.9462C21.3055 11.9462 21.3055 13.2842 21.3055 13.2842V16.6291L21.3055 13.9531C21.3055 13.9531 21.3055 12.6152 22.6434 12.6152C23.9814 12.6152 23.9814 13.9531 23.9814 13.9531V20.3085C23.9814 20.3085 24.6504 26.9984 17.9605 26.9984C17.9605 26.9984 15.5 27.1291 13.2776 24.9915L8.59466 19.6396C8.59466 19.6396 7.25668 18.3016 8.59466 16.9636C8.59466 16.9636 9.59814 15.9601 11.2706 17.6326L12.4322 18.7942C12.7442 19.1062 13.2776 18.8852 13.2776 18.444V7.59775C13.2776 7.59775 13.2776 6.25977 14.6156 6.25977C15.9535 6.25977 15.9535 7.59775 15.9535 7.59775V16.6291Z" stroke="#000001" stroke-miterlimit="10"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

@@ -0,0 +1,3 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M10.7452 18.9809L8.45754 16.6932L8 17.1508V23.5563H14.4056L14.8631 23.0988L12.5754 20.8111L20.8111 12.5754L23.0988 14.8631L23.5563 14.4056V8H17.1508L16.6932 8.45754L18.9809 10.7452L10.7452 18.9809Z" fill="#FFFFFE" stroke="#000001" stroke-miterlimit="10"/>
</svg>

After

Width:  |  Height:  |  Size: 368 B

@@ -0,0 +1,3 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M18.9809 20.8111L16.6932 23.0988L17.1508 23.5563H23.5563V17.1508L23.0988 16.6932L20.8111 18.9809L12.5754 10.7452L14.8631 8.45754L14.4056 8H8V14.4056L8.45754 14.8631L10.7452 12.5754L18.9809 20.8111Z" fill="#FFFFFE" stroke="#000001" stroke-miterlimit="10"/>
</svg>

After

Width:  |  Height:  |  Size: 368 B

@@ -0,0 +1,3 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M10.2941 16.9559H22.2059V20.2647H22.8676L27.5 15.6324L22.8676 11H22.2059V14.3088H10.2941V11H9.63235L5 15.6324L9.63235 20.2647H10.2941V16.9559Z" fill="#FFFFFE" stroke="#000001" stroke-miterlimit="10"/>
</svg>

After

Width:  |  Height:  |  Size: 313 B

@@ -0,0 +1,3 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14.2143 10.1429H11V9.5L15.5 5L20 9.5V10.1429H16.7857V21.7143H20V22.3571L15.5 26.8571L11 22.3571V21.7143H14.2143V10.1429Z" fill="#FFFFFE" stroke="#000001" stroke-width="0.99351" stroke-miterlimit="10"/>
</svg>

After

Width:  |  Height:  |  Size: 315 B

@@ -0,0 +1,3 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M21 9.5V7.5H17V8H15V7.5H11V9.5H15V22.5H11V24.5H15V24H17V24.5H21V22.5H17V9.5H21Z" fill="#FFFFFE" stroke="#000001" stroke-miterlimit="10"/>
</svg>

After

Width:  |  Height:  |  Size: 250 B

@@ -0,0 +1,3 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14.3929 12.1072V25H17.1071V12.1072H20.5V11.4286L15.75 6.67857L11 11.4286V12.1072H14.3929Z" fill="#FFFFFE" stroke="#000001" stroke-miterlimit="10"/>
</svg>

After

Width:  |  Height:  |  Size: 261 B

@@ -0,0 +1,39 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M10 7H22V11L18 15V17L22 21V26H10V21L14 17V15L10 11V7Z" fill="#FFFFFE"/>
<path d="M22 7V11L18 15V17L22 21V26" stroke="#000001" stroke-miterlimit="10"/>
<path d="M10 26V21L14 17V15L10 11V7" stroke="#000001" stroke-miterlimit="10"/>
<path d="M23 28H9V26H23V28Z" fill="#FFFFFE" stroke="#000001" stroke-miterlimit="10"/>
<path d="M23 7H9V5H23V7Z" fill="#FFFFFE" stroke="#000001" stroke-miterlimit="10"/>
<path d="M15.5 18H16.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M16.5 19H17.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M16.5 21H17.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M14.5 21H15.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M15.5 22H16.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M13.5 22H14.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M14.5 23H15.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M16.5 23H17.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M17.5 22H18.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M18.5 23H19.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M19.5 24H20.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M17.5 24H18.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M15.5 24H16.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M13.5 24H14.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M12.5 23H13.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M11.5 24H12.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M11.5 9H12.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M13.5 9H14.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M15.5 9H16.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M17.5 9H18.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M19.5 9H20.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M12.5 10H13.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M14.5 10H15.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M16.5 10H17.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M18.5 10H19.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M13.5 11H14.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M15.5 11H16.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M14.5 12H15.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M16.5 12H17.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M15.5 13H16.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M17.5 11H18.5" stroke="#000001" stroke-miterlimit="10"/>
<path d="M15.5 16H16.5" stroke="#000001" stroke-miterlimit="10"/>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

@@ -0,0 +1,5 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="14" r="5.5" fill="white" stroke="black"/>
<path d="M18 18L23.5 23.5" stroke="black" stroke-width="1.75"/>
<path d="M11 14H14M17 14H14M14 14V11M14 14V17" stroke="black" stroke-width="1.75"/>
</svg>

After

Width:  |  Height:  |  Size: 313 B

@@ -0,0 +1,5 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="14" r="5.5" fill="white" stroke="black"/>
<path d="M11 14H17" stroke="black" stroke-width="2"/>
<path d="M18 18L23.5 23.5" stroke="black" stroke-width="1.75"/>
</svg>

After

Width:  |  Height:  |  Size: 283 B

+17 -4
View File
@@ -151,7 +151,9 @@ export function UpdateToastWindow() {
return (
<div className={`${styles.window} launch-theme`}>
<section className={styles.card} aria-live="polite" aria-label="Recordly update">
<div className={`${styles.icon} ${payload.phase === "error" ? styles.iconError : ""}`}>
<div
className={`${styles.icon} ${payload.phase === "error" ? styles.iconError : ""}`}
>
<PhaseIcon payload={payload} />
</div>
@@ -175,7 +177,10 @@ export function UpdateToastWindow() {
{payload.phase === "downloading" ? (
<div className={styles.progressBlock}>
<div className={styles.progressTrack}>
<div className={styles.progressFill} style={{ width: `${progress}%` }} />
<div
className={styles.progressFill}
style={{ width: `${progress}%` }}
/>
</div>
<div className={styles.progressMeta}>
<strong>{progress}%</strong>
@@ -184,10 +189,18 @@ export function UpdateToastWindow() {
</div>
) : (
<div className={styles.actions}>
<button type="button" className={styles.secondaryButton} onClick={handleNotNow}>
<button
type="button"
className={styles.secondaryButton}
onClick={handleNotNow}
>
{t("launch.updateToast.notNow", "Not now")}
</button>
<button type="button" className={styles.primaryButton} onClick={handlePrimaryAction}>
<button
type="button"
className={styles.primaryButton}
onClick={handlePrimaryAction}
>
{getPrimaryLabel(payload, t)}
</button>
</div>
+17 -6
View File
@@ -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,
});
@@ -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;
+9 -2
View File
@@ -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;
@@ -29,7 +29,7 @@ import { cursorSetAssets, getCursorStyleSizeMultiplier } from "./uploadedCursorA
import { computeDirectionalMotionBlur } from "./zoomTransform";
type CursorAssetKey = NonNullable<CursorTelemetryPoint["cursorType"]>;
type StatefulCursorStyle = Extract<CursorStyle, "macos" | "tahoe" | "tahoe-inverted">;
type StatefulCursorStyle = Extract<CursorStyle, "macos" | "tahoe" | "tahoe-inverted" | "windows11">;
type SingleCursorStyle = Extract<CursorStyle, "dot" | "figma">;
type CursorPackStyle = Exclude<CursorStyle, StatefulCursorStyle | SingleCursorStyle>;
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<string, CursorPackSourc
}
function isStatefulCursorStyle(style: CursorStyle): style is StatefulCursorStyle {
return style === "macos" || style === "tahoe" || style === "tahoe-inverted";
return (
style === "macos" ||
style === "tahoe" ||
style === "tahoe-inverted" ||
style === "windows11"
);
}
function isSingleCursorStyle(style: CursorStyle): style is SingleCursorStyle {
@@ -274,11 +280,16 @@ async function createCursorPackAsset(
async function createRasterizedCursorAsset(
url: string,
anchor: { x: number; y: number },
options: { preserveCanvas?: boolean } = {},
): Promise<LoadedCursorAsset> {
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<Record<CursorAssetKey, LoadedCursorAsset>>;
}
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<CursorAssetKey, LoadedCursorAsset>
>,
@@ -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<CursorTelemetryPoint["cursorType"]>;
type CursorSetStyle = Extract<CursorStyle, "macos" | "tahoe" | "tahoe-inverted">;
type CursorSetStyle = Extract<CursorStyle, "macos" | "tahoe" | "tahoe-inverted" | "windows11">;
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, "preserveCanvas"> = {},
): 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<CursorSetStyle, number> = {
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) {
+1
View File
@@ -35,6 +35,7 @@
"macos": "macOS",
"tahoe": "Tahoe",
"tahoe-inverted": "Tahoe invertiert",
"windows11": "Windows 11",
"dot": "Punkt",
"figma": "Minimal",
"lavender": "Lavender",
+1
View File
@@ -41,6 +41,7 @@
"macos": "macOS",
"tahoe": "Tahoe",
"tahoe-inverted": "Tahoe Inverted",
"windows11": "Windows 11",
"dot": "Dot",
"figma": "Minimal",
"lavender": "Lavender",
+1
View File
@@ -35,6 +35,7 @@
"macos": "macOS",
"tahoe": "Tahoe",
"tahoe-inverted": "Tahoe invertido",
"windows11": "Windows 11",
"dot": "Punto",
"figma": "Minimal",
"lavender": "Lavender",
+1
View File
@@ -35,6 +35,7 @@
"macos": "macOS",
"tahoe": "Tahoe",
"tahoe-inverted": "Tahoe inversé",
"windows11": "Windows 11",
"dot": "Point",
"figma": "Minimal",
"lavender": "Lavande",
+1
View File
@@ -35,6 +35,7 @@
"macos": "macOS",
"tahoe": "Tahoe",
"tahoe-inverted": "Tahoe invertito",
"windows11": "Windows 11",
"dot": "Punto",
"figma": "Minimal",
"lavender": "Lavanda",
+1
View File
@@ -35,6 +35,7 @@
"macos": "macOS",
"tahoe": "Tahoe",
"tahoe-inverted": "Tahoe Inverted",
"windows11": "Windows 11",
"dot": "Dot",
"figma": "Minimal",
"lavender": "Lavender",
+1
View File
@@ -35,6 +35,7 @@
"macos": "macOS",
"tahoe": "Tahoe",
"tahoe-inverted": "Tahoe omgekeerd",
"windows11": "Windows 11",
"dot": "Punt",
"figma": "Minimaal",
"lavender": "Lavendel",
+1
View File
@@ -35,6 +35,7 @@
"macos": "macOS",
"tahoe": "Tahoe",
"tahoe-inverted": "Tahoe invertido",
"windows11": "Windows 11",
"dot": "Dot",
"figma": "Minimal",
"lavender": "Lavender",
+1
View File
@@ -35,6 +35,7 @@
"macos": "macOS",
"tahoe": "Tahoe",
"tahoe-inverted": "Tahoe (инверсия)",
"windows11": "Windows 11",
"dot": "Точка",
"figma": "Минималистичный",
"lavender": "Лаванда",
+1
View File
@@ -35,6 +35,7 @@
"macos": "macOS",
"tahoe": "Tahoe",
"tahoe-inverted": "Tahoe 反相",
"windows11": "Windows 11",
"dot": "圆点",
"figma": "Minimal",
"lavender": "Lavender",
+1
View File
@@ -35,6 +35,7 @@
"macos": "macOS",
"tahoe": "Tahoe",
"tahoe-inverted": "Tahoe 反相",
"windows11": "Windows 11",
"dot": "圓點",
"figma": "極簡",
"lavender": "Lavender",