forgecad 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/README.md +1 -1
  2. package/dist/assets/{AdminPage-DAu1C1ST.js → AdminPage-D4bocK4E.js} +1 -1
  3. package/dist/assets/{DocsPage-Gc_BCdqC.js → DocsPage-D3A_g8V3.js} +85 -45
  4. package/dist/assets/{EditorApp-DG1-oUSV.css → EditorApp-BWYUSpUN.css} +133 -51
  5. package/dist/assets/EditorApp-Cihhqcsq.js +11692 -0
  6. package/dist/assets/{EmbedViewer-CEO8XbV8.js → EmbedViewer-kWjKaC_t.js} +1 -1
  7. package/dist/assets/LandingPageProofDriven-Bg2IUc3l.css +856 -0
  8. package/dist/assets/LandingPageProofDriven-DXkKlyhI.js +601 -0
  9. package/dist/assets/{PricingPage-BSrxu6d7.js → PricingPage-BsU5vzEx.js} +1 -1
  10. package/dist/assets/{SettingsPage-FUCSIRq6.js → SettingsPage-PqvpAKIs.js} +1 -1
  11. package/dist/assets/{evalWorker-KoR0SNKq.js → evalWorker-C-hzNUMy.js} +2218 -286
  12. package/dist/assets/{index-wTEK39at.js → index-Pz321YAt.js} +7416 -1481
  13. package/dist/assets/{index-CyVd1D4D.css → index-ay13WNfa.css} +501 -2
  14. package/dist/assets/{manifold-B1sGWdYk.js → manifold-BcbjWLIo.js} +3 -3
  15. package/dist/assets/{manifold-D7o0N50J.js → manifold-DBckbFgx.js} +1 -1
  16. package/dist/assets/{manifold-G5sBaXzi.js → manifold-O2AAGXyj.js} +1 -1
  17. package/dist/assets/{reportWorker-DYcRHhv9.js → reportWorker-Dxr-5A7w.js} +2003 -259
  18. package/dist/docs/index.html +2 -2
  19. package/dist/docs-raw/CLI.md +488 -0
  20. package/dist/docs-raw/generated/assembly.md +19 -11
  21. package/dist/docs-raw/generated/concepts.md +1023 -360
  22. package/dist/docs-raw/generated/core.md +1165 -264
  23. package/dist/docs-raw/generated/curves.md +168 -1
  24. package/dist/docs-raw/generated/lib.md +10 -5
  25. package/dist/docs-raw/generated/output.md +1 -1
  26. package/dist/docs-raw/generated/sdf.md +208 -0
  27. package/dist/docs-raw/generated/sketch.md +1281 -329
  28. package/dist/docs-raw/generated/viewport.md +29 -2
  29. package/dist/index.html +2 -2
  30. package/dist/landing/proof-ams-adapter.png +0 -0
  31. package/dist/landing/proof-bolt-and-nut.png +0 -0
  32. package/dist/landing/proof-fillet-enclosure.png +0 -0
  33. package/dist/landing/proof-glasses.png +0 -0
  34. package/dist/landing/proof-gyroid.png +0 -0
  35. package/dist/sitemap.xml +6 -6
  36. package/dist-cli/forgecad.js +3148 -555
  37. package/dist-cli/forgecad.js.map +1 -1
  38. package/dist-cli/{solver-FV7TJZGI.js → solver-46FFSK2U.js} +1 -3
  39. package/dist-cli/{solver-FV7TJZGI.js.map → solver-46FFSK2U.js.map} +1 -1
  40. package/dist-skill/CONTEXT.md +3700 -1153
  41. package/dist-skill/SKILL-dev.md +15 -17
  42. package/dist-skill/SKILL.md +14 -9
  43. package/dist-skill/docs/API/core/concepts.md +28 -1
  44. package/dist-skill/docs/CLI.md +488 -0
  45. package/dist-skill/docs/generated/assembly.md +19 -11
  46. package/dist-skill/docs/generated/core.md +1165 -264
  47. package/dist-skill/docs/generated/curves.md +168 -1
  48. package/dist-skill/docs/generated/lib.md +10 -5
  49. package/dist-skill/docs/generated/output.md +1 -1
  50. package/dist-skill/docs/generated/sdf.md +208 -0
  51. package/dist-skill/docs/generated/sketch.md +1281 -329
  52. package/dist-skill/docs/generated/viewport.md +29 -2
  53. package/dist-skill/docs/guides/joint-design.md +78 -0
  54. package/dist-skill/docs-dev/API/core/concepts.md +28 -1
  55. package/dist-skill/docs-dev/CLI.md +488 -0
  56. package/dist-skill/docs-dev/coding.md +1 -1
  57. package/dist-skill/docs-dev/component-model.md +164 -0
  58. package/dist-skill/docs-dev/generated/assembly.md +19 -11
  59. package/dist-skill/docs-dev/generated/core.md +1165 -264
  60. package/dist-skill/docs-dev/generated/curves.md +168 -1
  61. package/dist-skill/docs-dev/generated/lib.md +10 -5
  62. package/dist-skill/docs-dev/generated/output.md +1 -1
  63. package/dist-skill/docs-dev/generated/sdf.md +208 -0
  64. package/dist-skill/docs-dev/generated/sketch.md +1281 -329
  65. package/dist-skill/docs-dev/generated/viewport.md +29 -2
  66. package/dist-skill/docs-dev/guides/joint-design.md +78 -0
  67. package/examples/api/attachTo-basics.forge.js +3 -3
  68. package/examples/api/bill-of-materials.forge.js +9 -9
  69. package/examples/api/bolt-pattern.forge.js +5 -5
  70. package/examples/api/boolean-operations.forge.js +2 -2
  71. package/examples/api/bounding-box-visualizer.forge.js +1 -1
  72. package/examples/api/clone-duplicate.forge.js +1 -1
  73. package/examples/api/connector-assembly.forge.js +4 -2
  74. package/examples/api/connector-basics.forge.js +5 -5
  75. package/examples/api/constrained-sketch-mechanical.forge.js +4 -4
  76. package/examples/api/elbow-test.forge.js +3 -3
  77. package/examples/api/extrude-options.forge.js +4 -4
  78. package/examples/api/fillet-showcase.forge.js +1 -1
  79. package/examples/api/gears-tier1.forge.js +5 -5
  80. package/examples/api/group-test.forge.js +2 -2
  81. package/examples/api/mesh-import-slats.forge.js +3 -3
  82. package/examples/api/patterns.forge.js +3 -3
  83. package/examples/api/pointAlong-orientation.forge.js +2 -2
  84. package/examples/api/profile-2020-b-slot6.forge.js +4 -4
  85. package/examples/api/sketch-rounding-strategies.forge.js +1 -1
  86. package/examples/api/smooth-curve-connections.forge.js +1 -1
  87. package/examples/api/transition-curves.forge.js +3 -3
  88. package/examples/constraints/01-fully-constrained-rect.forge.js +2 -2
  89. package/examples/constraints/02-underconstrained-triangle.forge.js +1 -1
  90. package/examples/constraints/03-redundant-constraints.forge.js +2 -2
  91. package/examples/constraints/05-parallel-with-linedistance.forge.js +2 -2
  92. package/examples/constraints/06-complex-spectrogram.forge.js +1 -1
  93. package/examples/constraints/07-perpendicular-chain.forge.js +4 -4
  94. package/examples/constraints/08-symmetric-bracket.forge.js +4 -4
  95. package/examples/constraints/09-stress-spiral.forge.js +1 -1
  96. package/examples/constraints/10-stress-honeycomb.forge.js +1 -1
  97. package/examples/constraints/11-surface-grid.forge.js +2 -2
  98. package/examples/constraints/12-surface-nested.forge.js +4 -4
  99. package/examples/constraints/13-surface-complex.forge.js +1 -1
  100. package/examples/exact-arc-housing.forge.js +12 -0
  101. package/examples/furniture/adjustable-table.forge.js +13 -13
  102. package/examples/furniture/bathroom.forge.js +15 -15
  103. package/examples/furniture/chair.forge.js +12 -12
  104. package/examples/furniture/picture-frame.forge.js +6 -6
  105. package/examples/furniture/shoe-rack-doors.forge.js +8 -8
  106. package/examples/furniture/shoe-rack.forge.js +7 -7
  107. package/examples/furniture/table-lamp.forge.js +8 -8
  108. package/examples/gcode/lissajous-vase.forge.js +4 -4
  109. package/examples/gcode/math-surface.forge.js +3 -3
  110. package/examples/gcode/parametric-vase.forge.js +4 -4
  111. package/examples/gcode/spiral-tower.forge.js +4 -4
  112. package/examples/generative/crystal-growth.forge.js +7 -7
  113. package/examples/generative/frost-spires.forge.js +6 -6
  114. package/examples/generative/golden-spiral-tower.forge.js +8 -8
  115. package/examples/generative/molten-forge.forge.js +6 -6
  116. package/examples/generative/neon-coral.forge.js +7 -7
  117. package/examples/mechanical/3d-printer.forge.js +9 -9
  118. package/examples/mechanical/5-finger-robot-hand.forge.js +4 -4
  119. package/examples/mechanical/airplane-propeller.forge.js +7 -7
  120. package/examples/mechanical/bolt-and-nut.forge.js +10 -10
  121. package/examples/mechanical/door-with-hinges.forge.js +7 -7
  122. package/examples/mechanical/fillet-enclosure.forge.js +14 -10
  123. package/examples/mechanical/headphone-hanger-v2.forge.js +9 -9
  124. package/examples/mechanical/robot_hand.forge.js +10 -10
  125. package/examples/mechanical/robot_hand_2.forge.js +17 -17
  126. package/examples/nurbs-surface.forge.js +8 -0
  127. package/examples/nurbs-tube.forge.js +7 -0
  128. package/examples/products/bottle.forge.js +7 -7
  129. package/examples/products/chess-set.forge.js +6 -6
  130. package/examples/products/classical-piano.forge.js +9 -9
  131. package/examples/products/clock.forge.js +21 -21
  132. package/examples/products/cup.forge.js +5 -5
  133. package/examples/products/iphone.forge.js +12 -12
  134. package/examples/products/laptop.forge.js +9 -9
  135. package/examples/products/laser-cut-box.forge.js +6 -6
  136. package/examples/products/laser-cut-tray.forge.js +6 -6
  137. package/examples/products/liquid-soap-dispenser.forge.js +5 -5
  138. package/examples/products/origami-fish.forge.js +6 -6
  139. package/examples/products/spiderman-cake.forge.js +2 -2
  140. package/examples/shelf/container.forge.js +5 -5
  141. package/examples/shelf/shelf-unit.forge.js +6 -6
  142. package/examples/toolbox/bolted-joint.forge.js +5 -5
  143. package/package.json +3 -1
  144. package/dist/assets/EditorApp-D9bJvtf7.js +0 -11338
  145. package/dist/assets/LandingPage-CdCuEOdC.js +0 -451
  146. package/dist-cli/chunk-PZ5AY32C.js +0 -10
  147. package/dist-cli/chunk-PZ5AY32C.js.map +0 -1
  148. package/dist-skill/docs/CLI/export.md +0 -91
  149. package/dist-skill/docs/CLI/projects.md +0 -107
  150. package/dist-skill/docs/CLI/studio_publishing.md +0 -52
  151. package/dist-skill/docs/CLI/validation.md +0 -66
  152. package/dist-skill/docs-dev/API/core/sdf-advanced.md +0 -92
  153. package/dist-skill/docs-dev/API/core/sdf-primitives.md +0 -58
  154. package/dist-skill/docs-dev/API/core/sdf-workflow.md +0 -42
  155. package/dist-skill/docs-dev/CLI/export.md +0 -91
  156. package/dist-skill/docs-dev/CLI/projects.md +0 -107
  157. package/dist-skill/docs-dev/CLI/studio_publishing.md +0 -52
  158. package/dist-skill/docs-dev/CLI/validation.md +0 -66
@@ -5,19 +5,19 @@
5
5
  // BUILD NOTES (at bottom of file):
6
6
  // Materials, dimensions, and assembly instructions for actually building this.
7
7
 
8
- const topW = param("Top Width", 120, { min: 80, max: 200, unit: "cm" });
9
- const topD = param("Top Depth", 60, { min: 40, max: 100, unit: "cm" });
10
- const topThick = param("Top Thickness", 3, { min: 2, max: 5, unit: "cm" });
11
- const minH = param("Min Height", 72, { min: 60, max: 80, unit: "cm" });
12
- const maxH = param("Max Height", 120, { min: 100, max: 140, unit: "cm" });
13
- const heightPct = param("Height %", 30, { min: 0, max: 100, unit: "%" });
14
- const outerLeg = param("Outer Leg", 6, { min: 4, max: 10, unit: "cm" });
15
- const innerLeg = param("Inner Leg", 4, { min: 3, max: 8, unit: "cm" });
16
- const legWall = param("Leg Wall", 0.3, { min: 0.2, max: 0.5, unit: "cm" });
17
- const inset = param("Leg Inset", 5, { min: 2, max: 15, unit: "cm" });
18
- const braceW = param("Brace Width", 3, { min: 2, max: 5, unit: "cm" });
19
- const braceH = param("Brace Height", 1.5, { min: 1, max: 3, unit: "cm" });
20
- const crankR = param("Crank Radius", 8, { min: 5, max: 15, unit: "cm" });
8
+ const topW = Param.number("Top Width", 120, { min: 80, max: 200, unit: "cm" });
9
+ const topD = Param.number("Top Depth", 60, { min: 40, max: 100, unit: "cm" });
10
+ const topThick = Param.number("Top Thickness", 3, { min: 2, max: 5, unit: "cm" });
11
+ const minH = Param.number("Min Height", 72, { min: 60, max: 80, unit: "cm" });
12
+ const maxH = Param.number("Max Height", 120, { min: 100, max: 140, unit: "cm" });
13
+ const heightPct = Param.number("Height %", 30, { min: 0, max: 100, unit: "%" });
14
+ const outerLeg = Param.number("Outer Leg", 6, { min: 4, max: 10, unit: "cm" });
15
+ const innerLeg = Param.number("Inner Leg", 4, { min: 3, max: 8, unit: "cm" });
16
+ const legWall = Param.number("Leg Wall", 0.3, { min: 0.2, max: 0.5, unit: "cm" });
17
+ const inset = Param.number("Leg Inset", 5, { min: 2, max: 15, unit: "cm" });
18
+ const braceW = Param.number("Brace Width", 3, { min: 2, max: 5, unit: "cm" });
19
+ const braceH = Param.number("Brace Height", 1.5, { min: 1, max: 3, unit: "cm" });
20
+ const crankR = Param.number("Crank Radius", 8, { min: 5, max: 15, unit: "cm" });
21
21
 
22
22
  // Current height based on slider
23
23
  const currentH = minH + (maxH - minH) * heightPct / 100;
@@ -1,11 +1,11 @@
1
1
  // Full Bathroom — parametric room with fixtures
2
2
  // Bathtub, sink, toilet, mirror, shower glass panel, towel rack
3
3
 
4
- const roomW = param("Room Width", 2400, { min: 1800, max: 3500, unit: "mm" });
5
- const roomD = param("Room Depth", 2000, { min: 1500, max: 3000, unit: "mm" });
6
- const roomH = param("Room Height", 2500, { min: 2200, max: 3000, unit: "mm" });
7
- const wallT = param("Wall Thickness", 80, { min: 50, max: 150, unit: "mm" });
8
- const tileH = param("Tile Height", 1200, { min: 800, max: 1800, unit: "mm" });
4
+ const roomW = Param.number("Room Width", 2400, { min: 1800, max: 3500, unit: "mm" });
5
+ const roomD = Param.number("Room Depth", 2000, { min: 1500, max: 3000, unit: "mm" });
6
+ const roomH = Param.number("Room Height", 2500, { min: 2200, max: 3000, unit: "mm" });
7
+ const wallT = Param.number("Wall Thickness", 80, { min: 50, max: 150, unit: "mm" });
8
+ const tileH = Param.number("Tile Height", 1200, { min: 800, max: 1800, unit: "mm" });
9
9
 
10
10
  // ─── Room shell (floor + 3 walls, front open) ───
11
11
 
@@ -21,10 +21,10 @@ const tileStrip = box(roomW - 2 * wallT, 2, tileH)
21
21
 
22
22
  // ─── Bathtub (left-back corner) ───
23
23
 
24
- const tubL = param("Tub Length", 1500, { min: 1200, max: 1800, unit: "mm" });
25
- const tubW = param("Tub Width", 700, { min: 550, max: 800, unit: "mm" });
26
- const tubH = param("Tub Height", 500, { min: 400, max: 600, unit: "mm" });
27
- const tubWall = param("Tub Wall", 40, { min: 25, max: 60, unit: "mm" });
24
+ const tubL = Param.number("Tub Length", 1500, { min: 1200, max: 1800, unit: "mm" });
25
+ const tubW = Param.number("Tub Width", 700, { min: 550, max: 800, unit: "mm" });
26
+ const tubH = Param.number("Tub Height", 500, { min: 400, max: 600, unit: "mm" });
27
+ const tubWall = Param.number("Tub Wall", 40, { min: 25, max: 60, unit: "mm" });
28
28
 
29
29
  const tubX = wallT + 20;
30
30
  const tubY = roomD - wallT - tubW - 20;
@@ -39,7 +39,7 @@ const bathtub = tubOuter.subtract(tubInner).subtract(tubDrain)
39
39
 
40
40
  // ─── Shower (above tub) ───
41
41
 
42
- const glassH = param("Glass Height", 1800, { min: 1500, max: 2200, unit: "mm" });
42
+ const glassH = Param.number("Glass Height", 1800, { min: 1500, max: 2200, unit: "mm" });
43
43
  const glassT = 8;
44
44
 
45
45
  // Glass panel at tub edge
@@ -62,8 +62,8 @@ const shower = union(showerArm, showerHead);
62
62
 
63
63
  // ─── Toilet (right side, against back wall) ───
64
64
 
65
- const toiletW = param("Toilet Width", 380, { min: 340, max: 420, unit: "mm" });
66
- const toiletD = param("Toilet Depth", 650, { min: 550, max: 750, unit: "mm" });
65
+ const toiletW = Param.number("Toilet Width", 380, { min: 340, max: 420, unit: "mm" });
66
+ const toiletD = Param.number("Toilet Depth", 650, { min: 550, max: 750, unit: "mm" });
67
67
  const toiletH = 400;
68
68
 
69
69
  const toiletX = roomW - wallT - toiletW - 150;
@@ -100,7 +100,7 @@ const toilet = union(bowl, tank, lid, seat);
100
100
 
101
101
  // ─── Sink (right wall, facing into room) ───
102
102
 
103
- const sinkW = param("Sink Width", 550, { min: 400, max: 700, unit: "mm" });
103
+ const sinkW = Param.number("Sink Width", 550, { min: 400, max: 700, unit: "mm" });
104
104
  const sinkD = 420;
105
105
  const sinkH = 160;
106
106
  const sinkZ = 850;
@@ -136,8 +136,8 @@ const sink = union(basin, pedestal, faucetStem, faucetSpout, handleL, handleR);
136
136
 
137
137
  // ─── Mirror (on right wall, above sink) ───
138
138
 
139
- const mirrorW = param("Mirror Width", 600, { min: 400, max: 900, unit: "mm" });
140
- const mirrorH = param("Mirror Height", 800, { min: 500, max: 1200, unit: "mm" });
139
+ const mirrorW = Param.number("Mirror Width", 600, { min: 400, max: 900, unit: "mm" });
140
+ const mirrorH = Param.number("Mirror Height", 800, { min: 500, max: 1200, unit: "mm" });
141
141
  const mirrorT = 5;
142
142
  const frameW = 15;
143
143
 
@@ -1,20 +1,20 @@
1
1
  // Four-Legged Chair — parametric dining chair
2
2
 
3
- const seatW = param("Seat Width", 45, { min: 30, max: 60, unit: "mm" });
4
- const seatD = param("Seat Depth", 42, { min: 30, max: 55, unit: "mm" });
5
- const seatT = param("Seat Thickness", 3, { min: 2, max: 6, unit: "mm" });
6
- const seatH = param("Seat Height", 45, { min: 35, max: 55, unit: "mm" });
3
+ const seatW = Param.number("Seat Width", 45, { min: 30, max: 60, unit: "mm" });
4
+ const seatD = Param.number("Seat Depth", 42, { min: 30, max: 55, unit: "mm" });
5
+ const seatT = Param.number("Seat Thickness", 3, { min: 2, max: 6, unit: "mm" });
6
+ const seatH = Param.number("Seat Height", 45, { min: 35, max: 55, unit: "mm" });
7
7
 
8
- const legW = param("Leg Width", 4, { min: 2, max: 8, unit: "mm" });
9
- const legInset = param("Leg Inset", 3, { min: 0, max: 10, unit: "mm" });
8
+ const legW = Param.number("Leg Width", 4, { min: 2, max: 8, unit: "mm" });
9
+ const legInset = Param.number("Leg Inset", 3, { min: 0, max: 10, unit: "mm" });
10
10
 
11
- const backH = param("Back Height", 40, { min: 25, max: 60, unit: "mm" });
12
- const backT = param("Back Thickness", 3, { min: 2, max: 6, unit: "mm" });
13
- const backTilt = param("Back Tilt", 5, { min: 0, max: 15, unit: "°" });
11
+ const backH = Param.number("Back Height", 40, { min: 25, max: 60, unit: "mm" });
12
+ const backT = Param.number("Back Thickness", 3, { min: 2, max: 6, unit: "mm" });
13
+ const backTilt = Param.number("Back Tilt", 5, { min: 0, max: 15, unit: "°" });
14
14
 
15
- const stretcher = param("Stretchers", 1, { min: 0, max: 1, step: 1 });
16
- const stretcherH = param("Stretcher Height", 12, { min: 5, max: 30, unit: "mm" });
17
- const stretcherW = param("Stretcher Width", 2, { min: 1, max: 4, unit: "mm" });
15
+ const stretcher = Param.number("Stretchers", 1, { min: 0, max: 1, step: 1 });
16
+ const stretcherH = Param.number("Stretcher Height", 12, { min: 5, max: 30, unit: "mm" });
17
+ const stretcherW = Param.number("Stretcher Width", 2, { min: 1, max: 4, unit: "mm" });
18
18
 
19
19
  // --- Seat ---
20
20
  const seat = box(seatW, seatD, seatT).translate(0, 0, seatH);
@@ -1,11 +1,11 @@
1
1
  // Picture Frame — parametric wall frame with optional mat border
2
2
 
3
- const frameW = param("Frame Width", 120, { min: 60, max: 250, unit: "mm" });
4
- const frameH = param("Frame Height", 160, { min: 80, max: 300, unit: "mm" });
5
- const border = param("Border Width", 12, { min: 5, max: 30, unit: "mm" });
6
- const depth = param("Frame Depth", 8, { min: 3, max: 20, unit: "mm" });
7
- const mat = param("Mat Width", 8, { min: 0, max: 20, unit: "mm" });
8
- const matDepth = param("Mat Depth", 2, { min: 1, max: 5, unit: "mm" });
3
+ const frameW = Param.number("Frame Width", 120, { min: 60, max: 250, unit: "mm" });
4
+ const frameH = Param.number("Frame Height", 160, { min: 80, max: 300, unit: "mm" });
5
+ const border = Param.number("Border Width", 12, { min: 5, max: 30, unit: "mm" });
6
+ const depth = Param.number("Frame Depth", 8, { min: 3, max: 20, unit: "mm" });
7
+ const mat = Param.number("Mat Width", 8, { min: 0, max: 20, unit: "mm" });
8
+ const matDepth = Param.number("Mat Depth", 2, { min: 1, max: 5, unit: "mm" });
9
9
 
10
10
  // Outer frame
11
11
  const outer = box(frameW, frameH, depth);
@@ -3,17 +3,17 @@
3
3
  // 4 doors (2 per shelf level), hinged at the outer edges.
4
4
  // Each pair shares one angle slider for synchronized open/close.
5
5
 
6
- const width = param("Width", 800, { min: 500, max: 1200, unit: "mm" });
7
- const depth = param("Depth", 350, { min: 250, max: 500, unit: "mm" });
8
- const totalH = param("Total Height", 500, { min: 350, max: 650, unit: "mm" });
6
+ const width = Param.number("Width", 800, { min: 500, max: 1200, unit: "mm" });
7
+ const depth = Param.number("Depth", 350, { min: 250, max: 500, unit: "mm" });
8
+ const totalH = Param.number("Total Height", 500, { min: 350, max: 650, unit: "mm" });
9
9
 
10
- const boardT = param("Board Thickness", 18, { min: 12, max: 25, unit: "mm" });
10
+ const boardT = Param.number("Board Thickness", 18, { min: 12, max: 25, unit: "mm" });
11
11
 
12
- const seatPad = param("Seat Padding", 30, { min: 15, max: 60, unit: "mm" });
13
- const seatOverhang = param("Seat Overhang", 10, { min: 0, max: 30, unit: "mm" });
12
+ const seatPad = Param.number("Seat Padding", 30, { min: 15, max: 60, unit: "mm" });
13
+ const seatOverhang = Param.number("Seat Overhang", 10, { min: 0, max: 30, unit: "mm" });
14
14
 
15
- const doorT = param("Door Thickness", 8, { min: 4, max: 15, unit: "mm" });
16
- const doorGap = param("Door Gap", 2, { min: 1, max: 5, unit: "mm" });
15
+ const doorT = Param.number("Door Thickness", 8, { min: 4, max: 15, unit: "mm" });
16
+ const doorGap = Param.number("Door Gap", 2, { min: 1, max: 5, unit: "mm" });
17
17
 
18
18
  // Derived
19
19
  const innerW = width - 2 * boardT;
@@ -3,16 +3,16 @@
3
3
  // Structure: two side panels, bottom board, 2 shelves, top board,
4
4
  // back panel for rigidity, and a cushion on top for sitting.
5
5
 
6
- const width = param("Width", 800, { min: 500, max: 1200, unit: "mm" });
7
- const depth = param("Depth", 350, { min: 250, max: 500, unit: "mm" });
8
- const totalH = param("Total Height", 500, { min: 350, max: 650, unit: "mm" });
6
+ const width = Param.number("Width", 800, { min: 500, max: 1200, unit: "mm" });
7
+ const depth = Param.number("Depth", 350, { min: 250, max: 500, unit: "mm" });
8
+ const totalH = Param.number("Total Height", 500, { min: 350, max: 650, unit: "mm" });
9
9
 
10
- const boardT = param("Board Thickness", 18, { min: 12, max: 25, unit: "mm" });
10
+ const boardT = Param.number("Board Thickness", 18, { min: 12, max: 25, unit: "mm" });
11
11
 
12
- const seatPad = param("Seat Padding", 30, { min: 15, max: 60, unit: "mm" });
13
- const seatOverhang = param("Seat Overhang", 10, { min: 0, max: 30, unit: "mm" });
12
+ const seatPad = Param.number("Seat Padding", 30, { min: 15, max: 60, unit: "mm" });
13
+ const seatOverhang = Param.number("Seat Overhang", 10, { min: 0, max: 30, unit: "mm" });
14
14
 
15
- const divider = param("Center Divider", 1, { min: 0, max: 1, step: 1 });
15
+ const divider = Param.number("Center Divider", 1, { min: 0, max: 1, step: 1 });
16
16
 
17
17
  // Derived
18
18
  const innerW = width - 2 * boardT;
@@ -1,13 +1,13 @@
1
1
  // Table Lamp — base + stem + shade (multi-file: imports shade profile)
2
2
 
3
- const baseR = param("Base Radius", 25, { min: 15, max: 40, unit: "mm" });
4
- const baseH = param("Base Height", 6, { min: 3, max: 12, unit: "mm" });
5
- const stemR = param("Stem Radius", 4, { min: 2, max: 8, unit: "mm" });
6
- const stemH = param("Stem Height", 60, { min: 30, max: 100, unit: "mm" });
7
- const shadeTopR = param("Shade Top Radius", 15, { min: 8, max: 30, unit: "mm" });
8
- const shadeBottomR = param("Shade Bottom Radius", 30, { min: 15, max: 50, unit: "mm" });
9
- const shadeH = param("Shade Height", 35, { min: 20, max: 60, unit: "mm" });
10
- const shadeWall = param("Shade Wall", 1.5, { min: 0.5, max: 4, unit: "mm" });
3
+ const baseR = Param.number("Base Radius", 25, { min: 15, max: 40, unit: "mm" });
4
+ const baseH = Param.number("Base Height", 6, { min: 3, max: 12, unit: "mm" });
5
+ const stemR = Param.number("Stem Radius", 4, { min: 2, max: 8, unit: "mm" });
6
+ const stemH = Param.number("Stem Height", 60, { min: 30, max: 100, unit: "mm" });
7
+ const shadeTopR = Param.number("Shade Top Radius", 15, { min: 8, max: 30, unit: "mm" });
8
+ const shadeBottomR = Param.number("Shade Bottom Radius", 30, { min: 15, max: 50, unit: "mm" });
9
+ const shadeH = Param.number("Shade Height", 35, { min: 20, max: 60, unit: "mm" });
10
+ const shadeWall = Param.number("Shade Wall", 1.5, { min: 0.5, max: 4, unit: "mm" });
11
11
 
12
12
  // --- Base: flat cylinder ---
13
13
  const base = cylinder(baseH, baseR);
@@ -5,10 +5,10 @@
5
5
  * Creates beautiful organic-looking walls with a continuously changing profile.
6
6
  */
7
7
 
8
- const a = param('a', 3, 1, 7); // X frequency
9
- const b = param('b', 2, 1, 7); // Y frequency
10
- const baseRadius = param('radius', 25, 10, 50);
11
- const height = param('height', 100, 30, 200);
8
+ const a = Param.number('a', 3, 1, 7); // X frequency
9
+ const b = Param.number('b', 2, 1, 7); // Y frequency
10
+ const baseRadius = Param.number('radius', 25, 10, 50);
11
+ const height = Param.number('height', 100, 30, 200);
12
12
  const layerHeight = 0.2;
13
13
 
14
14
  const g = gcode({ nozzle: 0.4, layerHeight, printSpeed: 1800 });
@@ -7,9 +7,9 @@
7
7
  * The surface function creates an undulating bowl shape.
8
8
  */
9
9
 
10
- const outerRadius = param('radius', 40, 15, 60);
11
- const amplitude = param('amplitude', 8, 1, 20);
12
- const waves = param('waves', 4, 1, 8);
10
+ const outerRadius = Param.number('radius', 40, 15, 60);
11
+ const amplitude = Param.number('amplitude', 8, 1, 20);
12
+ const waves = Param.number('waves', 4, 1, 8);
13
13
  const layerHeight = 0.3;
14
14
  const lineSpacing = 0.6; // spacing between concentric passes
15
15
 
@@ -7,10 +7,10 @@
7
7
  * Try tweaking: amplitude, frequency, baseRadius, height, layerHeight.
8
8
  */
9
9
 
10
- const amplitude = param('amplitude', 8, 1, 20);
11
- const frequency = param('frequency', 6, 1, 20);
12
- const baseRadius = param('radius', 25, 10, 60);
13
- const height = param('height', 80, 20, 200);
10
+ const amplitude = Param.number('amplitude', 8, 1, 20);
11
+ const frequency = Param.number('frequency', 6, 1, 20);
12
+ const baseRadius = Param.number('radius', 25, 10, 60);
13
+ const height = Param.number('height', 80, 20, 200);
14
14
  const layerHeight = 0.2;
15
15
  const nozzle = 0.4;
16
16
 
@@ -5,10 +5,10 @@
5
5
  * Each layer is a hexagon that twists slightly more than the last.
6
6
  */
7
7
 
8
- const sides = param('sides', 6, 3, 12);
9
- const radius = param('radius', 20, 10, 40);
10
- const height = param('height', 60, 20, 120);
11
- const twistDeg = param('twist', 90, 0, 360);
8
+ const sides = Param.number('sides', 6, 3, 12);
9
+ const radius = Param.number('radius', 20, 10, 40);
10
+ const height = Param.number('height', 60, 20, 120);
11
+ const twistDeg = Param.number('twist', 90, 0, 360);
12
12
  const layerHeight = 0.2;
13
13
 
14
14
  const g = gcode({ nozzle: 0.4, layerHeight, printSpeed: 1800 });
@@ -36,9 +36,9 @@ scene({
36
36
  fog: { color: '#0a0612', near: 350, far: 900 },
37
37
 
38
38
  postProcessing: {
39
- bloom: { intensity: param('bloom', 1.2, 0, 3), threshold: 0.6, radius: 0.5 },
39
+ bloom: { intensity: Param.number('bloom', 1.2, 0, 3), threshold: 0.6, radius: 0.5 },
40
40
  vignette: { darkness: 0.7, offset: 0.3 },
41
- toneMappingExposure: param('exposure', 1.3, 0.5, 3),
41
+ toneMappingExposure: Param.number('exposure', 1.3, 0.5, 3),
42
42
  },
43
43
 
44
44
  capture: {
@@ -50,11 +50,11 @@ scene({
50
50
  // ---------------------------------------------------------------------------
51
51
  // Parameters
52
52
  // ---------------------------------------------------------------------------
53
- const seed = param('seed', 42, 0, 100);
54
- const crystalCount = param('crystals', 12, 3, 24);
55
- const maxHeight = param('maxHeight', 120, 40, 200);
56
- const baseRadius = param('baseRadius', 80, 30, 150);
57
- const taperFactor = param('taper', 0.3, 0.1, 0.8);
53
+ const seed = Param.number('seed', 42, 0, 100);
54
+ const crystalCount = Param.number('crystals', 12, 3, 24);
55
+ const maxHeight = Param.number('maxHeight', 120, 40, 200);
56
+ const baseRadius = Param.number('baseRadius', 80, 30, 150);
57
+ const taperFactor = Param.number('taper', 0.3, 0.1, 0.8);
58
58
 
59
59
  // ---------------------------------------------------------------------------
60
60
  // PRNG
@@ -32,10 +32,10 @@ scene({
32
32
  fog: { color: '#0a1628', near: 200, far: 550 },
33
33
 
34
34
  postProcessing: {
35
- bloom: { intensity: param('bloom', 1.2, 0, 4), threshold: 0.5, radius: 0.6 },
35
+ bloom: { intensity: Param.number('bloom', 1.2, 0, 4), threshold: 0.5, radius: 0.6 },
36
36
  vignette: { darkness: 0.7, offset: 0.3 },
37
37
  grain: { intensity: 0.04 },
38
- toneMappingExposure: param('exposure', 1.4, 0.5, 3),
38
+ toneMappingExposure: Param.number('exposure', 1.4, 0.5, 3),
39
39
  },
40
40
 
41
41
  capture: {
@@ -47,10 +47,10 @@ scene({
47
47
  // ---------------------------------------------------------------------------
48
48
  // Parameters
49
49
  // ---------------------------------------------------------------------------
50
- const seed = param('seed', 23, 0, 100);
51
- const spireCount = param('spires', 14, 4, 30);
52
- const maxHeight = param('maxHeight', 100, 40, 160);
53
- const spread = param('spread', 55, 20, 100);
50
+ const seed = Param.number('seed', 23, 0, 100);
51
+ const spireCount = Param.number('spires', 14, 4, 30);
52
+ const maxHeight = Param.number('maxHeight', 100, 40, 160);
53
+ const spread = Param.number('spread', 55, 20, 100);
54
54
 
55
55
  // ---------------------------------------------------------------------------
56
56
  // PRNG
@@ -4,7 +4,7 @@
4
4
  * A spiraling tower of boxes arranged in a golden-ratio pattern,
5
5
  * like a computational sunflower reaching for the sky.
6
6
  *
7
- * Demonstrates: scene(), param() integration, dramatic lighting,
7
+ * Demonstrates: scene(), Param.number() integration, dramatic lighting,
8
8
  * bloom post-processing, and fog depth.
9
9
  */
10
10
 
@@ -31,9 +31,9 @@ scene({
31
31
  fog: { color: '#050510', near: 300, far: 800 },
32
32
 
33
33
  postProcessing: {
34
- bloom: { intensity: param('bloom', 0.8, 0, 3), threshold: 0.7, radius: 0.6 },
34
+ bloom: { intensity: Param.number('bloom', 0.8, 0, 3), threshold: 0.7, radius: 0.6 },
35
35
  vignette: { darkness: 0.6, offset: 0.4 },
36
- toneMappingExposure: param('exposure', 1.4, 0.5, 3),
36
+ toneMappingExposure: Param.number('exposure', 1.4, 0.5, 3),
37
37
  },
38
38
 
39
39
  capture: {
@@ -45,11 +45,11 @@ scene({
45
45
  // ---------------------------------------------------------------------------
46
46
  // Parameters
47
47
  // ---------------------------------------------------------------------------
48
- const count = param('elements', 120, 20, 300);
49
- const towerHeight = param('height', 200, 50, 400);
50
- const spiralTightness = param('tightness', 2.5, 0.5, 6);
51
- const maxRadius = param('radius', 60, 20, 120);
52
- const elementScale = param('scale', 1.0, 0.3, 2.0);
48
+ const count = Param.number('elements', 120, 20, 300);
49
+ const towerHeight = Param.number('height', 200, 50, 400);
50
+ const spiralTightness = Param.number('tightness', 2.5, 0.5, 6);
51
+ const maxRadius = Param.number('radius', 60, 20, 120);
52
+ const elementScale = Param.number('scale', 1.0, 0.3, 2.0);
53
53
 
54
54
  // ---------------------------------------------------------------------------
55
55
  // Golden Ratio Spiral
@@ -32,10 +32,10 @@ scene({
32
32
  fog: { color: '#0a0000', near: 200, far: 500 },
33
33
 
34
34
  postProcessing: {
35
- bloom: { intensity: param('bloom', 2.0, 0, 5), threshold: 0.3, radius: 0.8 },
35
+ bloom: { intensity: Param.number('bloom', 2.0, 0, 5), threshold: 0.3, radius: 0.8 },
36
36
  vignette: { darkness: 0.9, offset: 0.2 },
37
37
  grain: { intensity: 0.06 },
38
- toneMappingExposure: param('exposure', 1.8, 0.5, 4),
38
+ toneMappingExposure: Param.number('exposure', 1.8, 0.5, 4),
39
39
  },
40
40
 
41
41
  capture: {
@@ -48,10 +48,10 @@ scene({
48
48
  // ---------------------------------------------------------------------------
49
49
  // Parameters
50
50
  // ---------------------------------------------------------------------------
51
- const seed = param('seed', 42, 0, 100);
52
- const pillarCount = param('pillars', 18, 5, 40);
53
- const maxHeight = param('maxHeight', 90, 30, 150);
54
- const baseRadius = param('baseRadius', 50, 20, 100);
51
+ const seed = Param.number('seed', 42, 0, 100);
52
+ const pillarCount = Param.number('pillars', 18, 5, 40);
53
+ const maxHeight = Param.number('maxHeight', 90, 30, 150);
54
+ const baseRadius = Param.number('baseRadius', 50, 20, 100);
55
55
 
56
56
  // ---------------------------------------------------------------------------
57
57
  // PRNG
@@ -32,10 +32,10 @@ scene({
32
32
  fog: { color: '#000814', near: 250, far: 600 },
33
33
 
34
34
  postProcessing: {
35
- bloom: { intensity: param('bloom', 1.5, 0, 4), threshold: 0.5, radius: 0.7 },
35
+ bloom: { intensity: Param.number('bloom', 1.5, 0, 4), threshold: 0.5, radius: 0.7 },
36
36
  vignette: { darkness: 0.8, offset: 0.25 },
37
37
  grain: { intensity: 0.08 },
38
- toneMappingExposure: param('exposure', 1.5, 0.5, 4),
38
+ toneMappingExposure: Param.number('exposure', 1.5, 0.5, 4),
39
39
  },
40
40
 
41
41
  capture: {
@@ -48,11 +48,11 @@ scene({
48
48
  // ---------------------------------------------------------------------------
49
49
  // Parameters
50
50
  // ---------------------------------------------------------------------------
51
- const seed = param('seed', 7, 0, 100);
52
- const stalkCount = param('stalks', 25, 5, 60);
53
- const maxStalkH = param('maxHeight', 80, 30, 150);
54
- const clusterSpread = param('spread', 60, 20, 120);
55
- const tipScale = param('tipSize', 1.5, 0.5, 3);
51
+ const seed = Param.number('seed', 7, 0, 100);
52
+ const stalkCount = Param.number('stalks', 25, 5, 60);
53
+ const maxStalkH = Param.number('maxHeight', 80, 30, 150);
54
+ const clusterSpread = Param.number('spread', 60, 20, 120);
55
+ const tipScale = Param.number('tipSize', 1.5, 0.5, 3);
56
56
 
57
57
  // ---------------------------------------------------------------------------
58
58
  // PRNG
@@ -5,12 +5,12 @@
5
5
  // Bed Z param represents current print progress (high = start, low = done).
6
6
 
7
7
  // ─── Parameters ───
8
- const bedW = param("Bed Width", 220, { min: 180, max: 300, unit: "mm" });
9
- const bedD = param("Bed Depth", 220, { min: 180, max: 300, unit: "mm" });
10
- const bedThick = param("Bed Thickness", 4, { min: 3, max: 8, unit: "mm" });
11
- const frameMargin = param("Frame Margin", 40, { min: 20, max: 80, unit: "mm" });
12
- const beam = param("Beam Size", 20, { min: 15, max: 30, unit: "mm" });
13
- const frameH = param("Frame Height", 400, { min: 320, max: 520, unit: "mm" });
8
+ const bedW = Param.number("Bed Width", 220, { min: 180, max: 300, unit: "mm" });
9
+ const bedD = Param.number("Bed Depth", 220, { min: 180, max: 300, unit: "mm" });
10
+ const bedThick = Param.number("Bed Thickness", 4, { min: 3, max: 8, unit: "mm" });
11
+ const frameMargin = Param.number("Frame Margin", 40, { min: 20, max: 80, unit: "mm" });
12
+ const beam = Param.number("Beam Size", 20, { min: 15, max: 30, unit: "mm" });
13
+ const frameH = Param.number("Frame Height", 400, { min: 320, max: 520, unit: "mm" });
14
14
 
15
15
  // ─── Derived frame ───
16
16
  const frameW = bedW + 2 * frameMargin;
@@ -27,15 +27,15 @@ const nozzleZ = gantryZ - nozzleToRail;
27
27
  // Bed starts near nozzle tip and lowers during printing.
28
28
  const bedTopMax = nozzleZ - 1;
29
29
  const bedTopMin = beam + bedThick + 80;
30
- const bedZ = param("Bed Z (print progress)", bedTopMax, {
30
+ const bedZ = Param.number("Bed Z (print progress)", bedTopMax, {
31
31
  min: bedTopMin, max: bedTopMax, unit: "mm",
32
32
  });
33
33
 
34
34
  // Gantry XY travel
35
35
  const gantryTravel = innerD / 2 - 30;
36
- const gantryY = param("Gantry Y", 0, { min: -gantryTravel, max: gantryTravel, unit: "mm" });
36
+ const gantryY = Param.number("Gantry Y", 0, { min: -gantryTravel, max: gantryTravel, unit: "mm" });
37
37
  const headTravel = innerW / 2 - 50;
38
- const headX = param("Nozzle X", 0, { min: -headTravel, max: headTravel, unit: "mm" });
38
+ const headX = Param.number("Nozzle X", 0, { min: -headTravel, max: headTravel, unit: "mm" });
39
39
 
40
40
  // ─── Colors ───
41
41
  const C = {
@@ -1,10 +1,10 @@
1
1
  // Robot Hand — functional, buildable concept
2
2
  // Z-up, Y depth (front = -Y)
3
3
 
4
- const scale = param("Scale", 1.0, { min: 0.7, max: 1.3, step: 0.05 });
5
- const curl = param("Finger Curl", 40, { min: 0, max: 70, unit: "°" });
6
- const thumbCurl = param("Thumb Curl", 35, { min: 0, max: 70, unit: "°" });
7
- const spread = param("Finger Spread", 8, { min: 0, max: 20, unit: "°" });
4
+ const scale = Param.number("Scale", 1.0, { min: 0.7, max: 1.3, step: 0.05 });
5
+ const curl = Param.number("Finger Curl", 40, { min: 0, max: 70, unit: "°" });
6
+ const thumbCurl = Param.number("Thumb Curl", 35, { min: 0, max: 70, unit: "°" });
7
+ const spread = Param.number("Finger Spread", 8, { min: 0, max: 20, unit: "°" });
8
8
 
9
9
  // --- Dimensions ---
10
10
  const palmW = 90 * scale;
@@ -18,13 +18,13 @@
18
18
  // Camber: 4% at root → 1.5% at tip (Cl margin at low-speed root)
19
19
 
20
20
  // ─── Design Parameters ──────────────────────────────────────────
21
- const diameter = param("Diameter", 1900, { min: 1200, max: 2600, unit: "mm" });
22
- const numBlades = param("Blades", 3, { min: 2, max: 6, integer: true });
23
- const pitchAngle = param("Pitch @75%R", 22, { min: 10, max: 40, unit: "°" });
24
- const maxChord = param("Max Chord", 155, { min: 80, max: 250, unit: "mm" });
25
- const hubDiameter = param("Hub Diameter", 140, { min: 80, max: 220, unit: "mm" });
26
- const meshRes = param("Mesh Resolution", 2.5, { min: 1.0, max: 5.0, step: 0.5, unit: "mm" });
27
- const showSections = boolParam("Show Airfoil Sections", false);
21
+ const diameter = Param.number("Diameter", 1900, { min: 1200, max: 2600, unit: "mm" });
22
+ const numBlades = Param.number("Blades", 3, { min: 2, max: 6, integer: true });
23
+ const pitchAngle = Param.number("Pitch @75%R", 22, { min: 10, max: 40, unit: "°" });
24
+ const maxChord = Param.number("Max Chord", 155, { min: 80, max: 250, unit: "mm" });
25
+ const hubDiameter = Param.number("Hub Diameter", 140, { min: 80, max: 220, unit: "mm" });
26
+ const meshRes = Param.number("Mesh Resolution", 2.5, { min: 1.0, max: 5.0, step: 0.5, unit: "mm" });
27
+ const showSections = Param.bool("Show Airfoil Sections", false);
28
28
 
29
29
  const R = diameter / 2;
30
30
  const rHub = hubDiameter / 2;
@@ -3,16 +3,16 @@
3
3
  // lib.bolt() and lib.nut() use Manifold's native extrude+twist
4
4
  // to sweep a thread tooth profile helically — clean geometry, no SDF grid.
5
5
 
6
- const diameter = param("Diameter", 8, { min: 4, max: 20, unit: "mm" });
7
- const length = param("Length", 30, { min: 10, max: 60, unit: "mm" });
8
- const pitch = param("Pitch", 1.25, { min: 0.5, max: 3, step: 0.25, unit: "mm" });
9
- const headH = param("Head Height", 5, { min: 3, max: 12, unit: "mm" });
10
- const headAF = param("Head AF", 13, { min: 7, max: 30, unit: "mm" });
11
- const nutHeight = param("Nut Height", 6.5, { min: 3, max: 12, unit: "mm" });
12
- const nutAF = param("Nut AF", 13, { min: 7, max: 30, unit: "mm" });
13
- const showNut = param("Show Nut", 1, { min: 0, max: 1, step: 1 });
14
- const nutPos = param("Nut Position", 5, { min: 0, max: 30, unit: "mm" });
15
- const segments = param("Segments", 36, { min: 12, max: 72, step: 4, integer: true });
6
+ const diameter = Param.number("Diameter", 8, { min: 4, max: 20, unit: "mm" });
7
+ const length = Param.number("Length", 30, { min: 10, max: 60, unit: "mm" });
8
+ const pitch = Param.number("Pitch", 1.25, { min: 0.5, max: 3, step: 0.25, unit: "mm" });
9
+ const headH = Param.number("Head Height", 5, { min: 3, max: 12, unit: "mm" });
10
+ const headAF = Param.number("Head AF", 13, { min: 7, max: 30, unit: "mm" });
11
+ const nutHeight = Param.number("Nut Height", 6.5, { min: 3, max: 12, unit: "mm" });
12
+ const nutAF = Param.number("Nut AF", 13, { min: 7, max: 30, unit: "mm" });
13
+ const showNut = Param.number("Show Nut", 1, { min: 0, max: 1, step: 1 });
14
+ const nutPos = Param.number("Nut Position", 5, { min: 0, max: 30, unit: "mm" });
15
+ const segments = Param.number("Segments", 36, { min: 12, max: 72, step: 4, integer: true });
16
16
 
17
17
  const boltShape = lib.bolt(diameter, length, {
18
18
  pitch,
@@ -1,15 +1,15 @@
1
1
  // Door with hinges — the door pivots around the hinge axis using joint().
2
2
  // Drag the "Door Angle" slider to open/close the door.
3
3
 
4
- const doorW = param("Door Width", 80, { min: 40, max: 120, unit: "mm" });
5
- const doorH = param("Door Height", 200, { min: 100, max: 300, unit: "mm" });
6
- const doorT = param("Door Thickness", 4, { min: 2, max: 10, unit: "mm" });
4
+ const doorW = Param.number("Door Width", 80, { min: 40, max: 120, unit: "mm" });
5
+ const doorH = Param.number("Door Height", 200, { min: 100, max: 300, unit: "mm" });
6
+ const doorT = Param.number("Door Thickness", 4, { min: 2, max: 10, unit: "mm" });
7
7
 
8
- const frameW = param("Frame Width", 8, { min: 4, max: 15, unit: "mm" });
9
- const frameD = param("Frame Depth", 6, { min: 3, max: 12, unit: "mm" });
8
+ const frameW = Param.number("Frame Width", 8, { min: 4, max: 15, unit: "mm" });
9
+ const frameD = Param.number("Frame Depth", 6, { min: 3, max: 12, unit: "mm" });
10
10
 
11
- const hingeR = param("Hinge Radius", 3, { min: 1.5, max: 6, unit: "mm" });
12
- const hingeH = param("Hinge Height", 16, { min: 8, max: 30, unit: "mm" });
11
+ const hingeR = Param.number("Hinge Radius", 3, { min: 1.5, max: 6, unit: "mm" });
12
+ const hingeH = Param.number("Hinge Height", 16, { min: 8, max: 30, unit: "mm" });
13
13
 
14
14
  // ── Door frame (stationary U-shape) ──
15
15
  const frame = union(