forgecad 0.6.3 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/README.md +2 -11
  2. package/dist/assets/{AdminPage-CeqCUUgu.js → AdminPage-DAu1C1ST.js} +250 -151
  3. package/dist/assets/{BlogPage-P_AJP0v9.js → BlogPage-CJEXL_zJ.js} +94 -70
  4. package/dist/assets/{DocsPage-CKRV2iq2.js → DocsPage-Gc_BCdqC.js} +269 -143
  5. package/dist/assets/EditorApp-D9bJvtf7.js +11338 -0
  6. package/dist/assets/{EditorApp-CnC2k4cW.css → EditorApp-DG1-oUSV.css} +459 -87
  7. package/dist/assets/{EmbedViewer-DBlzmQ5i.js → EmbedViewer-CEO8XbV8.js} +2 -4
  8. package/dist/assets/LandingPage-CdCuEOdC.js +451 -0
  9. package/dist/assets/PricingPage-BSrxu6d7.js +232 -0
  10. package/dist/assets/{SettingsPage-BqCh9JcC.js → SettingsPage-FUCSIRq6.js} +129 -5
  11. package/dist/assets/{evalWorker-Ql-aKwLA.js → evalWorker-KoR0SNKq.js} +6770 -2914
  12. package/dist/assets/{index-2hfs_ub0.css → index-CyVd1D4D.css} +227 -53
  13. package/dist/assets/{Viewport-CoB46f5R.js → index-wTEK39at.js} +31385 -6439
  14. package/dist/assets/{javascript-DCxGoE5Y.js → javascript-DAl8Gmyo.js} +1 -1
  15. package/dist/assets/{manifold-CqNMHHKO.js → manifold-B1sGWdYk.js} +4 -3
  16. package/dist/assets/{manifold-Cce9wRFz.js → manifold-D7o0N50J.js} +1 -1
  17. package/dist/assets/{manifold-D6BeHIOo.js → manifold-G5sBaXzi.js} +1 -1
  18. package/dist/assets/{reportWorker-sFEFonXf.js → reportWorker-DYcRHhv9.js} +6798 -3341
  19. package/dist/assets/{vendor-react-Dt7-aaJH.js → vendor-react-CG3i_wp0.js} +65 -8
  20. package/dist/docs-raw/generated/assembly.md +691 -112
  21. package/dist/docs-raw/generated/concepts.md +1225 -1400
  22. package/dist/docs-raw/generated/core.md +464 -1412
  23. package/dist/docs-raw/generated/curves.md +593 -117
  24. package/dist/docs-raw/generated/lib.md +38 -748
  25. package/dist/docs-raw/generated/output.md +139 -245
  26. package/dist/docs-raw/generated/sheet-metal.md +473 -21
  27. package/dist/docs-raw/generated/sketch.md +553 -349
  28. package/dist/docs-raw/generated/viewport.md +345 -303
  29. package/dist/docs-raw/generated/wood.md +104 -0
  30. package/dist/index.html +2 -2
  31. package/dist/sitemap.xml +6 -6
  32. package/dist-cli/chunk-PZ5AY32C.js +10 -0
  33. package/dist-cli/chunk-PZ5AY32C.js.map +1 -0
  34. package/dist-cli/forgecad.js +9435 -5407
  35. package/dist-cli/forgecad.js.map +1 -0
  36. package/dist-cli/solver-FV7TJZGI.js +365 -0
  37. package/dist-cli/solver-FV7TJZGI.js.map +1 -0
  38. package/dist-skill/CONTEXT.md +3186 -7145
  39. package/dist-skill/SKILL-dev.md +21 -63
  40. package/dist-skill/SKILL.md +12 -56
  41. package/dist-skill/docs/API/core/concepts.md +16 -98
  42. package/dist-skill/docs/CLI/export.md +91 -0
  43. package/dist-skill/docs/CLI/projects.md +107 -0
  44. package/dist-skill/docs/CLI/studio_publishing.md +52 -0
  45. package/dist-skill/docs/CLI/validation.md +66 -0
  46. package/dist-skill/docs/generated/assembly.md +691 -112
  47. package/dist-skill/docs/generated/core.md +464 -1412
  48. package/dist-skill/docs/generated/curves.md +593 -117
  49. package/dist-skill/docs/generated/lib.md +38 -748
  50. package/dist-skill/docs/generated/output.md +139 -245
  51. package/dist-skill/docs/generated/sheet-metal.md +473 -21
  52. package/dist-skill/docs/generated/sketch.md +553 -349
  53. package/dist-skill/docs/generated/viewport.md +345 -303
  54. package/dist-skill/docs/generated/wood.md +104 -0
  55. package/dist-skill/docs/guides/coordinate-system.md +11 -17
  56. package/dist-skill/docs/guides/geometry-conventions.md +13 -70
  57. package/dist-skill/docs/guides/modeling-recipes.md +22 -195
  58. package/dist-skill/docs/guides/positioning.md +88 -147
  59. package/dist-skill/docs-dev/API/core/concepts.md +51 -0
  60. package/dist-skill/docs-dev/API/core/sdf-advanced.md +92 -0
  61. package/dist-skill/docs-dev/API/core/sdf-primitives.md +58 -0
  62. package/dist-skill/docs-dev/API/core/sdf-workflow.md +42 -0
  63. package/dist-skill/docs-dev/CLI/export.md +91 -0
  64. package/dist-skill/docs-dev/CLI/projects.md +107 -0
  65. package/dist-skill/docs-dev/CLI/studio_publishing.md +52 -0
  66. package/dist-skill/docs-dev/CLI/validation.md +66 -0
  67. package/dist-skill/{docs → docs-dev}/blueprint-first.md +5 -0
  68. package/dist-skill/{docs → docs-dev}/coding-best-practices.md +6 -8
  69. package/dist-skill/{docs → docs-dev}/coding.md +1 -3
  70. package/dist-skill/docs-dev/generated/assembly.md +771 -0
  71. package/dist-skill/docs-dev/generated/core.md +775 -0
  72. package/dist-skill/docs-dev/generated/curves.md +688 -0
  73. package/dist-skill/docs-dev/generated/lib.md +50 -0
  74. package/dist-skill/docs-dev/generated/output.md +234 -0
  75. package/dist-skill/docs-dev/generated/sheet-metal.md +506 -0
  76. package/dist-skill/docs-dev/generated/sketch.md +801 -0
  77. package/dist-skill/docs-dev/generated/viewport.md +486 -0
  78. package/dist-skill/docs-dev/generated/wood.md +104 -0
  79. package/dist-skill/docs-dev/guides/coordinate-system.md +46 -0
  80. package/dist-skill/docs-dev/guides/geometry-conventions.md +52 -0
  81. package/dist-skill/docs-dev/guides/modeling-recipes.md +77 -0
  82. package/dist-skill/docs-dev/guides/positioning.md +151 -0
  83. package/dist-skill/{docs → docs-dev}/guides/skill-maintenance.md +21 -10
  84. package/dist-skill/{docs → docs-dev}/internals/compiler.md +5 -6
  85. package/dist-skill/{docs → docs-dev}/internals/constraint-solver-quality.md +0 -1
  86. package/dist-skill/{docs → docs-dev}/internals/constraint-solver.md +0 -1
  87. package/dist-skill/{docs → docs-dev}/internals/sketch-2d-pipeline.md +2 -3
  88. package/examples/api/attachTo-basics.forge.js +5 -5
  89. package/examples/api/boolean-operations.forge.js +3 -3
  90. package/examples/api/bounding-box-visualizer.forge.js +2 -2
  91. package/examples/api/clone-duplicate.forge.js +1 -1
  92. package/examples/api/colors-union-vs-array.forge.js +6 -6
  93. package/examples/api/connector-assembly.forge.js +4 -4
  94. package/examples/api/connector-basics.forge.js +2 -2
  95. package/examples/api/extrude-options.forge.js +4 -10
  96. package/examples/api/feature-created-faces.forge.js +6 -10
  97. package/examples/api/fillet-showcase.forge.js +1 -1
  98. package/examples/api/folded-service-panel-cover.forge.js +2 -2
  99. package/examples/api/group-test.forge.js +1 -1
  100. package/examples/api/group-vs-union.forge.js +1 -1
  101. package/examples/api/highlight-debug.forge.js +4 -0
  102. package/examples/api/js-module-pillars.js +1 -1
  103. package/examples/api/js-module-scene.js +2 -2
  104. package/examples/api/mesh-import-slats.forge.js +1 -1
  105. package/examples/api/pointAlong-orientation.forge.js +1 -1
  106. package/examples/api/profile-2020-b-slot6.forge.js +0 -1
  107. package/examples/api/route-perimeter-flange.forge.js +1 -1
  108. package/examples/api/sdf-rover-demo.forge.js +10 -10
  109. package/examples/api/sketch-on-face-demo.forge.js +2 -2
  110. package/examples/api/sketch-regions.forge.js +4 -4
  111. package/examples/api/transition-curves.forge.js +1 -1
  112. package/examples/api/variable-sweep-pure-sdf-test.forge.js +162 -0
  113. package/examples/api/variable-sweep-test.forge.js +2 -2
  114. package/examples/api/wood-joinery.forge.js +60 -0
  115. package/examples/compiler-corpus/enclosure-shell-cuts.forge.js +3 -3
  116. package/examples/compiler-corpus/fastener-plate-variants.forge.js +2 -2
  117. package/examples/experiments/drone-arm.forge.js +53 -0
  118. package/examples/furniture/adjustable-table.forge.js +2 -2
  119. package/examples/furniture/bathroom.forge.js +11 -11
  120. package/examples/furniture/chair.forge.js +1 -1
  121. package/examples/generative/crystal-growth.forge.js +2 -2
  122. package/examples/generative/frost-spires.forge.js +3 -3
  123. package/examples/generative/golden-spiral-tower.forge.js +3 -3
  124. package/examples/mechanical/3d-printer.forge.js +28 -28
  125. package/examples/mechanical/5-finger-robot-hand.forge.js +15 -15
  126. package/examples/mechanical/airplane-propeller.forge.js +2 -2
  127. package/examples/mechanical/fillet-enclosure.forge.js +1 -1
  128. package/examples/mechanical/headphone-hanger-v2.forge.js +2 -2
  129. package/examples/mechanical/robot_hand.forge.js +15 -15
  130. package/examples/mechanical/robot_hand_2.forge.js +9 -9
  131. package/examples/products/bottle.forge.js +1 -1
  132. package/examples/products/chess-set.forge.js +19 -19
  133. package/examples/products/classical-piano.forge.js +11 -11
  134. package/examples/products/clock.forge.js +12 -12
  135. package/examples/products/iphone.forge.js +8 -8
  136. package/examples/products/laptop.forge.js +15 -15
  137. package/examples/products/liquid-soap-dispenser.forge.js +18 -18
  138. package/examples/products/origami-fish.forge.js +8 -6
  139. package/examples/products/spiderman-cake.forge.js +4 -4
  140. package/examples/toolbox/bolted-joint.forge.js +2 -2
  141. package/package.json +7 -4
  142. package/dist/assets/EditorApp-B-vQvgam.js +0 -9888
  143. package/dist/assets/LandingPage-C5n9hDXI.js +0 -322
  144. package/dist/assets/PublishedModelPage-Dt7PCVBj.js +0 -146
  145. package/dist/assets/__vite-browser-external-CURh0WXD.js +0 -8
  146. package/dist/assets/deserializeRunResult-BLAFoiE0.js +0 -19365
  147. package/dist/assets/index-1CYp3zUp.js +0 -1455
  148. package/dist/docs-raw/CLI.md +0 -865
  149. package/dist-skill/docs/API/API.md +0 -1666
  150. package/dist-skill/docs/API/README.md +0 -37
  151. package/dist-skill/docs/API/assembly/assembly.md +0 -617
  152. package/dist-skill/docs/API/core/edge-queries.md +0 -130
  153. package/dist-skill/docs/API/core/parameters.md +0 -122
  154. package/dist-skill/docs/API/core/reserved-terms.md +0 -137
  155. package/dist-skill/docs/API/core/sdf.md +0 -326
  156. package/dist-skill/docs/API/core/skill-cli.md +0 -194
  157. package/dist-skill/docs/API/core/skill-guide.md +0 -205
  158. package/dist-skill/docs/API/core/specs.md +0 -186
  159. package/dist-skill/docs/API/core/topology.md +0 -372
  160. package/dist-skill/docs/API/entities.md +0 -268
  161. package/dist-skill/docs/API/output/bom.md +0 -58
  162. package/dist-skill/docs/API/output/brep-export.md +0 -87
  163. package/dist-skill/docs/API/output/dimensions.md +0 -67
  164. package/dist-skill/docs/API/output/export.md +0 -110
  165. package/dist-skill/docs/API/output/gcode.md +0 -195
  166. package/dist-skill/docs/API/runtime/viewport.md +0 -420
  167. package/dist-skill/docs/API/sheet-metal/sheet-metal.md +0 -185
  168. package/dist-skill/docs/API/sketch/anchor.md +0 -37
  169. package/dist-skill/docs/API/sketch/booleans.md +0 -91
  170. package/dist-skill/docs/API/sketch/core.md +0 -73
  171. package/dist-skill/docs/API/sketch/extrude.md +0 -62
  172. package/dist-skill/docs/API/sketch/on-face.md +0 -104
  173. package/dist-skill/docs/API/sketch/operations.md +0 -78
  174. package/dist-skill/docs/API/sketch/path.md +0 -75
  175. package/dist-skill/docs/API/sketch/primitives.md +0 -146
  176. package/dist-skill/docs/API/sketch/regions.md +0 -80
  177. package/dist-skill/docs/API/sketch/text.md +0 -108
  178. package/dist-skill/docs/API/sketch/transforms.md +0 -65
  179. package/dist-skill/docs/API/toolbox/fasteners.md +0 -129
  180. package/dist-skill/docs/CLI.md +0 -865
  181. package/dist-skill/docs/INDEX.md +0 -94
  182. package/dist-skill/docs/RELEASING.md +0 -55
  183. package/dist-skill/docs/cli-monetization.md +0 -111
  184. package/dist-skill/docs/deployment.md +0 -281
  185. package/dist-skill/docs/generated/concepts.md +0 -2112
  186. package/dist-skill/docs/internals/shape-from-slices.md +0 -152
  187. package/dist-skill/docs/platform/admin.md +0 -45
  188. package/dist-skill/docs/platform/architecture.md +0 -79
  189. package/dist-skill/docs/platform/auth.md +0 -110
  190. package/dist-skill/docs/platform/email.md +0 -67
  191. package/dist-skill/docs/platform/projects.md +0 -111
  192. package/dist-skill/docs/platform/sharing.md +0 -90
  193. package/dist-skill/docs/runbook.md +0 -345
@@ -1,7 +1,5 @@
1
- import { r as reactExports, j as jsxRuntimeExports } from "./vendor-react-Dt7-aaJH.js";
2
- import { i as initKernel, a as initSolverWasm } from "./deserializeRunResult-BLAFoiE0.js";
3
- import { p as getExternalUrl, q as getGistId, d as fetchUrlModel, f as fetchGistModel, j as buildShareUrl } from "./index-1CYp3zUp.js";
4
- import { u as useForgeStore, V as Viewport } from "./Viewport-CoB46f5R.js";
1
+ import { r as reactExports, j as jsxRuntimeExports } from "./vendor-react-CG3i_wp0.js";
2
+ import { d as useForgeStore, af as getExternalUrl, ag as getGistId, h as fetchUrlModel, g as fetchGistModel, ac as initKernel, aa as initSolverWasm, y as buildShareUrl, ah as Viewport } from "./index-wTEK39at.js";
5
3
  function EmbedViewer() {
6
4
  const kernelReady = useForgeStore((s) => s.kernelReady);
7
5
  const setKernelReady = useForgeStore((s) => s.setKernelReady);
@@ -0,0 +1,451 @@
1
+ import { j as jsxRuntimeExports, L as Link } from "./vendor-react-CG3i_wp0.js";
2
+ import { u as useFeatureFlag } from "./index-wTEK39at.js";
3
+ function HeroSection() {
4
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
5
+ "section",
6
+ {
7
+ style: {
8
+ minHeight: "80vh",
9
+ display: "flex",
10
+ flexDirection: "column",
11
+ alignItems: "center",
12
+ justifyContent: "center",
13
+ textAlign: "center",
14
+ padding: "80px 24px 60px",
15
+ position: "relative"
16
+ },
17
+ children: [
18
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { fontSize: 64, marginBottom: 24 }, children: "⚒" }),
19
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
20
+ "h1",
21
+ {
22
+ style: {
23
+ fontSize: "clamp(36px, 6vw, 64px)",
24
+ fontWeight: 700,
25
+ color: "var(--fc-text)",
26
+ margin: "0 0 16px",
27
+ lineHeight: 1.1,
28
+ letterSpacing: "-0.02em"
29
+ },
30
+ children: "Code-First Parametric CAD"
31
+ }
32
+ ),
33
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
34
+ "p",
35
+ {
36
+ style: {
37
+ fontSize: "clamp(16px, 2.5vw, 22px)",
38
+ color: "var(--fc-textMuted)",
39
+ maxWidth: 600,
40
+ margin: "0 0 40px",
41
+ lineHeight: 1.5
42
+ },
43
+ children: "Design mechanical parts with JavaScript. Parametric sliders, constraint-based sketches, and 12+ export formats — from STL to STEP to G-code."
44
+ }
45
+ ),
46
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { display: "flex", gap: 12, flexWrap: "wrap", justifyContent: "center" }, children: [
47
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
48
+ Link,
49
+ {
50
+ to: "/app",
51
+ style: {
52
+ padding: "14px 32px",
53
+ fontSize: 16,
54
+ fontWeight: 600,
55
+ background: "var(--fc-accent)",
56
+ color: "var(--fc-accentText)",
57
+ borderRadius: 8,
58
+ textDecoration: "none",
59
+ border: "none",
60
+ cursor: "pointer"
61
+ },
62
+ children: "Start Building"
63
+ }
64
+ ),
65
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
66
+ Link,
67
+ {
68
+ to: "/docs",
69
+ style: {
70
+ padding: "14px 32px",
71
+ fontSize: 16,
72
+ fontWeight: 600,
73
+ background: "transparent",
74
+ color: "var(--fc-text)",
75
+ borderRadius: 8,
76
+ textDecoration: "none",
77
+ border: "1px solid var(--fc-border)",
78
+ cursor: "pointer"
79
+ },
80
+ children: "Read the Docs"
81
+ }
82
+ )
83
+ ] })
84
+ ]
85
+ }
86
+ );
87
+ }
88
+ function FeatureCard({ title, description, code }) {
89
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
90
+ "div",
91
+ {
92
+ style: {
93
+ background: "var(--fc-bgSurface)",
94
+ border: "1px solid var(--fc-border)",
95
+ borderRadius: 12,
96
+ padding: 28,
97
+ flex: "1 1 300px",
98
+ maxWidth: 400
99
+ },
100
+ children: [
101
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { style: { margin: "0 0 8px", fontSize: 18, fontWeight: 600, color: "var(--fc-text)" }, children: title }),
102
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { style: { margin: "0 0 16px", fontSize: 14, color: "var(--fc-textMuted)", lineHeight: 1.5 }, children: description }),
103
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
104
+ "pre",
105
+ {
106
+ style: {
107
+ background: "var(--fc-bg)",
108
+ border: "1px solid var(--fc-border)",
109
+ borderRadius: 8,
110
+ padding: 16,
111
+ fontSize: 13,
112
+ fontFamily: "var(--fc-mono, monospace)",
113
+ color: "var(--fc-text)",
114
+ overflow: "auto",
115
+ margin: 0,
116
+ lineHeight: 1.5
117
+ },
118
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx("code", { children: code })
119
+ }
120
+ )
121
+ ]
122
+ }
123
+ );
124
+ }
125
+ function FeaturesSection() {
126
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
127
+ "section",
128
+ {
129
+ style: {
130
+ padding: "80px 24px",
131
+ maxWidth: 1200,
132
+ margin: "0 auto"
133
+ },
134
+ children: [
135
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
136
+ "h2",
137
+ {
138
+ style: {
139
+ textAlign: "center",
140
+ fontSize: 32,
141
+ fontWeight: 700,
142
+ color: "var(--fc-text)",
143
+ margin: "0 0 48px"
144
+ },
145
+ children: "Why ForgeCAD?"
146
+ }
147
+ ),
148
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
149
+ "div",
150
+ {
151
+ style: {
152
+ display: "flex",
153
+ gap: 24,
154
+ flexWrap: "wrap",
155
+ justifyContent: "center"
156
+ },
157
+ children: [
158
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
159
+ FeatureCard,
160
+ {
161
+ title: "Parametric by Default",
162
+ description: "Every dimension becomes a live slider. Change one value and the entire model updates instantly.",
163
+ code: `const width = param('width', 50, { min: 10, max: 200 });
164
+ const depth = param('depth', 30, { min: 10, max: 100 });
165
+
166
+ const plate = box(width, depth, 5)
167
+ .fillet(3);`
168
+ }
169
+ ),
170
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
171
+ FeatureCard,
172
+ {
173
+ title: "AI-Ready Design",
174
+ description: "Models are plain JavaScript — LLMs can read, write, and modify them. No binary formats, no vendor lock-in.",
175
+ code: `// Claude or GPT can write this:
176
+ const bolt = lib.bolt('M8', 30);
177
+ const nut = lib.nut('M8');
178
+
179
+ return assembly()
180
+ .add('bolt', bolt)
181
+ .add('nut', nut, { z: 25 });`
182
+ }
183
+ ),
184
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
185
+ FeatureCard,
186
+ {
187
+ title: "Export Anywhere",
188
+ description: "STL for 3D printing, STEP for professional CAD, G-code for CNC, URDF for robotics. One model, every format.",
189
+ code: `// From the CLI:
190
+ // forgecad export stl bracket.forge.js
191
+ // forgecad export step bracket.forge.js
192
+ // forgecad export gcode bracket.forge.js
193
+ // forgecad export urdf robot.forge.js`
194
+ }
195
+ )
196
+ ]
197
+ }
198
+ )
199
+ ]
200
+ }
201
+ );
202
+ }
203
+ function CapabilitiesSection() {
204
+ const capabilities = [
205
+ { label: "Constraint-based sketches", detail: "18 constraint types with algebraic solver" },
206
+ { label: "Assembly kinematics", detail: "Revolute, prismatic, and gear joints" },
207
+ { label: "Named faces & edges", detail: "Topology tracking through boolean operations" },
208
+ { label: "SDF / generative", detail: "Gyroid, voronoi, and custom distance fields" },
209
+ { label: "Multi-file projects", detail: "require() parts, organize with folders" },
210
+ { label: "Live 3D viewport", detail: "Edit code, see changes instantly" },
211
+ { label: "Measurement tools", detail: "Distances, angles, areas in the viewport" },
212
+ { label: "Sheet metal", detail: "Bends, flat patterns, and K-factor" }
213
+ ];
214
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
215
+ "section",
216
+ {
217
+ style: {
218
+ padding: "80px 24px",
219
+ background: "var(--fc-bgSurface)",
220
+ borderTop: "1px solid var(--fc-border)",
221
+ borderBottom: "1px solid var(--fc-border)"
222
+ },
223
+ children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { maxWidth: 900, margin: "0 auto" }, children: [
224
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
225
+ "h2",
226
+ {
227
+ style: {
228
+ textAlign: "center",
229
+ fontSize: 32,
230
+ fontWeight: 700,
231
+ color: "var(--fc-text)",
232
+ margin: "0 0 48px"
233
+ },
234
+ children: "Everything You Need"
235
+ }
236
+ ),
237
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
238
+ "div",
239
+ {
240
+ style: {
241
+ display: "grid",
242
+ gridTemplateColumns: "repeat(auto-fit, minmax(280px, 1fr))",
243
+ gap: 20
244
+ },
245
+ children: capabilities.map((cap) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
246
+ "div",
247
+ {
248
+ style: {
249
+ padding: "16px 20px",
250
+ background: "var(--fc-bg)",
251
+ borderRadius: 8,
252
+ border: "1px solid var(--fc-border)"
253
+ },
254
+ children: [
255
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { fontSize: 15, fontWeight: 600, color: "var(--fc-text)", marginBottom: 4 }, children: cap.label }),
256
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { fontSize: 13, color: "var(--fc-textMuted)" }, children: cap.detail })
257
+ ]
258
+ },
259
+ cap.label
260
+ ))
261
+ }
262
+ )
263
+ ] })
264
+ }
265
+ );
266
+ }
267
+ function CTASection() {
268
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
269
+ "section",
270
+ {
271
+ style: {
272
+ padding: "80px 24px",
273
+ textAlign: "center"
274
+ },
275
+ children: [
276
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
277
+ "h2",
278
+ {
279
+ style: {
280
+ fontSize: 32,
281
+ fontWeight: 700,
282
+ color: "var(--fc-text)",
283
+ margin: "0 0 16px"
284
+ },
285
+ children: "Ready to build?"
286
+ }
287
+ ),
288
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
289
+ "p",
290
+ {
291
+ style: {
292
+ fontSize: 18,
293
+ color: "var(--fc-textMuted)",
294
+ margin: "0 0 32px"
295
+ },
296
+ children: "Start designing in your browser. No install required."
297
+ }
298
+ ),
299
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
300
+ Link,
301
+ {
302
+ to: "/app",
303
+ style: {
304
+ padding: "16px 40px",
305
+ fontSize: 18,
306
+ fontWeight: 600,
307
+ background: "var(--fc-accent)",
308
+ color: "var(--fc-accentText)",
309
+ borderRadius: 8,
310
+ textDecoration: "none",
311
+ border: "none",
312
+ cursor: "pointer",
313
+ display: "inline-block"
314
+ },
315
+ children: "Open ForgeCAD"
316
+ }
317
+ )
318
+ ]
319
+ }
320
+ );
321
+ }
322
+ function SiteNav() {
323
+ const showPricing = useFeatureFlag("pricing");
324
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
325
+ "nav",
326
+ {
327
+ style: {
328
+ position: "fixed",
329
+ top: 0,
330
+ left: 0,
331
+ right: 0,
332
+ height: 56,
333
+ display: "flex",
334
+ alignItems: "center",
335
+ justifyContent: "space-between",
336
+ padding: "0 24px",
337
+ background: "var(--fc-bg)",
338
+ borderBottom: "1px solid var(--fc-border)",
339
+ zIndex: 100,
340
+ backdropFilter: "blur(8px)"
341
+ },
342
+ children: [
343
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
344
+ Link,
345
+ {
346
+ to: "/",
347
+ style: {
348
+ display: "flex",
349
+ alignItems: "center",
350
+ gap: 8,
351
+ textDecoration: "none",
352
+ color: "var(--fc-text)"
353
+ },
354
+ children: [
355
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { fontSize: 20 }, children: "⚒" }),
356
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { fontSize: 16, fontWeight: 700, color: "var(--fc-accent)" }, children: "ForgeCAD" })
357
+ ]
358
+ }
359
+ ),
360
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { display: "flex", alignItems: "center", gap: 24 }, children: [
361
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/docs", style: { color: "var(--fc-textMuted)", textDecoration: "none", fontSize: 14 }, children: "Docs" }),
362
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/blog", style: { color: "var(--fc-textMuted)", textDecoration: "none", fontSize: 14 }, children: "Blog" }),
363
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/examples", style: { color: "var(--fc-textMuted)", textDecoration: "none", fontSize: 14 }, children: "Examples" }),
364
+ showPricing && /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/pricing", style: { color: "var(--fc-textMuted)", textDecoration: "none", fontSize: 14 }, children: "Pricing" }),
365
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
366
+ Link,
367
+ {
368
+ to: "/app",
369
+ style: {
370
+ padding: "6px 16px",
371
+ fontSize: 14,
372
+ fontWeight: 600,
373
+ background: "var(--fc-accent)",
374
+ color: "var(--fc-accentText)",
375
+ borderRadius: 6,
376
+ textDecoration: "none"
377
+ },
378
+ children: "Open App"
379
+ }
380
+ )
381
+ ] })
382
+ ]
383
+ }
384
+ );
385
+ }
386
+ function Footer() {
387
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(
388
+ "footer",
389
+ {
390
+ style: {
391
+ padding: "40px 24px",
392
+ borderTop: "1px solid var(--fc-border)",
393
+ textAlign: "center"
394
+ },
395
+ children: [
396
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
397
+ "div",
398
+ {
399
+ style: {
400
+ display: "flex",
401
+ gap: 24,
402
+ justifyContent: "center",
403
+ marginBottom: 16,
404
+ flexWrap: "wrap"
405
+ },
406
+ children: [
407
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/docs", style: { color: "var(--fc-textMuted)", textDecoration: "none", fontSize: 13 }, children: "Documentation" }),
408
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/blog", style: { color: "var(--fc-textMuted)", textDecoration: "none", fontSize: 13 }, children: "Blog" }),
409
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
410
+ "a",
411
+ {
412
+ href: "https://github.com/KoStard/ForgeCAD",
413
+ target: "_blank",
414
+ rel: "noopener noreferrer",
415
+ style: { color: "var(--fc-textMuted)", textDecoration: "none", fontSize: 13 },
416
+ children: "GitHub"
417
+ }
418
+ ),
419
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
420
+ "a",
421
+ {
422
+ href: "https://github.com/KoStard/ForgeCAD/issues/new",
423
+ target: "_blank",
424
+ rel: "noopener noreferrer",
425
+ style: { color: "var(--fc-textMuted)", textDecoration: "none", fontSize: 13 },
426
+ children: "Report Issue"
427
+ }
428
+ )
429
+ ]
430
+ }
431
+ ),
432
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { style: { color: "var(--fc-textDim)", fontSize: 12, margin: 0 }, children: "ForgeCAD" })
433
+ ]
434
+ }
435
+ );
436
+ }
437
+ function LandingPage() {
438
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { minHeight: "100vh", display: "flex", flexDirection: "column", overflow: "auto" }, children: [
439
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SiteNav, {}),
440
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("main", { style: { flex: "1 0 auto", paddingTop: 56 }, children: [
441
+ /* @__PURE__ */ jsxRuntimeExports.jsx(HeroSection, {}),
442
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FeaturesSection, {}),
443
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CapabilitiesSection, {}),
444
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CTASection, {})
445
+ ] }),
446
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Footer, {})
447
+ ] });
448
+ }
449
+ export {
450
+ LandingPage
451
+ };
@@ -0,0 +1,232 @@
1
+ import { h as useNavigate, j as jsxRuntimeExports, L as Link } from "./vendor-react-CG3i_wp0.js";
2
+ import { a as useAuthStore, b as authFetch } from "./index-wTEK39at.js";
3
+ const PLANS = [
4
+ {
5
+ interval: "monthly",
6
+ name: "Pro Monthly",
7
+ price: "$15",
8
+ period: "/mo",
9
+ features: [
10
+ "STEP & BREP export",
11
+ "High-quality Blender renders",
12
+ "GIF & MP4 capture",
13
+ "G-code & cutting layouts",
14
+ "SDF/URDF robotics export",
15
+ "500 MB cloud storage"
16
+ ]
17
+ },
18
+ {
19
+ interval: "annual",
20
+ name: "Pro Annual",
21
+ price: "$120",
22
+ period: "/yr",
23
+ highlight: "Save 33%",
24
+ features: [
25
+ "Everything in Monthly",
26
+ "Billed annually ($10/mo effective)",
27
+ "Priority support"
28
+ ]
29
+ },
30
+ {
31
+ interval: "lifetime",
32
+ name: "Pro Lifetime",
33
+ price: "$299",
34
+ period: "one-time",
35
+ highlight: "Best value",
36
+ features: [
37
+ "Everything in Pro, forever",
38
+ "No recurring payments",
39
+ "All future Pro features included"
40
+ ]
41
+ }
42
+ ];
43
+ const FREE_FEATURES = [
44
+ "Full CAD editor",
45
+ "Run .forge.js scripts",
46
+ "STL, 3MF, SVG export",
47
+ "Standard PNG render",
48
+ "50 MB cloud storage",
49
+ "Unlimited local projects"
50
+ ];
51
+ const cardStyle = {
52
+ background: "var(--fc-bgPanel)",
53
+ border: "1px solid var(--fc-border)",
54
+ borderRadius: 12,
55
+ padding: "32px 24px",
56
+ display: "flex",
57
+ flexDirection: "column",
58
+ flex: 1,
59
+ minWidth: 240
60
+ };
61
+ const highlightCardStyle = {
62
+ ...cardStyle,
63
+ border: "2px solid var(--fc-accent)",
64
+ position: "relative"
65
+ };
66
+ function PricingPage() {
67
+ const user = useAuthStore((s) => s.user);
68
+ const navigate = useNavigate();
69
+ const isPro = (user == null ? void 0 : user.plan) === "pro";
70
+ async function handleCheckout(interval) {
71
+ if (!user) {
72
+ navigate("/app");
73
+ return;
74
+ }
75
+ try {
76
+ const data = await authFetch("/api/billing/checkout", {
77
+ method: "POST",
78
+ body: JSON.stringify({ interval })
79
+ });
80
+ window.location.href = data.url;
81
+ } catch (err) {
82
+ alert(err instanceof Error ? err.message : "Failed to connect to billing service");
83
+ }
84
+ }
85
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { minHeight: "100vh", background: "var(--fc-bg)", color: "var(--fc-text)" }, children: [
86
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
87
+ "nav",
88
+ {
89
+ style: {
90
+ position: "fixed",
91
+ top: 0,
92
+ left: 0,
93
+ right: 0,
94
+ height: 56,
95
+ display: "flex",
96
+ alignItems: "center",
97
+ justifyContent: "space-between",
98
+ padding: "0 24px",
99
+ background: "var(--fc-bg)",
100
+ borderBottom: "1px solid var(--fc-border)",
101
+ zIndex: 100
102
+ },
103
+ children: [
104
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
105
+ Link,
106
+ {
107
+ to: "/",
108
+ style: { display: "flex", alignItems: "center", gap: 8, textDecoration: "none", color: "var(--fc-text)" },
109
+ children: [
110
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { fontSize: 20 }, children: "⚒" }),
111
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { fontSize: 16, fontWeight: 700, color: "var(--fc-accent)" }, children: "ForgeCAD" })
112
+ ]
113
+ }
114
+ ),
115
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
116
+ Link,
117
+ {
118
+ to: "/app",
119
+ style: {
120
+ padding: "6px 16px",
121
+ fontSize: 14,
122
+ fontWeight: 600,
123
+ background: "var(--fc-accent)",
124
+ color: "var(--fc-accentText)",
125
+ borderRadius: 6,
126
+ textDecoration: "none"
127
+ },
128
+ children: "Open App"
129
+ }
130
+ )
131
+ ]
132
+ }
133
+ ),
134
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { maxWidth: 1e3, margin: "0 auto", padding: "96px 24px 64px" }, children: [
135
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { textAlign: "center", marginBottom: 48 }, children: [
136
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { style: { fontSize: 36, fontWeight: 800, marginBottom: 12 }, children: "Simple, transparent pricing" }),
137
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { style: { fontSize: 16, color: "var(--fc-textMuted)", maxWidth: 500, margin: "0 auto" }, children: "ForgeCAD is free for hobbyists and students. Go Pro for professional CAD interchange and manufacturing outputs." })
138
+ ] }),
139
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { marginBottom: 48 }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
140
+ "div",
141
+ {
142
+ style: {
143
+ ...cardStyle,
144
+ maxWidth: 400,
145
+ margin: "0 auto",
146
+ background: "var(--fc-bg)"
147
+ },
148
+ children: [
149
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { fontSize: 20, fontWeight: 700, marginBottom: 4 }, children: "Free" }),
150
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { fontSize: 32, fontWeight: 800, marginBottom: 16 }, children: [
151
+ "$0 ",
152
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { fontSize: 14, fontWeight: 400, color: "var(--fc-textMuted)" }, children: "forever" })
153
+ ] }),
154
+ /* @__PURE__ */ jsxRuntimeExports.jsx("ul", { style: { listStyle: "none", padding: 0, margin: 0 }, children: FREE_FEATURES.map((f) => /* @__PURE__ */ jsxRuntimeExports.jsx(
155
+ "li",
156
+ {
157
+ style: {
158
+ padding: "6px 0",
159
+ fontSize: 14,
160
+ color: "var(--fc-textMuted)",
161
+ borderBottom: "1px solid var(--fc-border)"
162
+ },
163
+ children: f
164
+ },
165
+ f
166
+ )) })
167
+ ]
168
+ }
169
+ ) }),
170
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { display: "flex", gap: 20, flexWrap: "wrap", justifyContent: "center" }, children: PLANS.map((plan) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: plan.highlight ? highlightCardStyle : cardStyle, children: [
171
+ plan.highlight && /* @__PURE__ */ jsxRuntimeExports.jsx(
172
+ "div",
173
+ {
174
+ style: {
175
+ position: "absolute",
176
+ top: -12,
177
+ left: "50%",
178
+ transform: "translateX(-50%)",
179
+ background: "var(--fc-accent)",
180
+ color: "var(--fc-accentText)",
181
+ padding: "2px 12px",
182
+ borderRadius: 10,
183
+ fontSize: 12,
184
+ fontWeight: 600
185
+ },
186
+ children: plan.highlight
187
+ }
188
+ ),
189
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { fontSize: 18, fontWeight: 700, marginBottom: 4 }, children: plan.name }),
190
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { fontSize: 32, fontWeight: 800, marginBottom: 16 }, children: [
191
+ plan.price,
192
+ " ",
193
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { fontSize: 14, fontWeight: 400, color: "var(--fc-textMuted)" }, children: plan.period })
194
+ ] }),
195
+ /* @__PURE__ */ jsxRuntimeExports.jsx("ul", { style: { listStyle: "none", padding: 0, margin: "0 0 24px", flex: 1 }, children: plan.features.map((f) => /* @__PURE__ */ jsxRuntimeExports.jsx(
196
+ "li",
197
+ {
198
+ style: {
199
+ padding: "6px 0",
200
+ fontSize: 14,
201
+ color: "var(--fc-textMuted)",
202
+ borderBottom: "1px solid var(--fc-border)"
203
+ },
204
+ children: f
205
+ },
206
+ f
207
+ )) }),
208
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
209
+ "button",
210
+ {
211
+ onClick: () => handleCheckout(plan.interval),
212
+ disabled: isPro,
213
+ style: {
214
+ padding: "10px 20px",
215
+ fontSize: 14,
216
+ fontWeight: 600,
217
+ background: isPro ? "var(--fc-bgActive)" : "var(--fc-accent)",
218
+ color: isPro ? "var(--fc-textMuted)" : "var(--fc-accentText)",
219
+ border: "none",
220
+ borderRadius: 8,
221
+ cursor: isPro ? "default" : "pointer"
222
+ },
223
+ children: isPro ? "Current plan" : "Get started"
224
+ }
225
+ )
226
+ ] }, plan.interval)) })
227
+ ] })
228
+ ] });
229
+ }
230
+ export {
231
+ PricingPage
232
+ };