forgecad 0.9.5 → 0.9.7

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 (86) hide show
  1. package/dist/assets/{AdminPage-uTtcSXtn.js → AdminPage-DX0mpSZT.js} +1 -1
  2. package/dist/assets/{BlogPage-DYJMjWx3.js → BlogPage-CI_P0_Pf.js} +1 -1
  3. package/dist/assets/{DocsPage-C58f0K5v.js → DocsPage-DLhIIZyJ.js} +3 -3
  4. package/dist/assets/EditorApp-BujZvuwX.js +12874 -0
  5. package/dist/assets/{EditorApp-DS0AIUrZ.css → EditorApp-DfFT2Dn8.css} +1 -0
  6. package/dist/assets/{EmbedViewer-CMXWA2LX.js → EmbedViewer-0S0qXKog.js} +2 -2
  7. package/dist/assets/{LandingPageProofDriven-CAu2OZFn.js → LandingPageProofDriven-O_yMtAri.js} +1 -1
  8. package/dist/assets/{PricingPage-BIgW7m3X.js → PricingPage-DGkX3Ahr.js} +1 -1
  9. package/dist/assets/{SettingsPage-N1l1tMXO.js → SettingsPage-DBsqTB_y.js} +82 -22
  10. package/dist/assets/{app-CFy7g5WP.js → app-BE2nD6Yz.js} +1246 -191
  11. package/dist/assets/cli/{render-BrVVdj_T.js → render-iP9qh475.js} +841 -586
  12. package/dist/assets/{evalWorker-c_SB9gg3.js → evalWorker-Ds5U4xtN.js} +2732 -112
  13. package/dist/assets/inspectWorker-Dll4eVyD.js +12620 -0
  14. package/dist/assets/{manifold-Dp6pvFr6.js → manifold-Bk26ViCr.js} +1 -1
  15. package/dist/assets/{manifold-CRoBhJKH.js → manifold-DjYsd7A_.js} +2 -2
  16. package/dist/assets/{manifold-Cjk7WhRs.js → manifold-sJ-axdXM.js} +1 -1
  17. package/dist/assets/{renderSceneState-3DfsSASX.js → renderSceneState-Bngp5MrQ.js} +1 -1
  18. package/dist/assets/{reportWorker-BLkuIoS8.js → reportWorker-CU8RZ4O0.js} +2715 -112
  19. package/dist/assets/{sectionPlaneMath-CykEnkvQ.js → sectionPlaneMath-BdTjyVfs.js} +3213 -252
  20. package/dist/cli/render.html +1 -1
  21. package/dist/docs/index.html +1 -1
  22. package/dist/docs-raw/AI/usage.md +7 -2
  23. package/dist/docs-raw/CLI.md +82 -53
  24. package/dist/docs-raw/beta-operations.md +9 -0
  25. package/dist/docs-raw/coding.md +1 -1
  26. package/dist/docs-raw/deployment.md +38 -23
  27. package/dist/docs-raw/generated/concepts.md +141 -7
  28. package/dist/docs-raw/generated/core.md +206 -1
  29. package/dist/docs-raw/generated/curves.md +97 -5
  30. package/dist/docs-raw/generated/lib.md +17 -1
  31. package/dist/docs-raw/generated/sketch.md +9 -1
  32. package/dist/docs-raw/generated/viewport.md +1 -1
  33. package/dist/docs-raw/guides/inspection-bundles.md +45 -16
  34. package/dist/docs-raw/platform/auth.md +2 -0
  35. package/dist/docs-raw/platform/google-oauth-setup.md +4 -0
  36. package/dist/docs-raw/runbook.md +3 -3
  37. package/dist/docs-raw/skills/forgecad-make-a-model.md +87 -8
  38. package/dist/docs-raw/skills/forgecad-prepare-prompt.md +14 -6
  39. package/dist/docs-raw/skills/forgecad-render-inspect.md +1 -1
  40. package/dist/docs-raw/skills/index.md +2 -2
  41. package/dist/index.html +1 -1
  42. package/dist/sitemap.xml +6 -6
  43. package/dist-cli/forgecad.js +8725 -4747
  44. package/dist-cli/forgecad.js.map +1 -1
  45. package/dist-skill/CONTEXT.md +375 -25
  46. package/dist-skill/docs/CLI.md +82 -53
  47. package/dist-skill/docs/generated/core.md +206 -1
  48. package/dist-skill/docs/generated/curves.md +97 -5
  49. package/dist-skill/docs/generated/lib.md +17 -1
  50. package/dist-skill/docs/generated/sketch.md +9 -1
  51. package/dist-skill/docs/generated/viewport.md +1 -1
  52. package/dist-skill/docs/guides/inspection-bundles.md +45 -16
  53. package/dist-skill/docs-dev/CLI.md +82 -53
  54. package/dist-skill/docs-dev/coding.md +1 -1
  55. package/dist-skill/docs-dev/generated/core.md +206 -1
  56. package/dist-skill/docs-dev/generated/curves.md +97 -5
  57. package/dist-skill/docs-dev/generated/lib.md +17 -1
  58. package/dist-skill/docs-dev/generated/sketch.md +9 -1
  59. package/dist-skill/docs-dev/generated/viewport.md +1 -1
  60. package/dist-skill/docs-dev/guides/inspection-bundles.md +45 -16
  61. package/dist-skill/library/forgecad-make-a-model/SKILL.md +87 -8
  62. package/dist-skill/library/forgecad-prepare-prompt/SKILL.md +14 -6
  63. package/dist-skill/library/forgecad-prepare-prompt/references/default-profiles.md +5 -3
  64. package/dist-skill/library/forgecad-prepare-prompt/references/master-prompt.md +7 -5
  65. package/dist-skill/library/forgecad-render-inspect/SKILL.md +1 -1
  66. package/examples/api/bolted-service-cover.forge.js +17 -0
  67. package/examples/api/cable-gland-anchor.forge.js +14 -0
  68. package/examples/api/captured-cartridge-guide.forge.js +14 -0
  69. package/examples/api/captured-linear-slide.forge.js +13 -0
  70. package/examples/api/clevis-pin-joint.forge.js +13 -0
  71. package/examples/api/datum-enclosure.forge.js +16 -0
  72. package/examples/api/guided-loft-olive-oil-bottle.forge.js +135 -0
  73. package/examples/api/hose-barb-port.forge.js +14 -0
  74. package/examples/api/intentional-overlap-overmold.forge.js +16 -0
  75. package/examples/api/knuckled-hinge-assembly.forge.js +15 -0
  76. package/examples/api/living-hinge-cover.forge.js +14 -0
  77. package/examples/api/pcb-terminal-block.forge.js +22 -0
  78. package/examples/api/pinned-lever-pivot-stack.forge.js +14 -0
  79. package/examples/api/retained-shaft-knob-stack.forge.js +15 -0
  80. package/examples/api/routed-tube-clip.forge.js +15 -0
  81. package/examples/api/seated-bearing-stack.forge.js +30 -0
  82. package/examples/api/snap-latch-cover.forge.js +14 -0
  83. package/examples/api/static-assembly-connectors.forge.js +14 -16
  84. package/examples/api/thumb-screw-clamp.forge.js +15 -0
  85. package/package.json +20 -2
  86. package/dist/assets/EditorApp-DNH1TEz1.js +0 -12729
@@ -260,6 +260,7 @@
260
260
 
261
261
  .fc-view-panel-control-block + .fc-view-panel-control-block,
262
262
  .fc-view-panel-button-grid + .fc-view-panel-button-grid,
263
+ .fc-view-panel-button-grid + .fc-view-panel-control-block,
263
264
  .fc-view-panel-row + .fc-view-panel-row,
264
265
  .fc-view-panel-toggle-stack + .fc-view-panel-row,
265
266
  .fc-view-panel-row + .fc-view-panel-toggle-stack {
@@ -1,6 +1,6 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "./vendor-react-Da3A2QmU.js";
2
- import { bG as initKernel, bH as initSolverWasm } from "./sectionPlaneMath-CykEnkvQ.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-CFy7g5WP.js";
2
+ import { bH as initKernel, bI as initSolverWasm } from "./sectionPlaneMath-BdTjyVfs.js";
3
+ import { g as useForgeStore, ai as getExternalUrl, aj as getGistId, q as fetchUrlModel, p as fetchGistModel, l as buildShareUrl, B as BrandMark, ak as Viewport } from "./app-BE2nD6Yz.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-Da3A2QmU.js";
2
- import { B as BrandMark } from "./app-CFy7g5WP.js";
2
+ import { B as BrandMark } from "./app-BE2nD6Yz.js";
3
3
  /* empty css */
4
4
  const LINKS = {
5
5
  glasses: {
@@ -1,5 +1,5 @@
1
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-CFy7g5WP.js";
2
+ import { u as useAuthStore, b as authFetch, B as BrandMark } from "./app-BE2nD6Yz.js";
3
3
  import { C as COMMERCIAL_USE_CASES } from "./copy-CQKQppF-.js";
4
4
  /* empty css */
5
5
  function checkoutIntentPath(interval) {
@@ -1,6 +1,6 @@
1
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-CFy7g5WP.js";
3
- import { P as PRO_STORAGE_UPGRADE_COPY } from "./copy-CQKQppF-.js";
2
+ import { u as useAuthStore, b as authFetch, s as storageUsagePercent, f as formatStorageBytes } from "./app-BE2nD6Yz.js";
3
+ import { C as COMMERCIAL_USE_CASES, P as PRO_STORAGE_UPGRADE_COPY } from "./copy-CQKQppF-.js";
4
4
  function timeAgo(dateStr) {
5
5
  const ms = Date.now() - new Date(dateStr).getTime();
6
6
  const mins = Math.floor(ms / 6e4);
@@ -455,6 +455,7 @@ function ConnectionsSection() {
455
455
  }
456
456
  function PlanSection() {
457
457
  const user = useAuthStore((s) => s.user);
458
+ const deleteAccount = useAuthStore((s) => s.deleteAccount);
458
459
  const isPro = (user == null ? void 0 : user.plan) === "pro";
459
460
  const [subscription, setSubscription] = reactExports.useState(null);
460
461
  const [storageUsage, setStorageUsage] = reactExports.useState(null);
@@ -463,6 +464,8 @@ function PlanSection() {
463
464
  const [licenseExpiry, setLicenseExpiry] = reactExports.useState(null);
464
465
  const [copied, setCopied] = reactExports.useState(false);
465
466
  const [generating, setGenerating] = reactExports.useState(false);
467
+ const [deletingAccount, setDeletingAccount] = reactExports.useState(false);
468
+ const [deleteError, setDeleteError] = reactExports.useState(null);
466
469
  reactExports.useEffect(() => {
467
470
  let cancelled = false;
468
471
  setStorageLoading(true);
@@ -506,13 +509,40 @@ function PlanSection() {
506
509
  } catch {
507
510
  }
508
511
  }, []);
512
+ const handleDeleteAccount = reactExports.useCallback(async () => {
513
+ if (!(user == null ? void 0 : user.email)) {
514
+ setDeleteError("Could not confirm the account email. Please refresh and try again.");
515
+ return;
516
+ }
517
+ const acknowledged = window.confirm(
518
+ "Delete your ForgeCAD account permanently?\n\nThis will remove your account, hosted projects, and published models. This is irreversible."
519
+ );
520
+ if (!acknowledged) return;
521
+ const confirmation = window.prompt(`This action is irreversible. Type your email address to confirm:
522
+
523
+ ${user.email}`);
524
+ if (confirmation === null) return;
525
+ if (confirmation.trim().toLowerCase() !== user.email.toLowerCase()) {
526
+ setDeleteError("Email address did not match. Account was not deleted.");
527
+ return;
528
+ }
529
+ setDeletingAccount(true);
530
+ setDeleteError(null);
531
+ try {
532
+ await deleteAccount();
533
+ window.location.href = "/";
534
+ } catch (err) {
535
+ setDeleteError(err instanceof Error ? err.message : "Account deletion failed");
536
+ setDeletingAccount(false);
537
+ }
538
+ }, [deleteAccount, user == null ? void 0 : user.email]);
509
539
  const intervalLabel = (subscription == null ? void 0 : subscription.interval) ? { monthly: "Monthly", annual: "Annual", "admin-granted": "Granted" }[subscription.interval] ?? subscription.interval : "";
510
540
  const storagePercent = storageUsage ? storageUsagePercent(storageUsage.usedBytes, storageUsage.limitBytes) : 0;
511
541
  const storageLimitLabel = storageUsage ? formatStorageBytes(storageUsage.limitBytes) : null;
512
542
  const freeStorageCopy = storagePercent >= 80 ? `You are close to the ${storageLimitLabel ?? "Free"} hosted storage limit.` : `Free includes ${storageLimitLabel ?? "hosted"} storage for small projects.`;
513
543
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { marginBottom: 40 }, children: [
514
544
  /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { style: sectionHeaderStyle, children: "Plan & Usage" }),
515
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { style: sectionDescStyle, children: "Your current plan, billing, and CLI license." }),
545
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { style: sectionDescStyle, children: "Your current plan, billing, CLI license, and commercial-use coverage." }),
516
546
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: cardStyle, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: cardBodyStyle, children: [
517
547
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", marginBottom: 16 }, children: [
518
548
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
@@ -541,18 +571,18 @@ function PlanSection() {
541
571
  ] }),
542
572
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { display: "flex", gap: 8 }, children: [
543
573
  isPro && (subscription == null ? void 0 : subscription.hasStripe) && /* @__PURE__ */ jsxRuntimeExports.jsx("button", { onClick: openBillingPortal, style: { ...btnPrimaryStyle, padding: "4px 10px", fontSize: 12 }, children: "Manage Subscription" }),
544
- !isPro && /* @__PURE__ */ jsxRuntimeExports.jsx(
574
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
545
575
  Link,
546
576
  {
547
577
  to: "/pricing",
548
578
  style: {
549
- ...btnPrimaryStyle,
579
+ ...isPro ? btnStyle : btnPrimaryStyle,
550
580
  padding: "4px 10px",
551
581
  fontSize: 12,
552
582
  textDecoration: "none",
553
583
  display: "inline-block"
554
584
  },
555
- children: "Upgrade to Pro"
585
+ children: isPro ? "View Pricing" : "View Pro & Enterprise"
556
586
  }
557
587
  )
558
588
  ] })
@@ -564,6 +594,28 @@ function PlanSection() {
564
594
  ] }),
565
595
  subscription.canceledAt && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { color: "var(--fc-warning)" }, children: " (Canceled, active until period end)" })
566
596
  ] }),
597
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
598
+ "div",
599
+ {
600
+ style: {
601
+ marginBottom: 16,
602
+ padding: "10px 12px",
603
+ borderRadius: 8,
604
+ background: isPro ? "rgba(88, 166, 255, 0.1)" : "rgba(232, 167, 53, 0.12)",
605
+ border: `1px solid ${isPro ? "rgba(88, 166, 255, 0.24)" : "rgba(232, 167, 53, 0.28)"}`,
606
+ color: "var(--fc-textMuted)",
607
+ fontSize: 12,
608
+ lineHeight: 1.45
609
+ },
610
+ children: [
611
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { fontWeight: 700, color: "var(--fc-text)" }, children: isPro ? "Commercial coverage active." : "Free is for non-commercial usage." }),
612
+ " ",
613
+ isPro ? "Pro covers commercial ForgeCAD work. Pricing also includes Enterprise for embedded and team workflows." : `Use Free for education, personal exploration, and non-commercial evaluation. Choose Pro when ForgeCAD supports ${COMMERCIAL_USE_CASES} work.`,
614
+ " ",
615
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/pricing", style: { color: "var(--fc-accent)", textDecoration: "none", fontWeight: 600 }, children: "See pricing." })
616
+ ]
617
+ }
618
+ ),
567
619
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
568
620
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { fontSize: 13, fontWeight: 500 }, children: "Storage" }),
569
621
  /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -672,23 +724,31 @@ function PlanSection() {
672
724
  ] }) })
673
725
  ] }),
674
726
  /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { style: { fontSize: 14, fontWeight: 600, color: "var(--fc-error)", margin: "24px 0 8px" }, children: "Danger Zone" }),
675
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { ...cardStyle, borderColor: "rgba(248, 81, 73, 0.3)" }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { ...cardBodyStyle, display: "flex", alignItems: "center", justifyContent: "space-between", gap: 16 }, children: [
676
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
677
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { fontWeight: 500, fontSize: 14, color: "var(--fc-error)" }, children: "Delete account" }),
678
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { fontSize: 12, color: "var(--fc-textMuted)", marginTop: 2 }, children: "Permanently remove your account, all projects, and published models. This cannot be undone." })
727
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { ...cardStyle, borderColor: "rgba(248, 81, 73, 0.3)" }, children: [
728
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { style: { ...cardBodyStyle, display: "flex", alignItems: "center", justifyContent: "space-between", gap: 16 }, children: [
729
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
730
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { fontWeight: 500, fontSize: 14, color: "var(--fc-error)" }, children: "Delete account" }),
731
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { fontSize: 12, color: "var(--fc-textMuted)", marginTop: 2 }, children: "Permanently remove your account, all projects, and published models. This cannot be undone." })
732
+ ] }),
733
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
734
+ "button",
735
+ {
736
+ type: "button",
737
+ onClick: handleDeleteAccount,
738
+ disabled: deletingAccount,
739
+ style: {
740
+ ...btnDangerStyle,
741
+ whiteSpace: "nowrap",
742
+ border: "1px solid rgba(248, 81, 73, 0.3)",
743
+ opacity: deletingAccount ? 0.6 : 1,
744
+ cursor: deletingAccount ? "not-allowed" : "pointer"
745
+ },
746
+ children: deletingAccount ? "Deleting..." : "Delete account"
747
+ }
748
+ )
679
749
  ] }),
680
- /* @__PURE__ */ jsxRuntimeExports.jsx(
681
- "button",
682
- {
683
- style: {
684
- ...btnDangerStyle,
685
- whiteSpace: "nowrap",
686
- border: "1px solid rgba(248, 81, 73, 0.3)"
687
- },
688
- children: "Delete account"
689
- }
690
- )
691
- ] }) })
750
+ deleteError && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { padding: "0 20px 16px", color: "var(--fc-error)", fontSize: 12 }, children: deleteError })
751
+ ] })
692
752
  ] });
693
753
  }
694
754
  function SettingsPage() {