{
  "schemaVersion": 1,
  "slug": "skateboard-size-calculator",
  "category": "sports",
  "kind": "implementation",
  "independentValidation": false,
  "implementationHash": "8c3d0d2c953afce1b810fd25b60a2027484cf9118c268afe296b2a87f9ce495b",
  "provenance": "Generated from the calculation contract used by the published page. Publication is not external validation.",
  "sourceFiles": [
    "data/calculators/skateboard-size-calculator.json",
    "src/engine.js"
  ],
  "runtimeSource": "/sources/engine.txt",
  "runtimeHash": "5c888d8898afbdee36267bb9977829e1e2ac568f6677c8ee87469c139864645c",
  "scope": "The compute function records implemented equations, constants, lookup tables and custom rules. Inputs record defaults and allowed values; outputs record precision and units. Defaults are examples, not recommendations. General background references are not evidence for this specific algorithm.",
  "publishedFormula": {
    "formula": "W = clamp(6.5, 10, B + s_style + s_age)",
    "vars": [
      [
        "B",
        "Base width from shoe size"
      ],
      [
        "s_style",
        "Style adjustment"
      ],
      [
        "s_age",
        "Age-group adjustment"
      ],
      [
        "W",
        "Recommended deck width (in)"
      ]
    ],
    "note": "B lookup (shoe size): <7 → 7.75, <9 → 8.0, <10.5 → 8.25, <12 → 8.5, else 8.75; style: street −0.15, park +0.15, cruiser +0.45, freestyle −0.5; age: child −1.2, youth −0.5, adult 0; wheel, truck and length are text recommendations by W band."
  },
  "externalEvidence": null,
  "contract": {
    "compute": "const base = shoeSize < 7 ? 7.75 : shoeSize < 9 ? 8.0 : shoeSize < 10.5 ? 8.25 : shoeSize < 12 ? 8.5 : 8.75; const S = { street:-0.15, park:0.15, cruiser:0.45, freestyle:-0.5, beginner:0 }; const A = { child:-1.2, youth:-0.5, adult:0 }; const width = Math.max(6.5, Math.min(10, base+(S[style] || 0)+(A[ageGroup] || 0))); const wheel = style === 'cruiser' ? '56-60 mm, soft 78-87A' : style === 'park' ? '53-56 mm, 95-99A' : style === 'freestyle' ? '50-52 mm, hard' : '52-54 mm, 99-101A'; const truck = width <= 7.9 ? '129 mm' : width <= 8.3 ? '139 mm' : width <= 8.6 ? '144 mm' : '149 mm'; return { deckWidth: width, widthRange: (width-0.15).toFixed(2)+' to '+(width+0.15).toFixed(2)+' in', wheelSize: wheel, truckSize: truck, deckLength: (width <= 8 ? '31.0-31.5 in' : width <= 8.4 ? '31.5-32.0 in' : '32.0-32.5 in') };",
    "inputs": [
      {
        "name": "shoeSize",
        "type": "number",
        "default": 9.5,
        "min": 4,
        "max": 18,
        "step": 0.5,
        "slider": true
      },
      {
        "name": "style",
        "type": "select",
        "default": "street",
        "options": [
          {
            "value": "street"
          },
          {
            "value": "park"
          },
          {
            "value": "cruiser"
          },
          {
            "value": "freestyle"
          },
          {
            "value": "beginner"
          }
        ]
      },
      {
        "name": "ageGroup",
        "type": "select",
        "default": "adult",
        "options": [
          {
            "value": "child"
          },
          {
            "value": "youth"
          },
          {
            "value": "adult"
          }
        ]
      }
    ],
    "outputs": [
      {
        "name": "deckWidth",
        "precision": 2,
        "unit": "in"
      },
      {
        "name": "widthRange",
        "precision": 0,
        "unit": "",
        "type": "text"
      },
      {
        "name": "wheelSize",
        "precision": 0,
        "unit": "",
        "type": "text"
      },
      {
        "name": "truckSize",
        "precision": 0,
        "unit": "",
        "type": "text"
      },
      {
        "name": "deckLength",
        "precision": 0,
        "unit": "",
        "type": "text"
      }
    ],
    "interpret": null
  }
}
