diff --git a/frontend/src/components/DynamicComponent.tsx b/frontend/src/components/DynamicComponent.tsx index 724ceb3d..86171d42 100644 --- a/frontend/src/components/DynamicComponent.tsx +++ b/frontend/src/components/DynamicComponent.tsx @@ -746,11 +746,20 @@ export function createComponentFromMetadata( // dark LED). Also strip '-' from metadata.id (e.g. 'led-bar-graph') so // the prefix doesn't reintroduce a hyphen. const safePrefix = metadata.id.replace(/-/g, '_'); + const properties: Record = { ...metadata.defaultValues }; + // Resistors default to vertical: they read better, take less horizontal + // space, and drop straight into breadboard columns (their pin span + // bridges the center trench). Covers 'resistor' and every preconfigured + // 'resistor-' variant; anything with an explicit rotation in its + // metadata defaults keeps it. + if (metadata.id.startsWith('resistor') && properties.rotation === undefined) { + properties.rotation = 90; + } return { id: `${safePrefix}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`, metadataId: metadata.id, x, y, - properties: { ...metadata.defaultValues }, + properties, }; } diff --git a/frontend/src/components/simulator/SimulatorCanvas.tsx b/frontend/src/components/simulator/SimulatorCanvas.tsx index ed96b9a5..bc149f6c 100644 --- a/frontend/src/components/simulator/SimulatorCanvas.tsx +++ b/frontend/src/components/simulator/SimulatorCanvas.tsx @@ -30,7 +30,7 @@ import { calculatePinPosition } from '../../utils/pinPositionCalculator'; import { isBoardComponent, boardPinToNumber } from '../../utils/boardPinMapping'; import { autoWireColor, WIRE_KEY_COLORS, expandOrthogonalPoints } from '../../utils/wireUtils'; import { - AUTO_VERTICAL_PARTS, + isAutoVerticalPart, isOverBreadboard, snapPositionToBreadboard, } from '../../utils/breadboardSnap'; @@ -832,7 +832,7 @@ export const SimulatorCanvas = ({ headerSlot }: SimulatorCanvasProps = {}) => { ); if (dragged) { if ( - AUTO_VERTICAL_PARTS.has(dragged.metadataId) && + isAutoVerticalPart(dragged.metadataId) && (Number(dragged.properties?.rotation) || 0) === 0 && isOverBreadboard(dragged, nx, ny, simState.components) ) { @@ -1424,7 +1424,7 @@ export const SimulatorCanvas = ({ headerSlot }: SimulatorCanvasProps = {}) => { // Axial parts entering a breadboard flip to vertical so they // bridge the trench columns like on a real board. if ( - AUTO_VERTICAL_PARTS.has(dragged.metadataId) && + isAutoVerticalPart(dragged.metadataId) && (Number(dragged.properties?.rotation) || 0) === 0 && isOverBreadboard(dragged, nx, ny, simState.components) ) { diff --git a/frontend/src/utils/breadboardSnap.ts b/frontend/src/utils/breadboardSnap.ts index a3ec7d83..b294046b 100644 --- a/frontend/src/utils/breadboardSnap.ts +++ b/frontend/src/utils/breadboardSnap.ts @@ -218,5 +218,8 @@ export function isOverBreadboard( return false; } -/** Axial 2-pin parts that read better vertical on a breadboard. */ -export const AUTO_VERTICAL_PARTS = new Set(['resistor', 'wokwi-resistor']); +/** Axial 2-pin parts that read better vertical on a breadboard: 'resistor' + * plus every preconfigured 'resistor-' variant. */ +export function isAutoVerticalPart(metadataId: string): boolean { + return metadataId.startsWith('resistor') || metadataId.startsWith('wokwi-resistor'); +}