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.
- package/LICENSE +7 -5
- package/README.md +1 -1
- package/README.public.md +24 -2
- package/dist/assets/{AdminPage-Bs4PiK00.js → AdminPage-4jihcEk_.js} +1 -1
- package/dist/assets/{BlogPage-DVmgN0ma.js → BlogPage-BvzruKtw.js} +1 -1
- package/dist/assets/{DocsPage-BP6wlsBN.js → DocsPage-DHbd-WS-.js} +13 -13
- package/dist/assets/{EditorApp-Arw2NnGJ.js → EditorApp-C5P2rBfh.js} +433 -84
- package/dist/assets/{EditorApp-VY9lXx0N.css → EditorApp-DS0AIUrZ.css} +25 -0
- package/dist/assets/{EmbedViewer-qgQiOahL.js → EmbedViewer-B70wQwlE.js} +2 -2
- package/dist/assets/{LandingPageProofDriven-DvhtmWOz.js → LandingPageProofDriven-DIsYTnep.js} +1 -1
- package/dist/assets/{PricingPage-Ck3CP2ti.css → PricingPage-BMedqFef.css} +48 -0
- package/dist/assets/{PricingPage-657oLvWh.js → PricingPage-YPOr12pP.js} +34 -6
- package/dist/assets/{SettingsPage-wNy3_2yn.js → SettingsPage-rntoyJ3b.js} +10 -13
- package/dist/assets/{app-BdBoMQeO.js → app-CWucmnLZ.js} +801 -1208
- package/dist/assets/cli/{render-Ci3jjyT1.js → render-DZHmUySW.js} +214 -23
- package/dist/assets/copy-CQKQppF-.js +8 -0
- package/dist/assets/{evalWorker-CMCAbK8r.js → evalWorker-C3dKxi9Y.js} +1117 -95
- package/dist/assets/{manifold-BMn-8Vf8.js → manifold-CQ3FhfWB.js} +1 -1
- package/dist/assets/{manifold-jlYQ6E5R.js → manifold-CU0G1yYL.js} +1 -1
- package/dist/assets/{manifold-DbyILno4.js → manifold-CYWZMfjB.js} +2 -2
- package/dist/assets/{renderSceneState-DAnqvxSt.js → renderSceneState-BBUrnsUN.js} +1 -1
- package/dist/assets/{reportWorker-BcRVMHK-.js → reportWorker-BhZ7DjxQ.js} +1091 -95
- package/dist/assets/{sectionPlaneMath-DXJ_TdIW.js → sectionPlaneMath-BxfokaJE.js} +1091 -95
- package/dist/cli/render.html +1 -1
- package/dist/docs/index.html +2 -2
- package/dist/docs-raw/AI/usage.md +182 -89
- package/dist/docs-raw/API/core/concepts.md +26 -0
- package/dist/docs-raw/CLI.md +58 -37
- package/dist/docs-raw/INDEX.md +81 -64
- package/dist/docs-raw/cli-monetization.md +9 -8
- package/dist/docs-raw/generated/concepts.md +111 -4
- package/dist/docs-raw/generated/core.md +2 -0
- package/dist/docs-raw/generated/curves.md +480 -1
- package/dist/docs-raw/generated/output.md +1 -0
- package/dist/docs-raw/generated/sketch.md +2 -0
- package/dist/docs-raw/generated/viewport.md +81 -3
- package/dist/docs-raw/product/user-outreach-email-templates.md +159 -0
- package/dist/docs-raw/skills/forgecad-image-replicator.md +1 -1
- package/dist/docs-raw/skills/forgecad-make-a-model.md +33 -4
- package/dist/docs-raw/skills/forgecad-prepare-prompt.md +1 -1
- package/dist/docs-raw/skills/forgecad-project.md +1 -1
- package/dist/docs-raw/skills/forgecad-render-inspect.md +1 -1
- package/dist/docs-raw/skills/forgecad.md +2 -1
- package/dist/docs-raw/welcome.md +85 -137
- package/dist/index.html +1 -1
- package/dist/llms.txt +4 -3
- package/dist/sitemap.xml +6 -6
- package/dist-cli/forgecad.js +1413 -219
- package/dist-cli/forgecad.js.map +1 -1
- package/dist-skill/CONTEXT.md +594 -5
- package/dist-skill/SKILL-dev.md +2 -1
- package/dist-skill/SKILL.md +2 -1
- package/dist-skill/docs/API/core/concepts.md +26 -0
- package/dist-skill/docs/CLI.md +58 -37
- package/dist-skill/docs/generated/core.md +2 -0
- package/dist-skill/docs/generated/curves.md +480 -1
- package/dist-skill/docs/generated/output.md +1 -0
- package/dist-skill/docs/generated/sketch.md +2 -0
- package/dist-skill/docs/generated/viewport.md +81 -3
- package/dist-skill/docs-dev/API/core/concepts.md +26 -0
- package/dist-skill/docs-dev/CLI.md +58 -37
- package/dist-skill/docs-dev/generated/core.md +2 -0
- package/dist-skill/docs-dev/generated/curves.md +480 -1
- package/dist-skill/docs-dev/generated/output.md +1 -0
- package/dist-skill/docs-dev/generated/sketch.md +2 -0
- package/dist-skill/docs-dev/generated/viewport.md +81 -3
- package/dist-skill/library/README.md +0 -1
- package/dist-skill/library/forgecad-image-replicator/SKILL.md +1 -1
- package/dist-skill/library/forgecad-make-a-model/SKILL.md +33 -4
- package/dist-skill/library/forgecad-prepare-prompt/SKILL.md +1 -1
- package/dist-skill/library/forgecad-project/SKILL.md +1 -1
- package/dist-skill/library/forgecad-render-inspect/SKILL.md +1 -1
- package/examples/api/conformal-product-ribbon.forge.js +77 -0
- package/examples/api/render-labels.forge.js +33 -0
- package/examples/api/text2d-basics.forge.js +6 -3
- package/package.json +1 -1
- package/dist-skill/library/forgecad-deep-dive/SKILL.md +0 -120
- package/dist-skill/library/forgecad-deep-dive/agents/openai.yaml +0 -4
- 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-
|
|
3
|
-
import {
|
|
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);
|
|
@@ -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-
|
|
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
|
-
"
|
|
16
|
+
"Commercial coverage for production exports",
|
|
16
17
|
"High-quality Blender renders",
|
|
17
18
|
"GIF & MP4 capture",
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
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: "
|
|
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-
|
|
3
|
-
|
|
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: [
|