Refactor the TypeScript data flow for full type safety and auto-generation of Rust types (#3865)

* Migrate Specta to Tsify to auto-generate messages.ts, working except colors and widgets

* Adopt the generated FillColor/Color/GradientStops

* Fix widget typing

* Separate WidgetGroup enum variants into wrapper structs

* Small rename

* Simplify widgets further

* Clean up message type references

* Switch type imports to the auto-generated file

* Remove lowercase serde rename

* Fix FillChoice deserialization

* Fix small regression from #3837

* Improve type safety

* Make WidgetSpan type-safe

* More cleanup and type safety

* More type safety

* More type safety

* Get the rest to type-check without errors; improve widget builder macro to have optional icons; improve Svelte 5 configs

* Cargo fmt

* Fix imports

* Update outdated readme info

* Fix lint command rename references

* Fix typos

* One more typos fix

* Remove unnecessary dep: prefix from the edited Cargo.toml files

* Remove excess parts from Cargo.toml

* Fix compiling on desktop

* Revert "Remove excess parts from Cargo.toml"

This reverts commit 6b711117b3a5d5d8a3ee20f36a43bc74930b7c82.

* Update dev docs with simpler, more accurate instructions
This commit is contained in:
Keavon Chambers
2026-03-09 16:35:04 -07:00
parent fbd2658148
commit 52d2b38a82
199 changed files with 2265 additions and 2811 deletions
@@ -94,10 +94,8 @@ export async function getLocalizedScanCode(e: KeyboardEvent): Promise<string> {
// It is likely a weird symbol that isn't in the A-Z range even with accents removed.
// It might be a symbol from an Option key combination on a Mac. Or it might be from a non-Latin alphabet like Cyrillic.
if (!KEY_ATTRIBUTE_VALUES.has(keyText)) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
if (navigator && "keyboard" in navigator && "getLayoutMap" in (navigator as any).keyboard) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const layout = await (navigator as any).keyboard.getLayoutMap();
if (navigator.keyboard && "getLayoutMap" in navigator.keyboard) {
const layout = await navigator.keyboard.getLayoutMap();
type KeyCode = string;
type KeySymbol = string;
@@ -377,7 +375,7 @@ const LOCALE_SPECIFIC_KEY_CODES = LOCALE_SPECIFIC_KEY_CODES_INFO.map((info) => i
const WRITING_SYSTEM_SPECIAL_CHARS = Object.values(KEY_CODES)
.filter((info) => info.category === "writing-system")
.flatMap((info) => info.keys?.us?.split(" "))
.filter((character) => character && !/[a-zA-Z0-9]/.test(character)) as string[];
.filter((character): character is string => (!character ? false : !/[a-zA-Z0-9]/.test(character)));
const KEY_ATTRIBUTE_VALUES_INVOLVING_HANDEDNESS = ["Control", "Meta", "Shift"];
const KEY_ATTRIBUTE_VALUES = new Set([