forgecad 0.9.2 → 0.9.3

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 (79) hide show
  1. package/LICENSE +7 -5
  2. package/README.md +1 -1
  3. package/README.public.md +24 -2
  4. package/dist/assets/{AdminPage-Bs4PiK00.js → AdminPage-4jihcEk_.js} +1 -1
  5. package/dist/assets/{BlogPage-DVmgN0ma.js → BlogPage-BvzruKtw.js} +1 -1
  6. package/dist/assets/{DocsPage-BP6wlsBN.js → DocsPage-DHbd-WS-.js} +13 -13
  7. package/dist/assets/{EditorApp-Arw2NnGJ.js → EditorApp-C5P2rBfh.js} +433 -84
  8. package/dist/assets/{EditorApp-VY9lXx0N.css → EditorApp-DS0AIUrZ.css} +25 -0
  9. package/dist/assets/{EmbedViewer-qgQiOahL.js → EmbedViewer-B70wQwlE.js} +2 -2
  10. package/dist/assets/{LandingPageProofDriven-DvhtmWOz.js → LandingPageProofDriven-DIsYTnep.js} +1 -1
  11. package/dist/assets/{PricingPage-Ck3CP2ti.css → PricingPage-BMedqFef.css} +48 -0
  12. package/dist/assets/{PricingPage-657oLvWh.js → PricingPage-YPOr12pP.js} +34 -6
  13. package/dist/assets/{SettingsPage-wNy3_2yn.js → SettingsPage-rntoyJ3b.js} +10 -13
  14. package/dist/assets/{app-BdBoMQeO.js → app-CWucmnLZ.js} +801 -1208
  15. package/dist/assets/cli/{render-Ci3jjyT1.js → render-DZHmUySW.js} +214 -23
  16. package/dist/assets/copy-CQKQppF-.js +8 -0
  17. package/dist/assets/{evalWorker-CMCAbK8r.js → evalWorker-C3dKxi9Y.js} +1117 -95
  18. package/dist/assets/{manifold-BMn-8Vf8.js → manifold-CQ3FhfWB.js} +1 -1
  19. package/dist/assets/{manifold-jlYQ6E5R.js → manifold-CU0G1yYL.js} +1 -1
  20. package/dist/assets/{manifold-DbyILno4.js → manifold-CYWZMfjB.js} +2 -2
  21. package/dist/assets/{renderSceneState-DAnqvxSt.js → renderSceneState-BBUrnsUN.js} +1 -1
  22. package/dist/assets/{reportWorker-BcRVMHK-.js → reportWorker-BhZ7DjxQ.js} +1091 -95
  23. package/dist/assets/{sectionPlaneMath-DXJ_TdIW.js → sectionPlaneMath-BxfokaJE.js} +1091 -95
  24. package/dist/cli/render.html +1 -1
  25. package/dist/docs/index.html +2 -2
  26. package/dist/docs-raw/AI/usage.md +182 -89
  27. package/dist/docs-raw/API/core/concepts.md +26 -0
  28. package/dist/docs-raw/CLI.md +58 -37
  29. package/dist/docs-raw/INDEX.md +81 -64
  30. package/dist/docs-raw/cli-monetization.md +9 -8
  31. package/dist/docs-raw/generated/concepts.md +111 -4
  32. package/dist/docs-raw/generated/core.md +2 -0
  33. package/dist/docs-raw/generated/curves.md +480 -1
  34. package/dist/docs-raw/generated/output.md +1 -0
  35. package/dist/docs-raw/generated/sketch.md +2 -0
  36. package/dist/docs-raw/generated/viewport.md +81 -3
  37. package/dist/docs-raw/product/user-outreach-email-templates.md +159 -0
  38. package/dist/docs-raw/skills/forgecad-image-replicator.md +1 -1
  39. package/dist/docs-raw/skills/forgecad-make-a-model.md +33 -4
  40. package/dist/docs-raw/skills/forgecad-prepare-prompt.md +1 -1
  41. package/dist/docs-raw/skills/forgecad-project.md +1 -1
  42. package/dist/docs-raw/skills/forgecad-render-inspect.md +1 -1
  43. package/dist/docs-raw/skills/forgecad.md +2 -1
  44. package/dist/docs-raw/welcome.md +85 -137
  45. package/dist/index.html +1 -1
  46. package/dist/llms.txt +4 -3
  47. package/dist/sitemap.xml +6 -6
  48. package/dist-cli/forgecad.js +1413 -219
  49. package/dist-cli/forgecad.js.map +1 -1
  50. package/dist-skill/CONTEXT.md +594 -5
  51. package/dist-skill/SKILL-dev.md +2 -1
  52. package/dist-skill/SKILL.md +2 -1
  53. package/dist-skill/docs/API/core/concepts.md +26 -0
  54. package/dist-skill/docs/CLI.md +58 -37
  55. package/dist-skill/docs/generated/core.md +2 -0
  56. package/dist-skill/docs/generated/curves.md +480 -1
  57. package/dist-skill/docs/generated/output.md +1 -0
  58. package/dist-skill/docs/generated/sketch.md +2 -0
  59. package/dist-skill/docs/generated/viewport.md +81 -3
  60. package/dist-skill/docs-dev/API/core/concepts.md +26 -0
  61. package/dist-skill/docs-dev/CLI.md +58 -37
  62. package/dist-skill/docs-dev/generated/core.md +2 -0
  63. package/dist-skill/docs-dev/generated/curves.md +480 -1
  64. package/dist-skill/docs-dev/generated/output.md +1 -0
  65. package/dist-skill/docs-dev/generated/sketch.md +2 -0
  66. package/dist-skill/docs-dev/generated/viewport.md +81 -3
  67. package/dist-skill/library/README.md +0 -1
  68. package/dist-skill/library/forgecad-image-replicator/SKILL.md +1 -1
  69. package/dist-skill/library/forgecad-make-a-model/SKILL.md +33 -4
  70. package/dist-skill/library/forgecad-prepare-prompt/SKILL.md +1 -1
  71. package/dist-skill/library/forgecad-project/SKILL.md +1 -1
  72. package/dist-skill/library/forgecad-render-inspect/SKILL.md +1 -1
  73. package/examples/api/conformal-product-ribbon.forge.js +77 -0
  74. package/examples/api/render-labels.forge.js +33 -0
  75. package/examples/api/text2d-basics.forge.js +6 -3
  76. package/package.json +1 -1
  77. package/dist-skill/library/forgecad-deep-dive/SKILL.md +0 -120
  78. package/dist-skill/library/forgecad-deep-dive/agents/openai.yaml +0 -4
  79. package/dist-skill/library/forgecad-deep-dive/references/output-shape.md +0 -64
@@ -143,6 +143,31 @@
143
143
  text-transform: uppercase;
144
144
  }
145
145
 
146
+ .fc-view-panel-search-row {
147
+ position: relative;
148
+ min-width: 0;
149
+ }
150
+
151
+ .fc-view-panel-search-input {
152
+ padding-right: 30px;
153
+ }
154
+
155
+ .fc-view-panel-search-clear {
156
+ position: absolute;
157
+ top: 50%;
158
+ right: 4px;
159
+ width: 22px;
160
+ height: 22px;
161
+ min-width: 22px;
162
+ padding: 0;
163
+ transform: translateY(-50%);
164
+ border: 0;
165
+ background: transparent;
166
+ color: var(--fc-textDim);
167
+ font-size: 16px;
168
+ line-height: 1;
169
+ }
170
+
146
171
  .fc-view-panel-button-grid {
147
172
  display: grid;
148
173
  gap: 6px;
@@ -1,6 +1,6 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "./vendor-react-mDaEzY3y.js";
2
- import { bE as initKernel, bF as initSolverWasm } from "./sectionPlaneMath-DXJ_TdIW.js";
3
- import { e as useForgeStore, ab as getExternalUrl, ac as getGistId, o as fetchUrlModel, n as fetchGistModel, j as buildShareUrl, B as BrandMark, ad as Viewport } from "./app-BdBoMQeO.js";
2
+ import { bE as initKernel, bF as initSolverWasm } from "./sectionPlaneMath-BxfokaJE.js";
3
+ import { g as useForgeStore, ag as getExternalUrl, ah as getGistId, q as fetchUrlModel, p as fetchGistModel, l as buildShareUrl, B as BrandMark, ai as Viewport } from "./app-CWucmnLZ.js";
4
4
  function EmbedViewer() {
5
5
  const kernelReady = useForgeStore((s) => s.kernelReady);
6
6
  const setKernelReady = useForgeStore((s) => s.setKernelReady);
@@ -1,5 +1,5 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports, L as Link } from "./vendor-react-mDaEzY3y.js";
2
- import { B as BrandMark } from "./app-BdBoMQeO.js";
2
+ import { B as BrandMark } from "./app-CWucmnLZ.js";
3
3
  /* empty css */
4
4
  const LINKS = {
5
5
  glasses: {
@@ -159,6 +159,50 @@
159
159
  transform: none;
160
160
  }
161
161
 
162
+ .pricing-root .pricing-faqs {
163
+ margin-top: 34px;
164
+ display: grid;
165
+ grid-template-columns: minmax(180px, 0.35fr) minmax(0, 1fr);
166
+ gap: 18px;
167
+ align-items: start;
168
+ }
169
+
170
+ .pricing-root .pricing-faqs h2 {
171
+ font-size: 24px;
172
+ line-height: 1.15;
173
+ letter-spacing: 0;
174
+ }
175
+
176
+ .pricing-root .pricing-faq-list {
177
+ display: grid;
178
+ gap: 10px;
179
+ }
180
+
181
+ .pricing-root .pricing-faq {
182
+ border-top: 1px solid var(--line);
183
+ padding: 14px 0;
184
+ }
185
+
186
+ .pricing-root .pricing-faq:last-child {
187
+ border-bottom: 1px solid var(--line);
188
+ }
189
+
190
+ .pricing-root .pricing-faq summary {
191
+ color: var(--ink);
192
+ cursor: pointer;
193
+ font-size: 16px;
194
+ font-weight: 650;
195
+ line-height: 1.35;
196
+ }
197
+
198
+ .pricing-root .pricing-faq p {
199
+ max-width: 72ch;
200
+ margin-top: 10px;
201
+ color: var(--muted);
202
+ font-size: 15px;
203
+ line-height: 1.55;
204
+ }
205
+
162
206
  @media (max-width: 1160px) {
163
207
  .pricing-root .pricing-plans {
164
208
  grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -170,6 +214,10 @@
170
214
  align-items: start;
171
215
  flex-direction: column;
172
216
  }
217
+
218
+ .pricing-root .pricing-faqs {
219
+ grid-template-columns: 1fr;
220
+ }
173
221
  }
174
222
 
175
223
  @media (max-width: 640px) {
@@ -1,5 +1,6 @@
1
1
  import { f as useNavigate, r as reactExports, j as jsxRuntimeExports, L as Link } from "./vendor-react-mDaEzY3y.js";
2
- import { u as useAuthStore, b as authFetch, B as BrandMark } from "./app-BdBoMQeO.js";
2
+ import { u as useAuthStore, b as authFetch, B as BrandMark } from "./app-CWucmnLZ.js";
3
+ import { C as COMMERCIAL_USE_CASES } from "./copy-CQKQppF-.js";
3
4
  /* empty css */
4
5
  function checkoutIntentPath(interval) {
5
6
  return `/app?checkout=${interval}`;
@@ -12,12 +13,12 @@ const PRICING_PLANS = [
12
13
  period: "/mo",
13
14
  features: [
14
15
  "Commercial use allowed",
15
- "STEP & BREP export",
16
+ "Commercial coverage for production exports",
16
17
  "High-quality Blender renders",
17
18
  "GIF & MP4 capture",
18
- "G-code & cutting layouts",
19
- "SDF/URDF robotics export",
20
- "500 MB cloud storage"
19
+ "500 MB cloud storage",
20
+ "Support for production workflows",
21
+ "CLI license for Pro-only tools"
21
22
  ]
22
23
  },
23
24
  {
@@ -25,7 +26,7 @@ const PRICING_PLANS = [
25
26
  name: "Pro Annual",
26
27
  price: "$199",
27
28
  period: "/yr",
28
- highlight: "Save 17%",
29
+ highlight: "Two months free",
29
30
  features: ["Everything in Monthly", "Billed annually ($16.58/mo effective)", "Same self-serve product access"]
30
31
  }
31
32
  ];
@@ -46,10 +47,29 @@ const FREE_FEATURES = [
46
47
  "Full CAD editor",
47
48
  "Run .forge.js scripts",
48
49
  "STL, 3MF, SVG export",
50
+ "STEP, BREP, report, and layout exports",
49
51
  "Standard PNG render",
50
52
  "50 MB cloud storage",
51
53
  "Unlimited local projects"
52
54
  ];
55
+ const PRICING_FAQS = [
56
+ {
57
+ question: "Do businesses pay VAT?",
58
+ answer: "Stripe Checkout collects your VAT or tax ID and applies taxes automatically, based on your billing country and business details."
59
+ },
60
+ {
61
+ question: "When should I upgrade?",
62
+ answer: `Use Free for personal exploration, learning, evaluation, and open-source work. Choose Pro when ForgeCAD supports ${COMMERCIAL_USE_CASES} work.`
63
+ },
64
+ {
65
+ question: "Are exports free?",
66
+ answer: "Yes. Export actions stay free to run, including production-focused formats like STEP, BREP, reports, and cutting layouts. Pro is the right plan when those outputs support commercial work."
67
+ },
68
+ {
69
+ question: "Can I keep using local projects for free?",
70
+ answer: "Yes. Free stays useful for local modeling, local projects, standard renders, and exports. Pro adds commercial coverage, more storage, support, and Pro-only render/capture tools."
71
+ }
72
+ ];
53
73
  function pricingPlanLabel(isPro, interval) {
54
74
  if (!isPro) return "Free";
55
75
  if (!interval) return "Pro";
@@ -206,6 +226,13 @@ function PricingPage() {
206
226
  /* @__PURE__ */ jsxRuntimeExports.jsx("ul", { className: "pricing-feature-list", children: ENTERPRISE_PLAN.features.map((feature) => /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: feature }, feature)) }),
207
227
  /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: ENTERPRISE_PLAN.ctaHref, className: "lpd-button lpd-button-primary pricing-plan-button", children: ENTERPRISE_PLAN.ctaLabel })
208
228
  ] })
229
+ ] }),
230
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "pricing-faqs", "aria-label": "Pricing questions", children: [
231
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { children: "Questions" }),
232
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "pricing-faq-list", children: PRICING_FAQS.map((faq) => /* @__PURE__ */ jsxRuntimeExports.jsxs("details", { className: "pricing-faq", children: [
233
+ /* @__PURE__ */ jsxRuntimeExports.jsx("summary", { children: faq.question }),
234
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: faq.answer })
235
+ ] }, faq.question)) })
209
236
  ] })
210
237
  ] })
211
238
  ] });
@@ -213,6 +240,7 @@ function PricingPage() {
213
240
  export {
214
241
  ENTERPRISE_PLAN,
215
242
  FREE_FEATURES,
243
+ PRICING_FAQS,
216
244
  PRICING_PLANS,
217
245
  PricingPage,
218
246
  pricingButtonState,
@@ -1,16 +1,6 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports, L as Link } from "./vendor-react-mDaEzY3y.js";
2
- import { u as useAuthStore, b as authFetch } from "./app-BdBoMQeO.js";
3
- function formatStorageBytes(bytes) {
4
- if (bytes <= 0) return "0 B";
5
- const units = ["B", "KB", "MB", "GB"];
6
- const i = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1);
7
- const value = bytes / 1024 ** i;
8
- return `${value.toFixed(i === 0 ? 0 : 1)} ${units[i]}`;
9
- }
10
- function storageUsagePercent(usedBytes, limitBytes) {
11
- if (limitBytes <= 0) return 0;
12
- return Math.min(Math.max(usedBytes / limitBytes * 100, 0), 100);
13
- }
2
+ import { u as useAuthStore, b as authFetch, s as storageUsagePercent, f as formatStorageBytes } from "./app-CWucmnLZ.js";
3
+ import { P as PRO_STORAGE_UPGRADE_COPY } from "./copy-CQKQppF-.js";
14
4
  function timeAgo(dateStr) {
15
5
  const ms = Date.now() - new Date(dateStr).getTime();
16
6
  const mins = Math.floor(ms / 6e4);
@@ -513,6 +503,8 @@ function PlanSection() {
513
503
  }, []);
514
504
  const intervalLabel = (subscription == null ? void 0 : subscription.interval) ? { monthly: "Monthly", annual: "Annual", "admin-granted": "Granted" }[subscription.interval] ?? subscription.interval : "";
515
505
  const storagePercent = storageUsage ? storageUsagePercent(storageUsage.usedBytes, storageUsage.limitBytes) : 0;
506
+ const storageLimitLabel = storageUsage ? formatStorageBytes(storageUsage.limitBytes) : null;
507
+ const freeStorageCopy = storagePercent >= 80 ? `You are close to the ${storageLimitLabel ?? "Free"} hosted storage limit.` : `Free includes ${storageLimitLabel ?? "hosted"} storage for small projects.`;
516
508
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { marginBottom: 40 }, children: [
517
509
  /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { style: sectionHeaderStyle, children: "Plan & Usage" }),
518
510
  /* @__PURE__ */ jsxRuntimeExports.jsx("p", { style: sectionDescStyle, children: "Your current plan, billing, and CLI license." }),
@@ -608,7 +600,12 @@ function PlanSection() {
608
600
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: storageUsage ? formatStorageBytes(storageUsage.limitBytes) : "Unavailable" })
609
601
  ]
610
602
  }
611
- )
603
+ ),
604
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { marginTop: 8, fontSize: 12, color: "var(--fc-textMuted)", lineHeight: 1.45 }, children: isPro ? /* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: "Pro storage is active for hosted projects and commercial work." }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
605
+ freeStorageCopy,
606
+ " ",
607
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/pricing", style: { color: "var(--fc-accent)", textDecoration: "none", fontWeight: 600 }, children: PRO_STORAGE_UPGRADE_COPY })
608
+ ] }) })
612
609
  ] })
613
610
  ] }) }),
614
611
  isPro && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [