From 1d3347b764092111b213890a5f93ca4d7d02db3b Mon Sep 17 00:00:00 2001 From: user_1781515504933 Date: Tue, 29 Sep 2026 17:19:25 +0700 Subject: [PATCH 1/5] feat: add Noir Gear M2-NEX OpenMouse integration --- public/devices/README.md | 6 + src/app/OverviewPage.tsx | 309 +++++---- src/app/cards/AdvancedCards.tsx | 646 ++++++++++++++++++- src/app/cards/DpiCard.tsx | 14 +- src/app/cards/availability.test.ts | 56 ++ src/app/cards/availability.ts | 16 +- src/app/workspace-tabs.test.ts | 23 +- src/app/workspace-tabs.ts | 7 +- src/control-profiles.css | 14 + src/control.css | 762 ++++++++++++++++++++--- src/device/controller.ts | 321 +++++++++- src/device/m2nex-profiles.test.ts | 72 +++ src/device/m2nex-profiles.ts | 134 ++++ src/device/types.ts | 16 +- src/i18n-ar.ts | 1 + src/i18n-de.ts | 1 + src/i18n-es.ts | 1 + src/i18n-fr.ts | 1 + src/i18n-ja.ts | 1 + src/i18n-ko.ts | 1 + src/i18n-pt.ts | 1 + src/i18n-ru.ts | 1 + src/i18n-vi.ts | 1 + src/i18n-zh.ts | 1 + src/i18n.ts | 1 + src/supported-devices-crosscheck.test.ts | 14 +- src/supported-devices-data.ts | 1 + src/ui/device-images.test.ts | 5 + src/ui/device-images.ts | 4 + 29 files changed, 2195 insertions(+), 236 deletions(-) create mode 100644 src/device/m2nex-profiles.test.ts create mode 100644 src/device/m2nex-profiles.ts diff --git a/public/devices/README.md b/public/devices/README.md index 1b299421..d0750956 100644 --- a/public/devices/README.md +++ b/public/devices/README.md @@ -145,6 +145,12 @@ trusted. 4. Keep this note as provenance. Vendor product art — treat as a request pending licensing review. +`noir-m2-nex.png` is reserved for the name-fallback mapping for Noir Gear's +M2-NEX. A local render from the vendor configurator may be used for development +previews, but it is deliberately not committed here. Before publishing the +asset, Noir Gear must confirm redistribution rights or OpenMouse should use a +maintainer-created silhouette instead. + `attackshark-r5-ultra.png` is the top-down render of the Attack Shark R5 Ultra extracted from Attack Shark's official product gallery (`cdn.shopify.com/s/files/1/0823/5050/6282/files/R5ULTRA_C06_3.png`), keyed diff --git a/src/app/OverviewPage.tsx b/src/app/OverviewPage.tsx index ad0cb314..5278c61a 100644 --- a/src/app/OverviewPage.tsx +++ b/src/app/OverviewPage.tsx @@ -4,6 +4,7 @@ import { Clock, Gauge, ImageUp, + Keyboard, Layers, Lightbulb, MousePointerClick, @@ -40,16 +41,18 @@ import { ProcessingCard, RazerButtonCard, ButtonMappingCard, + KsnakeMacroCard, PowerModeCard, OnboardProfileCard, PulsarProCard, SignalCard, SleepCard, + KsnakeScrollCard, DpiLightingCard, } from "./cards/AdvancedCards"; import { cardAvailability } from "./cards/availability"; import { TeevolutionProfileCard } from "./cards/teevolution/ProfileCard"; -import { deviceImage, isUnknownDevice, showcaseDeviceImageUrls } from "../ui/device-images"; +import { deviceImage, deviceImageFilename, isUnknownDevice, showcaseDeviceImageUrls } from "../ui/device-images"; import { BatteryIcon } from "./ui"; import { availableWorkspaceTab, availableWorkspaceTabs } from "./workspace-tabs"; @@ -62,6 +65,7 @@ const TAB_ICON: Record = { performance: BarChart3, lighting: Lightbulb, buttons: MousePointerClick, + macro: Keyboard, profiles: Layers, advanced: Settings2, }; @@ -71,21 +75,27 @@ export function TabIcon({ tab }: { tab: WorkspaceTab }): ReactNode { return