Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion client/src/hooks/use-simulation-controls.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ type DebugMessageParams = {
type UseSimulationControlsParams = {
ensureBackendConnected: (reason: string) => boolean;
sendMessage: (message: any) => void;
/** Optional immediate sender for time-critical commands (stop) */
sendMessageImmediate?: (message: any) => void;
resetPinUI: (opts?: { keepDetected?: boolean }) => void;
clearOutputs: () => void;
addDebugMessage: (params: DebugMessageParams) => void;
Expand All @@ -38,6 +40,8 @@ type UseSimulationControlsParams = {
export function useSimulationControls({
ensureBackendConnected,
sendMessage,
/** Optional immediate sender for time-critical commands (stop) */
sendMessageImmediate,
resetPinUI,
clearOutputs,
addDebugMessage,
Expand Down Expand Up @@ -68,7 +72,16 @@ export function useSimulationControls({
data: JSON.stringify({ type: "stop_simulation" }, null, 2),
protocol: "websocket",
});
sendMessage({ type: "stop_simulation" });
// prefer immediate send for STOP (time-critical)
if ((arguments as any)?.[0] && typeof (arguments as any)[0].sendMessageImmediate === "function") {
// noop: defensive - not used; prefer the passed-in prop below
}
// use provided immediate sender when available, fall back to buffered send
// (don't change other lifecycle flows)
// @ts-ignore - sendMessageImmediate may be undefined in older call-sites
const immediate = (sendMessageImmediate as any) ?? undefined;
if (immediate) immediate({ type: "stop_simulation" });
else sendMessage({ type: "stop_simulation" });
return { success: true };
},
onSuccess: () => {
Expand Down
2 changes: 2 additions & 0 deletions client/src/pages/arduino-simulator.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,7 @@ export default function ArduinoSimulator() {
isConnected,
lastMessage,
sendMessage: sendMessageRaw,
sendMessageImmediate,
} = useWebSocket();
// Mark some hook values as intentionally read to avoid TS unused-local errors
void lastMessage;
Expand Down Expand Up @@ -368,6 +369,7 @@ export default function ArduinoSimulator() {
} = useSimulationControls({
ensureBackendConnected,
sendMessage,
sendMessageImmediate,
resetPinUI,
clearOutputs,
addDebugMessage: (params) =>
Expand Down
16 changes: 9 additions & 7 deletions tailwind.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,15 @@ export default {
theme: {
extend: {
fontSize: {
"ui-xs": ["12px", { lineHeight: "16px" }],
"ui-sm": ["14px", { lineHeight: "20px" }],
"ui-md": ["16px", { lineHeight: "24px" }],
"ui-lg": ["18px", { lineHeight: "26px" }],
"ui-xl": ["20px", { lineHeight: "28px" }],
"ui-2xl": ["24px", { lineHeight: "32px" }],
"ui-3xl": ["30px", { lineHeight: "36px" }],
/* Scale text-ui-* with the central --ui-font-scale variable so components using
these semantic tokens react to fontScale changes without changing markup. */
"ui-xs": ["calc(12px * var(--ui-font-scale))", { lineHeight: "calc(16px * var(--ui-font-scale))" }],
"ui-sm": ["calc(14px * var(--ui-font-scale))", { lineHeight: "calc(20px * var(--ui-font-scale))" }],
"ui-md": ["calc(16px * var(--ui-font-scale))", { lineHeight: "calc(24px * var(--ui-font-scale))" }],
"ui-lg": ["calc(18px * var(--ui-font-scale))", { lineHeight: "calc(26px * var(--ui-font-scale))" }],
"ui-xl": ["calc(20px * var(--ui-font-scale))", { lineHeight: "calc(28px * var(--ui-font-scale))" }],
"ui-2xl": ["calc(24px * var(--ui-font-scale))", { lineHeight: "calc(32px * var(--ui-font-scale))" }],
"ui-3xl": ["calc(30px * var(--ui-font-scale))", { lineHeight: "calc(36px * var(--ui-font-scale))" }],
},
borderRadius: {
lg: "var(--radius)",
Expand Down