forgecad 0.9.14 → 0.9.15

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 (219) hide show
  1. package/LICENSE +6 -4
  2. package/README.md +8 -4
  3. package/dist/assets/{AdminPage-eWGs2K6H.js → AdminPage-CDyGUinA.js} +2 -2
  4. package/dist/assets/{BenchmarkPage-CTrLKfpo.js → BenchmarkPage-DfPMY_-d.js} +4 -15
  5. package/dist/assets/{BlogPage-5nPesyds.js → BlogPage-kF0fkdJT.js} +2 -2
  6. package/dist/assets/{DocsPage-C4Y3nbYc.js → DocsPage-B954L3YN.js} +9 -3
  7. package/dist/assets/EditorApp-Beb-IZ0y.js +14014 -0
  8. package/dist/assets/{EditorApp-BAnckbsk.css → EditorApp-CuDLxKqL.css} +698 -0
  9. package/dist/assets/{EmbedViewer-C8fB4n5U.js → EmbedViewer-C77B-TrF.js} +3 -3
  10. package/dist/assets/{LandingPageProofDriven-jSz0LaMM.js → LandingPageProofDriven-Cr6fXMDj.js} +35 -37
  11. package/dist/assets/LegalPage-BRlScr9A.css +91 -0
  12. package/dist/assets/LegalPage-Dzklqmmg.js +39 -0
  13. package/dist/assets/{PricingPage-BMedqFef.css → PricingPage-BPF6HKyO.css} +25 -0
  14. package/dist/assets/{PricingPage-B83B90zh.js → PricingPage-zWXkvlwl.js} +19 -19
  15. package/dist/assets/{SettingsPage-DY889pcu.js → SettingsPage-Bz0of4KQ.js} +2 -2
  16. package/dist/assets/app-CE3sYcV7.css +3890 -0
  17. package/dist/assets/{app-bEww1ic4.js → app-D3kDkggg.js} +2293 -946
  18. package/dist/assets/cli/{render-Cho2uKG_.js → render-DSY3mMQa.js} +337 -7
  19. package/dist/assets/{constructionHistoryWorker-HYwzJY4m.js → constructionHistoryWorker-gpDo-uH2.js} +927 -243
  20. package/dist/assets/{evalWorker-CjQwJSE-.js → evalWorker-CU0Ke6DP.js} +7800 -4164
  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-COyp8XXA.js} +927 -243
  24. package/dist/assets/{javascript-70-4uGcz.js → javascript-1kQXfVaz.js} +1 -1
  25. package/dist/assets/landing-proof-driven-DiGqdtWa.js +18 -0
  26. package/dist/assets/{landing-proof-driven-oFYW6mjz.css → landing-proof-driven-ORyigZ6p.css} +13 -7
  27. package/dist/assets/legalContent-ZfFGMmi4.js +251 -0
  28. package/dist/assets/{manifold-CG9Fokx-.js → manifold-BRI5prcH.js} +1 -1
  29. package/dist/assets/{manifold-uRzgk5O8.js → manifold-C-3h2M7p.js} +2 -2
  30. package/dist/assets/{manifold-rmfAcdwF.js → manifold-DNkrUWpA.js} +1 -1
  31. package/dist/assets/{reportWorker-4cW_ZpoS.js → reportWorker-CdBz5bNg.js} +7538 -10857
  32. package/dist/assets/{scalar-sampling-budget-CfDiFvh7.js → scalar-sampling-budget-wJF98aY9.js} +6935 -4331
  33. package/dist/assets/{scanProxyWorker-Bs2TDgLw.js → scanProxyWorker-B-9VbLIs.js} +32 -1
  34. package/dist/assets/{solver-DuJAO8S6.js → solver-BZ9LPTHs.js} +1 -1
  35. package/dist/assets/solver_bg-DAHZJ_rw.wasm +0 -0
  36. package/dist/assets/{targets-D6PWsv6X.js → targets-B9sGB5nB.js} +1 -1
  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 +3 -12
  42. package/dist/docs-raw/CLI.md +30 -10
  43. package/dist/docs-raw/component-model.md +27 -11
  44. package/dist/docs-raw/generated/assembly.md +301 -212
  45. package/dist/docs-raw/generated/concepts.md +235 -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 +7 -1
  49. package/dist/docs-raw/generated/output.md +19 -4
  50. package/dist/docs-raw/generated/runtime-names.md +41 -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 +1 -1
  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 +1 -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/index.html +40 -12
  78. package/dist/llms.txt +8 -0
  79. package/dist/site.webmanifest +1 -1
  80. package/dist/sitemap.xml +49 -13
  81. package/dist-cli/{check-compiler-U5SOPN7X.js → check-compiler-SDX5QIXI.js} +1 -2
  82. package/dist-cli/{check-query-propagation-XOKNSSYU.js → check-query-propagation-EAYEFT77.js} +1 -2
  83. package/dist-cli/{chunk-EXWGNL6K.js → chunk-N4O47JLF.js} +12540 -9046
  84. package/dist-cli/forgecad.js +1786 -679
  85. package/dist-cli/{forgecad_geometry-GYVNKPIE.js → forgecad_geometry-QOQIIP53.js} +42 -1
  86. package/dist-cli/forgecad_geometry_bg.wasm +0 -0
  87. package/dist-cli/{solver-46FFSK2U.js → solver-OK4HECRH.js} +0 -1
  88. package/dist-cli/solver_bg.wasm +0 -0
  89. package/dist-skill/CONTEXT.md +1117 -721
  90. package/dist-skill/SKILL.md +3 -2
  91. package/dist-skill/docs/API/core/concepts.md +64 -1
  92. package/dist-skill/docs/CLI.md +30 -10
  93. package/dist-skill/docs/generated/assembly.md +277 -229
  94. package/dist-skill/docs/generated/core.md +283 -6
  95. package/dist-skill/docs/generated/curves.md +272 -362
  96. package/dist-skill/docs/generated/lib.md +7 -1
  97. package/dist-skill/docs/generated/output.md +19 -4
  98. package/dist-skill/docs/generated/runtime-names.md +41 -0
  99. package/dist-skill/docs/generated/sdf.md +31 -0
  100. package/dist-skill/docs/generated/sheet-metal.md +9 -0
  101. package/dist-skill/docs/generated/sketch.md +44 -2
  102. package/dist-skill/docs/generated/viewport.md +2 -87
  103. package/dist-skill/docs/guides/coordinate-system.md +20 -16
  104. package/dist-skill/docs/guides/geometry-conventions.md +2 -2
  105. package/dist-skill/docs/guides/inspection-bundles.md +2 -1
  106. package/dist-skill/docs/guides/joint-design.md +24 -0
  107. package/dist-skill/docs/guides/positioning.md +13 -3
  108. package/dist-skill/library/forgecad-component-model/SKILL.md +10 -1
  109. package/dist-skill/library/forgecad-image-replicator/SKILL.md +6 -6
  110. package/dist-skill/library/forgecad-image-replicator/scripts/compare_images.py +166 -0
  111. package/dist-skill/library/forgecad-model-grader/SKILL.md +1 -1
  112. package/dist-skill/library/forgecad-prepare-prompt/SKILL.md +1 -1
  113. package/dist-skill/library/forgecad-render-inspect/SKILL.md +3 -1
  114. package/examples/api/assembly-kinematics-foundation.forge.js +65 -0
  115. package/examples/api/assembly-kinematics-four-bar.forge.js +115 -0
  116. package/examples/api/assembly-kinematics-limb.forge.js +116 -0
  117. package/examples/api/connector-frame-rig-chain.forge.js +102 -0
  118. package/examples/api/exact-sheet-shell-assembly.forge.js +0 -2
  119. package/examples/api/exact-surface-studio.forge.js +6 -8
  120. package/examples/api/helix-basics.forge.js +6 -6
  121. package/examples/api/lean-foundations/README.md +12 -0
  122. package/examples/api/lean-foundations/curve-blend-exact.forge.js +22 -0
  123. package/examples/api/lean-foundations/curve-fit-interpolation.forge.js +18 -0
  124. package/examples/api/lean-foundations/curve-helix-canonicalization.forge.js +27 -0
  125. package/examples/api/lean-foundations/curve-route-canonicalization.forge.js +16 -0
  126. package/examples/api/lean-foundations/curve-trim-reverse.forge.js +24 -0
  127. package/examples/api/lean-foundations/exact-curve-arc.forge.js +36 -0
  128. package/examples/api/mixed-edge-finishes-proof.forge.js +8 -11
  129. package/examples/api/route3d-elbow.forge.js +68 -0
  130. package/examples/api/transition-curves.forge.js +44 -15
  131. package/examples/api/y-blend-corner-showcase.forge.js +0 -2
  132. package/examples/generative/coral-vase.forge.js +1 -1
  133. package/examples/nurbs-tube.forge.js +1 -1
  134. package/package.json +14 -13
  135. package/dist/assets/EditorApp-lXv53A1m.js +0 -13610
  136. package/dist/assets/app-CsHnaBWt.css +0 -1789
  137. package/dist/assets/forgecad_geometry_bg-C5_E9Oa9.wasm +0 -0
  138. package/dist/assets/solver_bg-CWvv4lnN.wasm +0 -0
  139. package/dist/docs-raw/API/README.md +0 -16
  140. package/dist/docs-raw/API/core/concepts.md +0 -118
  141. package/dist/docs-raw/INDEX.md +0 -138
  142. package/dist/docs-raw/RELEASING.md +0 -87
  143. package/dist/docs-raw/agent-native-api.md +0 -27
  144. package/dist/docs-raw/beta-deployment.md +0 -304
  145. package/dist/docs-raw/beta-operations.md +0 -325
  146. package/dist/docs-raw/blueprint-first.md +0 -145
  147. package/dist/docs-raw/cli-monetization.md +0 -112
  148. package/dist/docs-raw/coding-best-practices.md +0 -120
  149. package/dist/docs-raw/coding.md +0 -340
  150. package/dist/docs-raw/deployment.md +0 -374
  151. package/dist/docs-raw/guides/skill-maintenance.md +0 -161
  152. package/dist/docs-raw/guides/surface-members.md +0 -82
  153. package/dist/docs-raw/harbor-cli.md +0 -854
  154. package/dist/docs-raw/internals/backend-vocabulary.md +0 -35
  155. package/dist/docs-raw/internals/compiler.md +0 -307
  156. package/dist/docs-raw/internals/constraint-solver-quality.md +0 -161
  157. package/dist/docs-raw/internals/constraint-solver.md +0 -176
  158. package/dist/docs-raw/internals/shape-from-slices.md +0 -152
  159. package/dist/docs-raw/internals/sketch-2d-pipeline.md +0 -108
  160. package/dist/docs-raw/platform/admin.md +0 -45
  161. package/dist/docs-raw/platform/architecture.md +0 -82
  162. package/dist/docs-raw/platform/auth.md +0 -139
  163. package/dist/docs-raw/platform/email.md +0 -67
  164. package/dist/docs-raw/platform/google-oauth-setup.md +0 -88
  165. package/dist/docs-raw/platform/observability.md +0 -197
  166. package/dist/docs-raw/platform/projects.md +0 -111
  167. package/dist/docs-raw/platform/sharing.md +0 -90
  168. package/dist/docs-raw/product/README.md +0 -39
  169. package/dist/docs-raw/product/api-as-product-language.md +0 -13
  170. package/dist/docs-raw/product/business-model.md +0 -15
  171. package/dist/docs-raw/product/competitive-positioning.md +0 -17
  172. package/dist/docs-raw/product/creative-manufacturing.md +0 -15
  173. package/dist/docs-raw/product/founder-story.md +0 -11
  174. package/dist/docs-raw/product/manufacturing-workflows.md +0 -15
  175. package/dist/docs-raw/product/onboarding-first-experience.md +0 -256
  176. package/dist/docs-raw/product/product-loop.md +0 -17
  177. package/dist/docs-raw/product/strategic-decisions.md +0 -22
  178. package/dist/docs-raw/product/user-outreach-email-templates.md +0 -161
  179. package/dist/docs-raw/product/user-segments.md +0 -15
  180. package/dist/docs-raw/product/vision.md +0 -26
  181. package/dist/docs-raw/rl-environments.md +0 -350
  182. package/dist/docs-raw/runbook.md +0 -611
  183. package/dist-cli/check-compiler-U5SOPN7X.js.map +0 -1
  184. package/dist-cli/check-query-propagation-XOKNSSYU.js.map +0 -1
  185. package/dist-cli/chunk-EXWGNL6K.js.map +0 -1
  186. package/dist-cli/forgecad.js.map +0 -1
  187. package/dist-cli/forgecad_geometry-GYVNKPIE.js.map +0 -1
  188. package/dist-cli/solver-46FFSK2U.js.map +0 -1
  189. package/dist-skill/SKILL-dev.md +0 -145
  190. package/dist-skill/docs-dev/API/core/concepts.md +0 -118
  191. package/dist-skill/docs-dev/CLI.md +0 -677
  192. package/dist-skill/docs-dev/agent-native-api.md +0 -27
  193. package/dist-skill/docs-dev/blueprint-first.md +0 -145
  194. package/dist-skill/docs-dev/coding-best-practices.md +0 -120
  195. package/dist-skill/docs-dev/coding.md +0 -340
  196. package/dist-skill/docs-dev/component-model.md +0 -164
  197. package/dist-skill/docs-dev/generated/assembly.md +0 -794
  198. package/dist-skill/docs-dev/generated/core.md +0 -2117
  199. package/dist-skill/docs-dev/generated/curves.md +0 -2583
  200. package/dist-skill/docs-dev/generated/lib.md +0 -169
  201. package/dist-skill/docs-dev/generated/output.md +0 -247
  202. package/dist-skill/docs-dev/generated/sdf.md +0 -446
  203. package/dist-skill/docs-dev/generated/sheet-metal.md +0 -504
  204. package/dist-skill/docs-dev/generated/sketch.md +0 -1811
  205. package/dist-skill/docs-dev/generated/viewport.md +0 -585
  206. package/dist-skill/docs-dev/generated/wood.md +0 -108
  207. package/dist-skill/docs-dev/guides/coordinate-system.md +0 -46
  208. package/dist-skill/docs-dev/guides/geometry-conventions.md +0 -52
  209. package/dist-skill/docs-dev/guides/inspection-bundles.md +0 -485
  210. package/dist-skill/docs-dev/guides/joint-design.md +0 -78
  211. package/dist-skill/docs-dev/guides/modeling-recipes.md +0 -78
  212. package/dist-skill/docs-dev/guides/positioning.md +0 -161
  213. package/dist-skill/docs-dev/guides/skill-maintenance.md +0 -161
  214. package/dist-skill/docs-dev/internals/backend-vocabulary.md +0 -35
  215. package/dist-skill/docs-dev/internals/compiler.md +0 -307
  216. package/dist-skill/docs-dev/internals/constraint-solver-quality.md +0 -161
  217. package/dist-skill/docs-dev/internals/constraint-solver.md +0 -176
  218. package/dist-skill/docs-dev/internals/sketch-2d-pipeline.md +0 -108
  219. package/dist-skill/library/forgecad-image-replicator/scripts/compare_images.mjs +0 -289
@@ -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-wJF98aY9.js";
3
+ import { g as useForgeStore, ai as getExternalUrl, aj as getGistId, l as fetchUrlModel, k as fetchGistModel, ao as buildShareUrl, B as BrandMark, ak as Viewport } from "./app-D3kDkggg.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-D3kDkggg.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: [
@@ -515,6 +509,10 @@ function LandingPageProofDriven() {
515
509
  /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "https://discord.gg/3jMbZtdtp", 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,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
+ }
@@ -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-D3kDkggg.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
+ };
@@ -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,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-D3kDkggg.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
  ] });
@@ -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-D3kDkggg.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();