diff --git a/build/check-bundle-size.ts b/build/check-bundle-size.ts index ac293f7d..f8e9d004 100644 --- a/build/check-bundle-size.ts +++ b/build/check-bundle-size.ts @@ -165,7 +165,15 @@ const BUDGET_BYTES: Record = { // WLmouse Beast X 4K driver wiring (#287, which also pulls its protocol codec // in through SUPPORTED_HID_FILTERS), and the Razer Bluetooth-mode notice // (#357). Measured aggregate is 1,850.7 kB, leaving ~29 kB of headroom. - ".js": 1_880_000, + // Raised to 2,085 kB for protocol 0.22.0 and the four device PRs that land + // with it: the Noir Gear M2-NEX integration (#402, local profile slots and + // the macro editor), the Keychron G3 Air / Launcher 8k-1k panel wiring + // (#408, #426), and the Rapoo VT9 Pro client (#422). Their protocol codecs + // (Keychron Launcher mouse catalog, Rapoo register codec, K-snake macro + // store) are pulled in through SUPPORTED_HID_FILTERS and the controllers, + // and the shared UI gained the macro-card and profile-overview CSS. Measured + // aggregate is 1,995.2 kB, leaving ~90 kB of headroom. + ".js": 2_085_000, }; const ASSETS = join("dist", "assets"); diff --git a/package-lock.json b/package-lock.json index b2255146..c0b419a0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "2.0.0", "license": "AGPL-3.0-or-later", "dependencies": { - "@openmouse/protocol": "0.19.0", + "@openmouse/protocol": "0.22.0", "lucide-react": "^1.43.0", "preact": "^10.29.8" }, @@ -481,9 +481,9 @@ } }, "node_modules/@openmouse/protocol": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@openmouse/protocol/-/protocol-0.19.0.tgz", - "integrity": "sha512-Bxuk9gtWTOtoVufHcqGAxkVlHKyWIlhNZozhUfDv02RcUKxZCpocN0kqIquuWBgaGXj3/pnnbsPIGH7kKGHviQ==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@openmouse/protocol/-/protocol-0.22.0.tgz", + "integrity": "sha512-b5gwx0Ot1QOfyfYD7RkMUBRVKtT51AJO3xdyTTOqn/tCIF6bf+byPxewziTlPb2LUVBgzLB4S0CVG7FdQAglfA==", "engines": { "node": ">=20" } diff --git a/package.json b/package.json index 32355be9..eb86bb09 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "preview": "vite preview" }, "dependencies": { - "@openmouse/protocol": "0.19.0", + "@openmouse/protocol": "0.22.0", "lucide-react": "^1.43.0", "preact": "^10.29.8" }, diff --git a/public/devices/README.md b/public/devices/README.md index 9bdf12d7..9901283e 100644 --- a/public/devices/README.md +++ b/public/devices/README.md @@ -160,6 +160,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. + `delux-m800-mini.png` — the name-fallback mapping in `src/ui/device-images.ts` is in place (keyed on reported names like "Delux M800 Mini", "Delux M800 Pro", "Delux M800 Mini (Wireless)"). The render was supplied from Delux's official diff --git a/src/app/OverviewPage.tsx b/src/app/OverviewPage.tsx index 4eb74fbb..326df2f6 100644 --- a/src/app/OverviewPage.tsx +++ b/src/app/OverviewPage.tsx @@ -4,6 +4,7 @@ import { Clock, Gauge, ImageUp, + Keyboard, Layers, Lightbulb, MousePointerClick, @@ -40,17 +41,19 @@ import { ProcessingCard, RazerButtonCard, ButtonMappingCard, + KsnakeMacroCard, PowerModeCard, OnboardProfileCard, PulsarProCard, SignalCard, DongleLedCard, 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"; @@ -63,6 +66,7 @@ const TAB_ICON: Record = { performance: BarChart3, lighting: Lightbulb, buttons: MousePointerClick, + macro: Keyboard, profiles: Layers, advanced: Settings2, }; @@ -72,21 +76,27 @@ export function TabIcon({ tab }: { tab: WorkspaceTab }): ReactNode { return