feat: functional gridfinity calculator app

This commit is contained in:
w33ble
2026-01-11 19:38:34 -07:00
commit 7c512f5adb
19 changed files with 3561 additions and 0 deletions

66
src/calculator.ts Normal file
View File

@@ -0,0 +1,66 @@
export interface GridfinitySpec {
gridSize: number; // e.g., 42mm
heightUnit: number; // e.g., 7mm
baseThickness: number; // Height of baseplate above drawer surface
}
export const DEFAULT_SPEC: GridfinitySpec = {
gridSize: 42,
heightUnit: 7,
baseThickness: 4.8, // Standard baseplate height is 5mm, but usually 4.8mm-5mm
};
export interface CalculatorInputs {
width: number;
length: number;
height: number;
unit: 'mm' | 'in';
spec: GridfinitySpec;
}
export interface CalculatorResults {
widthGrids: number;
lengthGrids: number;
fullGridsX: number;
fullGridsY: number;
maxBinUnits: number;
remainingWidth: number;
remainingLength: number;
remainingHeight: number;
}
const INCH_TO_MM = 25.4;
export function calculateGridfinity(inputs: CalculatorInputs): CalculatorResults {
const { width, length, height, unit, spec } = inputs;
// Convert all to mm for internal calculation
const w = unit === 'in' ? width * INCH_TO_MM : width;
const l = unit === 'in' ? length * INCH_TO_MM : length;
const h = unit === 'in' ? height * INCH_TO_MM : height;
const widthGrids = w / spec.gridSize;
const lengthGrids = l / spec.gridSize;
const fullGridsX = Math.floor(widthGrids);
const fullGridsY = Math.floor(lengthGrids);
// Height calculation: (Available Height - Baseplate Thickness) / 7mm
// We floor this because bins come in whole unit increments
const maxBinUnits = Math.max(0, Math.floor((h - spec.baseThickness) / spec.heightUnit));
const remainingWidth = w % spec.gridSize;
const remainingLength = l % spec.gridSize;
const remainingHeight = (h - spec.baseThickness) % spec.heightUnit;
return {
widthGrids,
lengthGrids,
fullGridsX,
fullGridsY,
maxBinUnits,
remainingWidth,
remainingLength,
remainingHeight
};
}