forgecad 0.9.13 → 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 (216) hide show
  1. package/LICENSE +6 -4
  2. package/README.md +8 -4
  3. package/dist/assets/{AdminPage-DramHHDf.js → AdminPage-CDyGUinA.js} +2 -2
  4. package/dist/assets/{BenchmarkPage-Bjgkh5m9.js → BenchmarkPage-DfPMY_-d.js} +4 -15
  5. package/dist/assets/{BlogPage-n_HGP3Qm.js → BlogPage-kF0fkdJT.js} +2 -2
  6. package/dist/assets/{DocsPage-WCIkPmzC.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-DEZKqdfW.js → EmbedViewer-C77B-TrF.js} +3 -3
  10. package/dist/assets/{LandingPageProofDriven-CeRIctuj.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-rIRa8p4Y.js → PricingPage-zWXkvlwl.js} +19 -19
  15. package/dist/assets/{SettingsPage-BqCUvEXM.js → SettingsPage-Bz0of4KQ.js} +2 -2
  16. package/dist/assets/app-CE3sYcV7.css +3890 -0
  17. package/dist/assets/{app-BUZqJvSO.js → app-D3kDkggg.js} +2305 -960
  18. package/dist/assets/cli/{render-lhGxj50Y.js → render-DSY3mMQa.js} +423 -30
  19. package/dist/assets/{constructionHistoryWorker-ipD1jcIv.js → constructionHistoryWorker-gpDo-uH2.js} +927 -243
  20. package/dist/assets/{evalWorker-CHXSe_-u.js → evalWorker-CU0Ke6DP.js} +7799 -4163
  21. package/dist/assets/{forgecad_geometry-BVnIeXMG.js → forgecad_geometry-Dgceylq9.js} +43 -1
  22. package/dist/assets/{forgecad_geometry_bg-DufhhCBV.wasm → 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-D1LZIHqn.js → manifold-BRI5prcH.js} +1 -1
  29. package/dist/assets/{manifold-C2fwoTgd.js → manifold-C-3h2M7p.js} +2 -2
  30. package/dist/assets/{manifold-BTkzxi9V.js → manifold-DNkrUWpA.js} +1 -1
  31. package/dist/assets/{reportWorker-Cq1qGmg0.js → reportWorker-CdBz5bNg.js} +7537 -10856
  32. package/dist/assets/{scalar-sampling-budget-D9Qv_UlJ.js → scalar-sampling-budget-wJF98aY9.js} +6943 -4345
  33. package/dist/assets/{scanProxyWorker-Bs2TDgLw.js → scanProxyWorker-B-9VbLIs.js} +32 -1
  34. package/dist/assets/{renderSceneState-Dr0xPq1A.js → targets-B9sGB5nB.js} +27 -1
  35. package/dist/assets/{vendor-react-Da3A2QmU.js → vendor-react-6j1Kke-Y.js} +6 -5
  36. package/dist/cli/render.html +1 -1
  37. package/dist/docs/index.html +2 -2
  38. package/dist/docs-raw/AI/ai-native-cad.md +50 -0
  39. package/dist/docs-raw/AI/usage.md +9 -17
  40. package/dist/docs-raw/CLI.md +71 -21
  41. package/dist/docs-raw/component-model.md +27 -11
  42. package/dist/docs-raw/generated/assembly.md +301 -212
  43. package/dist/docs-raw/generated/concepts.md +238 -240
  44. package/dist/docs-raw/generated/core.md +283 -6
  45. package/dist/docs-raw/generated/curves.md +274 -361
  46. package/dist/docs-raw/generated/lib.md +7 -1
  47. package/dist/docs-raw/generated/output.md +19 -4
  48. package/dist/docs-raw/generated/runtime-names.md +41 -0
  49. package/dist/docs-raw/generated/sdf.md +31 -0
  50. package/dist/docs-raw/generated/sheet-metal.md +9 -0
  51. package/dist/docs-raw/generated/sketch.md +44 -1
  52. package/dist/docs-raw/generated/viewport.md +14 -6
  53. package/dist/docs-raw/guides/coordinate-system.md +20 -16
  54. package/dist/docs-raw/guides/geometry-conventions.md +2 -2
  55. package/dist/docs-raw/guides/inspection-bundles.md +2 -1
  56. package/dist/docs-raw/guides/joint-design.md +24 -0
  57. package/dist/docs-raw/guides/positioning.md +13 -3
  58. package/dist/docs-raw/legal/privacy.md +63 -0
  59. package/dist/docs-raw/legal/software-license.md +55 -0
  60. package/dist/docs-raw/legal/terms.md +87 -0
  61. package/dist/docs-raw/skills/forgecad-3d-reconstruction.md +3 -3
  62. package/dist/docs-raw/skills/forgecad-blockout-model.md +1 -1
  63. package/dist/docs-raw/skills/forgecad-component-model.md +11 -2
  64. package/dist/docs-raw/skills/forgecad-high-level-spec.md +1 -1
  65. package/dist/docs-raw/skills/forgecad-image-replicator.md +8 -8
  66. package/dist/docs-raw/skills/forgecad-lld.md +1 -1
  67. package/dist/docs-raw/skills/forgecad-make-a-model.md +4 -4
  68. package/dist/docs-raw/skills/forgecad-model-grader.md +2 -2
  69. package/dist/docs-raw/skills/forgecad-prepare-prompt.md +2 -2
  70. package/dist/docs-raw/skills/forgecad-project.md +1 -1
  71. package/dist/docs-raw/skills/forgecad-reconstruction-benchmark.md +4 -4
  72. package/dist/docs-raw/skills/forgecad-render-inspect.md +4 -2
  73. package/dist/docs-raw/skills/forgecad-visual-spec.md +1 -1
  74. package/dist/docs-raw/skills/forgecad.md +4 -3
  75. package/dist/index.html +40 -12
  76. package/dist/llms.txt +8 -0
  77. package/dist/site.webmanifest +1 -1
  78. package/dist/sitemap.xml +49 -13
  79. package/dist-cli/{check-compiler-LOXCPEOI.js → check-compiler-SDX5QIXI.js} +1 -2
  80. package/dist-cli/{check-query-propagation-BAKNVWXR.js → check-query-propagation-EAYEFT77.js} +1 -2
  81. package/dist-cli/{chunk-RY43WF46.js → chunk-N4O47JLF.js} +13772 -9938
  82. package/dist-cli/forgecad.js +2387 -899
  83. package/dist-cli/{forgecad_geometry-GYVNKPIE.js → forgecad_geometry-QOQIIP53.js} +42 -1
  84. package/dist-cli/forgecad_geometry_bg.wasm +0 -0
  85. package/dist-cli/{solver-46FFSK2U.js → solver-OK4HECRH.js} +0 -1
  86. package/dist-skill/CONTEXT.md +1120 -724
  87. package/dist-skill/SKILL.md +3 -2
  88. package/dist-skill/docs/API/core/concepts.md +64 -1
  89. package/dist-skill/docs/CLI.md +71 -21
  90. package/dist-skill/docs/generated/assembly.md +277 -229
  91. package/dist-skill/docs/generated/core.md +283 -6
  92. package/dist-skill/docs/generated/curves.md +272 -362
  93. package/dist-skill/docs/generated/lib.md +7 -1
  94. package/dist-skill/docs/generated/output.md +19 -4
  95. package/dist-skill/docs/generated/runtime-names.md +41 -0
  96. package/dist-skill/docs/generated/sdf.md +31 -0
  97. package/dist-skill/docs/generated/sheet-metal.md +9 -0
  98. package/dist-skill/docs/generated/sketch.md +44 -2
  99. package/dist-skill/docs/generated/viewport.md +5 -90
  100. package/dist-skill/docs/guides/coordinate-system.md +20 -16
  101. package/dist-skill/docs/guides/geometry-conventions.md +2 -2
  102. package/dist-skill/docs/guides/inspection-bundles.md +2 -1
  103. package/dist-skill/docs/guides/joint-design.md +24 -0
  104. package/dist-skill/docs/guides/positioning.md +13 -3
  105. package/dist-skill/library/forgecad-3d-reconstruction/SKILL.md +2 -2
  106. package/dist-skill/library/forgecad-component-model/SKILL.md +10 -1
  107. package/dist-skill/library/forgecad-image-replicator/SKILL.md +6 -6
  108. package/dist-skill/library/forgecad-image-replicator/scripts/compare_images.py +166 -0
  109. package/dist-skill/library/forgecad-make-a-model/SKILL.md +3 -3
  110. package/dist-skill/library/forgecad-model-grader/SKILL.md +1 -1
  111. package/dist-skill/library/forgecad-prepare-prompt/SKILL.md +1 -1
  112. package/dist-skill/library/forgecad-reconstruction-benchmark/SKILL.md +3 -3
  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 -18
  135. package/dist/assets/EditorApp-CP9Za6tm.js +0 -13630
  136. package/dist/assets/app-CsHnaBWt.css +0 -1789
  137. package/dist/docs-raw/API/README.md +0 -16
  138. package/dist/docs-raw/API/core/concepts.md +0 -118
  139. package/dist/docs-raw/INDEX.md +0 -138
  140. package/dist/docs-raw/RELEASING.md +0 -87
  141. package/dist/docs-raw/agent-native-api.md +0 -27
  142. package/dist/docs-raw/beta-deployment.md +0 -304
  143. package/dist/docs-raw/beta-operations.md +0 -325
  144. package/dist/docs-raw/blueprint-first.md +0 -145
  145. package/dist/docs-raw/cli-monetization.md +0 -112
  146. package/dist/docs-raw/coding-best-practices.md +0 -120
  147. package/dist/docs-raw/coding.md +0 -340
  148. package/dist/docs-raw/deployment.md +0 -374
  149. package/dist/docs-raw/guides/skill-maintenance.md +0 -161
  150. package/dist/docs-raw/guides/surface-members.md +0 -82
  151. package/dist/docs-raw/internals/backend-vocabulary.md +0 -35
  152. package/dist/docs-raw/internals/compiler.md +0 -307
  153. package/dist/docs-raw/internals/constraint-solver-quality.md +0 -161
  154. package/dist/docs-raw/internals/constraint-solver.md +0 -176
  155. package/dist/docs-raw/internals/shape-from-slices.md +0 -152
  156. package/dist/docs-raw/internals/sketch-2d-pipeline.md +0 -108
  157. package/dist/docs-raw/platform/admin.md +0 -45
  158. package/dist/docs-raw/platform/architecture.md +0 -82
  159. package/dist/docs-raw/platform/auth.md +0 -139
  160. package/dist/docs-raw/platform/email.md +0 -67
  161. package/dist/docs-raw/platform/google-oauth-setup.md +0 -88
  162. package/dist/docs-raw/platform/observability.md +0 -197
  163. package/dist/docs-raw/platform/projects.md +0 -111
  164. package/dist/docs-raw/platform/sharing.md +0 -90
  165. package/dist/docs-raw/product/README.md +0 -39
  166. package/dist/docs-raw/product/api-as-product-language.md +0 -13
  167. package/dist/docs-raw/product/business-model.md +0 -15
  168. package/dist/docs-raw/product/competitive-positioning.md +0 -17
  169. package/dist/docs-raw/product/creative-manufacturing.md +0 -15
  170. package/dist/docs-raw/product/founder-story.md +0 -11
  171. package/dist/docs-raw/product/manufacturing-workflows.md +0 -15
  172. package/dist/docs-raw/product/onboarding-first-experience.md +0 -256
  173. package/dist/docs-raw/product/product-loop.md +0 -17
  174. package/dist/docs-raw/product/strategic-decisions.md +0 -22
  175. package/dist/docs-raw/product/user-outreach-email-templates.md +0 -161
  176. package/dist/docs-raw/product/user-segments.md +0 -15
  177. package/dist/docs-raw/product/vision.md +0 -26
  178. package/dist/docs-raw/rl-environments.md +0 -508
  179. package/dist/docs-raw/runbook.md +0 -611
  180. package/dist-cli/check-compiler-LOXCPEOI.js.map +0 -1
  181. package/dist-cli/check-query-propagation-BAKNVWXR.js.map +0 -1
  182. package/dist-cli/chunk-RY43WF46.js.map +0 -1
  183. package/dist-cli/forgecad.js.map +0 -1
  184. package/dist-cli/forgecad_geometry-GYVNKPIE.js.map +0 -1
  185. package/dist-cli/solver-46FFSK2U.js.map +0 -1
  186. package/dist-skill/SKILL-dev.md +0 -145
  187. package/dist-skill/docs-dev/API/core/concepts.md +0 -118
  188. package/dist-skill/docs-dev/CLI.md +0 -647
  189. package/dist-skill/docs-dev/agent-native-api.md +0 -27
  190. package/dist-skill/docs-dev/blueprint-first.md +0 -145
  191. package/dist-skill/docs-dev/coding-best-practices.md +0 -120
  192. package/dist-skill/docs-dev/coding.md +0 -340
  193. package/dist-skill/docs-dev/component-model.md +0 -164
  194. package/dist-skill/docs-dev/generated/assembly.md +0 -794
  195. package/dist-skill/docs-dev/generated/core.md +0 -2117
  196. package/dist-skill/docs-dev/generated/curves.md +0 -2583
  197. package/dist-skill/docs-dev/generated/lib.md +0 -169
  198. package/dist-skill/docs-dev/generated/output.md +0 -247
  199. package/dist-skill/docs-dev/generated/sdf.md +0 -446
  200. package/dist-skill/docs-dev/generated/sheet-metal.md +0 -504
  201. package/dist-skill/docs-dev/generated/sketch.md +0 -1811
  202. package/dist-skill/docs-dev/generated/viewport.md +0 -585
  203. package/dist-skill/docs-dev/generated/wood.md +0 -108
  204. package/dist-skill/docs-dev/guides/coordinate-system.md +0 -46
  205. package/dist-skill/docs-dev/guides/geometry-conventions.md +0 -52
  206. package/dist-skill/docs-dev/guides/inspection-bundles.md +0 -485
  207. package/dist-skill/docs-dev/guides/joint-design.md +0 -78
  208. package/dist-skill/docs-dev/guides/modeling-recipes.md +0 -78
  209. package/dist-skill/docs-dev/guides/positioning.md +0 -161
  210. package/dist-skill/docs-dev/guides/skill-maintenance.md +0 -161
  211. package/dist-skill/docs-dev/internals/backend-vocabulary.md +0 -35
  212. package/dist-skill/docs-dev/internals/compiler.md +0 -307
  213. package/dist-skill/docs-dev/internals/constraint-solver-quality.md +0 -161
  214. package/dist-skill/docs-dev/internals/constraint-solver.md +0 -176
  215. package/dist-skill/docs-dev/internals/sketch-2d-pipeline.md +0 -108
  216. 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-D9Qv_UlJ.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-BUZqJvSO.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-BUZqJvSO.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-BUZqJvSO.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-BUZqJvSO.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();