forgecad 0.9.14 → 0.9.16

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 (239) hide show
  1. package/LICENSE +6 -4
  2. package/README.md +8 -4
  3. package/dist/assets/{AdminPage-eWGs2K6H.js → AdminPage-CXvls4-J.js} +2 -2
  4. package/dist/assets/{BenchmarkPage-CTrLKfpo.js → BenchmarkPage-B27zk8xL.js} +4 -15
  5. package/dist/assets/{BlogPage-5nPesyds.js → BlogPage-CMAVvgQL.js} +2 -2
  6. package/dist/assets/{DocsPage-C4Y3nbYc.js → DocsPage-knf4I4h7.js} +9 -3
  7. package/dist/assets/EditorApp-BHMQlJ-D.js +14686 -0
  8. package/dist/assets/{EditorApp-BAnckbsk.css → EditorApp-BpjZgzk0.css} +846 -0
  9. package/dist/assets/{EmbedViewer-C8fB4n5U.js → EmbedViewer-D7ZGlFjx.js} +3 -3
  10. package/dist/assets/{LandingPageProofDriven-jSz0LaMM.js → LandingPageProofDriven-CnevhTE8.js} +36 -38
  11. package/dist/assets/LegalPage-BPTUmqeg.js +39 -0
  12. package/dist/assets/LegalPage-BRlScr9A.css +91 -0
  13. package/dist/assets/{PricingPage-B83B90zh.js → PricingPage-B0D4goG_.js} +19 -19
  14. package/dist/assets/{PricingPage-BMedqFef.css → PricingPage-BPF6HKyO.css} +25 -0
  15. package/dist/assets/{SettingsPage-DY889pcu.js → SettingsPage-CFF-UgjI.js} +2 -2
  16. package/dist/assets/app-CE3sYcV7.css +3890 -0
  17. package/dist/assets/{app-bEww1ic4.js → app-T0pDcSX4.js} +3382 -1069
  18. package/dist/assets/cli/{render-Cho2uKG_.js → render-C5pcIISc.js} +477 -29
  19. package/dist/assets/{constructionHistoryWorker-HYwzJY4m.js → constructionHistoryWorker-Ba2Hm58b.js} +928 -243
  20. package/dist/assets/{evalWorker-CjQwJSE-.js → evalWorker-vkx310U2.js} +8883 -6040
  21. package/dist/assets/{forgecad_geometry-CH2nvuLA.js → forgecad_geometry-Dgceylq9.js} +43 -1
  22. package/dist/assets/forgecad_geometry_bg-dD4RNQF1.wasm +0 -0
  23. package/dist/assets/{inspectWorker-DeRnMVv1.js → inspectWorker-BuTJDVX6.js} +1179 -273
  24. package/dist/assets/{javascript-70-4uGcz.js → javascript-1kQXfVaz.js} +1 -1
  25. package/dist/assets/{targets-D6PWsv6X.js → jointPose-B_Cgedn9.js} +71 -3
  26. package/dist/assets/landing-proof-driven-DiGqdtWa.js +18 -0
  27. package/dist/assets/{landing-proof-driven-oFYW6mjz.css → landing-proof-driven-ORyigZ6p.css} +13 -7
  28. package/dist/assets/legalContent-ZfFGMmi4.js +251 -0
  29. package/dist/assets/{manifold-rmfAcdwF.js → manifold-BWgsjmAM.js} +1 -1
  30. package/dist/assets/{manifold-uRzgk5O8.js → manifold-D6IFSkhH.js} +2 -2
  31. package/dist/assets/{manifold-CG9Fokx-.js → manifold-rZexZI0G.js} +1 -1
  32. package/dist/assets/{reportWorker-4cW_ZpoS.js → reportWorker-0AGij1Ru.js} +8659 -12771
  33. package/dist/assets/{scalar-sampling-budget-CfDiFvh7.js → scalar-sampling-budget-J5cuzxT1.js} +8050 -6203
  34. package/dist/assets/{scanProxyWorker-Bs2TDgLw.js → scanProxyWorker-Vl4Wxa1y.js} +50 -6
  35. package/dist/assets/{solver-DuJAO8S6.js → solver-BZ9LPTHs.js} +1 -1
  36. package/dist/assets/solver_bg-DAHZJ_rw.wasm +0 -0
  37. package/dist/assets/{vendor-react-Da3A2QmU.js → vendor-react-6j1Kke-Y.js} +6 -5
  38. package/dist/cli/render.html +1 -1
  39. package/dist/docs/index.html +2 -2
  40. package/dist/docs-raw/AI/ai-native-cad.md +50 -0
  41. package/dist/docs-raw/AI/usage.md +5 -12
  42. package/dist/docs-raw/CLI.md +34 -10
  43. package/dist/docs-raw/component-model.md +27 -11
  44. package/dist/docs-raw/generated/assembly.md +374 -187
  45. package/dist/docs-raw/generated/concepts.md +245 -237
  46. package/dist/docs-raw/generated/core.md +283 -6
  47. package/dist/docs-raw/generated/curves.md +274 -361
  48. package/dist/docs-raw/generated/lib.md +9 -19
  49. package/dist/docs-raw/generated/output.md +29 -4
  50. package/dist/docs-raw/generated/runtime-names.md +49 -0
  51. package/dist/docs-raw/generated/sdf.md +31 -0
  52. package/dist/docs-raw/generated/sheet-metal.md +9 -0
  53. package/dist/docs-raw/generated/sketch.md +44 -1
  54. package/dist/docs-raw/generated/viewport.md +11 -3
  55. package/dist/docs-raw/guides/coordinate-system.md +20 -16
  56. package/dist/docs-raw/guides/geometry-conventions.md +2 -2
  57. package/dist/docs-raw/guides/inspection-bundles.md +2 -1
  58. package/dist/docs-raw/guides/joint-design.md +24 -0
  59. package/dist/docs-raw/guides/positioning.md +13 -3
  60. package/dist/docs-raw/legal/privacy.md +63 -0
  61. package/dist/docs-raw/legal/software-license.md +55 -0
  62. package/dist/docs-raw/legal/terms.md +87 -0
  63. package/dist/docs-raw/skills/forgecad-3d-reconstruction.md +1 -1
  64. package/dist/docs-raw/skills/forgecad-blockout-model.md +1 -1
  65. package/dist/docs-raw/skills/forgecad-component-model.md +11 -2
  66. package/dist/docs-raw/skills/forgecad-high-level-spec.md +1 -1
  67. package/dist/docs-raw/skills/forgecad-image-replicator.md +8 -8
  68. package/dist/docs-raw/skills/forgecad-lld.md +1 -1
  69. package/dist/docs-raw/skills/forgecad-make-a-model.md +40 -39
  70. package/dist/docs-raw/skills/forgecad-model-grader.md +2 -2
  71. package/dist/docs-raw/skills/forgecad-prepare-prompt.md +2 -2
  72. package/dist/docs-raw/skills/forgecad-project.md +3 -1
  73. package/dist/docs-raw/skills/forgecad-reconstruction-benchmark.md +1 -1
  74. package/dist/docs-raw/skills/forgecad-render-inspect.md +4 -2
  75. package/dist/docs-raw/skills/forgecad-visual-spec.md +1 -1
  76. package/dist/docs-raw/skills/forgecad.md +4 -3
  77. package/dist/docs-raw/welcome.md +2 -0
  78. package/dist/index.html +40 -12
  79. package/dist/llms.txt +8 -0
  80. package/dist/site.webmanifest +1 -1
  81. package/dist/sitemap.xml +49 -13
  82. package/dist-cli/{check-compiler-U5SOPN7X.js → check-compiler-SYQ2PWOB.js} +1 -2
  83. package/dist-cli/{check-query-propagation-XOKNSSYU.js → check-query-propagation-HIAGV62W.js} +1 -2
  84. package/dist-cli/{chunk-EXWGNL6K.js → chunk-SPZE3DUY.js} +20659 -17930
  85. package/dist-cli/forgecad.js +3568 -1250
  86. package/dist-cli/{forgecad_geometry-GYVNKPIE.js → forgecad_geometry-QOQIIP53.js} +42 -1
  87. package/dist-cli/forgecad_geometry_bg.wasm +0 -0
  88. package/dist-cli/{solver-46FFSK2U.js → solver-OK4HECRH.js} +0 -1
  89. package/dist-cli/solver_bg.wasm +0 -0
  90. package/dist-skill/CONTEXT.md +1192 -725
  91. package/dist-skill/SKILL.md +3 -2
  92. package/dist-skill/docs/API/core/concepts.md +64 -1
  93. package/dist-skill/docs/CLI.md +34 -10
  94. package/dist-skill/docs/generated/assembly.md +339 -213
  95. package/dist-skill/docs/generated/core.md +283 -6
  96. package/dist-skill/docs/generated/curves.md +272 -362
  97. package/dist-skill/docs/generated/lib.md +9 -19
  98. package/dist-skill/docs/generated/output.md +29 -4
  99. package/dist-skill/docs/generated/runtime-names.md +40 -0
  100. package/dist-skill/docs/generated/sdf.md +31 -0
  101. package/dist-skill/docs/generated/sheet-metal.md +9 -0
  102. package/dist-skill/docs/generated/sketch.md +44 -2
  103. package/dist-skill/docs/generated/viewport.md +2 -87
  104. package/dist-skill/docs/guides/coordinate-system.md +20 -16
  105. package/dist-skill/docs/guides/geometry-conventions.md +2 -2
  106. package/dist-skill/docs/guides/inspection-bundles.md +2 -1
  107. package/dist-skill/docs/guides/joint-design.md +24 -0
  108. package/dist-skill/docs/guides/positioning.md +13 -3
  109. package/dist-skill/library/forgecad-component-model/SKILL.md +10 -1
  110. package/dist-skill/library/forgecad-image-replicator/SKILL.md +6 -6
  111. package/dist-skill/library/forgecad-image-replicator/scripts/compare_images.py +166 -0
  112. package/dist-skill/library/forgecad-make-a-model/SKILL.md +39 -38
  113. package/dist-skill/library/forgecad-model-grader/SKILL.md +1 -1
  114. package/dist-skill/library/forgecad-prepare-prompt/SKILL.md +1 -1
  115. package/dist-skill/library/forgecad-project/SKILL.md +2 -0
  116. package/dist-skill/library/forgecad-render-inspect/SKILL.md +3 -1
  117. package/examples/api/assembly-kinematics-foundation.forge.js +65 -0
  118. package/examples/api/assembly-kinematics-four-bar.forge.js +115 -0
  119. package/examples/api/assembly-kinematics-limb.forge.js +116 -0
  120. package/examples/api/connector-frame-rig-chain.forge.js +102 -0
  121. package/examples/api/exact-sheet-shell-assembly.forge.js +0 -2
  122. package/examples/api/exact-surface-studio.forge.js +6 -8
  123. package/examples/api/helix-basics.forge.js +8 -8
  124. package/examples/api/lean-foundations/README.md +12 -0
  125. package/examples/api/lean-foundations/curve-blend-exact.forge.js +22 -0
  126. package/examples/api/lean-foundations/curve-fit-interpolation.forge.js +18 -0
  127. package/examples/api/lean-foundations/curve-helix-canonicalization.forge.js +27 -0
  128. package/examples/api/lean-foundations/curve-route-canonicalization.forge.js +16 -0
  129. package/examples/api/lean-foundations/curve-trim-reverse.forge.js +24 -0
  130. package/examples/api/lean-foundations/exact-curve-arc.forge.js +36 -0
  131. package/examples/api/mixed-edge-finishes-proof.forge.js +8 -11
  132. package/examples/api/route3d-elbow.forge.js +71 -0
  133. package/examples/api/transition-curves.forge.js +44 -15
  134. package/examples/api/variable-sweep-test.forge.js +3 -1
  135. package/examples/api/y-blend-corner-showcase.forge.js +0 -2
  136. package/examples/generative/coral-vase.forge.js +1 -1
  137. package/examples/nurbs-tube.forge.js +1 -1
  138. package/package.json +17 -13
  139. package/dist/assets/EditorApp-lXv53A1m.js +0 -13610
  140. package/dist/assets/app-CsHnaBWt.css +0 -1789
  141. package/dist/assets/forgecad_geometry_bg-C5_E9Oa9.wasm +0 -0
  142. package/dist/assets/solver_bg-CWvv4lnN.wasm +0 -0
  143. package/dist/docs-raw/API/README.md +0 -16
  144. package/dist/docs-raw/API/core/concepts.md +0 -118
  145. package/dist/docs-raw/INDEX.md +0 -138
  146. package/dist/docs-raw/RELEASING.md +0 -87
  147. package/dist/docs-raw/agent-native-api.md +0 -27
  148. package/dist/docs-raw/beta-deployment.md +0 -304
  149. package/dist/docs-raw/beta-operations.md +0 -325
  150. package/dist/docs-raw/blueprint-first.md +0 -145
  151. package/dist/docs-raw/cli-monetization.md +0 -112
  152. package/dist/docs-raw/coding-best-practices.md +0 -120
  153. package/dist/docs-raw/coding.md +0 -340
  154. package/dist/docs-raw/deployment.md +0 -374
  155. package/dist/docs-raw/guides/skill-maintenance.md +0 -161
  156. package/dist/docs-raw/guides/surface-members.md +0 -82
  157. package/dist/docs-raw/harbor-cli.md +0 -854
  158. package/dist/docs-raw/internals/backend-vocabulary.md +0 -35
  159. package/dist/docs-raw/internals/compiler.md +0 -307
  160. package/dist/docs-raw/internals/constraint-solver-quality.md +0 -161
  161. package/dist/docs-raw/internals/constraint-solver.md +0 -176
  162. package/dist/docs-raw/internals/shape-from-slices.md +0 -152
  163. package/dist/docs-raw/internals/sketch-2d-pipeline.md +0 -108
  164. package/dist/docs-raw/platform/admin.md +0 -45
  165. package/dist/docs-raw/platform/architecture.md +0 -82
  166. package/dist/docs-raw/platform/auth.md +0 -139
  167. package/dist/docs-raw/platform/email.md +0 -67
  168. package/dist/docs-raw/platform/google-oauth-setup.md +0 -88
  169. package/dist/docs-raw/platform/observability.md +0 -197
  170. package/dist/docs-raw/platform/projects.md +0 -111
  171. package/dist/docs-raw/platform/sharing.md +0 -90
  172. package/dist/docs-raw/product/README.md +0 -39
  173. package/dist/docs-raw/product/api-as-product-language.md +0 -13
  174. package/dist/docs-raw/product/business-model.md +0 -15
  175. package/dist/docs-raw/product/competitive-positioning.md +0 -17
  176. package/dist/docs-raw/product/creative-manufacturing.md +0 -15
  177. package/dist/docs-raw/product/founder-story.md +0 -11
  178. package/dist/docs-raw/product/manufacturing-workflows.md +0 -15
  179. package/dist/docs-raw/product/onboarding-first-experience.md +0 -256
  180. package/dist/docs-raw/product/product-loop.md +0 -17
  181. package/dist/docs-raw/product/strategic-decisions.md +0 -22
  182. package/dist/docs-raw/product/user-outreach-email-templates.md +0 -161
  183. package/dist/docs-raw/product/user-segments.md +0 -15
  184. package/dist/docs-raw/product/vision.md +0 -26
  185. package/dist/docs-raw/rl-environments.md +0 -350
  186. package/dist/docs-raw/runbook.md +0 -611
  187. package/dist-cli/check-compiler-U5SOPN7X.js.map +0 -1
  188. package/dist-cli/check-query-propagation-XOKNSSYU.js.map +0 -1
  189. package/dist-cli/chunk-EXWGNL6K.js.map +0 -1
  190. package/dist-cli/forgecad.js.map +0 -1
  191. package/dist-cli/forgecad_geometry-GYVNKPIE.js.map +0 -1
  192. package/dist-cli/solver-46FFSK2U.js.map +0 -1
  193. package/dist-skill/SKILL-dev.md +0 -145
  194. package/dist-skill/docs-dev/API/core/concepts.md +0 -118
  195. package/dist-skill/docs-dev/CLI.md +0 -677
  196. package/dist-skill/docs-dev/agent-native-api.md +0 -27
  197. package/dist-skill/docs-dev/blueprint-first.md +0 -145
  198. package/dist-skill/docs-dev/coding-best-practices.md +0 -120
  199. package/dist-skill/docs-dev/coding.md +0 -340
  200. package/dist-skill/docs-dev/component-model.md +0 -164
  201. package/dist-skill/docs-dev/generated/assembly.md +0 -794
  202. package/dist-skill/docs-dev/generated/core.md +0 -2117
  203. package/dist-skill/docs-dev/generated/curves.md +0 -2583
  204. package/dist-skill/docs-dev/generated/lib.md +0 -169
  205. package/dist-skill/docs-dev/generated/output.md +0 -247
  206. package/dist-skill/docs-dev/generated/sdf.md +0 -446
  207. package/dist-skill/docs-dev/generated/sheet-metal.md +0 -504
  208. package/dist-skill/docs-dev/generated/sketch.md +0 -1811
  209. package/dist-skill/docs-dev/generated/viewport.md +0 -585
  210. package/dist-skill/docs-dev/generated/wood.md +0 -108
  211. package/dist-skill/docs-dev/guides/coordinate-system.md +0 -46
  212. package/dist-skill/docs-dev/guides/geometry-conventions.md +0 -52
  213. package/dist-skill/docs-dev/guides/inspection-bundles.md +0 -485
  214. package/dist-skill/docs-dev/guides/joint-design.md +0 -78
  215. package/dist-skill/docs-dev/guides/modeling-recipes.md +0 -78
  216. package/dist-skill/docs-dev/guides/positioning.md +0 -161
  217. package/dist-skill/docs-dev/guides/skill-maintenance.md +0 -161
  218. package/dist-skill/docs-dev/internals/backend-vocabulary.md +0 -35
  219. package/dist-skill/docs-dev/internals/compiler.md +0 -307
  220. package/dist-skill/docs-dev/internals/constraint-solver-quality.md +0 -161
  221. package/dist-skill/docs-dev/internals/constraint-solver.md +0 -176
  222. package/dist-skill/docs-dev/internals/sketch-2d-pipeline.md +0 -108
  223. package/dist-skill/library/forgecad-image-replicator/scripts/compare_images.mjs +0 -289
  224. package/examples/api/bolted-service-cover.forge.js +0 -17
  225. package/examples/api/cable-gland-anchor.forge.js +0 -14
  226. package/examples/api/captured-cartridge-guide.forge.js +0 -14
  227. package/examples/api/captured-linear-slide.forge.js +0 -13
  228. package/examples/api/clevis-pin-joint.forge.js +0 -13
  229. package/examples/api/datum-enclosure.forge.js +0 -16
  230. package/examples/api/hose-barb-port.forge.js +0 -14
  231. package/examples/api/knuckled-hinge-assembly.forge.js +0 -15
  232. package/examples/api/living-hinge-cover.forge.js +0 -14
  233. package/examples/api/pcb-terminal-block.forge.js +0 -22
  234. package/examples/api/pinned-lever-pivot-stack.forge.js +0 -14
  235. package/examples/api/retained-shaft-knob-stack.forge.js +0 -15
  236. package/examples/api/routed-tube-clip.forge.js +0 -15
  237. package/examples/api/seated-bearing-stack.forge.js +0 -30
  238. package/examples/api/snap-latch-cover.forge.js +0 -14
  239. package/examples/api/thumb-screw-clamp.forge.js +0 -15
@@ -1,6 +1,6 @@
1
- import { r as reactExports, j as jsxRuntimeExports } from "./vendor-react-Da3A2QmU.js";
2
- import { cA as initKernel, cB as initSolverWasm } from "./scalar-sampling-budget-CfDiFvh7.js";
3
- import { g as useForgeStore, af as getExternalUrl, ag as getGistId, l as fetchUrlModel, k as fetchGistModel, al as buildShareUrl, B as BrandMark, ah as Viewport } from "./app-bEww1ic4.js";
1
+ import { r as reactExports, j as jsxRuntimeExports } from "./vendor-react-6j1Kke-Y.js";
2
+ import { cB as initKernel, cC as initSolverWasm } from "./scalar-sampling-budget-J5cuzxT1.js";
3
+ import { g as useForgeStore, an as getExternalUrl, ao as getGistId, l as fetchUrlModel, k as fetchGistModel, at as buildShareUrl, B as BrandMark, ap as Viewport } from "./app-T0pDcSX4.js";
4
4
  function EmbedViewer() {
5
5
  const kernelReady = useForgeStore((s) => s.kernelReady);
6
6
  const setKernelReady = useForgeStore((s) => s.setKernelReady);
@@ -1,6 +1,7 @@
1
- import { r as reactExports, j as jsxRuntimeExports, L as Link } from "./vendor-react-Da3A2QmU.js";
2
- import { B as BrandMark } from "./app-bEww1ic4.js";
3
- /* empty css */
1
+ import { r as reactExports, j as jsxRuntimeExports, L as Link } from "./vendor-react-6j1Kke-Y.js";
2
+ import { B as BrandMark } from "./app-T0pDcSX4.js";
3
+ import { L as LEGAL_COPYRIGHT_NOTICE, a as LEGAL_LINKS } from "./legalContent-ZfFGMmi4.js";
4
+ import { u as usePageBackground } from "./landing-proof-driven-DiGqdtWa.js";
4
5
  const LINKS = {
5
6
  glasses: {
6
7
  share: "https://forgecad.io/m/etXaJYSZF4",
@@ -174,6 +175,7 @@ function ProofSection({
174
175
  }
175
176
  const DESKTOP_QUERY = "(min-width: 861px)";
176
177
  function LandingPageProofDriven() {
178
+ usePageBackground("#f3ede4");
177
179
  const [isWide, setIsWide] = reactExports.useState(() => window.matchMedia(DESKTOP_QUERY).matches);
178
180
  reactExports.useEffect(() => {
179
181
  const mql = window.matchMedia(DESKTOP_QUERY);
@@ -181,19 +183,6 @@ function LandingPageProofDriven() {
181
183
  mql.addEventListener("change", onChange);
182
184
  return () => mql.removeEventListener("change", onChange);
183
185
  }, []);
184
- reactExports.useEffect(() => {
185
- const html = document.documentElement;
186
- const body = document.body;
187
- const prevHtml = html.style.background;
188
- const prevBody = body.style.background;
189
- const bg = "#f3ede4";
190
- html.style.background = bg;
191
- body.style.background = bg;
192
- return () => {
193
- html.style.background = prevHtml;
194
- body.style.background = prevBody;
195
- };
196
- }, []);
197
186
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "lpd-root", children: [
198
187
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "lpd-grid-overlay" }),
199
188
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "lpd-topbar", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "lpd-topbar-inner", children: [
@@ -213,15 +202,16 @@ function LandingPageProofDriven() {
213
202
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "lpd-hero-grid", children: [
214
203
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "lpd-hero-copy", children: [
215
204
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
216
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "lpd-eyebrow", children: "Real Models. Real Files." }),
205
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "lpd-eyebrow", children: "AI-Native CAD Workflow" }),
217
206
  /* @__PURE__ */ jsxRuntimeExports.jsxs("h1", { children: [
218
- "Parametric CAD ",
207
+ "AI-driven CAD ",
219
208
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "in JavaScript." })
220
209
  ] }),
221
210
  /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "lpd-hero-lead", children: [
222
- "Write geometry as code. Every model on this page is a real ",
211
+ "Turn prompts, product ideas, and feedback into editable parametric CAD. Every model on this page is a real",
212
+ " ",
223
213
  /* @__PURE__ */ jsxRuntimeExports.jsx("code", { children: ".forge.js" }),
224
- " file you can open, edit, and 3D-print."
214
+ " file an agent can revise, validate, inspect, and export for manufacturing."
225
215
  ] }),
226
216
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "lpd-hero-actions", children: [
227
217
  /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/app", className: "lpd-button lpd-button-primary", children: "Open ForgeCAD" }),
@@ -231,15 +221,15 @@ function LandingPageProofDriven() {
231
221
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "lpd-hero-facts", children: [
232
222
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "lpd-fact", children: [
233
223
  /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { children: "JavaScript" }),
234
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Full language, not a DSL. Loops, functions, npm." })
224
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Full language, not a DSL. Agents can read and repair it." })
235
225
  ] }),
236
226
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "lpd-fact", children: [
237
- /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { children: "Parametric" }),
238
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Every dimension is a live slider." })
227
+ /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { children: "Feedback Loop" }),
228
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Run, render, inspect, change params, and try the next idea." })
239
229
  ] }),
240
230
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "lpd-fact", children: [
241
- /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { children: "Export" }),
242
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "STL, 3MF, STEP ready to print or machine." })
231
+ /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { children: "Manufacturing" }),
232
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "STL, 3MF, STEP, reports, and print checks." })
243
233
  ] })
244
234
  ] })
245
235
  ] }),
@@ -305,12 +295,12 @@ function LandingPageProofDriven() {
305
295
  ] })
306
296
  ] }),
307
297
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "lpd-capability-band", children: [
298
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "AI CAD agent skills" }),
299
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Parallel product idea iterations" }),
300
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Manufacturing feedback and inspection" }),
308
301
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Live parameter sliders" }),
309
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Public embeds" }),
310
302
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Assemblies and connectors" }),
311
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Fillets, shells, bosses" }),
312
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Part library and threads" }),
313
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "SDF and solid modeling in one language" })
303
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "STEP, STL, 3MF, reports" })
314
304
  ] })
315
305
  ] }),
316
306
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "lpd-section-break" }),
@@ -397,9 +387,9 @@ function LandingPageProofDriven() {
397
387
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "lpd-section-break" }),
398
388
  /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "lpd-cli", children: [
399
389
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "lpd-cli-header", children: [
400
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "lpd-eyebrow", children: "Your Terminal, Your Toolchain" }),
401
- /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { children: "Install. Build. Export. Publish." }),
402
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "ForgeCAD runs anywhere Node does. Install the CLI, write a model, and ship it all without leaving the terminal. Works with AI coding agents out of the box." })
390
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "lpd-eyebrow", children: "Agent Feedback Loop" }),
391
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { children: "Generate. Validate. Inspect. Export." }),
392
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "ForgeCAD runs anywhere Node does. Install the CLI, let an AI coding agent edit the model, then use deterministic commands to gather evidence before you manufacture, publish, or fork the next product iteration." })
403
393
  ] }),
404
394
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "lpd-cli-steps", children: [
405
395
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "lpd-cli-step", children: [
@@ -476,12 +466,12 @@ function LandingPageProofDriven() {
476
466
  ] })
477
467
  ] }),
478
468
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "lpd-footer-cta", children: [
479
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "lpd-eyebrow", children: "Start Building" }),
480
- /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { children: "Your geometry, your code, your toolchain." }),
469
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "lpd-eyebrow", children: "Start Iterating" }),
470
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { children: "From product idea to manufacturable CAD loop." }),
481
471
  /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { children: [
482
- "Open the editor, write a ",
472
+ "Open the editor, write or generate a ",
483
473
  /* @__PURE__ */ jsxRuntimeExports.jsx("code", { children: ".forge.js" }),
484
- " file, and take your model from live parameters to manufacturing-ready exports."
474
+ " file, and take your model from AI-authored code to validation evidence and manufacturing-ready exports."
485
475
  ] }),
486
476
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "lpd-hero-actions", children: [
487
477
  /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/app", className: "lpd-button lpd-button-primary", children: "Open ForgeCAD" }),
@@ -494,7 +484,11 @@ function LandingPageProofDriven() {
494
484
  /* @__PURE__ */ jsxRuntimeExports.jsx(BrandMark, { size: 24, decorative: true }),
495
485
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "ForgeCAD" })
496
486
  ] }),
497
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "Code-first parametric CAD for real models." })
487
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "Code-first parametric CAD for real models." }),
488
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "lpd-footer-copy", children: [
489
+ "© ",
490
+ LEGAL_COPYRIGHT_NOTICE
491
+ ] })
498
492
  ] }),
499
493
  /* @__PURE__ */ jsxRuntimeExports.jsxs("nav", { className: "lpd-footer-links", "aria-label": "Footer links", children: [
500
494
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
@@ -512,9 +506,13 @@ function LandingPageProofDriven() {
512
506
  ] }),
513
507
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
514
508
  /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { children: "Community" }),
515
- /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "https://discord.gg/3jMbZtdtp", target: "_blank", rel: "noopener noreferrer", children: "Discord" }),
509
+ /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "https://discord.gg/htJntFkBAv", target: "_blank", rel: "noopener noreferrer", children: "Discord" }),
516
510
  /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "https://x.com/ForgeCAD", target: "_blank", rel: "noopener noreferrer", children: "ForgeCAD X" }),
517
511
  /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "https://x.com/ruben_kostard", target: "_blank", rel: "noopener noreferrer", children: "Ruben X" })
512
+ ] }),
513
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
514
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { children: "Legal" }),
515
+ LEGAL_LINKS.map((link) => /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: link.path, children: link.label }, link.id))
518
516
  ] })
519
517
  ] })
520
518
  ] })
@@ -0,0 +1,39 @@
1
+ import { j as jsxRuntimeExports, L as Link } from "./vendor-react-6j1Kke-Y.js";
2
+ import { B as BrandMark } from "./app-T0pDcSX4.js";
3
+ import { a as LEGAL_LINKS, b as LEGAL_DOCUMENTS } from "./legalContent-ZfFGMmi4.js";
4
+ import { u as usePageBackground } from "./landing-proof-driven-DiGqdtWa.js";
5
+ function LegalPage({ documentId }) {
6
+ const document = LEGAL_DOCUMENTS[documentId];
7
+ usePageBackground("#f3ede4");
8
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "lpd-root legal-root", children: [
9
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "lpd-grid-overlay" }),
10
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "lpd-topbar", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "lpd-topbar-inner", children: [
11
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: "/", className: "lpd-brand", "aria-label": "ForgeCAD home", children: [
12
+ /* @__PURE__ */ jsxRuntimeExports.jsx(BrandMark, { size: 38, decorative: true }),
13
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "ForgeCAD" })
14
+ ] }),
15
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "lpd-topnav", children: [
16
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/docs", className: "lpd-nav-optional", children: "Docs" }),
17
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/pricing", children: "Pricing" }),
18
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/app", className: "lpd-topnav-cta", children: "App" })
19
+ ] })
20
+ ] }) }),
21
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("main", { className: "lpd-shell legal-shell", children: [
22
+ /* @__PURE__ */ jsxRuntimeExports.jsx("nav", { className: "legal-tabs", "aria-label": "Legal pages", children: LEGAL_LINKS.map((link) => /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: link.path, "aria-current": link.id === documentId ? "page" : void 0, children: link.label }, link.id)) }),
23
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("article", { className: "legal-sheet", children: [
24
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("header", { className: "legal-header", children: [
25
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "lpd-eyebrow", children: "Legal" }),
26
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { children: document.title }),
27
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: document.subtitle })
28
+ ] }),
29
+ document.sections.map((section) => /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "legal-section", children: [
30
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { children: section.title }),
31
+ section.body.map((paragraph) => /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: paragraph }, paragraph))
32
+ ] }, section.title))
33
+ ] })
34
+ ] })
35
+ ] });
36
+ }
37
+ export {
38
+ LegalPage
39
+ };
@@ -0,0 +1,91 @@
1
+ .legal-root .legal-shell {
2
+ max-width: 900px;
3
+ padding-top: 48px;
4
+ }
5
+
6
+ .legal-tabs {
7
+ display: flex;
8
+ flex-wrap: wrap;
9
+ gap: 10px;
10
+ margin-bottom: 18px;
11
+ }
12
+
13
+ .legal-tabs a {
14
+ display: inline-flex;
15
+ align-items: center;
16
+ justify-content: center;
17
+ min-height: 38px;
18
+ padding: 8px 14px;
19
+ border: 1px solid var(--line);
20
+ border-radius: 999px;
21
+ color: var(--muted);
22
+ background: rgba(255, 251, 245, 0.64);
23
+ text-decoration: none;
24
+ font-size: 14px;
25
+ font-weight: 600;
26
+ }
27
+
28
+ .legal-tabs a[aria-current="page"] {
29
+ color: #fff;
30
+ background: var(--ink);
31
+ border-color: var(--ink);
32
+ }
33
+
34
+ .legal-sheet {
35
+ padding: 38px;
36
+ border: 1px solid var(--line);
37
+ border-radius: 8px;
38
+ background: rgba(255, 251, 245, 0.9);
39
+ box-shadow: var(--shadow);
40
+ }
41
+
42
+ .legal-header {
43
+ max-width: 720px;
44
+ padding-bottom: 28px;
45
+ border-bottom: 1px solid var(--line);
46
+ }
47
+
48
+ .legal-header h1 {
49
+ margin: 10px 0 12px;
50
+ color: var(--ink);
51
+ font-size: 42px;
52
+ line-height: 1.05;
53
+ letter-spacing: 0;
54
+ }
55
+
56
+ .legal-header p,
57
+ .legal-section p {
58
+ color: var(--muted);
59
+ font-size: 16px;
60
+ line-height: 1.65;
61
+ }
62
+
63
+ .legal-section {
64
+ padding-top: 26px;
65
+ }
66
+
67
+ .legal-section h2 {
68
+ margin-bottom: 8px;
69
+ color: var(--ink);
70
+ font-size: 20px;
71
+ line-height: 1.2;
72
+ letter-spacing: 0;
73
+ }
74
+
75
+ .legal-section p + p {
76
+ margin-top: 10px;
77
+ }
78
+
79
+ @media (max-width: 680px) {
80
+ .legal-root .legal-shell {
81
+ padding: 28px 18px 80px;
82
+ }
83
+
84
+ .legal-sheet {
85
+ padding: 24px 20px;
86
+ }
87
+
88
+ .legal-header h1 {
89
+ font-size: 32px;
90
+ }
91
+ }
@@ -1,7 +1,8 @@
1
- import { f as useNavigate, r as reactExports, j as jsxRuntimeExports, L as Link } from "./vendor-react-Da3A2QmU.js";
2
- import { u as useAuthStore, b as authFetch, B as BrandMark } from "./app-bEww1ic4.js";
1
+ import { f as useNavigate, r as reactExports, j as jsxRuntimeExports, L as Link } from "./vendor-react-6j1Kke-Y.js";
2
+ import { u as useAuthStore, b as authFetch, B as BrandMark } from "./app-T0pDcSX4.js";
3
+ import { L as LEGAL_COPYRIGHT_NOTICE, a as LEGAL_LINKS } from "./legalContent-ZfFGMmi4.js";
3
4
  import { C as COMMERCIAL_USE_CASES } from "./copy-DQcpKfiX.js";
4
- /* empty css */
5
+ import { u as usePageBackground } from "./landing-proof-driven-DiGqdtWa.js";
5
6
  function checkoutIntentPath(interval) {
6
7
  return `/app?checkout=${interval}`;
7
8
  }
@@ -12,7 +13,7 @@ const PRICING_PLANS = [
12
13
  price: "$20",
13
14
  period: "/mo",
14
15
  features: [
15
- "Commercial use allowed",
16
+ "One named commercial user",
16
17
  "Commercial coverage for production exports",
17
18
  "High-quality Blender renders",
18
19
  "GIF & MP4 capture",
@@ -26,7 +27,6 @@ const PRICING_PLANS = [
26
27
  name: "Pro Annual",
27
28
  price: "$199",
28
29
  period: "/yr",
29
- highlight: "Two months free",
30
30
  features: ["Everything in Monthly", "Billed annually ($16.58/mo effective)", "Same self-serve product access"]
31
31
  }
32
32
  ];
@@ -38,6 +38,7 @@ const ENTERPRISE_PLAN = {
38
38
  ctaHref: "mailto:contact@forgecad.io?subject=ForgeCAD%20Enterprise",
39
39
  features: [
40
40
  "Backend and application automation",
41
+ "AI training, evaluation, and RL environment use",
41
42
  "Hosted or embedded ForgeCAD workflows",
42
43
  "Embed ForgeCAD models on your website",
43
44
  "Product-specific integration support",
@@ -63,9 +64,13 @@ const PRICING_FAQS = [
63
64
  question: "When should I upgrade?",
64
65
  answer: `Use Free for personal exploration, learning, evaluation, and open-source work. Choose Pro when ForgeCAD supports ${COMMERCIAL_USE_CASES} work.`
65
66
  },
67
+ {
68
+ question: "Can a team share one Pro subscription?",
69
+ answer: "No. Pro is a named-user subscription for one person using ForgeCAD as a human-operated CAD tool. Each person doing commercial ForgeCAD work needs their own Pro subscription. For shared seats, automation, embedded workflows, or team management, contact Enterprise."
70
+ },
66
71
  {
67
72
  question: "When do I need Enterprise?",
68
- answer: "Choose Enterprise when your backend, hosted product, embedded workflow, or application integration calls ForgeCAD automatically on behalf of users, customers, jobs, scripts, agents, or external systems."
73
+ answer: "Choose Enterprise when your backend, hosted product, embedded workflow, AI training, evaluation, benchmark, RL environment, or application integration calls ForgeCAD automatically on behalf of users, customers, jobs, scripts, agents, models, or external systems."
69
74
  },
70
75
  {
71
76
  question: "Are exports free?",
@@ -90,6 +95,7 @@ function pricingButtonState(args) {
90
95
  return { disabled: false, label: "Get started" };
91
96
  }
92
97
  function PricingPage() {
98
+ usePageBackground("#f3ede4");
93
99
  const user = useAuthStore((s) => s.user);
94
100
  const loading = useAuthStore((s) => s.loading);
95
101
  const checkSession = useAuthStore((s) => s.checkSession);
@@ -123,19 +129,6 @@ function PricingPage() {
123
129
  cancelled = true;
124
130
  };
125
131
  }, [user]);
126
- reactExports.useEffect(() => {
127
- const html = document.documentElement;
128
- const body = document.body;
129
- const prevHtml = html.style.background;
130
- const prevBody = body.style.background;
131
- const bg = "#f3ede4";
132
- html.style.background = bg;
133
- body.style.background = bg;
134
- return () => {
135
- html.style.background = prevHtml;
136
- body.style.background = prevBody;
137
- };
138
- }, []);
139
132
  const currentInterval = isPro ? subscription == null ? void 0 : subscription.interval : void 0;
140
133
  const planLabel = pricingPlanLabel(isPro, currentInterval);
141
134
  async function handleCheckout(interval) {
@@ -240,6 +233,13 @@ function PricingPage() {
240
233
  /* @__PURE__ */ jsxRuntimeExports.jsx("summary", { children: faq.question }),
241
234
  /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: faq.answer })
242
235
  ] }, faq.question)) })
236
+ ] }),
237
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("footer", { className: "pricing-legal-links", "aria-label": "Legal links", children: [
238
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [
239
+ "© ",
240
+ LEGAL_COPYRIGHT_NOTICE
241
+ ] }),
242
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: LEGAL_LINKS.map((link) => /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: link.path, children: link.label }, link.id)) })
243
243
  ] })
244
244
  ] })
245
245
  ] });
@@ -203,6 +203,31 @@
203
203
  line-height: 1.55;
204
204
  }
205
205
 
206
+ .pricing-root .pricing-legal-links {
207
+ display: flex;
208
+ flex-wrap: wrap;
209
+ justify-content: center;
210
+ gap: 10px 18px;
211
+ margin-top: 34px;
212
+ color: var(--muted);
213
+ font-size: 13px;
214
+ }
215
+
216
+ .pricing-root .pricing-legal-links div {
217
+ display: flex;
218
+ gap: 18px;
219
+ }
220
+
221
+ .pricing-root .pricing-legal-links a {
222
+ color: inherit;
223
+ text-decoration: none;
224
+ font-weight: 600;
225
+ }
226
+
227
+ .pricing-root .pricing-legal-links a:hover {
228
+ color: var(--ink);
229
+ }
230
+
206
231
  @media (max-width: 1160px) {
207
232
  .pricing-root .pricing-plans {
208
233
  grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -1,5 +1,5 @@
1
- import { r as reactExports, j as jsxRuntimeExports, L as Link } from "./vendor-react-Da3A2QmU.js";
2
- import { u as useAuthStore, b as authFetch, s as storageUsagePercent, f as formatStorageBytes } from "./app-bEww1ic4.js";
1
+ import { r as reactExports, j as jsxRuntimeExports, L as Link } from "./vendor-react-6j1Kke-Y.js";
2
+ import { u as useAuthStore, b as authFetch, s as storageUsagePercent, f as formatStorageBytes } from "./app-T0pDcSX4.js";
3
3
  import { C as COMMERCIAL_USE_CASES, P as PRO_STORAGE_UPGRADE_COPY } from "./copy-DQcpKfiX.js";
4
4
  function timeAgo(dateStr) {
5
5
  const ms = Date.now() - new Date(dateStr).getTime();